#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:
co-authored by
Claude Fable 5
parent
a728fa6de9
commit
42b0691592
@@ -6618,23 +6618,46 @@ void
|
|||||||
{
|
{
|
||||||
// COMMA-LIST (eject bench): "GeneratorA,GeneratorB,..." kills
|
// COMMA-LIST (eject bench): "GeneratorA,GeneratorB,..." kills
|
||||||
// each named subsystem; single-name behavior unchanged.
|
// 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];
|
char want_list[256];
|
||||||
strncpy(want_list, getenv("BT_KILL_SUBSYS"), sizeof(want_list) - 1);
|
strncpy(want_list, getenv("BT_KILL_SUBSYS"), sizeof(want_list) - 1);
|
||||||
want_list[sizeof(want_list) - 1] = 0;
|
want_list[sizeof(want_list) - 1] = 0;
|
||||||
for (char *want = strtok(want_list, ","); want != 0;
|
for (char *want = strtok(want_list, ","); want != 0;
|
||||||
want = strtok(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)
|
for (int i = 2; i < GetSubsystemCount(); ++i)
|
||||||
{
|
{
|
||||||
Subsystem *s = GetSubsystem(i);
|
Subsystem *s = GetSubsystem(i);
|
||||||
if (s == 0 || s->GetName() == 0) continue;
|
if (s == 0 || s->GetName() == 0) continue;
|
||||||
if (stricmp(s->GetName(), want) != 0) continue;
|
if (stricmp(s->GetName(), want) != 0) continue;
|
||||||
if (!s->IsDerivedFrom(MechSubsystem::ClassDerivations)) continue;
|
if (!s->IsDerivedFrom(MechSubsystem::ClassDerivations)) continue;
|
||||||
|
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)->SetSubsystemDamageLevel(1.0f);
|
||||||
((MechSubsystem *)s)->ForceCriticalFailure();
|
((MechSubsystem *)s)->ForceCriticalFailure();
|
||||||
DEBUG_STREAM << "[killsub] '" << s->GetName()
|
DEBUG_STREAM << "[killsub] '" << s->GetName()
|
||||||
<< "' force-destroyed (statusAlarm=1, zone=1.0)"
|
<< "' force-destroyed (statusAlarm=1, zone=1.0)"
|
||||||
<< std::endl << std::flush;
|
<< std::endl << std::flush;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -197,6 +197,15 @@ MechTech::MechTech(
|
|||||||
wooHooMinimumDuration = model->wooHooMinimumDuration; // res +0x34 -> this+0xF4
|
wooHooMinimumDuration = model->wooHooMinimumDuration; // res +0x34 -> this+0xF4
|
||||||
wooHooDurationRange = model->wooHooDurationRange; // res +0x38 -> this+0xF8
|
wooHooDurationRange = model->wooHooDurationRange; // res +0x38 -> this+0xF8
|
||||||
wooHooChance = model->wooHooChance; // res +0x3C -> this+0xFC
|
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
|
// Walk the owner's subsystem roster and attach a monitor to every
|
||||||
|
|||||||
Reference in New Issue
Block a user