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:
arcattack
2026-07-23 10:15:15 -05:00
co-authored by Claude Opus 4.8
parent 12a1fea823
commit ffa39335e0
+10 -2
View File
@@ -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