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()