Identity and evidence precedence
This is the Williams WPC-95 physical product released 1996 (WPC part-number family 547; "ARABIAN NIGHTS" models 50247-52347 per the manual's Declaration of Conformity), IPDB 3824 (candidate: sourced from the retained VPX table's own info.json description, "IPD No. 3824"; direct verification against ipdb.org was attempted this session and blocked by a Cloudflare challenge that did not clear with a headless-automation browser session -- title and manufacturer/year are independently confirmed against the manual and pinned driver, so only the bare numeric ID is unverified against the primary site). It covers the totan_* clone tree: totan_04 (0.4 prototype), totan_12, totan_13, totan_14 (parent, production 1.4/S1.1, the driver the retained script binds to), and totan_15c (2016 community "Competition MOD" ruleset built on the same 1.4/S1.1 codebase and controller addresses). Every one of these is a game-ROM revision for the same physical machine; none is virtual-only.
Evidence precedence for this definition: the retained known-working script (JPSalas 2015, flupper/rothbauerw 2019) is runtime and mechanism-causality ground truth; the Williams operations manual controls physical construction, part numbers, wiring, polarity, quantities, and device presence; pinned PinMAME controls controller generation, public address topology, and display metadata; the retained VPX geometry supplies normalized coordinates. The retained manual PDF carries a genuine OCR text layer, but pdftotext -layout badly garbles its multi-column tables (columns interleave, numbers shift rows), so every printed table used here was re-verified against the 300 dpi rendered pages and transcribed into external:pinmame-review-artifacts/tales-of-the-arabian-nights-1996/manual-transcription.md; the raw OCR text was used only to locate pages.
This retained table is smaller and older than the VPW mods used for several recently curated WPC games (944 extracted files, no VPW authorship credited). Its fidelity is judged honestly below: where its object set cannot support a validated placement, the device is left spatially unresolved rather than given a fabricated coordinate.
GEN_WPC95 (PINMAME_HARDWARE_GEN_WPC95 = 0x80) with wpc_dispDMD. The controller profile is pinmame.wpc-95, reused unchanged.
- Switches: dedicated coin-door/service 1-8, matrix 11-88 as drive column then return row, Fliptronic 111-118.
totanGameData's inverted-switch mask {0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} inverts column 3 bits 0-6 (31-37); the printed matrix page (2-38) shades exactly those seven cells "OPTO, TYPICALLY CLOSED" and no others. This is a rare zero-disagreement polarity sweep: every opto the manual documents (assembly part number present, switch part number blank -- the same signature the project has used on every prior WPC-95 game) is normalized by PinMAME, and nothing outside that column carries opto construction.
- Matrix columns 7 and 8 (addresses 71-88, all sixteen positions) are printed Not Used on both the wiring page and the parts list ("71 to 88 Not Used").
- Fliptronic F1-F8 (111-118): F1/F3 (lower EOS, leaf) and F5/F7 (upper EOS, leaf, unfitted) are plain switches; F2/F4 (lower button, opto) and F6/F8 (upper button, opto, unfitted) are shaded. Unlike Williams Monster Bash (one repurposed Fliptronic position) this game repurposes none of the upper positions as switches -- F5-F8 are genuinely unused -- but it does repurpose the upper-right solenoid circuit (see below).
- Solenoids: physical drivers 1-28 are all fitted (no gaps, unlike Monster Bash's unfitted 4/7); Fliptronic upper-right circuit 33/34 drives a non-flipper "Left Diverter" gate; Fliptronic upper-left circuit 35/36 drives two independent non-flipper devices (Vanish Magnet, Loop Post Diverter); Fliptronic lower-flipper circuits 45-48 are the genuine flippers; PinMAME state channels 29-32; simulator-only 49 and reserved 50.
totanGameData declares no custSol, no lampCol, and no swCol, so nothing above public address 36 (except 45-48) or lamp column 8 is populated, and the WPC-95 LPDC range (37-44) is entirely unused -- there is no motorized custom-solenoid mechanism on this machine (contrast Monster Bash's Dracula motor at 37/38+41/42).
- Lamps: 8x8 matrix 11-88, all 64 addresses populated (no "Not Used" lamp position, unlike Monster Bash's 78). Address 88 (Start Button) is a cabinet lamp inside the button assembly, not a playfield insert.
- GI: five strings on public addresses 0-4.
One WPC-95 numbering fact must not be lost: the printed solenoid table numbers the lower flipper circuits 29-32, while PinMAME publishes the same circuits at 45-48 (CORE_FIRSTLFLIPSOL = 45); the manual numbers are preserved as manual.address aliases. Unlike every WPC-95 game curated so far that has a repurposed upper-flipper circuit, this game's printed circuits 33-36 pass straight through to public 33-36 with no address translation, because totanGameData.hw.flippers carries FLIP_SOL(FLIP_L) only (no FLIP_UR/FLIP_UL bit): core_getSol's solNo <= 36 branch therefore falls to the generic mask = 1<<(solNo-33+4) path rather than the flipper-coil path, so a recreation binds these four addresses as plain driver-board outputs, not through any flipper abstraction.
Ball path, trough, and shooter
Tales of the Arabian Nights has no auto-plunger (no solenoid is printed or scripted for it): this is a manual pull-back plunger game, and switch 18 (Ball Shooter) is simply a lane-presence sensor. Four balls rest on trough optos 32-35, with Trough Ball 1 (32) at the eject end nearest the shooter lane and Trough Ball 4 (35) at the drain entrance (switch 35 also fires the Drain handler). Solenoid 9 (SolRelease) ejects the ball on 32; the retained script pulses trough-eject opto 31 in the same event (vpmTimer.PulseSw 31), so switch 31 is a documented projection onto the Trough-Ball-1 kicker position rather than a separately placed object.
Trough optos 31-37 (the trough itself plus the left/right inlane "cage" optos, see below) are printed as optos that rest closed; PinMAME's mask covers exactly this set, so the public state is already normalized.
Left and right magnetic inlane cages
A raised cage wall traps a ball rolling through the left/right inlane opto (switches 36/37) unless a second ball is simultaneously present in the trigger zone. The retained script's sw36_timer/sw37_timer handlers poll ball positions every 10 ms and only raise the cage once the lane is clear; solenoids 1/2 (SolSpikerLeft/SolSpikerRight) lower the cage back down on release. This is a "hold a ball in reserve until the lane clears" gimmick, not a kicker.
Vanishing Magnet assembly, lock, and Bazaar scoop
The manual's "Vanishing Magnet Assembly" (TOC 2-25) makes a ball appear to disappear. Solenoid 3 (SolVanishDrop) opens a hidden trapdoor beneath the Vanish Tunnel opto (switch 12, pulsed on entry) while solenoid 35 (SolVanishMagnet) energizes a magnet that holds the ball out of sight; releasing the magnet launches the ball back into play in a random direction (HideVanish_Timer). All three retained table objects (the entry trigger, the magnet trigger, and the trapdoor wall) cluster within one raw unit of each other in the extraction, confirming they model one physical assembly.
A single magnet (solenoid 6) captures and holds up to three locked balls at stacked positions Lock 1 (bottom, switch 66), Lock 2 (middle, switch 67), and Lock 3 (top, switch 68); the retained script's LockMagnet_hit/LockMagnet1_unhit handlers damp ball velocity while the magnet is energized. Solenoid 4 (SolLockRelease) kicks the stack loose and opens two release walls so the locked balls can return to play.
A ball resting on opto 25 (Bazaar Eject) is kicked back to the playfield by solenoid 5 (SolBazaarKick); the retained script raises a companion collision wall while the ball is captured.
Ramp magnet, Swirl Ramp diverter, playfield diverter, and loop post diverter
Solenoid 8 (SolRampMagnet) energizes a magnet on the Magnet Ramp Assembly (manual item 1, printed 2-42) that catches and holds a ball mid-ramp, then nudges it forward on release. No printed switch is dedicated to this magnet.
Solenoid 21 (Ramp Diverter) is not a flasher despite sitting in the flasher-numbered address range (17-28): the retained script's RampDiverter/RampDiv_Timer handlers animate a physically rotating diverter post on the Swirl Ramp Assembly (manual item 2) over several steps, matching the manual's own "Low Power" solenoid type and AE-30-2000 coil part number rather than a flashlamp part number.
Solenoids 33/34 (printed "Upr. Rt. Power/Hold") drive a "Left Diverter" playfield gate (PlayFDiv), not an upper flipper -- this game has no upper flippers. The retained script scripts only the hold address (34, SolPlayFDiv); the power address (33) shares the same physical coil pair per the manual's shared J119-6 wiring bus, the same power/hold-column-template pattern established on Indiana Jones: The Pinball Adventure's repurposed upper-flipper circuits. Solenoid 36 (Loop Post Diverter, SolLoopDiv) is wired on the same Fliptronic upper-left circuit bus (J119-8) as Vanish Magnet (35) but is an independent, separately scripted device, not that circuit's power/hold partner -- the printed "Power"/"Hold" column labels for 35/36 are the standard WPC flipper-circuit schematic template carried over onto two unrelated toys, not evidence of an actual power-then-hold relationship.
Spinning Lamp Unit (the "Magic Lamp" disc)
The manual's "Spinning Lamp Unit Assembly" (TOC 2-23) has no dedicated printed switch/solenoid table page of its own, but it is fully reconstructable from the retained script. It is a freely rotating disc (table radius 60 units, centered at normalized x=0.535714, y=0.388170 -- also the placement of solenoid 23's "Magic Lamp Flasher") that two spinner-kick posts near the shooter lane (Kicker.SpinnerKick/SpinnerKick2) set spinning when struck by a ball. SpinnerBallTimer_Timer integrates angular speed with friction and a spring-centered wobble every 10 ms, and pulses public switch 56 (Lamp Spin CCW) or 57 (Lamp Spin CW) each time the disc's simulated rotation crosses a position threshold, depending on spin direction. There is no PinMAME mech table or ROM-side position counter for this motion (totanGameData.hw.handleMech is unset, unlike Monster Bash's Dracula/Frankenstein mechanisms) -- it is a pure VPX physics simulation with no drive coil; the disc is ball-driven, not motorized. Both switches are documented projections onto the disc's own center.
The manual's "Genie Double Target Assembly" (TOC 2-24) is a spring-loaded rocking figure struck by the ball at two collision zones (GenieTrig, GenieTrig1; a third object GenieTrig2 exists in the retained table but has no script handler anywhere and is inert legacy geometry). UpdateGenie integrates a bounce/decay physics model on the figure's rock angle and asserts public switch 42 (Genie Target, printed as the SW-1A-207/SW-1A-208 double target read as one address) whenever that angle exceeds 4.5 degrees -- there is no discrete trigger-hit event for the switch itself, so it is a documented projection onto the figure (GenieP/GenieP1). The separate Genie Standup Target (switch 23, HitTarget sw23) is a distinct, single, ordinary standup target elsewhere on the playfield and must not be conflated with the double target.
Slingshots, jet bumpers, mini standups, standup banks, skill shots, and captive balls
Two slingshots (coils 10/11, score switches 51/52) and three A-9415-2 jet bumpers (coils 12/13/14, skirt switches 53/54/55) are standard WPC devices; the retained script's handlers pulse the matching matrix addresses and fire the matching coils in the same event. Note the non-alphabetic table-object-to-address mapping the script itself establishes: Bumper1 is the Left jet (53), Bumper2 is the Middle jet (55), and Bumper3 is the Right jet (54) -- do not assume ordinal object names follow left-to-right or the printed Left/Right/Middle order.
Switch 46 (Mini Standups) is printed with a quantity of 3 (A-18017-6), but the retained table models only two target objects (sw46, sw46b) sharing the address; the third physical target has no distinct evidenced coordinate in this table and is disclosed as a known table-fidelity gap rather than silently dropped or fabricated. Switch 61 (Left Standups) and 62 (Right Standups) are each three-target banks (A-20846-9 top, A-20499-9 middle/bottom) and the retained table models all three positions per bank with real, distinct coordinates. Switches 63/64/65 (Top/Middle/Bottom Skill Shot) and 48/58 (Right/Left Captive Ball) are ordinary passive targets with no drive coil.
Fliptronic column: flippers only
Two FL-11629 flippers on Fliptronic circuits 111-114 (lower right/left, EOS then button-opto). There are no upper flippers: positions 115-118 are printed Not Used on the switch-locations parts list, and unlike Monster Bash none of them is repurposed as a switch for another device (the repurposing on this game happens entirely on the solenoid side, at printed circuits 33-36). WPC-95 reads the entire eight-position Fliptronic column through WPC_FLIPPERSW95 with a blanket hardware inversion applied regardless of fitment or physical construction (leaf vs. opto), so the public state of every one of 111-118 is already normalized.
Lamps, flashers, and general illumination
All 64 lamp-matrix addresses are populated (no "Not Used" lamp position on this game). Address 28 (Outlane Special) is the only address the manual marks with an explicit bulb-count "(2)", and the retained table binds two genuinely separate Light objects on opposite sides of the playfield (l28 right outlane, l28a left outlane, 761 raw units apart) -- both are real, distinct placements. Every other address has a single co-located "LightNN"/f1/f16-style brightness-doubling Light object within 38 raw units (well under 4% of playfield width) of its primary lNN object; these are documented render doubles and excluded from placement, matching the manual's single-bulb parts entries. Address 88 (Start Button) has a table object (Light.l88) at Apron-surface coordinates, but it carries the unbound-default timer_interval (100) and is not a member of the InsertLights collection the runtime lamp update binds (Sub InitLights(InsertLights)), so it is provably inert -- corroborating the cabinet classification rather than contradicting it.
Solenoids 16 and 17 (Left Eject Flasher, Inlane Flasher) both print two playfield bulbs (A-17983 (2)), but the retained table models only one Light object per address; one placement is recorded and the quantity gap is disclosed rather than fabricating a second coordinate. Solenoids 25, 26, and 27 each print one playfield bulb plus one backbox "Insert Flasher" companion; only the playfield bulb receives a coordinate.
General illumination carries the definition's one unresolved conflict. The manual's own wiring table (printed 2-40) documents public GI addresses 0-2 (printed Strings 1-3) as backbox insert-panel only (#44 bulbs, J106 connectors, no Playfield column entry) and addresses 3-4 (printed Strings 4-5) as the genuine playfield strings (#555 bulbs, J105 connectors, string 5 also feeding a cabinet connection via J104). The retained script's Sub UpdateGI(no, step) disagrees: it implements only Case 2 (public address 2, the manual's backbox-only String 3), binding it to a large playfield-wide dimming effect (globalGI) applied across dozens of playfield textures and materials, while addresses 0, 1, 3, and 4 fall through with no case at all and produce zero visual effect. This is recorded as conflict.gi-string-3-playfield-binding and left unresolved: the manual's physical wiring controls this device's spatial classification (GI address 2 stays a backbox not_applicable device), and GI addresses 3/4 -- the manual's real playfield strings -- have no VPX object to validate a placement from, so their spatial key is omitted entirely rather than assigned a fabricated coordinate. Resolving this needs a LibPinMAME gameplay-harness trace of a legal totan_14 ROM observing which GI address the ROM actually varies during attract-mode playfield dimming, cross-checked against a photograph or continuity trace of the physical J105/J106 harness.
Author construction checklist
- Build the four-ball trough with the drain at Trough Ball 4, the manual pull-back plunger's shooter lane, the left/right magnetic inlane cages, the Vanishing Magnet assembly (trapdoor + magnet), the three-position magnetic lock, the Bazaar scoop, the Magnet Ramp's mid-ramp magnet, the rotating Swirl Ramp diverter post, the Left Diverter playfield gate, the Loop Post Diverter, both slingshots, three jet bumpers, the ball-driven Spinning Lamp Unit disc with its two spinner-kick posts, the rocking Genie figure with its double target and separate standup target, both standup banks (3 targets each), the mini-standup pair (physically 3, evidenced 2), three skill-shot targets, two captive balls, and the lower flipper pair.
- Bind switches 31, 42, 56, and 57 to their host mechanism's own position/state rather than a fixed trigger object; see the projections above.
- Treat GI address 2 as a backbox device per the manual despite the retained script's playfield-wide side effect, and leave GI addresses 3/4 without a coordinate until the conflict is resolved.
- Reuse the
pinmame.wpc-95 controller profile unchanged; do not create a new profile for this game.