ogrebattle64/tools/items.py

88 lines
2.2 KiB
Python

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",
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}")
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()