Audio Phase 4a (AUDIO_FIDELITY F6/F7): coolant-leak warning + missile alarm
F6 ReportLeak (the largest dead authored block -- 38 of 54 match watchers):
recovered the binary HeatSink attribute table (16-byte {id,name,off+1} rows
@0x50e438..0x50e4c8, ids 3..12) [T1] -- it confirms EVERY existing heat
binding (CurrentTemperature@0x114 .. CoolantMassLeakRate@0x130, HeatSink@
0x164) and adds the one row we never published: ReportLeak (id 12) ->
+0x138 = coolantActive, the INT leak hysteresis flag UpdateCoolant
(@004adbf8) drives 1/0 around draw 0.003/0.0025. PoweredSubsystem derives
from HeatSink, so the single row serves all 19 authored leak watchers
through the chained index, exactly like the binary. MechWeapon's pinned-id
pad absorbed the +1 chain shift (0x0E -> 0x0F, tripwire fired as designed).
F7 IncomingLock/DistanceToMissile (missile alarm): binary Mech table walked
in full (ids 21..56 [T1] -- also settles FootStep@0x394, CollisionSpeed@
0x4B4, UnstablePercentage@0x3F0, ReduceButton@0x340 for the next findings).
IncomingLock id 54 @0x3fc, DistanceToMissile id 56 @0x400; the old
"maxSpeed @0x400 = FLT_MAX" member was a MISREAD of the far default and is
retired (its 1000.0f "override" was RadarRange id 47 @0x404, already
published). Real members + accumulators: Missile::MoveAndCollide reports
target + range each tick (BTReportIncomingMissile bridge); PerformAndWatch
latches per frame. The authored beeper (match 1/0) + range->TEMPO scale
(100..800 -> 600..10, accelerating as the missile closes) read them
unchanged. Drive is intent-level [T3]; init 0/FLT_MAX matches the binary
reset (part_012.c:9446-9447).
Regression (30s): stable; ReportLeak binds real on every subsystem (0 pad
redirects); DistanceToMissile binds with FLT_MAX live; attrnull 41 -> 3.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
0ca7d269d2
commit
cc2b109cc8
@@ -735,9 +735,13 @@ const Mech::IndexEntry
|
||||
ATTRIBUTE_ENTRY(Mech, RequestDuckAnimation, attrPad), // 0x33
|
||||
ATTRIBUTE_ENTRY(Mech, UnstablePercentage, attrPad), // 0x34
|
||||
ATTRIBUTE_ENTRY(Mech, SuperStop, attrPad), // 0x35
|
||||
ATTRIBUTE_ENTRY(Mech, IncomingLock, attrPad), // 0x36
|
||||
// (AUDIO_FIDELITY F7) real missile-alarm backing: binary ids 54/56 @0x3fc/
|
||||
// 0x400 [T1 table @0x50c0b0/0x50c0d0]; the authored beeper (match 1/0) +
|
||||
// tempo scale (range 100..800 -> tempo 600..10) read these. Driven by
|
||||
// Missile::MoveAndCollide via BTReportIncomingMissile (mech4.cpp).
|
||||
ATTRIBUTE_ENTRY(Mech, IncomingLock, incomingLock), // 0x36
|
||||
ATTRIBUTE_ENTRY(Mech, DuckState, duckState), // 0x37 (crouch posture, int)
|
||||
ATTRIBUTE_ENTRY(Mech, DistanceToMissile, attrPad) // 0x38
|
||||
ATTRIBUTE_ENTRY(Mech, DistanceToMissile, distanceToMissile) // 0x38
|
||||
};
|
||||
|
||||
Mech::AttributeIndexSet&
|
||||
@@ -850,7 +854,9 @@ Mech::Mech(
|
||||
mechNameFilter.Initialize(); // FUN_00435a7c(this+0xdb)
|
||||
masterAlarm = AlarmIndicator(0x21); // FUN_0041b9ec(this+0xe7,0x21)
|
||||
stateFlags = 0; // Wword(0xff)
|
||||
maxSpeed = DAT_005209d0; // FLT_MAX -> Wword(0x100)
|
||||
// (F7 correction) the binary's 0x400 = FLT_MAX init is DistanceToMissile's
|
||||
// "no missile" far default (attr id 56), NOT a maxSpeed -- the old member
|
||||
// is retired; distanceToMissile (init below) owns the slot's meaning.
|
||||
Wword(0x104) = 0;
|
||||
Wword(0x106).Construct(0); // FUN_004a4d60 (slot member)
|
||||
Wword(0x10f).LinkTo(this + 0x61); // FUN_00420ea4
|
||||
@@ -934,6 +940,12 @@ Mech::Mech(
|
||||
radarLinearPosition = &localOrigin.linearPosition; // map reads the mech's live world position...
|
||||
radarAngularPosition= &localOrigin.angularPosition; // ...and orientation (pointers into the base origin)
|
||||
duckState = 0; // not crouching
|
||||
// (AUDIO_FIDELITY F7) missile alarm: the binary reset writes 0 / FLT_MAX
|
||||
// (part_012.c:9446-9447; FLT_MAX = "no missile" far default)
|
||||
incomingLock = 0;
|
||||
distanceToMissile = FLT_MAX;
|
||||
incomingLockNext = 0;
|
||||
distanceToMissileNext = FLT_MAX;
|
||||
|
||||
ZeroBlock(this + 0xca, 6); // this[0xca..0xcf] = 0
|
||||
ZeroBlock(this + 0x153, 6); // this[0x153..0x158] = 0
|
||||
@@ -1014,7 +1026,9 @@ Mech::Mech(
|
||||
SetPerformance(PTR_LAB_0050c0f4); // master performance
|
||||
}
|
||||
|
||||
maxSpeed = 0x447a0000; // 1000.0f -> Wword(0x101) (override)
|
||||
// (F7 correction) the old "maxSpeed = 1000.0f override" here targeted
|
||||
// Wword(0x101) = +0x404 -- the binary table says that is RadarRange
|
||||
// (id 47), already initialized as radarRange = 1000.0f above.
|
||||
Wword(0x102) = 0;
|
||||
Wword(0x103) = (int)(this + 0x43);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user