docs: GAUGE_COMPOSITE Phase 3 — aggregate bank + condenser valve gauge DONE

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-07 20:30:28 -05:00
co-authored by Claude Opus 4.8
parent aae3ce29d8
commit d54e0009d7
+21 -8
View File
@@ -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