117 lines
3.0 KiB
Python
117 lines
3.0 KiB
Python
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"Leadership rank={class_data.leadership_rank}")
|
|
|
|
# print(f"Leadership rank={class_data.leadership_rank}")
|
|
|
|
# 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:
|
|
unidentified.append(f"{val}: {getattr(class_data, val)}")
|
|
|
|
print("Fields: ")
|
|
print("\n".join(unidentified), end="")
|
|
print()
|
|
print("-----------------------------------------")
|
|
print()
|