Skip to content

GoldenEye

GoldenEye (Sega 1996) is a VPW table built from a photo-stitched playfield by ebislit, featuring nFozzy physics, Lampz insert systems, a scripted satellite dish mechanism, and PWM solenoid support.

Build Notes

Playfield Source

The playfield was NOT scanned -- it was photo-stitched from multiple photos by ebislit, then warped to fit existing table geometry. The original had some egg-shaped inserts because correct dimensions were not prioritized in the older workflow. The image was assembled collage-style in Photoshop from dozens of perspective-corrected photos.

nFozzy Physics

Key settings:

  • Playfield slope: 6.0-6.5 degrees (adjustable via difficulty setting in tweak menu)
  • Playfield friction: 0.15 (later increased slightly in v42 to address fast ramp speed)
  • Ball size: 50 with mass 1 (standard; original table used 51.8)

The tweak menu was added in v1.0.3 for user-adjustable settings.

Flupper Flasher Domes

Flupper flasher domes v2.2 were added from FlupperDomes2.2.vpx, which include fade timers for realistic flasher behavior.

Desktop Backglass

The desktop backglass uses GOLDENEYE letter lights connected to actual ROM switches, illuminating based on game progress. The B2S server must be present or inserts may not work (dependency bug found during development).

Ball Save Trajectory

The ball save magnet was launching the ball into the bottom of the left ramp instead of the left orbit. Fix: adjusted the bottom magnet position and kick angle slightly to the left. Reference video at the 12:00 mark was used for comparison.

VR Room

VR mega room updated by dardog81 with guard movement and birds flying. VR rooms hooked to day/night setting. VR view mode must be set to "Desktop" (not "Cabinet") or parts will be missing/colored wrong.

Scripting

Lampz Insert System

The Lampz insert system uses bloom lights with naming convention LL001 / LLb001. Insert brightness can be tuned live via the VPX debugger:

Lampz.state(14)=1 : LL14.intensity=5 : DisableLighting p14, 200,1

Insert DL tuning formula: y=2x+1 equation. Last number sets DL when GI is off. First number + last number = DL when GI is on.

Debug commands for GI control:

GI OFF: setlamp 0,0
GI ON:  setlamp 0,1

Insert Overlay Swapping for GI States

The table uses ON/OFF insert meshes that swap based on GI state. When GI is off, a darker overlay is shown; when GI is on, the brighter baked overlay appears. The DT/FSS image must be set to "none" to prevent rendering artifacts.

Satellite Dish Mechanism

Rebuilt by apophis79 to use a real ball in a kicker replacing the original primitive:

  • A kicker acts as the "magnet" holding the ball
  • Code places a ball on the kicker if the magnet is ON and a ball gets close
  • Must bypass placement code if a ball is already being held
  • Ball-ball collision detection (from LOTR's Destroy the Ring mode) knocks the ball off for Super Jackpot
  • BallInRadarLock flag must be checked before allowing another ball to be captured

Slingshot Correction

Apophis added slingshot correction code (revA) to make rebound angles match real machine behavior. Tuned based on comparison with real machine video footage. This is a reusable system applicable to other tables.

PWM Solenoid Conversion

PWM updates applied to inserts, GI, flashers, and VR backglass in v1.0.4. Converting older tables to PWM requires handling each subsystem separately.

Sound Volume Control

PlaySound "fx_relay",1,VolumeDial/3

VPX 10.7 required for OGG file support (10.6 only supports WAV).

3D & Art

Wire Ramp and Plastic Ramp Retexturing

Tomate80 rebuilt ramp textures in Blender. Wire ramps required selecting all edges to create seams for proper UV unwrapping (each wire individually). Wire ramp color is gold (matching reference photos). Unused textures were deleted, cutting ~30MB from file size.

Ramp Difference Textures for GI Fade

ON and OFF baked textures are used for ramps, with primitives in an OFFPrims layer. Plastic ramps required separate ON/OFF texture bakes. Wire ramps can be controlled via script DL without needing separate bakes.

Troubleshooting

GI Surface Bug

HLightMesh01 surface at -18 z height caused lights at default height to not render. Fix: lights needed height 18+ to show above the mesh.

Playfield Material Shininess

Reduced from 1 to 0.1 to fix insert outline visibility. High shininess caused bright outlines around 3D insert cutouts.

Ramp Construction Issues

The left ramp had multiple overlapping physical ramps at different heights causing ball rocking, sticking, and acceleration issues. Fix (v1.1.2): cleaned up overlapping ramps, leaving just one "flat" ramp. Gate friction reduced from 0.3.

VPX 10.8 Flipper Stuck Bug

Flippers locked in upright position on game start with VPX 10.8.0 betas after build 1904. Root cause: table was missing vpmInit Me in Table_Init. Also affected Apollo 13 (same SEGA VBS scripts).

Texture Memory Crash (10.7)

Goldeneye was the only table that crashed randomly on VPX 10.7. Fixed in beta build 196 where niwak improved texture memory usage.

Satellite Multiball VPinMAME Bug

After PWM conversion (UseVPMModSol = 2), solenoid 33 (satellite magnet) stopped getting callback. Filed as GitHub issue #443 on vpinball/pinmame. Fixed in a later PinMAME build (confirmed Feb 2026).

Game Knowledge

Altsound vs PinSound

PinSound was reported to work better than AltSound for Goldeneye specifically. The "boater mix" AltSound pack (100% movie music, 95% replaced voice files) is available on VPUniverse.

Resources

  • DOF entries 101/102 needed for flipper solenoid feedback (E commands from script, not ROM)
  • Z offset plays an important role in POV for "long" tables
  • Timer optimization (disabling unused timers) doubled the FPS
  • VPW bot-based checkout system used for version management