Add ClassId

This commit is contained in:
gijs 2024-05-24 11:49:59 +02:00
parent c7690712d2
commit 9fe0a8f5f4
5 changed files with 163 additions and 141 deletions

View File

@ -4,46 +4,47 @@
#include <ultra64.h>
#include "assert.h"
#include "class_id.h"
#include "element.h"
#include "gender.h"
typedef struct {
// Possible data still undiscovered:
// - Alignment
// - Held items (four u16's)
// Possible data still undiscovered:
// - Alignment
// - Held items (four u16's)
/* 0x00 */ s8 name[0x10];
/* 0x10 */ u8 field_0x10;
/* 0x11 */ u8 portrait;
/* 0x12 */ u8 class;
/* 0x13 */ u8 level;
/* 0x14 */ Gender gender;
/* 0x15 */ u8 field_0x15;
/* 0x16 */ u16 max_hp;
/* 0x18 */ u16 cur_hp;
/* 0x1A */ Element element;
/* 0x1B */ u8 field_0x1b;
/* 0x1C */ u16 strength;
/* 0x1E */ u16 vitality;
/* 0x20 */ u16 intelligence;
/* 0x22 */ u16 mentality;
/* 0x24 */ u16 agility;
// DEX affects melee and special attacks, as well as accuracy.
/* 0x26 */ u16 dexterity;
/* 0x00 */ s8 name[0x10];
/* 0x10 */ u8 field_0x10;
/* 0x11 */ u8 portrait;
/* 0x12 */ ClassId class;
/* 0x13 */ u8 level;
/* 0x14 */ Gender gender;
/* 0x15 */ u8 field_0x15;
/* 0x16 */ u16 max_hp;
/* 0x18 */ u16 cur_hp;
/* 0x1A */ Element element;
/* 0x1B */ u8 field_0x1b;
/* 0x28 */ u8 field_0x28;
/* 0x29 */ u8 field_0x29;
/* 0x2a */ u16 item_upper_left;
/* 0x2c */ u16 item_upper_right;
/* 0x2e */ u16 item_lower_left;
/* 0x30 */ u16 item_lower_right;
/* 0x32 */ u8 field_0x32;
/* 0x33 */ s8 field_0x33;
/* 0x34 */ u8 field_0x34;
/* 0x35 */ u8 field_0x35;
/* 0x36 */ u8 field_0x36;
/* 0x37 */ u8 field_0x37;
/* 0x1C */ u16 strength;
/* 0x1E */ u16 vitality;
/* 0x20 */ u16 intelligence;
/* 0x22 */ u16 mentality;
/* 0x24 */ u16 agility;
// DEX affects melee and special attacks, as well as accuracy.
/* 0x26 */ u16 dexterity;
/* 0x28 */ u8 field_0x28;
/* 0x29 */ u8 field_0x29;
/* 0x2a */ u16 item_upper_left;
/* 0x2c */ u16 item_upper_right;
/* 0x2e */ u16 item_lower_left;
/* 0x30 */ u16 item_lower_right;
/* 0x32 */ u8 field_0x32;
/* 0x33 */ s8 field_0x33;
/* 0x34 */ u8 field_0x34;
/* 0x35 */ u8 field_0x35;
/* 0x36 */ u8 field_0x36;
/* 0x37 */ u8 field_0x37;
} CharacterSlot; // size:0x38
ASSERT_SIZE(CharacterSlot, 0x38);

View File

@ -4,81 +4,82 @@
#include <ultra64.h>
#include "assert.h"
#include "class_id.h"
#include "equipment_id.h"
#include "gender.h"
typedef struct {
/* 0x00 */ char* name;
/* 0x04 */ u8 field_0x4;
/* 0x05 */ Gender gender;
/* 0x06 */ u8 leadership_rank;
/* 0x07 */ u8 field_0x7;
/* 0x00 */ char *name;
/* 0x04 */ u8 field_0x4;
/* 0x05 */ Gender gender;
/* 0x06 */ u8 leadership_rank;
/* 0x07 */ u8 field_0x7;
/* 0x08 */ u16 max_hp;
/* 0x0a */ u8 field_0xa;
/* 0x0b */ u8 field_0xb;
/* 0x0c */ u16 strength;
/* 0x0e */ u8 field_0xe;
/* 0x0f */ u8 field_0xf;
/* 0x10 */ u16 vitality;
/* 0x12 */ u8 field_0x12;
/* 0x13 */ u8 field_0x13;
/* 0x14 */ u16 intelligence;
/* 0x16 */ u8 field_0x16;
/* 0x17 */ u8 field_0x17;
/* 0x18 */ u16 mentality;
/* 0x1a */ u8 field_0x1a;
/* 0x1b */ u8 field_0x1b;
/* 0x1c */ u16 agility;
/* 0x1e */ u8 field_0x1e;
/* 0x1f */ u8 field_0x1f;
/* 0x20 */ u16 dexterity;
/* 0x22 */ u8 field_0x22;
/* 0x23 */ u8 field_0x23;
/* 0x24 */ u8 field_0x24;
/* 0x25 */ u8 field_0x25;
/* 0x26 */ u8 field_0x26;
/* 0x27 */ u8 field_0x27;
/* 0x28 */ u8 field_0x28;
/* 0x29 */ u8 field_0x29;
/* 0x2a */ u8 field_0x2a;
/* 0x2b */ u8 field_0x2b;
/* 0x2c */ u8 field_0x2c;
/* 0x2d */ u8 field_0x2d;
/* 0x08 */ u16 max_hp;
/* 0x0a */ u8 field_0xa;
/* 0x0b */ u8 field_0xb;
/* 0x0c */ u16 strength;
/* 0x0e */ u8 field_0xe;
/* 0x0f */ u8 field_0xf;
/* 0x10 */ u16 vitality;
/* 0x12 */ u8 field_0x12;
/* 0x13 */ u8 field_0x13;
/* 0x14 */ u16 intelligence;
/* 0x16 */ u8 field_0x16;
/* 0x17 */ u8 field_0x17;
/* 0x18 */ u16 mentality;
/* 0x1a */ u8 field_0x1a;
/* 0x1b */ u8 field_0x1b;
/* 0x1c */ u16 agility;
/* 0x1e */ u8 field_0x1e;
/* 0x1f */ u8 field_0x1f;
/* 0x20 */ u16 dexterity;
/* 0x22 */ u8 field_0x22;
/* 0x23 */ u8 field_0x23;
/* 0x2e */ u16 item_upper_left;
/* 0x30 */ u16 item_upper_right;
/* 0x32 */ u16 item_lower_left;
/* 0x34 */ u16 item_lower_right;
/* 0x24 */ u8 field_0x24;
/* 0x25 */ u8 field_0x25;
/* 0x26 */ u8 field_0x26;
/* 0x27 */ u8 field_0x27;
/* 0x28 */ u8 field_0x28;
/* 0x29 */ u8 field_0x29;
/* 0x2a */ u8 field_0x2a;
/* 0x2b */ u8 field_0x2b;
/* 0x2c */ u8 field_0x2c;
/* 0x2d */ u8 field_0x2d;
/* 0x36 */ u8 field_0x36;
/* 0x2e */ u16 item_upper_left;
/* 0x30 */ u16 item_upper_right;
/* 0x32 */ u16 item_lower_left;
/* 0x34 */ u16 item_lower_right;
// The ability which is used when the unit is placed in the front row.
/* 0x37 */ u8 ability_front;
// The amount of hits the unit performs when placed in the front row.
/* 0x38 */ u8 ability_front_hitcount;
// The ability which is used when the unit is placed in the middle row.
/* 0x39 */ u8 ability_middle;
// The amount of hits the unit performs when placed in the middle row.
/* 0x3a */ u8 ability_middle_hitcount;
// The ability which is used when the unit is placed in the back row.
/* 0x3b */ u8 ability_back;
// The amount of hits the unit performs when placed in the back row.
/* 0x3c */ u8 ability_back_hitcount;
/* 0x36 */ u8 field_0x36;
/* 0x3d */ u8 field_0x3d;
/* 0x3e */ u8 field_0x3e;
/* 0x3f */ u8 field_0x3f;
// The ability which is used when the unit is placed in the front row.
/* 0x37 */ u8 ability_front;
// The amount of hits the unit performs when placed in the front row.
/* 0x38 */ u8 ability_front_hitcount;
// The ability which is used when the unit is placed in the middle row.
/* 0x39 */ u8 ability_middle;
// The amount of hits the unit performs when placed in the middle row.
/* 0x3a */ u8 ability_middle_hitcount;
// The ability which is used when the unit is placed in the back row.
/* 0x3b */ u8 ability_back;
// The amount of hits the unit performs when placed in the back row.
/* 0x3c */ u8 ability_back_hitcount;
/* 0x40 */ u8 field_0x40;
/* 0x41 */ u8 field_0x41;
/* 0x42 */ u8 field_0x42;
/* 0x43 */ u8 field_0x43;
/* 0x44 */ u8 field_0x44;
/* 0x45 */ u8 field_0x45;
/* 0x46 */ u8 element;
/* 0x47 */ u8 max_items;
/* 0x3d */ u8 field_0x3d;
/* 0x3e */ u8 field_0x3e;
/* 0x3f */ u8 field_0x3f;
/* 0x40 */ u8 field_0x40;
/* 0x41 */ u8 field_0x41;
/* 0x42 */ u8 field_0x42;
/* 0x43 */ u8 field_0x43;
/* 0x44 */ u8 field_0x44;
/* 0x45 */ ClassId field_0x45;
/* 0x46 */ u8 element;
/* 0x47 */ u8 max_items;
} ClassData; // size:0x48
ASSERT_SIZE(ClassData, 0x48);
@ -86,26 +87,26 @@ ASSERT_SIZE(ClassData, 0x48);
extern ClassData obClassData[];
extern EquipmentId (*FP_CLASS_GET_ITEM_1[4])(u8, u8);
extern u8 class_get_field_0x2c(u8 portrait, u8 class);
extern u8 obClassGetAbilityFront(u8 portrait, u8 class);
extern u8 obClassGetAbilityFrontHits(u8 portrait, u8 class);
extern u8 obClassGetAbilityMiddle(u8 portrait, u8 class);
extern u8 obClassGetAbilityMiddleHits(u8 portrait, u8 class);
extern u8 obClassGetAbilityBack(u8 portrait, u8 class);
extern u8 obClassGetAbilityBackHits(u8 portrait, u8 class);
extern u8 class_get_field_0x4(u8 portrait, u8 class);
extern u8 obClassGetGender(u8 portrait, u8 class);
extern u8 obClassGetLeadershipRank(u8 portrait, u8 class);
extern u8 class_get_global_flag(u8 portrait, u8 class);
extern u8 class_get_field_0x2c(u8 portrait, ClassId class);
extern u8 obClassGetAbilityFront(u8 portrait, ClassId class);
extern u8 obClassGetAbilityFrontHits(u8 portrait, ClassId class);
extern u8 obClassGetAbilityMiddle(u8 portrait, ClassId class);
extern u8 obClassGetAbilityMiddleHits(u8 portrait, ClassId class);
extern u8 obClassGetAbilityBack(u8 portrait, ClassId class);
extern u8 obClassGetAbilityBackHits(u8 portrait, ClassId class);
extern u8 class_get_field_0x4(u8 portrait, ClassId class);
extern u8 obClassGetGender(u8 portrait, ClassId class);
extern u8 obClassGetLeadershipRank(u8 portrait, ClassId class);
extern u8 class_get_global_flag(u8 portrait, ClassId class);
extern EquipmentId obClassGetItemUpperLeft(u8 portrait, u8 class);
extern EquipmentId obClassGetItemUpperRight(u8 portrait, u8 class);
extern EquipmentId obClassGetItemLowerLeft(u8 portrait, u8 class);
extern EquipmentId obClassGetItemLowerRight(u8 portrait, u8 class);
extern EquipmentId obClassGetItemUpperLeft(u8 portrait, ClassId class);
extern EquipmentId obClassGetItemUpperRight(u8 portrait, ClassId class);
extern EquipmentId obClassGetItemLowerLeft(u8 portrait, ClassId class);
extern EquipmentId obClassGetItemLowerRight(u8 portrait, ClassId class);
extern char* obClassGetAbilityFrontName(u8 portrait, u8 class);
extern char* obClassGetAbilityMiddleName(u8 portrait, u8 class);
extern char* obClassGetAbilityBackName(u8 portrait, u8 class);
extern char* obClassGetName(u8 portrait, u8 class);
extern char *obClassGetAbilityFrontName(u8 portrait, ClassId class);
extern char *obClassGetAbilityMiddleName(u8 portrait, ClassId class);
extern char *obClassGetAbilityBackName(u8 portrait, ClassId class);
extern char *obClassGetName(u8 portrait, ClassId class);
#endif // __CLASS_H__

