refactor: move game-specific import logic into profiles; unblock Tomie import
- Add app/games: GameProfile base, registry, ReaderHooks and renpy/naninovel/ tomie profiles. pipeline, preflight, detect and mods dispatch via the registry - Move tomie_* converter modules to app/games/tomie and split out reader hooks, import, mod validation and known defects - Tolerate the 31 authoring defects of the pinned Tomie build as report warnings (exact list, per-script counts); any new defect still blocks import - Frontend: runtime registry (runtimes.ts) with lazy Tomie launcher - Add profile/registry tests and docs/GAME_PROFILES.md; update IMPORT.md Full media export of the original Tomie build is not yet verified. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
bbbcc6a5d8
commit
12ec82c7e6
30 files changed
+700
-196
No files matched your search
@@ -16,13 +16,6 @@ def inspect_naninovel(root: Path, *, work: Path | None = None) -> dict:
|
||||
return inspect_naninovel(root, work=Path(directory))
|
||||
package = read_package(root, work, media=True)
|
||||
try:
|
||||
if package.profile:
|
||||
from app.converter.tomie_format import prepare
|
||||
native = prepare(package)
|
||||
return {"engine": "naninovel", "profile": package.profile, "compatible": True,
|
||||
"scripts": len(native["scripts"]), "textResources": len(package.texts),
|
||||
"commands": sum(len(script["commands"]) for script in native["scripts"].values()),
|
||||
"warnings": {}}
|
||||
data, entry, _ = compile_package(package)
|
||||
resolve_media(package, data)
|
||||
return {"engine": "naninovel", "compatible": True, "scripts": len(package.scripts),
|
||||
@@ -119,9 +112,6 @@ def convert_naninovel(root: Path, work: Path, progress):
|
||||
def _convert_package(root: Path, work: Path, progress, package):
|
||||
from app.converter.pipeline import Result, anchors
|
||||
|
||||
if package.profile:
|
||||
return _convert_tomie(root, work, progress, package)
|
||||
|
||||
data, entry, expressions = compile_package(package)
|
||||
# No media is decoded or written to the blob store before the script gate.
|
||||
files, aliases = export_media(package, data, root, work, progress)
|
||||
@@ -153,38 +143,3 @@ def _convert_package(root: Path, work: Path, progress, package):
|
||||
"scripts": len(package.scripts), "textResources": len(package.texts),
|
||||
"media": len(aliases), "warnings": []}
|
||||
return Result({"format": "pgvn/1", "files": files}, report, root.name, None, total)
|
||||
|
||||
|
||||
def _convert_tomie(root, work, progress, package):
|
||||
from app.converter.pipeline import Result, anchors
|
||||
from app.converter.tomie_assets import export_media as export_tomie_media
|
||||
from app.converter.tomie_format import RUNTIME, modules, prepare
|
||||
|
||||
native = prepare(package) # all script checks precede media decoding/blob writes
|
||||
scripts = modules(native, package.texts)
|
||||
files, media, counts = export_tomie_media(package, root, work, progress)
|
||||
|
||||
def store(path, value):
|
||||
raw = json.dumps(value, ensure_ascii=False, separators=(",", ":")).encode()
|
||||
digest, size = put_bytes(raw, ".json")
|
||||
files[path] = {"hash": digest, "size": size}
|
||||
|
||||
resources = {}
|
||||
for tid, record in package.texts.items():
|
||||
resources.setdefault(record["collection"], {}).setdefault(record["key"], []).append({"tid": tid, **record})
|
||||
for path, module in scripts.items():
|
||||
module["anchors"] = anchors(module["labels"])
|
||||
store(path, module)
|
||||
game = {"format": "pgvn/1", "engine": "naninovel", "runtime": RUNTIME, "title": root.name,
|
||||
"resolution": [1920, 1080], "entry": "nani:" + native["start"]["script"], "scripts": list(scripts),
|
||||
"characters": {}, "images": {}, "transforms": {}, "transitions": {}, "audio": {}, "files": {},
|
||||
"defaults": [], "init": [], "ui": {}, "sourceLang": locales.detect_language(
|
||||
{path: module["labels"] for path, module in scripts.items()}) or "und", "locales": {},
|
||||
"naniResources": resources,
|
||||
"tomie": {**{key: value for key, value in native.items() if key != "scripts"}, "media": media}}
|
||||
store("game.json", game)
|
||||
report = {"engine": "naninovel", "profile": package.profile, "compatible": True, "format": "pgvn/1",
|
||||
"runtime": RUNTIME, "scripts": len(package.scripts), "textResources": len(package.texts),
|
||||
"media": counts, "warnings": []}
|
||||
return Result({"format": "pgvn/1", "files": files}, report, root.name, None,
|
||||
sum(entry["size"] for entry in files.values()))
|
||||
Reference in new issue
Block a user