Skip to content

title: Iron Maiden: Legacy of the Beast tags: - iron-maiden - stern - spike-2 - pup-pack - newton-balls - staged-flippers - premium


Iron Maiden: Legacy of the Beast

Game knowledge-rich development with extensive PUP pack integration, advanced scripting, 3D art workflow, complex game rules implementation, physics tuning, and comprehensive troubleshooting across a long development cycle. Collaborative build with dedicated real table owner as beta tester.

Build Notes

Insert Overlay Technique

To make insert overlays appear translucent as on real pins, place a VPX light 1 unit above the overlay image, synced to the insert light. Black areas stay solid; white/color areas allow light to pass through.

Two approaches for insert implementation:

  1. Insert overlay on a ramp object positioned above playfield with cutouts excluding insert text
  2. Leave insert text on playfield image directly

Adding insert lamp blooms improves visual quality. Increasing alpha mask on playfield cutout image reduces jaggies. Use Photoshop layer masks for cutouts so they can be reapplied to rebaked PF images easily.

GI Lighting Layers

Separate GI into layers: GI Bulbs, GI Lights, GI Lights Top. Use GI_Off texture for base state, swap to GI_On texture for lit state. For bumper caps with baked GI, may need re-render or Photoshop to create off-state versions. Gamma bump on GI_Off can approximate ambient lighting. Red GI handled separately as dynamic.

GI fade-on/fade-off technique:

  • OFF prim uses depth bias 0, ON prim uses depth bias ~-100 (ON above OFF)
  • Normally OFF prims invisible, ON fully opaque
  • To fade off: make OFF prims visible, then fade ON prim material opacity to 0
  • Reverse for fading back on; ON and OFF prims must overlap

Flasher Layer Organization

Organized flasher system: "flashers_new" layer for all new flashers including flasher inserts; "flasher_Spots" layer for 3 flasher spotlights separately; original flasher layer kept for reference. Flasher inserts moved from lights/blooms layers to flasher layer.

Flashers vs lamps in real pinball: Flashers are high-voltage very bright lamps controlled by relays/solenoids, appearing on the main coil diagram. Regular lamps are just lamps on the lamp matrix. Pop bumper 1 on IM is a flasher; bumpers 2 and 3 are regular lamps that follow the white GI.

Flasher location discovery: Use test mode to fire specific flasher numbers. On Spike 2 systems, navigate the test menu to locate the flasher number. This revealed a previously unknown under-playfield flasher (170) at the sarcophagus.

Playfield Texture Creation

Playfield image created by merging multiple source photographs plus extensive content-aware fill in Photoshop. Text on inserts recreated using Russo One TTF font. Separate layers maintained for lights-on and lights-off versions. Non-destructive masks recommended for future cutout work.

Scanning real table components: Real machine owner scanned plastics at 1200x1200 DPI (27,000 pixels long for some pieces). Scans provide dramatically better quality than photographs for texture creation. Glass must be removed for scanning.

3D Modeling

Backwall modeling: Backwall pieces modeled as flat planes with separated parts so each can have its own VPX texture applied. Some pieces move (head, guardian). Modeled with screws included on the primitive texture.

Ramp modeling: Get ramp working with correct shot angles in VPX first using native ramps, then smooth and beautify in Blender. Modeled ramps can be used as collidable primitives. Use low-poly collidable primitive hidden behind a high-detail visible primitive for performance.

Newton ball baking: Newton balls can be replaced with baked primitives that include playfield reflections. Set blenddisablelighting = 2 on the ball primitive to brighten it. Once using baked primitives, remove the VPX captive balls entirely and animate the primitive positions in code.

Texture Optimization

VPX (32-bit app) starts eating/dropping textures when table file exceeds ~300MB. Optimization strategies:

  • Convert PNG to WebP format (reduced from 650MB to 225MB after removing unused images)
  • Reduce pixel dimensions where possible
  • Use 8-bit color when appropriate
  • Remove alpha channel from textures that don't need transparency

VPX 10.7 WebP Bug

VPX 10.7 has a bug where importing WebP textures can cause them to silently disappear on save/reload. Workaround: stick with PNG format if WebP causes disappearing textures.

VRAM usage at 4K: At 4K resolution, table consumed 3.4GB VRAM (1.4GB at 1080p). VPX may convert compressed textures to uncompressed/raw in memory regardless of on-disk format. Focus optimization on pixel dimensions rather than just compression format.

Scripting

PUP Pack Integration

All PUP pack videos must be 1920x1080 to avoid display issues. Always verify resolution when pulling clips from ROM dumps.

