Skip to content

Black Rose

VPW build of Bally's 1992 Black Rose, featuring a full playfield redraw from scan, extensive GI mapping, and insert system exploration (Skitso 2D vs 3D primitives). The project dealt with significant version control challenges from parallel development tracks. Key contributors include endi78, ebislit, sixtoe, oqqsan, sheltemke, iaakki, apophis79, and o0skitso0o.

Build Notes

Playfield Scan Dimensions

Bally's Black Rose actual playfield measures 20.25" x 46" (confirmed via physical measurement by ebislit). The previous VPX playfield image was vertically squashed with incorrect proportions (20.50" x 46"). After correcting dimensions, the PF image was cut to 2160 x 4907 px and editor set to 952 x 2162 VPUs. Correct proportions are validated by checking that circular features (cannon holes) render as true circles.

Playfield Redraw Workflow

Full playfield redraw process by endi78 (professional graphic designer/illustrator):

  1. ebislit scanned a used physical playfield and stitched the images
  2. endi78 redrew damaged areas in Photoshop -- parchments, wood grain, compass, skulls, text, halftone patterns
  3. Used font identification websites with isolated letter samples to find matching fonts
  4. Imperfections from the scan (marks, scratches) were useful for positioning primitives on the new playfield
  5. Created both clean and "imperfect" versions for realism

Playfield Dimension Correction and Realignment

When the playfield image was corrected to proper dimensions, ALL physical objects (primitives, walls, triggers, ramps, switches) had to be realigned. Process: set correct editor dimensions, use marks and scratches on the raw scan as positioning guides, realign every physics object to match new playfield holes, then verify ramps and flipper shots still work.

GI String Mapping via Debug Testing

Black Rose has 5 GI strings. Mapped by observing ROM behavior during gameplay modes: String 1 = white GI (playfield), String 2 = red GI (including under-cannon lights), Strings 4 & 5 = backglass GI. String 3 does not flicker/fade during lock/fire sequences (possibly pop bumper area). During cannon firing mode, only string 2 (red) stays lit. The manual's GI mapping was found to be incorrect.

Bally/Williams Merger Hardware

After the Bally/Williams merger (first post-merger game: Truck Stop), both brands used the same hardware. Williams flipper bats with Williams logo are correct for Black Rose despite it being a "Bally" game. The last Bally-specific flipper bats were used on games like Transporter.

Proper Bumper Types

Black Rose has different bumper types: front bumper is a "thumper" (white, fires downward), rear two are standard pop bumpers. The original VPX version incorrectly had all three as identical bumpers. Correct bumper identification matters for both visual accuracy and gameplay physics.

Flipper Angle Tuning

Flipper end angle of 77 degrees found optimal after extensive testing. Process: overlay VPX blueprint on PAPA video screenshots to compare positions, test ramp shots (especially right ramp), verify ball catch from lock eject. Original shipped with angles too flat, causing slings to feel slow and ramp shots to be unreliable.

Scripting

LUT Environment Emission Scaling Per LUT

Different LUTs need different EnvironmentEmissionScale values to look correct. Use a Select Case statement keyed on the active LUT to set appropriate emission scale. Brighter LUTs get lower values (2-3), darker LUTs get higher values (7+).

Select case LUTset
    Case 0,1,2,4,5,6,7,13,14 : Table1.EnvironmentEmissionScale=3
    Case 3 :                    Table1.EnvironmentEmissionScale=2
    Case 8 :                    Table1.EnvironmentEmissionScale=2
    Case 10,11,12 :             Table1.EnvironmentEmissionScale=7
End Select

LUT Switching via Script with GI Color Coordination

Script-based LUT switching using magnasave buttons (left + right pressed simultaneously). Switching between LUTs also changes Bottom_GI light colors and intensity scale to match each LUT's characteristics. Sound feedback: SolOff sound for default ColorGradeEx LUT, SolOn sound for custom LUTs.

Flasher Fading for Realistic Brightness Variance

iaakki's flasher fading code creates variance in flasher brightness levels. ROM flashers do not always fire at full strength. Timers run at 100fps (can drop to 60fps). Aim for 10-15 fading steps on turn-off. During match sequence and end-of-ball light shows, flashers now show varying degrees of brightness instead of constant full brightness.

ModLampz Crash Fix -- Missing Commas in SetLamp Calls

Table crashes when any solenoid fires a SetLamp flasher. Root cause: missing commas in setlamp calls. setlamp requires 2 parameters (lamp number, state). Without the comma, VBScript concatenates them. Additionally, chglamp = Controller.ChangedLamps should be called unconditionally on every timer loop (not wrapped in an if-statement).

