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.
43 lines
1.9 KiB
Bash
Executable File
43 lines
1.9 KiB
Bash
Executable File
#!/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"
|