#!/usr/bin/env 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)