Best Practices & Conventions¶
Community-tested practices from years of VPW table development. These conventions emerged from building dozens of tables and will save you from mistakes the team has already made.
Project Organization¶
Object Naming Conventions¶
Name objects consistently from the start. Renaming later breaks scripts in table_init, switch hits, solenoid calls, and sound calls. (benji084, gtxjoe, Police Force)
VPW naming prefixes:
| Prefix | Meaning | Example |
|---|---|---|
p_ |
Visible, not collidable | p_RubberPost01 |
x_ |
Collidable, invisible | x_RubberPost01 (nFozzy physics) |
w_ |
Wall objects | w_LeftOutlane |
sw_ |
Switch objects | sw_LeftOrbit |
bm_ |
Bakemap primitives | bm_parts, bm_PF |
Start naming before major scripting
Retrofitting naming on an existing table means touching every script reference. Worth it for baking workflow, but budget the time. New objects with the convention are painless.
Layer Organization¶
VPX 10.6 was limited to 11 layers; 10.7+ allows more. For toolkit tables, the VLM.Visuals layer contains all toolkit-imported primitives. Old pre-toolkit primitives should be deleted once replaced. (astronasty, fluffhead35, sixtoe, Game of Thrones)
Recommended layer structure:
- Collidable rubbers on their own layer (separate from visible rubbers)
- Slings separate from collidable rubbers
- VLM.Visuals for toolkit-imported primitives
- Physics objects (invisible collision geometry) isolated from visible objects
- VR primitives on dedicated layers with script-toggled visibility
- Three blank layers for baking: "on" primitives, "off" primitives, and working layer
VR layer isolation
Isolate VR objects on their own layers. In Ghostbusters, VR objects were scattered across all layers -- 232 objects on layer 11 alone -- making maintenance a nightmare. (iaakki, Ghostbusters)
File Size Management¶
Before every release, audit assets. Export images and sounds to folders sorted by size to find the biggest offenders. (sixtoe, apophis79, skillman604, Game of Thrones, Diner, Spider-Man)
- Remove unused images (but search the script first -- VPX reports dynamically-switched images as "unused")
- Convert PNG to WebP for major savings
- Convert music/voice to OGG or MP3 (keep mechanical sounds as WAV for pitch shifting)
- Reduce
tnobto actual table needs; delete unused ball rolling WAVs - Remove unused drop target shadows
These techniques cut Game of Thrones from 310MB to 265MB. Police Force dropped from 150MB to 26MB after removing leftover Bad Cats template images. (gtxjoe, benji084)
Texture Sizing and Resolution¶
Size textures by screen coverage. Cabinet side textures need 4K (full table span). Plastic textures may not need 4K depending on UV mapping. Blood Machines reduced a 17MB JPG ship texture to 1.5MB WebP at 2K with no visible difference. (apophis79, sixtoe, tomate80, Taxi; pinstratsdan, iaakki, Blood Machines)
For artwork, render at 8K and reduce down. Never rotate/skew/perspective-correct more than once (degrades each time). Use cubic interpolation, not bilinear. Vector workflows (Illustrator, Inkscape) are ideal for line art -- transfer to bitmap only at final resolution. (sixtoe, brad1x, ebislit, Police Force)
Graphics and Rendering¶
Playfield Accuracy¶
VPW prioritizes authenticity over stylization. When a playfield image "has been around the block a few times," seek fresh scans rather than propagating accumulated inaccuracies. That said, do not chase perfection on minor dimension variances without proper reference material. (Deleted User, Beat the Clock; bord1947, mcarter78, Harlem Globetrotters)
Pure Black Breaks VPX Rendering¶
RGB 0,0,0 causes divide-by-zero errors or gets hard-coded to minimum 1,1,1. Pure black playfields break lighting. Same issue with pure white. (sixtoe, tomate80, Johnny Mnemonic)
Use at minimum RGB 10,10,10 for blacks
Pure black "is poop for rendering -- it doesn't interact with lighting properly." Dark grey provides depth and reacts to light naturally. (sixtoe, iaakki, Metallica)
GI Color Temperature¶
When adjusting via SetGIColor, keep changes very small (e.g., 180,220,255 for slight cool shift). Larger values toward blue visibly reduce intensity -- "the light gets eaten up." This modifies baked lightmap colors, so aggressive values degrade bake quality. Offer 2-3 presets (Warm, Daylight, Cool) with descriptive names, not Kelvin values. (iaakki, mrgrynch, apophis79, Bad Cats)
A large overhead flasher tied to the GI circuit creates effective global dimming without interfering with player LUTs (unlike LUT-based GI dimming). (wrd1972, F14)
LUT (Color Grading) Philosophy¶
LUT selection is display-dependent and personal. The VPW consensus is to include a LUT selector, though some developers ship a single curated vision. (o0skitso0o, Monster Bash; skitso, hauntfreaks, apophis79, Indiana Jones)
Skitso's Monster Bash uses fading LUTs that change with GI level for dynamic ambient lighting. His position: "Making a table look nice in every possible gameplay situation even in one LUT condition is mind numbingly complicated -- let alone for dozens of completely different LUTs."
The team generally settled on providing options after user feedback about overly warm/dark defaults. Standard LUT suites are available in TFTC. For monitor calibration, Spyder 5 Pro is a reasonable entry-level option (~80 EUR used).
Insert Lighting¶
Skitso Style: Two VPX light objects per insert -- one for the insert, one to smooth edges. Requires playfield reflections enabled globally; disabling causes dark squares around inserts. (o0skitso0o, Monster Bash)
Tuning workflow: Start with BlendDisableLighting value at bulb intensity 0. Tune the unlit material, then gradually bring up intensity. Adjust bloom and halo independently. (iaakki, ebislit, Metallica)
Image layers: Moving insert images to a separate Photoshop layer (on top of 3D insert prims) makes a significant quality difference by allowing independent control. (ebislit, Metallica)
Bloom size: Keep blooms proportional. Check Judge Dredd's implementation as reference -- blooms roughly one-third the size of what many tables default to. (sixtoe, Dr Who)
RGB inserts: The Ghostbusters workaround keeps both "on" and "off" primitives and switches between them, avoiding runtime color mixing complexity. (iaakki, ebislit, Metallica)
LED vs Warm Bulbs¶
LEDs suit modern themes (Metallica's electric chair). Warm bulbs match incandescent-era machines. A LUT can offset if LEDs feel harsh. (iaakki, sixtoe, mrh7712, benji084, Metallica)
LED conversions ruin light shows
Reviewing 10+ LED-converted Last Action Hero videos revealed: GI as bright as flashers (no contrast), snap on/off instead of gradual fade, total loss of subtle dimming. Consider this when choosing aesthetics. (sixtoe, Last Action Hero)
Ball Reflections¶
VPX limits ball reflections to 8 simultaneously. Only enable "show reflection on balls" on one object per visible light source. (iaakki, Diner)
For inserts, create dedicated reflection-only lamps below the playfield at -10 depth with depth bias making them invisible except to ball reflections. Remove ball reflection from every other light. For tight areas, selectively cull reflections to stay under 8. Copy working lamps from Iron Man as a starting point. (iaakki, apophis79, Game of Thrones)
Reflections cut off at insert primitive edges. Fixes: use regular VPX playfield inserts, make insert material semi-transparent (opacity ~0.4) with Static Rendering disabled, or use a 90-degree rotated blocker primitive. (oqqsan, iaakki, Blood Machines)
Depth Bias¶
A "dark art" that controls rendering order of overlapping transparent objects. Wrong values on insert primitives cause ghost ball effects. After toolkit integration, delete original VPX primitives replaced by toolkit lightmap prims. (sixtoe, apophis79, Game of Thrones)
For VR, increase depth bias on objects that should show through masking primitives (e.g., VR Slimer, cabinet legs). (rawd, Ghostbusters)
Render Probes and Refraction¶
Ramp render probe roughness controls blur of objects seen through ramps. Roughness 0 = perfectly sharp; roughness 1 = too blurry. Balance with normal map scratches and low roughness. (benji084, clarkkent9917, Bad Cats)
To disable refractions without deleting: in Render Probe Manager, set to Plane Reflection probe, then Max Quality to "Disabled." Preserves setup while eliminating GPU cost. (benji084, Johnny Mnemonic)
Playfield Reflections¶
Full reflections require enabling on both bm_parts AND lightmaps, but lightmaps render transparent in reflections, showing backface artifacts. Street Fighter 2 implemented tiered options (None / Partial / Full). (flupper1, sixtoe, Space Station; frank_enste1n, apophis79, Street Fighter 2)
Flasher Techniques¶
Bloom for high flashers: A FlasherBloom2 on a high layer adds table-wide effect when flashers fire. Position bloom center between sources. Reference PAPA videos to calibrate spread. (apophis79, sixtoe, Monster Bash)
Multi-flasher balancing: Individual punchiness causes whiteout when multiple fire simultaneously. Dimming for multi-fire makes single shots dull. Use objlevel multipliers (0.7 when others active) but this requires per-solenoid timers. Often accepted as a compromise: "fast, pretty, accurate -- pick 2." (o0skitso0o, Monster Bash)
VR flashers: Bright centers look like floating discs unless directly above, but placing directly above causes object clipping. (sixtoe, Spider-Man)
Other Rendering Tips¶
Color materials on plastics: BlendDisableLighting with negative values (e.g., fading between -0.03 and 0) lets plastics have color tint that fades in/out. (iaakki, Metallica)
Alpha mask for cutouts: In image manager, the Alpha Mask slider (not just alpha channel) at higher values (e.g., 200) hides odd pixels. Keep alpha mask high for the playfield image. 30-degree angled cuts always lose anti-aliasing -- use overlapping text layers to mask jagged edges. (brad1x, iaakki, Spider-Man)
Physics and Gameplay¶
For comprehensive tuning guidance, see the Physics Tuning Guide.
nFozzy Flipper Physics¶
The VPW standard. Key implementation notes: (skillman604, astronasty, fluffhead35, Game of Thrones)
- If playfield dimensions are true to real life, nFozzy should "just work"
- Must use VPW
PhysicsMaterials.mat-- rubber dampening code depends on exact materials - Collidable rubbers on their own layer
- nFozzy upper playfield flippers too, with polarity corrections
- Flipper endpoint triggers flush with ends. Math: 3" flipper with rubbers = ~3.125" = ~147 VP units
RightFlipper.timerinterval= 1, not 5
Standard Physics Values¶
(fluffhead35, Game of Thrones)
Table: Gravity 0.97, PF Friction 0.15-0.25, PF Elasticity 0.25, Elasticity Falloff 0, Scatter 0, Default Element Scatter 2
Flippers (mid-90s+): Mass 1, Strength 3200-3300, Elasticity 0.88, Elasticity Falloff 0.15, Friction 0.9, Return 0.055, Coil Rampup 2.5, Scatter 0, EOS Torque 0.275, EOS Torque Angle 6
Playfield Friction¶
VPW standard is 0.15-0.25. Many tables inherited 0.025 from JP, which is far too low. Low friction causes overly bouncy rubbers, ball "floating" without rotating, inability to post-pass, and ball feeling too light. After correcting to ~0.22: "a lot less bouncy -- almost lethargic compared to how I'd been playing." (skillman604, sixtoe, astronasty, Game of Thrones)
Ball Mass and Flipper Sizing¶
Ball mass 1, size 50 (Roth's recommendation). Some tables experimented with higher mass but needed reduced slope to compensate. Stick with mass 1. (benji084, rothbauerw, bord1947, Metallica)
Flipper dimensions must match the real machine. Doctor Who lightning flippers: 2.875" (not standard 3"). Formula: flipper_length * 50 / 1.0625. Rubbers add 0.125" to length. (rothbauerw, Dr Who)
Lowering flipper end angle slightly is more effective for difficulty than rubberizer, which only gives 1-2 micro bounces. (iaakki, Monster Bash)
Physics Tuning Philosophy¶
Minimize user physics options. Defender shipped with rubberizer hardcoded on, tuned to match real machine videos. Provide a well-tuned default rather than overwhelming users with sliders. (apophis79, Defender)
Test shot safety: if a shot can be backhanded repeatedly with no risk, something is wrong. The GoT battering ram was too safe because code damped AngMomY (sideways spin) instead of AngMomX, eliminating natural scatter. Fix: round collision surfaces, damp VelY instead, let AngMomY amplify for scatter. (bhitney, iaakki, sixtoe, apophis79, Game of Thrones)
Design principle
Failed ramp shots should be deadly. "A missed ramp shot should be deadly as you can see they both aim the ball straight toward the drain." Match the real machine's risk/reward profile. (bord1947, sixtoe, Metallica)
Rubber Posts and Slings¶
Use primitives (true-round) instead of walls for rubber posts. Sling rubber walls should NOT extend to top/bottom posts -- real slings don't activate at post hits. Collidable rubbers must match visible primitive size exactly; in Indiana Jones, 0.5cm mismatch caused invisible bounce geometry. (fluffhead35, Game of Thrones; sixtoe, astronasty, Indiana Jones)
Sluggish slings checklist: ball mass 1, elasticity ~0.88, no collidable objects in front absorbing energy, correct zcol_slings material. (skillman604, apophis79, rothbauerw, Game of Thrones)
Sling sensitivity affects difficulty significantly. Too sensitive interferes with cradle separation. Compare against real machine and tournament footage. (iaakki, pinstratsdan, Guns N Roses)
Wireforms, Scoops, and Ramps¶
Real wireforms are much slower than VPX defaults. Ramp return ski-jumps don't always cross the drain IRL. Compare against PAPA footage to calibrate. (wylte, Guns N Roses)
For scoops/VUKs with primitive geometry, wait for final toolkit geometry before fine-tuning. (sixtoe, rothbauerw, Guns N Roses)
When modifying ramp visuals, avoid changing the entrance area -- this alters physics and takes ages to retune. Quick alignment test: remove wall textures (turns pink), make ramps black. Pink visible through black = misaligned. (niwak, sixtoe, X-Men)
Plunger Lane Grooves¶
Add grooves to physics playfield mesh in Blender (export as .obj). Run "merge by distance" before export. Mesh must be spotless or ball physics break. Ramps are historically safer but mesh grooves work when clean. (iaakki, Guns N Roses)
Rothbauerw Drop Targets¶
Use walls and primitives instead of VPX drop target objects for more realistic behavior. This also fixes the 10.7.x bug where VPX drop targets must be visible to register hits. Benefits: multiple targets can drop from single hit, targets can brick, more authentic physics. (apophis79, Game of Thrones; scottacus64, rothbauerw, Hang Glider)
Selective application
Not every bank needs Roth-style. Blood Machines left upper PF targets as standard -- barely visible, and Roth-style would make the under-PF game too easy. (apophis79, Blood Machines)
Other Physics Notes¶
- Flupper Williams Bats: Easy DL control for GI state matching, better-looking than default meshes. (bord1947, Defender)
- Digital nudge: Too strong = saves anything; too weak = useless. Balance carefully. (PinStratsDan, Starship Troopers)
- Playfield holes: Add roof/ceiling prims over problem areas. Verify center post exists IRL before adding. (apophis79, mcarter78, Time Fantasy)
- Grace periods: Give players 1-12 seconds after mode/multiball end for a final shot, like real tables do. (pinstratsdan, iaakki, Blood Machines)
- Physics material borrowing: OXO physics materials work well for early solid state Bally feel. (mcarter78, Harlem Globetrotters)
Sound Design¶
Format Rules¶
Bass.dll can only pitch-shift WAV files, so format matters: (sixtoe, fluffhead35, Game of Thrones; oqqsan, apophis79, Goonies)
| Sound Type | Format | Reason |
|---|---|---|
| Music / background | MP3 or OGG | Space savings (55MB saved on Goonies) |
| Callouts at fixed volume | MP3 | PlaySound works fine |
| Positional sound effects | WAV | Pan and frequency shift require WAV |
| Mechanical sounds | WAV | SSF and pitch shifting |
Wall Hit Thresholds¶
Metal walls at threshold 0.5 sound "crunchy" on gentle contact. Use 2.0 for metal walls/rails, 0.5 for rubbers/posts/pegs, 1.0-1.5 for plastics. Ensure walls_hit calls wall sounds, not rubber sounds -- a common copy-paste error from templates. (apophis, iaakki, Ghostbusters; apophis79, Taxi)
Mechanical Sounds¶
Record from actual machines when possible. Real machine recordings elevate authenticity significantly. Balance Fleep-integrated mechanical sounds (often too loud initially) against music and callouts. (gedankekojote97, devious626, Street Fighter 2; apophis79, sixtoe, Starship Troopers)
Finding ROM audio: In Pinball Browser, extract the video clip, get its duration via ffmpeg, sort audio by duration, navigate to that time range. Much faster than manual searching. (daphishbowl, Iron Maiden)
Collaboration and Version Control¶
The VPX Binary Problem¶
VPX files are binary blobs that cannot be merged. Only one person modifies the table at a time. Others work on separate assets (DMD, 3D models, playfield art) in parallel. (iaakki, sixtoe, apophis79)
Multi-Developer Workflow¶
Evolved through Indiana Jones (86+ versions), Blood Machines (v80 to v217+), Die Hard Trilogy (112-184):
- One person "checks out" the table at a time (1-2 day max)
- Script changes shared as .txt and merged via WinMerge
- Each upload gets a changelog in the script header:
' 142 apophis - fixed collision sounds, reworked the loop
' 143 sixtoe - sling force adjustments, rubber alignment
- Pin todo lists in the Discord channel
- Files via Google Drive, Dropbox, or MEGA
- Old versions saved for regression testing
Team size limit
More than 3 developers per table is too many. Freeze collidables before intensive testing. Bring in "just players" for unbiased feedback. (iaakki, sixtoe, apophis79, Indiana Jones)
VLM Table Version Control¶
New VLM renders overwrite primitives/textures, breaking script hookups. Keep VPX in the same folder as .blend (toolkit uses linked VPX for export). Custom script goes outside VLM-managed sections (marked ' VLM). Always backup .blend before major changes. Create separate "VLM branch" versions. (sixtoe, tomate80, flux5009, Iron Man)
Version Numbering¶
Sequential numbers in filenames: PoliceForce_0.0.001.vpx through _0.0.047.vpx. For releases: internal builds (3.001-3.061) > RC builds (RC01-RC06) > release (3.0) > patches (3.0.1, 3.0.2). (benji084, apophis79, Bad Cats; gtxjoe, Police Force)
Save in the correct VPX version
VPX doesn't warn about version changes. Always verify save format matches the project standard. (apophis79, wylte, VPW Example Table)
Permission and Mod Ethics¶
Contributing to VPW: Download latest, make changes, upload with changelog, notify team. Don't upload test builds before the designated maintainer. (sixtoe, bord1947, iaakki, Metallica)
Modifying other authors' tables: Contact via VPUniverse messages. If unreachable, good-faith attempt suffices. Prefer the "Helpstop model" -- help the author release as an update, not a separate mod. Updates preserve lineage; mods are forgotten. (iaakki, djrobx, benji084, Indiana Jones)
Mod release ethics: 90-day "bro code" waiting period. Credit original team and link to original. PuP-Packs (standalone addons) differ from modifying integral PuP media of "Not Free to Mod" tables. VPW patcher requires mutual consent. (o0skitso0o, bord1947, nailbuster, Monster Bash)
Abandoned Table Revival¶
For tables with creator MIA 2+ years: attempt contact, designate new lead, preserve original vision, prioritize physics/inserts/PuP updates, release under VPW with full credit. MF DOOM went from abandoned WIP (2022) to v1.0 (July 2024) this way. (iaakki, shaggysrsg, apophis79, wylte, MF DOOM)
Design Philosophy¶
Quality Standards¶
"If we see some flaw in quality, we ain't shipping it. PF graphics is like a corner stone. It must be solid when table work is started. Everything on top of it is just garnish." (iaakki, Metallica)
Match Real Table Behavior¶
Having a real machine owner on the team is invaluable: measurements, reference photos, 3D scans, gameplay verification, ROM behavior confirmation. "Propose things as questions if you're not sure, rather than as statements." (ebislit, Godzilla)
Road Show demonstrated the gold standard: ClarKKent continuously compared VPX to his real table. His reaction: "I can't believe that it plays so extremely similar to the real thing." (clarkkent9917, Road Show)
Table Darkness and Vision¶
Monster Bash IS dark in real life -- only 2 GI bulbs on the lower playfield. Multiple owners confirmed this. Users can adjust the day/night slider. (o0skitso0o, Monster Bash)
DMD Design¶
"The DMD is about delivering information, not focusing on assets." Text should be large and readable. Videos serve as background. Separate text from video as distinct PUP layers. For Data East era: no 3D animations ("too fancy, doesn't fit the era"), 2D only. (astronasty, scampa123, Die Hard Trilogy)
Playfield Variants¶
Strategy: ray-trace the arcade version (scuffs, wear) first. If someone redraws later, swap in clean graphics. For baked tables, doubling textures for two versions is not ideal. Some tables offer "no character" variants toggled via script. (benji084, brad1x, Police Force; Deleted User, wylte, Beat the Clock)
Development Workflow¶
VPX Version Consistency¶
Stick to one VPX version. If you upgrade, stay upgraded. Keep backups in the previous version. Mixing edits between versions causes issues and downgrading may be impossible. (Deleted User, No Fear)
Toolkit Script Management¶
VLM import overwrites script changes. Remove VLM comments from modified lines to prevent overwriting. Don't rename Lampz array sizes or prim names in VPX (they revert on import). Prim name changes must be done in Blender. (skillman604, tomate80, Game of Thrones)
Scripting Tips¶
- Sub calls vs vpmTimer: Call Subs directly for ball kicks instead of
vpmTimer.addTimer(avoids 20-event limit and silent failures). (remdwaas, Blood Machines) - Static walls: Walls set to "static" remain rendered even when script-hidden, causing grey artifacts. Don't set dynamically-hidden walls to static. (sixtoe, Indiana Jones)
- FPS locking: Lock to a stable target (e.g., 140 on 144Hz) for smoother gameplay and cooler GPU. (iaakki, Indiana Jones)
- Collidable audit: Small decorative prims (nuts, screws) accidentally set collidable cause weird ball behavior. Audit before release. (wylte, Monster Bash)
- Timer audit: VPX warns about timers below 16ms. Review and adjust where sub-frame resolution isn't needed. (robbykingpin, sixtoe, Space Station)
Testing¶
Testing Philosophy¶
Edge cases only emerge from extensive play. Ball trapping, physics exploits, and mode corruption never appear during development. Expect quick post-release patches. (sixtoe, Spider-Man)
Mode Testing¶
Focus on one mode at a time: entry, during, exit, light/state restoration. Only move on when fully signed off. Track issues in a spreadsheet grouped by mode. Use shot debugger (hit 2 for blocker walls) for isolated testing. (fluffhead35, Die Hard Trilogy)
Knowledge Requirements¶
Complex romless recreations need testers who deeply understand the real game's rules. Casual testers miss issues because they don't know correct behavior. Even experienced testers may need 100+ hours. (soundscape2k, daphishbowl, Iron Maiden)
Feedback Integration¶
Use numbered issue lists. Key areas: DMD gaps (most critical), hit sounds, volume balance, flipper feel, mechanism complaints.
Debug logging + video together
"The best way for me to understand the issues is to have a video and associated error log." Enable KeepLogs=True by default. Don't bring in testers until DMD mission info is functional -- without it, the table feels like "playing a whiteboard." (apophis79, oqqsan, Blood Machines)
Difficulty Balancing¶
Start hard, reduce from feedback. Key levers: target count, timer duration, ball saver, starting lit lights. First-time players need clear shot indicators, verbal callouts, and DMD mission info. (apophis79, oqqsan, Blood Machines)
Lamp Verification¶
Manual assignments can be wrong. Verify by watching attract mode light show videos, swapping left/right switches, and comparing against documentation. (apophis79, mcarter78, thalamus, Skateball)
F6 Camera Debug¶
Hold Alt + arrow keys for alternate movement. Enable "Flying" under Keys/Nudge/DOF for free camera. Movements don't affect in-game POV. Useful for checking rubber alignment and object placement. (gtxjoe, benji084, Police Force)
Blender Toolkit¶
Starting Projects¶
When old VPX playfields are inaccurate ("fat playfield"), start from blueprints. Build clean VPX from scratch with blueprint-accurate overlay rather than tracing existing geometry. (sixtoe, tomate80, Last Action Hero)
Pre-Bake Checklist¶
After post-bake issues (inseparable rails, wrong axis orientation), the team formalized: (tomate80, apophis79, Godzilla)
- Separate side rails and lockdown bars
- Correct movable axis orientation (180-degree Z rotation)
NoExpprefix on transparent objects- Bake from active camera
- Proper insert cup depth
- "Optimize mesh" checkbox enabled
Outliner Navigation¶
Key shortcuts: Home jumps to selection, filter text box searches, -/+ collapses/expands, H/Shift+H/Alt+H shows/hides objects, numpad . focuses viewport. An external keyboard is strongly recommended for laptop Blender work. (niwak, Iron Man)
Material Naming¶
Avoid country-specific special characters -- they corrupt across systems. Clean up unused imported VPX materials early. (tomate80, Judge Dredd)
Camera and Light AOI Bug¶
When a light's AOI radius exceeds the camera distance, the toolkit calculates "no influence" and generates no lightmap. Common with 10W flashers positioned close to camera. (flux5009, Last Action Hero)
UV Unwrapping¶
Prefer Smart UV Unwrap over Lightmap Pack (which creates mosaic artifacts). If Smart UV doesn't work, set seams manually then Unwrap. Only fall back to Lightmap Pack as last resort. (metated, apophis79, oqqsan, Warlok)
Edge Selection After VPX Import¶
Switch to Edge select mode, Alt + Click to select entire loop. (tomate80, Judge Dredd)
Baking and Lightmaps¶
Partial Baking¶
Not everything needs full baking. Blood Machines: bake ship, ramps, plastics, then add generic AO flasher for overall effect. Set materials dark first (GI-off state), then tune DL for GI-on. (iaakki, Blood Machines)
Low-Res Proxy Workflow¶
Use low-res proxies (2-3 min per image) for iteration. Set up 4K compositing files, swap in high-quality renders when ready. Like editing with proxy footage. (benji084, Time Fantasy)
File Size Optimization¶
Run "merge by distance" at 0.0001m on bm_parts -- removed 8748 duplicate vertices from SF2. Toolkit makes lightmaps at base mesh complexity, so file size grows exponentially with lit assets. Use "optimize mesh" checkbox. Decimate until meshes start breaking. (sixtoe, apophis79, gedankekojote97, tomate80, Street Fighter 2)
Flipper Ghost Images¶
Caused by flipper lightmaps set to "Static Rendering." Fix: uncheck Static Rendering for both bakemaps AND lightmaps. Toolkit auto-exports as non-static, but verify after manual changes. (mechaenron, apophis79, metated, Warlok)
VPX 10.8 Upgrade¶
Eliminate Lampz and use native VPX 10.8 PWM. Significant migration affecting all lighting. (apophis79, tomate80, niwak, Last Action Hero)
Insert Masks¶
Do NOT erase insert areas from playfield scans. Create a separate transparency mask layer instead. Keeps original texture intact for non-destructive adjustments. (bord1947, niwak, embee1979)
Playfield Scanning¶
Hardware¶
HP Scanjet 4600/4670 is best for playfields, translites, decals (not backglasses). Epson V300 for backglasses and plastics. Test other scanners before committing. (clarkkent9917)
Workflow¶
Scan at 600 DPI -- not for final VPX resolution (72-140 PPI) but for stitching accuracy. 300 DPI is too low for digital halftone alignment. High-res for processing, reduce after stitching. (clarkkent9917, ebislit)
For DSLR stitching: build a consistent rig, use graph paper for alignment, overlap generously. Borgdog built a custom scanning stick with marked positions for 3 strips of 5 scans. (sixtoe, apophis79, ebislit, borgdog)
Cleaning and Restoration¶
Modern workflow: receive 600 DPI TIFF scans, clean/color-correct in Illustrator or Photoshop, rebuild vector elements where possible, export at target resolution. Community collaboration model: resource owners provide playfields, local scanners scan, artists clean, creators integrate. (cainarg, nestorgian, embee1979)
Release and Distribution¶
Release Process¶
Refined across many tables: (sixtoe, skillman604, apophis79, Game of Thrones)
- Remove all debug code (walls between flippers, debug flags)
- Set default POV for desktop and cabinet
- Choose default LUT
- Include FlexDMD/media files or provide separate download
- Test Service Menu settings persist (
SaveValue/LoadValuetoVPReg.stg) - Test on cabinet
- Upload to VPUniverse with credits, screenshots, B2S, and media packs
- Test DOF configuration thoroughly
Release Checklist¶
SF2 v1.0 shipped without playfield reflections, prompting formalized checklists: (apophis79, gedankekojote97, studly_do_right, Street Fighter 2)
- [ ] Desktop, cabinet, and VR modes work
- [ ] F12 options menu functional
- [ ] All moveables working (drop targets, ramps, gates)
- [ ] Flashers, sideblade reflections, playfield reflections
- [ ] Sounds balanced, materials set (no pure black)
- [ ] VR room states correct, B2S included
- [ ] Debug code and unused assets removed
RC Protocol¶
Only minor updates in RC stage. "These are release candidates ffs. Only minor updates allowed." Freeze major changes well before releasing. (iaakki, Spider-Man)
Defaults and POV¶
Ship with cabinet mode OFF (breaks desktop for less experienced users). POV: Z-scale always 1, maintain 1:1 X:Y ratio when possible, use Z offset to zoom. In 10.8, POV is in table ini files -- sharing still works since adjustments are relative to display dimensions. (sixtoe, Taxi; tomate80, iaakki, Judge Dredd; primetime5k, niwak, Last Action Hero)
Release Artifacts¶
Include in one ZIP: .vpx, B2S backglass, FlexDMD assets, loading animation. Screenshots at 2K minimum (desktop + cabinet), optionally 4K. Credits for all contributors. (oqqsan, fluffhead35, apophis79, sixtoe, astronasty, Goonies)
Streamer Reveals¶
Give early access for testing. Don't schedule on disruption days. Midnight streams miss Europeans. Watch the stream for bugs -- four issues identified from watching Goonies' reveal. (astronasty, fluffhead35, oqqsan, Goonies)
Marketing and VPU¶
Teaser progression: vague shot > more obvious > clear reveal. VPU banner "Coming Soon from Team VPW" is OK when close. Use game artwork, not licensed film assets. (sixtoe, astronasty, Judge Dredd; its.me.dazz)
Group Account¶
VPW group account on vpinball.com/vpforums. Contributors listed in script and post. Always specify minimum VPX version (not betas). (benji084, brad1x, iaakki, Bad Cats)
Performance Optimization¶
Three main factors by decreasing influence: (niwak, apophis79, iaakki, Guns N Roses)
- Texture size -- determines fillrate, usually the limiting factor at 4K
- Parts x light scenarios -- draw calls and overdraw. Many GI strings multiply stacking VLM objects
- Triangle count -- at very high counts, eats GPU power and memory bandwidth
GNR achieves 130+ FPS at 4K on RTX 2060 Super by limiting light travel distance, fewer GI strings, and optimized lightmap sizes.
If stuttering: disable antivirus, use minimal VR room, reduce textures, disable reflections, check ball reflection count, reduce collidable prims. (apophis79, Die Hard Trilogy)
VR factors in order of impact: collidable prims > big textures > semi-transparent stacking > active light count. (sixtoe, benji084, Monster Bash)
DOF Safety¶
Rapid GI/flasher changes can burn out physical DOF contactors. Rules: (sixtoe, apophis79, Blood Machines)
- GI relay on/off should NOT map to contactors
- Only flipper/start/RGB buttons use
DOFOn(persistent) - Everything else:
DOFPulse - Verify no contactor outputs tied to GI relay events on tables with unusual lighting (wizard modes, rapid GI toggling)
Specialized Topics¶
- Insert/art coordination: Lower PF: draw art first, place inserts around it. Upper PF: place inserts first (in front of ramps), draw art around them. Move tracking info to DMD to avoid crowding. (astronasty, iaakki, Blood Machines)
- Easter eggs: Hidden, fun, no gameplay interference. (multiple, Ghostbusters)
- Toy visibility: Offer toggle when toys obstruct targets. (Eighties8, apophis79, sixtoe, Starship Troopers)
- Gottlieb System 3 NVRAM: All Gottlieb tables need preset NVRAM (
bally_6803_gts3_nvram.zip). Without it, ball count breaks. (gedankekojote97, primetime5k, Street Fighter 2) - Locale issues: Spanish locale shifts keycodes. Try
SetLocale 11274(Argentina) instead of 1033. (apophis79, tomate80, Street Fighter 2) - VBS formatting: Tabs not spaces, Dim/assign on separate lines, section headers with 4-letter search codes, TOC at script top. (apophis79, wylte, flux5009, VPW Example Table)
- PUP for non-ROM tables: PUP packs add "extra baggage." Keep as optional community mods. PuP capture reads FlexDMD output without script changes. (apophis79, dardog81, bhitney, Game of Thrones)
- Orbital to PupEvents: Convert rather than fixing Orbital code. Migrate to
triggers.pup,screens.pup,playlists.pupwith batch files per display config. (merlinrtp, robbykingpin, heartbeatmd, MF DOOM) - EM "Over The Top": Bally mid-70s -- score rolls over 99,990 = buzzer + flash. Later production added 100k relays. (leojreimroc, lumigado, apophis79, Hang Glider)
See Also¶
- Software Setup & Configuration -- VPX versions, VPinMAME, FlexDMD, PUP packs
- Physics Tuning Guide -- Detailed physics parameter reference
- 3D Art Pipeline -- Blender toolkit workflow
- Build Workflow -- End-to-end table build process
- VBScript Patterns -- Scripting conventions and patterns
- Hardware & Cabinet -- Cabinet-specific considerations
- Bad Cats WIP
- Blood Machines
- Game of Thrones
- Ghostbusters
- Guns N Roses
- Indiana Jones
- Iron Maiden
- Metallica
- Monster Bash
- Police Force
- Road Show
- Spider-Man