diff --git a/include/common.h b/include/common.h index 2ef6548..5116529 100644 --- a/include/common.h +++ b/include/common.h @@ -310,8 +310,13 @@ typedef struct { /* 0x0a */ u8 field_0xa; /* 0x0b */ u8 field_0xb; /* 0x0c */ const char* name; -} MaybeAttackData; // size:0x10 +} AbilityData; // size:0x10 -extern MaybeAttackData __MAYBE_ATTACK_DATA[]; +extern AbilityData ABILITY_DATA[]; + +Element ability_get_element(u8 index, u16 arg1, u16 arg2, s32 arg3, u16 arg4); + +extern u16 func_8016FA34(u16, u16, u16, u16); +extern u16 func_8016FB50(u16, u16, u16, u16); #endif \ No newline at end of file diff --git a/include/element.h b/include/element.h index 0cdd9b6..bf827de 100644 --- a/include/element.h +++ b/include/element.h @@ -1,18 +1,20 @@ #ifndef __ELEMENT_H__ #define __ELEMENT_H__ -typedef enum { - ELEMENT_PHYSICAL, - ELEMENT_WIND, - ELEMENT_FLAME, - ELEMENT_EARTH, - ELEMENT_WATER, - ELEMENT_VIRTUE, - ELEMENT_BANE, +#include - ELEMENT_UNKNOWN_0x10 = 0x10, +typedef u8 Element; - ELEMENT_INVALID = 0xFF, -} __attribute__ ((__packed__)) Element; +#define ELEMENT_PHYSICAL 0 +#define ELEMENT_WIND 1 +#define ELEMENT_FLAME 2 +#define ELEMENT_EARTH 3 +#define ELEMENT_WATER 4 +#define ELEMENT_VIRTUE 5 +#define ELEMENT_BANE 6 + +#define ELEMENT_UNKNOWN_0x10 0x10 + +#define ELEMENT_INVALID 0xFF #endif diff --git a/src/item.c b/src/item.c index 4f8d696..53ca94c 100644 --- a/src/item.c +++ b/src/item.c @@ -104,15 +104,30 @@ INCLUDE_ASM(const s32, "item", func_8016E338); INCLUDE_ASM(const s32, "item", func_8016E440); -// INCLUDE_ASM(const s32, "item", func_8016E458); - /* 44358 8016E458 */ -u8 func_8016E458(u8 arg0) { - return __MAYBE_ATTACK_DATA[arg0].field_0x0; +u8 func_8016E458(u8 index) { + return ABILITY_DATA[index].field_0x0; } +/* 44370 8016E470 */ +Element ability_get_element(u8 index, u16 arg1, u16 arg2, s32 arg3, u16 arg4) { + u16 item_index; + + if (ABILITY_DATA[index].element != ELEMENT_INVALID && ABILITY_DATA[index].element != 0xF) + return ABILITY_DATA[index].element; + + if (ABILITY_DATA[index].field_0x0 == 3) { + item_index = func_8016FB50(arg1, arg2, arg3, arg4); + } else { + item_index = func_8016FA34(arg1, arg2, arg3, arg4); + } + + if (item_index == 0) + return 0; + + return item_get_element(item_index); +} -INCLUDE_ASM(const s32, "item", func_8016E470); INCLUDE_ASM(const s32, "item", func_8016E50C); diff --git a/symbol_addrs.txt b/symbol_addrs.txt index c9e8720..83c084e 100644 --- a/symbol_addrs.txt +++ b/symbol_addrs.txt @@ -1,4 +1,4 @@ -__MAYBE_ATTACK_DATA = 0x8018AA80; // rom:0x60980 size:0x10 +ABILITY_DATA = 0x8018AA80; // rom:0x60980 size:0x10 STR_LEVEL_UP = 0x8021DFCC; // rom:0x1B22DC STR_MAXIMUM_HP_UP = 0x8021DFD8; // rom:0x1B22E8 @@ -13,6 +13,8 @@ STR_PHYSICAL = 0x80187660; // rom:0x5D560 type:asciz ITEM_DATA = 0x8018C410; // size:0x20 +ability_get_element = 0x8016E470; + item_get_field_0x0 = 0x8016F5C8; item_get_element = 0x8016F5E0; item_get_field_0x2 = 0x8016F614; diff --git a/tools/attacks.py b/tools/attacks.py index ccc48dc..16bbf0f 100644 --- a/tools/attacks.py +++ b/tools/attacks.py @@ -1,4 +1,4 @@ -from ob import read_rom, ELEMENT_NAMES +from ob import read_rom, ELEMENT_NAME from struct import unpack_from @@ -13,7 +13,7 @@ def read_attack(index): length = 0x6136B - 0x60980 -for i in range(0, 30): +for i in range(0, 130): name_vaddr_start = 0x801876FC name_addr_start = 0x5D5FC @@ -24,10 +24,6 @@ for i in range(0, 30): 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] - print(ELEMENT_NAMES[element]) - print(name) - print(field_0x0) - print(field_0x2) - print(field_0x3) - print(field_0x4) - print(field_0x5) \ No newline at end of file + print(f"{name}:\t", (field_0x0, field_0x2, field_0x3, field_0x4, field_0x5, + field_0x6, field_0x7, field_0x8, field_0x9, field_0xa, + field_0xb)) \ No newline at end of file diff --git a/tools/items.py b/tools/items.py index 2e4aa77..62d6e02 100644 --- a/tools/items.py +++ b/tools/items.py @@ -1,4 +1,4 @@ -from ob import read_rom, ELEMENT_NAMES +from ob import read_rom, ELEMENT_NAME from struct import unpack_from @@ -20,7 +20,7 @@ for i in range(0, 130): (field_0xc, res_strike, res_wind, res_fire, res_earth, res_water, res_holy, res_dark, *rest) = rest; - print(f"Element: {ELEMENT_NAMES[element]}") + print(f"Element: {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}") diff --git a/tools/ob.py b/tools/ob.py index fa3e17c..8a54abb 100644 --- a/tools/ob.py +++ b/tools/ob.py @@ -1,6 +1,6 @@ # OgreBattle util -ELEMENT_NAMES = { +ELEMENT_NAME = { 0: "Physical", 1: "Wind", 2: "Flame", @@ -23,6 +23,173 @@ ELEMENT_NAMES = { 255: "Invalid" } +CLASS_NAME = { + 0x01: "Soldier", + 0x02: "Fighter", + 0x03: "Lycanthrope", + 0x04: "Amazon", + 0x05: "Knight", + 0x06: "Berserker", + 0x07: "Fencer", + 0x08: "Phalanx", + 0x09: "BeastTamer", + 0x0A: "DollMaster", + 0x0B: "Ninja", + 0x0C: "Wizard", + 0x0D: "Archer", + 0x0E: "DragonTamer", + 0x0F: "Valkyrie", + 0x10: "Witch", + 0x11: "Sorceress", + 0x12: "Cleric", + 0x13: "Paladin", + 0x14: "Dragoon", + 0x15: "BlackKnight", + 0x16: "SwordMaster", + 0x17: "Cataphract", + 0x18: "BeastMaster", + 0x19: "Enchanter", + 0x1A: "NinjaMaster", + 0x1B: "Archmage", + 0x1C: "Diana", + 0x1D: "DragonMaster", + 0x1E: "Freya", + 0x1F: "Siren", + 0x20: "Priest", + 0x21: "Princess", + 0x22: "Centurion", + 0x23: "Centurion", + 0x24: "AngelKnight", + 0x25: "Seraph", + 0x26: "Lich", + 0x27: "Hawkman", + 0x28: "Vultan", + 0x29: "Raven", + 0x2A: "Werewolf", + 0x2B: "Vampire", + 0x2C: "Vampire", + 0x2D: "Zombie", + 0x2E: "Zombie", + 0x2F: "Skeleton", + 0x30: "Ghost", + 0x31: "Gorgon", + 0x32: "Pumpkinhead", + 0x33: "Faerie", + 0x34: "Gremlin", + 0x35: "Goblin", + 0x36: "Saturos", + 0x37: "Ogre", + 0x38: "YoungDragon", + 0x39: "ThunderDragon", + 0x3A: "RedDragon", + 0x3B: "EarthDragon", + 0x3C: "BlueDragon", + 0x3D: "PlatinumDragon", + 0x3E: "BlackDragon", + 0x3F: "Quetzalcoatl", + 0x40: "Flarebrass", + 0x41: "AhziDahaka", + 0x42: "Hydra", + 0x43: "Bahamut", + 0x44: "Tiamat", + 0x45: "Wyrm", + 0x46: "Wyvern", + 0x47: "Griffin", + 0x48: "Opinincus", + 0x49: "Cockatrice", + 0x4A: "Sphinx", + 0x4B: "Hellhound", + 0x4C: "Cerberus", + 0x4D: "Giant", + 0x4E: "Golem", + 0x4F: "StoneGolem", + 0x50: "BaldrGolem", + 0x51: "Gladiator", + 0x52: "Vanguard", + 0x53: "General", + 0x54: "Gladiator", + 0x55: "Warrior", + 0x56: "BlazeKnight", + 0x57: "RuneKnight", + 0x58: "Lord", + 0x59: "General", + 0x5A: "BeastMaster", + 0x5B: "Priest", + 0x5C: "Warlock", + 0x5D: "Grappler", + 0x5E: "Centurion", + 0x5F: "Lycanthrope", + 0x60: "Werewolf", + 0x61: "Solidblade", + 0x62: "Overlord", + 0x63: "DarkPrince", + 0x64: "SpecialClass", + 0x65: "FlailMonarch", + 0x66: "DeathTemplar", + 0x67: "TempleCommander", + 0x68: "TempleCommander", + 0x69: "TempleCommander", + 0x6A: "TempleCommander", + 0x6B: "TempleCommander", + 0x6C: "Vanity", + 0x6D: "Vanity", + 0x6E: "Vanity", + 0x6F: "SuperiorKnight", + 0x70: "SuperiorKnight", + 0x71: "Gatekeeper", + 0x72: "Grappler", + 0x73: "KnightTemplar", + 0x74: "Daemon", + 0x75: "Phalanx", + 0x76: "Berserker", + 0x77: "Cleric", + 0x78: "Archer", + 0x79: "Hawkman", + 0x7A: "Siren", + 0x7B: "Enchanter", + 0x7C: "BlackKnight", + 0x7D: "SpecialClass", + 0x7E: "SpecialClass", + 0x7F: "SpecialClass", + 0x80: "SpecialClass", + 0x81: "SpecialClass", + 0x82: "Barkeep", + 0x83: "ElderlyMan", + 0x84: "Commoner", + 0x85: "Commoner", + 0x86: "Danika", + 0x87: "Danika_01", + 0x88: "Danika_02", + 0x89: "Archer", + 0x8A: "Berserker", + 0x8B: "BeastTamer", + 0x8C: "Valkyrie", + 0x8D: "Wizard", + 0x8E: "Phalanx", + 0x8F: "Berserker", + 0x90: "Knight", + 0x91: "NinjaMaster", + 0x92: "DollMaster", + 0x93: "KnightTemplar", + 0x94: "Archmage", + 0x95: "Priest", + 0x96: "BlackKnight", + 0x97: "DragonMaster", + 0x98: "Siren", + 0x99: "Saturos", + 0x9A: "SwordMaster", + 0x9B: "KnightTemplar", + 0x9C: "Dragoon", + 0x9D: "Gorgon", + 0x9E: "Lich", + 0x9F: "Daemon", + 0xA0: "Plaladin", + 0xA1: "Danika", + 0xA2: "Paladin", + 0xA3: "Witch", + 0xA4: "DeathBahamut", +} + def read_rom(start, end): chunksize = end - start with open("baserom.z64", "rb") as f: