papermario/tools/disasm_hud_element_animation.py
lshamis ae66312d8c
Add Python linter to github actions (#1100)
* Add Python linter to github actions

* wip

* Add back splat_ext

* Format files

* C++ -> C

* format 2 files

* split workflow into separate file, line length 120, fix excludes

* -l 120 in ci

* update black locally and apply formatting changes

* pyproject.toject

---------

Co-authored-by: Ethan Roseman <ethteck@gmail.com>
2023-07-30 02:03:17 +09:00

185 lines
5.9 KiB
Python
Executable File

#!/usr/bin/env python3
import struct
import argparse
def fmt_size(val):
if val == 0:
return "HUD_ELEMENT_SIZE_8x8"
elif val == 1:
return "HUD_ELEMENT_SIZE_16x16"
elif val == 2:
return "HUD_ELEMENT_SIZE_24x24"
elif val == 3:
return "HUD_ELEMENT_SIZE_32x32"
elif val == 4:
return "HUD_ELEMENT_SIZE_48x48"
elif val == 5:
return "HUD_ELEMENT_SIZE_64x64"
elif val == 6:
return "HUD_ELEMENT_SIZE_8x16"
elif val == 7:
return "HUD_ELEMENT_SIZE_16x8"
elif val == 8:
return "HUD_ELEMENT_SIZE_16x24"
elif val == 9:
return "HUD_ELEMENT_SIZE_16x32"
elif val == 10:
return "HUD_ELEMENT_SIZE_64x32"
elif val == 11:
return "HUD_ELEMENT_SIZE_32x16"
elif val == 12:
return "HUD_ELEMENT_SIZE_12x12"
elif val == 13:
return "HUD_ELEMENT_SIZE_48x24"
elif val == 14:
return "HUD_ELEMENT_SIZE_32x8"
elif val == 15:
return "HUD_ELEMENT_SIZE_24x8"
elif val == 16:
return "HUD_ELEMENT_SIZE_64x16"
elif val == 17:
return "HUD_ELEMENT_SIZE_16x64"
elif val == 18:
return "HUD_ELEMENT_SIZE_192x32"
elif val == 19:
return "HUD_ELEMENT_SIZE_40x40"
elif val == 20:
return "HUD_ELEMENT_SIZE_24x16"
elif val == 21:
return "HUD_ELEMENT_SIZE_32x40"
elif val == 22:
return "HUD_ELEMENT_SIZE_40x16"
elif val == 23:
return "HUD_ELEMENT_SIZE_40x24"
elif val == 24:
return "HUD_ELEMENT_SIZE_32x24"
else:
return val
class HudElementScript:
def __init__(self, symbol):
self.symbol = symbol
self.buffer = []
def feed(self, word):
self.buffer.append(word)
def print(self):
buf = iter(self.buffer)
indent = " "
op = 99
print(f"HudScript {self.symbol} = {{")
while op:
op = next(buf, -1)
if op == -1:
break
if op == 0x00:
print(f"{indent}hs_End")
elif op == 0x01:
print(f"{indent}hs_SetRGBA({next(buf)}, {next(buf)}, {next(buf)})")
elif op == 0x02:
print(f"{indent}hs_SetCI({next(buf)}, {next(buf)}, {next(buf)})")
elif op == 0x03:
indent = indent[4:]
print(f"{indent}hs_Restart")
elif op == 0x04:
print(f"{indent}hs_Loop")
indent = indent + " "
elif op == 0x05:
print(f"{indent}hs_SetTileSize({fmt_size(next(buf))})")
elif op == 0x06:
print(f"{indent}hs_SetSizesAutoScale({fmt_size(next(buf))}, {fmt_size(next(buf))})")
elif op == 0x07:
print(f"{indent}hs_SetSizesFixedScale({fmt_size(next(buf))}, {fmt_size(next(buf))})")
elif op == 0x08:
print(f"{indent}hs_SetVisible")
elif op == 0x09:
print(f"{indent}hs_SetHidden")
elif op == 0x0A:
print(f"{indent}hs_AddTexelOffsetX({next(buf)})")
elif op == 0x0B:
print(f"{indent}hs_AddTexelOffsetY({next(buf)})")
elif op == 0x0C:
print(f"{indent}hs_SetTexelOffset({next(buf)}, {next(buf)})")
elif op == 0x0D:
print(f"{indent}hs_SetIcon({next(buf)}, {next(buf)}, {next(buf)}, {next(buf)}, {next(buf)})")
elif op == 0x0E:
print(f"{indent}hs_SetScale({next(buf)})")
elif op == 0x0F:
print(f"{indent}hs_SetAlpha({next(buf)})")
elif op == 0x10:
print(f"{indent}hs_RandomDelay({next(buf)}, {next(buf)})")
elif op == 0x11:
print(f"{indent}hs_Delete")
elif op == 0x12:
print(f"{indent}hs_UseIA8")
elif op == 0x13:
print(f"{indent}hs_SetCustomSize({next(buf)}, {next(buf)})")
elif op == 0x14:
print(f"{indent}hs_RandomRestart({next(buf)}, {next(buf)})")
elif op == 0x15:
print(f"{indent}hs_op_15({next(buf)})")
elif op == 0x17:
count = next(buf)
args = []
for i in range(count):
args.append(next(buf))
print(f"{indent}hs_RandomBranch({', '.join(args)})")
elif op == 0x18:
print(f"{indent}hs_SetFlags({next(buf)})")
elif op == 0x19:
print(f"{indent}hs_ClearFlags({next(buf)})")
elif op == 0x1A:
print(f"{indent}hs_PlaySound({next(buf)})")
elif op == 0x1B:
print(f"{indent}hs_SetPivot({next(buf)})")
else:
print(f"{indent}{op},")
print("};\n")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("file", type=str, help=".data.s file to dissassemble")
args = parser.parse_args()
with open(args.file, "r") as f:
lines = f.readlines()
current_script = None
for line in lines:
line = line.strip()
if line.startswith("glabel"):
if current_script:
current_script.print()
current_script = HudElementScript(line.split(" ")[1])
elif line.startswith(".word"):
words = line[6:].split(", ")
for word in words:
try:
word = int(word, base=0)
if word > 0x8000000:
word = f"0x{word:X}"
else:
(word,) = struct.unpack(">i", struct.pack(">I", word))
print(word)
except ValueError:
pass
current_script.feed(word)
if current_script:
current_script.print()