Skip to content

Guns N' Roses

Flagship VPW recreation of Data East's 1994 Guns N' Roses. Dense 3D modeling, VPX engine development, physics tuning, altsound/GSound, and performance optimization.

Build Notes

Playfield Dimensions

The correct playfield size is 23" x 46" (measured: 583 x 1166mm), matching WMS Superpin dimensions. Commonly cited size of 25" x 51.75" from internet sources is incorrect.

Cross-referenced via scan ratios, photo analysis, part library fitting, and physical measurement. Bumper holes being circular in scans validated the correct aspect ratio.

Blender Playfield Recreation Workflow

  1. Start from clean scanned playfield at correct dimensions
  2. Use part library for standard components (lane guides, posts, screws)
  3. Position parts using playfield scan holes
  4. Use manual blueprints for validation
  5. Create wood mask, insert text mask, and transmission mask
  6. Model non-standard parts from reference photos
  7. Three lighting scenarios: GI in lit room (primary), GI+Inserts in dark room, flashers only in dark room
  8. Export via VPX Lightmapper toolkit for baking

Three-Level Lighting Philosophy

  1. Low: All lights off, only environment map and area light highlights. RGB values 0-64, except metal reflections
  2. Medium: Inserts and GI on. Keep RGB below ~175 to leave headroom for flashers. Shadows should still exist
  3. High: Flashers firing. Maximize glare, overblown colors, reflections without losing all detail

This only works if medium level isn't too bright.

Table Build Versioning

Table progressed from v0.001 (3.5MB, no graphics) through 36+ pre-release versions to RC1 and v1.0. Workflow: Sixtoe builds physical table -> Niwak creates Blender model -> toolkit batch -> import to VPX -> iterate.

Scripting

SolMask PWM Configuration

When using PinMAME PWM integration for flasher fading, the SolMask configuration must be placed AFTER Controller.Run in Table1.Init. Wrap in On Error Resume Next for backward compatibility.

Example: .SolMask(1025) = VPM_MODOUT_BULB_89_32V_DC_S11

PWM Flasher Integration

VPX 10.8 + PinMAME PWM allows physically-based flasher rendering. PinMAME returns 8-bit (0-255) light emission power. From this, filament temperature is computed to tint flasher color (red phase when emission is 1-7 out of 255).

Supported systems: GTS3, WPC, S11, Whitestar, SAM.

Fast Flips Fix for Staged Flippers

The upper left flipper solenoid callback (sol 47) breaks fast flips when routed through PinMAME. Fix: bypass solenoid 47 and call upper flipper directly from left flipper solenoid callback.

To handle flipper enable/disable between balls, use solenoid 23 (flipper enable relay) as state variable.

Ball Stuck on Ramp Fix

When balls get stuck in ramp dimples, add check using InRect and z-height bounds. If ball velocity below threshold within stuck zone: gBOT(b).velx = gBOT(b).velx + 0.1.

Updated bounds for second dimple: z between 128-133, x between 900-980, y between 268-328.

SetLocale for International Compatibility

Add SetLocale 1033 to table scripts for international compatibility. Without it, number parsing (decimal separators, etc.) can fail on non-English Windows locales.

3D & Art

Ambient Occlusion and Dirt

AO in Blender computes proximity to nearby objects (white=nothing nearby, black=contact). Useful for adding realistic dirt accumulation near posts, rails, corners. Applied as procedural dirt to playfield. Also applied to plastics, metals, flipper bats via nodegroup.

Keep playfield brightness values between 0.05 and 0.90 to avoid fake-looking extremes.

Stippled/Pyramid Insert Modeling

Normal maps do not work well with refraction for stippled/pyramid rectangle inserts. Solution: model actual geometry (many little pyramids) rather than relying on normal maps. Produces much better visual results especially when backlit.

Colored/Tinted Transparent Ramps

VPX 10.8 added support for colored/tinted transparent ramps (blurry transparency). Ramp materials are very POV-dependent - appearance changes significantly with viewing angle.

