Skip to content

World Cup Soccer '94

3D art, troubleshooting, game knowledge, and scripting for World Cup Soccer '94 (Bally 1994) development.

Build Notes

Custom Shooter Lane in VPX Options Menu

Custom shooter can be added to F12 options menu to give players choice between default VPX plunger and custom animated plunger. WCS94 is manual plunge only (no autoplunger coil in manual). Ball will sit in shooter lane indefinitely until manually plunged.

Contributor: dgrimmreaper

VR Setup Workflow for VPW Tables

Initial VR setup involves:

  • Creating VR room with cab art (contributed by DaRdog as HD quality, later downsized for performance)
  • Adding VR backglass
  • Setting up button animations (left magna, extra ball)
  • Testing

VR room images should be downsized from ultra quality for final release. VR is separate pass after desktop gameplay is solid - initial VR setup makes it playable but not fully polished.

Contributors: dgrimmreaper, dardog81

Playfield Reference Image Workflow

During development, full playfield reference image and blueprint can be kept in VPX file for alignment work. Playfield image useful for positioning elements but adds significant file size. Blueprint can be removed once no longer needed.

Remove both before final release to reduce file size. Retain playfield image for ongoing mesh work while blueprint removed earlier.

Contributors: sixtoe, apophis79

Fleep Sound Package Selection

Fleep sound packages should match era of machine. WCS94 (Bally 1994) needs era-appropriate mechanical sounds. Fleep package provides realistic flipper, bumper, slingshot, and mechanism sounds for SSF (Surround Sound Feedback) setups.

Sound tuning includes motor sounds for unique mechanisms (soccer ball spinning motor, goalie mechanism) which aren't covered by standard Fleep packages and need custom recordings or synthesis.

Contributors: clarkkent9917, sixtoe

Game Knowledge

VPX Unit Scale Definition

VPX defines: 1 VP unit = 0.02125 inches = 0.53975 mm

Standard pinball specifications:

  • Ball diameter: 1.0625 inches = 26.9875 mm = 50 VP units (radius 25)
  • Conversion: 47 VP units = 1 inch

Tables built treating VP units as millimeters end up ~1.852x too small (0.54 x 1.852 = 1.00008). Original WCS94 by Knorr was built at this wrong scale, making it appear tiny in VR and incompatible with nFozzy physics.

Contributors: wylte, apophis79, clarkkent9917

Rescaling Tables Is Impractical - Rebuild Instead

Rescaling Legacy Tables

When a table is built at wrong scale, rescaling is generally not viable.

Why rescaling fails:

  • Physics engine behavior depends on scale (ball mass, flipper strength, gravity simulation)
  • VR scale breaks
  • nFozzy/Rothbauerw physics conversions require standard VP unit scale

VPW team concluded full rebuild from scratch (using original Cinema 4D assets and real machine reference photos) was correct approach rather than attempting to mathematically rescale existing table.

Contributors: iaakki, cyberpez, rothbauerw

WCS94 Soccer Ball Motor Solenoids

Soccer ball uses three solenoids:

  • Sol 22: Spinning ball flasher
  • Sol 23: Clockwise rotation
  • Sol 24: Counter-clockwise rotation

Motor is bidirectional (swapping wires reverses direction). Operation is symmetrical. Both sol 23 and 24 should not be ON simultaneously (invalid state). Direction changes happen during multiball mode. Ball has inertia on startup but stops quickly when solenoid deactivates.

Inspect VPinMAME solenoid states to confirm truth table.

Contributors: apophis79, sixtoe, dgrimmreaper

WCS94 Ball Lock Mechanism

Ball lock VUK's default position is UP (held by spring). Coil pulls it DOWN to release. There is no separate hold coil - spring provides hold force. This differs from some other games that use low-power hold mode.

When scripting lock mechanism, account for this spring-return behavior rather than implementing coil-based hold logic.

Contributors: astronasty, mcarter78

WCS94 Flipper Reference Angles

Flipper angles need verification against real machine. Real machine photos of flippers at rest and full stroke positions essential. Triggers should be aligned to match flipper end angles. When flipper end angle appears too low, triggers set for higher angle will misfire.

Always request reference photos from machine owners for flipper positioning verification.

Contributors: apophis79, sixtoe

WCS94 Magna Save Operation

WCS94 has left magna save button and extra ball buy-in button. Buy-in button isn't commonly mapped in cabinet configs, so adding fire button as alternative mapping avoids conflicts (no fire button function exists in this game).

Both magna save and extra ball buttons need explicit keydown/keyup sub entries. Magna save magnet should not allow flipper to hit ball while magnetized - on real machine ball must drop to flipper first.

Contributors: astronasty, mcarter78, dgrimmreaper

WCS94 Slope and Physical Setup Notes

Slope of 6.2 degrees feels correct based on playing three different tournament versions of real machine. Default VPX slope was too steep.

Other setup notes from real machine comparison:

  • Visual magnet in ball lock needs to align with actual grab position
  • Lock post must pop up correctly
  • Flipper should not reach ball when held by magna save magnet

