#82 ROOT FIX: reconstruct the crash SELF-DAMAGE -- wall-grinding now hurts,

the knockdown storm self-limits, peers keep the limp

The 'peers see a limping mech skating' report decomposed into a wall-grind
KNOCKDOWN STORM: a gimped mech held against a blocking solid re-crashes each
time its gg cycle rebuilds speed (the gg ceiling is authentically the clip's
natural speed -- bhk1 ~14.9 u/s, ceiling+divisor @0x544/0x548, loader formula
byte-matched -- so iv2 ~222 >> the 40.0 threshold @0x4ab184), and every
type-5 KNOCKDOWN broadcast floors all peers' replicants into knockdown/trn
churn: gliding + leg-lifts = skating.  Turning and crushable cars were
A/B-exonerated (grass circling: 198 replicant gimp entries, 17 crunches,
zero broadcasts).

What the binary has that the port lacked -- recovered from the EXPORT GAP by
raw disasm (scratchpad/night6/gap_4a9770.txt, @4aa89f-4aaab4) -- is the crash
branch's tail: fallDirection = worldToLocal(damageForce) (FUN_0040879c, M^T v,
un-normalized), fallScalar = -(fallDirection . localVelocity.linearMotion),
and a self-dispatched TakeDamageMessage{0x64, zone=-1, the engine-computed
collision Damage verbatim}.  A wall crash COSTS ARMOR, so the grind degrades
the mech instead of looping forever.  That dispatch was the long-standing
'DEFERRED' note in the response policy; now reconstructed.

Falsified en route (comments + KB corrected, do not revive): the stagger's
FUN_004a4c54(1)/(0x20) 'action-request flags' feed NO drive suppressor --
image-wide sweep + full gap disasm show word[this+0x18] is read only by the
net record emitter; the bmp clip applies NO root motion (adv=0 measured); the
'gimp cap 5.8' figure was the BACK-cycle stride printed under a misleading
label (now ggCapL/R; @0x52c has no binary consumer).

Verified (mp_gimpAB rigs): arena1 wall-grind now 4 bounded strikes, limper
dies of its crashes and respawns cleanly twice (START->RESET, no strand);
grass circling unchanged-clean (198 replicant gimp states, 0 knocks).
Rig: pid capture race fixed (a missed winpid left a stale node holding the
-net port -> null runs), per-config sweep added.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Joe DiPrima
2026-07-30 16:18:28 -05:00
co-authored by Claude Fable 5
parent 19fe1e5fa2
commit 9c83a468db
8 changed files with 353 additions and 36 deletions
+8 -1
View File
@@ -480,8 +480,15 @@ void
turnCapable = 1;
animationClips[4] = *ResolveAnimationClip(prefix, "trn"); // 0x5dc
}
// (#82 dig 2026-07-30: this line used to print `gimpSpeedMax` @0x52c --
// a field NOTHING in the binary reads (image-wide: no mech consumer) whose
// negative back-cycle value sent the wall-grind investigation down a
// "gimp cap is 5.8" red herring. Print the fields the gimp cycle ACTUALLY
// caps on: gimpLeft/RightStrideLength = the gg clips' natural speeds,
// the accel ceilings + ratio divisors @0x544/0x548.)
DEBUG_STREAM << "[loadclips] end: fScale=" << forwardThrottleScale
<< " gimpSpeedMax=" << gimpSpeedMax << " hasGimpClips=" << hasGimpClips << "\n" << std::flush;
<< " ggCapL=" << gimpLeftStrideLength << " ggCapR=" << gimpRightStrideLength
<< " hasGimpClips=" << hasGimpClips << "\n" << std::flush;
}