The BT keyframe-animation player embedded in the Mech as legAnimation/ bodyAnimation. Struct field layout (from BT411's binary-offset map), default ctor, dtor, and Init(Mech*) reconstructed and compile-verified; Init is ctor-time (Mech ctor calls legAnimation.Init(this)/bodyAnimation.Init(this)) so it's real (binds owner + caches owner->GetJointSubsystem()). The per-frame gait engine (SelectSequence/Advance/Reset) is staged with Fail bodies -- it fires only once the mech is ticking, past the current ctor frontier. BT stage 23 ok; full tree still links clean. Evidence + real/staged split in SEQCTL.NOTES.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
42 lines
2.1 KiB
Markdown
42 lines
2.1 KiB
Markdown
# SEQCTL.HPP / .CPP — reconstruction notes
|
|
|
|
**Status: struct + ctor/dtor + Init RECONSTRUCTED (compile-verified); the
|
|
per-frame playback methods (SelectSequence / Advance / Reset) staged. Helper
|
|
2/3 of the Mech embedded helpers ([[MECH-LAYOUT]] step 1).**
|
|
|
|
`SequenceController` — the BT keyframe-animation player embedded in the Mech as
|
|
`legAnimation` (@0x65c) and `bodyAnimation` (@0x6bc). Plays a gait clip: walks
|
|
keyframes, interpolates each animated joint's rotation, writes it through the
|
|
joint subsystem, returns the root-translation distance advanced. Absent from the
|
|
4.10 archive and the RP engine; reconstructed from the shipped binary + BT411's
|
|
seqctl.cpp decomp.
|
|
|
|
## What's real vs staged
|
|
|
|
- **Real (ctor-time):** default ctor (zeroes all fields) and `Init(Mech*)` — the
|
|
Mech ctor calls `legAnimation.Init(this)` / `bodyAnimation.Init(this)`
|
|
(binary; BT411 mech.cpp:685-686), so Init must run at construction. Init binds
|
|
`owner` and caches `jointSubsystem = owner->GetJointSubsystem()`
|
|
(JMOVER.HPP:104, returns `JointSubsystem*`), `clipResource = NULL`.
|
|
- **Staged (per-frame, after boot):** `SelectSequence` (@004277a8, clip parse +
|
|
resource lock), `Advance` (@0042790c, keyframe interpolation + joint writes —
|
|
the gait engine, ~145 lines in the decomp), `Reset` (@004283b8). These fire
|
|
only once the mech is ticking, well past the current ctor frontier, so they
|
|
Fail loudly until reconstructed.
|
|
|
|
## Field layout
|
|
|
|
Field set + order from BT411's binary-offset map (keyframeCount +0x14 …
|
|
callbackArg3 +0x50). Byte-exact offsets are not required for the functional
|
|
build (only wire/update-record layout needs that, and SequenceController is not
|
|
serialised) — the members are declared as named fields and BC4.52 lays them out;
|
|
the Mech's legAnimation/bodyAnimation slots size to `sizeof(SequenceController)`
|
|
self-consistently.
|
|
|
|
## Placement
|
|
|
|
1995 filename unknown (decomp-only; BT411 used seqctl.cpp). Filed as
|
|
BT/SEQCTL.HPP + SEQCTL.CPP. Not in the authentic BT.MAK member list, so the
|
|
build appends seqctl.obj to bt.lib via the extra-objs fallback (order is
|
|
immaterial — no static init).
|