pilot: RB fires, Y is the main mount, and guided missiles produce the first kills
fire_probe.sh holds each pad input in flight and photographs the HUD ammo counters. RB moves NOSE BM 06000 -> 05956 in 4 s (~11 rounds/s, HEAT rises); Y moves MAIN MPM 00300 -> 00299; nothing else moves either counter. So the control mapping is measured rather than assumed, and 'we never shoot' is dead: we shoot and miss. The disc data says to stop shooting: Shell_TCAF_DeltaSaber_Missile_P is Power 200, GuidanceType 5 (guided), MaximumRange 5000, versus the nose gun's Power 15 unguided — one missile is worth ~14 gun hits on a 500 HP fighter and it steers itself. Launching them (press Y, release a tick later, >=2 s apart) produced YOU KILLED: WARPLANES 0002 — the first non-zero kill counter of the series, against 0000 in all five gun-only runs, with hostiles down 134 -> 104. Still only 2 kills per 98 missiles (~2%). Likely cause: the game expects a lock before launch and an unlocked missile is wasted. Reading the lock state out of RAM is the next step.
This commit is contained in:
42
tools/re-capture/fire_probe.sh
Executable file
42
tools/re-capture/fire_probe.sh
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
# Does the pad actually DISCHARGE a weapon? Hold each candidate input in turn
|
||||
# and photograph the HUD's ammo counters.
|
||||
#
|
||||
# Why this exists: the autopilot's HUD kill counters read WARSHIPS 0000 /
|
||||
# WARPLANES 0000 at the end of every run, in every targeting configuration, so
|
||||
# "fraction of frames with the guns commanded on" was never measuring anything.
|
||||
# Before tuning aim any further, settle the prior question — whether the fire
|
||||
# command reaches the gun at all. The HUD carries a live ammo count (`MAIN MPM
|
||||
# 00300`, matched to `LoadingCount` by the weapon RE), so the counter falling
|
||||
# during a hold is direct evidence of a discharge, and the counter sitting still
|
||||
# through every button is direct evidence that we have never fired a shot.
|
||||
#
|
||||
# `RB fires` came from an earlier session; this re-tests it rather than assuming
|
||||
# it, and sweeps the other buttons so a wrong mapping cannot hide.
|
||||
set -u
|
||||
export HOME=/sylph-home/re SDL_AUDIODRIVER=dummy DISPLAY=:98
|
||||
export PYTHONPATH=/sylph-home/.local/lib/python3.12/site-packages
|
||||
SD="$(cd "$(dirname "$0")" && pwd)"
|
||||
SHOTS=/sylph-home/re/shots
|
||||
HOLD="${1:-4}"
|
||||
|
||||
shot(){ screenshot "$SHOTS/fire-$1.png" >/dev/null 2>&1; echo " shot $1"; }
|
||||
|
||||
"$SD/launch_mission.sh" fly || { echo "BOOT FAILED"; exit 1; }
|
||||
sleep 3
|
||||
echo "=== probing (hold ${HOLD}s each) ==="
|
||||
shot "00-idle"
|
||||
|
||||
# RB first: it is the incumbent claim. Then the rest, so a wrong mapping cannot
|
||||
# hide behind it. A/B/X/Y may also switch weapon or open something — that is
|
||||
# fine for a probe, and the final frame records wherever it ended up.
|
||||
for b in RB LB Y X B A LS RS; do
|
||||
vgamepad press "$b"; sleep "$HOLD"; shot "hold-$b"; vgamepad release "$b"; sleep 1.5
|
||||
done
|
||||
|
||||
# triggers are analogue, not buttons
|
||||
vgamepad trig RT 1.0; sleep "$HOLD"; shot "hold-RT"; vgamepad trig RT 0.0; sleep 1.5
|
||||
vgamepad trig LT 1.0; sleep "$HOLD"; shot "hold-LT"; vgamepad trig LT 0.0; sleep 1.5
|
||||
vgamepad reset
|
||||
shot "99-final"
|
||||
echo "PROBE DONE"
|
||||
Reference in New Issue
Block a user