The master limped clean (218x gimp-cycle records, zero trn) -- a _ReturnAddress trap on SetAnimationState(4) proved ALL peer trn arming came from the port's own mech4 turn-step block, not the type-3 reader. Two dead ends, one root: - mech4 peer arm: gated on !wantsWalk (standSpeed < bodyTargetSpeed), exits trn when walking demand appears -- the leg twin's authentic precedence (part_012.c:12013, the Standing speed test outranks the turn test). - mech2 body case 4: bspd reads bodyTargetSpeed on ReplicantInstance; the local mapper's speedDemand is a dead cell on a peer (reads 0 forever -> no exit). Verified 2-node timeline: arena circle replicant 218x state-24 / 0x state-4 (was 116x trn churn), grass circle 235-clean, knockdowns bounded, 0 deaths. Diagnostics kept: BT_TRNTRAP ra-trap, BT_ANIMIND_CAP, [gimpfeed], [replgimp] extension. KB: locomotion.md trn-lock entry + the dead-mapper-cell lesson. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QRjrTQpJd6u9XyfnUbTB3v
60 lines
2.7 KiB
Bash
60 lines
2.7 KiB
Bash
#!/usr/bin/env bash
|
|
# #82 FOUR-NODE LIMP VERIFICATION: do peers see a gimped mech step-drag, or skate?
|
|
#
|
|
# Node A gimps a LEG ~2s after it is alive (BT_SELF_DAMAGE_ZONE=leg resolves the
|
|
# zone symbolically -- numeric ids are per-mech-type) and circles slowly in its
|
|
# own spawn area from the first second. B/C/D are PLAIN observers: no
|
|
# automation, full keyboard control, parked at spawn. Drive one over and look.
|
|
#
|
|
# Launched through bench_common.sh, so every window is configured EXACTLY like
|
|
# a player's shortcut -- COCKPIT view, glass cockpit, MFDs.
|
|
#
|
|
# ⚠ THE ONE DELIBERATE DIVERGENCE: this bench flies a NOVICE egg. On expert the
|
|
# self-damage bursts roll CRITS on the aimed leg and one myomers crit leaves the
|
|
# mech turning-but-not-moving, which destroys the limp. Crits/heat/jams are
|
|
# therefore OFF here -- do not read damage behaviour off this bench.
|
|
#
|
|
# USER CHECK: the limping mech must STEP-DRAG, never glide/skate.
|
|
# LOG CHECK: [animind] inst=1 entering gait states 22-27 on the observers.
|
|
set -x
|
|
. /c/git/bt411/scratchpad/night6/bench_common.sh
|
|
cd /c/git/bt411/content || exit 1
|
|
bt_assert_player_env
|
|
rm -f mp4l_a.log mp4l_b.log mp4l_c.log mp4l_d.log
|
|
A=/c/git/bt411/scratchpad/night6/runs/$(date +%H%M%S); mkdir -p "$A"; mv matchlog_*.txt "$A"/ 2>/dev/null
|
|
|
|
bt_novice_egg MP4L.EGG MP4LN.EGG
|
|
|
|
observer () { # $1=log $2=affinity $3=port
|
|
# STATIC + fully controllable from frame one. NO autopilot: BT_GOTO's
|
|
# handover is broken (after BT_GOTO_RELEASE the mech reads throttle 0 yet
|
|
# keeps advancing ~40u/s -- the control-mapper demand freezes instead of
|
|
# following the keyboard), so a released mech walks straight past whatever
|
|
# it was sent to watch. Map is arena1, the tightest-spawning map measured
|
|
# (pairwise 41-1055u vs grass ~1200u); the limper is the WHITE Black Hawk.
|
|
BT_MP_LOG=1 BT_SYNC_LOG=1 BT_REPL_LOG=1 BT_MATCHLOG=1 BT_AUDIO_SPATIAL=1 BT_SCORE_LOG=1 BT_DEATH_LOG=1 BT_TLOC_LOG=1 \
|
|
bt_launch "$1" MP4LN.EGG "$2" -net "$3"
|
|
}
|
|
observer mp4l_d.log 0xC0 1801
|
|
sleep 1
|
|
observer mp4l_c.log 0x30 1701
|
|
sleep 1
|
|
observer mp4l_b.log 0x0C 1601
|
|
sleep 1
|
|
# the LIMPER: symbolic leg zone, 2 ticks of 60 -> gimp (no kill) ~2s after
|
|
# alive; slow tight circle from t0 so it never leaves its spawn area.
|
|
BT_MP_LOG=1 BT_DMG_LOG=1 BT_MATCHLOG=1 BT_AUDIO_SPATIAL=1 BT_SCORE_LOG=1 BT_DEATH_LOG=1 BT_TLOC_LOG=1 \
|
|
BT_SELF_DAMAGE=60 BT_SELF_DAMAGE_ZONE=leg BT_SELF_DAMAGE_TICKS=2 BT_SELF_DAMAGE_DELAY=2 \
|
|
BT_AUTODRIVE=0.4 BT_FORCE_TURN=0.45 \
|
|
bt_launch mp4l_a.log MP4LN.EGG 0x03 -net 1501
|
|
sleep 5
|
|
python ../tools/btconsole.py MP4LN.EGG 127.0.0.1:1501 127.0.0.1:1601 \
|
|
127.0.0.1:1701 127.0.0.1:1801 &
|
|
PC=$!
|
|
|
|
sleep 660
|
|
kill $PC 2>/dev/null
|
|
bt_kill_ours
|
|
rm -f MP4LN.EGG
|
|
echo "=== DONE ==="
|