diff --git a/docs/GAUGE_COMPOSITE.md b/docs/GAUGE_COMPOSITE.md index 04207e2..d67da02 100644 --- a/docs/GAUGE_COMPOSITE.md +++ b/docs/GAUGE_COMPOSITE.md @@ -545,14 +545,27 @@ a prose-only vtable slot AVs on first call). - **TODO (lower priority):** **PrepEngrScreen** (@004c7b30/7bf0/7e48 — engineering full-screen), **SectorDisplay** (@004c9e10/ca07c) + **MessageBoard** (@004cb678), **SeekVoltageGraph::Execute** (@004c6934) + real FindAttributeIndex. -### Phase 3 — SIM/MODEL (TODO) -- **Aggregate HeatSink-bank** (0xBBE; ctor @4ae8d0, sim @4ae73c, parser @4ae9dc — currently #if 0'd in - heatfamily_reslice.cpp, a plain HeatSink built instead): publish HeatSinkCount + AmbientTemperature (a - constant 300); rewire CreateHeatSinkBankSubsystem + bump the alloc. Clears the last config-binding NULL. -- **Condenser valve**: reconstruct SetValveSetting (vtable+0x48 → coolantFlowScale@0x15C) + the real MoveValve - msg-handler @4ae464 (the reconstructed @4afbe0 is MISLABELED = the MechControlsMapper) so a player valve - toggle moves the slider AND changes heat flow. Add the Condenser OWN table (ValveSetting→coolantFlowScale) + - #if 0 the heat.cpp Condenser dup-ctor stubs (the real heatfamily_reslice def currently wins by link order). +### Phase 3 — SIM/MODEL +- ✅ **Aggregate HeatSink-bank** (0xBBE) — DONE (commit 16f5f54). Reconstructed `AggregateHeatSink : HeatSink` + (ctor @4ae8d0, GUID 0x50e590), byte-exact + static_assert-locked (heatSinkCount@0x1D0, ambientTemperature + @0x1D4=300, helper@0x1D8, sizeof 0x1E4). Publishes HeatSinkCount + AmbientTemperature via a dense-prefix + table chained to HeatSink::NextAttributeID. CreateHeatSinkBankSubsystem moved to heatfamily_reslice.cpp, + builds the real class at 0xBBE. **DELIBERATE DEVIATION:** keep the base HeatSinkSimulation; do NOT install + the authentic Performance @4ae73c (it derefs a raw self+0xE0→[+0x158] that doesn't map in our layout → + AV/NaN for EVERY mech; ambientTemperature is a frozen constant so the gauge reads 300 either way). Clears + the LAST config-binding NULL: **`[attr] HeatSink/AmbientTemperature OK`, all 50 bindings resolve (0 NULL).** +- ✅ **Condenser valve gauge** — DONE (commits b91057a, aae3ce2). Two coupled fixes: + (1) **Dedup** — heat.cpp's STUB Condenser ctor/dtor/TestClass/TestInstance/CreateStreamedSubsystem + ODR-duplicated the REAL reslice bodies and WON under /FORCE → the real ctor (valveState=1) was shadowed, + valveState=0xCDCDCDCD. #if 0'd the heat.cpp stubs (kept DefaultData/GetClassDerivations/ResetToInitialState). + (2) **RecomputeCondenserValves** (FUN_0049f788) — `FinishConstruction()` at the Mech ctor tail was a no-op + stub → coolantFlowScale never written (stayed 0). Reconstructed it (coolantFlowScale_i = valveState_i / + ΣvalveState + condenserAlarm change-pulse), wired at the ctor post-init pass. **Verified: [valve] the BLH's + 6 condensers each read flow=0.166667 (=1/6).** ValveSetting→coolantFlowScale now authentic. + (3) **MoveValve** — the reconstructed @4afbe0 body was a MISLABEL (MechControlsMapper mode cycler); + disassembled the real handler @4ae464 (valveState cycle 1→5→50→0 + RecomputeCondenserValves) and replaced + it. DORMANT: its guard + message route go through the 0xBD3 SubsystemMessageManager (WAVE 8) → the valve + gauge shows the static authentic 1/N until 0xBD3 lands (no V-key bring-up stand-in added). - ✅ **Combat SCORING feed** (KILLS/SCORE) — DONE (commit 34aaa7d; scoring-feed-decode workflow). The scoreboard read 0 for 4 reasons (none was handler logic — the ScoreMessage/VehicleDead/ScoreInflicted handlers were already reconstructed): (1) no producer — added the posts (per-hit ScoreInflicted at the