Files
gen1recomp/tools/gen_rs_script_catalog.py
T
bryanthaboi 6774889505 Add Pokemon Ruby and Sapphire
Ruby and Sapphire 1.0/1.1/1.2 import, play, save, convert and link. Gen 3 shaders, braille, weather and reflection parity, link room players, RS custom carts and launcher support, Gen 3 link fixes for Emerald and FireRed/LeafGreen.
2026-10-05 05:07:42 -04:00

60 lines
2.5 KiB
Python

#!/usr/bin/env python3
"""Classify native RS field scripts and movements by their first source macro."""
import argparse
import re
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
def generate(pret, out):
event = (pret / "include/macros/event.inc").read_text()
movement = (pret / "include/macros/movement.inc").read_text()
scripts = set(re.findall(r"^\s*\.macro\s+(\w+)", event, re.M))
moves = set(re.findall(r"^\s*create_movement_action\s+(\w+)", movement, re.M))
moves.update(re.findall(r"^\s*\.macro\s+(\w+)", movement, re.M))
classified = {"scripts": set(), "movements": set(), "data": set()}
paths = set()
def include(path):
if path in paths:
return
paths.add(path)
for rel in re.findall(r'^\s*\.include\s+"(data/[^\"]+)"', path.read_text(), re.M):
include(pret / rel)
include(pret / "data/event_scripts.s")
for path in sorted(paths):
pending = []
for raw in path.read_text(errors="replace").splitlines():
line = raw.split("@", 1)[0].strip()
if not line or line.startswith("#"):
continue
label = re.fullmatch(r"(\w+)::?", line)
if label:
pending.append(label[1])
continue
token = line.split()[0]
if token in (".align", ".balign"):
continue
kind = ("data" if token in ("brailleformat", ".byte", ".2byte", ".4byte", ".string", ".incbin")
else "scripts" if token in scripts else "movements" if token in moves else None)
if kind:
classified[kind].update(pending)
pending = []
lines = ["-- Generated by tools/gen_rs_script_catalog.py from pokeruby source macros.", "return {"]
for kind, names in classified.items():
lines.append(" " + kind + " = {")
lines.extend(' "' + name + '",' for name in sorted(names))
lines.append(" },")
lines.append("}")
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text("\n".join(lines) + "\n")
print(f"Classified {len(classified['scripts'])} script labels and {len(classified['movements'])} movement labels")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--pret", type=Path, default=ROOT.parent / "pokeruby")
parser.add_argument("--out", type=Path, default=ROOT / "src/import/gba/versions_scripts_rs.lua")
args = parser.parse_args()
generate(args.pret, args.out)