parent
222afbe87e
commit
b4947f743f
|
|
@ -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
|
||||
|
|
@ -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 <ultra64.h>
|
||||
|
||||
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
|
||||
|
|
|
|||
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_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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
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))
|
||||
|
|
@ -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}")
|
||||
|
|
|
|||
169
tools/ob.py
169
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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue