test(dev-save): 添加 Day2Sleep 测试存档与晋升脚本
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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()
|
||||
Reference in New Issue
Block a user