PupDMD update timer: The pupDMDupdate timer needs to refresh fast enough to show spinner count changes. Working value: 50 VPX timer units. Timer of 250 may be too slow for rapidly changing values.

PUP pack optimization via ffmpeg: Ran all 232 PUP videos through portable ffmpeg batch file (30fps, no audio, HD). Results: PUP pack reduced from 2.65GB to 1.1GB with no visible quality difference on 1080p 17" cab DMD. This significantly reduced micro-stutters.

PUP Cleanup Code

Proper PinUP cleanup code for table exit:

Sub PUPClose
    PUP_DMD_enabled = false
    pupDMDupdate.enabled = false
    pDMDUpdateCurrentPage.enabled = false
    PUP_enabled = false
    PUP_Status = false
    Set PuPlayer = Nothing
End Sub

The key line is Set PuPlayer = Nothing which releases the COM object. Without this, PinUP processes remain stuck.

PinUP Display Crash

When loading Iron Maiden for a second time in PinUP Popper, backglass and DMD video/text may disappear. PinUP processes (PinupDisplay and pinupPlayer) get stuck in task manager. Turning off "full screen exclusive" in VPX reduces the issue significantly.

SetLocale Fix

International locales using commas instead of decimals cause calculation errors in VPX scripts. Fix: add SetLocale 1033 at the top of the script (line ~101, after Option Explicit). This also fixes PUP animation stretching and text display issues.

Ball Count Configuration

For Iron Maiden LOTB: tnob = 9 (6 real balls + 2 captured Newton balls + 1 extra). Premium/LE versions use Newton balls (not traditional lock mechanisms). In VPX, real balls are used for the Newton ball simulation, so they must be included in tnob count.

Mode Stacking Rules

Single-ball modes can be stacked with Trooper or Mummy MB if started before the MB begins. When a multiball mode starts, the sarcophagus lock returns to level position. Implementation: save lock state before starting mode, disable lock, restore after mode ends.

Multiplayer Virtual Locks

For multiplayer: treat locks as virtual if a ball is already physically locked. Ball rolls over lock position and becomes second ball instead of adding a new ball. No lock/ball/point stealing between players. At end of ball, release all locked balls.

Insert Cycling for Stacked Modes

When two modes are stacked, inserts cycle through the stacked mode colors to show what's available. Interval of 500ms works better than 100ms (too fast). Critical for gameplay clarity when multiple modes overlap.

Colored Mode Inserts Option

Script option to colorize mode inserts (matching popular real-machine gel mod):

Const ColorizeModeInserts = True

Each mode gets a distinct color (e.g., blue for Aces). Makes it easier to identify which mode is flashing during gameplay.

Playfield Validated Flag

Real pinball tables use a "Playfield Validated" flag — nothing counts until a switch is hit. Ball save light doesn't start until first switch trigger. If you soft-plunge directly to drain, no ball save light activates, but the machine still gives a ball save.

Skill Shot Cancellation

Skill shot is cancelled by any switch hit after plunge. Same cancellation logic applies to regular skill shot. Super Secret Skill Shot has separate cancellation handling.

Quick Reset

Hold left flipper and then press and hold Start while ball is sitting in shooter lane.

Autoplunge Ball Returning

Modern Stern tables (Godzilla, BK Sword of Rage, AIQ, Iron Maiden) autoplunge if a ball ends up back in the shooter lane during gameplay. Confirmed in official Stern patch notes.

Physics

Flipper Configuration

Flipper end angle calibration: Flipper end angles were 5 degrees too high (78 vs correct 73). Compared VPX flipper position to real table photos. Fix: change end angle from 68 to 73 degrees. Also need to reshape flipper triggers to match. Uncheck "Physics Object" from layers and use View > Playfield Image to align visually.

Flipper elasticity curve:

RubbersD.addpoint 0, 0, 1.11   (was 0.96)
RubbersD.addpoint 1, 3.77, 0.99  (was 0.96)

Higher CoR at low speeds gives more action on gentle bounces.

Flipper bounce code: To make flippers move/bounce when hit by ball in down position, lower the return strength when in down position only. The SOSReturn value may need per-table adjustment.

Upper flipper configuration: Upper flippers need flipper tricks applied. Do NOT add trajectory correction to upper flippers. For Iron Maiden layout, upper left flipper strength should be 2400-2500.

Staged/Dual Leaf Flippers

