120 lines
3.0 KiB
Python
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()
|
|
|