20
include/class_id.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef __CLASS_ID_H__
#define __CLASS_ID_H__
#include <ultratypes.h>
typedef u8 ClassId;
#define CLASS_ID_SOLDIER 1
#define CLASS_ID_FIGHTER 2
#define CLASS_ID_LYCANTROPE 3
#define CLASS_ID_AMAZON 4
#define CLASS_ID_KNIGHT 5
#define CLASS_ID_BERSERKER 6
#define CLASS_ID_FENCER 7
#define CLASS_ID_PHALANX 8
#define CLASS_ID_BEAST_TAMER 9
#define CLASS_ID_DOLL_MASTER 10
#define CLASS_ID_NINJA 11
#endif // __CLASS_ID_H__

View File

@ -5853,7 +5853,7 @@ u8 D_8018B484[] = { 0xFF, 0x3C, 0x44, 0x4C, 0x54, 0x9A, 0x60, 0x00 };
u8 D_8018B48C[] = { 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x00 };
/* 61394 8018B494 */
u16 (*FP_CLASS_GET_ITEM_1[])(u8 portrait, u8 class) = {
u16 (*FP_CLASS_GET_ITEM_1[])(u8 portrait, ClassId class) = {
class_get_item_upper_left,
class_get_item_upper_right,
class_get_item_lower_left,

View File

@ -66,7 +66,7 @@ INCLUDE_ASM(const s32, "segment_obdata/_ob_fierce_selection", func_8016DB30);
INCLUDE_ASM(const s32, "segment_obdata/_ob_fierce_selection", func_8016DB84);
/* 43AD8 8016DBD8 */
u8 class_get_field_0x2c(u8 portrait, u8 class) {
u8 class_get_field_0x2c(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].field_0x2c;
@ -74,7 +74,7 @@ u8 class_get_field_0x2c(u8 portrait, u8 class) {
}
/* 43B2C 8016DC2C */
u8 obClassGetAbilityFront(u8 portrait, u8 class) {
u8 obClassGetAbilityFront(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].ability_front;
@ -82,7 +82,7 @@ u8 obClassGetAbilityFront(u8 portrait, u8 class) {
}
/* 43B80 8016DC80 */
u8 obClassGetAbilityFrontHits(u8 portrait, u8 class) {
u8 obClassGetAbilityFrontHits(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].ability_front_hitcount;
@ -90,7 +90,7 @@ u8 obClassGetAbilityFrontHits(u8 portrait, u8 class) {
}
/* 43BD4 8016DCD4 */
u8 obClassGetAbilityMiddle(u8 portrait, u8 class) {
u8 obClassGetAbilityMiddle(u8 portrait, ClassId class) {
s32 var_v0;
if (obClassData[portrait].field_0x45 != class) {
@ -102,7 +102,7 @@ u8 obClassGetAbilityMiddle(u8 portrait, u8 class) {
}
/* 43C20 8016DD20 */
u8 obClassGetAbilityMiddleHits(u8 portrait, u8 class) {
u8 obClassGetAbilityMiddleHits(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].ability_middle_hitcount;
@ -110,7 +110,7 @@ u8 obClassGetAbilityMiddleHits(u8 portrait, u8 class) {
}
/* 43C74 8016DD74 */
u8 obClassGetAbilityBack(u8 portrait, u8 class) {
u8 obClassGetAbilityBack(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].ability_back;
@ -118,7 +118,7 @@ u8 obClassGetAbilityBack(u8 portrait, u8 class) {
}
/* 43CC8 8016DDC8 */
u8 obClassGetAbilityBackHits(u8 portrait, u8 class) {
u8 obClassGetAbilityBackHits(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].ability_back_hitcount;
@ -126,7 +126,7 @@ u8 obClassGetAbilityBackHits(u8 portrait, u8 class) {
}
/* 43D1C 8016DE1C */
u8 class_get_field_0x4(u8 portrait, u8 class) {
u8 class_get_field_0x4(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].field_0x4;
@ -134,7 +134,7 @@ u8 class_get_field_0x4(u8 portrait, u8 class) {
}
/* 43D70 8016DE70 */
Gender obClassGetGender(u8 portrait, u8 class) {
Gender obClassGetGender(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].gender;
@ -142,7 +142,7 @@ Gender obClassGetGender(u8 portrait, u8 class) {
}
/* 43DC4 8016DEC4 */
u8 obClassGetLeadershipRank(u8 portrait, u8 class) {
u8 obClassGetLeadershipRank(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].leadership_rank;
@ -150,7 +150,7 @@ u8 obClassGetLeadershipRank(u8 portrait, u8 class) {
}
/* 43E18 8016DF18 */
u8 class_get_global_flag(u8 portrait, u8 class) {
u8 class_get_global_flag(u8 portrait, ClassId class) {
u8 var_a1;
var_a1 = class;
@ -163,7 +163,7 @@ u8 class_get_global_flag(u8 portrait, u8 class) {
}
/* 43E88 8016DF88 */
EquipmentId obClassGetItemUpperLeft(u8 portrait, u8 class) {
EquipmentId obClassGetItemUpperLeft(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].item_upper_left;
@ -171,7 +171,7 @@ EquipmentId obClassGetItemUpperLeft(u8 portrait, u8 class) {
}
/* 43EDC 8016DFDC */
EquipmentId obClassGetItemUpperRight(u8 portrait, u8 class) {
EquipmentId obClassGetItemUpperRight(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].item_upper_right;
@ -179,7 +179,7 @@ EquipmentId obClassGetItemUpperRight(u8 portrait, u8 class) {
}
/* 43F30 8016E030 */
EquipmentId obClassGetItemLowerLeft(u8 portrait, u8 class) {
EquipmentId obClassGetItemLowerLeft(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].item_lower_left;
@ -187,7 +187,7 @@ EquipmentId obClassGetItemLowerLeft(u8 portrait, u8 class) {
}
/* 43F84 8016E084 */
EquipmentId obClassGetItemLowerRight(u8 portrait, u8 class) {
EquipmentId obClassGetItemLowerRight(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].item_lower_right;
@ -195,7 +195,7 @@ EquipmentId obClassGetItemLowerRight(u8 portrait, u8 class) {
}
/* 43FD8 8016E0D8 */
char* obClassGetAbilityFrontName(u8 portrait, u8 class) {
char* obClassGetAbilityFrontName(u8 portrait, ClassId class) {
u8 var_v0;
if (obClassData[portrait].field_0x45 == class) {
@ -208,7 +208,7 @@ char* obClassGetAbilityFrontName(u8 portrait, u8 class) {
}
/* 44040 8016E140 */
char* obClassGetAbilityMiddleName(u8 portrait, u8 class) {
char* obClassGetAbilityMiddleName(u8 portrait, ClassId class) {
// Possible a C macro wrapping?
do {
char* ret = obAbilityGetName(obClassData[class].ability_middle);
@ -217,7 +217,7 @@ char* obClassGetAbilityMiddleName(u8 portrait, u8 class) {
}
/* 44074 8016E174 */
char* obClassGetAbilityBackName(u8 portrait, u8 class) {
char* obClassGetAbilityBackName(u8 portrait, ClassId class) {
u8 var_v0;
if (obClassData[portrait].field_0x45 == class) {
@ -230,7 +230,7 @@ char* obClassGetAbilityBackName(u8 portrait, u8 class) {
}
/* 440DC 8016E1DC */
char* obClassGetName(u8 portrait, u8 class) {
char* obClassGetName(u8 portrait, ClassId class) {
if (obClassData[portrait].field_0x45 == class)
return obClassData[portrait].name;
@ -238,7 +238,7 @@ char* obClassGetName(u8 portrait, u8 class) {
}
/* 44130 8016E230 */
u8 obClassGetAbility(u8 portrait, u8 class, u8 row)
u8 obClassGetAbility(u8 portrait, ClassId class, u8 row)
{
if (obClassData[portrait].field_0x45 != class)
portrait = class;
@ -253,7 +253,7 @@ u8 obClassGetAbility(u8 portrait, u8 class, u8 row)
}
/* 44238 8016E338 */
u8 obClassGetAbilityHits(u8 portrait, u8 class, u8 row) {
u8 obClassGetAbilityHits(u8 portrait, ClassId class, u8 row) {
if (obClassData[portrait].field_0x45 != class)
portrait = class;
@ -298,7 +298,7 @@ Element obAbilityGetElement(u8 index, u16 arg1, u16 arg2, s32 arg3, u16 arg4) {
INCLUDE_ASM(const s32, "segment_obdata/_ob_fierce_selection", func_8016E50C);
/* 44934 8016EA34 */
u8 func_8016EA34(u8 portrait, u8 class, u8 arg2)
u8 func_8016EA34(u8 portrait, ClassId class, u8 arg2)
{
if (obClassData[portrait].field_0x45 != class)
portrait = class;