from ob import read_rom, ELEMENT_NAME, get_element_name from struct import unpack_from, calcsize NAME_VADDR_START = 0x8016AF80 NAME_ADDR_START = 0x40E80 ITEM_FORMAT = '>IBBBBHbbbbbbbbbbbbbBBBBBBBBB' def read_item(index): ITEM_SIZE = 0x20 item_start = 0x6230C + (index * ITEM_SIZE) item_end = item_start + ITEM_SIZE return unpack_from(ITEM_FORMAT, read_rom(item_start, item_end)) print(f"Length: 0x{calcsize(ITEM_FORMAT):X}") 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" } for i in range(0, 279): # print(f"Item {i}:") (name_vaddr, item_type, element, field_0x2, field_0x3, field_0x4, strength, intelligence, agility, dexterity, vitality, mem, *rest) = read_item(i) name_addr_diff = (name_vaddr - NAME_VADDR_START) + NAME_ADDR_START name = read_rom(name_addr_diff, name_addr_diff + 32).split(b'\0', 1)[0] (field_0xc, res_strike, res_wind, res_fire, res_earth, res_water, res_holy, res_dark, *rest) = rest rest = (field_0xc, *rest) type_str = ITEM_TYPE_NAME[item_type] if item_type in ITEM_TYPE_NAME else f"Unknown({item_type})" print(f"Name: {name} ({i})") print(f"Type: {type_str}") print(f"Element: {get_element_name(element)}") print(f"STR: \t{strength} \tMEN: \t{mem}") print(f"VIT: \t{vitality} \tAGI: \t{agility}") print(f"INT: \t{intelligence} \tDEX: \t{dexterity}") print() print(f"RES STRIKE: \t{res_strike}") print(f"RES WIND: \t{res_wind}") print(f"RES FIRE: \t{res_fire}") print(f"RES EARTH: \t{res_earth}") print(f"RES WATER: \t{res_water}") print(f"RES HOLY: \t{res_holy}") print(f"RES DARK: \t{res_dark}") for val in rest: print(f"{val:X}") print() print("-------------------------------------------") print()