diff --git a/engine/MUNGA_L4/L4CTRL.cpp b/engine/MUNGA_L4/L4CTRL.cpp index 5540b95..491f82e 100644 --- a/engine/MUNGA_L4/L4CTRL.cpp +++ b/engine/MUNGA_L4/L4CTRL.cpp @@ -2631,16 +2631,21 @@ void //---------------------------------------- buttonActivateModeMask[rio_event.Data.Unit] = mode_mask; - // THE ENG-PAGE EJECT KEY [T3 intent-completion, #118]: side keys - // 0x0B/0x23/0x03 are the eng-page EJECT position (engEject lamp 0x85 - // = kBTEngBankTop-4; the streamed weapon pages route the same key to - // EjectAmmo). Eject was UNFINISHED in the 4.10 binary (the armed - // mode never rose), so the generator-page press has no authored - // route; complete the intent here IN THE DRAIN (game thread -- - // mode_mask in hand; a first cut queried the mode manager from the - // window-click thread and crashed on the unbound TU global): while - // PANIC is armed AND that bank shows an ENG page, forward the press - // as a pilot-keypad key -- the binary's one armed eject binding. + // THE ENG-PAGE EJECT KEY [T3 PORT CONVENIENCE -- a marked DEVIATION, + // #118]: side keys 0x0B/0x23/0x03 are the eng-page EJECT position + // (engEject lamp 0x85 = kBTEngBankTop-4). IN THE BINARY these soft + // keys NEVER pilot-eject: every page routes them to a real authored + // function (weapon pages: EjectAmmo 0xB; myomer pages: seek toggle 9; + // the streamed .CTL dump has no 0x200000 records), and the flashing + // engEject lamp is the INVITE -- the 1995 press was the pilot KEYPAD + // / PANIC key beside it. The pod eject chain itself was LIVE in 4.10 + // (master perf FUN_004a9b5c+0x10 evaluates per frame; an earlier + // "unfinished" note here was wrong). This hook adds the glass-layer + // convenience the operator asked for: while PANIC is armed AND that + // bank shows an ENG page, the flashing key ALSO forwards as a + // pilot-keypad press. Runs in the drain (game thread -- mode_mask + // in hand; a first cut queried the mode manager from the window + // thread and crashed on the unbound TU global). { const int a = rio_event.Data.Unit; unsigned engBits = diff --git a/game/reconstructed/mech.cpp b/game/reconstructed/mech.cpp index c724b7f..41b930c 100644 --- a/game/reconstructed/mech.cpp +++ b/game/reconstructed/mech.cpp @@ -572,10 +572,13 @@ int extern int BTPlayerExperienceSimLive(void *owner_mech); // btplayer.cpp (+0x25c; int noviceSim = (BTPlayerExperienceSimLive(this) == 0); // NULL-player reads LIVE) - // COOLANT-CLAUSE HYSTERESIS [T3 intent-completion, 2026-08-03]: the - // binary's clause is a plain `< 0.05` compare -- but this evaluator was - // DEAD CODE in shipped 4.10 (never called), so the boundary flap was - // never exercised. Live, a bank fraction hovering at 0.05 under fire + // COOLANT-CLAUSE HYSTERESIS [T3 smoothing deviation, 2026-08-03]: the + // binary's clause is a plain `< 0.05` compare, evaluated per frame from + // the master performance (FUN_004a9b5c+0x10 -- the arcade DID run this; + // an earlier "dead code" note here was wrong, corrected same day: the + // absolute-pointer scan missed the E8-relative call). A bank fraction + // hovering exactly at the threshold is a degenerate oscillation the pod + // plausibly never sat in (leaks drain THROUGH the boundary); live under // flips the panic-arm mode EVERY FRAME (observed: hundreds of ON/off // pairs), churning the mode mask, the lamp, and the arm audio cue into a // ~10 Hz stutter tick. The engine's own idiom for exactly this is the diff --git a/scratchpad/SESSION_HANDOFF_20260803.md b/scratchpad/SESSION_HANDOFF_20260803.md index f84b939..75a679b 100644 --- a/scratchpad/SESSION_HANDOFF_20260803.md +++ b/scratchpad/SESSION_HANDOFF_20260803.md @@ -75,8 +75,17 @@ open-questions (i860 DIV-CARD firmware ask). = ejectPermitted; review mode = GLOBAL DAT_004fd550). - EjectPilot @0049f854 confirmed via the image message table ('EjectPilot' id 0x19); DuckRequest = id 0x1a @0049fa00 (mech+0x398 latch, NO reader — vestigial). -- KEY FINDING: **eject was UNFINISHED in shipped 4.10** — the evaluator had zero - callers/pointers until the master-perf call was restored; the arcade never armed. +- ⚠ CORRECTED (same night): an earlier "eject was UNFINISHED/dead code in 4.10" + claim was WRONG — the absolute-pointer scan missed the E8-relative call; the + master perf (FUN_004a9b5c+0x10) evaluates per frame, so the ARCADE's eject was + LIVE. Only the PORT was missing the call (our PerformAndWatch recon predated + knowing the export-hole fn's contents). Swept from code comments same night. +- THE PRESS MODEL [settled]: pilot eject = the PILOT KEYPAD bank while armed + (+ the PANIC key, which reports through that matrix). The MFD soft keys NEVER + pilot-eject in the binary — every page routes them to authored functions + (weapon eng: EjectAmmo; myomer eng: seek toggle) — the flashing engEject cell + is the INVITE LAMP. Our page-gated eng-key eject is a MARKED PORT CONVENIENCE + (deviation), operator-requested; drop it if strictness wins. - Inputs, all live: Panic button (0x3D→pilot-keypad wire), NUMPAD = pilot keypad (CONTROLS.MAP `keypad pilot` bindings), Backspace/pad action, and the eng-page EJECT key (0x0B/0x23/0x03) page-gated in the RIO drain [T3 intent-completion].