Add script to extact .inc files from the game
This commit is contained in:
parent
e40e69e1d8
commit
ed2a2225d7
1 changed files with 101 additions and 0 deletions
101
tools/extract_includes.py
Normal file
101
tools/extract_includes.py
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
from enum import Enum
|
||||
import shutil
|
||||
|
||||
|
||||
class BinaryType(Enum):
|
||||
DOL = 0
|
||||
REL = 1
|
||||
|
||||
|
||||
@dataclass
|
||||
class ExtractedInclude:
|
||||
name: str
|
||||
binary_type: BinaryType
|
||||
from_file: Path
|
||||
address: int
|
||||
size: int
|
||||
alignment: int
|
||||
|
||||
|
||||
version = "GMPE01_00"
|
||||
|
||||
assets_path = Path("assets") / version
|
||||
build_path = Path("build") / version
|
||||
orig_path = Path("orig") / version
|
||||
|
||||
include_path = build_path / "include"
|
||||
dol_path = orig_path / "sys" / "main.dol"
|
||||
rels_path = orig_path / "files" / "dll"
|
||||
|
||||
DOL_SHIFT = 0x80003000
|
||||
REL_SHIFT = -0x2B80
|
||||
|
||||
includes = [
|
||||
ExtractedInclude("ank8x8_4b", BinaryType.DOL, dol_path, 0x8011FE00, 0x2000, 32),
|
||||
ExtractedInclude("Ascii8x8_1bpp", BinaryType.DOL, dol_path, 0x8012DCD7, 0x800, 1),
|
||||
ExtractedInclude("coveropen_en", BinaryType.DOL, dol_path, 0x80132208, 0x1384, 4),
|
||||
ExtractedInclude("fatalerror_en", BinaryType.DOL, dol_path, 0x8013358C, 0x1384, 4),
|
||||
ExtractedInclude("hiliteData", BinaryType.DOL, dol_path, 0x8012C360, 0x480, 32),
|
||||
ExtractedInclude("hiliteData2", BinaryType.DOL, dol_path, 0x8012C7E0, 0x480, 32),
|
||||
ExtractedInclude("hiliteData3", BinaryType.DOL, dol_path, 0x8012CC60, 0x480, 32),
|
||||
ExtractedInclude("hiliteData4", BinaryType.DOL, dol_path, 0x8012D0E0, 0x480, 32),
|
||||
ExtractedInclude("loading_en", BinaryType.DOL, dol_path, 0x80134910, 0x1384, 4),
|
||||
ExtractedInclude(
|
||||
"nintendoData", BinaryType.REL, rels_path / "bootDll.rel", 0xA0, 0x307D, 32
|
||||
),
|
||||
ExtractedInclude("nodisc_en", BinaryType.DOL, dol_path, 0x80135C94, 0x1384, 4),
|
||||
ExtractedInclude("refMapData0", BinaryType.DOL, dol_path, 0x801225A0, 0x1240, 32),
|
||||
ExtractedInclude("refMapData1", BinaryType.DOL, dol_path, 0x801237E0, 0x1100, 32),
|
||||
ExtractedInclude("refMapData2", BinaryType.DOL, dol_path, 0x801248E0, 0x2080, 32),
|
||||
ExtractedInclude("refMapData3", BinaryType.DOL, dol_path, 0x80126960, 0x2080, 32),
|
||||
ExtractedInclude("refMapData4", BinaryType.DOL, dol_path, 0x801289E0, 0x2080, 32),
|
||||
ExtractedInclude("retryerror_en", BinaryType.DOL, dol_path, 0x80137018, 0x1384, 4),
|
||||
ExtractedInclude("toonMapData", BinaryType.DOL, dol_path, 0x8012AA60, 0x880, 32),
|
||||
ExtractedInclude("toonMapData2", BinaryType.DOL, dol_path, 0x8012B2E0, 0x1080, 32),
|
||||
ExtractedInclude("wrongdisc_en", BinaryType.DOL, dol_path, 0x8013839C, 0x1384, 4),
|
||||
]
|
||||
|
||||
INCLUDE_PREAMBLE = """#ifndef ATTRIBUTE_ALIGN
|
||||
#if defined(__MWERKS__) || defined(__GNUC__)
|
||||
#define ATTRIBUTE_ALIGN(num) __attribute__((aligned(num)))
|
||||
#elif defined(_MSC_VER) || defined(__INTELLISENSE__)
|
||||
#define ATTRIBUTE_ALIGN(num)
|
||||
#else
|
||||
#error unknown compiler
|
||||
#endif
|
||||
#endif
|
||||
|
||||
"""
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
Path(include_path).mkdir(parents=True, exist_ok=True)
|
||||
# shutil.copyfile(assets_path / "include" / "macros.inc", include_path / "macros.inc")
|
||||
# shutil.copyfile(assets_path / "config.json", build_path / "config.json")
|
||||
for include in includes:
|
||||
with open(include.from_file, "rb") as f_in:
|
||||
with open(include_path / (include.name + ".inc"), "w+") as f_out:
|
||||
n = include.size
|
||||
addr = include.address - (
|
||||
DOL_SHIFT if include.binary_type == BinaryType.DOL else REL_SHIFT
|
||||
)
|
||||
f_in.seek(addr)
|
||||
f_out.write(INCLUDE_PREAMBLE)
|
||||
f_out.write(
|
||||
f"unsigned char {include.name}[] ATTRIBUTE_ALIGN({include.alignment}) = {{\n"
|
||||
)
|
||||
|
||||
while n > 0:
|
||||
chunk = f_in.read(min(16, n))
|
||||
f_out.write(
|
||||
" "
|
||||
+ ", ".join(
|
||||
[f"0x{val.upper()}" for val in chunk.hex(" ", 1).split()]
|
||||
)
|
||||
+ ",\n"
|
||||
)
|
||||
n -= len(chunk)
|
||||
|
||||
f_out.write("};\n")
|
||||
Loading…
Add table
Add a link
Reference in a new issue