#142 crouch: the mech is fine -- it is a missing PANEL ANIMATION

Benched solo AND in MP on the same chassis: both presses reach
DuckRequestMessageHandler, zero drops, SQUAT -> squat clip parked -> RISE.
Locomotion is not the bug, and MP is not refusing it.

Added an ungated [duck] REQUEST DROPPED receipt at the consumer's silent miss.
The squatCapable==0 path skips the consumer entirely AND leaves duckState
latched at 1 with NO log today; the posture-gate miss logged only under
BT_DUCK_LOG, which no player sets.  Neither fired on madcat.

What the pilot sees, traced with BT_LAMP_LOG: the button lamp is momentary
press feedback, not state --

    PRESS   -> [lamp] 0x13 <- 0x3c
    SQUAT   -> mech crouches, clip parked
    RELEASE -> [lamp] 0x13 <- 0x14    <-- while still CROUCHED

so crouched and standing look identical.

Era testimony corrects the scope: the button should ANIMATE A MECH SYMBOL
beside it, standing <-> crouching (operator).  Lynx: 'When a mech stops,
crouch button lowers its stance and plays crouch animation.  Mech is
immobilized until crouch is pushed again, and mech rises.'  Draco concurs.

Two real gaps, neither fixed here:
  1. no immobilization while crouched -- nothing gates movement on duckState
     or the parked leg alarm.  NB a driven mech with a parked leg channel is
     the [skate] signature (#52), so this may not be cosmetic.
  2. no stance symbol -- no gauge element draws one, and the decomp carries no
     crouch/squat/stance/duck graphic string, so it is an authored IMAGE on the
     secondary MFD; find it in that gauge's element list, not by string.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NCJQkvq6G2JNrpVbA75tVZ
This commit is contained in:
Joe DiPrima
2026-08-07 16:16:12 -05:00
co-authored by Claude Opus 5
parent 61f21107b4
commit 0530366687
4 changed files with 209 additions and 0 deletions
+26
View File
@@ -4420,6 +4420,32 @@ void
// stability, so peers pose the squat for free) and flip the
// stability alarm (ducked = 0, risen = 1). The request is
// consumed whenever both gates passed, hit or miss.
// #142 RECEIPT (ungated, 1 Hz). A pending duck request that produces
// no posture change is INVISIBLE today: if squatCapable is 0 the
// consumer below is skipped entirely -- no log, and duckState is not
// even consumed, so the latch sticks at 1 forever. The other miss
// (posture not 1/2) logs only under BT_DUCK_LOG, which no player
// sets. Field report (Oracle, night 13): "the light next to it
// always flashes when pressed, but state does not change" -- the
// press reaches the handler and a GATE declines it, exactly the
// shape the eject bug had (#108: EvaluateEjectPermission refusing a
// healthy mech while the lamp still responded). Name the gate.
if (duckState != 0
&& (squatCapable == 0 || (mapPosture != 1 && mapPosture != 2)))
{
static int s_duckDrop = 0;
if ((s_duckDrop++ % 60) == 0)
DEBUG_STREAM << "[duck] REQUEST DROPPED: squatCapable="
<< squatCapable << " posture=" << mapPosture
<< " mode=" << MovementMode()
<< " legLvl=" << (int)legStateAlarm.GetLevel()
<< " myo=" << myomerEffectiveness
<< (squatCapable == 0
? " <-- no squ/sqd clips: consumer skipped, latch stuck"
: " <-- posture gate")
<< "\n" << std::flush;
}
if (duckState != 0 && squatCapable != 0)
{
if (mapPosture == 1)