From cf8f5a80b13c4edd7fd8ebb33ab0de81d64f609b Mon Sep 17 00:00:00 2001 From: Yanis <35189056+Yanis002@users.noreply.github.com> Date: Tue, 22 Jul 2025 16:17:02 +0200 Subject: Decompile more of `AdventureFlags.cpp` (#118) * fix flags getters and associated relocs * explicit ARM and improve existing matches * match CopyTo * document a bit the flag system and progress on unmatched functions * remaining bottom functions * func_ov00_02097810 params and name fix * fix build issues * move flag base definition to its own file * document item flags --------- Co-authored-by: Yanis002 Co-authored-by: Aetias --- src/00_Core/Item/ItemManager.cpp | 5 +- src/00_Core/Save/AdventureFlags.cpp | 365 +++++++++++++++++++++++++++--------- src/00_Core/Save/FlagsUnk.cpp | 1 - src/04_Load/Save/AdventureFlags.cpp | 2 +- 4 files changed, 282 insertions(+), 91 deletions(-) (limited to 'src') diff --git a/src/00_Core/Item/ItemManager.cpp b/src/00_Core/Item/ItemManager.cpp index 7b63966b..9fed2bf7 100644 --- a/src/00_Core/Item/ItemManager.cpp +++ b/src/00_Core/Item/ItemManager.cpp @@ -10,6 +10,7 @@ #include "Save/AdventureFlags.hpp" #include "System/OverlayManager.hpp" #include "Unknown/UnkStruct_020eec68.hpp" +#include "flags.h" static const char *sShipPartTypes[] = {"anc", "bow", "hul", "can", "dco", "pdl", "fnl", "brg"}; @@ -408,7 +409,7 @@ THUMB void ItemManager::SetTreasureSalvaged(u32 index) { } THUMB void ItemManager::RemoveItem(ItemFlag item) { - RESET_FLAG(mItemFlags.flags, item); + UNSET_FLAG(mItemFlags.flags, item); if (item >= ItemFlag_EQUIP_START && item <= ItemFlag_EQUIP_END) { (*mAmmo)[item] = 0; } @@ -993,7 +994,7 @@ ARM void ItemManager::func_ov00_020ae4dc(s32 param1) { ARM void ItemManager::SetPotion(u32 index, Potion potion) { mPotions[index] = potion; if (potion == Potion_None) { - RESET_FLAG(mItemFlags.flags, index + ItemFlag_PotionA); + UNSET_FLAG(mItemFlags.flags, index + ItemFlag_PotionA); } else { SET_FLAG(mItemFlags.flags, index + ItemFlag_PotionA); } diff --git a/src/00_Core/Save/AdventureFlags.cpp b/src/00_Core/Save/AdventureFlags.cpp index 012e9efa..687e6003 100644 --- a/src/00_Core/Save/AdventureFlags.cpp +++ b/src/00_Core/Save/AdventureFlags.cpp @@ -1,135 +1,326 @@ #include "Save/AdventureFlags.hpp" #include "Cutscene/CutsceneHandler.hpp" +#include "DTCM/UnkStruct_027e0c54.hpp" +#include "Map/MapManager.hpp" +#include "Message/MessageManager.hpp" +#include "Message/MsgProc.hpp" -extern void func_ov000_020980f8(CutsceneHandler *cutsceneHandler); -extern unk32 func_ov000_020980fc(CutsceneHandler *cutsceneHandler); -extern bool func_ov000_02098114(CutsceneHandler *cutsceneHandler); -extern u8 data_ov000_020e310c[]; -extern u8 data_ov000_020e313c[]; -extern u8 data_ov000_020e3140[]; -extern u8 data_ov000_020e3144[]; -extern u8 data_ov000_020e314c[]; -extern u8 data_ov000_020e314e[]; -extern u8 data_ov000_020e3150[]; -extern u8 data_ov000_020e3154[]; -extern u8 data_ov000_020e3155[]; -extern u8 data_ov000_020e3156[]; - -bool AdventureFlags::Exists() { +extern unk32 data_027e0dbc; +extern "C" void func_ov000_0207ba94(unk32 *, u32); +extern "C" void *func_ov040_021834cc(); +extern "C" void *func_ov035_02183200(); + +extern FlagsUnk data_ov000_020e310c[]; +extern FlagsData data_ov000_020eaac4; + +ARM bool AdventureFlags::Exists() { return gAdventureFlags != NULL; } -void AdventureFlags::CopyTo(unk32 *flags) {} +ARM void AdventureFlags::CopyTo(FlagsData *flags) { + *flags = this->mFlags; +} -void AdventureFlags::func_ov00_02097674() { - func_ov000_020980f8(this->mCutsceneHandler); +ARM void AdventureFlags::func_ov00_02097674() { + this->mCutsceneHandler->func_ov000_020980f8(); } -s32 AdventureFlags::func_ov00_02097684() { - return func_ov000_020980fc(this->mCutsceneHandler); +ARM s32 AdventureFlags::func_ov00_02097684(unk32 param1, unk32 param2, void **param3) { + return this->mCutsceneHandler->func_ov000_020980fc(param1, param2, param3); } -void AdventureFlags::Load() {} -void AdventureFlags::func_ov00_020976c8() {} -void AdventureFlags::func_ov00_02097700() {} -bool AdventureFlags::func_ov00_02097738() {} -unk8 AdventureFlags::func_ov00_02097750() {} -bool AdventureFlags::Get(AdventureFlag flag) {} -void AdventureFlags::Set(AdventureFlag flag, bool value) {} -void AdventureFlags::func_Ov00_02097810(s32 param1) {} -unk32 AdventureFlags::func_ov00_02097968(unk32 param1) {} -unk32 AdventureFlags::func_ov00_02097a44(unk32 param1, s32 param2) {} -bool AdventureFlags::func_ov00_02097b9c(s32 param1) {} -bool AdventureFlags::func_ov00_02097bac() {} -bool AdventureFlags::func_ov00_02097bbc() {} -bool AdventureFlags::func_ov00_02097bcc() {} -bool AdventureFlags::func_ov00_02097bcc(s32 param2) {} -s32 AdventureFlags::func_ov00_02097c08() {} +ARM void AdventureFlags::Load() { + this->mFlags = data_ov000_020eaac4; +} -bool AdventureFlags::Get_FlagsUnk_30_Flag(s32 index) { - unk32 unk30 = this->Get_FlagsUnk_30(index); +ARM void AdventureFlags::func_ov00_020976c8() { + this->mCutsceneHandler->SetFlags(~1); + this->mCutsceneHandler->func_ov000_02098658(); + this->mUnk_44->func_ov000_02099024(); +} - return this->Get(unk30); +ARM void AdventureFlags::func_ov00_02097700() { + this->mCutsceneHandler->SetFlags(~1); + this->mCutsceneHandler->func_ov000_02098658(); + this->mUnk_44->func_ov000_02099024(); } -u8 AdventureFlags::Get_FlagsUnk_49(s32 index) { - return data_ov000_020e3155[index * 0x4C]; +ARM bool AdventureFlags::func_ov00_02097738() { + return this->mCutsceneHandler->mFlags1 & 1; } -u8 AdventureFlags::Get_FlagsUnk_48(s32 index) { - return data_ov000_020e3154[index * 0x4C]; +ARM bool AdventureFlags::func_ov00_02097750() { + return gMessageManager.mUnk_04; } -u8 AdventureFlags::Get_FlagsUnk_4a(s32 index) { - return data_ov000_020e3156[index * 0x4C]; +ARM bool AdventureFlags::Get(AdventureFlag flag) { + if ((s32) flag >= AdventureFlag_COUNT || (s32) flag <= 0) { + return false; + } + + return GET_FLAG(this->mFlags.data, flag); } -u16 AdventureFlags::Get_FlagsUnk_42(s32 index) { - return *(u16 *) (data_ov000_020e314e + index * 0x4C); +ARM void AdventureFlags::Set(AdventureFlag flag, bool value) { + if ((s32) flag < AdventureFlag_COUNT) { + if (value) { + func_ov000_0207ba94(&data_027e0dbc, flag); + } + + if (value) { + SET_FLAG(this->mFlags.data, flag); + } else { + UNSET_FLAG(this->mFlags.data, flag); + } + } } -u16 AdventureFlags::Get_FlagsUnk_40(s32 index) { - return *(unk16 *) (data_ov000_020e314c + index * 0x4C); +ARM void AdventureFlags::func_ov00_02097810(s32 param1, astruct_23 *param2) {} + +// non-matching +ARM unk32 AdventureFlags::func_ov00_02097968(unk32 param1) { + if (this->Get_FlagsUnk_30_Flag(param1)) { + return -1; + } + + astruct_23 aStack_c0; + aStack_c0.mUnk_16 = data_027e0db0.mUnk_04 > 0; + + FlagsUnk2 FStack_d8; + FStack_d8.mUnk_00.mUnk_00 = 0x47; + FStack_d8.mUnk_04.mUnk_00 = 0; + FStack_d8.mUnk_04.mUnk_04 = 0; + FStack_d8.mUnk_04.mUnk_08 = -2; + FStack_d8.mUnk_04.mUnk_0c = 0; + FStack_d8.mUnk_04.mUnk_0e = -1; + FStack_d8.mUnk_04.mUnk_0f = 0; + FStack_d8.mUnk_04.mUnk_10 = 0; + FStack_d8.mUnk_04.mUnk_11 = 0; + aStack_c0.mUnk_00 = param1; + + aStack_c0.mUnk_0c = AdventureFlags::Get_FlagsUnk_00(param1, &FStack_d8); + gMapManager->func_ov000_02098d34(&FStack_d8); } -unk32 AdventureFlags::Get_FlagsUnk_38(s32 index) { - return *(unk32 *) (data_ov000_020e3144 + index * 0x4C); +ARM unk32 AdventureFlags::func_ov00_02097a44(unk32 param1, s32 param2) {} + +ARM bool AdventureFlags::func_ov00_02097b9c(s32 param1) { + return this->mUnk_44->func_ov000_02098c48(param1); } -unk32 AdventureFlags::Get_FlagsUnk_34(s32 index) { - return *(unk32 *) (data_ov000_020e3140 + index * 0x4C); +ARM bool AdventureFlags::func_ov00_02097bac() { + return this->mUnk_44->func_ov000_02098c68(); } -unk32 AdventureFlags::Get_FlagsUnk_44(s32 index) { - return *(unk32 *) (data_ov000_020e3150 + index * 0x4C); +ARM bool AdventureFlags::func_ov00_02097bbc() { + return this->mUnk_44->func_ov000_02098d20(); } -unk32 AdventureFlags::Get_FlagsUnk_30(s32 index) { - return *(unk32 *) (data_ov000_020e313c + index * 0x4C); +ARM bool AdventureFlags::func_ov00_02097bcc(s32 param1) { + return this->mUnk_44->func_ov000_02098fa4(param1); } -bool AdventureFlags::Get_FlagsUnk_00(s32 index, FlagsUnk2 *result) {} -bool AdventureFlags::Get_FlagsUnk_18(s32 index, FlagsUnk2 *result) {} +ARM bool AdventureFlags::func_ov00_02097bcc(astruct_23 *param1) { + if (this->func_ov00_02097738()) { + return this->mUnk_44->func_ov000_020990a4(param1); + } -FlagsUnk *AdventureFlags::Get_FlagsUnk(s32 index) { - return (FlagsUnk *) (data_ov000_020e310c + index * 0x4C); + return false; } -bool AdventureFlags::func_ov00_02097e6c() { - return func_ov000_02098114(this->mCutsceneHandler); +ARM s32 AdventureFlags::func_ov00_02097c08() { + return this->mUnk_44->func_ov000_0209907c(); } -bool AdventureFlags::func_ov00_02097e7c() { - bool bVar1; +ARM bool AdventureFlags::Get_FlagsUnk_30_Flag(s32 index) { + return this->Get(this->Get_FlagsUnk_30(index)); +} - bVar1 = this->func_ov00_02097e6c(); - if (bVar1) { - bVar1 = this->mCutsceneHandler->SkipCutscene(0); - return bVar1; +ARM u8 AdventureFlags::Get_FlagsUnk_49(s32 index) { + return data_ov000_020e310c[index].mUnk_49; +} + +ARM u8 AdventureFlags::Get_FlagsUnk_48(s32 index) { + return data_ov000_020e310c[index].mUnk_48; +} + +ARM u8 AdventureFlags::Get_FlagsUnk_4a(s32 index) { + return data_ov000_020e310c[index].mUnk_4a; +} + +ARM u16 AdventureFlags::Get_FlagsUnk_42(s32 index) { + return data_ov000_020e310c[index].mUnk_42; +} + +ARM u16 AdventureFlags::Get_FlagsUnk_40(s32 index) { + return data_ov000_020e310c[index].mUnk_40; +} + +ARM unk32 AdventureFlags::Get_FlagsUnk_38(s32 index) { + return data_ov000_020e310c[index].mUnk_38; +} + +ARM unk32 AdventureFlags::Get_FlagsUnk_34(s32 index) { + return data_ov000_020e310c[index].mUnk_34; +} + +ARM unk32 AdventureFlags::Get_FlagsUnk_44(s32 index) { + return data_ov000_020e310c[index].mUnk_44; +} + +ARM unk32 AdventureFlags::Get_FlagsUnk_30(s32 index) { + return data_ov000_020e310c[index].mUnk_30; +} + +ARM bool AdventureFlags::Get_FlagsUnk_00(s32 index, FlagsUnk2 *result) { + result->mUnk_00 = data_ov000_020e310c[index].mUnk_00.mUnk_00; + result->mUnk_04.mUnk_00 = data_ov000_020e310c[index].mUnk_00.mUnk_04.mUnk_00; + result->mUnk_04.mUnk_04 = data_ov000_020e310c[index].mUnk_00.mUnk_04.mUnk_04; + result->mUnk_04.mUnk_08 = data_ov000_020e310c[index].mUnk_00.mUnk_04.mUnk_08; + result->mUnk_04.mUnk_0c = data_ov000_020e310c[index].mUnk_00.mUnk_04.mUnk_0c; + result->mUnk_04.mUnk_0e = data_ov000_020e310c[index].mUnk_00.mUnk_04.mUnk_0e; + result->mUnk_04.mUnk_0f = data_ov000_020e310c[index].mUnk_00.mUnk_04.mUnk_0f; + result->mUnk_04.mUnk_10 = data_ov000_020e310c[index].mUnk_00.mUnk_04.mUnk_10; + result->mUnk_04.mUnk_11 = data_ov000_020e310c[index].mUnk_00.mUnk_04.mUnk_11; + return true; +} + +ARM bool AdventureFlags::Get_FlagsUnk_18(s32 index, FlagsUnk2 *result) { + result->mUnk_00 = data_ov000_020e310c[index].mUnk_18.mUnk_00; + result->mUnk_04.mUnk_00 = data_ov000_020e310c[index].mUnk_18.mUnk_04.mUnk_00; + result->mUnk_04.mUnk_04 = data_ov000_020e310c[index].mUnk_18.mUnk_04.mUnk_04; + result->mUnk_04.mUnk_08 = data_ov000_020e310c[index].mUnk_18.mUnk_04.mUnk_08; + result->mUnk_04.mUnk_0c = data_ov000_020e310c[index].mUnk_18.mUnk_04.mUnk_0c; + result->mUnk_04.mUnk_0e = data_ov000_020e310c[index].mUnk_18.mUnk_04.mUnk_0e; + result->mUnk_04.mUnk_0f = data_ov000_020e310c[index].mUnk_18.mUnk_04.mUnk_0f; + result->mUnk_04.mUnk_10 = data_ov000_020e310c[index].mUnk_18.mUnk_04.mUnk_10; + result->mUnk_04.mUnk_11 = data_ov000_020e310c[index].mUnk_18.mUnk_04.mUnk_11; + return true; +} + +ARM FlagsUnk *AdventureFlags::Get_FlagsUnk(s32 index) { + return &data_ov000_020e310c[index]; +} + +ARM bool AdventureFlags::func_ov00_02097e6c() { + return this->mCutsceneHandler->func_ov000_02098114(); +} + +ARM bool AdventureFlags::func_ov00_02097e7c() { + if (this->func_ov00_02097e6c()) { + return this->mCutsceneHandler->SkipCutscene(0); } return false; } -bool AdventureFlags::func_ov00_02097ea4() { - bool bVar1; - - bVar1 = this->func_ov00_02097e6c(); - if (bVar1) { - bVar1 = this->mCutsceneHandler->SkipCutscene(1); - return bVar1; +ARM bool AdventureFlags::func_ov00_02097ea4() { + if (this->func_ov00_02097e6c()) { + return this->mCutsceneHandler->SkipCutscene(1); } return false; } -unk32 AdventureFlags::func_ov00_02097ecc() {} -void *AdventureFlags::func_ov00_02097f8c() {} -void *AdventureFlags::func_ov00_02097fac() {} -void *AdventureFlags::func_ov00_02097fd0() {} -void AdventureFlags::func_ov00_02097ff4(bool param1, bool param2) {} -unk32 AdventureFlags::func_ov00_02098058() {} -bool AdventureFlags::func_ov00_02098064(unk32 param1) {} -bool AdventureFlags::func_ov00_02098074(unk32 param1, unk16 param2, unk32 param3, unk32 param4, bool param5) {} -bool AdventureFlags::func_ov00_0209809c() {} -bool AdventureFlags::func_ov00_020980ac() {} -void AdventureFlags::func_ov00_020980bc(s32 param1) {} + +ARM unk32 AdventureFlags::func_ov00_02097ecc() { + u32 *pFlags = (u32 *) data_ov000_020eaac4.data; + u32 index; + + if (GET_FLAG(pFlags, AdventureFlag_Unk_30) && !GET_FLAG(pFlags, AdventureFlag_Unk_31)) { + index = AdventureFlags::Get_FlagsUnk_30(0x20); + + if (!GET_FLAG(pFlags, index)) { + return 0x20; + } + + return 0x21; + } + + if (GET_FLAG(pFlags, AdventureFlag_Unk_29) && !GET_FLAG(pFlags, AdventureFlag_Unk_30)) { + index = AdventureFlags::Get_FlagsUnk_30(0x1F); + + if (!GET_FLAG(pFlags, index)) { + return 0x1F; + } + + return 0x21; + } + + if (GET_FLAG(pFlags, AdventureFlag_SWSeaChart) && !GET_FLAG(pFlags, AdventureFlag_Unk_29)) { + index = AdventureFlags::Get_FlagsUnk_30(0x1E); + + if (!GET_FLAG(pFlags, index)) { + return 0x1E; + } + + return 0x21; + } + + return 0x21; +} + +ARM void *AdventureFlags::func_ov00_02097f8c() { + if (this->mCutsceneHandler->mUnk_80 != NULL) { + return func_ov040_021834cc(); + } + + return NULL; +} + +// non-matching +ARM void *AdventureFlags::func_ov00_02097fac() { + void *piVar1 = this->func_ov00_02097f8c(); + + if (piVar1 != NULL) { + return func_ov035_02183200(); + } + + return NULL; +} + +// non-matching +ARM void *AdventureFlags::func_ov00_02097fd0() { + this->func_ov00_02097c08(); + this->func_ov00_02097fac(); +} + +ARM void AdventureFlags::func_ov00_02097ff4(bool param1, bool param2) { + if (param1) { + data_027e0db0.func_ov000_0207b2f0(0, param2 && data_027e0c54.mUnk_0); + } else { + data_027e0db0.func_ov000_0207b334(0); + } + + u32 uVar2 = this->mCutsceneHandler->mFlags2; + if (param1) { + uVar2 |= 2; + } else { + uVar2 &= ~2; + } + + this->mCutsceneHandler->mFlags2 = uVar2; +} + +ARM unk32 AdventureFlags::func_ov00_02098058() { + return this->mCutsceneHandler->mCutsceneTimer1; +} + +ARM bool AdventureFlags::func_ov00_02098064(unk32 param1) { + return this->mCutsceneHandler->func_ov000_02098694(param1); +} + +ARM bool AdventureFlags::func_ov00_02098074(unk32 param1, unk16 param2, unk32 param3, unk32 param4, bool param5) { + return this->mCutsceneHandler->func_ov000_020987c4(param1, param2, param3, param4, param5); +} + +ARM bool AdventureFlags::func_ov00_0209809c() { + return this->mCutsceneHandler->func_ov000_02098834(); +} + +ARM bool AdventureFlags::func_ov00_020980ac() { + return this->mCutsceneHandler->func_ov000_02098860(); +} + +ARM void AdventureFlags::func_ov00_020980bc(s32 param1) { + this->mCutsceneHandler->mFreeze += param1; +} diff --git a/src/00_Core/Save/FlagsUnk.cpp b/src/00_Core/Save/FlagsUnk.cpp index 11d43a92..0557c293 100644 --- a/src/00_Core/Save/FlagsUnk.cpp +++ b/src/00_Core/Save/FlagsUnk.cpp @@ -2,4 +2,3 @@ FlagsUnk::~FlagsUnk() {} FlagsUnk2::~FlagsUnk2() {} -void FlagsUnk::func_ov000_020980f8() {} diff --git a/src/04_Load/Save/AdventureFlags.cpp b/src/04_Load/Save/AdventureFlags.cpp index 8588afef..be12c0cc 100644 --- a/src/04_Load/Save/AdventureFlags.cpp +++ b/src/04_Load/Save/AdventureFlags.cpp @@ -8,4 +8,4 @@ void AdventureFlags::func_ov004_021044f8(s32 param1) {} void AdventureFlags::func_ov004_0210453c() {} bool AdventureFlags::func_ov004_0210455c(s32 param1) {} void AdventureFlags::func_ov004_021046c8(unk32 param1) {} -void AdventureFlags::func_ov004_021046d4() {} +void AdventureFlags::func_ov004_021046d4(s32 param1) {} -- cgit v1.2.3