74 lines
3.1 KiB
Bash
74 lines
3.1 KiB
Bash
|
|
#!/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"
|