ogrebattle64/tools/class_data.py

113 lines
2.9 KiB
Python

from ob import read_rom, ELEMENT_NAME
from struct import unpack_from, calcsize
from typing import NamedTuple
import textwrap
import item_data
NAME_VADDR_START = 0x8016AF80
NAME_ADDR_START = 0x40E80
CLASS_DATA = 0x5DB14
CLASS_FORMAT = '>IBBBBHBBHBBHBBHBBHBBHBBHBBBBBBBBBBBBHHHHBBBBBBBBBBBBBBBBBB'
class ClassData(NamedTuple):
name: int
field_0x4: int
gender: int
# None, Unit Leader, Legion Leader
leadership_rank: int
field_0x7: int
max_hp: int
field_0xa: int
field_0xb: int
strength: int
field_0xe: int
field_0xf: int
vitality: int
field_0x12: int
field_0x13: int
intelligence: int
field_0x16: int
field_0x17: int
mentality: int
field_0x1a: int
field_0x1b: int
agility: int
field_0x1e: int
field_0x1f: int
dexterity: int
field_0x22: int
field_0x23: int
field_0x24: int
field_0x25: int
field_0x26: int
field_0x27: int
field_0x28: int
field_0x29: int
field_0x2a: int
field_0x2b: int
field_0x2c: int
field_0x2d: int
item_upper_left: int
item_upper_right: int
item_lower_left: int
item_lower_right: int
field_0x36: int
ability_front: int
ability_front_hits: int
ability_middle: int
ability_middle_hits: int
ability_back: int
ability_back_hits: int
field_0x3d: int
field_0x3e: int
field_0x3f: int
field_0x40: int
field_0x41: int
field_0x42: int
field_0x43: int
field_0x44: int
field_0x45: int
element: int
max_items: int
def read_class(index):
CLASS_SIZE = 0x48
class_start = CLASS_DATA + (index * CLASS_SIZE)
class_end = class_start + CLASS_SIZE
return ClassData(*unpack_from(CLASS_FORMAT, read_rom(class_start, class_end)))
if __name__ == "__main__":
MAX_CLASSES = 165
for i in range(1, MAX_CLASSES):
class_data = read_class(i)
name_addr_diff = (class_data.name - NAME_VADDR_START) + NAME_ADDR_START
name = read_rom(name_addr_diff, name_addr_diff + 32).split(b'\0', 1)[0]
print(f"Class= {name} ({i})\t")
print(f"ItemUpperLeft= {item_data.item_get_name(item_data.item_read(class_data.item_upper_left).name)}")
print(f"ItemUpperRight= {item_data.item_get_name(item_data.item_read(class_data.item_upper_right).name)}")
print(f"ItemLowerLeft= {item_data.item_get_name(item_data.item_read(class_data.item_lower_left).name)}")
print(f"ItemLowerRight= {item_data.item_get_name(item_data.item_read(class_data.item_lower_right).name)}")
unidentified = []
for val in class_data._fields:
if val.startswith("field_"):
unidentified.append(f"{val}: {getattr(class_data, val)}")
print("Unidentified fields: ")
print("\n".join(unidentified), end="")
print()
print("-----------------------------------------")
print()