From 9fe0a8f5f40343fd7ac8638dc04676bd8c91a8f5 Mon Sep 17 00:00:00 2001 From: gijs Date: Fri, 24 May 2024 11:49:59 +0200 Subject: [PATCH] Add ClassId --- include/character.h | 69 ++++----- include/class.h | 169 +++++++++++----------- include/class_id.h | 20 +++ src/data.c | 2 +- src/segment_obdata/_ob_fierce_selection.c | 44 +++--- 5 files changed, 163 insertions(+), 141 deletions(-) create mode 100644 include/class_id.h diff --git a/include/character.h b/include/character.h index 386ae33..fc4f346 100644 --- a/include/character.h +++ b/include/character.h @@ -4,46 +4,47 @@ #include #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); diff --git a/include/class.h b/include/class.h index ec8f8b7..4203948 100644 --- a/include/class.h +++ b/include/class.h @@ -4,81 +4,82 @@ #include #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__ \ No newline at end of file diff --git a/include/class_id.h b/include/class_id.h new file mode 100644 index 0000000..4100506 --- /dev/null +++ b/include/class_id.h @@ -0,0 +1,20 @@ +#ifndef __CLASS_ID_H__ +#define __CLASS_ID_H__ + +#include + +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__ \ No newline at end of file diff --git a/src/data.c b/src/data.c index df2a14a..b643056 100644 --- a/src/data.c +++ b/src/data.c @@ -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, diff --git a/src/segment_obdata/_ob_fierce_selection.c b/src/segment_obdata/_ob_fierce_selection.c index b315bdd..2c844a2 100644 --- a/src/segment_obdata/_ob_fierce_selection.c +++ b/src/segment_obdata/_ob_fierce_selection.c @@ -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;