Indiana Jones: The Pinball Adventure (Williams 1993)¶
VPW's most extensively documented build -- 100+ WIP versions over 2.5 years (v003 to v1.12), with 22 team members contributing. Led by iaakki (scripting/build lead), benji084 (C4D Octane baking), cyberpez (testing), sixtoe (VR), rothbauerw (physics), skitso (lighting), and wrd1972 (GI/lamp architecture). The build established several VPW standards including the ON/OFF primitive fading system, modulated flasher averaging, and the strategic shadow-drop release approach.
Build Story¶
Indiana Jones was built through six distinct phases: Foundation (v003-v027), Core Build (v027-v060), Polish (v060-v090), Christmas Sprint (v090-v104, 30+ versions in 6 days), RC Phase (RC1-RC9, 3 days of rapid tester cycles), and Post-Release (v1.01-v1.12 including Rubberizer, code cleanup, and PWM updates). The table was shadow-dropped during a live VPW stream, deliberately releasing before Zen Studios' Indiana Jones Pinball FX3 announcement.
Table-Specific Details¶
Mechanisms & Hardware¶
Idol carousel flipper array: VPX collidable primitives cannot be moved at runtime -- their collision mesh is calculated once at table load. For the rotating idol carousel, iaakki and rothbauerw used an array of VPX flipper objects arranged in a circle to approximate the collision boundary. Flippers are natively collidable AND movable, and scripting their positions/angles to rotate together produces a collision boundary indistinguishable from a true curve at typical ball speeds.
Flipper coils (11629): Indiana Jones uses unusually strong flipper coils (part #11629), requiring flipper strength of 3250-3500 -- approximately 15-20% above typical WPC settings. Calibrated by testing specific shots requiring full flipper power (upper loop, ramp entries, cross-playfield shots).
CorTracker captive ball crash: The CorTracker calculates ball trajectory corrections, and at ROM init it processes all balls including captive balls. When the captive ball sits inside a sleeve/post assembly with zero distance to the post boundary, the tracker produces a division by zero. Fix: add a zero-distance guard in the calculation.
Art & Visuals¶
C4D Octane baking workflow: benji084 developed a low-res proxy workflow -- rendering at 4K with Octane's AI denoiser at aggressive settings, taking only 2-3 minutes per bake for layout debugging and UV issue verification. Final renders were exported as PNG/WEBP.
5-channel GI architecture: Indiana Jones uses 5 GI channels (0-4) through the ModLampz system. Each channel controls wire ramp and playfield primitives, with individual DL tuning per ramp (default DL 1.0 is fully static; reducing to 0.7-0.8 allows subtle GI influence; below 0.3-0.4 causes blow-out at full GI).
UseLamps bug: Setting UseLamps = 1 caused random lamp state corruption -- lamps turning on/off incorrectly, GI channels bleeding into each other. Fix: set UseLamps = 0 and route all lamp control through ModLampz exclusively. This single property change consumed weeks of debugging time.
Physics & Gameplay¶
Flipper nudge boundary fix: When a ball sat on a raised flipper and the table was nudged, the flipper would drop and re-raise, launching the ball unpredictably. rothbauerw added a 15-degree threshold -- the flipper must drop at least 15 degrees from its held position before the snap-back triggers. Lower values (5-10) still triggered on strong nudges; higher values (20-25) made flippers feel unresponsive.
Rubberizer: rothbauerw's Rubberizer modifies ball behavior on rubber/wall hits to simulate natural rubber grip and spin transfer. A ball with topspin hitting rubber loses less speed (rubber grips and redirects); backspin causes sharper rebounds. The modification is small (5-15% velocity adjustment) but produces noticeably more natural ball paths near slingshots.
Target bouncer energy conservation: rothbauerw's code decomposes velocity into magnitude and angle, randomizes the angle within a range, then recomposes at the original magnitude -- preserving ball speed while varying bounce direction.
Sling post misalignment: Visual sling post primitives were not aligned with VPX rubber/wall collision objects. Even 1-2 unit misalignment is noticeable during fast ball travel near slingshots. Fix: match X/Y positions precisely using VPX editor coordinate readouts.
Known Issues¶
VR insert z-fighting: Insert ON/OFF primitives flicker at shallow VR viewing angles that desktop's fixed camera masks. Requires adequate depth bias separation (ON=0, OFF=30 minimum).
VR cabinet bottom visibility: Through transparent insert areas, VR players can see the untextured underside of the cabinet model. Fix: add an opaque blocker primitive below the playfield.
Techniques Developed Here¶
- ON/OFF primitive fading system was established here with
UpdateMaterialcross-fading - Normal maps break UpdateMaterial in VR -- discovered on this build
- Depth bias management for layered primitives -- systematic workflow developed here
- Modulated flasher code with solenoid value averaging refined during this build
- Flipper strength calibration by coil type -- the 11629 coil reference came from Indy
- VR fake reflections anti-pattern -- sixtoe's definitive statement originated here
- Flasher texture preloading was systematized during this build
See Also¶
- Iron Maiden -- similar ON/OFF primitive workflow, real machine reference methodology
- Judge Dredd -- pre-toolkit GI fading techniques, multi-state texture swapping