Skip to content

Police Force (Williams 1989)

One of the richest VPW build channels, documenting a complete System 11 table from real-machine teardown through full VLM toolkit conversion. Contains foundational knowledge on flasher naming conventions, VPX performance optimization, refraction probes, and alphanumeric display implementation. Built by benji084, apophis79, gtxjoe, and sixtoe.

Build Story

Police Force was built from a real table teardown, using benji084's crosshair reference frame photography technique. The build evolved from a pre-toolkit Sys11 implementation (using Bad Cats as a template) through a full VLM toolkit conversion, establishing many standards along the way. Niwak's top 3 performance recommendations for toolkit tables were articulated during this build.

Table-Specific Details

Mechanisms & Hardware

  • System 11 table with a "GI Blink" solenoid that works inversely to normal flashers -- it dims GI when activated rather than lighting something. Uses a TIP102 transistor on real hardware.
  • Alphanumeric display uses mixed segment types: top row is 16-segment, bottom row is 8-segment, jackpot display mixes 7-segment and 8-segment (8-segment where commas appear). Digits(0) is anomalous -- shows random numbers during attract mode but nothing during gameplay. Workaround: skip Digits(0) by offsetting all digit indices by +1.

Art & Visuals

  • Transparent ramp edge splitting technique developed here: bake ramp material with minimal diffuse and thin white strips along edges using fake RGB splitting. Material settings: Edge Opacity 0.5, Transparency Thickness 1, Refraction Thickness 10, Refraction Roughness 2.
  • Bumper cap transparency uses a two-mesh approach (inner dome + outer dome), each with its own refraction probe. Flupper1's prototype demonstrated this technique.
  • Playfield depth bias of -500 fixes z-fighting between playfield surface and objects sitting on it.
  • Sideblade reflections: "Static & Unsynced Dynamic" mode eliminates ball stuttering while keeping lightmap transitions visually in sync.

Physics & Gameplay

  • System 11 flipper strength: 2300-2600 vs WPC default of 3300. Starting from Bad Cats template at 3300, shots felt "like Future Pinball" -- dropping to 2300 eliminated balls flying off ramps while maintaining all shots as makeable.
  • Quantitative ramp timing established: real table measured at 1.50-1.88 seconds flipper-to-inlane. VPX shot tester at vel=55 averaged 1.66s, matching closely.
  • Ramp exit hole technique: convert ramp end to primitive mesh, cut beveled hole, add thin cube as rubber "stop" in dSleeves collection.

Known Issues

  • playfield_mesh naming collision: toolkit generates a collidable mesh on import that can conflict with existing physics mesh. Ensure only ONE playfield mesh is collidable.
  • VBScript variable names cannot start with numbers -- toolkit-exported objects with numeric prefixes (like 9_Rails_BM_Room) cause runtime errors.
  • Standalone player: variable named Offset clashed with Const Offset in shufflearray functions. Wine VBScript engine is stricter than Microsoft's. Fix: rename to DigitOffset.

Techniques Developed Here

See Also