diff --git a/context/locomotion.md b/context/locomotion.md index 8274c94..e868e34 100644 --- a/context/locomotion.md +++ b/context/locomotion.md @@ -303,17 +303,25 @@ gimped mechs too — the port relocated it into the NORMAL leg driver's Standing stops running when the gimp driver takes over ("rotating statue"). The arming is now mirrored in `AdvanceLegAnimationGimp`. No gimp-turn clip exists — a limping mech step-turns with the normal `trn` clip [T1: the RES limp set is only wg/gg/gs]. -**Gimp audio — RESOLVED 2026-07-29** (`ed84445`): there is NO "reverse disabled" voice line, -klaxon binding, or MFD text in the 1995 game — the binary's mapper has no gimp check (the -refusal is structural: the gimp machines have no reverse path) and no REVERSE/DISABLED string -exists in BTL4.RES; the five `*VOC` bank samples are mission-shell VO. The AUTHENTIC limp audio -is the authored **strained-servo component**: `Entity.AnimationState` state-watchers on the limp -entries 22/23 and stops 26/27 (+ walk-stands 8/9) start it, gain-scaled by `Entity.LocalVelocity` -(0..10 → −300..0). Verified live: `[statefire] trigState=23 old=7 new=23 ctl Start` -(BT_AUDIO_SPATIAL diagnostic). ⚠ Open hazard: one bench session had ZERO AnimationState watcher -fires (same build/conditions) — suspected watcher rebind miss around the initial mission respawn -(watchers possibly bound to a recreated mech's stale indicator). Watch for silent limps in the -field. +**Gimp audio — the "REVERSE DISABLED" voice IS REAL and now plays** (`1671b7d`; the earlier +"no voice exists" verdict here was WRONG — user/old-timer pushback found it). The authored mech +audio has **state watchers on `Entity.SimulationState == 3/4`** (the binary's one-cell mech+0x40 += the gimp level) that start a sequence playing notes 29, 16, **40** — two klaxon hits then +Warnings01 zone 8 (`Warnings01_z7.wav`, key 40-41) = the spoken "reverse disabled". It never +fired in the port because of the SAME cell split that hid the limp (graphicAlarm vs engine +simulationState, gotcha #23) — the audio watches the half the gimp system never wrote. Fixed: +mechdmg mirrors gimp 3/4 into `SetSimulationState` at the leg-half crossing (guarded vs +disabled/fall/dead), and `BT_GIMP_SAFE_BASE_READ` stops pre-gimp replication records from +stomping the cell (gimp is monotonic per life). Verified: `SetupPatch bank2 patch113 note=40`. +Layered under it: the `Entity.AnimationState` triggers on limp entries 22/23 + stops 26/27 +(+ walk-stands 8/9) play **EngineShiftRev01** (downshift foley), velocity-gained — a separate +working layer (earlier mis-ID'd here as "the" limp audio). The earlier "watcher rebind" +hazard was a bench artifact (the harness gimped the mech before the audio object loaded — +impossible in play). ⚠ Open: an unidentified RAW writer (bypasses SetState; indicator-level +trap never fired while the value changed) resets the sim cell between damage events — under a +1 Hz bench harness it restarted the warning before the 1.8 s voice note; sporadic real-play +damage is unaffected. Needs a cdb write-watchpoint dig (candidates: a recon raw +0x2c-family +write or a struct copy spanning it). Open: the load-time per-clip callbacks `PTR_LAB_0050d738/744` on the wg clips (uncarved LABs, inert `Recon` placeholders in the port — likely footstep/cycle events, transitions work without them).