test(dev-save): 添加 Day2Sleep 测试存档与晋升脚本

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-13 20:57:03 +08:00
co-authored by Cursor
parent b98214632e
commit 26cfa5d886
38 changed files with 362 additions and 0 deletions
+112
View File
@@ -0,0 +1,112 @@
# -*- coding: utf-8 -*-
"""Promote latest FP_Day2_sleep testsavs into StreamingAssets/TestSaveFiles/Day2Sleep."""
from __future__ import annotations
import json
import shutil
from pathlib import Path
TESTSAVS = Path.home() / "AppData/LocalLow/Tin Bird/AllOurBrokenParts/AllOurBrokenParts/testsavs"
DEST = Path("Assets/StreamingAssets/TestSaveFiles/Day2Sleep")
CATALOG = Path("Assets/StreamingAssets/TestSaveFiles/catalog.json")
YARN = "FP_Day2_sleep"
SCENE = "Scene/梦境"
# Preferred display / folder order for DevJumpTool.
NODE_ORDER = [
"Start",
"醒来",
"广场",
"",
"拿下风筝",
"风筝1",
"风筝2",
"上升",
"裂隙",
"记忆空间",
"",
"end",
"靠近黑暗",
"苏醒",
]
def sanitize(name: str) -> str:
bad = '<>:"/\\|?*'
for c in bad:
name = name.replace(c, "_")
name = name.replace(" ", "_")
if len(name) > 48:
name = name[:48]
return name or "no_node"
def node_sort_key(node: str, saved_at: str) -> tuple:
try:
order = NODE_ORDER.index(node)
except ValueError:
order = 1000
return (order, saved_at, node)
def main() -> None:
by_node: dict[str, dict] = {}
for d in TESTSAVS.iterdir():
if not d.is_dir():
continue
meta_path = d / "meta.json"
snap_path = d / "snapshot.json"
if not snap_path.exists() or not meta_path.exists():
continue
meta = json.loads(meta_path.read_text(encoding="utf-8"))
if meta.get("yarnProjectId") != YARN:
continue
if meta.get("sceneName") != SCENE:
continue
node = meta.get("nodeName") or "no_node"
saved_at = meta.get("savedAt") or ""
prev = by_node.get(node)
if prev is None or saved_at >= prev["saved_at"]:
by_node[node] = {
"dir": d,
"node": node,
"saved_at": saved_at,
"so": meta.get("sceneSoName") or "",
}
if DEST.exists():
shutil.rmtree(DEST)
DEST.mkdir(parents=True, exist_ok=True)
ordered = sorted(by_node.values(), key=lambda x: node_sort_key(x["node"], x["saved_at"]))
print(f"unique nodes: {len(ordered)}")
for i, item in enumerate(ordered, start=1):
folder = f"{i:02d}_{sanitize(item['node'])}"
out = DEST / folder
out.mkdir(parents=True, exist_ok=True)
shutil.copy2(item["dir"] / "snapshot.json", out / "snapshot.json")
shutil.copy2(item["dir"] / "meta.json", out / "meta.json")
print(f"OK {folder} | {item['saved_at']} | so={item['so']} | node={item['node']}")
if CATALOG.exists():
catalog = json.loads(CATALOG.read_text(encoding="utf-8"))
else:
catalog = {"sections": []}
sections = catalog.setdefault("sections", [])
if not any(s.get("id") == "Day2Sleep" for s in sections):
sections.append({"id": "Day2Sleep", "title": "Day2 Sleep"})
CATALOG.write_text(
json.dumps(catalog, ensure_ascii=False, indent=2) + "\n",
encoding="utf-8",
)
print("catalog: added Day2Sleep")
else:
print("catalog: Day2Sleep already present")
print("done")
if __name__ == "__main__":
main()