#!/usr/bin/env bash # Identitäts-Vertrag (Karte t_1da96275 — „Editor-Playtest-Physik = Quest 3 # identisch"): dieselbe Probe-Map läuft durch # A) Editor-Playtest (KolliderBau + PlaytestBody im SubViewport) # B) Quest-Client (SvmapWorld + TestmapPlayer, im CLIENT-Projekt) # Beide drucken `IDENT =`-Zeilen; der Runner verlangt, dass die # Zeilen IDENTISCH sind (gleiche Block/Walk-Entscheidungen in beiden Welten) # und dass beide Suiten ihre Soll-Erwartungen erfüllen (Exit 0). # # Environment: # GODOT Godot-Binary (Default: $HOME/bin/godot4, dann $PATH) # SVR_CLIENT_DIR Client-Projektordner (Default: ../scopedvr-client neben # diesem Repo — erkannt an project.godot) # Exit 0 = Identität bestätigt. set -u if [ -n "${GODOT:-}" ]; then : elif [ -x "$HOME/bin/godot4" ]; then GODOT="$HOME/bin/godot4" elif command -v godot4 >/dev/null 2>&1; then GODOT=$(command -v godot4) else echo "FAIL: Kein Godot gefunden — GODOT= setzen." >&2 exit 1 fi EDITOR_DIR="$(cd "$(dirname "$0")/.." && pwd)" # Client-Projekt finden: Env gewinnt, sonst Nachbar-Klon des Editors. CLIENT_DIR="${SVR_CLIENT_DIR:-}" if [ -z "$CLIENT_DIR" ]; then for cand in "$EDITOR_DIR/../scopedvr-client" "$EDITOR_DIR/client"; do if [ -f "$cand/project.godot" ]; then CLIENT_DIR="$cand"; break; fi done fi if [ -z "$CLIENT_DIR" ] || [ ! -f "$CLIENT_DIR/project.godot" ]; then echo "FAIL: Client-Projekt nicht gefunden (SVR_CLIENT_DIR setzen)." >&2 exit 1 fi export GODOT_SILENCE_ROOT_WARNING=1 LOGDIR="${SVR_IDENTITAET_LOGDIR:-/tmp/svr_identitaet_logs_$$}" mkdir -p "$LOGDIR" MAP="${SVR_IDENTITAET_MAP:-/tmp/svr_identitaet_probe.svmap}" export SVR_IDENTITAET_MAP="$MAP" fail=0 echo "== 0) Probe-Map erzeugen ==" "$GODOT" --headless --path "$EDITOR_DIR" -s res://tests/gen_identitaet_map.gd \ > "$LOGDIR/gen.log" 2>&1 if ! grep -q "^IDENT_MAP=" "$LOGDIR/gen.log"; then echo "FAIL: Probe-Map nicht erzeugt (siehe $LOGDIR/gen.log)" >&2 cat "$LOGDIR/gen.log" >&2 exit 1 fi echo "== 1) Import (beide Projekte) ==" "$GODOT" --headless --path "$EDITOR_DIR" --import > "$LOGDIR/import_editor.log" 2>&1 grep -E "Parse Error|SCRIPT ERROR" "$LOGDIR/import_editor.log" | head -5 >&2 "$GODOT" --headless --path "$CLIENT_DIR" --import > "$LOGDIR/import_client.log" 2>&1 grep -E "Parse Error|SCRIPT ERROR" "$LOGDIR/import_client.log" | head -5 >&2 echo "== 2) Editor-Playtest-Probe ==" "$GODOT" --headless --path "$EDITOR_DIR" -s res://tests/test_playtest_identitaet.gd \ > "$LOGDIR/editor.log" 2>&1 code=$? grep -E "^IDENT [a-z_0-9]+=" "$LOGDIR/editor.log" > "$LOGDIR/editor.ident" grep -E "ALL OK|FAILED" "$LOGDIR/editor.log" | tail -1 [ $code -ne 0 ] && fail=1 && echo "Editor-Suite rot (exit=$code):" >&2 && cat "$LOGDIR/editor.log" >&2 echo "== 3) Quest-Client-Probe ==" "$GODOT" --headless --path "$CLIENT_DIR" -s "$EDITOR_DIR/tests/test_identitaet_client.gd" \ > "$LOGDIR/client.log" 2>&1 code=$? grep -E "^IDENT [a-z_0-9]+=" "$LOGDIR/client.log" > "$LOGDIR/client.ident" grep -E "ALL OK|FAILED" "$LOGDIR/client.log" | tail -1 [ $code -ne 0 ] && fail=1 && echo "Client-Suite rot (exit=$code):" >&2 && cat "$LOGDIR/client.log" >&2 echo "== 4) Identitäts-Vergleich ==" n_editor=$(wc -l < "$LOGDIR/editor.ident") n_client=$(wc -l < "$LOGDIR/client.ident") if [ "$n_editor" -lt 6 ] || [ "$n_client" -lt 6 ]; then echo "FAIL: Zu wenige IDENT-Zeilen (editor=$n_editor, client=$n_client) — Suiten sind gecrasht." >&2 tail -20 "$LOGDIR/editor.log" >&2 tail -20 "$LOGDIR/client.log" >&2 fail=1 elif diff -u "$LOGDIR/editor.ident" "$LOGDIR/client.ident" > "$LOGDIR/diff.txt"; then echo "IDENTITAET OK: $n_editor Entscheidungen identisch." else echo "FAIL: Entscheidungen weichen ab:" >&2 cat "$LOGDIR/diff.txt" >&2 fail=1 fi [ $fail -eq 0 ] && echo "Logs: $LOGDIR" && exit 0 echo "Logs: $LOGDIR" exit 1