Overview
Legacy evidence identifies this candidate as Williams (1991). The information below is preserved for recreation work but is not automatically treated as validated physical-machine fact.
Playfield devices
Switch, lamp/GI, and controlled-device candidates are in the adjacent machine definition. Source-specific implementation notes are retained below.
Custom mechanisms
No custom mechanism conclusion has been validated. Manuals, schematics, PinMAME source, and gameplay evidence still need to be checked.
Ball-state transitions
Ball paths, trough ordering, locks, kickouts, and causal transitions have not yet been normalized. Relevant source notes follow under Evidence notes.
Controller interactions
Controller callbacks and bindings are candidate evidence only until reconciled against PinMAME and physical documentation.
Service and setup information
Unknown; locate operator/service documentation.
Timing and tuning observations
Source timing values may describe a particular VPX implementation rather than physical hardware and require review.
Recreation guidance
Do not treat this partial definition as a complete authoring specification. Resolve every coverage requirement and conflict before promotion.
Evidence notes
platforms/wpc.json#/coils/1: Unbound legacy outputs recordc_flipper_lower_rightwas retained as a migration note only.platforms/wpc.json#/coils/2: Unbound legacy outputs recordc_flipper_lower_leftwas retained as a migration note only.platforms/wpc.json#/coils/3: Unbound legacy outputs recordc_flipper_upper_rightwas retained as a migration note only.platforms/wpc.json#/coils/4: Unbound legacy outputs recordc_flipper_upper_leftwas retained as a migration note only.games/bop.json#/switches/0._note: Set via Controller.Switch(11) in Table1_KeyDown/KeyUp on RightFlipperKeygames/bop.json#/switches/1._note: Set via Controller.Switch(12) in Table1_KeyDown/KeyUp on LeftFlipperKeygames/bop.json#/switches/2._note: vpmNudge.TiltSwitch = 14games/bop.json#/switches/3._note: Hit/UnHit rollover switchgames/bop.json#/switches/4._note: Hit/UnHit rollover switchgames/bop.json#/switches/5._note: Hit/UnHit rollover switchgames/bop.json#/switches/6._note: Hit/UnHit rollover switchgames/bop.json#/switches/7._note: Top trough switch closest to shooter lane. CreateSizedballWithMass at init. Trough exit — kicked by solenoid 2.games/bop.json#/switches/8._note: Middle trough switch. CreateSizedballWithMass at init.games/bop.json#/switches/9._note: Bottom trough switch (drain end). CreateSizedballWithMass at init.games/bop.json#/switches/10._note: PulseSw 28 from sw28_Hit. Drop target with animation.games/bop.json#/switches/11._note: Hit/UnHit rollover switch. Also used as plungerIM.switch for impulse plunger.games/bop.json#/switches/12._note: Hit/UnHit rollover switchgames/bop.json#/switches/13._note: Hit/UnHit rollover switchgames/bop.json#/switches/14._note: Hit/UnHit rollover switchgames/bop.json#/switches/15._note: Hit/UnHit rollover switchgames/bop.json#/switches/16._note: PulseSw 36 from sw36_Hit. Drop target with animation.games/bop.json#/switches/17._note: PulseSw 37 from sw37_Hit. Drop target with animation.games/bop.json#/switches/18._note: Set via controller.switch(38) in Drain_hit. Cleared by kisort (solenoid 1).games/bop.json#/switches/19._note: PulseSw 41 from sw41_Hitgames/bop.json#/switches/20._note: Hit/UnHit rollover switchgames/bop.json#/switches/21._note: Hit/UnHit rollover switchgames/bop.json#/switches/22._note: Hit/UnHit rollover switchgames/bop.json#/switches/23._note: Hit/UnHit kicker switch. Ejected by solenoid 3 (SolKickout).games/bop.json#/switches/24._note: PulseSw 47 from sw47_Hitgames/bop.json#/switches/25._note: PulseSw 51 from sw51_Spin subgames/bop.json#/switches/26._note: Hit/UnHit rollover switchgames/bop.json#/switches/27._note: PulseSw 53 from Bumper1_Hitgames/bop.json#/switches/28._note: PulseSw 54 from Bumper3_Hitgames/bop.json#/switches/29._note: PulseSw 55 from Bumper2_Hitgames/bop.json#/switches/30._note: PulseSw 56 from UpperSlingShot_Slingshotgames/bop.json#/switches/31._note: PulseSw 57 from LeftSlingShot_Slingshotgames/bop.json#/switches/32._note: PulseSw 58 from RightSlingShot_Slingshotgames/bop.json#/switches/33._note: Controller.Switch(63) set in sw63x_Hit. Enabled only when currentFace=2. Ejected by solenoid 15 (KickLeftEye).games/bop.json#/switches/34._note: Controller.Switch(64) set in sw64x_Hit. Enabled only when currentFace=2. Ejected by solenoid 16 (KickRightEye).games/bop.json#/switches/35._note: Controller.Switch(65) set in sw65x_Hit. Enabled only when currentFace=1. Ejected by solenoid 8 (KickMouth).games/bop.json#/switches/36._note: Mechanism switch. Set to TRUE when currentFace is 1, 2, or 3 (faces that close the switch). Managed by HeadMechCallback. Set to 1 on init.games/bop.json#/switches/37._note: Hit/UnHit switchgames/bop.json#/switches/38._note: Hit/UnHit switch. LockWall dropped/raised on hit/unhit.games/bop.json#/switches/39._note: PulseSw 73 from sw73_Hitgames/bop.json#/switches/40._note: PulseSw 74 from sw74_Hitgames/bop.json#/switches/41._note: PulseSw 75 from sw75_Hitgames/bop.json#/switches/42._note: PulseSw 76 from sw76_Hitgames/bop.json#/switches/43._note: PulseSw 77 from sw77_Hitgames/bop.json#/switches/44._note: PulseSw 100 from multiple wall_Hit subs (wall69, wall75, wall77, wall79, wall80, wall81, wall82, wall83, wall84). Likely mapped in WPC switch matrix extension or opto group.games/bop.json#/coils/0._vbscript_callback: kisortgames/bop.json#/coils/0._inferred_type: coilgames/bop.json#/coils/0._note: Kicks ball from Drain kicker. Clears switch 38.games/bop.json#/coils/1._vbscript_callback: KickBallToLanegames/bop.json#/coils/1._inferred_type: coilgames/bop.json#/coils/1._note: Kicks ball from trough to shooter lane.games/bop.json#/coils/2._vbscript_callback: SolKickoutgames/bop.json#/coils/2._inferred_type: coilgames/bop.json#/coils/2._note: Ejects ball from scoop kicker (switch 46).games/bop.json#/coils/3._vbscript_callback: SolGate3games/bop.json#/coils/3._inferred_type: coilgames/bop.json#/coils/3._note: Controls Gate3 diverter via vpmSolGate.games/bop.json#/coils/4._vbscript_callback: SolSSgames/bop.json#/coils/4._inferred_type: coilgames/bop.json#/coils/4._note: Auto-fires impulse plunger for skill shot.games/bop.json#/coils/5._vbscript_callback: solBallLockPostgames/bop.json#/coils/5._inferred_type: coilgames/bop.json#/coils/5._note: Drops/raises ball lock post (BL wall).games/bop.json#/coils/6._vbscript_callback: KnockerSolenoidgames/bop.json#/coils/6._inferred_type: coilgames/bop.json#/coils/6._note: Cabinet knocker solenoid. Sound only in VPX.games/bop.json#/coils/7._vbscript_callback: KickMouthgames/bop.json#/coils/7._inferred_type: coilgames/bop.json#/coils/7._note: Ejects ball from mouth (switch 65, Face 1). Launches ball upward.games/bop.json#/coils/8._vbscript_callback: KickLeftEyegames/bop.json#/coils/8._inferred_type: coilgames/bop.json#/coils/8._note: Ejects ball from left eye (switch 63, Face 2). Launches ball upward.games/bop.json#/coils/9._vbscript_callback: KickRightEyegames/bop.json#/coils/9._inferred_type: coilgames/bop.json#/coils/9._note: Ejects ball from right eye (switch 64, Face 2). Launches ball upward.games/bop.json#/coils/10._vbscript_callback: SetLamp 117,games/bop.json#/coils/10._inferred_type: flashergames/bop.json#/coils/10._note: Routes to Lampz lamp 117. Uses SolModCallBack for PWM when UsePinmameModulatedSolenoids=true.games/bop.json#/coils/11._vbscript_callback: SolFlashLRgames/bop.json#/coils/11._inferred_type: flashergames/bop.json#/coils/11._note: Left ramp flasher. Custom fading sub. Backglass: Left SpaceShip.games/bop.json#/coils/12._vbscript_callback: SetLamp 119,games/bop.json#/coils/12._inferred_type: flashergames/bop.json#/coils/12._note: Routes to Lampz lamp 119. Backglass: Jackpot. Uses SolModCallBack for PWM.games/bop.json#/coils/13._vbscript_callback: SolFlashSKgames/bop.json#/coils/13._inferred_type: flashergames/bop.json#/coils/13._note: Skill shot flasher. Custom fading sub. Backglass: Heart.games/bop.json#/coils/14._vbscript_callback: SetProcRedDome1games/bop.json#/coils/14._inferred_type: flashergames/bop.json#/coils/14._note: Left helmet dome flasher. Uses SolModCallBack SetRedDome1 for PWM. Backglass: Face.games/bop.json#/coils/15._vbscript_callback: SetProcRedDome2games/bop.json#/coils/15._inferred_type: flashergames/bop.json#/coils/15._note: Right helmet dome flasher. Uses SolModCallBack SetRedDome2 for PWM. Backglass: Bottom Right.games/bop.json#/coils/16._vbscript_callback: SetProcRedDome4games/bop.json#/coils/16._inferred_type: flashergames/bop.json#/coils/16._note: Jets entrance dome flasher. Uses SolModCallBack SetRedDome4 for PWM. Backglass: Title Left.games/bop.json#/coils/17._vbscript_callback: SetProcRedDome3games/bop.json#/coils/17._inferred_type: flashergames/bop.json#/coils/17._note: Left loop dome flasher. Uses SolModCallBack SetRedDome3 for PWM. Backglass: Title Right.games/bop.json#/coils/18._vbscript_callback: motor_dirgames/bop.json#/coils/18._inferred_type: mechanismgames/bop.json#/coils/18._note: PROC-only SolCallback. Controls head rotation direction. Non-PROC uses cvpmMyMech.Sol2=27.games/bop.json#/coils/19._vbscript_callback: motor_solgames/bop.json#/coils/19._inferred_type: mechanismgames/bop.json#/coils/19._note: PROC-only SolCallback. Drives head motor on/off. Non-PROC uses cvpmMyMech.Sol1=28.games/bop.json#/coils/20._vbscript_callback: FlipperRelaygames/bop.json#/coils/20._inferred_type: coilgames/bop.json#/coils/20._note: PROC-only SolCallback. Enables/disables flippers. Non-PROC handles flipper enable via PinMAME framework.games/bop.json#/coils/21._vbscript_callback: SolRFlippergames/bop.json#/coils/21._inferred_type: coilgames/bop.json#/coils/21._note: Framework constant sLRFlipper=46 from core.vbs/WPC.VBS. Custom sub handles nFozzy flipper physics.games/bop.json#/coils/22._vbscript_callback: SolLFlippergames/bop.json#/coils/22._inferred_type: coilgames/bop.json#/coils/22._note: Framework constant sLLFlipper=48 from core.vbs/WPC.VBS. Custom sub handles nFozzy flipper physics.games/bop.json#/lamps/48._note: VR room backglass lampgames/bop.json#/lamps/49._note: VR room backglass lampgames/bop.json#/lamps/50._note: VR room backglass lampgames/bop.json#/lamps/51._note: VR room backglass lampgames/bop.json#/lamps/52._note: VR room backglass lampgames/bop.json#/lamps/53._note: VR room backglass lampgames/bop.json#/lamps/54._note: VR room backglass lampgames/bop.json#/lamps/55._note: VR room backglass lampgames/bop.json#/lamps/56._note: VR room backglass lampgames/bop.json#/lamps/57._note: VR room backglass lampgames/bop.json#/lamps/58._note: VR room backglass lampgames/bop.json#/lamps/59._note: VR room backglass lampgames/bop.json#/lamps/60._note: VR room backglass lampgames/bop.json#/lamps/61._note: Lampz.MassAssign only, no callbackgames/bop.json#/lamps/62._note: Lampz.MassAssign only, no callbackgames/bop.json#/lamps/63._note: Lampz.MassAssign only, no callbackgames/bop.json#/lamps/80._note: Driven by solenoid 17 via SetLamp/Lampzgames/bop.json#/lamps/81._note: Driven by solenoid 19 via SetLamp/Lampzgames/bop.json#/gi/0._note: ModLampz GI string 2. Maps to Lampz index 112 in non-modulated mode. GIRear collection. Includes DecalHeart1 material color fade.games/bop.json#/gi/1._note: ModLampz GI string 4. Maps to Lampz index 114 in non-modulated mode. GIFront collection + AmbientOverhead.games/bop.json#/_source/confidence_notes: High confidence on switches/coils. No Const sw* definitions in script — switches identified from _Hit/_UnHit subs, Controller.Switch() calls, PulseSw calls, and trough init. Custom nFozzy trough (not cvpmTrough) with 3 balls at sw27/sw26/sw25(ballrelease). Head mechanism uses cvpmMyMech with sol 27 (direction) and sol 28 (motor), switch 67 (head position). Solenoids 17-24 are flashers — 17 (Billions) and 19 (Jackpot) route through SetLamp to Lampz; 18 (left ramp) and 20 (skill shot) use custom flash subs; 21-24 are dome flashers on the helmet. Solenoids 27/28 are head motor (PROC only via SolCallback, non-PROC uses cvpmMyMech). Solenoid 40 (FlipperRelay) is PROC-only. Flipper coils use framework constants (sLRFlipper=46, sLLFlipper=48 from core.vbs). Cabinet flipper switches 11/12 set directly in KeyDown/KeyUp. UseSolenoids=2 (FastFlips), UseLamps=0, UseSync=1. Script supports both PinMAME and PROC modes. Lamp assignments from Lampz.MassAssign — comprehensive coverage of inserts 11-68, helmet/backglass lamps 71-88, GI at 91-108. Backglass body lamps 71-78 and 81-85 are VR-only. Switch 100 is rubber band impact sensor (PulseSw 100 from multiple wall_Hit subs).
Unresolved questions
- Is the I/O enumeration complete for every supported physical/controller variant?
- Which inferred VPX behaviors reflect real hardware, and which are table-script conveniences?
- Are all mechanism home states, sensors, motion constraints, and ball interactions documented?
Sources
legacy.game.bop:games/bop.jsonat the pinned migration revision.