Contributor: astronasty

GI Light String Mapping for WCS94

WCS94 has 5 GI strings total:

  • 3 for cabinet: Typically backglass, cabinet left, cabinet right
  • 2 for playfield

VLM GI lights map to these strings. When splitting GI into separate collections for VLM baking, each collection maps to specific GI string number. Whether to split or group GI collections depends on how real machine's GI strings are wired - some areas may share string while others are independent.

Contributor: sixtoe

Scripting

Goalie Mech Implementation

Goalie mechanism uses array of wall objects (GoalieWalls) that enable/disable to simulate goalie movement.

Key implementation details:

  • GoalieWalls array must include ALL wall segments (GT040 was initially missing)
  • GoalieMechSteps must match array size (36 steps)
  • For smooth non-linear movement, use custom position array with manually defined values (accelerating/decelerating pattern) rather than linear steps
  • Goalie visual model should have "use obj pos" checked in VLM and default position centered in goal

flupper1 used this technique for bicycle girl ramp in TWD.

Contributors: mcarter78, dgrimmreaper, flupper1

Goalie Mech Custom Position Array Pattern

For mechs that need non-linear movement (acceleration/deceleration), define custom position array:

pos(0) = 0
pos(1) = 0.1
pos(2) = 0.2
pos(3) = 0.4
pos(4) = 0.8
pos(5) = 1.6
pos(6) = 2.4
pos(7) = 3.2

Use index counter that increments each step. Mech's coordinate is then pos(index). This creates natural-looking acceleration. Used in TWD bicycle girl ramp.

Contributor: flupper1

Desktop/VR Rail Visibility Toggle

To show cabinet rails in desktop mode but hide in VR:

If Table1.ShowDT = true and RenderingMode <> 2 Then
    VRCab_Rails.Visible = 1
Else
    VRCab_Rails.Visible = 0
End if

Place at top of script. Remove VRCab_Rails primitive from VRCab collection so VR handling doesn't override this logic.

Contributor: robbykingpin

VPX Trigger Hit Height Behavior

VPX triggers activate based on column extending above trigger surface. Baseline activation height is 21 VP units above trigger position. Hit height parameter extends this further (e.g., setting hit height to 30 creates activation at 51 units above playfield).

Triggers essentially act as solid activation columns, not flat plane detectors. This behavior matters for ramp triggers and elevated playfield features where balls may pass over triggers at different heights.

Contributors: apophis79, mcarter78

Narnia Ball Check - Lost Ball Recovery

"Narnia ball check" is scripting pattern for recovering balls that fall through playfield or get stuck in unreachable locations. When game detects ball has been missing too long (not on any switch or in any known location), it triggers recovery logic to return ball to trough or shooter lane.

Named humorously for balls that vanish "into Narnia." Essential for complex tables with VUKs, magnets, and multi-level playfields where balls can escape normal physics.

Contributor: mcarter78

WCS94 Spinner Direction and Animation

