papermario/tools/disasm_animation.py
2022-06-12 15:44:36 +01:00

60 lines
2.0 KiB
Python
Executable File

#! /usr/bin/python3
import struct
def read(f):
return struct.unpack('>h', f.read(2))[0]
def i2f(x):
return round(x * 180 / 32767 * 200) / 200
def parse(f):
print('AnimScript script = {')
indent = ' '
while True:
op = read(f)
if op == 0:
print(f'{indent}AS_END,')
break
if op == 1:
print(f'{indent}AS_WAIT, {read(f)},')
elif op == 3:
indent = indent[:-4]
print(f'{indent}AS_END_LOOP,')
elif op == 5:
print(f'{indent}AS_SET_ROTATION, {read(f)}, AS_F({i2f(read(f))}), AS_F({i2f(read(f))}), AS_F({i2f(read(f))}),')
elif op == 6:
print(f'{indent}AS_ADD_ROTATION, {read(f)}, AS_F({i2f(read(f))}), AS_F({i2f(read(f))}), AS_F({i2f(read(f))}),')
elif op == 8:
print(f'{indent}AS_SET_POS, {read(f)}, {read(f)}, {read(f)}, {read(f)},')
elif op == 10:
print(f'{indent}AS_LOOP,')
indent += ' '
elif op == 14:
print(f'{indent}AS_SET_FLAGS, {read(f)},')
elif op == 15:
print(f'{indent}AS_SET_NODE_FLAGS, {read(f)}, {read(f)},')
elif op == 16:
print(f'{indent}AS_CLEAR_NODE_FLAGS, {read(f)}, {read(f)},')
elif op == 17:
print(f'{indent}AS_SET_SCALE, {read(f)}, AS_F({i2f(read(f))}), AS_F({i2f(read(f))}), AS_F({i2f(read(f))}),')
elif op == 18:
print(f'{indent}AS_SET_RENDER_MODE, {read(f)},')
elif op == 19:
print(f'{indent}AS_OP_19,')
else:
raise Exception(str(f'Unknown opcode {op}'))
print('};')
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("file", type=str, help="File to dissassemble from")
parser.add_argument("offset", help="Offset to start dissassembling from")
args = parser.parse_args()
offset = int(args.offset, 16)
with open(args.file, "rb") as f:
f.seek(offset)
parse(f)