Start each ball at the recovered right-lane coordinates and charge the plunger while Down is held, firing only on release. Render all eleven frames of resource 901, preserve object 25 as the returning-ball catch, and use the object table's center-contact extents without adding the art radius twice. Test Plan: - cargo fmt --all -- --check - cargo test - cargo clippy --all-targets --all-features -- -D warnings - runtime smoke: start, hold Down, release, and inspect the right shooter lane
72 lines
5.3 KiB
Markdown
72 lines
5.3 KiB
Markdown
# Reconstruction ledger
|
|
|
|
## Source artifacts
|
|
|
|
The reconstruction was derived from the preserved files under `../original/`.
|
|
The primary program fingerprint is:
|
|
|
|
```text
|
|
a9022f1894e3e6e21fc42e8f6c932f7c549ca77f63aaa0c488bb9d55d9d0174c TDKPIN.EXE
|
|
f1d9ac980c7bfba5dc53eaa9e7cb2c3cd9b82f879ee8962ad40bf863d641bb49 MMTIMER.DLL
|
|
```
|
|
|
|
The Ghidra recovery covers all 301 named NE exports plus 62 internal function
|
|
entries. Its raw output and coverage tables remain beside the binary, so later
|
|
work can be checked against the same evidence rather than against this Rust
|
|
implementation.
|
|
|
|
## Coverage by subsystem
|
|
|
|
| Subsystem | Rust status | Evidence and boundary |
|
|
| --- | --- | --- |
|
|
| Artwork | Exact | All 34 custom DIB images, three standard bitmaps, icon, and palette derivatives are preserved in `assets/original/`. The game uses the original 640x460 table, loading, help, ball, wheel, robot, plunger, media, and diamond frames. |
|
|
| Audio | Exact samples | All 16 mono PCM WAV resources are embedded unchanged. Their trigger roles were recovered from resource use and gameplay context. |
|
|
| Help and languages | Exact | Original resource images 1001-1005 are displayed directly. |
|
|
| Playfield collision layout | Recovered | All 109 active type-2 line objects and 40 static active type-1 circles are transcribed from the original 175-object registration table. The registration routine converts its sideways inputs with `screen = (y, x - 20)` and accumulates explicitly relative objects. Its circle sizes are complete center-contact extents, so the rendered ball radius is not added a second time. Object 174 is omitted because the original overwrites it with the live ball every frame. Moving flippers use equivalent native Rust bodies. |
|
|
| Ball launcher | Recovered | The initial 32-bit fixed-point coordinates decode to `(325, 413)` in the right shooter lane. Scan code `0x50` compresses the eleven frames in resource 901 while Down is held; the key-release routine activates the ball with the accumulated vertical launch velocity. |
|
|
| Physics arithmetic | Reimplemented | The Win16 fixed-point/timer engine is replaced by deterministic fixed-step floating-point integration. Restitution and impulses are tuned to the recovered table but are not instruction-for-instruction equivalents. |
|
|
| Rules | Behaviorally recovered | Player count, controls, wheel holes, magnetic saves, robot grip, four-position ball lock, target banks, increasing bumper value, nine-part TDK diamond, permanent double scoring for a completed diamond, KByte media progression, and media extra balls follow the original help and code paths. |
|
|
| Numeric scoring | Partly inferred | Visible 2000-6000 target values and recovered registration values are preserved. Some bumper, bank-completion, robot, wheel, lock, and media thresholds are best-evidence reconstructions because the decompiler did not recover meaningful names or a clean rule table. |
|
|
| High scores | Compatible import | The original 276-byte table is decoded as ten `IWIK`-XOR-obfuscated little-endian scores plus ten 22-byte names, sorted, then migrated to portable JSON. |
|
|
| Configuration | Behaviorally compatible | Sound, language, and five detail levels are retained. Storage moves from a local Win16 INI file to the platform user-data directory. |
|
|
| Windows UI shell | Deliberately modernized | Win16 menus, modal dialogs, GDI blitting, and multimedia timers are replaced by an aspect-correct 960x690 native window with keyboard overlays. The visible game and original help remain at 640x460 logical pixels. |
|
|
|
|
## Extracted asset inventory
|
|
|
|
`assets/original/` contains 69 files used or preserved by the modern project:
|
|
|
|
- 40 image files, including all gameplay frames and five localized help pages;
|
|
- 16 original WAV resources;
|
|
- six decoded dialog descriptions;
|
|
- the original icon in ICO and PNG form;
|
|
- palette and version metadata;
|
|
- the original high-score table and INI configuration sample.
|
|
|
|
The parent `original/assets/` directory remains the lossless extraction record,
|
|
including raw resource blobs and the extraction manifest. The Rust copy is the
|
|
decoded, build-ready subset; it does not replace that evidence archive.
|
|
|
|
## Validation levels
|
|
|
|
- Static coverage: all intended decoded visual/audio resources are preserved;
|
|
the recovered static collision layout is represented in Rust.
|
|
- Build coverage: `cargo check`, unit tests, and strict Clippy complete on the
|
|
host. Cross-target checks pass for `x86_64-pc-windows-gnu` and
|
|
`x86_64-apple-darwin`; CI is configured to build and test natively on Linux,
|
|
macOS, and Windows.
|
|
- Runtime coverage: the Linux executable was launched through the real window
|
|
backend, the attract screen was inspected, a game was started, a ball was
|
|
launched, collision scoring was observed, and a rendered frame was captured.
|
|
- Semantic boundary: no claim is made that every trajectory or score tick is
|
|
bit-identical to the 16-bit executable. Remaining numeric inference is listed
|
|
above instead of being presented as proven parity.
|
|
|
|
## Architecture
|
|
|
|
- `app.rs`: screen flow, controls, rendering, audio dispatch, and overlays;
|
|
- `assets.rs`: compile-time original asset embedding;
|
|
- `game.rs`: fixed-step game state, recovered walls, rules, and scoring;
|
|
- `geometry.rs`: segment/circle collision primitives;
|
|
- `table.rs`: source-traceable collision objects recovered from the Win16 table;
|
|
- `persistence.rs`: platform paths, settings, high scores, and legacy import.
|