nFozzy/Fleep/Lampz Integration Process

When adding nFozzy physics, Fleep sounds, and Lampz fading to an existing table:

  1. Do NOT try to integrate all three at once -- causes hard-to-diagnose cascading issues
  2. Requires GameTimer (10ms), FrameTimer, and RampRoll timers
  3. Old trigger-based sound code should be removed when Fleep replaces it
  4. Physics collections must be properly set up
  5. Common pitfall: copy-pasting lamp code from both the example table and another project creates duplicate/conflicting subs

Ramp Roll Sound Logic

Added BallRollAmpFactor and RampRollAmpFactor as separate script constants. The wire ramp sound for the cannon sword was playing at constant full volume -- fixed by implementing dynamic volume based on ball speed. However, the source sound recording itself was flat (recorded directly without playfield glass) -- dynamic volume alone cannot fully fix a poor source recording.

3D & Art

Skitso Method for Painted Inserts (2D Technique)

For painted inserts (where plastic lens is not visible from above), use the "Skitso method": light shape matches the hole in the playfield, and a decal simulates the paint blocking the light. Results are very realistic. Best used for inserts where the plastic insert lenses are not seen (e.g., SINK SHIP letters). For clear inserts where the lens is visible, use 3D primitive inserts instead.

3D Inserts vs Skitso Inserts -- When to Use Each

Use Skitso method for painted inserts and 3D primitives for clear inserts. 3D inserts have three layers: (1) under-PF primitive showing bulb and plywood, (2) the insert body, (3) a semi-transparent top flasher for the "paint on top" lighting effect. The improvement of 3D over Skitso for painted inserts is minimal relative to the effort required.

Insert Text Layer Separation

Insert texts and graphics can be cut out of the playfield image and placed on a separate flasher layer. This makes texts/graphics appear sharp and crisp at all zoom levels instead of being limited by playfield image resolution.

Dark Environment LUT Philosophy

A backlit display (monitor) cannot make daylight surfaces look real since IRL they reflect light. Dark mode is best for realism -- illuminate the playfield primarily with its own lights. Approach: script-controlled environment lights rather than LUT-only control, allowing easy toggle back to original lighting.

GI Lighting from Ground Up (Skitso Approach)

Skitso's GI rebuild process: create new GI lighting from scratch rather than modifying broken existing setup, tweak playfield/plastic/ball/decal textures to suit the new lighting, create new LUT specifically tuned for the table, fix depth bias issues (they break easily in VR). Black Rose naturally does not have much lower-playfield GI, so the table being darker is authentic to the original design.

Troubleshooting

Ball Trap Fix with Invisible Walls

Balls getting trapped behind bumpers or jumping over plastics into unreachable areas. Fix: add invisible walls at problem locations to prevent balls from escaping designated play areas. 80 players testing the table across a week found this bug multiple times, confirming it as a real issue.

VPX 10.6 vs 10.7 Compatibility Issues

VPX 10.7 is a beta -- some builds broke ball physics. Tables built for 10.6 should be played on 10.6. Key 10.7 benefits: unlimited layers, MP3/OGG audio support, WebP image support. ROM crashes reported across both versions are rarely due to VPX itself -- ROMs only receive switch inputs from VPX.

Backglass Interfering with GI/LUT at Startup

Backglass (DirectB2S) can interfere with GI and LUT behavior at startup. Resolved by deleting the backglass and using a static image instead. Default LUT is defined on the backglass page in VPX editor settings.

Version Control Challenges

Black Rose suffered from parallel development branches becoming desynchronized. Multiple contributors worked on different versions with incompatible changes. Resolution strategy: identify which version has the most critical work, redo alignment work on top of that version rather than trying to merge divergent branches, and confirm exactly what "the table is out of alignment" means before starting work.

Game Knowledge

Cannon Disc Alignment

On real Black Rose machines, the cannon disc must be perfectly level with the playfield. If not level, the ball launches into airballs off the flippers. Virtual equivalent: ensure the cannon kicker and diverter physics objects are properly positioned to avoid unrealistic ball trajectories.

GI Debug Tracking

Track GI levels by uncommenting debug prints in the GIUpdates sub. The code maps GI brightness (0-1 float) to ColorGrade images numbered 0-8. Formula: Int(gi1lvl*7+1.5).

Resources

  • Skitso Method Tutorial: Fish Tales WIP thread on vpinball.com forums
  • Image Measurement Tool: https://imagemeasurement.online/image/select