MF DOOM¶
An original-theme VPW table that went from abandoned WIP (2022) to full v1.0 release in July 2024. The project demonstrates the VPW community's approach to reviving stalled original tables while preserving the creator's vision.
Build Notes¶
Abandoned Table Revival Workflow¶
The MF DOOM table followed a structured revival process after the original creator was MIA for 2+ years:
- Attempt to contact the original creator through all known channels
- Designate a new project lead who creates a task list of needed updates
- The lead doesn't need to be a coder -- others will help
- Preserve the original author's creative vision (don't alter the look/feel, just make it work properly)
- Prioritize: physics update, insert rework, PuP conversion, display config support
- Release under VPW with full credit to the original creator
Key contributors included iaakki, apophis79, merlinrtp, shaggysrsg, and wylte.
PuP Framework Migration¶
The table originally used the older Orbital PuP framework, which caused 1-5 minute load times due to slow PuPlayer.Init calls. The team converted to the modern PupEvents framework. Migration steps:
- Convert video triggers from embedded
PuPlayer.playlistplayexcalls totriggers.pupentries - Move audio from PuP playlists to VPX sound manager or external music folder
- Remove deprecated
PuPlayer.Init/SetScreenex/hidecalls - Create
screens.pupandplaylists.pupfiles - Add batch files for each display configuration (desktop, 2-screen, 3-screen, VR)
VPM Timer Conversion¶
The original script had approximately 1,000 vpmtimer calls, which were converted to queue/tick timers (the modern VPW standard). VPM timers can cause hard-to-diagnose bugs when timers cancel each other, and timing is unreliable under load. Use WinMerge or diff tools to verify no typos during conversion.
Scripting¶
Insert Color Management with RGB Base Colors¶
For tables with RGB color-changing inserts, light color commands that reset to "warm white" will override the insert's intended base color. The fix stores all light base colors at boot into a lookup array:
Dim BaseColours()
Redim BaseColours(200)
Sub StoreBaseColors
Dim k, x : x = 0
For Each k In aLights
BaseColours(x) = Array(k.name, k.color)
x = x + 1
Next
Redim Preserve BaseColours(x)
End Sub
A returnBaseColor function retrieves the original color when needed, preventing color-changing subs from resetting insert trays to warm white.
Insert Fading with _animate Sub¶
To make insert trays fade with their control lights without Lampz, use the _animate sub:
Sub L10KScore03_animate
pL10KScore03.blenddisablelighting = 1000 * (L10KScore03.GetInPlayIntensity / L10KScore03.Intensity)
pL10KScore03.color = L10KScore03.color
End Sub
Requirements: rename ON primitive to pName convention, set halo height to -5, set transmit to 0, and ensure the light's fade speed up/down values are non-zero (0ms fade = binary on/off).
Insert Color Desaturation¶
When applying light colors directly to insert tray primitives via .color, the colors can be too saturated. Fix: average the RGB values to add gray, reducing saturation. For example, pure red (255,0,0) becomes (255,127,127), making the insert tray light up more naturally.
Delayed Script Execution Without VPM Timers¶
A lightweight delayed execution system using an array of 10 slots. Each slot holds a countdown and a VBS statement string. A single master timer decrements all active slots, and when a slot reaches zero, it executes the stored script via Execute():
This avoids creating individual VPX timers for one-shot delayed actions.
LightSequencer Limitations¶
VPX built-in LightSequencers don't control BlendDisableLighting on primitives, so insert trays won't fade properly with sequencer-driven lights. Adding Lampz-style fading requires rewriting how every insert is controlled. The sequencer also doesn't work optimally with 3D inserts that have multiple prims per insert.
Troubleshooting¶
PuP Pack INI Prevents Display on Other Setups¶
If PuP displays don't appear, check for a pinupplayer.ini file in the PuP pack folder. This INI contains screen positions hardcoded for a specific cabinet and will prevent PuP from showing on any different configuration. Delete or rename the INI file -- the screens.pup file should handle display assignment.
PuP Not Closing on Table Exit¶
PuP windows remaining open after closing the table was traced to Controller.Stop being commented out. Ensure these lines are present in table1_exit:
Ball Rolling Sound Volume After Fleep Integration¶
After implementing Fleep sounds, ball rolling sounds can become much louder than expected. Reduce the sound multiplier/factor and add a velocity threshold (ballvel > 2) so very slow ball movement produces no rolling sound.
Duplicate cor.update Calls¶
Having cor.update called in two different timers wastes performance. The rubber dampener correction routine only needs to run once per 10ms cycle. Check that cor.update is called in exactly one timer.
Resources¶
DOTK (DirectOutput Toolkit) for DOF Development Without Hardware¶
DOTK v0.09 allows DOF development and testing without owning the physical hardware, with full MX LED visualizations built in. Use version 0.09 specifically (v0.10 has many bugs). Available at: DOTK GitHub releases.