Judge Dredd (Bally 1993)¶
One of VPW's most complex builds due to the Deadworld rotating disc, pursuit flashers, and 9-ball tracking. Massive channel (15,000+ messages, 2020-2026) led by sixtoe with iaakki (inserts/flashers), cyberpez (testing), flupper1 (plastics/modeling), tomate80 (Octane rendering), rothbauerw (physics/targets), and benji084 (baking). The build pioneered the pre-toolkit 6-state GI + flasher texture swap system and established the standup target backstop primitive pattern.
Build Story¶
Judge Dredd required managing 9 balls simultaneously (3 captive in reactor, 3 in Deadworld, 3 in play), making ball tracking critical. The Deadworld disc presents a fundamental VPX limitation -- collidable primitives cannot be rotated at runtime, so the disc holes do not move with the visual rotation. The team built an elaborate system of primitive balls (visual only) in the disc and destroy/recreate real balls at mechanism entry/exit points. The table uses the L1 ROM (with full Deadworld code that was stripped from later versions), paired with parent ROM L7 for sound files.
Table-Specific Details¶
Mechanisms & Hardware¶
Deadworld disc: VPX cannot rotate collidable primitives -- collision meshes are calculated once at table load. Balls dropped into holes on the initial render position work, but the holes do not move. Solution: use non-physical primitive balls for visual representation in the disc, destroying and recreating real balls at entry/exit.
Multi-color inserts (9 primitives per insert): Crime scene inserts display green, yellow, red, or white, requiring 9 stacked primitives per insert -- 4 ON states (one per color), 4 BULB primitives, and 1 OFF state. Insert primitives are semi-transparent, bulbs are sunk deep underneath (good for VR depth).
Standup target backstop prims ("o" prims): Standup targets need backstop primitives (named with "o" suffix, e.g., "sw24o") placed behind the target object. These are collidable but NOT referenced in script -- purely physical barriers allowing the ball to pass slightly into the target for realistic impact while preventing pass-through.
Same-switch target identifier fix: JD has 3 standups sharing ROM switch 18. rothbauerw's code needed a 5th array element as a unique target identifier (180, 181, 182) with STArrayID modified to look up by the new index.
Flasher solenoid +100 offset: When flashers share numbers with lamp assignments, use a +100 offset: SolCallBack(17) = "SetLamp 117," with Lampz.MassAssign(117)=F17.
Art & Visuals¶
6-state GI + flasher texture swap (pre-toolkit): JD required 6 lighting states: GI ON, GI OFF, and each combined with left/right pursuit flashers. Using only 2 sets of primitives (ON/OFF layers), flasher states require texture swapping during fading transitions. The most problematic case: GI at partial brightness when flashers fire, producing binary artifacts. Solution: skip pursuit texture swaps when GI is not at full or zero, using regular VPX flashers instead.
Per-material GI fade curves: iaakki established material-specific exponential curves: gi1lvl^5 for cabinet/wood, gi1lvl^3 for plastics, gi1lvl^2 for metals. Tuned against real machine GI dimming behavior.
Pursuit flasher rendering: VPX flasher objects overlaid on side wall primitives, with transparent flasher images created by rendering with the flasher ON then using GIMP's difference mode against the base render to extract just the light contribution.
Plastics via SVG trace: flupper1's method -- trace the plastic shape in Inkscape as SVG paths, import into Blender, extrude to give thickness, apply textures. Produces cleaner geometry than freehand modeling.
Playfield softening: Duplicate the playfield image layer, apply 4px Gaussian blur at 50% opacity. Clear insert holes in the blurred layer first or black borders appear around inserts.
Solid color debug textures: sixtoe's technique -- replace all textures with distinct solid colors during development to isolate lighting, UV mapping, and layer ordering issues.
Physics & Gameplay¶
Ball mass 1, not 1.3 for widebody: rothbauerw confirmed ball mass should be 1 even for widebody tables. "Ball mass of 1.3 will throw all of the flipper stuff off." The real ball is the same size and weight on all tables.
RubberBandPost Z-height: These primitives have their zero point at the CENTER, not the bottom. At default Z=0, they protrude below the playfield (interfering with subways) and only half-protrude above (causing high ball bounces). Fix: set Z to 25.
Flipper alignment rules: iaakki: Start angle -- flippers hang just below the centerline of the nearest insert. End angle -- flipper tip goes just above the whip (lane guide). Length -- outer rim of the insert edge rings.
Known Issues¶
MAME parent/child ROM structure: JD's parent ROM (jd_l7) contains all ROMs including sound. Child ROM (jd_l1) has the correct game code with full Deadworld support. Both ZIPs must be present.
VPX 10.7 breaking changes: Captive balls falling through lane walls, GI showing OFF state permanently in VR, and general rendering issues. The table was developed targeting 10.6.
GICallback2 VPinMAME bug: GI crossfading broke in newer VPX/VPM versions. GICallback2 did not return values when using UseVPMModSol = 1. Fixed in VPM build 908 (GitHub issue #256).
Drain detection failure: Reported after extended play -- ball search triggers endlessly. Deleting the .cfg file from VPinMAME's cfg folder (in addition to NVRAM) may resolve deep configuration corruption.
Techniques Developed Here¶
- Standup target backstop primitives pattern established here
- SolCallback flasher +100 offset for lamp number conflicts
- Selective Gaussian blur for artifact removal on cabinet artwork
- Playfield softening technique for clearcoat diffusion simulation
- Pre-toolkit 6-state GI system documented in detail here
- VPX debug: moving prims and querying state on the fly workflow documented here
- Flasher filter strings are case-sensitive discovered here
- RubberBandPost Z-height anti-pattern documented here
- WEBP loses DPI metadata limitation documented here
See Also¶
- Indiana Jones -- similar ON/OFF primitive workflow, depth bias management
- Tales from the Crypt -- per-material GI fade curve implementation
- Lethal Weapon 3 -- Data East table with similar schematics workflow