feat: add native Tomie adapter and strict import compatibility checks
This commit is contained in:
1 parent
c8d83b3fe7
commit
57a4edcbfd
45 files changed
+2985
-71
No files matched your search
+28
-1
@@ -12,6 +12,7 @@ from app.translation import file_json, put_json
|
||||
|
||||
OPS = set("label camera say scene show hide with play stop queue voice pause menu if while jump call return exec window noop nvl".split())
|
||||
OPS |= {"nani_add_choice", "nani_menu", "nani_clear_choice", "nani_hide_characters", "nani_exit"}
|
||||
OPS.add("nani_command")
|
||||
MISSING = object()
|
||||
|
||||
|
||||
@@ -75,7 +76,7 @@ def validate(doc, manifest):
|
||||
for key in ("expr", "c", "d"):
|
||||
if isinstance(n.get(key), dict):
|
||||
expression(n[key])
|
||||
if op in {"say", "nani_add_choice"}:
|
||||
if op in {"say", "nani_add_choice"} or (op == "nani_command" and "what" in n):
|
||||
if not isinstance(n.get("what"), str) or not isinstance(n.get("tid"), str) or n["tid"] in tids:
|
||||
raise ValueError("Некорректная реплика или повторяющийся tid")
|
||||
tids.add(n["tid"])
|
||||
@@ -110,6 +111,8 @@ def validate(doc, manifest):
|
||||
body(n.get("body"), depth + 1)
|
||||
if op == "exec":
|
||||
statements(n.get("code"))
|
||||
if op == "nani_command" and game.get("runtime") != "tomie/1":
|
||||
raise ValueError("Исходные команды Naninovel требуют плеер Tomie")
|
||||
|
||||
for path, module in scripts.items():
|
||||
check_path(path)
|
||||
@@ -131,6 +134,30 @@ def validate(doc, manifest):
|
||||
raise ValueError("Точка входа не найдена")
|
||||
if any(t not in names for t in targets):
|
||||
raise ValueError("Переход на отсутствующую метку")
|
||||
if game.get("runtime") == "tomie/1":
|
||||
from app.converter.tomie_format import unpack_modules
|
||||
from app.converter.tomie_validation import validate_runtime
|
||||
native = unpack_modules(scripts)
|
||||
issues = validate_runtime({"scripts": native})
|
||||
if issues:
|
||||
raise ValueError(issues[0].message + " (" + issues[0].location + ")")
|
||||
config = game.get("tomie")
|
||||
if not isinstance(config, dict) or not isinstance(config.get("defaults"), dict) or not isinstance(config.get("function_data"), dict):
|
||||
raise ValueError("Отсутствуют исходные настройки Tomie")
|
||||
start = config.get("start", {})
|
||||
script = native.get(start.get("script"))
|
||||
if script is None or start.get("label", "") not in script["labels"]:
|
||||
raise ValueError("Точка входа Tomie не найдена")
|
||||
media = config.get("media")
|
||||
if not isinstance(media, dict):
|
||||
raise ValueError("Не найден индекс медиа Tomie")
|
||||
for collection in ("backgrounds", "characters", "textures", "videos", "audio", "fonts"):
|
||||
if not isinstance(media.get(collection), dict):
|
||||
raise ValueError("Некорректный индекс медиа Tomie: " + collection)
|
||||
for entry in media[collection].values():
|
||||
path = entry.get("file") if isinstance(entry, dict) else entry
|
||||
if not isinstance(path, str) or path not in manifest["files"]:
|
||||
raise ValueError("Отсутствует медиа Tomie: " + str(path))
|
||||
files = manifest["files"]
|
||||
for path, entry in files.items():
|
||||
check_path(path)
|
||||
|
||||
Reference in new issue
Block a user