summaryrefslogtreecommitdiff
path: root/tools/rebuild-decomp-tp.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/rebuild-decomp-tp.py')
-rw-r--r--tools/rebuild-decomp-tp.py88
1 files changed, 88 insertions, 0 deletions
diff --git a/tools/rebuild-decomp-tp.py b/tools/rebuild-decomp-tp.py
new file mode 100644
index 0000000000..e69f1bd33e
--- /dev/null
+++ b/tools/rebuild-decomp-tp.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+from pathlib import Path
+
+if os.name == "nt":
+ DEFAULT_DOLPHIN_CONFIG_PATH = Path(os.getenv('APPDATA')) / "Dolphin Emulator"
+else:
+ DEFAULT_DOLPHIN_CONFIG_PATH = Path("~/.var/app/org.DolphinEmu.dolphin-emu/data/dolphin-emu").expanduser()
+
+def expanded_path(path_str: str):
+ path = Path(path_str)
+ path = path.expanduser()
+ return path
+
+parser = argparse.ArgumentParser()
+parser.add_argument(
+ "vanilla_iso_path",
+ type=expanded_path,
+ help="Path to a vanilla Wind Waker ISO to use as a base.",
+)
+parser.add_argument(
+ "output_iso_path",
+ type=expanded_path,
+ help="Path to put the modified ISO.",
+)
+parser.add_argument(
+ "decomp_repo_path",
+ type=expanded_path,
+ help="Path to the root of the git repository containing the tww decompilation.",
+)
+parser.add_argument(
+ "--map",
+ type=expanded_path,
+ default=DEFAULT_DOLPHIN_CONFIG_PATH / "Maps",
+ help="Folder to place the symbol map for the modified ISO (defaults to Dolphin's maps directory).",
+)
+
+args = parser.parse_args()
+
+decomp_build_path = args.decomp_repo_path / "build/GZ2E01"
+
+import sys
+import os.path
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), "gclib"))
+
+from gclib.gcm import GCM
+from gclib.rarc import RARC
+from gclib.yaz0_yay0 import Yaz0
+from io import BytesIO
+import shutil
+
+gcm = GCM(args.vanilla_iso_path)
+gcm.read_entire_disc()
+
+rels_arc = RARC(gcm.read_file_data("files/RELS.arc"))
+rels_arc.read()
+
+for rel_name in os.listdir(decomp_build_path):
+ if os.path.isfile(decomp_build_path / rel_name):
+ continue
+ if not os.path.isfile(decomp_build_path / rel_name / (rel_name + ".rel")):
+ continue
+ decomp_rel_path = decomp_build_path / rel_name / (rel_name + ".rel")
+ with open(decomp_rel_path, "rb") as f:
+ decomp_rel_data = BytesIO(f.read())
+ rel_file_entry = rels_arc.get_file_entry(rel_name.lower() + ".rel")
+ if rel_file_entry:
+ rel_file_entry.data = Yaz0.compress(decomp_rel_data)
+ else:
+ gcm_rel_file_path = f"files/rel/Final/Release/{rel_name}.rel"
+ assert gcm_rel_file_path in gcm.files_by_path, f"Invalid REL path: {gcm_rel_file_path}"
+ gcm.changed_files[gcm_rel_file_path] = decomp_rel_data
+
+rels_arc.save_changes()
+gcm.changed_files["files/RELS.arc"] = rels_arc.data
+
+with open(decomp_build_path / "framework.dol", "rb") as f:
+ gcm.changed_files["sys/main.dol"] = BytesIO(f.read())
+
+with open(decomp_build_path / "framework.elf.MAP", "rb") as f:
+ gcm.changed_files["files/map/Final/Release/frameworkF.map"] = BytesIO(f.read())
+shutil.copy(decomp_build_path / "framework.elf.MAP", args.map / "GZ2E01.map")
+
+for _ in gcm.export_disc_to_iso_with_changed_files(args.output_iso_path): pass
+
+print("Done")