Skip to content

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 * opacity to 15 * 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

See Also