Skip to content

Police Force

A comprehensive VPW table build from scratch with the highest single-channel nugget density (89 nuggets). Police Force was originally designed as a Batman table for the 1989 film before licensing was lost to Data East, forcing Williams to re-theme quickly. The VPW project involved extensive collaboration between benji084 (3D/scanning), gtxjoe (VPX scripting), tomate80 (ramp modeling), brad1x (vector redraw), and many others.

Build Notes

Photography Setup for Playfield Scanning

  • Use iPhone 12 (26mm lens) rather than GoPro for less barrel distortion
  • Take a grid paper photo at same distance to create a lens distortion profile
  • Use crosshair frame cutout as reference for alignment (crosshairs 2" apart)
  • Camera rig keeps camera in exact same plane for each shot
  • Avoid direct lighting -- use natural light bouncing off white walls
  • Overcast days are ideal for outdoor shots
  • For plastics: use flatbed scanner when available

Photo Stitching Workflow

Use 3x3 mesh warp in After Effects/Photoshop to align each photo tile to a playfield protector overlay. Start with a 3x3 grid, then refine with 4x4 intermediate points. Use the playfield protector image as an alignment reference (exact aspect ratio match).

Table Dimension Standards (System 11)

Measured Police Force PF edge-to-edge: 20.25" x 40.75". Standard System 11 non-widebody: 20.25" x 42". In VPX: 952x1974 pixels. The Bad Cats template was 952x2042 (extra space for backwall).

Object Naming Convention for Baking Workflow

Prefix Meaning
p_ Visible, not collidable (rubber bands/posts)
x_ Collidable, invisible (NF physics rubber prims)
xp_ Collidable, visible (VPX metal walls)
xm_ Visible, collidable, mechanical/animated
m_ Mechanical/animated (non-collidable)
b_ Baked primitives
bm_ Baked mechanical/animated

Naming Timing

Renaming objects after script integration breaks multiple script locations (table_init, switch hits, solenoid calls, sound calls). Adopt naming conventions early or accept tedious script fixes.

NF Physics Configuration (Era-Specific)

Police Force needs System 11 Mid 80s/Early 90s physics (2300-2600 flipper strength), not Mid 90s (3300). Separate rubber objects into three collections:

  1. dPosts -- rubber posts and pins
  2. dSleeves -- rubber sleeves
  3. Rubbers -- ALL rubbers (for hit sounds)

Rubber height 35 aligns with post slots.

Center Ramp Timing Analysis

Real table video (7 consecutive right flips): 1.5-1.8 sec average. VPX right flip (velocity 40-60): 1.28-2.15 sec. Right flipper CCW ball spin significantly increases speed through ramp. Dropping flipper strength from 3300 to 2300 resolved ball flying off ramp.

VPX Ramp Limitations and Workarounds

  • VPX ramps only specify start/end width -- use multiple ramps for tapered sections
  • Height only has start/end -- "height offset" allows brute-force adjustments
  • Balls don't roll past defined table boundary -- extend boundary with dead space at top
  • For ramp end behavior: export as primitive, add beveled hole at exit point

Ramp End Hole Technique

Export center ramp as primitive with beveled hole at exit. Add thin primitive cube as rubber stop (assigned to dSleeves) before hole:

  • Hole sized so ball briefly "figures itself out" before dropping
  • Rubber stop adds dampening and bounce on stronger shots
  • Randomness in exit behavior
  • Funnel shape below hole guides ball to inlane

Layer Organization for Baking

Three blank VPX layers needed: 1. Layer for "on" primitives import 2. Layer for "off" primitives import 3. Layer for invisible collidables

Collections organized by material for primitive fading. Naming example: b_h_rf_gOn = baked, hardware, right flasher on, GI on.

Drop Target Implementation

Use Roth's drop target method (Part 4 tutorial): Physics Part 4 - Drop Targets. Targets animated via script, not stock VPX objects.

3D & Art

Vector Redraw Workflow

Brad1X's Illustrator process: - Set up file at exact playfield size, place original PNG as base layer - Draw black outlines on separate layers at 500-1000% zoom - Use "curve pen" tool (place points at curve ends, pull out line automatically) - Copy/paste to Photoshop as "smart layers" for any resolution export - Final Police Force redraw: 3996x8820 (200% larger than original)

General advice: - Never rotate/skew/perspective correct more than once (degrades image) - Render at 8K then reduce down for clean lines and detail - Use cubic interpolation for transforms (not bilinear)

Plastic Modeling

Stacked plastics with transparency rendering require proper 3D refraction baking (looks much better than painting refractions in Photoshop). For VPX: use 1-2 faced bevels to catch environment reflections (more bevels = less reflections).

GI Baking Strategy

GI flashing multiplies render sets (GI on + flashers + GI off + flashers). Each VPX GI bulb has 2 light objects -- delete the larger one since baked lighting replaces it. Keep small light to make the bulb glow. Reduce baked flasher lighting intensity so VPX flasher bloom domes contribute more.

Hardware UV Unwrap and Baking

Gates are especially prominent (4 main ones) and would stand out without baked textures. Will bake lighting for gates, targets, bumpers, posts, rubbers, and metal rails.

Scripting

Shot Tester / Debug System

Hold P to capture ball, use shift keys to increase/decrease shot angle on-the-fly. Hard-code angles in script after dialing in. Goal: read shot parameters from external text file rather than embedded in VPX. Debug with R key for consistent test shots. Shot tester velocity should be 55 (flippers vary 40-60).

Ramp Gate Switch Debugging

If the ball is too fast, the ROM misses the gate trigger (gate still swinging). Add debug prints to ramp gates to check detection and ROM switch events.

Troubleshooting

Ball Flying Off Center Ramp

Root causes discovered: 1. Gate brackets set to "collidable" instead of "toys" 2. Flipper strength too high (3300 vs proper 2300-2600 for System 11) 3. Right flipper CCW ball spin increases ramp speed significantly

Ball Escaping Sling Area

Ball squeezed through DOF sling area. Solution: fill area solid with invisible wall.

Playfield Mesh Causing Visual Offset

Objects offset in render view but aligned in editor. Cause: playfield mesh interaction. Fix: delete mesh and reimport, or shift object in editor to compensate.

VPX Table Factory Settings

Table stuck in factory settings on first launch. Press F3 to restart -- some tables need this for ROM/nvram initialization. If still broken, delete nvram file.

Plunger Strength

"True understanding of the plunger settings have always been a mystery..." -- remains poorly documented in VPX.

Game Knowledge

Gameplay and Rules

The center ramp is the easy/addictive shot (a TNA player made it 17x in a row on real table). System 11 Williams flippers can be super strong/"chunky." The YM2151 sound chip (same family as Sega Genesis) produces the distinctive FM synthesis music.

Python Anghelo Art Style

The art is by Python Anghelo -- very distinctive and recognizable, fun, expressive, told a story with every table. Police Force is uncharacteristically simple for Python (usually very intricate).

Best Practices

Multiple Contributors Workflow

Key coordination patterns: - benji084: Photography, scanning, 3D modeling, baking/rendering - gtxjoe: VPX scripting, table layout, physics, object placement - tomate80: Ramp modeling (Blender), hardware modeling - brad1x: Playfield/plastic redraws (Illustrator/Photoshop) - Clear handoffs with versioning (0.0.001 through 0.0.022+) - Dropbox for assets, Google Drive for VPX versions, Discord for coordination

File Size Management

Clean early -- Police Force hit 150MB from Bad Cats template leftovers. Export images/sounds to separate folders and sort by size to identify the largest files.

Arcade vs Clean Version Strategy

Ray-trace the arcade version first (scuffs, wear). If/when someone redraws, swap in new graphics and generate a new render set for "as-new" release.

Resources