Staged flippers allow upper flipper control via deeper button press. Implementation requires: mapping keycode = KeyUpperRight in VPMKeys.vbs, separate switch wiring in cabinet. Flipper buttons need dual-leaf switch contacts (two switch points per button).

Hardware installation: Double leaf switch mounts to side of cabinet. May need extra spacers at base for proper alignment with button. The curved center leaf faces away from cabinet wall. Remove the white bracket that comes with some switches as it positions the switch too low.

Spinner Dampening

VPX spinners are "too juicy" by default — ball barely touching gives 10+ spins. Fix: change spinner dampening from 0.9879 to 0.98. Approximately 10-15% fewer spins. Issue observed across multiple tables.

Target Bouncer Code

When the target bouncer code is in each drop target hit sub, sweeping all three targets calls the bouncer three times and the effect stacks, causing the ball to pop into the air unnaturally. Fix: comment out the bouncer call in those hit subs.

Gate Elasticity

For weird "ghost bounce" behavior near an outlane gate: set gate elasticity to 0.8 and move it slightly so the end overlaps with the physical post. Also ensure the VPX gate orientation matches the physical prim alignment.

Game Knowledge

REVIVE Mechanic

Shoot the left spinner to spell REVIVE. Each letter awards 750,000 (playfield multipliers apply). Spelling REVIVE lights outlanes for ball-save. First time spelling it lights both outlanes. Each outlane's Revive is used individually (two Revives effectively). Cannot stack Revives. Lit Revives carry over between balls.

As of ROM 1.08, if both REVIVE outlanes are lit (REVIVE MAXED), spinner scoring is boosted to 100,000 per spin (max 1,000,000 for 10 rotations). Each new game starts with REV already achieved and 10-spin countdown. After first REVIVE completion, next requires 15 spinner hits per letter.

Loop Scoring

Big Loop orbit shot scores higher when the upper left flipper is NOT engaged (left down). The game encourages making the shot without holding the upper left flipper up.

Fear of the Dark Scoring

FOTD scoring: 1st shot sets base value (left/right ramp = 250k, main loop = 350k, small loop = 500k). Right ramp before spinner gives 2x on spinner value. Main spinner = 1x value, revive spinner = 3x value. If main spinner hit and revive spinner ripped while main still spinning = 6x value. With playfield multiplier, a single spinner rip can score 120 mil.

Skill Shots

Secret skill shot #4: 1 loop followed by hitting the orb shot with upper right flipper. Adds 3 mil to power jackpot base + 10 sec ball save. Regular super skill shot requires holding left flipper, worth 15 mil.

Combo and Deathblow System

Combos go up to 6-way max. Tomb Treasure #4 gives Super Combos (5x on all combos/deathblows) for remainder of ball (NOT game). Deathblow targets include orb, bullseye, and others. Drop target sweep awards two drop target awards simultaneously.

Soul Shard Mechanics

Soul shards can yield 180% of mode value from a single shot: 20% of mode value x 3x for center bullseye x 3x playfield multiplier. Multiplicative — if 3x PFM was running during the mode, those values count toward the soul shard. Strategic timing: start PFM so it's still active when ending a mode and collecting the soul shard.

Loop Jackpot

Loop Jackpot enabled after 5 (+2) shots to any loops. If qualifying shot was big loop, up-post diverts to mini flipper. Each loop JP worth total value built up prior to lighting. Collected for 12 seconds with +1x multiplier per shot. After 4x, ball diverted to upper left flipper. 3rd+ loop JPs can only be multiplied by NOT raising upper left flipper. Small loop adds to loop JP timer + scores a loop JP. Value resets after each collection. Disabled on drain. Timer pauses for nothing.

EDDIE Letter Phases

Three phases of EDDIE letter difficulty:

  • Phase 1 (modes 1-2): all shots lit
  • Phase 2 (modes 3-4): all shots lit except center
  • Phase 3 (mode 5 and 2M2M): only 3 shots lit — 2 random non-repeating + mini loop always lit

After 2M2M, Eddie resets to Phase 3 (hardest) permanently. Big loop (upper right flipper) is never lit for an EDDIE letter.

Playfield Multiplier Rules

2x/3x playfield multiplier: cannot start or light during Cyborg multiball (must start before). Cannot light during 2M2M. Hitting X targets during 2x/3x adds 5 seconds to timer. Timer pauses same as mode timers (when ball locked/held). Does NOT pause in pop bumpers.

Mystery Award Levels

