#!/usr/bin/env bash # F6 unit 2 -- capture the TITLE's build-in and read the sweep's drawn alpha. # # Discriminator: pteff03's LEAF declares alpha 255 from its own t=0, while its # PARENT ramps 0->255 across t=70..100. So in the drawn vertex colour: # flat 255 throughout => the parent is NOT multiplied in # a ramp 0->255 => it IS # That also settles the port's own flagged ambiguity, whose stated separating # interval (t=100..238) is the same one F6 is about. # # Simpler than the menu probe on purpose: ONE A press to skip the attract video, # then no further input, so the title builds in undisturbed and stays. set -u export HOME=/sylph-home/re SDL_AUDIODRIVER=dummy DISPLAY=:98 export XENIA_PAD_FILE=/tmp/xenia_pad.txt OUT="${1:-/sylph-home/re/f5}"; mkdir -p "$OUT"; rm -f "$OUT"/xenia_re_ui_draws_*.log pad(){ printf '%s' "$1" > "$XENIA_PAD_FILE.tmp"; mv "$XENIA_PAD_FILE.tmp" "$XENIA_PAD_FILE"; } pad "" ( cd "$OUT" && nohup run-canary --log_ui_draws=true \ --ui_draw_capture_frames=6000 --ui_draw_capture_max=1500000 \ >"$OUT/canary.stdout" 2>"$OUT/canary.stderr" & ) sleep 8 win="$(xdotool search --name "Xenia-canary" | tail -1)" [ -n "$win" ] || { echo "FATAL: no Xenia window"; pkill -x xenia_canary; exit 1; } xdotool windowactivate "$win" 2>/dev/null; xdotool key --window "$win" F10; xdotool key F10 echo "armed at ${SECONDS}s" sleep 12; pad "press=A"; sleep 0.4; pad ""; echo "A (skip video) at ${SECONDS}s" # ⚠️ ARMING IS NOT CONFIRMED BY SENDING THE KEY. Twice now a probe has printed # "armed", pressed on, and written no draw log at all -- once because the window # lookup failed, once with the window found and the key sent. A probe that cannot # confirm its own instrument is recording is a probe whose negatives mean nothing. # So: wait for the log to exist AND grow, and abort loudly if it does not. for _ in $(seq 1 45); do sz=$(stat -c %s "$OUT"/xenia_re_ui_draws_*.log 2>/dev/null | head -1 || echo 0) [ "${sz:-0}" -gt 0 ] && break sleep 1 done [ "${sz:-0}" -gt 0 ] || { echo "FATAL: armed but no draw log after 45s -- not recording"; pkill -x xenia_canary; exit 1; } echo "logging confirmed at ${SECONDS}s (${sz} bytes)" # --- F5: a SECOND A during the title build-in --------------------------- # Discriminator (brief): a snap shows no intermediate alphas, an acceleration # does. Press 2 must land while the build-in is still running. # # ⚠️ BLIND WALL-CLOCK TIMING DOES NOT WORK HERE and the first run proved it: # +16 s put the press at log frame ~1217 when the title had already settled at # ~653, so A was accepted instead of accelerating anything. The build-in is # only ~180 log frames wide and run pacing varies 2x. So GATE ON AN OBSERVABLE: # wait for the sweep's texture page to appear (that IS title t=70..100, the # parent's declared gate opening), then let a fixed number of frames pass. LOG=$(ls "$OUT"/xenia_re_ui_draws_*.log 2>/dev/null | head -1) SWEEP=8154424FFC48FE61 for _ in $(seq 1 900); do grep -q "$SWEEP" "$LOG" 2>/dev/null && break sleep 0.2 done grep -q "$SWEEP" "$LOG" 2>/dev/null || { echo "FATAL: sweep never appeared -- title build-in not seen"; pkill -x xenia_canary; exit 1; } n0=$(grep -c '^--- frame' "$LOG") echo "sweep up at log frame ${n0} (title t~70..100) at ${SECONDS}s" target=$((n0 + ${PRESS2_FRAMES:-40})) until [ "$(grep -c '^--- frame' "$LOG")" -ge "$target" ]; do sleep 0.2; done echo "PRESS2 at log frame ~${target}, ${SECONDS}s" pad "press=A"; sleep 0.4; pad "" sleep 60 pkill -x xenia_canary echo "done at ${SECONDS}s"; ls -la "$OUT"/*.log 2>/dev/null