Real GNR ramps are dark/opaque (original) vs clear/transparent (aftermarket mod).

Subsurface Scattering for Flipper Bats

Flipper bats benefit from subsurface scattering in Blender materials rather than just AO. SSS produces more realistic translucency for rubber material, especially visible when backlit.

Ball Ambient Lighting from Blender Bakes

Ball ambient color/brightness computed from Blender bake maps (room + GI maps) based on ball position. Low-res baked lightmaps of different light sources evaluate overall ball brightness per position. Ball should vary - dark in shooter lane, bright near slingshots.

Hardware

Data East GNR Electrical Architecture

  • Single GI string controlled by relay RY1 on power supply board
  • Separate mux relay K1 on driver board switches solenoid output between 8 flashers OR 8 coils (mutually exclusive)
  • Flashers driven by TIP transistors (silent)
  • Right orbit skull light wired to GI (always on when GI is on)
  • Slingshot and bottom lane lights directly wired to power (always on, not CPU controlled)
  • Both relays (RY1 GI relay, K1 mux relay) are mechanical and produce audible clicking

Software Setup

GSound Installation

  1. Copy folder to VPinMAME/altsound/<ROM_name>
  2. Set sound mode to 1 in F1 menu
  3. Requires latest VPinMAME with GSound support
  4. Group volumes adjustable in .ini file per sound type
  5. Debug logging: set logging_level to "Debug" and record_sound_cmds to 1

Volume dipping bug caused by pinsound format parser nerfing gain by 80%; CSV parser doesn't have this issue.

VPX 10.8 PoV Configuration

VPX 10.8 changed rotation handling. Table rotation should be set to 0 for newer VPX builds (both portrait and landscape). Users on Beta 5 or earlier may see table sideways.

Frame Pacing vs Fast Flips

Frame pacing synchronizes physics/controller with ~1ms latency, matching real pinball controller processing time. May make fast flips unnecessary. Without frame pacing, latency tied to FPS (60fps = 16ms, sometimes 2 frames = 32ms).

Best frame rate is display refresh rate; use hardware sync (driver sync) rather than user sync settings.

Troubleshooting

Refraction Probes Performance

Refraction probes (SSR type) significantly impact performance. On 4060Ti at 4K: SSR probes = ~82fps, disabled/Plane Reflection probes = ~120fps.

To disable without deleting: change probe type from SSR to "Plane Reflection Probe". Tweak menu option added to let users reduce refraction probe load.

Debug.Print Performance Impact

A single uncommented Debug.Print statement in frequently-called sub caused noticeable performance degradation (stuttering). Debug.Print writes to both console and log file each frame. Always comment out debug prints before release.

Performance Optimization

Three main factors by decreasing influence:

  1. Texture size: Determines fillrate, usually limiting factor at 4K
  2. Number of parts x light scenarios: Determines draw calls and overdraw amount
  3. Triangle count: At very high counts, eats GPU power and memory bandwidth

GNR achieves 130+ FPS at 4K on RTX 2060 Super. Key: limit light travel distance (smaller VLM objects), fewer GI strings, optimized lightmap sizes. Table file only 195MB.

gBOT Performance

Main performance bottleneck in ball rolling subs is getBalls call. Once eliminated (replaced with gBOT global array), ball rolling sub's performance impact becomes minimal. Track balls via trough/lock counting.

Game Knowledge

GNR (Data East, 1994) is widebody table (23" x 46"). Has two plungers: rose plunger (left, manual pull) and gun autoplunger (right). Features snake pit funnel where ball rolls around activating multiplier switch on sidewall. Has 3 magnets in playfield center (active during multiball only).

Black painted wire ramps are original; clear/transparent ramps are aftermarket mods. "Welcome to the Jungle" sign above playfield is aftermarket mod.

Resources

  • Manual PDF: progettosnaps.net
  • Schematics: ipdb.org
  • Restoration photos: pinball-restorations.com, pinballshark.com
  • PAPA tournament gameplay video for authentic behavior reference