BTL4.RES stores each watcher as a (SUBSYSTEM, ATTRIBUTE) string pair, so the complete list can be extracted directly instead of discovering one name per 6-minute run. Banked the extraction method and the full normalised table. Sixth rung climbed: Torso/MotionState (staged member, appended at the end of Torso's own range so no downstream id moves). LocalVelocity and LocalAcceleration turn out to need nothing -- the engine's Mover already publishes them. Also banked, and deliberately NOT acted on: ReportLeak and ConfigureActivePress are base-class attributes inside the pinned range, and chasing them turned up what looks like the authentic attribute layout. The shipped pool gives MechSubsystem 1, HeatableSubsystem 3, HeatSink 6, PoweredSubsystem 5 -- which counted from Subsystem::NextAttributeID=2 lands MechWeapon's real ids on the binary-pinned 0x12 with EXACTLY ONE pad, where our tree needs three. That arithmetic is strong evidence for the original layout, and reconciling to it would replace three guessed pads with the real table. But it moves ids underneath a cockpit currently verified at 98.9% pixel-identical, so it wants a deliberate session with the A/B rig open rather than a bulk edit at the end of a long one. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
171 lines
5.5 KiB
C++
171 lines
5.5 KiB
C++
//===========================================================================//
|
|
// File: torso.hpp //
|
|
// Project: BattleTech Brick: Mech subsystems //
|
|
// Contents: Torso -- the torso twist / weapon-elevation subsystem //
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1995, Virtual World Entertainment, Inc. //
|
|
// All Rights reserved worldwide //
|
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
|
|
//===========================================================================//
|
|
|
|
#if !defined(TORSO_HPP)
|
|
# define TORSO_HPP
|
|
|
|
# if !defined(POWERSUB_HPP)
|
|
# include <powersub.hpp>
|
|
# endif
|
|
|
|
//##################### Forward Class Declarations #######################
|
|
class Mech;
|
|
class Joint;
|
|
|
|
//###########################################################################
|
|
//##################### Torso Model Resource ###########################
|
|
//###########################################################################
|
|
|
|
struct Torso__SubsystemResource:
|
|
public PowerWatcher::SubsystemResource
|
|
{
|
|
Scalar horizontalRotationPerSecond;
|
|
Scalar verticalRotationPerSecond;
|
|
Scalar horizontalLimitRight;
|
|
Scalar horizontalLimitLeft;
|
|
Scalar verticalLimitTop;
|
|
Scalar verticalLimitBottom;
|
|
char torsoHorizontalJoint[32];
|
|
char torsoHorizontalShadowJoint[32];
|
|
Logical torsoHorizontalEnabled;
|
|
Scalar buttonAccelerationPerSecond;
|
|
Scalar buttonAccelerationStartValue;
|
|
};
|
|
|
|
//###########################################################################
|
|
//############################### Torso ################################
|
|
//###########################################################################
|
|
//
|
|
// Drives torso twist (horizontal) and weapon elevation (vertical). The
|
|
// tuning rates/limits come from the resource; the live twist/elevation state
|
|
// and the resolved skeleton joints are advanced by the per-frame
|
|
// TorsoSimulation (staged) once the Mech skeleton link is live.
|
|
//
|
|
class Torso:
|
|
public PowerWatcher
|
|
{
|
|
public:
|
|
static Derivation ClassDerivations;
|
|
static SharedData DefaultData;
|
|
|
|
typedef void
|
|
(Torso::*Performance)(Scalar time_slice);
|
|
void
|
|
SetPerformance(Performance performance)
|
|
{
|
|
Check(this);
|
|
activePerformance = (Simulation::Performance)performance;
|
|
}
|
|
|
|
static Logical
|
|
TestClass(Mech &);
|
|
Logical
|
|
TestInstance() const;
|
|
Scalar
|
|
CurrentTwist() const { Check(this); return currentTwist; }
|
|
Scalar
|
|
CurrentElevation() const { Check(this); return currentElevation; }
|
|
Logical
|
|
GetHorizontalEnabled() const{ Check(this); return horizontalEnabled; }
|
|
|
|
//
|
|
// Analog aim inputs (written by MechControlsMapper::InterpretControls;
|
|
// consumed by TorsoSimulation to slew the twist/elevation each frame).
|
|
//
|
|
void
|
|
SetAnalogElevationAxis(Scalar axis) { Check(this); analogElevationAxis = axis; }
|
|
void
|
|
SetAnalogTwistAxis(Scalar axis) { Check(this); analogTwistAxis = axis; }
|
|
|
|
void
|
|
TorsoSimulation(Scalar time_slice);
|
|
void
|
|
TorsoCopySimulation(Scalar time_slice);
|
|
|
|
public:
|
|
typedef Torso__SubsystemResource SubsystemResource;
|
|
|
|
Torso(
|
|
Mech *owner,
|
|
int subsystem_ID,
|
|
SubsystemResource *subsystem_resource,
|
|
SharedData &shared_data = DefaultData
|
|
);
|
|
~Torso();
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Attribute publication. The shipped string pool lists this class's
|
|
// attribute names contiguously after the class name "Torso":
|
|
//
|
|
// RotationOfTorsoVertical RotationOfTorsoHorizontal
|
|
// HorizontalLimitRight HorizontalLimitLeft
|
|
// SpeedOfTorsoVertical SpeedOfTorsoHorizontal
|
|
//
|
|
// (the TorsoUp/Down/Left/Right/Center that follow are MESSAGES, not
|
|
// attributes). All six map onto members we already carry. An
|
|
// authored AttributeWatcher binds SpeedOfTorsoHorizontal.
|
|
//
|
|
// The chain -- PowerWatcher -> HeatWatcher -> MechSubsystem -- publishes
|
|
// nothing of its own, so these start at Subsystem::NextAttributeID.
|
|
//
|
|
public:
|
|
enum {
|
|
RotationOfTorsoVerticalAttributeID = Subsystem::NextAttributeID,
|
|
RotationOfTorsoHorizontalAttributeID,
|
|
HorizontalLimitRightAttributeID,
|
|
HorizontalLimitLeftAttributeID,
|
|
SpeedOfTorsoVerticalAttributeID,
|
|
SpeedOfTorsoHorizontalAttributeID,
|
|
//
|
|
// Bound by an authored watcher (BTL4.RES pairs it as
|
|
// Torso/MotionState). Appended at the END of this leaf class's
|
|
// own range, so no downstream id moves.
|
|
//
|
|
MotionStateAttributeID,
|
|
NextAttributeID
|
|
};
|
|
|
|
static const IndexEntry AttributePointers[];
|
|
static AttributeIndexSet AttributeIndex;
|
|
|
|
protected:
|
|
int motionState; // staged: no gait state feed yet
|
|
int isDamagedCopy;
|
|
int statusFlags;
|
|
Logical horizontalEnabled;
|
|
Scalar baseTwistRate;
|
|
Scalar baseElevationRate;
|
|
Scalar horizontalLimitRight;
|
|
Scalar horizontalLimitLeft;
|
|
Scalar verticalLimitTop;
|
|
Scalar verticalLimitBottom;
|
|
Scalar twistCenterHigh;
|
|
Scalar twistCenterLow;
|
|
Scalar elevationCenter;
|
|
Scalar elevationHalfBottom;
|
|
Scalar buttonAccelerationPerSecond;
|
|
Scalar buttonAccelerationStart;
|
|
int buttonRampActive;
|
|
Scalar buttonRamp;
|
|
Joint *horizontalJointNode;
|
|
Joint *horizontalShadowJointNode;
|
|
Scalar currentTwist;
|
|
Scalar currentElevation;
|
|
Scalar analogElevationAxis;
|
|
Scalar analogTwistAxis;
|
|
//
|
|
// Twist/elevation dynamics accumulators advanced by TorsoSimulation.
|
|
// Reserved until the per-frame sim is reconstructed (phase 5).
|
|
//
|
|
Scalar dynamicsState[22];
|
|
};
|
|
|
|
#endif
|