Skip to content

Troubleshooting Cookbook

Problem-to-solution pairs organized by symptom category. Each entry documents the symptom, root cause, and fix as discovered across VPW table builds.

Symptom Index

Symptom Section
Black playfield after toolkit import Rendering: Black Playfield
No bakemaps after toolkit export Rendering: Missing Bakemaps
Ball/playfield reflections gone Rendering: Missing Reflections
Overlapping primitives flicker Rendering: Depth Bias / Z-Fighting
Severe FPS drops, especially multiball Rendering: Transparency Performance
Insert lightmaps missing on dark playfield Rendering: Lightmap Artifacts
Graphics blurry when GI activates Rendering: 32-Bit Texture Limits
White flashing in VR Rendering: Render Probe Roughness VR
Scene excessively dark Rendering: Double-Darkening
Objects near camera disappear Rendering: Near-Plane Culling
Objects not responding to GI lighting Rendering: Material "Active" Setting
Ball falls through playfield Physics: Ball Through Geometry
Ball hovers at mid-flipper height Physics: Ball Hover
Flipper physics silently broken Physics: Flipper Issues
Ball stutters/jitters on surfaces Physics: Duplicate Collidables
Ball stuck on ramp Physics: Ramp Ball Stuck
Ball trapped in bumpers 20+ seconds Physics: Pop Bumper Trapping
Ball curls over outlane post Physics: Outlane Ball Curling
Runtime errors from solenoid callbacks Scripting: Missing SolCallback Subs
Solenoid sounds/actions fire twice Scripting: SolCallback Fires Twice
Standalone VPX crash on flipper hit Scripting: gBOT Segfault
Escalating stutter and FPS drops Scripting: Timer Catch-Up Spiral
Unexpected variable values Scripting: Duplicate Declarations
Cryptic VBSE_OLE errors Scripting: vpmTimer Namespace Collisions
AudioPan runtime error Sound: Fleep AudioPan Error
Sound permanently corrupted Sound: Bass.dll Corruption
Audio distortion at max volume Sound: WPC ROM Volume
SSF positional audio broken Sound: Stereo vs Mono SSF
PWM migration issues ROM: UseVPMModSol Values
Stepper motors stop during gameplay ROM: HandleMech=0
ROM won't accept credits ROM: Missing PulseTimer
Switches not registering, erratic behavior ROM: NVRAM Corruption
Bumpers/slings permanently broken ROM: Table State Corruption
Toolkit batch render crashes Blender: Bake Failures
Export button grayed out Blender: Nestmap Memory Errors
Entire render appears red Blender: Blackbody Node Breaks
Renders differ between Blender versions Blender: Material Compatibility
Walls collidable only in VR VR: Walls Collidable in VR
Lights swim when moving head in VR VR: Light Swimming
Double playfield image in VR VR: Ghosting
Backglass layers wrong order in VR VR: Backglass Depth
Script editor window invisible Editor: Window Lost
Depth bias adjustment has no effect Editor: F6 Depth Bias Broken

Rendering

Black Playfield After Toolkit Import

Symptom: Playfield renders as solid black after importing a Blender toolkit batch.

Cause: The playfield_mesh primitive was placed in the ON_Prims collection. VPX 10.8 introduced a split between visible and physics playfield meshes, and having the playfield mesh in the wrong collection interferes with this system (learned from Defender).

Fix: Move playfield_mesh out of the ON_Prims collection.

Missing Bakemaps After Toolkit Export

Symptom: Toolkit batch produces lightmaps (GI, inserts, flashers) but no bakemaps -- the table appears to have no physical parts after import.

Cause: No light collection has "Solid" render mode selected. Without a Solid bake, the toolkit generates light influence textures but not the base environment-lit textures for static objects (learned from Haunted House).

Fix: Create a "Room" light collection with "Solid" selected. Add environment lighting at a well-lit level. This produces base bakemaps representing how objects look under normal room lighting.

Missing Ball and Playfield Reflections

Symptom: Ball reflections and playfield reflections disappear entirely.

Cause: Multiple playfield_mesh primitives (old and new) are present in the table. Having duplicate playfield meshes confuses the reflection system (learned from Defender -- also affected Iron Maiden, Judge Dredd, Lethal Weapon 3, Star Wars DE, Starship Troopers, TFTC, Jokerz).

Fix: Delete all primitives starting with "playfield_mesh" and rename the correct one back. Ensure only ONE exists.

Depth Bias / Z-Fighting on Primitives

