mirror of
https://github.com/zeldaret/oot.git
synced 2025-07-04 15:04:31 +00:00
parent
3dd521eef5
commit
e672778b0e
136 changed files with 1883 additions and 170 deletions
196
tools/bootstrap_fx.py
Executable file
196
tools/bootstrap_fx.py
Executable file
|
@ -0,0 +1,196 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
|
||||
script_dir = os.path.dirname(os.path.realpath(__file__))
|
||||
root_dir = script_dir + "/../"
|
||||
data_dir = root_dir + "data/overlays/effects"
|
||||
asm_dir = root_dir + "asm/non_matchings/overlays/effects"
|
||||
src_dir = root_dir + "src/overlays/effects"
|
||||
include_dir = root_dir + "include"
|
||||
indent = " "
|
||||
|
||||
effect_enum = [
|
||||
"EFFECT_SS_DUST",
|
||||
"EFFECT_SS_KIRAKIRA",
|
||||
"EFFECT_SS_BOMB",
|
||||
"EFFECT_SS_BOMB2",
|
||||
"EFFECT_SS_BLAST",
|
||||
"EFFECT_SS_G_SPK",
|
||||
"EFFECT_SS_D_FIRE",
|
||||
"EFFECT_SS_BUBBLE",
|
||||
"EFFECT_SS_UNSET",
|
||||
"EFFECT_SS_G_RIPPLE",
|
||||
"EFFECT_SS_G_SPLASH",
|
||||
"EFFECT_SS_G_MAGMA",
|
||||
"EFFECT_SS_G_FIRE",
|
||||
"EFFECT_SS_LIGHTNING",
|
||||
"EFFECT_SS_DT_BUBBLE",
|
||||
"EFFECT_SS_HAHEN",
|
||||
"EFFECT_SS_STICK",
|
||||
"EFFECT_SS_SIBUKI",
|
||||
"EFFECT_SS_SIBUKI2",
|
||||
"EFFECT_SS_G_MAGMA2",
|
||||
"EFFECT_SS_STONE1",
|
||||
"EFFECT_SS_HITMARK",
|
||||
"EFFECT_SS_FHG_FLASH",
|
||||
"EFFECT_SS_K_FIRE",
|
||||
"EFFECT_SS_SOLDER_SRCH_BALL",
|
||||
"EFFECT_SS_KAKERA",
|
||||
"EFFECT_SS_ICE_PIECE",
|
||||
"EFFECT_SS_EN_ICE",
|
||||
"EFFECT_SS_FIRE_TAIL",
|
||||
"EFFECT_SS_EN_FIRE",
|
||||
"EFFECT_SS_EXTRA",
|
||||
"EFFECT_SS_FCIRCLE",
|
||||
"EFFECT_SS_DEAD_DB",
|
||||
"EFFECT_SS_DEAD_DD",
|
||||
"EFFECT_SS_DEAD_DS",
|
||||
"EFFECT_SS_DEAD_SOUND",
|
||||
"EFFECT_SS_ICE_SMOKE",
|
||||
]
|
||||
|
||||
to_rename = []
|
||||
|
||||
|
||||
def get_regs_enum(short_name):
|
||||
upper_name = short_name.upper()
|
||||
return \
|
||||
"typedef enum {\n" + \
|
||||
indent + "/* 0x00 */ SS_" + upper_name + "_0,\n" + \
|
||||
indent + "/* 0x01 */ SS_" + upper_name + "_1,\n" + \
|
||||
indent + "/* 0x02 */ SS_" + upper_name + "_2,\n" + \
|
||||
indent + "/* 0x03 */ SS_" + upper_name + "_3,\n" + \
|
||||
indent + "/* 0x04 */ SS_" + upper_name + "_4,\n" + \
|
||||
indent + "/* 0x05 */ SS_" + upper_name + "_5,\n" + \
|
||||
indent + "/* 0x06 */ SS_" + upper_name + "_6,\n" + \
|
||||
indent + "/* 0x07 */ SS_" + upper_name + "_7,\n" + \
|
||||
indent + "/* 0x08 */ SS_" + upper_name + "_8,\n" + \
|
||||
indent + "/* 0x09 */ SS_" + upper_name + "_9,\n" + \
|
||||
indent + "/* 0x0A */ SS_" + upper_name + "_A,\n" + \
|
||||
indent + "/* 0x0B */ SS_" + upper_name + "_B,\n" + \
|
||||
indent + "/* 0x0C */ SS_" + upper_name + "_C,\n" + \
|
||||
"} " + "EffectSs" + short_name + "Regs;\n"
|
||||
|
||||
def bootstrap(ovl_path, ovl_text):
|
||||
path_split = ovl_path.split(os.path.sep)
|
||||
z_name = path_split[-1][:-2]
|
||||
ovl_name = path_split[-2]
|
||||
short_name = ovl_name[14:]
|
||||
init_vars_name = ovl_name[4:] + "_InitVars"
|
||||
|
||||
top_comment = "/*\n * File: " + z_name + ".c" \
|
||||
"\n * Overlay: " + ovl_name + "\n * Description:\n */\n"
|
||||
header_include = "#include \"" + z_name + ".h\"\n"
|
||||
regs_enum = get_regs_enum(short_name)
|
||||
|
||||
with open(os.path.join(data_dir, z_name + ".data.s")) as f:
|
||||
data_text = f.read()
|
||||
|
||||
pattern = re.compile("glabel " + init_vars_name +
|
||||
"\n.word 0x........\n\.word func_........\n")
|
||||
init_data = pattern.search(data_text)
|
||||
if init_data is None or len(init_data.regs) == 0:
|
||||
return ""
|
||||
init_data = data_text[init_data.regs[0][0]:init_data.regs[0][1]]
|
||||
|
||||
lines = init_data.split("\n")
|
||||
|
||||
effect_id = int(lines[1][6:], 16)
|
||||
init_func = lines[2][6:]
|
||||
|
||||
ovl_shortened = ovl_name.replace("ovl", "").replace("_", "")
|
||||
init_func_name = ovl_shortened + "_Init"
|
||||
|
||||
ovl_text = ovl_text.replace(init_func, init_func_name)
|
||||
to_rename.append((init_func, init_func_name))
|
||||
|
||||
effect_id_name = effect_enum[effect_id]
|
||||
|
||||
struct_text = "/*\nEffectSsInit " + init_vars_name + \
|
||||
" = {\n" + indent + effect_id_name + \
|
||||
",\n" + indent + init_func_name + ",\n};\n*/"
|
||||
|
||||
decs = "u32 " + init_func_name + \
|
||||
"(GlobalContext* globalCtx, u32 index, EffectSs* this, void* initParamsx);\n"
|
||||
decs += "void " + \
|
||||
init_func_name[:-4] + \
|
||||
"Draw(GlobalContext* globalCtx, u32 index, EffectSs* this);\n"
|
||||
decs += "void " + \
|
||||
init_func_name[:-4] + \
|
||||
"Update(GlobalContext* globalCtx, u32 index, EffectSs* this);\n"
|
||||
|
||||
insert_pos = ovl_text.find("global.h>\n")
|
||||
|
||||
return top_comment + "\n" + header_include + "\n" + regs_enum + "\n" + decs + "\n" + struct_text + "\n" + ovl_text[insert_pos + 10:]
|
||||
|
||||
|
||||
def get_header(header_path):
|
||||
path_split = header_path.split(os.path.sep)
|
||||
ovl_name = path_split[-2]
|
||||
short_name = ovl_name[14:]
|
||||
init_vars_name = "".join(ovl_name[4:].split("_")) + "InitParams"
|
||||
|
||||
ifndef = "#ifndef _Z_EFF_SS_" + short_name.upper() + "_H_\n" + \
|
||||
"#define _Z_EFF_SS_" + short_name.upper() + "_H_\n\n"
|
||||
|
||||
includes = "#include <ultra64.h>\n#include <global.h>\n\n"
|
||||
|
||||
struct = "typedef struct {\n" + \
|
||||
indent + "/* 0x00 */ Vec3f pos;\n" + \
|
||||
indent + "/* 0x0C */ Vec3f velocity;\n" + \
|
||||
indent + "/* 0x18 */ Vec3f accel;\n" + \
|
||||
"} " + init_vars_name + "; // size = 0x\n\n#endif\n"
|
||||
|
||||
return ifndef + includes + struct
|
||||
|
||||
def rename():
|
||||
# Filenames first
|
||||
for root, dirs, files in os.walk(root_dir):
|
||||
for file in files:
|
||||
for elem in to_rename:
|
||||
if elem[0] in file:
|
||||
new_file = file.replace(elem[0], elem[1])
|
||||
file_path = os.path.join(root, file)
|
||||
new_file_path = os.path.join(root, new_file)
|
||||
os.rename(file_path, new_file_path)
|
||||
|
||||
# File contents
|
||||
for root, dirs, files in os.walk(root_dir):
|
||||
for file in files:
|
||||
if file.endswith(".c") or file.endswith(".s"):
|
||||
file_path = os.path.join(root, file)
|
||||
with open(file_path) as f:
|
||||
file_text = f.read()
|
||||
new_file_text = file_text
|
||||
for elem in to_rename:
|
||||
# if "func_" in elem[0]:
|
||||
# new_file_text = new_file_text.replace("glabel " + elem[0], elem[1] + ":")
|
||||
new_file_text = new_file_text.replace(elem[0], elem[1])
|
||||
if new_file_text != file_text:
|
||||
with open(file_path, "w", newline="\n") as f:
|
||||
f.write(new_file_text)
|
||||
|
||||
def main():
|
||||
for root, dirs, files in os.walk(src_dir):
|
||||
for file in files:
|
||||
if file.endswith(".c"):
|
||||
file_path = os.path.join(root, file)
|
||||
with open(file_path) as f:
|
||||
file_text = f.read()
|
||||
brace_count = file_text.count("{")
|
||||
if brace_count == 0:
|
||||
if "dead" in file_path:
|
||||
dog = 5
|
||||
header_path = file_path[:-1] + "h"
|
||||
c_text = bootstrap(file_path, file_text)
|
||||
header_text = get_header(header_path)
|
||||
with open(file_path, "w", newline="\n") as f:
|
||||
f.write(c_text)
|
||||
with open(header_path, "w", newline="\n") as f:
|
||||
f.write(header_text)
|
||||
rename()
|
||||
|
||||
main()
|
Loading…
Add table
Add a link
Reference in a new issue