Skip to content

X-Men (Stern 2012)

The VLM toolkit's first real project -- initially scoped as a "quick dry run" but expanding into a full release. Extremely important for documenting VLM workflow from scratch, GI architecture with relay solenoids for color switching, the physical VUK pattern replacing cvpmBallstack, playfield_mesh rendering semantics, VPX x86 memory limits, and the Iceman moving ramp physics implementation.

Build Story

X-Men LE was built primarily by Niwak (3D/VLM) and sixtoe (physics/scripting), with apophis79 on script review, in approximately one week of evenings/weekends. The visual upgrade was completed with one-click export merging Blender and VPX work. VPX ramp physics were done in VPX first, then visual ramps modeled around them in Blender. Plastics were redrawn from reference photos using AI upscaling (which worked well for X-Men's cartoon-style artwork). The table went through versions v1.0 to v1.0.12.

Table-Specific Details

Mechanisms & Hardware

  • GI architecture -- 4 lightmaps with relay solenoids: One main GI power string (unmodulated) with three GI relays on solenoids 54/55/56 (manual incorrectly says 44/45/46), normally ON with inverted output. Bottom spotlights wire directly to main power. Playfield LEDs wire behind their color relay (white/red/blue). Produces 4 lightmaps: base, white, red, blue. GI was baked to white and tinted VPX-side, enabling the original table's 7-color GI mod. See GI color mod system.
  • Translucent character name inserts: Frosted/white plastic insert with clear plexi top layer. Letters screen-printed on playfield decal above the insert. Yellow "X" portions are semi-transparent. Two-layer setup with white (not clear) plastic underneath for correct appearance.
  • Iceman moving ramp: Solenoid-controlled, physically moves during gameplay. Visible ramp is a movable VLM primitive; separate collidable primitives handle physics. Cannot move a collidable primitive while a ball is on it -- IceManHold variable prevents movement while a ball is present. Physical ramp entrance "ears" must align with visual ramp at all positions.
  • Physical VUK pattern: Cut hole in playfield, extrude receiver cup (cone-shaped prevents jamming), place switch at bottom triggering ROM switch, KickBall sub ejects on ROM solenoid fire. Deactivate ROM switch from within solenoid callback, not on unhit (handles two-ball stacking). Replaces cvpmBallstack which destroys/recreates balls. See VUK patterns.
  • Night Crawler pop-up targets: Latch and up solenoid actions were swapped in the script, causing targets to drop too soon. Additionally inverted logic compounded the issue. Fixed in v1.0.4.
  • Staged flipper workaround: VPinMAME was not sending commands to solenoid 12 (upper right flipper). Initial workaround: manual key-based hack. By 2026, VPinMAME handles staged flippers natively -- old workaround should be removed.

Art & Visuals

  • VLM insert masks: Three separate BW masks required: Insert mask (transparent insert areas), Wood mask (real wood vs playfield image), Hole mask (physical holes). Insert text provided as separate overlay layer. Easiest workflow in Krita: transparency mask + magic tool selection.
  • GI baked to white for VPX-side tinting: Bake all GI lightmaps as white, apply color tint via primitive's modulate color in VPX. Enables easy color adjustment, LED vs incandescent options, and color-changing mods without rebaking. Same principle works for inserts. See GI color mod.
  • VLM auto-plastic from reference photos: When scans aren't available, import reference photo as texture on flat primitive, use Blender knife tool to cut shape, apply auto-plastic material. Produced "clearly better" results than hand-drawn plastics.
  • VLM multi-resolution baking: First batch failed due to missing automatic nestmap splitting feature (Niwak added it). ~3K render was blurry on cab displays; 6K targeting 8K needed for crisp text. Batch runs approximately 6 hours.

Physics & Gameplay

  • playfield_mesh is special for rendering: A primitive named playfield_mesh has special rendering behavior (reflections). It is NOT automatically the physics surface. The toolkit uses playfield_physx for physics. Naming convention only matters for rendering. In VPX 10.8+, playfield_mesh can be invisible and physics-only. See playfield mesh.
  • Flipper length: Base Radius + Length + End Radius must equal ~147 VP units for standard 3.125" flippers. X-Men initially had length 120 (total 152.25), making the table too easy. Correcting to length 114.7 (total 146.95) dramatically changed shot difficulty.
  • KickZ parameters: angle = degrees in x-y plane relative to kicker's red arrow, speed = kick strength, inclination = degrees above x-y plane (90 = vertical), heightz = Z shift (avoid using). Kicker objects can exhibit unexplainable behavior from file corruption -- delete and recreate from scratch rather than debugging.

Known Issues

  • VPX x86 memory limits: 32-bit VPX has a ~4GB limit causing E_OUTOFMEMORY crashes or silent image downsizing. X-Men was the first VLM table to consistently hit this. The image manager shows when images have been downsized. Solution: use VPX x64. See software setup.
  • VPX object corruption: Multiple objects exhibited unexplainable behavior (kicker refusing correct angles, wall allowing balls through). Copy-pasting between VPX files can introduce corruption. When objects behave inexplicably, delete and recreate from scratch.
  • Spotlight shadow depth bias conflicts: Spotlight and RTX ball shadows conflict via Z-position layering. Both editor depth bias and script Z-position must agree on priority.

Techniques Developed Here

See Also