Symptom: Overlapping primitives flicker or fight for visual priority, especially on inserts, drop targets, or stacked transparent elements.

Cause: Depth bias controls rendering order. VPX depth bias works counter-intuitively: the element you want on TOP needs the biggest negative number (e.g., -10000), and elements underneath need positive numbers (learned from Batman DE).

Fix: Standard depth bias values for the ON/OFF insert system: ON primitives = 0 (renders on top), OFF primitives = 30 (renders behind). For ball shadows, set Z height to 1.01 VP units above the playfield surface to prevent playfield z-fighting (learned from Earthshaker). Depth bias values that work on one table may not work on another. After VPX crashes or version upgrades, depth bias values can silently reset -- always verify.

For drop targets showing flickering artifacts, uncheck "Unshaded Additive Blend" on the primitives in the CabLit Layer (learned from Big Bang Bar).

Transparency Performance and Overlapping Refractions

Symptom: Severe FPS drops, especially during multiball or when multiple transparent objects are in view simultaneously.

Cause: Transparent elements (flashers, plastic ramps, bumper caps) are consistently the biggest performance impact in VPX. Overlapping refractions (e.g., bumper caps near each other) compound the issue -- each requires a separate render pass. The DX9 renderer lacks modern GPU optimizations (learned from Bad Cats, Radical).

Fix: Niwak's top 3 performance recommendations for toolkit tables: (1) limit non-opaque parts, (2) limit bake groups (fewer texture atlas pages), (3) limit active lights. Setting roughness to 0 on render probes is the single biggest performance win -- up to 40% FPS improvement (learned from Fish Tales). Multiple render probes compound the performance hit even at zero roughness.

Lightmap Artifacts and Pruned Insert Lightmaps

Symptom: Insert lightmaps are missing or pruned on tables with very dark playfield areas.

Cause: The toolkit prunes lightmap meshes when calculated influence falls below a threshold of 0.01. Dark (near-black) playfield areas produce near-zero influence values, causing the toolkit to discard the lightmap entirely (learned from Beat the Clock).

Fix: Never use pure black (#000000) on playfields -- use at minimum RGB 17,17,17 (#111111). Pure black causes divide-by-zero problems in multiple renderers and VPX specifically shows broken lighting (learned from Johnny Mnemonic). Add a gamma node to the playfield material to lift black levels, or add noise/Gaussian blur to dark areas (learned from Judge Dredd).

32-Bit Texture Memory Limits (Blurry Graphics When GI Activates)

Symptom: Graphics appear sharp initially but become blurry when GI activates. Lightmap nestmaps appear soft or downsampled.

Cause: Running toolkit tables on 32-bit VPX hits texture memory limits. VPX automatically downsamples lightmap nestmaps to fit available memory (learned from Fish Tales).

Fix: Use 64-bit VPX. The 32-bit version is effectively deprecated per Niwak. For users stuck on 32-bit, manually downsize EXR lightmaps to 4K in Blender and re-save with DWAA compression -- this produces cleaner results than VPX's runtime downsampling.

Render Probe Roughness Causes White Flashing in VR

Symptom: White flashing artifacts on the playfield in VR, fine on desktop. May also appear as "ghosting" (double-image effect when moving head).

Cause: Non-zero roughness on playfield reflection probes triggers a rendering bug in VR mode. The blur function has known bugs including white flashing and ghosting (GitHub issue #939) (first identified on Bad Cats, confirmed on Breakshot).

Fix: Set playfield reflection probe roughness to 0. Create two render probes -- one with roughness for desktop, one with zero roughness for VR. Switch when VR mode is detected. Example implementation exists in Fish Tales.

Double-Darkening from Room Brightness

Symptom: Scene appears excessively dark, especially on toolkit tables.

Cause: Both primitive.color and SetRoomBrightness are applied simultaneously. The old approach used primitive.color to darken bakemaps, but SetRoomBrightness also adjusts material color -- applying both compounds the darkening (learned from CFTBL).

Fix: Use only one method, preferably SetRoomBrightness which is the current standard.

Camera Near-Plane Culling -- Invisible Objects Near Camera

Symptom: Objects near the camera (lockdown bar, apron, shooter housing) disappear or flicker in certain camera angles.

Cause: VPX's near-plane culling clips geometry that approaches the camera at near-parallel orientation. The rendering pipeline discards triangles that are too close to the virtual camera plane (learned from VPW Example Table).

Fix: Place an invisible ramp between the camera and the disappearing object. This forces VPX to extend the near-plane far enough to include the object. A crude but effective workaround for a long-standing VPX rendering limitation.

VPX Material "Active" Setting -- Objects Not Responding to Lighting

Symptom: Objects appear dark or unlit in areas where they should be illuminated by GI. Effect is subtle -- only noticeable when GI transitions occur (e.g., an outlane stays dark when it should brighten).

Cause: The material assigned to the object has "Active" unchecked. Non-active materials don't respond to VPX dynamic lighting changes (DL, transmit). Objects using them won't visually react when GI lights turn on or off (learned from Hook).

Fix: Set the material to active. Test performance before and after -- activating materials can affect FPS, though in practice the impact is typically negligible.

Physics

Ball Through Geometry / Ball Falls Through Playfield

Symptom: Balls pass through walls, ramps, or fall through the playfield entirely ("go to Narnia").

Causes and Fixes:

  • Collidable primitive normals: Collisions only occur when the ball hits a face with an outward-pointing normal. The ball passes straight through backfaces. For objects hittable from both sides, the mesh needs thickness with normals facing out on all surfaces (learned from Jokerz).
  • Playfield mesh holes at rollover switches: Cutting holes in the playfield mesh for rollover switches allows balls to fall through because VPX rollover switches are pure software sensors with no physical attributes. Fix: use transparent areas in the playfield texture instead of cutting actual geometry (learned from Batman DE).
  • Fast ball through sharp edges: Newton cubes and collision meshes need chamfered/beveled edges. VPX's physics engine can allow fast-moving balls to pass through 90-degree edges between physics frames (learned from Metallica).

For "Narnia balls" that have fallen through the playfield, implement detection and recovery code that loops through the BOT array checking z-position. Balls with z far below 0 should be returned to a scoop/VUK (learned from Batman DE).

Ball Hover on Playfield Mesh Near Flippers

Symptom: Ball hovers partway up a flipper, appearing to float at mid-flipper height until the player flips.

Cause: Playfield mesh polygon edges intersect the flipper swing arc. The ball gets caught between the flipper physics and the mesh surface -- a VPX bug (learned from Congo).

Fix: Ensure no playfield mesh polygon edges pass through the flipper swing zone. Remove or simplify mesh geometry in the flipper area. Loop cuts in the flipper area are particularly problematic (learned from Batman DE).

Flipper Issues

Duplicate flipper Collide subs: VPX does not always throw an error for duplicate sub names. Having two LeftFlipper_Collide subs (one for sound, one for nFozzy physics) silently overrides the first -- physics functions like CheckDampen and CheckLiveCatch never execute. Fix: merge both into one sub (learned from Austin Powers).

Flipper jam from micro-alignment: Ball jamming on a flipper after nFozzy integration is usually a positioning error of 1-2 pixels. Moving the flipper by a single pixel can resolve it (learned from Ghostbusters).

Sluggish flippers: Check ball mass (must be 1, not 1.3 even for widebody tables), verify elasticity (~0.88), and ensure no collidable objects are in front of the slings blocking ball interaction (learned from Game of Thrones, Judge Dredd).

Flipper EOS torque corruption: VPX can silently corrupt flipper EOS torque parameters between systems, especially when locale settings use comma instead of dot as decimal separator. Fix: hard-code flipper parameters in the script rather than relying on editor properties (learned from Iron Maiden).

Duplicate Collidable Primitives Causing Choppy Ball Movement

Symptom: Ball stutters, vibrates, or jitters as it rolls along a surface.

Cause: Two collidable primitives overlap at the same location (e.g., a visual ramp and a physics ramp both set to collidable). The ball physics engine fights between the two collision surfaces (learned from Fish Tales).

Fix: Ensure only ONE primitive is collidable in any given location. The visual primitive should have "Is Toy" checked or collidable unchecked. Use a separate invisible primitive for physics if needed.

Ramp Ball Stuck

Symptom: Ball gets stuck at a specific point on a ramp.

Causes and Fixes:

  • Friction set too high: Right ramp friction at 0.8 is described as "velcro ramp." Each ramp section may have independently set friction values. Unify using a single material at approximately 0.2 (learned from Austin Powers).
  • Collidable geometry gaps: Check for missing or misaligned collision meshes at ramp joints. Enable physics visualization in VPX to see actual collidable surfaces vs visual mesh (learned from Diner).
  • Ramp geometry bumps: A barely perceptible speed bump in a collidable ramp profile causes inconsistent behavior. The fix may be "absolutely fractional" but makes the ramp feel consistent (learned from Jokerz).

Scripted velocity nudge pattern for persistent stuck spots:

If gBOT(b).z > 94 and gBOT(b).z < 100 and gBOT(b).x < 70 and gBOT(b).vely < 0.1 Then
    gBOT(b).vely = gBOT(b).vely - 0.1
End If
Check position bounds + height range + low velocity, then add a small directional nudge (learned from Godzilla, Guns N' Roses).

Pop Bumper Trapping

Symptom: Balls get trapped in bumpers for extended periods (20+ seconds).

Cause: Pop bumper radius is commonly oversized across VPW tables. The radius in VPX is the size of the actual metal ring/bumper activation zone, NOT the visual hat/cap. Table authors commonly size the radius to match the visual hat rather than the physical ring (learned from Big Bang Bar, RBION).

Fix: Reduce radius to match the rubber skirt/ring size. BBB reduced from 43 to 38. This is a broadly applicable correction.

Outlane Ball Curling Over Post

Symptom: Ball traveling up an inlane curls over the divider post and drains into the outlane with high frequency.

Cause: The physics geometry at the top of the inlane/outlane divider post allows the ball to ride up and over at certain angles and speeds. On real tables, the physical geometry prevents this trajectory (learned from Iron Maiden, Iron Man).

Fix: Adjust the post/wall collision geometry to redirect the ball upward rather than allowing the curl-over path.

Scripting

ROM Callback Errors -- Missing SolCallback Subs

Symptom: Runtime errors fire asynchronously during gameplay. Error messages reference solenoid or callback functions.

Cause: Every SolCallback definition must have a corresponding Sub routine, or VPX errors when the ROM tries to call it. The callback always passes a Boolean Enabled argument. Missing handlers cause errors that can be confusing because they fire unpredictably (learned from Bram Stoker's Dracula).

Fix: Add empty stubs for all missing solenoid callbacks: Sub KickerCoffin(enabled) / End Sub.

SolCallback Fires Twice (True AND False)

Symptom: Solenoid-triggered sounds or actions fire twice per activation.

Cause: SolCallback passes both True (activate) and False (deactivate) to the sub. Without a guard, both events trigger the action (learned from Medieval Madness).

Fix: Add If Enabled Then at the top of all SolCallback subs.

gBOT Segfault in Standalone VPX

Symptom: Standalone VPX crashes (segfault) when ball hits flipper.

Cause: CorTracker uses allBalls = gBOT instead of allBalls = GetBalls. The gBOT variable is a VPX-specific optimization that doesn't exist in standalone. This is the cause of 95% of "ball hits flipper crashes" in standalone (learned from Defender).

Fix: Replace gBOT with GetBalls in Cor.Update.

Timer Catch-Up Spiral

Symptom: Heavy stutter and escalating performance degradation. FPS drops compound rather than recovering.

Cause: Fixed-rate timers at small intervals (1ms, 5ms) create a catching-up spiral. If one simulation step takes longer than its interval, VPX tries to catch up, spending more time per step than the step represents (learned from Bram Stoker's Dracula, Hook).

Fix: Don't use fixed-rate timers, or only use intervals >30ms with lightweight computation. Use -1 timers (per-frame) for visual animations -- these run once per frame with variable time delta. Moving cor.update from its own 1ms timer to the frame timer recovered 20-30 FPS on Hook. Timer interval of -1 means "update every frame" (~16ms at 60Hz).

Note: VPX timers with interval -1 execute one additional time AFTER being disabled. Account for this in stopping logic (learned from Fish Tales).

Duplicate Variable Declarations

Symptom: Unexpected variable values or silently overridden behavior.

Cause: VBScript allows duplicate variable declarations and sub names without always throwing errors. The last definition wins, but previous definitions may have been the one containing important logic (learned from Austin Powers).

Fix: VPX 10.8.1 reports duplicate variable declarations as validation warnings when locking a table. Clean these up before release.

vpmTimer.Add Broken / Namespace Collisions

Symptom: Cryptic VBSE_OLE_NO_PROP_OR_METHOD errors with no line reference.

Cause: Tables with ~1000+ vpmtimer calls become impossible to debug. Additionally, VPX loads globalplugin.vbs into the same namespace as the table script -- if both define subs with the same name, the globalplugin version silently overrides the table version (learned from Iron Maiden, MF DOOM).

Fix: Convert vpmtimer calls to queue/tick timers. Prefix procedures in globalplugin.vbs with a unique identifier. Use table-specific prefixes for custom functions.

Sound

Fleep AudioPan Error -- "Object doesn't support this property or method"

Symptom: Runtime error in Fleep's AudioPan function referencing tableobj.X.

Cause: Walls don't have X/Y properties but kickers and targets do. If a wall is passed to AudioPan, it crashes. The error message is not descriptive (learned from Breakshot, Fish Tales).

Fix: Add debug.print tableobj.name before the failing line to identify the offending object. Always pass a physical VPX object with positional properties (primitive, kicker, target), not a wall.

Bass.dll Sound Corruption

Symptom: Volume fluctuations, flipper volume muting randomly, sounds permanently broken.

Cause: VPX 10.8 had a bass.dll bug that corrupts sound files permanently. Once a file is corrupted, it cannot be fixed (learned from Ghostbusters).

Fix: Rebuild from a pre-corruption version. The bug was fixed in later 10.8 builds. If a table was saved in an affected version, corruption may be baked in.

WPC ROM Volume Distortion at Maximum

Symptom: Audio distortion and crackling at ROM maximum volume.

Cause: WPC emulated sound system clips at full volume (level 31). This is an emulation characteristic (learned from Congo).

Fix: Reduce ROM volume to 30 instead of 31. Use the VolumeDial script option to reduce mechanical/table sounds relative to ROM audio rather than cranking ROM volume.

Stereo vs Mono SSF -- Playfield Sounds Must Be Mono

Symptom: SSF (Surround Sound Feedback) positional audio not working correctly, degraded output.

Cause: Playfield physical sounds are multi-channel (stereo) instead of mono. VPX 10.8.1 reports this as a validation warning (learned from Ghostbusters).

Fix: Convert all table mechanical sounds to mono WAV files. Stereo sounds cause errors and degrade SSF output.

ROM / PinMAME

PWM Migration Issues -- UseVPMModSol Values

UseVPMModSol controls how solenoid data reaches the table script: - UseVPMModSol = 0 -- legacy binary solenoids - UseVPMModSol = 1 -- backward-compatible modulated output - UseVPMModSol = 2 -- full physics output with float 0..1 range (requires adapted callback code)

For Whitestar hardware (Stern early 2000s), UseVPMModSol = 1 only worked by coincidence with early builds. The correct setting is UseVPMModSol = 2 (learned from RBION).

Setting UseVPMModSol = 2 can cause DOF cabinet solenoids to stay stuck on at startup. Changing to UseVPMModSol = 1 eliminates the erroneous activation (learned from F-14). Workaround for cabinet users: add MAX100 duration limit in DOF config.

HandleMech=0 Fix for Stepper Motors

Symptom: Drawbridge solenoids or stepper motor mechanisms stop triggering during gameplay (but work in self-test mode).

Cause: PinMAME mech handling interferes with the table's own mechanism scripting (GitHub issue #226) (learned from Medieval Madness).

Fix: Set HandleMech=0 in the table script.

Missing PulseTimer Prevents ROM from Accepting Credits

Symptom: Game enters attract mode but won't accept coins. Drop targets don't initialize. Solenoid commands don't reach emulated hardware.

Cause: Missing PulseTimer in the VPX table script, required for proper Bally 6803 ROM communication (learned from Flash Gordon).

Fix: Add the PulseTimer with correct interval to the table script. Test coin-up behavior as part of initial setup verification.

NVRAM Corruption Causing Erratic Behavior

Symptom: Switches not registering, mechanisms firing incorrectly, scores not tracking. Table appears broken despite correct script.

Fix: Delete the NVRAM file from VPinMAME's nvram directory (named after the ROM, e.g., cc_12.nv). This forces factory-default reinitialization. Also delete the .cfg file if NVRAM deletion alone doesn't resolve it. Always try NVRAM deletion before assuming the table script is broken (learned from Cactus Canyon, Monster Bash).

VPX Saves Table State on Exit -- Permanent Corruption Risk

Symptom: Pop bumpers and slings stop working permanently across all future sessions.

Cause: If the table tilts and then crashes or is force-closed, VPX saves bumper and slingshot threshold values at 100 (disabled) in the saved state (learned from Jokerz).

Fix: Re-download the table, or set all pop bumper and slingshot thresholds at table init to prevent persisted corruption.

Blender / Toolkit

Bake Failures from Optimize Mesh

Symptom: Toolkit batch render crashes partway through with geometry errors, or thin meshes (spinner wires, gate wires) are invisible after export.

Cause: The toolkit's mesh optimization pass removes geometry it considers insignificant, incorrectly targeting thin wire-like objects (learned from Beat the Clock, Earthshaker).

Fix: Turn off "Optimize Mesh" for the problematic mesh in toolkit settings.

Nestmap Memory Errors / Grayed Export Button

Symptom: Toolkit Export button is grayed out and cannot be clicked.

Cause: Any object with a nestmap value of -1 (no geometry) blocks the entire export process. Typically a flat plane with inverted normals that the toolkit sees as zero geometry (learned from Scared Stiff).

Fix: Delete the problematic object, triangulate it, or untick "optimize mesh" in the toolkit.

Blender Version Compatibility -- Blackbody Node Breaks

Symptom: Entire render appears red when opening an older Blender file in a newer version.

Cause: Blackbody color temperature node parameters change between Blender versions. Opening a 2+ year old file in a newer version can break these nodes on lights (learned from CFTBL).

Fix: Manually re-set the blackbody nodes. Always check light node graphs when upgrading Blender versions.

Material Version Compatibility

Symptom: Blender 4.0 renders differ from 3.6 renders with identical settings.

Cause: Blacks render differently between versions, bump maps may not apply identically, and toolkit export features may not work correctly across major Blender versions (learned from Bad Cats).

Fix: Stay on the Blender version the project was started on unless specifically upgrading. Blender 4.1 restored "soft falloff" for lights lost in 4.0 (learned from Lethal Weapon 3).

VR

Walls Collidable in VR but Not Desktop

Symptom: Certain walls or objects affect ball physics only in VR mode, causing unexpected ball behavior.

Cause: VR room primitives loaded with VRRoom variable affect the physics engine even when not visually displayed. VR blocker walls or cabinet interior walls can create invisible collision surfaces.

Fix: Ensure VRRoom = 0 for desktop releases. VR room collection primitives add overhead even when not visually needed (20-40 FPS loss measured on Batman DE).

VR Light Swimming on Transparent Objects

Symptom: Lights shift position when moving head in VR, creating a "swimming" effect.

Cause: Objects that are both transparent/semi-opaque AND set to static rendering cause this artifact. Static rendering calculates lighting once at startup rather than per-frame (learned from Monster Bash, No Fear).

Fix: Set affected objects to "active" (untick static). For playfields, use playfield cutouts instead of transparency when possible, and set playfield opacity to 1.0.

VR Ghosting (Double Image)

Symptom: Two playfields appear, not aligned, with the second taking time to settle after head movement.

Cause: Playfield reflection probe roughness at non-zero values. Most noticeable during ROM initialization and end-of-ball sequences (learned from Godzilla).

Fix: Set playfield reflection probe roughness to 0 for VR mode.

VR Backglass Depth Ordering

Symptom: Lit and unlit backglass layers render in wrong order in VR.

Cause: VR renders depth bias differently than desktop. Values that work on desktop may not work in VR (learned from Blood Machines).

Fix: BGBright (lit layer) needs depth bias = -500; BGDark (unlit layer) needs depth bias = 100. Always test depth bias in VR headset, not desktop VR preview.

Editor

VPX Editor Window Lost to Invalid Monitor

Symptom: VPX script editor window is invisible. Restarting VPX does not fix it.

Cause: Window position is stored in the Windows registry and references a monitor that no longer exists. The built-in "Reset Window Positions" option doesn't reliably work (learned from Bram Stoker's Dracula).

Fix: Close VPX, open Registry Editor, navigate to VPX registry keys for window positions, delete the position entries. Alternative: right-click the editor window in the taskbar preview, select "Move", then press arrow keys.

F6 Depth Bias Broken -- Use F5 Instead

Symptom: Realtime depth bias adjustment has no effect when running in F6 (editor play) mode.

Cause: Known broken behavior since VPX 10.7.0, fixed in 10.7.3 (learned from Bram Stoker's Dracula).

Fix: Run the table in F5 mode, press D to open the debugger, type plastic001.depthbias = -200 and press Enter to see immediate visual changes. This is far faster than the stop-adjust-restart cycle.

VPX 10.8.1 Validation Warnings

VPX 10.8.1 reports useful validation warnings when locking a table (learned from Ghostbusters):

  • Duplicate variable declarations (last definition wins but should be cleaned up)
  • Timers with periods below 60FPS framerate (e.g., 10-14ms) cause stutters and break frame pacing (though some are required for scripted physics)
  • Playfield physical sounds must be mono, not multi-channel
  • Legacy textbox DMD rendering should use flashers instead
  • Legacy spherical ball mapping looks bad in VR/stereo/headtracking