The tutorials need no save and are ~1 min from a cold boot, so they are the cheapest route into a live flight scene. The HUD prints the equipped weapons as NOSE BM 06000 / MAIN MPM 00300 — matching wep_01's LoadingCount 6000 and wep_02's 300, with the weapons identified from the HANGAR loadout rather than from the ammo number. That makes it a genuinely independent confirmation of Ammo Capacity == LoadingCount, from a different renderer in a different mode. Also inventories the HUD elements (heat gauges, shield/armor pools, target armor gauge, per-weapon RANGE markers) and notes that the RANGE gauge draws each weapon's MaximumRange on a scale — a route to a real number where the Arsenal panel only gives a letter class. Adds autopilot.py (waypoint-arrow chaser). It detects reliably but oscillates; recorded as such rather than as a working tool. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
28 lines
1.3 KiB
Bash
Executable File
28 lines
1.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Drive the boot sequence to the main menu without a human in the loop.
|
|
# - movie playing (two grabs 0.6s apart differ a lot) -> tap A to skip
|
|
# - static screen -> if the green "PRESS (A) BUTTON" glyph is there, tap A and stop
|
|
# Static logo screens are left alone, so a stray tap can never land on NEW GAME.
|
|
set -u
|
|
export HOME=/sylph-home/re
|
|
# The X root keeps the DEAD session's last frame, so a fresh launch would be
|
|
# detected as "already at the title". Blank it, and wait for the new window.
|
|
xsetroot -solid black 2>/dev/null || true
|
|
until xdotool search --name "Xenia-canary" >/dev/null 2>&1; do sleep 1; done
|
|
deadline=$(( SECONDS + ${1:-900} ))
|
|
while [ $SECONDS -lt $deadline ]; do
|
|
screenshot /tmp/f1.png >/dev/null 2>&1; sleep 0.6
|
|
screenshot /tmp/f2.png >/dev/null 2>&1
|
|
d=$(compare -metric RMSE /tmp/f1.png /tmp/f2.png null: 2>&1 | sed 's/ .*//' | cut -d. -f1)
|
|
d=${d:-0}
|
|
read -r r g b < <(convert /tmp/f2.png -format "%[fx:int(255*p{625,618}.r)] %[fx:int(255*p{625,618}.g)] %[fx:int(255*p{625,618}.b)]" info:)
|
|
if [ "$g" -gt 130 ] && [ $((g - r)) -gt 45 ] && [ $((g - b)) -gt 45 ]; then
|
|
echo "TITLE at ${SECONDS}s -> A"; vgamepad tap A 250; exit 0
|
|
fi
|
|
if [ "$d" -gt 1500 ]; then
|
|
echo "movie (rmse $d) at ${SECONDS}s -> skip A"; vgamepad tap A 250; sleep 3
|
|
fi
|
|
sleep 1
|
|
done
|
|
echo "TIMEOUT"; exit 1
|