parent
222afbe87e
commit
b4947f743f
|
|
@ -310,8 +310,13 @@ typedef struct {
|
||||||
/* 0x0a */ u8 field_0xa;
|
/* 0x0a */ u8 field_0xa;
|
||||||
/* 0x0b */ u8 field_0xb;
|
/* 0x0b */ u8 field_0xb;
|
||||||
/* 0x0c */ const char* name;
|
/* 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
|
#endif
|
||||||
|
|
@ -1,18 +1,20 @@
|
||||||
#ifndef __ELEMENT_H__
|
#ifndef __ELEMENT_H__
|
||||||
#define __ELEMENT_H__
|
#define __ELEMENT_H__
|
||||||
|
|
||||||
typedef enum {
|
#include <ultra64.h>
|
||||||
ELEMENT_PHYSICAL,
|
|
||||||
ELEMENT_WIND,
|
|
||||||
ELEMENT_FLAME,
|
|
||||||
ELEMENT_EARTH,
|
|
||||||
ELEMENT_WATER,
|
|
||||||
ELEMENT_VIRTUE,
|
|
||||||
ELEMENT_BANE,
|
|
||||||
|
|
||||||
ELEMENT_UNKNOWN_0x10 = 0x10,
|
typedef u8 Element;
|
||||||
|
|
||||||
ELEMENT_INVALID = 0xFF,
|
#define ELEMENT_PHYSICAL 0
|
||||||
} __attribute__ ((__packed__)) Element;
|
#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
|
#endif
|
||||||
|
|
|
||||||
25
src/item.c
25
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_8016E440);
|
||||||
|
|
||||||
// INCLUDE_ASM(const s32, "item", func_8016E458);
|
|
||||||
|
|
||||||
/* 44358 8016E458 */
|
/* 44358 8016E458 */
|
||||||
u8 func_8016E458(u8 arg0) {
|
u8 func_8016E458(u8 index) {
|
||||||
return __MAYBE_ATTACK_DATA[arg0].field_0x0;
|
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);
|
INCLUDE_ASM(const s32, "item", func_8016E50C);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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_LEVEL_UP = 0x8021DFCC; // rom:0x1B22DC
|
||||||
STR_MAXIMUM_HP_UP = 0x8021DFD8; // rom:0x1B22E8
|
STR_MAXIMUM_HP_UP = 0x8021DFD8; // rom:0x1B22E8
|
||||||
|
|
@ -13,6 +13,8 @@ STR_PHYSICAL = 0x80187660; // rom:0x5D560 type:asciz
|
||||||
|
|
||||||
ITEM_DATA = 0x8018C410; // size:0x20
|
ITEM_DATA = 0x8018C410; // size:0x20
|
||||||
|
|
||||||
|
ability_get_element = 0x8016E470;
|
||||||
|
|
||||||
item_get_field_0x0 = 0x8016F5C8;
|
item_get_field_0x0 = 0x8016F5C8;
|
||||||
item_get_element = 0x8016F5E0;
|
item_get_element = 0x8016F5E0;
|
||||||
item_get_field_0x2 = 0x8016F614;
|
item_get_field_0x2 = 0x8016F614;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from ob import read_rom, ELEMENT_NAMES
|
from ob import read_rom, ELEMENT_NAME
|
||||||
|
|
||||||
from struct import unpack_from
|
from struct import unpack_from
|
||||||
|
|
||||||
|
|
@ -13,7 +13,7 @@ def read_attack(index):
|
||||||
|
|
||||||
length = 0x6136B - 0x60980
|
length = 0x6136B - 0x60980
|
||||||
|
|
||||||
for i in range(0, 30):
|
for i in range(0, 130):
|
||||||
name_vaddr_start = 0x801876FC
|
name_vaddr_start = 0x801876FC
|
||||||
name_addr_start = 0x5D5FC
|
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_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]
|
name = read_rom(name_addr_diff, name_addr_diff + 32).split(b'\0', 1)[0]
|
||||||
|
|
||||||
print(ELEMENT_NAMES[element])
|
print(f"{name}:\t", (field_0x0, field_0x2, field_0x3, field_0x4, field_0x5,
|
||||||
print(name)
|
field_0x6, field_0x7, field_0x8, field_0x9, field_0xa,
|
||||||
print(field_0x0)
|
field_0xb))
|
||||||
print(field_0x2)
|
|
||||||
print(field_0x3)
|
|
||||||
print(field_0x4)
|
|
||||||
print(field_0x5)
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from ob import read_rom, ELEMENT_NAMES
|
from ob import read_rom, ELEMENT_NAME
|
||||||
|
|
||||||
from struct import unpack_from
|
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,
|
(field_0xc, res_strike, res_wind, res_fire, res_earth, res_water,
|
||||||
res_holy, res_dark, *rest) = rest;
|
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"STR: \t{strength} \tMEN: \t{mem}")
|
||||||
print(f"VIT: \t{vitality} \tAGI: \t{agility}")
|
print(f"VIT: \t{vitality} \tAGI: \t{agility}")
|
||||||
print(f"INT: \t{intelligence} \tDEX: \t{dexterity}")
|
print(f"INT: \t{intelligence} \tDEX: \t{dexterity}")
|
||||||
|
|
|
||||||
169
tools/ob.py
169
tools/ob.py
|
|
@ -1,6 +1,6 @@
|
||||||
# OgreBattle util
|
# OgreBattle util
|
||||||
|
|
||||||
ELEMENT_NAMES = {
|
ELEMENT_NAME = {
|
||||||
0: "Physical",
|
0: "Physical",
|
||||||
1: "Wind",
|
1: "Wind",
|
||||||
2: "Flame",
|
2: "Flame",
|
||||||
|
|
@ -23,6 +23,173 @@ ELEMENT_NAMES = {
|
||||||
255: "Invalid"
|
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):
|
def read_rom(start, end):
|
||||||
chunksize = end - start
|
chunksize = end - start
|
||||||
with open("baserom.z64", "rb") as f:
|
with open("baserom.z64", "rb") as f:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue