Goonies (VPW Original)¶
A complete original (non-ROM) VPW table built by oqqsan and fluffhead35, with the deepest FlexDMD integration of any VPW project. Notable for multi-player state management patterns, custom coordinate-based light sequencer, FlexDMD performance debugging, and VR geometry validation. One of the longest-lived VPW builds at 17,700+ messages.
Build Story¶
Development ran from June 2021 through January 2024 with extensive iteration on FlexDMD integration, mode logic, and performance optimization. Being an original table (no ROM), every game rule, scoring system, and display had to be built from scratch, producing many reusable patterns for future original tables.
Table-Specific Details¶
Mechanisms & Hardware¶
- Wire ramp primitive had ~90K polygons, severely impacting performance. Replaced with an invisible VPX ramp (for physics) plus a simplified visual primitive (non-collidable), gaining 20+ FPS.
- Wire ramp ended at height 147 at the slingshot -- actually going uphill toward the front. Completely unnoticeable in 2D desktop play but "hilariously wrong" in VR. This established VR as an excellent geometry validation tool.
Rules & Modes¶
- Multi-player state save/restore: All per-player variables (score, mode progress, locked balls, bonus multipliers, ramp counts) explicitly saved at drain and restored at next turn. Key pitfall found:
ramphitsthisballcounter not reset between games in Door-or-Die mode. - Tilt mode reset bug: When a player tilts, normal drain logic is skipped, leaving active modes unterminated. Force-reset all modes during tilt handling. Flipper disable flags must also reset, or a slam tilt could trigger on the next ball from the previous ball's unreset flag.
- Custom coordinate-based light sequencer: Parameters encode center coordinates, radius, speed, color, and pattern type. The system calculates which lights fall within the region and applies animation.
FlexDMD Integration¶
- The FlexDMD update timer must never be disabled after the intro sequence. Disabling it breaks the DMD on subsequent games without a full table restart.
- FlexDMD stutter from log level:
FlexDMD.log.confighavingminlevelset to"Trace"instead of"Warn"causes random stutters from disk I/O during gameplay. - FlexDMD
RenderLock/RenderUnlockcalls cause frame drops. Fix: remove unnecessary calls, split the DMD update routine into 4 smaller parts on a 5ms timer (20ms cycle). - VPX 10.8 broke the PupDMD "desktop punch" feature. Workarounds: windowed mode (DX) or the "1-pixel trick" (GL mode at native resolution minus 1 pixel).
Art & Visuals¶
- Insert brightness compensation when GI is off: insert intensity multiplied to maintain visual prominence against the dark playfield during dramatic bone organ modes.
- Drop target primitive orientation: Target mesh must face drain at RotZ=0. Using ObjRotZ causes all hit angle calculations to be incorrect in Roth's physics code.
- Converting VPX targets to primitives without Blender: export OBJ from blank table, clean in threejs.org/editor, reimport as primitive.
Sound¶
- MP3 preloading: First-time MP3 playback causes frame drops. Fix: play all MP3s at near-zero volume during initialization to pre-cache audio data.
- Volume dial constants for SSF: Separate constants for mechanical (0.7), music (0.4), and callout (0.5) volumes, tuned so the table sounds good on SSF cabinets without additional software.
Techniques Developed Here¶
- Multi-player state management pattern for original tables
- FlexDMD timer-never-disable rule
- FlexDMD log level performance fix (Trace to Warn)
- Custom coordinate-based light sequencer
- MP3 preloading hack for frame drop prevention
- VPX target-to-primitive conversion without Blender
- VR as geometry validation tool -- ramp height errors invisible in 2D exposed immediately in VR
See Also¶
- Game Rules & Mechanics -- mode state machines, tilt handling, light sequencer
- Software Setup -- FlexDMD, PupDMD
- VBScript Patterns -- MP3 preloading, target conversion
- VR Development -- geometry validation