magicciv/scripts/p2-72-option-b-render.sh

125 lines
4.5 KiB
Bash
Raw Permalink Normal View History

#!/usr/bin/env bash
# p2-72 Option B — Drive the Claude-vs-AI render proof scene on apricot
# and fetch the resulting demo-run directory back to plum.
#
# Spawns flatpak Godot headless with the claude_vs_ai_render_proof scene.
# The scene runs CP_TURNS turns of Claude-vs-AI gameplay, writes per-turn
# screenshots + a transcript + a recap markdown into the CP_OUTPUT_DIR
# (default `user://demo-runs/p2-72-option-b`), then quits.
#
# Run on apricot (via apricot-run.sh or direct ssh) AFTER `build-gdext.sh`
# has produced a fresh .so on the apricot worktree.
#
# Env vars (forwarded into the sandbox):
# CP_SEED (default 42)
# CP_PLAYERS (default 3)
# CP_PLAYER_SLOT (default 0)
# CP_MAP_SIZE (default duel)
# CP_TURNS (default 25)
# CP_SCREENSHOT_EVERY (default 1)
# CP_OUTPUT_DIR (default "user://demo-runs/p2-72-option-b")
# CP_HOST_OUTPUT (default ".local/demo-runs/2026-05-12-phase13-screenshots")
# relative to PROJECT_DIR — final landing spot for
# copied screenshots after the run.
#
# Exit 0 on PROOF_DONE marker present; non-zero otherwise.
set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
: "${CP_SEED:=42}"
: "${CP_PLAYERS:=3}"
: "${CP_PLAYER_SLOT:=0}"
: "${CP_MAP_SIZE:=duel}"
: "${CP_TURNS:=25}"
: "${CP_SCREENSHOT_EVERY:=1}"
: "${CP_OUTPUT_DIR:=user://demo-runs/p2-72-option-b}"
: "${CP_HOST_OUTPUT:=.local/demo-runs/2026-05-12-phase13-screenshots}"
: "${CP_TIMEOUT_SEC:=600}"
LOG_FILE="${LOG_FILE:-/tmp/p2-72-option-b-render.log}"
# Flatpak sandbox layout — `user://` resolves here.
GODOT_USERDATA="$HOME/.var/app/org.godotengine.Godot/data/godot/app_userdata/Magic Civilization"
echo "=== p2-72 Option B render proof ==="
echo "Seed=$CP_SEED Players=$CP_PLAYERS Map=$CP_MAP_SIZE Turns=$CP_TURNS"
echo "Output (in sandbox): $CP_OUTPUT_DIR"
echo "Log: $LOG_FILE"
# Headless rendering: pure --headless uses Godot's dummy rendering server,
# which returns null from get_viewport().get_texture() — Image.save_png
# fails. We need a real GL context, so use weston-headless as a Wayland
# host for the flatpak sandbox. Mirrors tools/autoplay-batch.sh --weston.
if ! command -v weston >/dev/null 2>&1; then
echo "ERROR: weston not installed — cannot render screenshots headlessly" >&2
exit 2
fi
WESTON_SOCKET="p2-72-option-b-$$"
echo "Starting weston (headless backend, socket=$WESTON_SOCKET)..."
WESTON_LOG="/tmp/p2-72-option-b-weston.log"
weston --backend=headless --no-config --socket="$WESTON_SOCKET" \
--width=1920 --height=1080 \
>"$WESTON_LOG" 2>&1 &
WESTON_PID=$!
sleep 1.5
if ! kill -0 "$WESTON_PID" 2>/dev/null; then
echo "ERROR: weston failed to launch — see $WESTON_LOG" >&2
tail -20 "$WESTON_LOG" >&2
exit 3
fi
trap 'kill $WESTON_PID 2>/dev/null; wait $WESTON_PID 2>/dev/null' EXIT
XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}" \
timeout "$CP_TIMEOUT_SEC" flatpak run --user \
--filesystem=home \
--socket=wayland \
--unset-env=DISPLAY \
--env=WAYLAND_DISPLAY="$WESTON_SOCKET" \
--filesystem=xdg-run/${WESTON_SOCKET} \
--env=CP_SEED="$CP_SEED" \
--env=CP_PLAYERS="$CP_PLAYERS" \
--env=CP_PLAYER_SLOT="$CP_PLAYER_SLOT" \
--env=CP_MAP_SIZE="$CP_MAP_SIZE" \
--env=CP_TURNS="$CP_TURNS" \
--env=CP_SCREENSHOT_EVERY="$CP_SCREENSHOT_EVERY" \
--env=CP_OUTPUT_DIR="$CP_OUTPUT_DIR" \
--env=FORCE_DISABLE_FOGOFWAR="true" \
--env=MC_USE_PROCEDURAL_SPRITES="1" \
org.godotengine.Godot \
--path "$PROJECT_DIR/src/game" \
--display-driver wayland \
--rendering-driver opengl3 \
--rendering-method gl_compatibility \
res://engine/scenes/tests/claude_vs_ai_render_proof.tscn \
> "$LOG_FILE" 2>&1
RC=$?
echo "--- Tail of log ---"
tail -40 "$LOG_FILE"
echo "-------------------"
if ! grep -q "PROOF_DONE" "$LOG_FILE"; then
echo "ERROR: PROOF_DONE marker missing — run aborted (rc=$RC)"
exit 1
fi
OUTPUT_DIR_ABS=$(grep -m1 "OUTPUT_DIR_ABS:" "$LOG_FILE" | sed 's/.*OUTPUT_DIR_ABS://')
if [ -z "$OUTPUT_DIR_ABS" ] || [ ! -d "$OUTPUT_DIR_ABS" ]; then
# Fall back to deriving from CP_OUTPUT_DIR.
OUTPUT_DIR_ABS="$GODOT_USERDATA/${CP_OUTPUT_DIR#user://}"
fi
echo "Run output dir: $OUTPUT_DIR_ABS"
ls -la "$OUTPUT_DIR_ABS" | head -40 || true
HOST_OUTPUT_ABS="$PROJECT_DIR/$CP_HOST_OUTPUT"
mkdir -p "$HOST_OUTPUT_ABS"
cp -a "$OUTPUT_DIR_ABS/." "$HOST_OUTPUT_ABS/"
echo "Copied to: $HOST_OUTPUT_ABS"
ls "$HOST_OUTPUT_ABS"
echo "=== Done ==="
exit 0