Skip to content

Taxi

Taxi is a Williams System 11 table that went through extensive VPW development with baked GI textures, 4-step GI fading, RTX ball shadows, and detailed physics tuning. The project involved multiple contributors including Sixtoe (VR, fixes), tomate80 (models, textures), iaakki (fading code, inserts), oqqsan (inserts, GI), and apophis79 (physics, sounds, shadows).

Build Notes

Version History

Key milestones:

  • v002: Fleep sound package added
  • v006: VR support -- backbox/DMD/backglass, unified timers, cabinet mode (Sixtoe)
  • v009: GI-on baked textures, warm LUT, plastic ramp retouching (tomate)
  • v011: All inserts cut, 4-step GI on sidewalls and playfield (oqqsan)
  • v016: RTX ball shadow, GI lights for ball reflections (apophis)
  • v018: Target bouncer, flipper rubberizer, coil ramp up options (apophis)
  • v1.0: Released on VPUniverse
  • v1.2.3: Clark Kent plastic ramps, collidable ramps fixed (tomate)
  • v1.2.4e: Unused LEDTimer removed, GameTimer per-frame, VR backbox fix (Niwak)

GI Lighting with Flashers

VPX lights produce hard shadow edges. The workaround:

  • Use VPX lights (default circular shape) for general GI illumination
  • Use flasher images for the shadow shapes (drawn by hand or rendered in Blender)
  • Script flashers to fade with GI rather than just on/off
  • Reference: Maverick table, layer 6, FlasherGI001

Drop Target Shadows

Dynamic drop target shadows using Blender and flashers:

  1. Render shadows using a shadow catcher in Blender
  2. Place on flasher objects
  3. Toggle with visible=0/visible=1 when targets go up/down
  4. The rothbauerw drop scripting has built-in provision for shadow handling

RTX Ball Shadow

  • Shadow falloff increased from 100 to 200 for more natural appearance
  • Equation adjusted from 25 * opacity to 15 * opacity + 5
  • Ball shadow DB: RTX at -10/-11, ambient at -12, ball shadows at -1000/-1100/-1200
  • Remove ball shadow z-position dependency for tables without significant height changes

Bumper Cap Implementation

Taxi uses Williams System 11 clear style caps (no grooves), same as Flupper's bumper kit and BK2000. Different colors achieved via VPX material settings. DL randomness for realistic power flicker on hit:

blenddisablelighting = rnd(1)/4+0.5  'random between 0.5 and 0.75

Simplified GI step formula: caps_prim.blenddisablelighting = (5-gistep)*0.25

Permissions

Permission obtained from icpjuggla (last author) via VPForums before release.

Scripting

GI On/Off Texture Swapping

VPX Limitation

Playfield image swapping via script only works when started with F6 (debug mode). During normal gameplay, use a flasher overlay for the "off" state instead.

For sidewalls, place textures outside the color-mod if-statement. For the playfield off texture, a flasher approach requires insert cutouts in the off-image.

GI Step Fading for Primitives

Primitive_Ramp2.blenddisablelighting = (1-(((GIstep-1)*33)/100)) + 0.3

This changes blend disable lighting between 0.3 and 1.3 based on the GI step.

Insert Fading Fix (NFadeLm vs NFadeL)

Incorrect:

NFadeLm 37, L37
NFadeL 37, L37b          ' WRONG: NFadeL resets fading

Correct:

NFadeLm 38, L38
NFadeLm 38, L38b         ' CORRECT: NFadeLm preserves state
FadeDisableLighting 38, p38, 10

Force GI On at Init

GI was never turned ON at table initialization, causing RTX shadows to not work initially. Add a GI initialization call in table init to force GI on at startup.

Slingshot Sound Reference

Slingshot positional sounds require a reference object with X and Y properties near the slings. If the object is deleted or renamed, sounds break. A GI light under the slingshot can serve as the position reference.

Catapult Timer

The catapult animation timer at 1ms caused super slow performance on lower-end hardware. Fix: set to 10ms (100fps) which looks better and runs smoothly.

3D & Art

Playfield Noise Removal

Baked playfield textures had visible noise artifacts at 4K resolution. Simple fix in Photoshop using denoising tools.

Playfield Material Grey Cast

A grey/washed-out appearance on part of the playfield was caused by incorrect material settings.

Sideblade Textures

A single texture can work for both normal and double-height sideblades (cabinet mode) without stretching. The key is subdividing the mesh.

Plastic Appearance

For realistic plastics:

  • Bevel/cap material should have very little roughness
  • Very little reflection
  • If plastics look too dark when lights go off, check these settings

Screw Primitive Warning

A single screw primitive had 10,216 faces and was 27 MB. Extremely excessive for a small object.

Scanned vs Rendered Playfield

Scanned playfields provide much more exact positioning of all objects, better texture quality than AI-upscaled images, and enable accurate post transfers.

Troubleshooting

Ball Shadow Disappearing

When timers were unified, BallShadowUpdate was accidentally omitted from the game timer.

Playfield GI Flasher Not Covering

The GI off flasher color was set to black (0/0/0), which was masked out. Fix: set to medium grey (124/124/124).

Null Error in NF Flipper SpoofBall

Intermittent null error when unhit event does not fire on flipper trigger. Fix: increase hit height of TriggerLF and TriggerRF to 150, and add polarity correction in drain_hit:

RF.PolarityCorrect Activeball: LF.PolarityCorrect Activeball

Division by Zero in COR

Quick fix for cor.ballvel returning zero:

RealCOR = BallSpeed(aBall) / (cor.ballvel(aBall.id)+0.00000001)

Ramp Decal Backlight

Ramp decals not showing flasher backlight: set depth bias to -100 while flashers remain at 0. Set "DL from below" to 0 on ramp decal prims.

Ball Jumping Over Apron

Add helper walls with height 0-100 in upper-left/upper-right areas. Non-visible apron walls should be height 100 by default.

VR Playfield Wobble

Fix: create a new physical playfield mesh, convert old mesh to visible-only. Also check that materials/objects are set to "active" not "static."

Bell Sound Volume

The multiball bell sound was extremely loud. Replaced with a properly leveled version.

Game Knowledge

Rubberizer Settings

Tournament play comparison:

  • Setting 0: Ball too dead
  • Setting 1: Too bouncy, unexpected micro-bounces
  • Setting 2: Most realistic feel, better control
  • Flipper coil ramp-up: Fast (0) preferred for truer aim

Resources

Texture Guidelines

  • Cabinet side textures need 4K (span full table length)
  • No texture should need expanding or contracting at target resolution
  • GI step images (4096x4096 each) are the main file size contributors

Best Practices

  • Ship with cabinet mode off as default (cabinet users know how to enable it)
  • Set sync mode to -1 to respect user's global VPX settings