12 KiB
Pokemon Pro VPX Table Recreation
Status
An evidence-calibrated Visual Pinball X 10.8.1 table is implemented under
emulation/vpx/. The generated emulation/vpx/PokemonPro_Greybox.vpx keeps a
self-contained standalone mode and adds spike3, where the genuine game in
QEMU owns rules, lamps, and mechanism drivers while VPX owns physical balls
and contacts. See native-playable-table.md for the complete cabinet path.
Confirmed on 2026-07-14 after the continuous-collision rebuild:
emulation/vpx/build.shregenerated the manifest and diff-friendly VPX source, assembled the table withvpxtool 0.33.4, imported the standalone VBS, and passedvpxtool verify.emulation/vpx/qa.shfirst validated 13 continuous collision polygons and 13 separate visual rails with zero legacy segment rectangles and zero self-intersections, then re-extracted the assembled table and matched its configuration, exact VBS, and all 323 named game items, including reusable mechanical meshes, five private decal planes, and hidden QA/controller objects. VPX binary float quantization is compared at 0.01 VPX-unit precision.emulation/vpx/qa-live.shloaded the table in the local macOS BGFX player, compiled its VBS, ran the correctly named table initialization event, served a ball, and captured a live playfield frame.emulation/vpx/qa-mechanisms.shphysically launched test balls through the left and right outlane switch/drain paths and center drain, then exercised Town VUK capture/eject, Poke Ball hold/release, and shooter-lane service. All required events are present inemulation/vpx/qa/mechanism-runtime.log.emulation/vpx/qa-plunger.shserved a free ball, pulled and fired the actual VPX plunger, and detected that same ball after it cleared the shooter-lane mouth into the main playfield. The old midway-up-lane checkpoint was removed. The position trace and passing event are preserved inemulation/vpx/qa/plunger-runtime.log.emulation/vpx/qa-sling-authority.shproved that both integrated-mode sling balls remain captured until their mapped QEMU drivers arrive and are safely released on disconnect.emulation/vpx/qa-shots.shexercised physical outlane/center drains, actual trap/shooter/sling mechanisms, every mapped ramp/orbit contact route, both pops, captive-ball retention, posts/gate/Meowth motion, and restored physical inventory to the captive ball. Ramp/orbit coverage in this harness is a native contact/driver route test, not a claim that a physical ball traversed every full elevated trajectory.SOAK_SECONDS=8 emulation/vpx/qa-soak.shcompleted eight cycles with the six-plus-one inventory invariant. The default is 3,600 seconds; that full soak remains unrun.
For a standalone play test, double-click emulation/vpx/run.command or run
emulation/vpx/run.sh. For the integrated cabinet, use
emulation/run-playable.command. The standalone launcher probes the verified
~/Downloads/vpinball/build/VPinballX_BGFX.app/Contents/MacOS/VPinballX_BGFX
path and the originally supplied ~/Downloads/vpinballbuild/ path.
Evidence and registration
The full service manual is preserved as
emulation/vpx/reference/Pokemon_Pro_web.pdf (SHA-256
50a1906b5c609cd3a84970b6a6e9b0be839b4d0a588d8b27361936ab6537d6bb).
Rendered PDF pages 16, 20, 25, 41, 42, 49, 51, 52, and 56 through 62 retain
their original page numbers under emulation/vpx/reference/manual-pages/.
The primary locator is the target-root asset
/games/pokemon_pro/assets/nuk/images/Test/pokemon_playfield_pro.png. The
preserved 451 by 998 grayscale copy has SHA-256
09477fe9bd50cfeba34bbff2eac5c272fc79eed6a6ed07fc40da636c5fde977b.
Three user-supplied machine photographs are preserved under
emulation/vpx/reference/photos/; their hashes and the inspectable crop used
to register the overhead photograph are recorded in emulation/vpx/layout.json.
The single locator-to-table transform into the 952 by 2115 VPX plane is:
VPX x = source x * 952 / 451
VPX y = source y * 2115 / 998
emulation/vpx/qa/layout-overlay.png places the actual buffered collision
polygons, their source centerlines, ramp
centerlines, switches, lamps, and coils over the locator.
emulation/vpx/qa/photo-geometry-overlay.png applies the same trace to the
registered overhead photograph. The generator retains review tolerances of 4
source pixels for lamp centers, 8 pixels for switch/coil markers, and 6 pixels
for major wall/ramp edges unless explicitly marked approximate.
Implemented geometry
emulation/vpx/layout.json is the versioned manifest. Its records carry a
stable VPX name, coordinates, evidence page, confidence, dimension provenance,
and Z profile where applicable. The current lower and main playfield includes:
- separate center, left-outlane, and right-outlane drains with open apron mouths, registered outlane switches, return guides, inlanes, and a contained shooter lane;
- 13 continuous rail paths, 18 posts, 4 rubber guides, 2 slingshots, 2 flippers, 2 pop bumpers, the apron, drain area, and trough proxy;
- 7 ball paths: jump ramp, left clear return, Pikachu ramp, Poke Ball ramp, main four-wire return, its attached elevated side branch, and shooter-lane guide, plus the left and right orbits;
- 20 target areas covering BATTLE, Team Rocket, Berry, Psyduck, lower banks, arena, spinner, and captive/Newton-ball positions;
- Town right-eject VUK, Poke Ball hold, closed captive-ball enclosure with a retained ball, three one-way gates, and two functional ramp posts; and
- low, noncollidable envelopes for Meowth, Pikachu, Poke Ball, and the Town billboard, plus reusable detailed meshes for 18 guide posts and 2 pop-bumper caps. Mesh appearance is separated from native VPX collision bodies.
The first lower-playfield pass had two confirmed defects: apron walls closed the outlane drain mouths, and the right guide post pinched a standard VPX ball against the shooter wall. The current geometry leaves both drain mouths open and places the right post on the inner guide with verified ball clearance.
The first served-ball pass also left the ball locked in the enabled
BallRelease cup, so a moving plunger could not affect it. The current script
disables that capture cup immediately after release, the served ball seats 20
VPX units ahead of the resting plunger face, and the shooter guide is a
noncollidable visual guide over the playfield rather than an artificial ramp
surface. The containing shooter walls extend behind the full plunger stroke.
The next shooter pass found two additional confirmed faults. First, the
33-source-pixel shooter channel and thick collision walls left only a few VPX
units of side clearance around a 50-unit ball, causing severe rail scrub.
Second, the right wire-ramp side part was incorrectly modeled as a second
playfield-level return. Its low duplicate landing crossed the shooter path at
approximately source y=700. Manual page 41 identifies parts 515-1094-00 and
515-1094-01 as the main and attached side wire ramps. The side geometry now
merges into the elevated main return at source (382,530), the shooter channel
retains at least 18 VPX units of validated free-running clearance, and a
full-pull plunger speed of 150 reaches the main-playfield checkpoint. The live
trace reached VPX y=1321.1 and logged plunger launch entered main playfield.
The base collision layer was then rebuilt rather than patched. The old
generator emitted one closed rectangle for every centerline segment, yielding
39 independent wall objects with overlapping square ends and internal contact
faces at bends. The replacement buffers each complete centerline into one
rounded polygon. Connected evidence paths were consolidated before buffering:
five cabinet/back pieces became one U-shaped perimeter, the shooter sides and
stop became one U-channel, and the Town VUK back/right walls became one L-shaped
perimeter. Runtime collision walls are invisible and visual rails are separate,
non-colliding copies. qa/collision-topology.json records polygon vertex count,
winding, area, and intersection count; qa/collision-validation.json enforces
13 collision objects, 13 visual objects, zero old segment objects, and zero
self-intersections. Live plunger and mechanism tests passed after this rebuild.
Construction layers and mechanical assets
emulation/vpx/layer-map.json defines 16 stable editor layers: base playfield,
cabinet/apron, hidden collision rails, visual guides, mounted hardware, targets, plastics/proxies,
flat ramps, wireforms, toys/models, switches/sensors, feature lamps,
GI/flashers, coil markers, script controllers, and QA. Collision, electrical,
script, and QA layers are hidden by default. This separates construction level from
electrical/debug overlays without changing runtime names.
The Pinball Makers Files Section was reviewed as a source of comparable
mechanical references. It warns that community files are untested. Three
original private-development references are preserved under
emulation/vpx/assets/cad-reference/: star post PL-00172-OT, faceted post
C-11561-20, and WPC pop-bumper assembly B-9414. Because the files are
SolidWorks documents and no reliable local SolidWorks importer is available,
the embedded OBJ assets are new Blender reconstructions rather than converted
upstream geometry. Hashes, source URL, and the CC BY-NC-SA/noncommercial
boundary are recorded in emulation/vpx/assets/README.md.
The hardware layer retains 45 playfield switches, 11 mechanism/trough sensors,
13 coil locations, and 113 physical lamps: 73 feature inserts, 10 flashers,
and 30 GI bulbs. SPIKE addresses remain attached to stable names such as
sw_right_eject, sw_left_ramp_enter, and lamp_battle_b_lamp. The controller
plugin mapping is generated directly from these manifest records.
Five local extracted images are embedded as noncolliding Pikachu, Meowth, Psyduck, Eevee, and Poké Ball decals on replaceable proxy toys/plastics. The registered overhead photograph remains the playfield texture. These images, the photograph, reference manual, and game content are private-use evidence and must be excluded from a redistributable VPX package.
Standalone and integrated behavior
The table-side VBS is self-contained. 1 starts or serves, left/right Shift
operate the flippers, holding Return pulls the plunger, releasing Return fires
it, and Escape exits. Pops and
slings use VPX physics; switch hits are logged and pulse corresponding lamps;
ramp posts operate; Town and Poke Ball kickers capture and eject; the captive
ball is loaded at initialization; and all three drains destroy and re-serve a
test ball. A watchdog also recovers a play ball lost outside a legal drain.
In spike3, all physical switch make/break states and debounced contacts go to
the pinned native controller plugin. QEMU is authoritative for every lamp and
driver action. Flippers, slings, pops, ejects, trough release, auto-launch,
posts, gate, and Meowth therefore do not animate speculatively. If the plugin
or bridge is absent, the table de-energizes mechanisms and does not silently
fall back. Standalone remains independent and explicitly selectable.
qa-spike3 waits for synchronization and a short game-settle period, sends
coin and Start, samples 32 alternating left/right press-release cycles through
the real QEMU driver path, then sends action. Six-field driver records preserve
both server-output-to-VPX and matching input-to-VPX drain latency.
Confidence boundary and next work
Top-down placement and hardware marker counts are evidence-backed. Ramp heights, clearances, and several hidden collision envelopes are still labeled as comparable-Stern estimates; no art, script, model, or game-specific geometry was copied from the comparison table.
The assembled file, initialization, manual-plunger launch onto the main playfield, all three drains, both outlane switch/drain paths, Town VUK, Poké Ball hold, captive-ball load, QEMU-authoritative sling release, mapped mechanism actions, private playfield texture, and short inventory soak are live-tested in VPX. A combined QEMU+VPX run is separately required to prove the genuine game's progression and timing.
Full physical traversal of every elevated ramp/orbit, the 60-minute soak, normal three-ball completion, multiball, and direct physical Z/force measurement remain follow-up acceptance. The current mechanical meshes are comparable parts and decal-backed proxies, not measured Pokémon-specific assemblies. QEMU supplies scoring, display, speech, music, and game effects; VPX supplies only table physics and mechanical sounds.