Skip to content

Spider-Man (Stern 2007)

Complete pre-toolkit SAM build with years of incremental updates. Notable for SAM GI implementation, RGB color mixing from lamp states, and wire ramp polygon reduction. Built by sixtoe, apophis79, and iaakki.

Table-Specific Details

Mechanisms & Hardware

  • SAM (Stern) GI is a single on/off relay, not dimmable zones. djrobx confirmed this is how real hardware works. Do not implement per-zone dimming as on WPC tables.
  • GI changes color during gameplay (red for Venom, green for Green Goblin). Implementation reads lamp states from PinMAME indicating active mode, then sets GI color. Critical: add a 2-second timer delay between color changes to prevent flickering during rapid lamp state transitions.

Art & Visuals

  • Flupper insert tray system: insert opacity in the 0.995-0.999 range makes a dramatic visual difference in tray visibility -- tiny adjustments matter enormously.
  • Insert light falloff power must NOT be 1 -- use 3-4 for proper ball illumination. Use non-mono RGB values: 255,1,1 instead of 255,0,0 for red.
  • Global flasher technique: a full-table-sized VPX flasher with no image (just color and additive blend) creates table-wide color wash for dramatic mode transitions.
  • Wire ramps reduced from ~70K to ~17K triangles with no visible quality difference via Blender decimation with preserved UV coordinates.
  • VR flashers must not extend beyond cabinet edges -- they appear as floating bright discs in mid-air. Keep within cabinet bounds.

Physics & Gameplay

  • Ball spin causes unnatural inlane speedup due to friction force from angular momentum. Fix: in inlane switch _Hit, add Activeball.angmomz = 0 and optionally reduce velocity: Activeball.vely = 0.8 * Activeball.vely. Only trigger on fast balls.
  • Sling post airballs from target bouncer: remove offending posts from dPosts collection and create dedicated _Hit subs with dampening but no target bouncer. Cleaner approach: NoTB (No Target Bouncer) collection.
  • Staged flippers: split combined flipper solenoid subs into separate SolRFlipper and SolURFlipper callbacks. Do NOT put StagedFlippers checks inside Sol callbacks -- those belong only in KeyDown/KeyUp.
  • Ramp profile humps at segment junctions launch balls into the air. Rebuild physical ramp walls with gentle radius curves at height transitions.

Known Issues

  • vol(activeball) returns 0 in solenoid callbacks because there may be no active ball in the solenoid context. Use fixed volume value instead.
  • FadeDisableLighting must be called BEFORE NFadeL or fade timing breaks.
  • Multiple primitives in a single solenoid callback: just add extra TransZ lines in the timer sub.

Techniques Developed Here

See Also