Transporter the Rescue (Bally 1989)¶
Pre-toolkit build notable for documenting insert primitive naming conventions, NF Lampz migration from legacy vpmMapLights, AO baking via flasher overlays, SOSRampup tuning for tap passes, and the discovery that VPX ramp objects do not support BlendDisableLighting.
Build Story¶
Built by apophis79 with tomate80 (3D/art), iaakki (scripting/optimization), sixtoe (VR), and wylte (physics). The table served as a practical testbed for NF Lampz integration and pre-toolkit GI lighting techniques using Blender-rendered flasher overlays.
Table-Specific Details¶
Art & Visuals¶
- Insert primitive naming convention: For each light
L##, createp##(lit state) andp##off(unlit state). Copy from a reference table (Radical recommended) to get correct geometry, then swap textures. See insert lighting guide. - Insert text anti-aliasing: Insert text overlays need 5px transparent borders on all edges to prevent hard aliasing at primitive edges. The insert image should overlap the playfield hole by 2px per side to prevent a visible gap. See insert text handling.
- AO baking via flasher overlay: Render AO separately and place on a flasher object overlaying the playfield. Gives users control over AO darkness via flasher opacity. Preferred over baking AO directly into the playfield texture because different displays need different intensity.
- Ramp-to-primitive conversion: VPX ramp objects do not support
BlendDisableLighting. To make ramps respond to GI fading: export geometry from VPX, import into Blender, reimport as a primitive. The primitive version supports DL scripting. - Baked GI lighting on flashers: Render GI illumination in Blender, place results on flasher objects in VPX. Script flasher visibility for GI on/off. Produces much more realistic GI than VPX's native lights -- captures proper light bounce, color bleeding, and soft shadows.
- Ball reflection light color: Ball reflection lights must have a non-black color value set, even if using an image for appearance. Black (0,0,0) color makes reflections completely invisible with no error.
- Playfield texture resolution: Target 2160px wide (4K height equivalent) for optimal VPX sharpness vs file size tradeoff.
Physics & Gameplay¶
- SOSRampup tuning: Controls flipper ramp-up speed -- critical for tap passes. Values tested: 2.5 = tap passes nearly impossible, 8.5 = very easy, 6.0 = balanced default. Tune per-table based on flipper strength and playfield geometry. See physics tuning.
- Ball shadow Z-ordering: Per-ball offset prevents Z-fighting between multiple shadows:
BallShadow(b).Z = BOT(b).Z - (ballSize/2) + b/100. - cor.update performance: Running on a 1ms dedicated timer caps FPS. Fix: move to the main GameTimer callback. See timer management.
- Flipper strength by era: 1980s and early 1990s machines = 1800-2600 range. 1990s and later Williams/Bally = approximately 3300. See flipper tuning.
- Rubberizer R2 spin reversal: R2 reverses ball spin even at higher velocities using randomness. R1 maintains more consistent spin physics and better matches real machines with stiffer rubbers.
Known Issues¶
- GI solenoid vpinmame spamming: GI solenoid callbacks fire rapidly even when state hasn't changed. Debounce the callback or fake relay sounds with a timer checking for genuine state transitions.
- VPX Image Manager window recovery: Can get lost off-screen. Fix: reset
ImageMngPosX/ImageMngPosYregistry values to 0.
Techniques Developed Here¶
- Insert text border technique (5px transparent borders + 2px overlap) was documented here
- NF Lampz migration pattern from legacy vpmMapLights was refined here
- Ramp-to-primitive conversion for BDL support was discovered here
See Also¶
- Insert Lighting -- naming conventions, text anti-aliasing
- GI and Flashers -- baked GI on flashers, ramp DL
- Physics Tuning -- SOSRampup, flipper strength by era