From b59dbd6a0fa818987e10c1ddfd7844bf16b4e86a Mon Sep 17 00:00:00 2001 From: Eebit Date: Sun, 11 Jan 2026 16:37:51 -0500 Subject: [PATCH 1/5] (sally_job_select) Raw decomp --- config/YFEE01/arm9/overlays/ov005/delinks.txt | 6 +- include/database.hpp | 7 +- include/unit.hpp | 29 +- include/unknown_funcs.h | 6 +- src/ov005/prep_job_select.cpp | 669 ++++++++++++++++++ 5 files changed, 699 insertions(+), 18 deletions(-) create mode 100644 src/ov005/prep_job_select.cpp diff --git a/config/YFEE01/arm9/overlays/ov005/delinks.txt b/config/YFEE01/arm9/overlays/ov005/delinks.txt index fe1e294..ee3dff0 100644 --- a/config/YFEE01/arm9/overlays/ov005/delinks.txt +++ b/config/YFEE01/arm9/overlays/ov005/delinks.txt @@ -10,4 +10,8 @@ src/ov005/prep_proc_02212d60.cpp: src/ov005/prep_main_menu.cpp: .text start:0x02205518 end:0x02206830 .data start:0x02213150 end:0x02214350 - .bss start:0x02217564 end:0x022175c4 \ No newline at end of file + .bss start:0x02217564 end:0x022175c4 + +src/ov005/prep_job_select.cpp: + .text start:0x0220fa58 end:0x022118c4 + .data start:0x022170d8 end:0x02217238 \ No newline at end of file diff --git a/include/database.hpp b/include/database.hpp index 59301fd..8234b29 100644 --- a/include/database.hpp +++ b/include/database.hpp @@ -8,9 +8,10 @@ struct MapData char * unk_00; // pointer to "bmap_###" or "arena_###" identifier char * unk_04; // pointer to MCT_### string id STRUCT_PAD(0x08, 0x0A); - s8 unk_0a; - STRUCT_PAD(0x0B, 0x18); - u8 unk_18[2]; + s8 unk_0a; // max allowed units? + STRUCT_PAD(0x0B, 0x0C); + u8 unk_0c[12]; // max allowed per class + u8 unk_18[2]; // bgm indexes }; struct UnkData diff --git a/include/unit.hpp b/include/unit.hpp index 928d342..66e303c 100644 --- a/include/unit.hpp +++ b/include/unit.hpp @@ -25,26 +25,27 @@ struct PersonData struct JobData { char * unk_00; // jid string - char * unk_04; + char * unk_04; // mjid string /* 08 */ s8 bases[8]; - s8 unk_10[8]; - u8 unk_18[8]; + s8 unk_10[8]; // growths + u8 unk_18[8]; // enemy growths /* 20 */ s8 caps[8]; u8 unk_28; /* 29 */ u8 mov; u8 unk_2a; u8 unk_2b; - u8 weaponLevels[5]; - STRUCT_PAD(0x31, 0x36); + u8 weaponLevels[8]; + u8 unk_34; // reclass set + s8 unk_35; // reclass line /* 36 */ u16 unitType; u32 attributes; - STRUCT_PAD(0x3C, 0x40); - /* 40 */ struct JobData * pPromoteJob; - STRUCT_PAD(0x44, 0x48); - char * unk_48; - u8 unk_4c; + STRUCT_PAD(0x3C, 0x40); // promoted from job + /* 40 */ struct JobData * pPromoteJob; // promoted to job + STRUCT_PAD(0x44, 0x48); // "MSJI" -> used for job intro + char * unk_48; // "FID_P" -> generic portrait? + u8 unk_4c; // moving map sprite speed? STRUCT_PAD(0x4D, 0x54); - s8 unk_54; + s8 unk_54; // moving map sprite base Y position? STRUCT_PAD(0x55, 0x5C); }; @@ -194,6 +195,12 @@ class Unit this->xPos = x; this->yPos = y; } + + inline void SetJob(struct JobData * job) + { + this->pJobData = job; + this->state2 &= ~0x40000000; + } }; inline BOOL func_0203b714(struct Unit * unit, s32 state) diff --git a/include/unknown_funcs.h b/include/unknown_funcs.h index 5589a6e..07cc267 100644 --- a/include/unknown_funcs.h +++ b/include/unknown_funcs.h @@ -1503,9 +1503,9 @@ EC void func_02028c68(void); // EC ??? func_02029418 // EC ??? func_02029480 // EC ??? func_0202957c -EC s32 func_020295ec(u16 *, char *, void *, u16 *, u32, u32, u32, u32, u32, u32); -EC void func_0202972c(u16 *, char *, void *, u16 *, u32, u32, u32, u32, u32, u32, u32); -EC void func_02029850(u16 *, s32, void *, u16 *, u32, u32, u32, u32, u32); +// EC s32 func_020295ec(u16 *, char *, void *, u16 *, u32, u32, u32, u32, u32, u32); +// EC void func_0202972c(u16 *, char *, void *, u16 *, u32, u32, u32, u32, u32, u32, u32); +// EC void func_02029850(u16 *, s32, void *, u16 *, u32, u32, u32, u32, u32); // EC ??? func_02029a1c // EC ??? func_02029ae8 // EC ??? func_02029ee0 diff --git a/src/ov005/prep_job_select.cpp b/src/ov005/prep_job_select.cpp new file mode 100644 index 0000000..dc1cc00 --- /dev/null +++ b/src/ov005/prep_job_select.cpp @@ -0,0 +1,669 @@ +#include "global.h" + +#include + +#include "button.hpp" +#include "hardware.hpp" +#include "proc_ex.hpp" +#include "sound_manager.hpp" +#include "unit.hpp" + +#include "unknown_funcs.h" +#include "unknown_types.hpp" + +class UnkStruct_02217560 +{ +public: + u32 unk_00; + u32 unk_04; + u32 unk_08; + STRUCT_PAD(0x0C, 0x10); + u8 unk_10; + u8 unk_11; + STRUCT_PAD(0x12, 0x14); + Unit * unk_14; + STRUCT_PAD(0x18, 0x20); + u32 unk_20; + + UnkStruct_02217560() + { + this->unk_00 = -1; + this->unk_04 = -1; + this->unk_10 = 0; + this->unk_11 = 0; + this->unk_20 = -1; + } +}; + +extern UnkStruct_02217560 * data_ov005_02217560; + +extern struct UnkStruct_02196f0c * data_02196f0c; + +struct UnkStruct_021970c4 +{ + void * unk_00; + void * unk_04; + void * unk_08; +}; + +extern struct UnkStruct_021970c4 * data_021970c4; +extern struct UnkStruct_021970c4 * data_021970cc; + +extern struct KeyState * gKeySt; + +EC void func_ov002_021f0960(void *, Unit *); + +EC void func_01ff9948(s32); +EC s32 func_02034f74(s32 kind); +EC void * func_ov002_021f2040(Unit *, s32, s32, s32, s32, ProcPtr); + +EC struct Unit * func_0203bdd0(struct Unit * unit, u8 arg_1); +EC s32 func_020295ec(struct UnkStruct_021970c4 *, char *, void *, void *, u32, u32, u32, u32, u32, u32); +EC void func_02029a1c(struct UnkStruct_021970c4 *, u32, void *, void *, u32, u32, u32, u32); +EC void func_020113d0(u16 *, u16, s32); +EC void func_0202972c(struct UnkStruct_021970c4 *, char *, void *, u16 *, u32, u32, u32, u32, u32, u32, u32); +EC char * func_02037fc8(struct JobData * pJob); +EC void func_0203a94c(struct Unit * unit); +EC struct Unit * func_0203aa4c(struct Unit * dst, struct Unit * src); +EC struct Unit * GetLeaderUnitForFaction(s32 factionId); + +EC void func_0202a4dc(s32, s32); +EC void func_02035694(u8 *, s32, s32); +EC void func_02035700(s32); + +// EC void func_ov005_02204c20(ProcEx *, s32); + +EC BOOL func_0203cd30(struct Unit * unit, s32 arg_1); + +EC void func_020512cc(void *, s32, s32, s32); + +namespace sally +{ + +class JobSConst +{ +}; + +class JobS : public ProcEx, public JobSConst +{ +public: + /* 38 */ struct JobData ** unk_38; + /* 3C */ Unit * unk_3c; + /* 40 */ Unit * unk_40; + /* 44 */ s32 unk_44; + /* 48 */ void * unk_48; // battle anim pointer + /* 4C */ s32 unk_4c; + /* 50 */ u8 unk_50[12]; + /* 5C */ Button * unk_5c; + /* 60 */ Button * unk_60; + /* 64 */ Button * unk_64; + /* 68 */ Button * unk_68; + + JobS(Unit * sp1C) + { + Unit * var_r10; + Anime * temp_r0_7; + s32 temp_r4; + ScreenState * temp_r4_3; + s32 unk_35; + s32 j; + s32 i; + s32 r7; + + this->unk_38 = static_cast(gHeap.Alloc(0x20)); + this->unk_3c = sp1C; + this->unk_44 = -1; + + for (i = 0; i < 12; i++) + { + this->unk_50[i] = 0; + } + + for (var_r10 = GetLeaderUnitForFaction(5); var_r10 != NULL; var_r10 = func_0203bdd0(var_r10, 5)) + { + if (func_0203c378(var_r10)->pJobData->unk_35 >= 0) + { + this->unk_50[func_0203c378(var_r10)->pJobData->unk_35]++; + } + } + + r7 = this->unk_3c->pJobData->unk_34; + + this->unk_4c = 0; + this->unk_44 = -1; + + for (j = 0; j < gFE11Database->pDBFE11Footer->jidTableLength; j++) + { + struct JobData * job = &gFE11Database->pJob[j]; + + if (r7 != job->unk_34) + { + continue; + } + + if (!CheckUnitAttribute(this->unk_3c, 0x20000000) && job == GetJobByJidStr("JID_FALCONKNIGHT_F")) + { + continue; + } + + if (CheckUnitAttribute(this->unk_3c, 0x20000000) && job == GetJobByJidStr("JID_DRAGONKNIGHT_F")) + { + continue; + } + + this->unk_38[this->unk_4c] = job; + + if (job == this->unk_3c->pJobData) + { + this->unk_44 = this->unk_4c; + } + + this->unk_4c++; + } + + if (this->unk_44 == -1) + { + this->unk_44 = 0; + } + + this->unk_40 = static_cast(gHeap.Alloc(sizeof(Unit))); + func_0203a94c(this->unk_40); + func_0203aa4c(this->unk_40, sp1C); + this->unk_40->force = sp1C->force; + + func_ov005_02204c20(this, 1); + + gpActiveScreenSt->dispIo->dispcnt.bit_12 = 1; + gpActiveScreenSt->dispIo->dispcnt.bit_13_14 = 2; + + func_0202a4dc(0, 0); + + for (i = 1; i < 12; i++) + { + func_02035694((u8 *)gpActiveScreenSt->bgTiles[1] + ((i * 4) << 5), i + 0x19, 1); + } + + func_02035700(8); + + func_020a8f40("/jobslide"); + + func_0201177c("jobslide.cg", (u32)gpActiveScreenSt->bgTiles[2]); + func_0201177c("jobslide.sc", (u32)gpActiveScreenSt->tilemap[2]); + func_02011a70("jobslide.cl", 0x20, 0, 0); + + func_02010d98(gpActiveScreenSt->tilemap[2], 0x600, 0, 1); + + gpActiveScreenSt->unk_3e |= 4; + + func_0201177c("arrow.cg", (u32)((u8 *)gpActiveScreenSt->bgTiles[4] + 0x6800)); + func_02011a70("arrow.cl", 0x2A0, 0, 0); + + temp_r0_7 = StartAnimByName( + "arrow.anm", 0, 0x80, 0xA8, ((0x340 >> gpActiveScreenSt->dispIo->dispcnt.bit_13_14) & 0x3FF) | 0x5000, 0, + this); + if (temp_r0_7->interpreter != NULL) + { + temp_r0_7->interpreter->SetLoopingEnabled(1); + } + + temp_r4 = 0x300; + + this->unk_5c = StartButton(this, 6, temp_r4, 0, 2); + this->unk_5c->SetPosition(0x70, 0x78); + this->unk_5c->func_020354bc(0); + + temp_r4 += func_02034f74(6); + this->unk_60 = StartButton(this, 1, temp_r4, 0, 2); + this->unk_60->SetPosition(0x70, 0); + this->unk_60->func_020354bc(0); + + temp_r4 += func_02034f74(6); + this->unk_64 = StartButton(this, 12, temp_r4, 2, 0x12); + this->unk_64->SetPosition(0x30, 0x7C); + this->unk_64->func_020354bc(0); + + temp_r4 += func_02034f74(12); + this->unk_68 = StartButton(this, 13, temp_r4, 2, 0x12); + this->unk_68->SetPosition(0xB0, 0x7C); + this->unk_68->func_020354bc(0); + + func_02034f74(0xD); + + func_020512cc(this, 1, 0x328, 4); + + this->unk_48 = func_ov002_021f2040(sp1C, 0, 1, 0x80, 0x60, this); + + temp_r4_3 = gpActiveScreenSt; + gpActiveScreenSt = gpSubScreenSt; + + func_020a8f40("/window"); + + func_0201177c("levelupobjex4.cg", (u32)((u8 *)gpActiveScreenSt->bgTiles[4] + 0xB580)); + func_02011a70("levelupobj.cl", 0x340, 0, 0); + + gpActiveScreenSt = temp_r4_3; + + func_01ff9948(1); + + func_0202972c( + data_021970c4, func_02037fc8(this->unk_3c->pJobData), gpActiveScreenSt->bgTiles[1], + gpActiveScreenSt->tilemap[1], 5, 0x14, 0x31, 0, 0x38, 1, 0); + + if (!this->check()) + { + data_021970c4->unk_08 = data_021970cc->unk_08; + } + + func_0202972c( + data_021970c4, func_02037fc8(this->unk_40->pJobData), gpActiveScreenSt->bgTiles[1], + gpActiveScreenSt->tilemap[1], 0x14, 0x14, 0x3F, 0, 0x38, 1, 0); + data_021970c4->unk_08 = data_021970cc->unk_04; + + unk_35 = this->unk_38[this->unk_44]->unk_35; + + func_020113d0(gpActiveScreenSt->tilemap[1] + 0x98, ((unk_35 * 4) + 1), 8); + + if (this->unk_3c->state2 & 0x40000) + { + func_020295ec( + data_021970c4, "−", gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], 0x1A, 4, 0x4D, 0, 0, 0); + } + else + { + func_02029a1c( + data_021970c4, this->unk_50[unk_35], gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], 0x1A, + 4, 0x4D, 0); + } + + func_020295ec( + data_021970c4, "/", gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], 0x1B, 4, 0x51, 0, 0, 0); + + if (this->unk_3c->state2 & 0x40000) + { + func_020295ec( + data_021970c4, "−", gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], 0x1C, 4, 0x53, 0, 0, 0); + } + else + { + func_02029a1c( + data_021970c4, data_02196f0c->pCurrentMap->unk_0c[unk_35], gpActiveScreenSt->bgTiles[1], + gpActiveScreenSt->tilemap[1], 0x1C, 4, 0x53, 0); + } + + gpActiveScreenSt->unk_3e |= 2; + } + + // func_ov005_0220fb2c + virtual void Init(void) + { + s32 unk_35; + s32 wpnSlot; + + if ((gKeySt->repeated & KEY_DPAD_LEFT) || this->unk_64->func_02035450()) + { + if (this->unk_44 == 0) + { + this->unk_44 = this->unk_4c - 1; + } + else + { + this->unk_44--; + } + + gSoundManager->unk_b0->vfunc_28(0x1001d, 0, 0); + + this->unk_40->SetJob(this->unk_38[this->unk_44]); + this->unk_40->hp = GetUnitMaxHp(this->unk_40); + + func_ov002_021f0960(this->unk_48, this->unk_40); + + func_0204e1a4(this->unk_40, 0, 1); + + func_01ff9948(1); + + func_0202972c( + data_021970c4, func_02037fc8(this->unk_3c->pJobData), gpActiveScreenSt->bgTiles[1], + gpActiveScreenSt->tilemap[1], 5, 0x14, 0x31, 0, 0x38, 1, 0); + + if (!this->check()) + { + data_021970c4->unk_08 = data_021970cc->unk_08; + } + + func_0202972c( + data_021970c4, func_02037fc8(this->unk_40->pJobData), gpActiveScreenSt->bgTiles[1], + gpActiveScreenSt->tilemap[1], 0x14, 0x14, 0x3F, 0, 0x38, 1, 0); + + data_021970c4->unk_08 = data_021970cc->unk_04; + + unk_35 = this->unk_38[this->unk_44]->unk_35; + func_020113d0(((u16 *)gpActiveScreenSt->tilemap[1]) + 0x98, unk_35 * 4 + 1, 8); + + if (this->unk_3c->state2 & 0x40000) + { + func_020295ec( + data_021970c4, "−", gpActiveScreenSt->bgTiles[2], gpActiveScreenSt->tilemap[1], 0x1A, 4, 0x4D, 0, 0, + 0); + } + else + { + func_02029a1c( + data_021970c4, this->unk_50[unk_35], gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], + 0x1A, 4, 0x4D, 0); + } + + func_020295ec( + data_021970c4, "/", gpActiveScreenSt->bgTiles[2], gpActiveScreenSt->tilemap[1], 0x1B, 4, 0x51, 0, 0, + 0); + + if (this->unk_3c->state2 & 0x40000) + { + func_020295ec( + data_021970c4, "−", gpActiveScreenSt->bgTiles[2], gpActiveScreenSt->tilemap[1], 0x1C, 4, 0x53, 0, 0, + 0); + } + else + { + func_02029a1c( + data_021970c4, data_02196f0c->pCurrentMap->unk_0c[unk_35], gpActiveScreenSt->bgTiles[2], + gpActiveScreenSt->tilemap[1], 0x1C, 4, 0x53, 0); + } + + gpActiveScreenSt->unk_3e |= 2; + + return; + } + + if ((gKeySt->repeated & KEY_DPAD_RIGHT) || this->unk_68->func_02035450()) + { + if (this->unk_44 < this->unk_4c - 1) + { + this->unk_44++; + } + else + { + this->unk_44 = 0; + } + + gSoundManager->unk_b0->vfunc_28(0x1001d, 0, 0); + + this->unk_40->SetJob(this->unk_38[this->unk_44]); + this->unk_40->hp = GetUnitMaxHp(this->unk_40); + + func_ov002_021f0960(this->unk_48, this->unk_40); + + func_0204e1a4(this->unk_40, 0, 1); + + func_01ff9948(1); + + func_0202972c( + data_021970c4, func_02037fc8(this->unk_3c->pJobData), gpActiveScreenSt->bgTiles[1], + gpActiveScreenSt->tilemap[1], 5, 0x14, 0x31, 0, 0x38, 1, 0); + + if (!this->check()) + { + data_021970c4->unk_08 = data_021970cc->unk_08; + } + + func_0202972c( + data_021970c4, func_02037fc8(this->unk_40->pJobData), gpActiveScreenSt->bgTiles[1], + gpActiveScreenSt->tilemap[1], 0x14, 0x14, 0x3F, 0, 0x38, 1, 0); + + data_021970c4->unk_08 = data_021970cc->unk_04; + + unk_35 = this->unk_38[this->unk_44]->unk_35; + func_020113d0(((u16 *)gpActiveScreenSt->tilemap[1]) + 0x98, unk_35 * 4 + 1, 8); + + if (this->unk_3c->state2 & 0x40000) + { + func_020295ec( + data_021970c4, "−", gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], 0x1A, 4, 0x4D, 0, 0, + 0); + } + else + { + func_02029a1c( + data_021970c4, this->unk_50[unk_35], gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], + 0x1A, 4, 0x4D, 0); + } + + func_020295ec( + data_021970c4, "/", gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], 0x1B, 4, 0x51, 0, 0, + 0); + + if (this->unk_3c->state2 & 0x40000) + { + func_020295ec( + data_021970c4, "−", gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], 0x1C, 4, 0x53, 0, 0, + 0); + } + else + { + func_02029a1c( + data_021970c4, data_02196f0c->pCurrentMap->unk_0c[unk_35], gpActiveScreenSt->bgTiles[1], + gpActiveScreenSt->tilemap[1], 0x1C, 4, 0x53, 0); + } + + gpActiveScreenSt->unk_3e |= 2; + + return; + } + + if ((gKeySt->pressed & KEY_BUTTON_A) || this->unk_5c->func_02035450()) + { + if (this->check()) + { + gSoundManager->unk_b0->vfunc_28(0x10016, 0, 0); + + unk_35 = this->unk_3c->pJobData->unk_35; + this->unk_50[unk_35]--; + + unk_35 = this->unk_38[this->unk_44]->unk_35; + this->unk_50[unk_35]++; + + this->unk_3c->SetJob(this->unk_38[this->unk_44]); + this->unk_3c->hp = GetUnitMaxHp(this->unk_3c); + + wpnSlot = GetUnitEquippedWeaponSlot(this->unk_3c); + if (wpnSlot != -1) + { + Item * item = &this->unk_3c->items[wpnSlot]; + item->flags &= ~0x10; + } + + func_0203cd30(this->unk_3c, -1); + func_0203aa4c(this->unk_40, this->unk_3c); + + this->unk_40->SetJob(this->unk_38[this->unk_44]); + this->unk_40->hp = GetUnitMaxHp(this->unk_40); + + func_ov002_021f0960(this->unk_48, this->unk_40); + + func_0204e1a4(this->unk_40, 0, 1); + func_01ff9948(1); + + func_0202972c( + data_021970c4, func_02037fc8(this->unk_3c->pJobData), gpActiveScreenSt->bgTiles[1], + gpActiveScreenSt->tilemap[1], 5, 0x14, 0x31, 0, 0x38, 1, 0); + + if (!this->check()) + { + data_021970c4->unk_08 = data_021970cc->unk_08; + } + + func_0202972c( + data_021970c4, func_02037fc8(this->unk_40->pJobData), gpActiveScreenSt->bgTiles[1], + gpActiveScreenSt->tilemap[1], 0x14, 0x14, 0x3F, 0, 0x38, 1, 0); + data_021970c4->unk_08 = data_021970cc->unk_04; + + unk_35 = this->unk_38[this->unk_44]->unk_35; + func_020113d0(((u16 *)gpActiveScreenSt->tilemap[1]) + 0x98, unk_35 * 4 + 1, 8); + + if (this->unk_3c->state2 & 0x40000) + { + func_020295ec( + data_021970c4, "−", gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], 0x1A, 4, 0x4D, + 0, 0, 0); + } + else + { + func_02029a1c( + data_021970c4, this->unk_50[unk_35], gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], + 0x1A, 4, 0x4D, 0); + } + + func_020295ec( + data_021970c4, "/", gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], 0x1B, 4, 0x51, 0, + 0, 0); + + if (this->unk_3c->state2 & 0x40000) + { + func_020295ec( + data_021970c4, "−", gpActiveScreenSt->bgTiles[1], gpActiveScreenSt->tilemap[1], 0x1C, 4, 0x53, + 0, 0, 0); + } + else + { + func_02029a1c( + data_021970c4, data_02196f0c->pCurrentMap->unk_0c[unk_35], gpActiveScreenSt->bgTiles[1], + gpActiveScreenSt->tilemap[1], 0x1C, 4, 0x53, 0); + } + + gpActiveScreenSt->unk_3e |= 2; + + return; + } + else + { + gSoundManager->unk_b0->vfunc_28(0x10002, 0, 0); + return; + } + } + + if ((gKeySt->pressed & KEY_BUTTON_B) || this->unk_60->func_02035450()) + { + gSoundManager->unk_b0->vfunc_28(0x10017, 0, 0); + + Proc_Break(this, 1); + + return; + } + } + + // func_ov005_022108d8 + virtual void Loop(void) + { + // TODO + } + + BOOL check(void) + { + if (this->unk_3c->pJobData == this->unk_38[this->unk_44]) + { + return FALSE; + } + else if (this->unk_3c->state2 & 0x40000) + { + return TRUE; + } + else + { + s32 count = this->unk_50[this->unk_38[this->unk_44]->unk_35]; + s32 max = data_02196f0c->pCurrentMap->unk_0c[this->unk_38[this->unk_44]->unk_35]; + if (count < max) + { + return TRUE; + } + else + { + return FALSE; + } + } + } + + // func_ov005_0221184c + // func_ov005_0221188c + virtual ~JobS() + { + gHeap.Free(this->unk_40); + gHeap.Free(this->unk_38); + } +}; + +} // namespace sally + +EC void func_ov005_0220fa58(sally::JobS * proc) +{ + s32 target = 0; + + if (data_02196f0c->state & 0x80000) + { + target = 1; + } + + StartBlockingFadeInFromBlack((struct Proc *)proc, 8, target); + return; +} + +EC void func_ov005_0220fa84(sally::JobS * proc) +{ + s32 target = 0; + + if (data_02196f0c->state & 0x80000) + { + target = 1; + } + + StartBlockingFadeOutToBlack((struct Proc *)proc, 8, target); + return; +} + +EC void func_ov005_0220fab0(sally::JobS * proc) +{ + func_0204e1a4(proc->unk_3c, 0, 1); + + func_02018f54((struct Proc *)proc, 0); + + data_ov005_02217560->unk_10 = 0; + + proc->unk_5c->func_020354bc(0); + proc->unk_60->func_020354bc(0); + proc->unk_64->func_020354bc(0); + proc->unk_68->func_020354bc(0); + + return; +} + +EC void func_ov005_0220fb18(sally::JobS * proc) +{ + proc->Init(); +} + +// func_ov005_0220fb2c +// void sally::JobS::Init(void) + +EC void func_ov005_022108c4(sally::JobS * proc) +{ + proc->Loop(); +} + +// func_ov005_022108d8 +// void sally::JobS::Loop(void) +// { +// } + +EC void func_ov005_02210898(sally::JobS * proc) +{ + proc->unk_5c->func_020354a0(); + proc->unk_60->func_020354a0(); + proc->unk_64->func_020354a0(); + proc->unk_68->func_020354a0(); + return; +} + +extern struct ProcCmd data_ov005_022171f0[]; + +void StartSally_JobS(ProcPtr arg0) +{ + new (Proc_StartBlocking(data_ov005_022171f0, arg0)) sally::JobS(data_ov005_02217560->unk_14); +} From 42e962a15e37cb6865b88b9085c22709ce8b9060 Mon Sep 17 00:00:00 2001 From: Eebit Date: Sun, 11 Jan 2026 17:00:10 -0500 Subject: [PATCH 2/5] (sally_job_select) Fix minor inclusion issues --- include/unknown_funcs.h | 8 ++++---- src/ov000/arena.cpp | 1 + src/ov005/prep_job_select.cpp | 3 --- src/ov005/prep_main_menu.cpp | 12 +++++++++++- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/unknown_funcs.h b/include/unknown_funcs.h index 07cc267..4aecb86 100644 --- a/include/unknown_funcs.h +++ b/include/unknown_funcs.h @@ -1503,10 +1503,10 @@ EC void func_02028c68(void); // EC ??? func_02029418 // EC ??? func_02029480 // EC ??? func_0202957c -// EC s32 func_020295ec(u16 *, char *, void *, u16 *, u32, u32, u32, u32, u32, u32); -// EC void func_0202972c(u16 *, char *, void *, u16 *, u32, u32, u32, u32, u32, u32, u32); -// EC void func_02029850(u16 *, s32, void *, u16 *, u32, u32, u32, u32, u32); -// EC ??? func_02029a1c +EC s32 func_020295ec(struct UnkStruct_021970c4 *, char *, void *, void *, u32, u32, u32, u32, u32, u32); +EC void func_0202972c(struct UnkStruct_021970c4 *, char *, void *, u16 *, u32, u32, u32, u32, u32, u32, u32); +EC void func_02029850(struct UnkStruct_021970c4 *, s32, void *, u16 *, u32, u32, u32, u32, u32); +EC void func_02029a1c(struct UnkStruct_021970c4 *, u32, void *, void *, u32, u32, u32, u32); // EC ??? func_02029ae8 // EC ??? func_02029ee0 // EC ??? func_0202a1e0 diff --git a/src/ov000/arena.cpp b/src/ov000/arena.cpp index 4f9fd35..66d72b3 100644 --- a/src/ov000/arena.cpp +++ b/src/ov000/arena.cpp @@ -16,6 +16,7 @@ #include "sound_manager.hpp" #include "unit.hpp" +extern struct UnkStruct_021970c4 * data_021970c4; EC void func_0200ac20(char *, ProcPtr, s32); EC void StartSoundWaitTo_02017518(void *, void *, s32, s32, s32); diff --git a/src/ov005/prep_job_select.cpp b/src/ov005/prep_job_select.cpp index dc1cc00..0549524 100644 --- a/src/ov005/prep_job_select.cpp +++ b/src/ov005/prep_job_select.cpp @@ -58,10 +58,7 @@ EC s32 func_02034f74(s32 kind); EC void * func_ov002_021f2040(Unit *, s32, s32, s32, s32, ProcPtr); EC struct Unit * func_0203bdd0(struct Unit * unit, u8 arg_1); -EC s32 func_020295ec(struct UnkStruct_021970c4 *, char *, void *, void *, u32, u32, u32, u32, u32, u32); -EC void func_02029a1c(struct UnkStruct_021970c4 *, u32, void *, void *, u32, u32, u32, u32); EC void func_020113d0(u16 *, u16, s32); -EC void func_0202972c(struct UnkStruct_021970c4 *, char *, void *, u16 *, u32, u32, u32, u32, u32, u32, u32); EC char * func_02037fc8(struct JobData * pJob); EC void func_0203a94c(struct Unit * unit); EC struct Unit * func_0203aa4c(struct Unit * dst, struct Unit * src); diff --git a/src/ov005/prep_main_menu.cpp b/src/ov005/prep_main_menu.cpp index c9971f4..8a58cf2 100644 --- a/src/ov005/prep_main_menu.cpp +++ b/src/ov005/prep_main_menu.cpp @@ -16,6 +16,16 @@ extern struct UnkStruct_02196f0c * data_02196f0c; +struct UnkStruct_021970c4 +{ + void * unk_00; + void * unk_04; + void * unk_08; +}; + +extern struct UnkStruct_021970c4 * data_021970c4; +extern struct UnkStruct_021970c4 * data_021970cc; + namespace sally { @@ -155,7 +165,7 @@ class UnkStruct_02217560 extern UnkStruct_02217560 * data_ov005_02217560; -extern u16 data_021970c4[]; +extern struct UnkStruct_021970c4 * data_021970c4; namespace sally { From 6a384e07dd539eb965058bdcb51f729736ffa231 Mon Sep 17 00:00:00 2001 From: Eebit Date: Sun, 11 Jan 2026 17:01:09 -0500 Subject: [PATCH 3/5] (menu) Identify colours, states --- include/menu.hpp | 20 +++++++++++ include/unknown_data.h | 2 +- src/ov005/prep_main_menu.cpp | 64 ++++++++++++++++++------------------ 3 files changed, 53 insertions(+), 33 deletions(-) diff --git a/include/menu.hpp b/include/menu.hpp index 72e72ed..9177f32 100644 --- a/include/menu.hpp +++ b/include/menu.hpp @@ -5,6 +5,26 @@ #include "proc_ex.hpp" +enum +{ + MENU_COLOR_WHITE = 1, + MENU_COLOR_GRAY = 2, + MENU_COLOR_BLUE = 3, + MENU_COLOR_GOLD = 4, + MENU_COLOR_GREEN = 5, +}; + +enum +{ + // Menu availability identifiers + + MENU_ENABLED = 0, + MENU_DISABLED = 1, + MENU_NOTSHOWN = 2, + + MENU_ACTIVE = 8, +}; + class MenuItemState; class Menu diff --git a/include/unknown_data.h b/include/unknown_data.h index 71ee0e8..505ca39 100644 --- a/include/unknown_data.h +++ b/include/unknown_data.h @@ -2965,7 +2965,7 @@ extern struct UnkStruct_02196f24 * data_02196f24; // extern ??? data_021970ac // extern ??? data_021970bc // extern ??? data_021970c0 -extern u16 data_021970c4[]; +// extern u16 data_021970c4[]; // extern ??? data_021970cc // extern ??? data_021970d0 // extern ??? data_021970d4 diff --git a/src/ov005/prep_main_menu.cpp b/src/ov005/prep_main_menu.cpp index 8a58cf2..777c1c0 100644 --- a/src/ov005/prep_main_menu.cpp +++ b/src/ov005/prep_main_menu.cpp @@ -542,29 +542,29 @@ void sally::MIS_SallyEnd::vfunc_70(void) s32 sally::MIS_SallyEnd::vfunc_14(void) { - s32 uVar1 = 0; + s32 availability = MENU_ENABLED; if (data_ov005_02217560->unk_11 == 0) { - return 0; + return MENU_ENABLED; } if (Force::Get(0)->Count() == 0) { - uVar1 = 1; + availability = MENU_DISABLED; } - return uVar1; + return availability; } s32 sally::MIS_SallyEnd::vfunc_10(MenuItemState * param_2) { if ((param_2->unk_09 & 7) == 1) { - return 2; + return MENU_COLOR_GRAY; } - return 5; + return MENU_COLOR_GREEN; } char * sally::MIS_SallyEnd::vfunc_00(void) @@ -601,28 +601,28 @@ EC s32 func_0201f680(void); s32 sally::MIS_SallySave::vfunc_14(void) { - u32 uVar1; + u32 availability; if (data_ov005_02217560->unk_11 != 0) { - return 2; + return MENU_NOTSHOWN; } if (func_0201f680()) { - uVar1 = 0; + availability = MENU_ENABLED; } else { - uVar1 = 1; + availability = MENU_DISABLED; } if (data_ov005_02217560->unk_08 == 8) { - uVar1 |= 8; + availability |= MENU_ACTIVE; } - return uVar1; + return availability; } char * sally::MIS_SallySave::vfunc_00(void) @@ -645,19 +645,19 @@ void sally::MIS_Config::vfunc_70(void) s32 sally::MIS_Config::vfunc_14(void) { - u32 uVar1 = 0; + u32 availability = MENU_ENABLED; if (data_ov005_02217560->unk_11 != 0) { - return 2; // Not shown + return MENU_NOTSHOWN; } if (data_ov005_02217560->unk_08 == 7) { - uVar1 |= 8; + availability |= MENU_ACTIVE; } - return uVar1; + return availability; } char * sally::MIS_Config::vfunc_00(void) @@ -680,19 +680,19 @@ void sally::MIS_WeaponShop::vfunc_70(void) s32 sally::MIS_WeaponShop::vfunc_14(void) { - u32 uVar1 = 0; + u32 availability = MENU_ENABLED; if (data_ov005_02217560->unk_11 != 0) { - return 2; // Not shown + return MENU_NOTSHOWN; } if (data_ov005_02217560->unk_08 == 6) { - uVar1 |= 8; + availability |= MENU_ACTIVE; } - return uVar1; + return availability; } char * sally::MIS_WeaponShop::vfunc_00(void) @@ -716,14 +716,14 @@ void sally::MIS_JobSlide::vfunc_70(void) s32 sally::MIS_JobSlide::vfunc_14(void) { - u32 uVar1 = 0; + u32 availability = MENU_ENABLED; if (data_ov005_02217560->unk_08 == 5) { - uVar1 |= 8; + availability |= MENU_ACTIVE; } - return uVar1; + return availability; } char * sally::MIS_JobSlide::vfunc_00(void) @@ -747,14 +747,14 @@ void sally::MIS_ItemSetting::vfunc_70(void) s32 sally::MIS_ItemSetting::vfunc_14(void) { - u32 uVar1 = 0; + u32 availability = MENU_ENABLED; if (data_ov005_02217560->unk_08 == 4) { - uVar1 |= 8; + availability |= MENU_ACTIVE; } - return uVar1; + return availability; } char * sally::MIS_ItemSetting::vfunc_00(void) @@ -777,19 +777,19 @@ void sally::MIS_PosChange::vfunc_70(void) s32 sally::MIS_PosChange::vfunc_14(void) { - u32 uVar1 = 0; + u32 availability = MENU_ENABLED; if (data_ov005_02217560->unk_11 != 0) { - return 2; + return MENU_NOTSHOWN; } if (data_ov005_02217560->unk_08 == 3) { - uVar1 |= 8; + availability |= MENU_ACTIVE; } - return uVar1; + return availability; } char * sally::MIS_PosChange::vfunc_00(void) @@ -821,11 +821,11 @@ void sally::MIS_SallySelect::vfunc_70(void) s32 sally::MIS_SallySelect::vfunc_14(void) { - u32 uVar1 = 0; + u32 uVar1 = MENU_ENABLED; if (data_ov005_02217560->unk_08 == 2) { - uVar1 |= 8; + uVar1 |= MENU_ACTIVE; } return uVar1; From e6e306f413483deb104c36ffae9b014136eb2d33 Mon Sep 17 00:00:00 2001 From: Eebit Date: Sun, 11 Jan 2026 17:01:39 -0500 Subject: [PATCH 4/5] (misc) Name some functions and data symbols --- config/YFEE01/arm9/symbols.txt | 16 ++++++++-------- include/unknown_data.h | 2 +- include/unknown_funcs.h | 14 +++++++------- src/anime.cpp | 4 ++-- src/database.cpp | 6 +++--- src/map_sprite.cpp | 18 +++++++++--------- src/ov000/map_state.cpp | 6 +++--- src/sound_manager.cpp | 2 +- 8 files changed, 34 insertions(+), 34 deletions(-) diff --git a/config/YFEE01/arm9/symbols.txt b/config/YFEE01/arm9/symbols.txt index 380f7de..bff7c4c 100644 --- a/config/YFEE01/arm9/symbols.txt +++ b/config/YFEE01/arm9/symbols.txt @@ -493,12 +493,12 @@ _Znam kind:function(arm,size=0x18) addr:0x0201158c _ZdlPv kind:function(arm,size=0x18) addr:0x020115a4 _ZdaPv kind:function(arm,size=0x18) addr:0x020115bc func_020115d4 kind:function(arm,size=0x38) addr:0x020115d4 -func_0201160c kind:function(arm,size=0x44) addr:0x0201160c -func_02011650 kind:function(arm,size=0x50) addr:0x02011650 -func_020116a0 kind:function(arm,size=0xdc) addr:0x020116a0 +FileExists kind:function(arm,size=0x44) addr:0x0201160c +GetFileSize kind:function(arm,size=0x50) addr:0x02011650 +LoadFileWithOffset kind:function(arm,size=0xdc) addr:0x020116a0 func_0201177c kind:function(arm,size=0xd8) addr:0x0201177c -func_02011854 kind:function(arm,size=0xcc) addr:0x02011854 -func_02011920 kind:function(arm,size=0x110) addr:0x02011920 +LoadUncompressedFile kind:function(arm,size=0xcc) addr:0x02011854 +LoadCompressedFile kind:function(arm,size=0x110) addr:0x02011920 func_02011a30 kind:function(arm,size=0x40) addr:0x02011a30 func_02011a70 kind:function(arm,size=0x44) addr:0x02011a70 func_02011ab4 kind:function(arm,size=0xf8) addr:0x02011ab4 @@ -1170,7 +1170,7 @@ func_02020994 kind:function(arm,size=0x68) addr:0x02020994 IntSys_Sqrt kind:function(arm,size=0x30) addr:0x020209fc Interpolate kind:function(arm,size=0x124) addr:0x02020a2c func_02020b50 kind:function(arm,size=0x70) addr:0x02020b50 -func_02020bc0 kind:function(arm,size=0x4c) addr:0x02020bc0 +Decompress kind:function(arm,size=0x4c) addr:0x02020bc0 func_02020c0c kind:function(arm,size=0xc) addr:0x02020c0c func_02020c18 kind:function(arm,size=0x34) addr:0x02020c18 func_02020c4c kind:function(arm,size=0x8c) addr:0x02020c4c @@ -1876,7 +1876,7 @@ _ZN9HashTableD1Ev kind:function(arm,size=0x40) addr:0x02037850 func_02037890 kind:function(arm,size=0xac) addr:0x02037890 func_0203793c kind:function(arm,size=0x84) addr:0x0203793c func_020379c0 kind:function(arm,size=0x20) addr:0x020379c0 -func_020379e0 kind:function(arm,size=0x24) addr:0x020379e0 +LoadFileAndCache kind:function(arm,size=0x24) addr:0x020379e0 _ZN12FE11Database4InitEv kind:function(arm,size=0x24c) addr:0x02037a04 GetPersonByPidStr kind:function(arm,size=0xc) addr:0x02037c50 GetJobByJidStr kind:function(arm,size=0xc) addr:0x02037c5c @@ -6333,7 +6333,7 @@ __typeinfo__12ProcMemVsync kind:data(any) addr:0x020ceab4 __typestr__12ProcMemVsync kind:data(any) addr:0x020ceac0 data_020cead0 kind:data(any) addr:0x020cead0 __vt__12ProcMemVsync kind:data(any) addr:0x020ceae8 -data_020ceaf8 kind:data(any) addr:0x020ceaf8 +gDecompressFuncLut kind:data(any) addr:0x020ceaf8 data_020ceb28 kind:data(any) addr:0x020ceb28 data_020ceb30 kind:data(any) addr:0x020ceb30 data_020ceb38 kind:data(any) addr:0x020ceb38 diff --git a/include/unknown_data.h b/include/unknown_data.h index 505ca39..1e5675c 100644 --- a/include/unknown_data.h +++ b/include/unknown_data.h @@ -782,7 +782,7 @@ extern struct ProcCmd ProcScr_020ce750[]; // extern ??? __typestr__12ProcMemVsync // extern ??? data_020cead0 // extern ??? __vt__12ProcMemVsync -// extern ??? data_020ceaf8 +// extern ??? gDecompressFuncLut // extern ??? data_020ceb28 // extern ??? data_020ceb30 // extern ??? data_020ceb38 diff --git a/include/unknown_funcs.h b/include/unknown_funcs.h index 4aecb86..c24283a 100644 --- a/include/unknown_funcs.h +++ b/include/unknown_funcs.h @@ -514,12 +514,12 @@ EC void func_02010f98(u16 *, s32, s32); /* */ EC void func_020115d4(void); -EC BOOL func_0201160c(char *); -// EC ??? func_02011650 -EC void func_020116a0(char *, u16 *, s32, s32); +EC BOOL FileExists(char *); +// EC ??? GetFileSize +EC void LoadFileWithOffset(char *, u16 *, s32, s32); EC void func_0201177c(char *, u32); -EC void * func_02011854(char *, s32); -EC void * func_02011920(char *, BOOL); +EC void * LoadUncompressedFile(char *, s32); +EC void * LoadCompressedFile(char *, BOOL); // EC ??? func_02011a30 EC void func_02011a70(char *, u32, u32, u32); // EC ??? func_02011ab4 @@ -1191,7 +1191,7 @@ EC s32 IntSys_Mod(s32, s32); // IntSys_Mod EC u16 IntSys_Sqrt(u32); EC s32 Interpolate(s32, s32, s32, s32, s32); // EC ??? func_02020b50 -// EC ??? func_02020bc0 +// EC ??? Decompress // EC ??? func_02020c0c // EC ??? func_02020c18 // EC ??? func_02020c4c @@ -1897,7 +1897,7 @@ EC void func_02035f20(void *); // EC ??? func_02037890 // EC ??? func_0203793c EC void func_020379c0(void); -EC struct MapFile * func_020379e0(char *, u32); +EC struct MapFile * LoadFileAndCache(char *, u32); // EC ??? _ZN12FE11Database4InitEv EC struct PersonData * GetPersonByPidStr(char *); EC struct JobData * GetJobByJidStr(char *); diff --git a/src/anime.cpp b/src/anime.cpp index f25b381..36f4794 100644 --- a/src/anime.cpp +++ b/src/anime.cpp @@ -35,7 +35,7 @@ EC void func_ov000_021d39a4(s32, s32, s32); EC void func_ov000_021d3a2c(void); EC s32 func_ov000_021d6f7c(s32); -EC void * func_02011920(char *, BOOL); +EC void * LoadCompressedFile(char *, BOOL); EC void func_0206ce8c(s32); EC void func_0206d2e8(s32, s32, s32, s32, s32, s32, s32); @@ -1008,7 +1008,7 @@ EC Anime * StartAnimFromFile(void * file, u16 arg2, u16 arg3, u16 arg4, u16 arg5 EC Anime * StartAnimByName(char * animName, u16 arg2, u16 arg3, u16 arg4, u16 arg5, s32 arg6, ProcEx * parent) { - void * file = func_02011920(animName, 0); + void * file = LoadCompressedFile(animName, 0); return StartAnimFromFile(file, arg2, arg3, arg4, arg5, arg6, 1, parent); } diff --git a/src/database.cpp b/src/database.cpp index 3ebfbad..7a8a4e3 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -9,7 +9,7 @@ extern s32 data_020eea90; EC void func_020a8f40(char *); -EC void * func_020379e0(char *, u32); +EC void * LoadFileAndCache(char *, u32); EC BOOL CheckUnitAttribute(struct Unit *, s32); EC Unit * func_0203fd84(struct PersonData *); @@ -33,8 +33,8 @@ EC void FE11Database::Init(void) func_020a8f40("/data"); - this->unk_00 = func_020379e0("database", 1); - this->unk_04 = func_020379e0("tut", 1); + this->unk_00 = LoadFileAndCache("database", 1); + this->unk_04 = LoadFileAndCache("tut", 1); this->pPerson = static_cast(HashTable::Get2("Person")); this->pJob = static_cast(HashTable::Get2("Job")); diff --git a/src/map_sprite.cpp b/src/map_sprite.cpp index c70252b..65ca3dd 100644 --- a/src/map_sprite.cpp +++ b/src/map_sprite.cpp @@ -24,7 +24,7 @@ class UnitFlash : public ProcEx { SetSpriteDirectoryForJob(jid, 0); this->unk_3c = static_cast(gHeap.Alloc(0x40)); - func_020116a0("palette", this->unk_3c, 0x40, arg3 * 0x40); + LoadFileWithOffset("palette", this->unk_3c, 0x40, arg3 * 0x40); this->unk_40 = static_cast(gHeap.Alloc(0x40)); this->unk_38 = arg4; this->duration = duration; @@ -388,7 +388,7 @@ BOOL IdleMapSpriteMgr::LoadSprite(s32 jid, s32 arg2, s32 arg3, u8 arg4) it[1] = IntSys_Mod(i, 10) + '0'; it[2] = '\0'; - filePtr[i] = func_02011920(str, 0); + filePtr[i] = LoadCompressedFile(str, 0); size[i] = gHeap.SizeOf(filePtr[i]); totalSize += size[i]; } @@ -423,7 +423,7 @@ BOOL IdleMapSpriteMgr::LoadSprite(s32 jid, s32 arg2, s32 arg3, u8 arg4) } } - filePtr[0] = func_02011854("palette", 0); + filePtr[0] = LoadUncompressedFile("palette", 0); palSize = gHeap.SizeOf(filePtr[0]); if (arg4 == 0) @@ -496,7 +496,7 @@ EC s32 func_0203e9d4(s32 jid, s32 unused, char * arg2, s32 arg3, s32 arg4, s32 a it[1] = IntSys_Mod(i, 10) + '0'; it[2] = '\0'; - uVar3 = func_02011920(str, 0); + uVar3 = LoadCompressedFile(str, 0); iVar4 = gHeap.SizeOf(uVar3); if (arg6 != 0) @@ -529,7 +529,7 @@ EC s32 func_0203eacc(s32 jid, s32 arg1, s32 palDst, s32 arg3) palSrc = static_cast(gHeap.Alloc(0x40)); - func_020116a0("palette", palSrc, 0x40, arg1 * 0x40); + LoadFileWithOffset("palette", palSrc, 0x40, arg1 * 0x40); if (arg3 != 0) { @@ -570,7 +570,7 @@ EC void func_0203eb8c(s32 jid, s32 unused, s32 arg2, s32 arg3) SetSpriteDirectoryForJob(jid, TRUE); } - uVar1 = func_02011920("idle", 0); + uVar1 = LoadCompressedFile("idle", 0); func_020203e0(uVar1, arg2, gHeap.SizeOf(uVar1), 1); return; @@ -600,7 +600,7 @@ EC void func_0203ec24(s32 jid, s32 arg1, u16 * arg2, s32 arg3) arg1 = 0; } - func_020116a0("palette", arg2, 0xc0, arg1 * 0xc0); + LoadFileWithOffset("palette", arg2, 0xc0, arg1 * 0xc0); return; } @@ -749,7 +749,7 @@ MovingMapSprite::MovingMapSprite(s32 jid, s32 arg2, s32 arg3, s32 arg4) SetSpriteDirectoryForJob(jid, 0); buf = static_cast(gHeap.Alloc(0x40)); - func_020116a0("palette", buf, 0x40, arg2 * 0x40); + LoadFileWithOffset("palette", buf, 0x40, arg2 * 0x40); func_020205a4(buf, arg4, 0x40, 1); for (i = 0; i < 6; i++) @@ -918,7 +918,7 @@ s32 MovingMapSprite::DrawSpriteExt(s32 x, s32 y, s32 arg3, s32 arg4, s32 animId, it[1] = IntSys_Mod(this->frame, 10) + '0'; it[2] = '\0'; - this->frames[this->frame] = func_02011920(str, 0); + this->frames[this->frame] = LoadCompressedFile(str, 0); } func_02020488(this->frames[this->frame], this->imgAddr, gHeap.SizeOf(this->frames[this->frame]), 0); diff --git a/src/ov000/map_state.cpp b/src/ov000/map_state.cpp index fdc720c..3985472 100644 --- a/src/ov000/map_state.cpp +++ b/src/ov000/map_state.cpp @@ -333,7 +333,7 @@ void MapStateManager::func_ov000_021a276c(char * mapName) func_020a8f40("/map\0\0\0"); - pMapFile = func_020379e0(mapName, 0); + pMapFile = LoadFileAndCache(mapName, 0); this->unk_20 = pMapFile->tileWidth; this->unk_22 = pMapFile->tileHeight; @@ -368,9 +368,9 @@ void MapStateManager::func_ov000_021a276c(char * mapName) func_020a8f40("/dispos"); - if (func_0201160c(mapName) != 0) + if (FileExists(mapName) != 0) { - this->unk_18 = func_020379e0(mapName, 1); + this->unk_18 = LoadFileAndCache(mapName, 1); } func_ov000_021b95e8(gMapStateManager->unk_14); diff --git a/src/sound_manager.cpp b/src/sound_manager.cpp index 85d572c..23b779a 100644 --- a/src/sound_manager.cpp +++ b/src/sound_manager.cpp @@ -147,7 +147,7 @@ EC void func_02015ec0(u32 param_1) { func_02015dc8(param_1); - if (!func_0201160c("/sound/fe11_sound_all.sdat")) + if (!FileExists("/sound/fe11_sound_all.sdat")) { gSoundManager->unk_a0 = FALSE; return; From 57a20cd14379b548da58176383550ab712863c2e Mon Sep 17 00:00:00 2001 From: Eebit Date: Mon, 12 Jan 2026 00:00:10 -0500 Subject: [PATCH 5/5] (sally_job_select) Dump proc, rename data, fix vtable --- config/YFEE01/arm9/overlays/ov005/relocs.txt | 6 +-- config/YFEE01/arm9/overlays/ov005/symbols.txt | 32 ++++++------- include/unknown_data.h | 12 ++--- include/unknown_funcs.h | 20 ++++---- src/ov005/prep_job_select.cpp | 48 +++++++++++++------ 5 files changed, 69 insertions(+), 49 deletions(-) diff --git a/config/YFEE01/arm9/overlays/ov005/relocs.txt b/config/YFEE01/arm9/overlays/ov005/relocs.txt index ce1830f..f993c0c 100644 --- a/config/YFEE01/arm9/overlays/ov005/relocs.txt +++ b/config/YFEE01/arm9/overlays/ov005/relocs.txt @@ -2015,7 +2015,7 @@ from:0x02211778 kind:arm_call to:0x020295ec module:main from:0x022117c8 kind:arm_call to:0x02029a1c module:main from:0x022117e8 kind:load to:0x022171f0 module:overlay(5) from:0x022117ec kind:load to:0x02217560 module:overlay(5) -from:0x022117f0 kind:load to:0x022171c0 module:overlay(5) +from:0x022117f0 kind:load to:0x022171b8 module:overlay(5) add:8 from:0x022117f4 kind:load to:0x027e1b9c module:dtcm from:0x022117f8 kind:load to:0x02197254 module:main from:0x022117fc kind:load to:0x02217190 module:overlay(5) @@ -2041,11 +2041,11 @@ from:0x02211848 kind:load to:0x022170dc module:overlay(5) from:0x02211864 kind:arm_call to:0x01ffbb90 module:itcm from:0x02211870 kind:arm_call to:0x01ffbb90 module:itcm from:0x02211878 kind:arm_call to:0x020115a4 module:main -from:0x02211884 kind:load to:0x022171c0 module:overlay(5) +from:0x02211884 kind:load to:0x022171b8 module:overlay(5) add:8 from:0x02211888 kind:load to:0x027e1b9c module:dtcm from:0x022118a4 kind:arm_call to:0x01ffbb90 module:itcm from:0x022118b0 kind:arm_call to:0x01ffbb90 module:itcm -from:0x022118bc kind:load to:0x022171c0 module:overlay(5) +from:0x022118bc kind:load to:0x022171b8 module:overlay(5) add:8 from:0x022118c0 kind:load to:0x027e1b9c module:dtcm from:0x022118e4 kind:load to:0x02197254 module:main from:0x022118e8 kind:load to:0x021ef52c module:overlay(2) diff --git a/config/YFEE01/arm9/overlays/ov005/symbols.txt b/config/YFEE01/arm9/overlays/ov005/symbols.txt index 441b652..16f6f3e 100644 --- a/config/YFEE01/arm9/overlays/ov005/symbols.txt +++ b/config/YFEE01/arm9/overlays/ov005/symbols.txt @@ -386,17 +386,17 @@ func_ov005_0220f9a8 kind:function(arm,size=0x14) addr:0x0220f9a8 func_ov005_0220f9bc kind:function(arm,size=0x1c) addr:0x0220f9bc func_ov005_0220f9d8 kind:function(arm,size=0x3c) addr:0x0220f9d8 func_ov005_0220fa14 kind:function(arm,size=0x44) addr:0x0220fa14 -func_ov005_0220fa58 kind:function(arm,size=0x2c) addr:0x0220fa58 -func_ov005_0220fa84 kind:function(arm,size=0x2c) addr:0x0220fa84 -func_ov005_0220fab0 kind:function(arm,size=0x68) addr:0x0220fab0 -func_ov005_0220fb18 kind:function(arm,size=0x14) addr:0x0220fb18 -func_ov005_0220fb2c kind:function(arm,size=0xd6c) addr:0x0220fb2c -func_ov005_02210898 kind:function(arm,size=0x2c) addr:0x02210898 -func_ov005_022108c4 kind:function(arm,size=0x14) addr:0x022108c4 -func_ov005_022108d8 kind:function(arm,size=0x500) addr:0x022108d8 +SallyJobS_FadeIn kind:function(arm,size=0x2c) addr:0x0220fa58 +SallyJobS_FadeOut kind:function(arm,size=0x2c) addr:0x0220fa84 +SallyJobS_End kind:function(arm,size=0x68) addr:0x0220fab0 +SallyJobS_ov005_0220fb18 kind:function(arm,size=0x14) addr:0x0220fb18 +_ZN5sally4JobS4InitEv kind:function(arm,size=0xd6c) addr:0x0220fb2c +SallyJobS_ov005_02210898 kind:function(arm,size=0x2c) addr:0x02210898 +SallyJobS_ov005_022108c4 kind:function(arm,size=0x14) addr:0x022108c4 +_ZN5sally4JobS4LoopEv kind:function(arm,size=0x500) addr:0x022108d8 StartSally_JobS kind:function(arm,size=0xa74) addr:0x02210dd8 -func_ov005_0221184c kind:function(arm,size=0x40) addr:0x0221184c -func_ov005_0221188c kind:function(arm,size=0x38) addr:0x0221188c +_ZN5sally4JobSD0Ev kind:function(arm,size=0x40) addr:0x0221184c +_ZN5sally4JobSD1Ev kind:function(arm,size=0x38) addr:0x0221188c func_ov005_022118c4 kind:function(arm,size=0x28) addr:0x022118c4 func_ov005_022118ec kind:function(arm,size=0x1cc) addr:0x022118ec func_ov005_02211ab8 kind:function(arm,size=0x18) addr:0x02211ab8 @@ -733,7 +733,7 @@ data_ov005_022170cc kind:data(any) addr:0x022170cc data_ov005_022170d8 kind:data(any) addr:0x022170d8 data_ov005_022170dc kind:data(any) addr:0x022170dc data_ov005_022170e0 kind:data(any) addr:0x022170e0 -__typeinfo__N5sally9JobSConstE kind:data(any) addr:0x022170e4 +_ZTIN5sally9JobSConstE kind:data(any) addr:0x022170e4 data_ov005_022170ec kind:data(any) addr:0x022170ec data_ov005_022170f4 kind:data(any) addr:0x022170f4 data_ov005_02217100 kind:data(any) addr:0x02217100 @@ -742,15 +742,15 @@ data_ov005_02217118 kind:data(any) addr:0x02217118 data_ov005_02217124 kind:data(any) addr:0x02217124 data_ov005_02217130 kind:data(any) addr:0x02217130 data_ov005_0221713c kind:data(any) addr:0x0221713c -__typestr__N5sally4JobSE kind:data(any) addr:0x02217148 +_ZTSN5sally4JobSE kind:data(any) addr:0x02217148 data_ov005_02217158 kind:data(any) addr:0x02217158 data_ov005_02217168 kind:data(any) addr:0x02217168 data_ov005_0221717c kind:data(any) addr:0x0221717c data_ov005_02217190 kind:data(any) addr:0x02217190 -__typestr__N5sally9JobSConstE kind:data(any) addr:0x022171a4 -__vt__N5sally4JobSE kind:data(any) addr:0x022171c0 -__typeinfo__N5sally4JobSE kind:data(any) addr:0x022171d0 -data_ov005_022171f0 kind:data(any) addr:0x022171f0 +_ZTSN5sally9JobSConstE kind:data(any) addr:0x022171a4 +_ZTVN5sally4JobSE kind:data(any) addr:0x022171b8 +_ZTIN5sally4JobSE kind:data(any) addr:0x022171d0 +ProcScr_Sally_JobS kind:data(any) addr:0x022171f0 data_ov005_02217238 kind:data(any) addr:0x02217238 data_ov005_0221723c kind:data(any) addr:0x0221723c data_ov005_02217240 kind:data(any) addr:0x02217240 diff --git a/include/unknown_data.h b/include/unknown_data.h index 1e5675c..f0b9fa5 100644 --- a/include/unknown_data.h +++ b/include/unknown_data.h @@ -6600,7 +6600,7 @@ extern struct UnkStruct_021faf8c data_ov002_021faf8c; // extern ??? data_ov005_022170d8 // extern ??? data_ov005_022170dc // extern ??? data_ov005_022170e0 -// extern ??? __typeinfo__N5sally9JobSConstE +// extern ??? _ZTIN5sally9JobSConstE // extern ??? data_ov005_022170ec // extern ??? data_ov005_022170f4 // extern ??? data_ov005_02217100 @@ -6609,15 +6609,15 @@ extern struct UnkStruct_021faf8c data_ov002_021faf8c; // extern ??? data_ov005_02217124 // extern ??? data_ov005_02217130 // extern ??? data_ov005_0221713c -// extern ??? __typestr__N5sally4JobSE +// extern ??? _ZTSN5sally4JobSE // extern ??? data_ov005_02217158 // extern ??? data_ov005_02217168 // extern ??? data_ov005_0221717c // extern ??? data_ov005_02217190 -// extern ??? __typestr__N5sally9JobSConstE -// extern ??? __vt__N5sally4JobSE -// extern ??? __typeinfo__N5sally4JobSE -// extern ??? data_ov005_022171f0 +// extern ??? _ZTSN5sally9JobSConstE +// extern ??? _ZTVN5sally4JobSE +// extern ??? _ZTIN5sally4JobSE +// extern ??? ProcScr_Sally_JobS // extern ??? data_ov005_02217238 // extern ??? data_ov005_0221723c // extern ??? data_ov005_02217240 diff --git a/include/unknown_funcs.h b/include/unknown_funcs.h index c24283a..54614cd 100644 --- a/include/unknown_funcs.h +++ b/include/unknown_funcs.h @@ -10342,17 +10342,17 @@ EC void StartSally_IMenu(ProcPtr); // Starts "sally::IMenu" proc // EC ??? func_ov005_0220f9bc // EC ??? func_ov005_0220f9d8 // EC ??? func_ov005_0220fa14 -// EC ??? func_ov005_0220fa58 -// EC ??? func_ov005_0220fa84 -// EC ??? func_ov005_0220fab0 -// EC ??? func_ov005_0220fb18 -// EC ??? func_ov005_0220fb2c -// EC ??? func_ov005_02210898 -// EC ??? func_ov005_022108c4 -// EC ??? func_ov005_022108d8 +// EC ??? SallyJobS_FadeIn +// EC ??? SallyJobS_FadeOut +// EC ??? SallyJobS_End +// EC ??? SallyJobS_ov005_0220fb18 +// EC ??? _ZN5sally4JobS4InitEv +// EC ??? SallyJobS_ov005_02210898 +// EC ??? SallyJobS_ov005_022108c4 +// EC ??? _ZN5sally4JobS4LoopEv EC void StartSally_JobS(ProcPtr); // Starts "sally::JobS" proc -// EC ??? func_ov005_0221184c -// EC ??? func_ov005_0221188c +// EC ??? _ZN5sally4JobSD0Ev +// EC ??? _ZN5sally4JobSD1Ev // EC ??? func_ov005_022118c4 // EC ??? func_ov005_022118ec // EC ??? func_ov005_02211ab8 diff --git a/src/ov005/prep_job_select.cpp b/src/ov005/prep_job_select.cpp index 0549524..e4362e3 100644 --- a/src/ov005/prep_job_select.cpp +++ b/src/ov005/prep_job_select.cpp @@ -290,7 +290,7 @@ class JobS : public ProcEx, public JobSConst gpActiveScreenSt->unk_3e |= 2; } - // func_ov005_0220fb2c + // _ZN5sally4JobS4InitEv virtual void Init(void) { s32 unk_35; @@ -547,7 +547,7 @@ class JobS : public ProcEx, public JobSConst } } - // func_ov005_022108d8 + // _ZN5sally4JobS4LoopEv virtual void Loop(void) { // TODO @@ -578,8 +578,8 @@ class JobS : public ProcEx, public JobSConst } } - // func_ov005_0221184c - // func_ov005_0221188c + // _ZN5sally4JobSD0Ev + // _ZN5sally4JobSD1Ev virtual ~JobS() { gHeap.Free(this->unk_40); @@ -589,7 +589,7 @@ class JobS : public ProcEx, public JobSConst } // namespace sally -EC void func_ov005_0220fa58(sally::JobS * proc) +EC void SallyJobS_FadeIn(sally::JobS * proc) { s32 target = 0; @@ -602,7 +602,7 @@ EC void func_ov005_0220fa58(sally::JobS * proc) return; } -EC void func_ov005_0220fa84(sally::JobS * proc) +EC void SallyJobS_FadeOut(sally::JobS * proc) { s32 target = 0; @@ -615,7 +615,7 @@ EC void func_ov005_0220fa84(sally::JobS * proc) return; } -EC void func_ov005_0220fab0(sally::JobS * proc) +EC void SallyJobS_End(sally::JobS * proc) { func_0204e1a4(proc->unk_3c, 0, 1); @@ -631,25 +631,25 @@ EC void func_ov005_0220fab0(sally::JobS * proc) return; } -EC void func_ov005_0220fb18(sally::JobS * proc) +EC void SallyJobS_ov005_0220fb18(sally::JobS * proc) { proc->Init(); } -// func_ov005_0220fb2c +// _ZN5sally4JobS4InitEv // void sally::JobS::Init(void) -EC void func_ov005_022108c4(sally::JobS * proc) +EC void SallyJobS_ov005_022108c4(sally::JobS * proc) { proc->Loop(); } -// func_ov005_022108d8 +// _ZN5sally4JobS4LoopEv // void sally::JobS::Loop(void) // { // } -EC void func_ov005_02210898(sally::JobS * proc) +EC void SallyJobS_ov005_02210898(sally::JobS * proc) { proc->unk_5c->func_020354a0(); proc->unk_60->func_020354a0(); @@ -658,9 +658,29 @@ EC void func_ov005_02210898(sally::JobS * proc) return; } -extern struct ProcCmd data_ov005_022171f0[]; +// clang-format off + +struct ProcCmd ProcScr_Sally_JobS[] = +{ + PROC_NAME, + PROC_SLEEP(0), + + PROC_06(0, SallyJobS_ov005_022108c4), + + PROC_CALL(SallyJobS_FadeIn), + PROC_CALL(SallyJobS_ov005_02210898), + + PROC_REPEAT(SallyJobS_ov005_0220fb18), + + PROC_CALL(SallyJobS_End), + PROC_CALL(SallyJobS_FadeOut), + + PROC_END, +}; + +// clang-format on void StartSally_JobS(ProcPtr arg0) { - new (Proc_StartBlocking(data_ov005_022171f0, arg0)) sally::JobS(data_ov005_02217560->unk_14); + new (Proc_StartBlocking(ProcScr_Sally_JobS, arg0)) sally::JobS(data_ov005_02217560->unk_14); }