Can light Mystery during Cyborg multiball by completing drop targets, but cannot collect it. Getting 3 mysteries from drops during Cyborg means you have a level 3 mystery lit when Cyborg ends. Mystery level does NOT reset on drain - it carries over between balls. Mystery level IS reset once you collect the mystery award.

Aces High Mode

1 ace fighter "completes" the mode. Once an ace is collected, soul shard will be lit when you drain to one ball. Mode loops — after completion you restart at phase 1.

Rime of the Ancient Mariner

ROTAM: shots narrow toward center as you hit lit shots (lose leftmost/rightmost). Can never have more than 3 shots lit initially, then max 2 after first jackpot. "Blows off course" mechanic pushes shots back away from center after time without hitting a lit shot. 2 mariner jackpots (bullseye target) complete the mode and light soul shard. Mode continues until drain to one ball.

Pharaoh Award

Pharaoh Award lit by completing drop targets. Does NOT stack — only one can be lit at a time. Should slowly pulse (not flash). Scoring is 1x/2x/3x based on where you hit the bullseye (outer/middle/center). If you sweep drops, you get two drop target awards simultaneously.

Mummy Multiball (Premium)

Mummy requires 2 hits after starting it twice. Newton ball cooldown is real but very short (~0.5-1 second). Tomb Treasures queued and only accessible outside MB/modes. Mummy lock with hurry-up timer kicks out ball on drain.

Number of the Beast

Number of the Beast is NOT a multiball — it's a single-ball mode. Cannot stack with Trooper or Mummy multiballs. Red shots are random each time they light (3 shots). Yellow shots: hitting a lit shot unlights that shot and lights all others (no repeat shots in a row). After completing 2M2M, should be able to replay modes with EDDIE letters on hardest setting.

Extra Ball Qualification

Three ways to light extra ball (collected at "X" target):

  1. Complete 3 Power Features (most common/easiest)
  2. 5th Tomb Treasure (very hard)
  3. 30 loops excluding Loop Jackpot shots (very hard)

IM is stingy with extra balls compared to other modern Stern games, offset by double revive outlane saves.

Stern Recall - Ramp Ball Deflector

Stern issued a recall/fix: a metal piece with sticky bottom installed under the left ramp to prevent the ball from pitting the playfield when dropping off the ramp. Also prevented the ball from getting stuck. Few owners knew about it — had to request it from Stern directly.

Troubleshooting

Ball Sinking into Playfield

When a ball gets stuck on the playfield, check its Z position. If Z is less than 25.00 (e.g., 23.87), the ball is sinking into the playfield mesh. Fix by adding a physical VPX wall just below the surface at the problem location.

Ball Falling Through Playfield

When debug shows huge coordinate values for a ball, it means the ball fell through the playfield. Indicates a hole somewhere in the mesh that isn't blocking. Use debug print for active ball positions to diagnose.

Ball Stuck Under Ramps

Ball can bounce under ramps and travel back up the subway, getting hung up on corners. Fix: add a one-way gate to the subway to prevent ball from making its way back up. Also add guard primitives under ramps to prevent balls from bouncing underneath.

Flipper EOS Torque Parameter Corruption

Same VPX table file downloaded by two users can have different flipper EOS Torque values - one correct, one corrupted. This causes sluggish flipper return on the corrupted version. Fix: hard-code the EOS Torque value in the table script to override potentially corrupted table property values.

Windows Locale Decimal Separator

Some Windows systems use comma instead of dot for decimal separator (e.g., 1,5 vs 1.5). This affects VPX parameter input and can corrupt values (e.g., entering 0.2 results in 9.867855e-3). Also affects dmdext and pup-capture configurations.

Global VBS Script Conflicts

LUT errors when hitting magnasaves caused by namespace conflict between table script and old global VBS plugin file (e.g., globalplugin.vbs). Fix: delete or rename the conflicting file in the VPX scripts folder. Name procedures in VBScript plugin files with a unique prefix to avoid collisions.

Micro-Stutter Diagnosis

Frame drops linked to setFastPulse function using a loop for light index lookup. Fix: change to direct index lookup instead of iterating. The stutter correlated with PUP media playing (videos/sounds) during light update calls. Disabling virtual light updates confirmed the source.

FlexDMD Lag

FlexDMD was unable to keep up with the pupdmdupdate timer. Recommendation: keep FlexDMD implementation simple (static images only), avoid complex animations. For tables that heavily use video DMD content, PupDMD is strongly preferred over FlexDMD.

Captive Ball Dislodging via Debug Mode

Debug Mode (activated by pressing Magna Save 3 times) allows moving the active ball to flippers. This unintentionally affects captive/Newton balls, moving them to the flipper position. Fix: exclude captive balls from the debug ball-move function.

