#!/bin/bash # 맵을 돌며 새 소품이 모인 자리를 찍고 물리 점검을 한다. bash prop_tour.sh <꼬리표> [맵 이름 ...] (Forest = 로비 숲 맵) # Entry 에서 Play → 로비 → (Forest 면 그대로) 필드 이동으로 맵마다: 준비 기다림 → 물리 점검(phys_audit) → 시작 자리 + 새 소품 자리 촬영 → 에디터 로그 점검 SP="C:/Users/sw/AppData/Local/Temp/claude/E--BurningTimes/3562a2c1-e88a-4143-b7ec-e74c317778d8/scratchpad" source "$SP/bt.sh" export PYTHONIOENCODING=utf-8 TAG="${1:-p}"; shift MAPS="${@:-Forest Graveyard RuinedKeep SpiderCave PlagueCatacomb HarborExecution ScorchedDesert}" SHOTS="${SHOTS:-5}" st python "$SP/logscan.py" mark unity command clear_console --project-path "$P" --format json --no-banner >/dev/null 2>&1 unity command editor_play --project-path "$P" --format json --no-banner 2>&1 | grep -E '"success"' | head -1 for i in $(seq 1 40); do sleep 3 r=$(ev lobby_ready 2>&1 | head -1) case "$r" in *"scene=Lobby"*"player=True"*"config=True"*) echo "ready $i"; break;; esac done sleep 6 for m in $MAPS; do if [ "$m" != "Forest" ]; then ev travel go "$m" | grep -o "go=[A-Za-z]*" ok="" for k in $(seq 1 60); do sleep 2 s=$(ev travel state 2>&1 | head -1) case "$s" in *"traveling=False"*"current=$m/"*"player=True"*) ok="1"; break;; esac done sleep 8 echo "[$m] ${ok:+OK} $(ev travel state | grep -o 'characters=[0-9]*\|pos=([^)]*)' | tr '\n' ' ')" printf "x" > "$SP/eval/args.txt" J=$(unity command eval_file --file "$SP/eval/phys_audit.cs" --project-path "$P" --detach --format json --no-banner 2>&1 | grep -o '"jobId": *"[a-f0-9]*"' | grep -o '[a-f0-9]\{32\}') unity job wait "$J" --project-path "$P" --timeout 120 --format json --no-banner 2>&1 | python -c " import sys, json raw = sys.stdin.read() try: d = json.loads(raw) except Exception: print(raw[:600]); sys.exit(0) def find(o): if isinstance(o, dict): for k, v in o.items(): if k == 'result' and isinstance(v, str) and len(v) > 10: return v f = find(v) if f: return f if isinstance(o, list): for v in o: f = find(v) if f: return f print(find(d) or json.dumps(d, ensure_ascii=False)[:900]) " else echo "[Forest] $(ev travel state | grep -o 'characters=[0-9]*\|pos=([^)]*)' | tr '\n' ' ')" fi ev shot_cam "prop_${m}_${TAG}_0start" >/dev/null python "$SP/shot_spots.py" "$m" "$SHOTS" > "$SP/spots.txt" while read -r n x z names; do if [ "$m" = "Forest" ]; then # 숲 맵은 플레이어 둘레만 밝다 — 플레이어를 옮겨 놓고 게임 카메라로 찍는다 ev player_move "$x" "$z" >/dev/null sleep 3 ev shot_cam "prop_${m}_${TAG}_${n}" >/dev/null else ev shot_at "prop_${m}_${TAG}_${n}" "$x" "$z" >/dev/null fi echo " shot $n ($x, $z) $names" done < "$SP/spots.txt" python "$SP/logscan.py" scan "after-$m" done unity command editor_stop --project-path "$P" --format json --no-banner 2>&1 | grep -E '"success"' | head -1 sleep 6 st python "$SP/logscan.py" scan "prop-tour-$TAG"