"""资产清单校验:game.js 引用的每个音频 id 都必须有 .ogg 和 .m4a。 - 提取所有 'bgm/xxx' 'voice/xxx' 'sfx/xxx' 字面量 id; - numIds() 里动态拼的 voice/num_${k}(k=0..9)特判展开。 用法:python3 gen/check_assets.py """ import os import re import sys HERE = os.path.dirname(__file__) GAME_DIR = os.path.normpath(os.path.join(HERE, "..")) AUDIO = os.path.join(GAME_DIR, "audio") src = "" for js in ("game.js", "index.html"): with open(os.path.join(GAME_DIR, js), encoding="utf-8") as f: src += f.read() ids = set(re.findall(r"['\"]((?:bgm|voice|sfx)/[a-z0-9_]+)['\"]", src)) # 动态拼接的数字语音 voice/num_0 .. voice/num_9 if re.search(r"voice/num_\$\{", src) or "voice/num_" in src: ids.update(f"voice/num_{k}" for k in range(10)) missing = [] for aid in sorted(ids): for ext in (".ogg", ".m4a"): if not os.path.isfile(os.path.join(AUDIO, aid + ext)): missing.append(aid + ext) print(f"引用音频 id 数: {len(ids)}") if missing: print("缺失文件:") for m in missing: print(" ", m) sys.exit(1) # 反向检查:目录里有但代码没引用的资产(提示,不失败) unreferenced = [] for layer in ("bgm", "voice", "sfx"): d = os.path.join(AUDIO, layer) for f in os.listdir(d): if f.endswith(".ogg") and f"{layer}/{f[:-4]}" not in ids: unreferenced.append(f"{layer}/{f}") if unreferenced: print("未被引用的资产(提示):", ", ".join(sorted(unreferenced))) print("OK:全部引用 id 均有 .ogg 与 .m4a")