Flasher Debugging

Use the W key as a debug trigger to flash all flashers for testing. Code them so pressing W cycles through flashers. Alternative: use magnasave buttons. This helps when you can't fire flashers normally through PinMAME.

OpenGL vs DirectX Insert Rendering

The DirectX version renders inserts more clearly and correctly compared to OpenGL. In OpenGL, inserts appear less distinct.

Software Setup

VPX Version Compatibility

VPX 10.7 build 310 recommended - builds above 310 cause issues on VPW tables. New Light property GetInPlayStateBool introduced in 10.7 may not be supported in all VPVR builds. VPX 10.8.1 BGFX version plays significantly smoother and more stable than previous versions.

VPX Standalone Compatibility

The released version uses code that breaks on vpinball standalone. A compatibility patch is available at: github.com/jsm174/vpx-standalone-scripts pull request #299.

PupPack Setup

For 2-screen setups: prefer fullscreen PupDMD over using bezels/overlays. Multiple batch files provided for: Desktop, 2-screen, 3-screen configurations. Each batch file sets up PupDMD window positioning. FlexDMD option maintained for users without PupDMD capability.

When PUP display issues differ between users: compare PinUpPlayer.ini configs, check screen swap order, verify PUP version, re-run desktop/cab batch files. Always delete old PUP pack completely before installing updates rather than overwriting.

Scorbit Integration

Scorbit support added via PUP pack integration. Requires qrview.exe and sToken.exe in the PUP directory (not tables directory). For PUP-based tables, Scorbit files go in the PUP pack folder. Must set scorbit game mode in script when modes start/stop.

Win10 Ghost Spectre Superlite

Win10 Ghost Spectre Superlite build recommended for lean pinball cab installations. Very lean, no issues, DOF works fine.

OBS Recording at 4K

For smooth 4K recording in OBS alongside VPX gameplay, use NVENC (NVIDIA hardware encoder) in OBS recording settings. Works well with both RTX 3080 and GTX 1080 cards.

DOF Configuration

DOF implementation should wait until table is feature-complete. Proper cleanup code:

Sub DOFClose()
    DOFObject.Finish()
    Set DOFObject = nothing
End Sub

RGB lockbar button controlled by Pinscape (Oak Micros) works in BM66. For Teensy-based setups, Arduino control of the button works but DOF config tool mappings may not map correctly.

Tools & Resources

  • Pinball Browser: Extract videos, images, and audio from Stern game ROMs. License required.
  • Finding ROM audio files: Extract video clip, get duration using ffmpeg, sort audio in Pinball Browser by duration, navigate to target length.
  • MIDI music placeholders: maidenmidi.com for Iron Maiden songs. Convert with different settings and compare quality. Users replace with their own music files after download.
  • PupDMD text recreation: Apply pillow emboss, shading, outside/inside stroke, gradient overlay, 3D water texture overlay, and drop shadow in Photoshop. Russo One TTF font matches Stern's style.
  • 3D model sources: Purchase real toys and 3D scan them (buy, scan, resell), find existing models on DeviantArt, model from reference photos, use photogrammetry apps.

Best Practices

Real Table Owner as Beta Tester

Having real table owners test VPX recreations is invaluable. Real owner recorded glass-off gameplay for direct comparison, measured flipper behavior, fired test mode flashers, and validated scoring rules. Google Sheets used for issue tracking. YouTube videos with timestamps for bug reports. Pro vs Premium/LE differences must be tracked separately.

Testing Complex Tables

Complex romless recreations require testers who deeply understand the real game's rules. Casual testers will miss many issues because they don't know what correct behavior looks like. Effective testing requires: memorizing the ruleset, watching extensive gameplay videos, and playing methodically through each mode.

Version Control and Release Process

Bug tracking via Discord threads (pinned). Separate Dropbox for releases. FTP server for resource files (textures, videos, audio). Google Drive for working files and PSD sources. Each release includes detailed changelog. PupPack updates distributed separately with readme instructions.

Example changelog format: bullet-pointed list of fixes, new features, and physics changes per VPX release.

Scoring Validation Workflow

Create a scoring spreadsheet to validate all scoring values against the real table. Cross-reference with Stern patch notes and tiltforums, but verify independently as tiltforums has errors.

Contributors: daphishbowl, soundscape2k, apophis79, sixtoe, tomate80, terryred, rothbauerw, seirif, hauntfreaks, iaakki, retrog33k, pinstratsdan