Taxi (Williams 1988)¶
Comprehensive build covering GI on/off textures, RTX ball shadow tuning, bumper cap visual effects, and Fleep sound positioning. Notable for documenting the playfield image swap limitation and the GI-off flasher color gotcha where pure black masks out entirely.
Build Story¶
Taxi was built as a pre-toolkit table with hand-tuned GI lighting using flasher overlays and doubled primitives. Key contributors included oqqsan, iaakki, tomate80, sixtoe, apophis79, and wylte. The build served as a testbed for RTX ball shadow refinement and rubberizer comparison testing.
Table-Specific Details¶
Mechanisms & Hardware¶
- Catapult animation: Timer was originally set to 1ms (attempting 1000fps). Changed to 10ms (100fps) which looked better and performed well. See timer performance.
- Sling sound positioning: Fleep slingshot sounds require a reference object with X and Y properties near the slings. If the referenced object is renamed or deleted, sounds break silently.
Art & Visuals¶
- GI on/off with multi-step fading: Uses 2-4 intermediate texture steps for side cabinets and plastics. Script changes BlendDisableLighting on primitives proportional to GI step. Formula for plastic ramp fading:
Primitive_Ramp2.blenddisablelighting = (1-(((GIstep-1)*33)/100)) + 0.3. - GI-off flasher color gotcha: When using a flasher to darken the playfield for GI-off state, the flasher color must NOT be set to black (0,0,0) -- VPX masks out pure black. Use medium grey (124,124,124) instead. See anti-patterns.
- GI shaped lights via flashers: VPX's built-in lights produce hard shadow edges. Flasher objects with custom-drawn images create shaped GI light effects with proper falloff. See GI shaped lights.
- Drop target shadows via flashers: Rendered in Blender using a shadow catcher, placed on flasher objects, visibility toggled based on target state.
- Side cabinet texture stretching: Subdivide the primitive mesh so a single texture works for both normal and cabinet-mode side blades without stretching.
- Bumper cap visual feedback: Separate bumper cap primitives with BlendDisableLighting adjusted briefly on hit. Random flicker formula:
caps_prim.blenddisablelighting = rnd(1)/4+0.5.
Physics & Gameplay¶
- RTX ball shadow Z-position flicker: Ball shadow z tied to ball z caused z-fighting near flippers. Fix: remove ball z dependency entirely (fixed z). Ball shadow depth bias values: ball at -1000, flipper at -1100, ambient at -1200.
- RTX shadow distance tuning: Shadows looked too thin at distance with falloff 100. Fixed by increasing to 200 and modifying equation from
25 * opacityto15 * opacity + 5. - Rubberizer testing: Setting 2 recommended for Williams era. Setting 0 = ball too dead, Setting 1 = too bouncy with unexpected micro-bounces. Flipper coil ramp-up: fast (0) felt most precise.
- GameTimer sync mode: Table had sync mode set to force vsync, inappropriate for all setups. Fixed by setting GameTimer to per-frame (-1).
Known Issues¶
- Playfield image swap limitation: VPX playfield image swapping only works via F6 (debug play). Normal launch prevents runtime replacement. Workaround: flasher overlay with "Overlay" filter mode.
- Division-by-zero in nFozzy: Same flipper trigger fix as T2 -- trigger hit heights to 150 with PolarityCorrect in drain_hit.
Techniques Developed Here¶
- RTX ball shadow tuning distance and Z-ordering refinements originated here
- GI flasher color requirement (no pure black) was discovered here
See Also¶
- GI and Flashers -- shaped GI lights, flasher overlay techniques
- Best Practices -- cabinet mode defaults, pure black avoidance