fix(input): preserve Win16 flipper key latches

Normal ball-end handling keeps the original flipper key bytes and geometry
unless the current player has finished. Rust instead reset both flippers on
every drain, skipped the normal WAVE 2021 release edge, and treated a key still
held after Tilt as a fresh press once Tilt cleared.

Preserve flipper state across ordinary drains. Tilt and a player's final ball
now clear only the key flags, let the timer epilogue lower raised geometry, and
latch each physical key until key-up before accepting another press. This
matches the original WM_KEYDOWN/WM_KEYUP lifetime while retaining modern
per-frame input sampling.

Test Plan:
- `cargo test --workspace --all-targets --all-features` -- 119 passed
- `cargo clippy --workspace --all-targets --all-features -- -D warnings` -- passed
- `rumdl check --flavor commonmark RECONSTRUCTION.md CHANGELOG.md` -- passed
- `git diff --cached --check` -- passed
This commit is contained in:
2026-08-23 20:04:07 +02:00
parent 25019514c7
commit 3859498172
3 changed files with 73 additions and 7 deletions
+4
View File
@@ -147,6 +147,10 @@ and this project adheres to
Left-Shift, keypad-3, and Space formulas using scalar 15, the shared Borland
random stream, 32-bit velocity wrapping, and the decaying 16-bit `+25` tilt
counter with its randomized `30..39` threshold.
- Preserve held flipper keys and raised geometry across ordinary drains. Tilt
and a player's final ball now clear the key latch, release a raised flipper
through its normal WAVE 2021 timer edge, and require physical key-up before
the same key can raise it again.
- Replace the Xorshift gameplay RNG with the original Borland linear stream and
unbiased `Random(n)` high-word mapping. Launcher variation, effect selection,
claw terminals, and magnetic-field impulses now share the recovered sequence.