ogrebattle64/tools/equipment_data.py

120 lines
3.0 KiB
Python

from ob import read_rom, ELEMENT_NAME, get_element_name
from struct import unpack_from, calcsize
from typing import NamedTuple
OVERLAY_VADDR_START = 0x8016AF80
OVERLAY_ADDR_START = 0x40E80
ITEM_FORMAT = '>IBBBBHbbbbbbbbbbbbbBBBBBBBBB'
ITEM_SIZE = 0x20
class ItemData(NamedTuple):
name: int
item_type: int
element: int
field_0x6: int
field_0x7: int
buy_price: int
strength: int
intelligence: int
agility: int
dexterity: int
vitality: int
mem : int
field_0x10: int
res_strike: int
res_wind: int
res_fire: int
res_earth: int
res_water: int
res_holy: int
res_dark: int
field_0x18: int
field_0x19: int
field_0x1a: int
field_0x1b: int
field_0x1c: int
field_0x1d: int
field_0x1e: int
field_0x1f: int
def item_get_name(ptr):
# Read the name from the ROM
name_addr_diff = (ptr - OVERLAY_VADDR_START) + OVERLAY_ADDR_START
return read_rom(name_addr_diff, name_addr_diff + 32).split(b'\0', 1)[0]
ITEM_TYPE_NAME = {
0: "None",
1: "Sword",
2: "Greatsword",
3: "Thrusting Sword",
4: "1-Handed Hammer",
5: "2-Handed Hammer",
6: "Short Spear",
7: "Spear",
8: "Whip",
9: "Claw",
10: "Bow",
11: "Mace",
12: "Staff",
13: "Doll",
14: "Small Shield",
15: "Shield",
16: "Light Armor",
17: "Armor",
18: "Full Body Armor",
19: "Robe",
20: "Garment",
21: "Helm",
22: "Headgear",
23: "Spellbook",
24: "Fan",
25: "Accessory",
255: "Invalid"
}
def item_get_type_name(item_type):
return ITEM_TYPE_NAME[item_type] if item_type in ITEM_TYPE_NAME else f"Unknown({item_type})"
def item_read(index):
item_start = 0x6230C + (index * ITEM_SIZE)
item_end = item_start + ITEM_SIZE
return ItemData(*unpack_from(ITEM_FORMAT, read_rom(item_start, item_end)))
if __name__ == "__main__":
MAX_ITEM = 279
for i in range(1, MAX_ITEM):
item = item_read(i)
print(f"Name: {item_get_name(item.name)} ({i})")
print(f"Type: {item_get_type_name(item.item_type)}")
print(f"Element: {get_element_name(item.element)}")
print(f"STR: \t{item.strength} \tMEN: \t{item.mem}")
print(f"VIT: \t{item.vitality} \tAGI: \t{item.agility}")
print(f"INT: \t{item.intelligence} \tDEX: \t{item.dexterity}")
print()
print(f"RES STRIKE: \t{item.res_strike}")
print(f"RES WIND: \t{item.res_wind}")
print(f"RES FIRE: \t{item.res_fire}")
print(f"RES EARTH: \t{item.res_earth}")
print(f"RES WATER: \t{item.res_water}")
print(f"RES HOLY: \t{item.res_holy}")
print(f"RES DARK: \t{item.res_dark}")
unidentified = []
for val in item._fields:
if val.startswith("field_"):
unidentified.append(f"{val}: {getattr(item, val)}")
print("Unidentified fields: ")
print(", ".join(unidentified), end="")
print()
print("-------------------------------------------")
print()