Skip to content

MF DOOM (Original Table)

Original (non-ROM) table built by goill773, later adopted by shaggysrsg/merlinrtp/iaakki after 2+ years of inactivity (2021-2025). Notable as a case study in abandoned table adoption, the Orbital-to-PUP migration path, vpmtimer-to-queue conversion at scale (1000+ calls), and insert color management challenges unique to original tables without ROM-driven lamps.

Build Story

MF DOOM demonstrates VPW's approach to abandoned tables: attempt contact with the original author, assign a new project lead, preserve the original vision ("We should not alter the looks and the idea. Just make it work good and for everyone"), and focus on technical upgrades rather than design changes. The table was built on Scotty W's legacy Orbital framework, requiring migration to modern PUP framework, and had approximately 1000 vpmtimer calls that merlinrtp spent 8 hours converting to queue/tick timers.

Table-Specific Details

Mechanisms & Hardware

Orbital framework PUP: The table defined PUP screens entirely in VBS script rather than using .pup configuration files. This legacy approach has no support for modern multi-screen setups and no batch files for different display configurations. Migration path: strip Orbital PUP code, use modern PupDMD framework with .pup files for screen definitions and playlists.pup for audio routing.

PUP not closing on table exit: Controller.Stop was commented out in Table1_Exit. Without it, PinUP Player windows remain open after closing the table, sometimes requiring a full reboot.

Art & Visuals

Insert color management on original tables: Without ROM-driven lamps, insert illumination requires manual _animate subs per insert that sync blenddisablelighting and color with the control light. A BaseColours lookup array stores all light colors at boot so a returnBaseColor() function can restore original colors when game code resets lights to warm white after attract mode. RGB colors were too saturated for insert trays -- averaging RGB values improved appearance.

Lighting balance for original tables: iaakki's approach: (1) lower overall ambient brightness, (2) increase GI levels substantially so the playfield remains well-lit, (3) modify plastic wall materials to respond to GI color changes. This creates contrast so flashers pop against the darker baseline while GI maintains playfield visibility.

Physics & Gameplay

Light fading times of 0ms cause binary on/off: Insert lights appearing instant on/off despite having incandescent fader settings was traced to VPX light fade-up/fade-down times being set to 0ms. GetInPlayIntensity returned only 0 or max (10) -- no intermediate values. Fix: set non-zero fade times on VPX light objects.

Known Issues

vpmtimer at scale is unmaintainable: Tables with approximately 1000+ vpmtimer calls become impossible to debug. Typos in queue callback names cause cryptic VBSE_OLE_NO_PROP_OR_METHOD errors at runtime with no line reference.

Light sequencers extremely slow in VR: Light sequencer animations ran at normal speed in desktop VPX but dramatically slower in VPVR. apophis79's hypothesis: "VPVR handles accessing collections differently than VPX." The issue was never definitively resolved.

FlexDMD warnings from missing getgroup: addactor calls without preceding getgroup("Score") generate warnings in flexdmd.log that accumulate and cause performance issues under high game load.

Techniques Developed Here

See Also

  • Goonies -- another original table with FlexDMD integration challenges
  • Blood Machines -- original table design patterns