the REVERSE DISABLED voice (#78): SimulationState 3/4 IS the trigger -- mirror the gimp level into the engine cell
User + old-timers were right; the earlier "no voice exists" verdict was wrong. The authored mech audio has state watchers on Entity.SimulationState==3/4 (the binary's one-cell mech+0x40) that start sequence notes 29,16,40 -- two klaxon hits then Warnings01 zone 8 (key 40-41) = the "reverse disabled" voice line the testers remember. The port's cell split (graphicAlarm vs engine simulationState, gotcha #23) meant the trigger value never arrived. - mechdmg: mirror gimp 3/4 into SetSimulationState at the leg-half crossing (guarded: never stomps disabled/fall/dead states). Voice verified playing end-to-end on the bench: SetupPatch bank2 patch113 note=40 -> Warnings01_z7.wav. - mech.cpp: BT_GIMP_SAFE_BASE_READ on all seven Simulation::ReadUpdateRecord sites -- gimp is monotonic per life; a record captured pre-gimp must not stomp the cell (the loopback otherwise perpetuates the stale value and restarts the warning on every damage event). - diagnostics (all env-gated): [statefire]/[startreq]/[animind]/[gimp-sim]/ [simstomp]/[indstomp] + StateIndicator::DebugAudioWatcherCount + raised spatial-log caps. These traced the whole chain and PROVED no SetState path stomps the cell. OPEN (follow-up): a RAW writer (bypasses SetState entirely; invisible to the indicator-level trap) resets the cell between damage events -- under the bench's 1 Hz metronome harness it restarted the sequence before the 1.8 s voice note; sporadic real-play damage is unaffected (one edge -> full sequence). Needs a cdb write-watchpoint session; candidates: a recon raw +0x2c-equivalent write or a struct copy spanning it. Also decoded en route: the AnimationState triggers on the limp states play EngineShiftRev01 (the downshift foley) -- working, and NOT the voice. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
7838df2924
commit
1671b7d4b2
@@ -487,6 +487,28 @@ void
|
||||
mech->graphicAlarm.SetLevel(4);
|
||||
else if (leftLeg != 0 && damageLevel >= LegHalfStructure)
|
||||
mech->graphicAlarm.SetLevel(3);
|
||||
//
|
||||
// #78 the "REVERSE DISABLED" voice: the binary's mech+0x40 is ONE
|
||||
// cell -- the same 3/4 write was ALSO Entity.SimulationState, and
|
||||
// the authored audio has state watchers on SimulationState==3/4
|
||||
// that start the warning sequence (notes 29,16,40 -> two klaxon
|
||||
// hits + the Warnings01 zone-8 "reverse disabled" voice line).
|
||||
// The port split the cell (graphicAlarm vs engine simulationState,
|
||||
// gotcha #23), so the voice never triggered. Mirror the gimp
|
||||
// level into the engine indicator -- guarded so a fall/disabled/
|
||||
// dead state (2, 5-8, 9) is never stomped; SetState dedupes, so
|
||||
// the voice fires once per onset (again only on a side switch),
|
||||
// which is the binary's own edge semantics.
|
||||
//
|
||||
if (damageLevel >= LegHalfStructure && (rightLeg != 0 || leftLeg != 0))
|
||||
{
|
||||
unsigned ss = mech->GetSimulationState();
|
||||
if (getenv("BT_AUDIO_SPATIAL")) { static int s_gm=0; if (s_gm++<30)
|
||||
DEBUG_STREAM << "[gimp-sim] ss=" << ss << " -> "
|
||||
<< ((rightLeg != 0) ? 4 : 3) << "\n" << std::flush; }
|
||||
if (ss <= 1 || ss == 3 || ss == 4)
|
||||
mech->SetSimulationState((rightLeg != 0) ? 4 : 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user