Left spinner was initially animated spinning wrong direction. Spinner animation needs to match direction ball hits it from - ball entering from left should spin spinner clockwise (when viewed from player's perspective).

Spinner was overlooked until late in development ("poor guy" was textureless until shortly before). Hook up spinner animation in script and verify rotation direction matches ball approach vector.

Contributors: apophis79, mcarter78

3D & Art

Rollover Button Physical Modeling

Playfield rollover buttons (lane change buttons) can be modeled as beveled collidable primitives placed in holes cut into playfield mesh. Buttons have low hit threshold so fast balls pass over with minimal resistance, while slow balls feel more pushback.

Implementation:

  • Make button non-collidable on hit event
  • Re-enable collidable when switch is unhit
  • Can also add velocity check ("if ball > velocity X then ignore")
  • Playfield mesh needs physical holes where buttons sit

Contributor: sixtoe

Soccer Ball Rotation Visual Technique

For spinning soccer ball mechanism: use matte rotating primitive for ball itself, covered by stationary transparent glass sphere for reflections and lighting.

Transparent dome needs proper UV unwrapping or its back-facing surfaces render incorrectly. If dome bakemap causes visual artifacts, separate transparent dome into its own VLM layer and hide its bakemap during table initialization - lightmaps still provide correct reflections without bakemap visible.

Contributors: tomate80, apophis79

Soccer Ball Blur Effect for Spinning Animation

To simulate motion blur on spinning soccer ball: create separate blur textures (mild and full blur), then swap textures in VPX script based on rotation speed.

Recommendations:

  • Two-stage blur (partial blur at medium speed, full blur at high speed) looks more natural than single swap
  • Blur meshes need their own UV mapping and dedicated small textures (not sharing large nestmap) to save memory
  • Ball blur approach cannot affect lightmaps, so some baked lighting artifacts remain visible during spin

Real spinning ball appears as white top half, gray bottom half with solid black line to naked eye.

Contributors: apophis79, tomate80, astronasty

WCS94 Soccer Ball Physical Details

Real WCS94 soccer ball is flat white ball with black patterns printed on (not embossed). It has rubber-like matte finish, not shiny. There should be visible gap underneath ball (it sits above playfield).

Invisible shadow plane placed beneath ball simulates shadow since ball mesh is set to "hide from others" which prevents shadow casting. Ball makes distinctive sound when spinning - described as loud enough to hear with glass on.

Contributors: astronasty, tomate80

Bumper Cap Refraction and Tinting

For realistic translucent bumper caps: add refraction probe to cap bake maps, then apply VPX material with color tint.

Process:

  1. Clone VLM.Bake.Active material
  2. Rename it
  3. Adjust tint color to match cap color (e.g., green for WCS94)
  4. Bumper caps should be separated onto their own layer so tint only affects caps, not other plastics

Insert materials don't use tint, so dedicated material is needed. Adjusting clear coat color in VPX material can fix dark edge artifacts.

Contributors: apophis79, cyberpez

Diverter Baking in Multiple Positions

Large ramp diverters should be baked in both positions (like flippers) to ensure correct lighting in both states. Diverter needs separate bake maps for open and closed positions. Without dual-position baking, one state will have incorrect lighting/shadows.

Contributor: apophis79

Playfield Mesh Saucer Hole Sizing

Saucer holes in playfield mesh that are too large cause "whirlpool" action where balls orbit inside. This needs subtle adjustment in Blender - mesh hole diameter should closely match physical saucer size.

Testing on cabinet is recommended for verifying correct feel since desktop play may not reveal issue as clearly.

Contributors: mcarter78, tomate80

VPX Kicker Sidewall Visibility Fix

Kicker sidewalls showing through playfield mesh can be fixed by setting BM_Playfield primitive to "hide part behind." Kickers were modeled as insert-style holes to allow GI light underneath, which makes their internal walls visible from above.

"Hide part behind" option in VPX prevents rendering of geometry behind playfield surface.

Contributors: sixtoe, tomate80

Troubleshooting

VLM Baking - GPU Denoising Causes Black Renders

GPU Memory Issues During Baking

When GPU memory runs out during VLM baking in Blender, render completes but fails to denoise, resulting in black/missing textures.

Fix: Uncheck "Use GPU to denoise" in Blender render settings.

This was root cause of missing lightmaps on slingshot plastics and other elements across multiple tables (WCS94, Scared Stiff, Elvira).

Contributor: tomate80

Blender Version Compatibility for VLM

Recommended: Blender 4.1 for VLM baking work.

Versions newer than 4.1 have caused rendering issues (missing results, black textures). Blender 4.0 is also considered stable. If encountering VLM render issues, try downgrading Blender version before investigating other causes.

mcarter78 stayed on 4.1 with no issues. apophis79 had missing sideblades on CFTBL with 4.1.

Contributors: mcarter78, tomate80, apophis79

VPX Image Memory - Compressed vs Uncompressed

VPX Memory Usage

VPX cannot use compressed images at runtime - it must uncompress them into RAM first.

300KB compressed texture can expand to 246MB in memory. "Image Size (in table)" column in VPX's image manager shows actual memory usage, not compressed file size.

Critical for optimization: Single high-res ball texture mapped to large UV space wastes enormous memory.

Solution: Remap meshes to use tightly-packed UV layouts with smaller dedicated textures rather than sharing large nestmap images.

Contributors: apophis79, tomate80

VLM Slingshot Plastic Lighting Fix

When VLM baking fails to illuminate slingshot plastics (even after fixing GPU denoising), manual GI light workaround can be used:

Place VPX light above plastic with full translucency and color-corrected to match GI color. Cut and position light to only affect specific plastic.

Quick and dirty but effective for cases where VLM baking stubbornly refuses to light certain elements.

Contributors: sixtoe, tomate80

Primitive Ramp Normals - Ball Passing Through

Ramp Collision Issues

Balls can pass through primitive ramps if mesh normals only face one direction.

Fix: Add external faces (make ramp collidable from both sides) along upper portion of ramp where balls might approach from "wrong" side.

Common issue with imported Blender meshes where normals face outward but gameplay sends balls against inner face.

Contributor: sixtoe

Ball Stuck Spots and Prevention

Multiple stuck ball scenarios and fixes during WCS94 development:

  • Ball stuck behind standup target near soccer ball: Add wall between soccer ball and target
  • Ball stuck at top lanes near 2-way gate: Reposition gate, add blocker wall
  • Airball over goal into orbit: Add invisible wall (real machine has clear plastic preventing this)
  • Ball stuck in upper playfield during multiball release: Adjust kicker/VUK geometry

Deflector plates behind kickers prevent balls from sinking around soccer ball mechanism.

Contributors: mcarter78, dgrimmreaper, tomate80

Playfield Mesh Edge Ball Sticking

Balls can get stuck at playfield mesh seam lines where mesh segments meet. Ball catches on edge between mesh sections.

Fix: Ensure mesh segments overlap slightly or by smoothing seam in Blender.

This manifests as balls suddenly stopping or stuttering at specific locations that correspond to mesh boundaries visible in editor.

Contributor: mcarter78