First of the 3 missing Mech embedded-helper classes. AlarmIndicator is the multi-level status indicator the Mech carries four of (master/heat/stability/ status). Reconstructed as a StateIndicator subclass: the shipped ctor (@0041b9ec) is byte-for-byte the surviving StateIndicator(unsigned) ctor (stateCount=oldState=currentState=count; 3 watcher sockets NULL) with a distinct vtable, so a derived class reproduces it exactly and adds the level API (SetLevel/GetLevel/GetLevelCount -> SetState/GetState/stateCount). Header-only (StateIndicator's methods are in SIMULATE.CPP, already in munga.lib). Compile-verified standalone under BC4.52 with the authentic build flags. Evidence + placement in ALARM.NOTES.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2.0 KiB
ALARM.HPP — reconstruction notes
Status: RECONSTRUCTED, compile-verified under BC4.52. First of the 3 missing Mech embedded-helper classes (MECH-LAYOUT step 1).
AlarmIndicator — the multi-level status indicator the Mech carries four of
(masterAlarm 33 levels, heatAlarm 3, stabilityAlarm 2, statusAlarm 33). Absent
from the 4.10 archive (no ALARM/STATE variant survives it); reconstructed from
the shipped binary + the surviving StateIndicator source.
Evidence
- Ctor decomp
FUN_0041b9ec(this, count)(BT411 reference/decomp part_002.c): base ctor, own vtable&PTR_FUN_004e3440, three watcher sockets initialised at +6/+0xb/+0x10 viaFUN_0041c42c(_, 0), thenthis[3]=this[4]=this[5]=count. - The surviving
StateIndicator::StateIndicator(unsigned max_states)(CODE/RP/ MUNGA/SIMULATE.CPP:62) is byte-for-byte identical:audioWatcherSocket(NULL), videoWatcherSocket(NULL), gaugeWatcherSocket(NULL)thenstateCount = oldState = currentState = max_states.
The only difference is the vtable ⇒ AlarmIndicator is a StateIndicator subclass
(same Node + 3 state words + 3 SChainOf watcher-socket layout, adds no data). A
derived class naturally gets its own vtable, reproducing PTR_FUN_004e3440.
API
The Mech drives the alarms with SetLevel(unsigned) / GetLevel() (and reads
GetLevelCount()). These map to StateIndicator's SetState / GetState /
stateCount — a level IS a state, so a level change notifies the audio/video/
gauge watchers exactly as SetState does. (BT411's ReconAlarm proxy exposed a
raw level member; that was a proxy artifact — the real class stores it as
currentState.)
Placement
The 1995 source filename for AlarmIndicator is unknown (BT411 handled it via the mechrecon.hpp proxy; nothing survives in CODE). Filed as MUNGA/ALARM.HPP; the Mech includes it. StateIndicator's out-of-line methods live in SIMULATE.CPP (already in munga.lib), so no new .CPP is needed — AlarmIndicator is header-only.