Black Rose (Bally 1992)¶
Full VPW build of a Bally widebody (20.25" x 46") with dual-color GI system (red + white strings) requiring cross-dimming logic. Notable for per-element flasher variation, dark environment LUT approach, and cannon mechanism alignment. Built by sixtoe, iaakki, o0skitso0o, apophis79, and endi78.
Build Story¶
Development ran from February 2021 through June 2022, including post-release patches. Endi78 provided the playfield scan and redrawn art (clean and original versions). Sixtoe handled GI tracing and physics, iaakki implemented the cross-dimming GI system and flasher fading, o0skitso0o contributed insert lighting using the Skitso-style flasher technique, and apophis79 integrated Fleep sounds. The build suffered a version control incident where sixtoe built v15 independently while apophis79 was working on v14 (GameTimer/Fleep fixes); sixtoe had to manually copy apophis79's v14 changes into v015 before uploading.
Table-Specific Details¶
Mechanisms & Hardware¶
- Bally widebody: 20.25" x 46" playfield, 952 x 2162 VPX units, PF image cut to 2160 x 4907 px.
- Dual-color GI: String 2 = red, String 3 = white. Both normally on simultaneously, requiring lights tuned dim enough to avoid blowout when combined. This makes red-only mode (cannon fire) too dim without the boost system.
- GI string assignments: String 1 = pop bumpers + back panel, String 2 = red lights, String 3 = white lights, Strings 4/5 = backbox. Manual's "top" and "bottom" labels refer to physical bulb position (red above white in each pair), NOT top/bottom of the playfield.
- Cannon mechanism: Requires precise alignment between primitive rotation, ball launch trajectory, and target positions. Script must account for offset between cannon pivot and ball ejection point.
- GI string numbering: Off-by-one from GI channel index -- String 1 maps to
gi0lvl, String 2 togi1lvl.
Art & Visuals¶
- Dark environment LUT: The environment emission image uses low emission scale, making the table dramatically lit by its own GI bulbs.
EnvironmentEmissionScaleis set per-LUT in the script. - Two playfield art versions maintained: "clean" (imperfections removed) and "original" (authentic wear), toggled via script option.
- Flupper 3D bumper caps linked to GI via
FlBumperFadeTarget(n) = alvlin GIUpdate sub. - Skitso-style flasher inserts using VPX flasher objects shaped to insert holes.
Physics & Gameplay¶
- Motor sound for cannon uses
PlaySoundAtLevelStaticLoopwhich loops continuously until explicitly stopped. - Dynamic ball image changing during gameplay:
Table.BallImage = "imagename"for thematic effects (cannonball texture during cannon multiball).
Known Issues¶
- ModLampz internal level values cannot be reliably overridden at runtime -- writing to
ModLampz.Lvl(n)appears to work in debugger but has no in-game effect.
Techniques Developed Here¶
- GI cross-dimming for dual-color GI strings -- boost lights controlled by
IntensityScale = (1 - gi2lvl) * gi1lvl - Per-element flasher variation to avoid the "Christmas tree" look -- different fade speed, intensity, and RGB color shift per flasher
- ModLampz override limitations discovered here -- use separate collections controlled outside ModLampz
- Motor sound looping pattern with
PlaySoundAtLevelStaticLoop - GI string identification from hardware methodology refined here
- Version merge conflicts in collaborative table building documented here
See Also¶
- GI and Flashers -- cross-dimming, per-element variation, GI string tracing
- Build Workflow -- version control, checkout system
- Insert Lighting -- Skitso-style flasher inserts