from ob import read_rom, ELEMENT_NAME from struct import unpack_from, calcsize from typing import NamedTuple import textwrap import equipment_data as 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})") print(f"Gender={class_data.gender}") 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()