diff --git a/engine/MUNGA/GAUGREND.cpp b/engine/MUNGA/GAUGREND.cpp index 56eaf30..bc507bc 100644 --- a/engine/MUNGA/GAUGREND.cpp +++ b/engine/MUNGA/GAUGREND.cpp @@ -3702,8 +3702,19 @@ void // like the pod -- and the working SetPresetMode page switching NEEDS the // authentic gating (the force made every eng screen paint over the shared // Eng plane, pinning it on the highest screen and ignoring page flips). + // (BT411 #155, 2026-08-14) READ OUR OWN LAST-FRAME MASK, not the mode + // manager's previousModeMask: that cell is a shared scratch overwritten by + // EVERY Add/RemoveModeMask call, and the authentic panic-arm chatter (the + // no-hysteresis eject evaluator) writes it per frame -- stomping the page + // bits out of this XOR before we sample it. Result in the field: MFD page + // EXITS went dead while PANIC flickered (first entries still worked via + // !alreadyActivatedFlag), radar/score/coolant stayed live (always-active). + // The renderer already maintains its own previousModeMask member (updated + // below at the activate/deactivate guard); sampling it here makes the + // change mask accumulate everything since the LAST RENDER FRAME, correct + // under any number of mode writers. Single-transition frames: identical. ModeMask - previous_mode_mask = application->GetModeManager()->GetPreviousModeMask(); + previous_mode_mask = previousModeMask; ModeMask change_mode_mask = current_mode_mask ^ previous_mode_mask; // xor tells me what has changed //-------------------------------------------------------------------