Identity and evidence precedence
This is the Williams WPC-DCS physical widebody ("Superpin" line) product released July 1993, part number 16-50017-101, IPDB 1267. It covers the ij_* clone tree: ij_l7 (parent, production L-7), ij_d7/ij_h1/ij_i1/ij_lg7/ij_dg7/ij_l6/ij_d6/ij_l5/ij_d5/ij_l4/ij_d4/ij_l3/ij_d3 (localization and display-fix revisions), and ij_p2 (prototype). Every one of these is a game-ROM revision for the same physical machine. This definition explicitly excludes the unrelated ij4_* driver family (src/wpc/sam.c, CORE_GAMEDEF(ij4, 210, "Indiana Jones (V2.1)", 2009, "Stern", sam1, 0)), the completely different 2008 Stern SAM-hardware "Indiana Jones" machine that happens to share a PinMAME short-name prefix.
Evidence precedence for this definition: the retained known-working VPW Mod v1.0 script 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 emulator normalization; the retained VPX geometry supplies normalized coordinates. The retained manual's Paper Capture OCR text layer scrambles and duplicates table cells under pdftotext -layout, so every printed table used here was read from rendered pages and transcribed into external:pinmame-review-artifacts/indiana-jones-the-pinball-adventure-1993/manual-transcription.md; the retained OCR text is a search index only and never an authority.
GEN_WPCDCS (PINMAME_HARDWARE_GEN_WPCDCS = 0x10, "DCS Sound system, Indiana Jones 10/93 - Popeye 3/94") with wpc_dispDMD. This is a new controller profile, pinmame.wpc-dcs, not a reuse of pinmame.wpc-fliptronic: GENWPC_HASFLIPTRON = GEN_ALLWPC & ~(GEN_WPCALPHA_1|GEN_WPCALPHA_2|GEN_WPCDMD) does include GEN_WPCDCS, so the Fliptronic flipper-column behavior is identical, but WPC-DCS is a distinct hardware-generation bit from GEN_WPCFLIPTRON and deserves its own profile citing pinned source directly rather than reuse-by-analogy.
- Switches: dedicated coin-door 1-8, matrix 11-88 as drive column then return row (all 64 positions populated -- no unused matrix cell on this machine), Fliptronic 111-118, and a driver-declared custom switch column (
ijGameData.hw.swCol = 1) publishing 121-128, not 91-98. ijGameData's inverted-switch mask {0x00,0x00,0x00,0x00,0x5F,0x00,0x00,0x06,0x7F,0x00,0x00,0x70,0x18} normalizes columns 4 (41-45,47), 7 (only 72,73 -- not 71), 8 (81-87), the Fliptronic column (only 115-117, the repurposed Center Drop Bank), and the custom column (only 124,125 -- not 121-123).
- Solenoids: physical drivers 1-16, 33-36 (repurposed upper-flipper circuits), 45-48 (lower flippers); flashers 17-21; motors 22-23 (Path of Adventure tilt); 25-28 general purpose; a driver-declared custom-solenoid range (
ijGameData.hw.custSol = 7) publishing 51-57 through the 8-Driver Board's WPC_EXTBOARD1 register, of which 51-56 are populated and 57-58 are not. ijGameData declares no lampCol, so lamps stay the plain 11-88 matrix.
- Lamps: 8x8 matrix 11-88, every address populated (no "Not Used" lamp on this machine).
- GI: five strings on public addresses 0-4.
Three WPC-DCS numbering facts must not be lost. First, the printed solenoid table numbers the lower flipper circuits 29-32 while PinMAME publishes the same circuits at 45-48; the manual numbers are preserved as manual.address aliases. Second, the custom switch column's printed silkscreen number ("switch column 9", printed 91-95 on the 3-sw Opto and Motor Opto Switch PCB schematics) is not the PinMAME public address: CORE_CUSTSWCOL = CORE_STDSWCOLS = 12 places the driver's first declared custom column two columns past the Fliptronic column, reporting publicly at 121-128 via the same col*10+row+1 formula that gives the Fliptronic column 111-118. Third, the custom-solenoid board's own printed item numbers 37-42 are the 8-Driver Board's own silkscreen, not the public address; the true public range is 51-56, derived from ijGameData.hw.custSol = 7 (CORE_FIRSTCUSTSOL = 51) and confirmed exactly by the retained script's own SolCallback/SolModCallback comments.
Ball path, trough, and shooter
Indiana Jones has no manual plunger; the player instead pulls a spring-loaded Gun Handle trigger mounted on the front of the cabinet (A-16113 Gun Handle Assembly) -- the "powered ball-launching cannon" this machine is known for. ijGameData's comSw declares swGunTrigger (34) as the shooter switch; pulling the trigger closes it, and the retained script's AutoPlunger handler fires the physical Plunger object (solenoid 2, Ball Launch) to auto-plunge the ball. Six balls rest on trough optos 86 (nearest the drain) through 81 (nearest the Ball Release coil); cvpmTrough.InitSwitches Array(86,85,84,83,82,81) and .InitExit BallRelease,70,15. Solenoid 4 (Ball Release) ejects the ball on 81; the retained script's SolBallRelease handler pulses Top Trough opto 87 in the same event whenever bsTrough.Balls is nonzero (relationship.ball-release-top-trough-pulse), so switch 87 is a documented projection onto the shared trough-exit kicker rather than a separately placed object -- all seven trough positions are, since cvpmTrough has no per-ball playfield object of its own.
Trough optos 81-87, ramp/idol/subway optos 41-45/47, and Mini Hole optos 72-73 are printed as optos that rest closed. PinMAME's ijGameData inverted-switch mask covers exactly those thirteen (columns 4, 7 partial, and 8), so the public state is already normalized: assert the public switch when a ball is present and never invert again.
A ball reaching the Center hole (switch 45, opto) rolls down a subway to Subway Lockup opto 47; solenoid 28 (Subway Release) ejects it onto Right Popper opto 44; solenoid 1 (Ball Popper) pops it up past Top Idol Enter opto 43 into the rotating idol lock. A DC gearmotor (solenoid 56, Wheel Motor, controlled from the 8-Driver Board) rotates the idol figure (Primitive totem) continuously; the retained script's UpdateIdol_timer advances a 0-359 degree counter in IJ_IDOLTICK = 2-degree ticks and bucket-decodes it into six 60-degree sextants, toggling Controller.Switch(121/122/123) at each boundary (case 0/60/120/180/240/300) so three opto sensors (A-13901-2 "3-sw. Opto PCB Assembly (for idol)") report which of six lock pockets faces the entry/exit point. Pinned PinMAME's own ij_handleMech mech-bit-0x08 branch implements the identical six-case toggle table independently, and ij_getSol/ij_handleBallState gate lock-pocket transitions on the wheel motor's own bucket parity (!(locals.idolPos/60%2)). Solenoid 6 (Idol Release) opens the lock doors and ejects a held ball, sensed leaving on Exit Idol (switch 32). The lock itself (cvpmTrough bsIdol, size 3, .InitExit IdolExit,180,0) has no per-position playfield sensor of its own -- switches 121-123 sense the figure's angular position, not ball presence, matching the same "position-encoder projected onto the rotating figure" pattern documented for Williams Monster Bash's Dracula mechanism.
Unresolved polarity conflict (conflict.wheel-position-opto-not-normalized): the manual documents 121-123 (printed switch-column-9 positions 91-93) as opto interrupters on the A-13901-2 board (three onboard LED/phototransistor pairs), but ijGameData's inverted-switch mask leaves the custom column's bits 0-2 clear (0x18 = binary 00011000) -- unlike bits 3-4 (124/125, Mini Playfield Left/Right Limit, opto per the A-16657 board on the very same physical harness), it does not normalize 121-123. This keeps physical_wiring conflicted and the record partial; resolving it needs a LibPinMAME harness trace of a legal ij_l7 ROM driving the idol motor through a full rotation and observing the idle/transition public state of 121-123.
Path of Adventure: tilting mini-playfield
A small secondary playfield (Primitive minipf) is mounted on a motorized tilt mechanism driven by solenoids 22/23 (Mini Motor Left/Right, an H-bridge pair). A ball enters through the Top Lockup post (solenoids 35/36, sensed by Top Post switch 46 -- printed circuit position repurposing the upper-left-flipper Fliptronic slot) after the right-ramp Diverter (solenoids 33/34, repurposing the upper-right-flipper slot) routes it across the Rope Bridge rather than up the right ramp proper. The retained script's POAMech (vpmMechTwoDirSol + vpmMechStopEnd + vpmMechLinear, Sol1=23, Sol2=22, Length=9, Steps=9) advances a 0-8 linear position counter; pinned PinMAME's own ij_handleMech mech-bit-0x04 branch independently implements the same idea with a 0-359 PoAPos counter and 176/184-degree thresholds around a 180-degree center (IJ_POA_LLIMIT/IJ_POA_MIDPOS/IJ_POA_RLIMIT). The ball rolls down whichever of two forked lanes the tilt favors, passing four switches per lane (top, middle-top, middle-bottom, bottom: 65/66/67/68 left, 75/76/77/78 right) before reaching a Pit Hole (72) or Extra Ball Hole (73) at the bottom center. Mini Playfield Left/Right Limit optos (124/125, A-16657 "Motor Opto Switch PCB Assembly (for mini playfield)") mark the two tilt extremes and are the two custom-column addresses PinMAME does normalize.
The five mini-playfield insert lamps per side (71-75 left-area, 81-85 right-area) have no distinct retained-table Light object -- the script drives every one of them through DisableLighting Li<n>on, 600, against Primitive objects that all share one raw local coordinate because they are children of the tilting mini-playfield group. Each is a documented projection onto the playfield-fixed switch/trigger object at the same lane position (71/73 onto 65/66, 72/74 onto 75/76, 81/83 onto 67/68, 82/84 onto 77/78) or onto the EnterPoA/ExitPoA triggers for the two "arrow" indicator lamps (75, 85).
Center Drop Bank, Totem, and captive ball
A three-target opto drop bank (A-16032-2, A-13609 opto sensors) spells three letters of the "ADVENTURE" chase and occupies the printed upper-flipper-adjacent Fliptronic positions F5-F7 (public 115-117), footnoted "*Used as switches other than flipper switches in this game." Solenoid 5 (Center Drop Bank) resets all three targets in one pulse (ResetDrops, DTRaise 115/116/117); pinned PinMAME's ij_handleMech mech-bit-0x01 branch clears all three switches together on the same coil, confirming one shared reset coil with no per-target coil. F8 (public 118) is the Left Ramp Made sensor, also repurposed rather than an upper-left-flipper button.
A single reciprocating drop target ("Totem", switch 11, "Single Drop Target") is raised by solenoid 3 (Totem Drop Up) and knocked back down by solenoid 16 (Totem Drop Down); ij_handleMech's mech-bit-0x02 branch sets/clears the switch directly from whichever coil fires. A captive ball rolls between Captive Ball Back (switch 64) and Captive Ball Front (switch 71) behind the Totem target; ij_handleBallState marks the first simulated ball IJ_CAPTUREDBALL and routes it through stCapturedIdle/stCapturedF/stCapturedB states -- hitting the Totem target sets a hitCaptiveBall flag that drives the captive ball forward rather than letting it drain, and there is no dedicated actuator (the ball is pushed by momentum).
Unresolved polarity conflict (conflict.captive-ball-front-opto-not-normalized): the manual documents switch 71 as an opto interrupter (A-14231/A-14232, the same part pair used by normalized addresses 42-45/47), but ijGameData's inverted-switch mask covers column 7 with only 0x06 (binary 00000110): bits 1-2 (72/73, Mini Top/Bottom Hole, also opto) are normalized, but bit 0 (71) is not. This keeps physical_wiring conflicted; resolving it needs a LibPinMAME harness trace striking the captive ball and observing switch 71's idle/transition public state.
Fliptronic column: flippers and repurposed positions
Two Fliptronic flippers on circuits 111-114 (lower right/left, EOS then button-opto). There are no upper flippers at all: unlike Williams Monster Bash (one repurposed position) or Twilight Zone (no repurposing), every would-be upper-flipper Fliptronic position on this machine is repurposed -- F5-F7 (115-117) are the Center Drop Bank opto sensors and F8 (118) is the Left Ramp Made sensor, all footnoted on the printed switch matrix. ijGameData declares FLIP_SW(FLIP_L)|FLIP_SOL(FLIP_L) with no FLIP_U bit at all, and the printed solenoid circuits 33-36 (nominally the upper-flipper power/hold pairs) drive the right-ramp Diverter and Top Lockup post instead -- pinned PinMAME's core_getSol falls back to the generic solenoids2 bit path for 33-36 precisely because this driver never sets FLIP_SOL(FLIP_UR)/FLIP_SOL(FLIP_UL).
Slingshots: printed vs. runtime identity (resolved)
Printed row 12 reads "Left Slingshot" and row 13 "Right Slingshot" on the Solenoid/Flasher Table. The retained known-working script disagrees and is internally self-consistent the other way (SolCallback(12)="RandomSoundSlingshotRight", SolCallback(13)="RandomSoundSlingshotLeft"), and pinned PinMAME's own ij.c agrees with the script (#define sRSling 12, #define sLSling 13). The switch side of the same pair is undisputed across all three sources (switch 33 = Left Slingshot = swLSling, switch 48 = Right Slingshot = swRSling), and the retained table's own LeftSlingShot/RightSlingShot wall objects sit on the geometrically correct side for their matching switch. Two independent, higher-evidence-priority sources agree against the manual's one row; resolved as public 12 = Right Slingshot, 13 = Left Slingshot, with the manual's transposed row disclosed rather than silently corrected.
Switch 23 ("Ticket Opto"): printed but unfitted
The printed switch matrix (2-46) labels public switch 23 "Ticket Opto", and pinned PinMAME's ij.c independently defines #define swTicketOpto 23. The printed Switch Locations parts list (2-47), however, prints item 23 blank with no switch or opto part number, and the swTicketOpto constant is never referenced anywhere else in the driver (no state, mechanism, or inport-table entry uses it). The blank parts-list entry is the physical-fitment authority: no device is installed at this position on this machine, and "Ticket Opto" is a vestigial template label carried over from a shared WPC switch-matrix layout. Recorded availability: "unused", citing all three sources; not a blocking conflict.
Mini Playfield Left/Right Limit: printed reversal (resolved)
The printed Switch Locations parts list (2-47) reads item 94 "Mini Pfd Right Limit" and item 95 "Mini Pfd Left Limit" -- the opposite of both the printed Switch Matrix page (94 Left, 95 Right) and ij.c's own naming (swLL_PoA = CORE_CUSTSWNO(1,4) = 124, swRL_PoA = CORE_CUSTSWNO(1,5) = 125; "LL"/"RL" = Left Limit/Right Limit). Two sources agree against one; resolved as 124 = Mini Playfield Left Limit, 125 = Mini Playfield Right Limit, with the Locations page's reversed row disclosed here rather than silently corrected.
Lamps, flashers, and general illumination
All 64 lamp-matrix addresses are populated; no printed (2) bulb-quantity marker appears anywhere on the Lamp Matrix or Lamp Locations pages, and every retained-table LightNN/LightNNa pair is a co-located brightness double (offset under one bulb diameter), so every address is a single physical bulb. The lamp-matrix page (2-48) carries one typographic slip against the authoritative Lamp Locations parts list (2-49): address 23 prints "Adv(e)ture Light" (missing the "n") on the matrix page but "Adv(e)nture Light" on the parts list; the parts-list spelling is canonical.
Flashers 18-21, 24-27, and 51-55 each drive at least one playfield bulb; the "Plane Gun LEDs" (24) address drives two distinct playfield objects on the two separate biplane toys despite no printed (2) marker, matching the Section 3 TOC's separate "Bi-Plane Assembly" and "Fighter Plane Assembly" entries. Flasher address 52 (Right Side Flasher) prints a (2) playfield quantity but only one distinct retained-table object was confidently identified; the definition records quantity 1 and discloses the shortfall rather than fabricating a second coordinate. Solenoid 17 (Eternal Life) and lamp 117 (Center Lock) share the same physical bulb (Light117/p117): the retained script's SolFlash17 handler calls SetLamp 117,1 directly, confirmed by concrete script evidence rather than assumed from proximity.
General illumination splits three ways on the retained script's ModLampz/UpdateGi dispatch: GI address 0 drives collections GITop (28 members) plus GIBumpers (6 jet-bumper-cap members) for 34 total playfield placements; GI address 1 drives collection GiBot (32 members); GI address 4 drives collection GiRLaneCoin (LiteHOF_L/LiteHOF_R, 2 placements, plus a cabinet feed through J119, the only cabinet connection on the printed general-illumination wiring page). Two further Light objects, gi060 and gi061, exist in the retained table but belong to no active GI collection (GiTopSides/GiBotSides are both declared empty in collections.json) and are excluded as orphaned table-modeling objects. GI addresses 2 and 3 (Insert Top/Bottom) are backbox-only circuits with no playfield collection assigned.
Author construction checklist
- Build the six-ball trough with the drain at the "Trough Ball" nearest 86, the Gun Handle auto-launcher, both slingshots, three jet bumpers, both control gates, the Totem single drop target with its captive ball, the Center Drop Bank three-target opto bank, the left eject and subway/popper kickers, the rotating idol figure with its six-pocket lock, the motorized right-ramp diverter, the motorized Top Lockup post, and the motorized tilting Path of Adventure mini-playfield with its two forked lanes.
- Preserve opto polarity for 41-45, 47, 72-73, 81-87, 115-117, 124-125; do not invert what PinMAME already normalizes. Switches 71 and 121-123 are also printed normally-closed optos, but PinMAME does not normalize them despite normalizing their column neighbors -- treat their polarity as unresolved (
conflict.captive-ball-front-opto-not-normalized, conflict.wheel-position-opto-not-normalized) rather than assuming either convention.
- Bind solenoid 12 to the Right Slingshot and 13 to the Left Slingshot, matching the retained script and driver rather than the manual's transposed printed row.
- Treat solenoids 33/34 as the right-ramp Diverter and 35/36 as the Top Lockup post, not upper-flipper circuits; treat Fliptronic positions 115-117 as the Center Drop Bank and 118 as Left Ramp Made, not upper-flipper switches.
- Bind every dedicated switch 1-8, every matrix position 11-88, Fliptronic 111-118, the five custom-column switches 121-125 (with 126-128 unpopulated), the eight CPU DIP bits, solenoids 1-16/22-28/33-36/45-48/51-56 (with 57-58 unpopulated), lamps 11-88, GI 0-4, and the 128x32 DMD.
- Do not treat public switch 23 as a live "Ticket Opto" input; this machine has no device fitted at that position despite the printed matrix label and the driver's own vestigial
#define.
Sources
manual.williams.indiana-jones-the-pinball-adventure.1993: Williams Indiana Jones: The Pinball Adventure operations manual, SHA-256 97a8202c5d95de743db7acf36567342cb71b2334188225d9b107787b5691ad43.
manual-support.williams.indiana-jones-the-pinball-adventure.1993: retained human transcription, SHA-256 5a083e87ffc8aa0237d72b98848fa58d4450f848e25535e5ae4a945d6015c8f3.
vpx-script.ij-vpw-1-0: retained known-working VPW Mod v1.0 embedded script, SHA-256 926e7a90d89602b003ac93757ee23c6ae916bb382112be28f82388381490bb7a, binding ij_l7.
vpx-table.ij-vpw-1-0: retained table, SHA-256 03451b7951242d204f9f79ab91f108d3c8aa203039f2ca867b24f4f47668c250, bounds left=0 top=0 right=1093 bottom=2162 (wide-body).
pinmame.core.4ec52ff0ac13: src/wpc/sims/wpc/full/ij.c and the WPC-DCS core/solenoid/flipper handling at the pinned revision.