Audio Phase 4b (AUDIO_FIDELITY F16): the torso-twist servo whir -- Torso

publishes its real attribute table

Recovered the binary Torso attribute table [T1]: dense ids 3..15 from
MechSubsystem::NextAttributeID (HeatWatcher/PowerWatcher publish nothing --
binary parity), all 13 rows land on already-reconstructed members:
RotationOfTorsoVertical/Horizontal @0x1E4/0x1D8, HorizontalLimitRight/Left
@0x1DC/0x1E0, SpeedOfTorsoVertical/Horizontal @0x1EC/0x1E8 (the |rate| the
binary abs's -- our derive already did), StickPosition @0x1F0, TorsoUp/Down/
Left/Right/Center @0x1F8..0x208, MotionState @0x20C (statusFlags; the binary
writes 2 on the limit-hit frame -- the authored ==2 matcher is the twist-stop
clunk, settling the audit's [T4] guess).

Torso's AttributeIndex was default-constructed EMPTY -- TorsoTwistInt01/
Ext01/Stop01 were unreachable.  Now the authored chain (pitch -200..+200
cents over twist speed 0.5..0.9, start/stop gate at 0.25, stop clunk on
MotionState==2) drives them unchanged.

Regression (25s): stable; all three bind real; **attrnull count = 0 -- every
authored audio attribute in the game now binds a real member.**

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-16 14:03:38 -05:00
co-authored by Claude Opus 4.8
parent cc2b109cc8
commit 21378ec132
2 changed files with 63 additions and 1 deletions
+35 -1
View File
@@ -143,11 +143,45 @@ Receiver::MessageHandlerSet
Torso::AttributeIndexSet
Torso::AttributeIndex;
// (AUDIO_FIDELITY F16) the real Torso attribute table, binary parity (dense
// ids 3..15 from MechSubsystem::NextAttributeID; offsets are the binary's,
// documented on the members). Un-deadens the torso-twist servo whir:
// TorsoTwistInt01/Ext01 pitch/gate on SpeedOfTorsoHorizontal, the stop clunk
// matches MotionState==2 (the limit-hit frame statusFlags already publishes).
const Torso::IndexEntry
Torso::AttributePointers[]=
{
ATTRIBUTE_ENTRY(Torso, RotationOfTorsoVertical, currentElevation), // 3 @0x1E4
ATTRIBUTE_ENTRY(Torso, RotationOfTorsoHorizontal, currentTwist), // 4 @0x1D8
ATTRIBUTE_ENTRY(Torso, HorizontalLimitRight, horizontalLimitRight), // 5 @0x1DC
ATTRIBUTE_ENTRY(Torso, HorizontalLimitLeft, horizontalLimitLeft), // 6 @0x1E0
ATTRIBUTE_ENTRY(Torso, SpeedOfTorsoVertical, elevationVelocity), // 7 @0x1EC
ATTRIBUTE_ENTRY(Torso, SpeedOfTorsoHorizontal, twistVelocity), // 8 @0x1E8
ATTRIBUTE_ENTRY(Torso, StickPosition, analogTwistAxis), // 9 @0x1F0
ATTRIBUTE_ENTRY(Torso, TorsoUp, elevateUpCommand), // 10 @0x1F8
ATTRIBUTE_ENTRY(Torso, TorsoDown, elevateDownCommand), // 11 @0x1FC
ATTRIBUTE_ENTRY(Torso, TorsoLeft, twistLeftCommand), // 12 @0x200
ATTRIBUTE_ENTRY(Torso, TorsoRight, twistRightCommand), // 13 @0x204
ATTRIBUTE_ENTRY(Torso, TorsoCenter, centerCommand), // 14 @0x208
ATTRIBUTE_ENTRY(Torso, MotionState, statusFlags) // 15 @0x20C
};
Torso::AttributeIndexSet&
Torso::GetAttributeIndex()
{
static Torso::AttributeIndexSet attributeIndex(
ELEMENTS(Torso::AttributePointers),
Torso::AttributePointers,
MechSubsystem::GetAttributeIndex()
);
return attributeIndex;
}
Torso::SharedData
Torso::DefaultData(
&Torso::ClassDerivations,
Torso::MessageHandlers,
Torso::AttributeIndex,
Torso::GetAttributeIndex(),
Torso::StateCount
);
+28
View File
@@ -100,6 +100,34 @@ class Joint; // engine skeleton node (JOINT.h); the twist target
static Receiver::MessageHandlerSet MessageHandlers;
static AttributeIndexSet AttributeIndex;
// (AUDIO_FIDELITY F16) the binary Torso attribute table [T1, rows
// keyed on the SpeedOfTorsoHorizontal string]: dense ids 3..15
// starting at MechSubsystem::NextAttributeID (HeatWatcher/PowerWatcher
// publish nothing -- binary parity). The authored torso-twist servo
// whir reads SpeedOfTorsoHorizontal (scale: pitch over 0.5..0.9 +
// start/stop trigger at 0.25 -- the |yaw rate| the binary abs's) and
// MotionState (match ==2 = limit-hit frame -> the stop clunk).
enum {
RotationOfTorsoVerticalAttributeID = MechSubsystem::NextAttributeID, // 3 @0x1E4 currentElevation
RotationOfTorsoHorizontalAttributeID, // 4 @0x1D8 currentTwist
HorizontalLimitRightAttributeID, // 5 @0x1DC
HorizontalLimitLeftAttributeID, // 6 @0x1E0
SpeedOfTorsoVerticalAttributeID, // 7 @0x1EC elevationVelocity (|rate|)
SpeedOfTorsoHorizontalAttributeID, // 8 @0x1E8 twistVelocity (|rate|)
StickPositionAttributeID, // 9 @0x1F0 analogTwistAxis
TorsoUpAttributeID, // 10 @0x1F8 elevateUpCommand
TorsoDownAttributeID, // 11 @0x1FC elevateDownCommand
TorsoLeftAttributeID, // 12 @0x200 twistLeftCommand
TorsoRightAttributeID, // 13 @0x204 twistRightCommand
TorsoCenterAttributeID, // 14 @0x208 centerCommand
MotionStateAttributeID, // 15 @0x20C statusFlags
NextAttributeID
};
private:
static const IndexEntry AttributePointers[];
public:
static AttributeIndexSet& GetAttributeIndex();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// BT segment / base-state / joint compatibility shims.
//