--- id: subsystems title: "Subsystems — the factory + the reconstruction waves" status: established source_sections: "PROGRESS_LOG.md §10d; docs/SUBSYS_PLAN.md; docs/VEHICLE_SUBSYSTEMS.md; docs/RESOURCE_AUDIT.md" related_topics: [decomp-reference, reconstruction-gotchas, combat-damage, gauges-hud] key_terms: [subsystem, factory, ClassID, subsystem-roster, PoweredSubsystem, bridge] open_questions: - "Gyroscope (0xBC4) integrator; Myomers coupling (gates on owning-player @mech+0x190); 0xBD3 damage-hub untangle (WAVE 8)" --- # Subsystems The mech's components (heat/power/weapons/sensor/gyro/torso/myomers/…), built by the Mech-ctor factory. Full per-family plan: `docs/SUBSYS_PLAN.md`; the engineering-cluster panels: `docs/VEHICLE_SUBSYSTEMS.md`; the layout audit: `docs/RESOURCE_AUDIT.md`. ClassID map: [[decomp-reference]] §2. ## The factory The Mech ctor switches on the resource ClassID to build each subsystem into the [[subsystem-roster]] (`subsystemArray@0x128`). **The `case ClassID` LABELS are systematically MISLABELED** — the real class is the `// FUN_004xxxxx` ctor-address comment reconciled via `CLASSMAP.md`, not the case name (e.g. 0xBBE case="Sensor" is actually AggregateHeatSink). Each real class is wired via a `CreateSubsystem(Mech*,int,void*)` **bridge** in the class's own `.cpp` (do NOT `#include` the real subsystem headers into mech.cpp — the local stubs collide). Keep the alloc SIZE + special-cache. [T2] ## Class hierarchy (two branches, shared only at MechSubsystem) - **Heat leaf:** `PoweredSubsystem : HeatSink : HeatableSubsystem : MechSubsystem`. Emitter/PPC/ Sensor/Myomers/ProjectileWeapon/MissileLauncher/GaussRifle chain here. Uses 0xC `SubsystemConnection` + 0x54 `GaugeAlarm54` (alarm level at +0x14). [T1] - **Watcher branch:** `Torso/Gyroscope/Searchlight/ThermalSight/HUD : PowerWatcher : HeatWatcher : MechSubsystem`; `AmmoBin : HeatWatcher`. Uses a 0xC `WatchedConnection` + 0x54 `WatcherGaugeAlarm`. [T1] Making a base byte-exact GROWS every subclass — they must be re-based TOGETHER in one build, each `static_assert`-locked (the P7 alarm-unification: HeatSink 0x1D0 → PoweredSubsystem 0x31C → MechWeapon 0x3F0 → Emitter 0x478). [T2] ## Reconstruction waves (state: ~18-19 of 20 factory cases wired to real classes) - **WAVE 1** — HeatableSubsystem re-based onto MechSubsystem (de-shadow cascade). - **WAVE 2** — heat family (Condenser/AggregateHeatSink/Reservoir) + HUD + MechTech (un-swap). - **WAVE 3** — power bus (Generator/PoweredSubsystem) + Emitter/PPC fire-path (end-to-end fire; heat conducts to the central sink via the linked-sink roster). - **WAVE 4** — standalone readouts: Sensor/Searchlight/ThermalSight/AmmoBin (de-shim, gate fixes). - **WAVE 5** — Torso (aim twist/elevation; joint-I/O reconstructed; the BLH record disables torso → faithfully no visible twist). - **WAVE 6** — Myomers (mover-coupled; structural un-stub is INERT — no live mover/heat coupling). - **WAVE 7** — projectile/missile weapons (byte-exact; flying projectiles are a PORT reconstruction — the 2007 Entity is 0x1BC vs the binary's 0x300, so raw base-offset reads fail). - **DEFERRED** — Gyroscope 0xBC4 (NaN integrator); SubsystemMessageManager 0xBD3 (WAVE 8 — a **damage/explosion consolidation hub** cached to `Mech[0x10d]`=0x434; recon MISLABELS the slot `controlsMapper` + the drive squats there while the real mapper is roster slot 0, so wiring it needs an untangle. NOT the valve/advanced-damage gate — that's the owning **BTPlayer** @mech+0x190, see [[combat-damage]]/[[open-questions]]). [T2] ## The four systemic checks (every subsystem) See [[reconstruction-gotchas]]: (1) shadowing (re-declared engine-base fields), (2) the `Wword` trap, (3) message-handler chaining, (4) entity validity. Plus resource-struct layout (must mirror the class hierarchy, byte-exact — the RESOURCE_AUDIT found 8 bugs) and object-layout (alias/phantom/interior fields). A `+0x128`-style owner offset is the ROSTER, not the segment table (the heat-link type confusion that caused a heap-corruption via OOB `ConductHeat` writes). [T2] ## Engineering cluster panels (`vehicleSubSystems`) Not a widget — a per-subsystem FACTORY (`FUN_004cbaf0`) building a status CLUSTER onto one of 12 aux MFD positions, dispatching on classID → HeatSinkCluster/MyomerCluster/EnergyWeaponCluster/ BallisticWeaponCluster. Reads `PoweredSubsystem::auxScreenNumber/Placement/Label` (res +0x104/8/C) via the `BTGetSubsystemAuxScreen` bridge. See `docs/VEHICLE_SUBSYSTEMS.md` + [[gauges-hud]]. [T2] ## Key Relationships - Data: [[decomp-reference]] (ClassIDs/hierarchy). Bugs: [[reconstruction-gotchas]]. - Feeds: [[combat-damage]] (weapons/damage), [[gauges-hud]] (attribute state). - Plan: `docs/SUBSYS_PLAN.md`.