Weapon jam/failure/dry transitions always log (field diagnosability)
Solo field report: both SRM launchers went inert with ammo remaining and the default log could not answer whether they jammed or heat-failed -- every weapon-state transition log was gated behind BT_AMMO_LOG. The edges are rare and mission-permanent, so they now log unconditionally: [weap] JAMMED with temperature/alarm evidence at the CheckForJam hit, and both NoAmmo edge logs (gate 1 destroyed/failHeat/disabled, gate 2 dry bin) ungated. The missing MFD presentation for these states is issue #30. 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
12a1fea823
commit
ffa39335e0
@@ -650,7 +650,7 @@ void
|
|||||||
// Edge log: the FIRST frame gate 1 bricks the weapon into the NoAmmo
|
// Edge log: the FIRST frame gate 1 bricks the weapon into the NoAmmo
|
||||||
// roach-motel (destroyed / FailureHeat / mech disabled) -- distinguishes
|
// roach-motel (destroyed / FailureHeat / mech disabled) -- distinguishes
|
||||||
// a true dry bin (gate 2) from a HEAT trip (the open heat-economy question).
|
// a true dry bin (gate 2) from a HEAT trip (the open heat-economy question).
|
||||||
if (s_ammoLog && weaponAlarm.GetState() != 7)
|
if (weaponAlarm.GetState() != 7) // ALWAYS log this edge (field 2026-07-23)
|
||||||
DEBUG_STREAM << "[ammo] " << GetName() << " -> NoAmmo (gate1): destroyed="
|
DEBUG_STREAM << "[ammo] " << GetName() << " -> NoAmmo (gate1): destroyed="
|
||||||
<< gate1Destroyed << " failHeat=" << gate1FailHeat
|
<< gate1Destroyed << " failHeat=" << gate1FailHeat
|
||||||
<< " heatLvl=" << heatAlarm.GetLevel()
|
<< " heatLvl=" << heatAlarm.GetLevel()
|
||||||
@@ -670,7 +670,7 @@ void
|
|||||||
|| bin->GetSimulationState() == 1)) // [bin+0x40] (destroyed)
|
|| bin->GetSimulationState() == 1)) // [bin+0x40] (destroyed)
|
||||||
{
|
{
|
||||||
// Edge: log the FIRST frame the weapon is pinned dry (not the per-frame re-pin).
|
// Edge: log the FIRST frame the weapon is pinned dry (not the per-frame re-pin).
|
||||||
if (s_ammoLog && weaponAlarm.GetState() != 7)
|
if (weaponAlarm.GetState() != 7) // ALWAYS log this edge (field 2026-07-23)
|
||||||
DEBUG_STREAM << "[ammo] " << GetName() << " -> NoAmmo (gate2): rounds="
|
DEBUG_STREAM << "[ammo] " << GetName() << " -> NoAmmo (gate2): rounds="
|
||||||
<< bin->GetAmmoCount() << " binState=" << bin->GetAmmoState()
|
<< bin->GetAmmoCount() << " binState=" << bin->GetAmmoState()
|
||||||
<< " binDestroyed=" << (int)(bin->GetSimulationState() == 1)
|
<< " binDestroyed=" << (int)(bin->GetSimulationState() == 1)
|
||||||
@@ -709,7 +709,15 @@ void
|
|||||||
if (bin->GetAmmoState() == 2) // @4bbf11 bin went Empty on the pull
|
if (bin->GetAmmoState() == 2) // @4bbf11 bin went Empty on the pull
|
||||||
weaponAlarm.SetLevel(7); // -> unavailable (gate 2 re-pins it)
|
weaponAlarm.SetLevel(7); // -> unavailable (gate 2 re-pins it)
|
||||||
else if (CheckForJam()) // @4bbf2a call 0x4bbfcc (heat-scaled roll)
|
else if (CheckForJam()) // @4bbf2a call 0x4bbfcc (heat-scaled roll)
|
||||||
|
{
|
||||||
|
// ALWAYS log a jam (rare + mission-permanent; field 2026-07-23)
|
||||||
|
DEBUG_STREAM << "[weap] " << GetName() << " JAMMED (T="
|
||||||
|
<< currentTemperature << "/" << failureTemperature
|
||||||
|
<< " heatAlarm=" << (int)heatAlarm.GetLevel()
|
||||||
|
<< ") -- permanent until mission end
|
||||||
|
" << std::flush;
|
||||||
weaponAlarm.SetLevel(JammedState); // @4bbf34 -> 5
|
weaponAlarm.SetLevel(JammedState); // @4bbf34 -> 5
|
||||||
|
}
|
||||||
else
|
else
|
||||||
weaponAlarm.SetLevel(3); // @4bbf41 -> Loading (reload)
|
weaponAlarm.SetLevel(3); // @4bbf41 -> Loading (reload)
|
||||||
ForceUpdate(); // @4bbf4c second updateModel mark
|
ForceUpdate(); // @4bbf4c second updateModel mark
|
||||||
|
|||||||
Reference in New Issue
Block a user