Mech milestone: foundational layout analysis + proxy-layer resolution

Begins the Mech reconstruction milestone (analysis phase). Extends the existing
MECH-LAYOUT.md worksheet with the findings needed to build MECH.HPP + the ctor:

- Resolved the BT411 mechrecon.hpp proxy layer to real 1995 types (ReconAlarm ->
  AlarmIndicator, ReconSeq -> SequenceController, ReconFiltered -> AverageOf<
  Scalar>/NameFilter, ReconChain -> ChainOf, ReconMatrix -> AffineMatrix;
  StateIndicator/Reticle survive as-is; BTVal mostly base-class pose fields).
- CRITICAL: AlarmIndicator, SequenceController, NameFilter, AverageOf are ALSO
  absent from the 4.10 archive -- additional helper classes the milestone must
  reconstruct first (their sizes set the embedded-member offsets).
- Subsystem source availability mapped: full (GAUSS/PPC/SENSOR), .TCP partials
  (AMMOBIN/EMITTER/GNRATOR/HEAT/MISSILE/PROJTILE/PROJWEAP), decomp-only (rest).
- Key tractability insight: StateIndicator is fixed-size (level count stored, not
  arrayed), so a FUNCTIONAL fresh build needs only the right member set/types in
  order -- byte-exact offset matching is a later refinement for network wire
  format, not required to boot.
- Revised reconstruction order: helpers -> MechSubsystem+roster -> finalize
  MECH.HPP (probe sizeof==0x854) -> ctor+segment walk -> per-frame path.

Everything below the Mech ctor runs real reconstructed code; the ctor is the
live frontier (spawn factory validated last commit).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-19 20:40:43 -05:00
co-authored by Claude Fable 5
parent e610a2a3aa
commit f3668d6dbf
+54
View File
@@ -64,3 +64,57 @@ binary alloc size is WRONG and must be fixed before use.
2. Untangle the three offset CONFLICTs above (decomp reads). 2. Untangle the three offset CONFLICTs above (decomp reads).
3. Write the first staged MECH.HPP (interface + mapped runs + reserved[] filler) and 3. Write the first staged MECH.HPP (interface + mapped runs + reserved[] filler) and
compile-verify sizeof(Mech)==0x854 with the probe. compile-verify sizeof(Mech)==0x854 with the probe.
---
## ADDENDUM 2026-07-19 (later) — spawn factory reached the Mech ctor; proxy layer resolved
The boot ladder now runs the full spawn factory (CreatePlayerVehicle -> Mech::MakeMessage ->
MakeAndLinkViewpointEntity -> registry -> Mech::Make -> `new Mech` -> JointedMover base
streams the model) and halts at the Mech ctor. So the ctor is the live frontier and this
worksheet is the active blocker.
### Proxy layer resolved (BT411 mechrecon.hpp -> real 1995 types)
Settles the open item in the "Real 1995 types" bullet above:
| BT411 alias | real type | in 4.10 archive? |
|---|---|---|
| ReconAlarm (AlarmIndicator) | AlarmIndicator (multi-level, N levels sets size) | ❌ MISSING |
| ReconSeq | SequenceController (animation sequence) | ❌ MISSING |
| ReconFiltered / FilteredScalar | AverageOf<Scalar> (15-sample running avg) | ❌ MISSING |
| ReconFiltered (mechNameFilter) | NameFilter | ❌ MISSING |
| ReconChain<Subsystem*> | ChainOf<Subsystem*> | ✅ CHAIN.HPP |
| ReconMatrix / Matrix34 | AffineMatrix / Matrix | ✅ |
| StateIndicator | StateIndicator | ✅ STATE.HPP |
| Reticle | Reticle | ✅ RETICLE.HPP |
| BTVal (turretBase, mechName, torsoAim*, aimRate, headPitch, torsoTwist) | animated value/quaternion — **UNIDENTIFIED**; BT411 BTVal is a no-op placeholder. Most BTVal members are < 0x328 = BASE-class pose fields (re-attribute per §"Consequences"), so their type is a base concern, not Mech's. |
### CRITICAL new finding — embedded helper classes are ALSO missing
`AlarmIndicator`, `SequenceController`, `NameFilter`, `AverageOf` do **not** exist anywhere in
the 4.10 CODE archive (confirmed by full-tree grep). They are additional helper classes the
milestone must reconstruct, and their sizes set the embedded-member offsets — so the
`masterAlarm@0x39C`/`heatAlarm@0x450`/`stabilityAlarm@0x4C4`/`statusAlarm@0x714` spacing
DERIVES the AlarmIndicator per-level size (e.g. masterAlarm 33 levels spans 0x39C..0x450 =
0xB4; heatAlarm 3 levels spans 0x450..0x4C4 = 0x74 — a fixed header + N-level array; solve
the two equations for header size + per-level stride). Same method sizes AverageOf from
telemetryFilter[5]@0x7E0..0x81C (0x3C/5 = 0xC each) and SequenceController from the
legAnimation/bodyAnimation spacing.
### Subsystem roster source availability (VDATA 0xBxx ClassIDs)
- Full .CPP/.HPP in 4.10: **GAUSS, PPC, SENSOR**
- .TCP partial survivors (authoritative where present): **AMMOBIN, EMITTER, GNRATOR, HEAT,
MISSILE, PROJTILE, PROJWEAP**
- Decomp-only (BT411): MechSubsystem base, gyro, torso, hud, myomers, mechweap, mislanch,
powersub, + the rest of the "917 missing functions".
### Revised reconstruction order
1. **Helper classes** (block the layout): AlarmIndicator, SequenceController, NameFilter,
AverageOf<Scalar> — sizes solved from the offset-spacing equations above; identify BTVal.
2. **MechSubsystem base + roster** (GAUSS/PPC/SENSOR + .TCP partials + decomp).
3. **Finalize MECH.HPP** per the offset map; probe sizeof(Mech)==0x854.
4. **Mech ctor** (@004a1674): embedded construction + segment-table walk.
5. Per-frame path (mech2/3/4) + damage/weapon handlers.