#119 leak-voice stutter SETTLED: authentic -- the wooHoo latch is authored OFF

Deterministic leak bench (BT_KILL_SUBSYS partial form, "Condenser4=0.5":
zone level without the crit -- a clean leak source) + the aud-tail receipts
decode the voice stutter end to end: the warning is a phrase-sequenced
voice patch (Warnings01 zones as notes), and every techstat leak-bit edge
restarts/stops the sequence mid-phrase (authored zero-release = hard cut).
At a drained tank the draw HUNTS the authored 0.0025/0.003 band -> edge
streams -> progressive clipping as more systems hunt.

The anti-spam wooHoo latch would bound exactly this -- but no armer exists
anywhere in the flat export, and the authored tuning is minDur=0 range=0
chance=0 (dumped live): DORMANT BY AUTHORING. The clipping is the 1995
experience; the port's one real bug here was the 2x hunt cadence, already
fixed by the 28 Hz filter (#119, 1df2c57). No code change warranted.

Bench additions: the partial-damage killsub form + the authored-tuning
dump (BT_LAMP_LOG).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Joe DiPrima
2026-08-04 09:44:42 -05:00
co-authored by Claude Fable 5
parent a728fa6de9
commit 42b0691592
2 changed files with 37 additions and 5 deletions
+28 -5
View File
@@ -6618,23 +6618,46 @@ void
{
// COMMA-LIST (eject bench): "GeneratorA,GeneratorB,..." kills
// each named subsystem; single-name behavior unchanged.
// PARTIAL form (leak bench, #119): "Condenser4=0.5" sets the
// subsystem's own zone to that LEVEL without the crit kill --
// a deterministic LEAK source (damage x heatLoad drives the
// coolant draw), so the leak alarm/voice path is testable
// without waiting for random cook-offs.
char want_list[256];
strncpy(want_list, getenv("BT_KILL_SUBSYS"), sizeof(want_list) - 1);
want_list[sizeof(want_list) - 1] = 0;
for (char *want = strtok(want_list, ","); want != 0;
want = strtok(0, ","))
{
float partial = -1.0f;
char *eq = strchr(want, '=');
if (eq != 0)
{
*eq = 0;
partial = (float)atof(eq + 1);
}
for (int i = 2; i < GetSubsystemCount(); ++i)
{
Subsystem *s = GetSubsystem(i);
if (s == 0 || s->GetName() == 0) continue;
if (stricmp(s->GetName(), want) != 0) continue;
if (!s->IsDerivedFrom(MechSubsystem::ClassDerivations)) continue;
((MechSubsystem *)s)->SetSubsystemDamageLevel(1.0f);
((MechSubsystem *)s)->ForceCriticalFailure();
DEBUG_STREAM << "[killsub] '" << s->GetName()
<< "' force-destroyed (statusAlarm=1, zone=1.0)"
<< std::endl << std::flush;
if (partial >= 0.0f)
{
((MechSubsystem *)s)->SetSubsystemDamageLevel(partial);
DEBUG_STREAM << "[killsub] '" << s->GetName()
<< "' PARTIAL zone=" << partial
<< " (leak source, no crit)"
<< std::endl << std::flush;
}
else
{
((MechSubsystem *)s)->SetSubsystemDamageLevel(1.0f);
((MechSubsystem *)s)->ForceCriticalFailure();
DEBUG_STREAM << "[killsub] '" << s->GetName()
<< "' force-destroyed (statusAlarm=1, zone=1.0)"
<< std::endl << std::flush;
}
break;
}
}
+9
View File
@@ -197,6 +197,15 @@ MechTech::MechTech(
wooHooMinimumDuration = model->wooHooMinimumDuration; // res +0x34 -> this+0xF4
wooHooDurationRange = model->wooHooDurationRange; // res +0x38 -> this+0xF8
wooHooChance = model->wooHooChance; // res +0x3C -> this+0xFC
// DIAG (#119 leak-voice dig): the AUTHORED anti-spam latch tuning.
// No armer for the wooHoo latch exists anywhere in the flat export --
// if the authored chance is 0 the latch was dormant in 4.10 too and
// the repeating warning voice under multiple leaks is AUTHENTIC.
if (getenv("BT_LAMP_LOG"))
DEBUG_STREAM << "[techstat] wooHoo authored: minDur="
<< wooHooMinimumDuration << " range=" << wooHooDurationRange
<< " chance=" << wooHooChance
<< " alarmModel=" << alarmModel << "\n" << std::flush;
//
// Walk the owner's subsystem roster and attach a monitor to every