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 <Yanis002@users.noreply.github.com>
Co-authored-by: Aetias <aetias@outlook.com>
This commit is contained in:
Yanis
2025-07-22 16:17:02 +02:00
committed by GitHub
parent 383ca6aaa2
commit cf8f5a80b1
16 changed files with 562 additions and 306 deletions
+3 -2
View File
@@ -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);
}
+280 -89
View File
@@ -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[];
extern unk32 data_027e0dbc;
extern "C" void func_ov000_0207ba94(unk32 *, u32);
extern "C" void *func_ov040_021834cc();
extern "C" void *func_ov035_02183200();
bool AdventureFlags::Exists() {
extern FlagsUnk data_ov000_020e310c[];
extern FlagsData data_ov000_020eaac4;
ARM bool AdventureFlags::Exists() {
return gAdventureFlags != NULL;
}
void AdventureFlags::CopyTo(unk32 *flags) {}
void AdventureFlags::func_ov00_02097674() {
func_ov000_020980f8(this->mCutsceneHandler);
ARM void AdventureFlags::CopyTo(FlagsData *flags) {
*flags = this->mFlags;
}
s32 AdventureFlags::func_ov00_02097684() {
return func_ov000_020980fc(this->mCutsceneHandler);
ARM void AdventureFlags::func_ov00_02097674() {
this->mCutsceneHandler->func_ov000_020980f8();
}
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() {}
bool AdventureFlags::Get_FlagsUnk_30_Flag(s32 index) {
unk32 unk30 = this->Get_FlagsUnk_30(index);
return this->Get(unk30);
ARM s32 AdventureFlags::func_ov00_02097684(unk32 param1, unk32 param2, void **param3) {
return this->mCutsceneHandler->func_ov000_020980fc(param1, param2, param3);
}
u8 AdventureFlags::Get_FlagsUnk_49(s32 index) {
return data_ov000_020e3155[index * 0x4C];
ARM void AdventureFlags::Load() {
this->mFlags = data_ov000_020eaac4;
}
u8 AdventureFlags::Get_FlagsUnk_48(s32 index) {
return data_ov000_020e3154[index * 0x4C];
ARM void AdventureFlags::func_ov00_020976c8() {
this->mCutsceneHandler->SetFlags(~1);
this->mCutsceneHandler->func_ov000_02098658();
this->mUnk_44->func_ov000_02099024();
}
u8 AdventureFlags::Get_FlagsUnk_4a(s32 index) {
return data_ov000_020e3156[index * 0x4C];
ARM void AdventureFlags::func_ov00_02097700() {
this->mCutsceneHandler->SetFlags(~1);
this->mCutsceneHandler->func_ov000_02098658();
this->mUnk_44->func_ov000_02099024();
}
u16 AdventureFlags::Get_FlagsUnk_42(s32 index) {
return *(u16 *) (data_ov000_020e314e + index * 0x4C);
ARM bool AdventureFlags::func_ov00_02097738() {
return this->mCutsceneHandler->mFlags1 & 1;
}
u16 AdventureFlags::Get_FlagsUnk_40(s32 index) {
return *(unk16 *) (data_ov000_020e314c + index * 0x4C);
ARM bool AdventureFlags::func_ov00_02097750() {
return gMessageManager.mUnk_04;
}
unk32 AdventureFlags::Get_FlagsUnk_38(s32 index) {
return *(unk32 *) (data_ov000_020e3144 + 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);
}
unk32 AdventureFlags::Get_FlagsUnk_34(s32 index) {
return *(unk32 *) (data_ov000_020e3140 + 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);
}
}
}
unk32 AdventureFlags::Get_FlagsUnk_44(s32 index) {
return *(unk32 *) (data_ov000_020e3150 + 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_30(s32 index) {
return *(unk32 *) (data_ov000_020e313c + 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);
}
bool AdventureFlags::Get_FlagsUnk_00(s32 index, FlagsUnk2 *result) {}
bool AdventureFlags::Get_FlagsUnk_18(s32 index, FlagsUnk2 *result) {}
FlagsUnk *AdventureFlags::Get_FlagsUnk(s32 index) {
return (FlagsUnk *) (data_ov000_020e310c + index * 0x4C);
ARM bool AdventureFlags::func_ov00_02097bac() {
return this->mUnk_44->func_ov000_02098c68();
}
bool AdventureFlags::func_ov00_02097e6c() {
return func_ov000_02098114(this->mCutsceneHandler);
ARM bool AdventureFlags::func_ov00_02097bbc() {
return this->mUnk_44->func_ov000_02098d20();
}
bool AdventureFlags::func_ov00_02097e7c() {
bool bVar1;
ARM bool AdventureFlags::func_ov00_02097bcc(s32 param1) {
return this->mUnk_44->func_ov000_02098fa4(param1);
}
bVar1 = this->func_ov00_02097e6c();
if (bVar1) {
bVar1 = this->mCutsceneHandler->SkipCutscene(0);
return bVar1;
ARM bool AdventureFlags::func_ov00_02097bcc(astruct_23 *param1) {
if (this->func_ov00_02097738()) {
return this->mUnk_44->func_ov000_020990a4(param1);
}
return false;
}
bool AdventureFlags::func_ov00_02097ea4() {
bool bVar1;
ARM s32 AdventureFlags::func_ov00_02097c08() {
return this->mUnk_44->func_ov000_0209907c();
}
bVar1 = this->func_ov00_02097e6c();
if (bVar1) {
bVar1 = this->mCutsceneHandler->SkipCutscene(1);
return bVar1;
ARM bool AdventureFlags::Get_FlagsUnk_30_Flag(s32 index) {
return this->Get(this->Get_FlagsUnk_30(index));
}
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;
}
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 bool AdventureFlags::func_ov00_02097ea4() {
if (this->func_ov00_02097e6c()) {
return this->mCutsceneHandler->SkipCutscene(1);
}
return false;
}
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;
}
-1
View File
@@ -2,4 +2,3 @@
FlagsUnk::~FlagsUnk() {}
FlagsUnk2::~FlagsUnk2() {}
void FlagsUnk::func_ov000_020980f8() {}
+1 -1
View File
@@ -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) {}