Ladder rungs, each run-verified on the pod rig: ReportLeak (HeatSink), GeneratorOn (Generator -- member existed, publication missing), ConfigureActivePress (MechSubsystem -- likewise), AmmoState + FireCountdownStarted + the rest of the AmmoBin table. THE PINNED RANGE IS NOW THE AUTHENTIC SHAPE. Publishing ReportLeak on HeatSink and ConfigureActivePress on MechSubsystem shifts the chain down two, and MechWeapon's bridge to its binary-pinned PercentDone (0x12) collapses from THREE guessed pads to ONE -- which is exactly the arithmetic the shipped string pool predicts (MechSubsystem 1, HeatableSubsystem 3, HeatSink 6, PoweredSubsystem 5). Three pads of guesswork replaced by a real attribute and a real base-class row. HeatableSubsystem and Torso rebase onto MechSubsystem::AttributeIndex; MechControlsMapper does not (it derives from Subsystem directly). Types were chosen deliberately this time, per the AudioWatcher families the engine instantiates (Motion / Hinge / Scalar / StateIndicator): every *State name resolves to a StateIndicator, ReportLeak is a Scalar. RESULT: the pod run now gets past every authored watcher and DRAWS THE FULL COCKPIT -- sensor cluster, myomers, cooling, the weapon panels, kills/deaths -- with the board booted and audio running. It then exits without flushing its redirected stdout, so the exit reason is not yet known; next step is a run with the redirect removed so the console is readable. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
122 lines
3.3 KiB
C++
122 lines
3.3 KiB
C++
//===========================================================================//
|
|
// File: ammobin.cpp //
|
|
// Project: BattleTech Brick: Mech weapons //
|
|
// Contents: AmmoBin -- ammunition store with cook-off heat //
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1995, Virtual World Entertainment, Inc. //
|
|
// All Rights reserved worldwide //
|
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
|
|
//===========================================================================//
|
|
|
|
#include <bt.hpp>
|
|
#pragma hdrstop
|
|
|
|
#if !defined(AMMOBIN_HPP)
|
|
# include <ammobin.hpp>
|
|
#endif
|
|
|
|
#if !defined(MECH_HPP)
|
|
# include <mech.hpp>
|
|
#endif
|
|
|
|
Derivation
|
|
AmmoBin::ClassDerivations(
|
|
HeatWatcher::ClassDerivations,
|
|
"AmmoBin"
|
|
);
|
|
|
|
const AmmoBin::IndexEntry
|
|
AmmoBin::AttributePointers[]=
|
|
{
|
|
ATTRIBUTE_ENTRY(AmmoBin, AmmoCount, ammoCount),
|
|
ATTRIBUTE_ENTRY(AmmoBin, TimeToReady, feedTimer),
|
|
ATTRIBUTE_ENTRY(AmmoBin, AmmoClassID, ammoClassID),
|
|
ATTRIBUTE_ENTRY(AmmoBin, AmmoState, ammoAlarm),
|
|
ATTRIBUTE_ENTRY(AmmoBin, FireCountdownStarted, fireCountdownStarted)
|
|
};
|
|
|
|
AmmoBin::AttributeIndexSet
|
|
AmmoBin::AttributeIndex(
|
|
ELEMENTS(AmmoBin::AttributePointers),
|
|
AmmoBin::AttributePointers,
|
|
MechSubsystem::AttributeIndex
|
|
);
|
|
|
|
AmmoBin::SharedData
|
|
AmmoBin::DefaultData(
|
|
AmmoBin::ClassDerivations,
|
|
Subsystem::MessageHandlers,
|
|
AmmoBin::AttributeIndex,
|
|
Subsystem::StateCount
|
|
);
|
|
|
|
AmmoBin::AmmoBin(
|
|
Mech *owner,
|
|
int subsystem_ID,
|
|
SubsystemResource *resource,
|
|
SharedData &shared_data
|
|
):
|
|
HeatWatcher(owner, subsystem_ID, resource, shared_data),
|
|
ammoAlarm(6)
|
|
{
|
|
Check(owner);
|
|
Check_Pointer(resource);
|
|
|
|
ammoCount = resource->ammoCount;
|
|
initialAmmoCount = resource->ammoCount;
|
|
feedRate = resource->feedRate;
|
|
feedTimer = 0.0f;
|
|
ammoClassID = resource->ammoClassID;
|
|
ammoModelFile = resource->ammoModelFile;
|
|
explosionModelFile = resource->explosionModelFile;
|
|
heatPerRound = resource->heatPerRound;
|
|
cookOffArmed = 0;
|
|
cookOffTime = 0;
|
|
fireCountdownStarted = 0; // was: reserved
|
|
|
|
for (int i = 0; i < 12; ++i)
|
|
{
|
|
cookOffState[i] = 0;
|
|
}
|
|
|
|
Check_Fpu();
|
|
}
|
|
|
|
AmmoBin::~AmmoBin()
|
|
{
|
|
}
|
|
|
|
Logical
|
|
AmmoBin::TestClass(Mech &)
|
|
{
|
|
return True;
|
|
}
|
|
|
|
Logical
|
|
AmmoBin::TestInstance() const
|
|
{
|
|
return IsDerivedFrom(ClassDerivations);
|
|
}
|
|
|
|
//
|
|
//#############################################################################
|
|
// DeathReset -- the respawn restock: base heal + refill from the authored
|
|
// resource count (the launchers' NoAmmo state releases in their own reset).
|
|
//#############################################################################
|
|
//
|
|
void
|
|
AmmoBin::DeathReset(Logical full_reset)
|
|
{
|
|
Check(this);
|
|
|
|
HeatWatcher::DeathReset(full_reset);
|
|
|
|
//
|
|
// Restock from the CTOR-CACHED authored count -- NEVER through the
|
|
// `resource` member: it points into the Mech ctor's padded stream copy,
|
|
// which is delete[]d before the ctor returns (a respawn-time deref
|
|
// reads freed heap -- caught by the 5.3.24 adversarial review).
|
|
//
|
|
ammoCount = initialAmmoCount;
|
|
}
|