From 5d070b45df5ef99061a3ee4ebc9740ad02fa307f Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 27 Apr 2024 23:03:14 +0200 Subject: [PATCH 1/3] WIP ItemFlagManager stuff --- config/SOUE01/splits.txt | 6 + config/SOUE01/symbols.txt | 58 ++++----- configure.py | 2 + include/toBeSorted/itemflag_manager.h | 11 ++ include/toBeSorted/itemstory_manager_base.h | 44 +++++++ include/toBeSorted/unk_flag_stuff.h | 2 +- src/toBeSorted/itemflag_manager.cpp | 24 ++++ src/toBeSorted/itemstory_manager_base.cpp | 123 ++++++++++++++++++++ src/toBeSorted/misc_flag_managers.cpp | 2 + src/toBeSorted/unk_flag_stuff.cpp | 2 +- 10 files changed, 243 insertions(+), 31 deletions(-) create mode 100644 include/toBeSorted/itemflag_manager.h create mode 100644 include/toBeSorted/itemstory_manager_base.h create mode 100644 src/toBeSorted/itemflag_manager.cpp create mode 100644 src/toBeSorted/itemstory_manager_base.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 232dd3e7..6bf65058 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -122,6 +122,12 @@ toBeSorted/unk_flag_stuff.cpp: toBeSorted/bitwise_flag_helper.cpp: .text start:0x800BF200 end:0x800BF264 +toBeSorted/itemstory_manager_base.cpp: + .text start:0x800BF270 end:0x800BF694 + +toBeSorted/itemflag_manager.cpp: + .text start:0x800BF7C0 end:0x800BF880 + toBeSorted/skipflag_manager.cpp: .text start:0x800BFBA0 end:0x800BFE00 .sbss start:0x80575408 end:0x8057540C diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 1254741b..8b0cdf4f 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2228,7 +2228,7 @@ fn_80054CF0 = .text:0x80054CF0; // type:function size:0x88 fn_80054D80 = .text:0x80054D80; // type:function size:0x98 fn_80054E20 = .text:0x80054E20; // type:function size:0x88 fn_80054EB0 = .text:0x80054EB0; // type:function size:0x4 -fn_80054EC0 = .text:0x80054EC0; // type:function size:0xC +__nw__FUl = .text:0x80054EC0; // type:function size:0xC fn_80054ED0 = .text:0x80054ED0; // type:function size:0xC __dl__FPv = .text:0x80054EE0; // type:function size:0x8 fn_80054EF0 = .text:0x80054EF0; // type:function size:0x8 @@ -4132,44 +4132,44 @@ calculateMask__12UnkFlagStuffFi = .text:0x800BEF90; // type:function size:0x18 doNothing__12UnkFlagStuffFUi = .text:0x800BEFB0; // type:function size:0x4 __ct__12UnkFlagStuffFUsP17UnkFlagDefinition = .text:0x800BEFC0; // type:function size:0xC prepareIndexShiftMask__12UnkFlagStuffFUsUiPUsPUcPUs = .text:0x800BEFD0; // type:function size:0x80 -maskForIdx__12UnkFlagStuffFUs = .text:0x800BF050; // type:function size:0x50 +maskForIdx__12UnkFlagStuffFUsUs = .text:0x800BF050; // type:function size:0x50 getCounterOrFlag__12UnkFlagStuffFUsPUsUi = .text:0x800BF0A0; // type:function size:0x68 setCounterOrFlag__12UnkFlagStuffFUsPUsUiUi = .text:0x800BF110; // type:function size:0x9C checkFlagValid__12UnkFlagStuffFUsUi = .text:0x800BF1B0; // type:function size:0x50 checkFlag__17BitwiseFlagHelperFUsUsPCUsUs = .text:0x800BF200; // type:function size:0x14 setFlag__17BitwiseFlagHelperFUsUsPUsUs = .text:0x800BF220; // type:function size:0x20 unsetFlag__17BitwiseFlagHelperFUsUsPUsUs = .text:0x800BF240; // type:function size:0x24 -fn_800BF270 = .text:0x800BF270; // type:function size:0x28 -fn_800BF2A0 = .text:0x800BF2A0; // type:function size:0x70 -fn_800BF310 = .text:0x800BF310; // type:function size:0xC -fn_800BF320 = .text:0x800BF320; // type:function size:0x60 -fn_800BF380 = .text:0x800BF380; // type:function size:0x58 -fn_800BF3E0 = .text:0x800BF3E0; // type:function size:0x88 -fn_800BF470 = .text:0x800BF470; // type:function size:0x4 -fn_800BF480 = .text:0x800BF480; // type:function size:0x58 -fn_800BF4E0 = .text:0x800BF4E0; // type:function size:0x50 -fn_800BF530 = .text:0x800BF530; // type:function size:0x78 -fn_800BF5B0 = .text:0x800BF5B0; // type:function size:0x8 -fn_800BF5C0 = .text:0x800BF5C0; // type:function size:0x8 -fn_800BF5D0 = .text:0x800BF5D0; // type:function size:0x4 -fn_800BF5E0 = .text:0x800BF5E0; // type:function size:0x4 -fn_800BF5F0 = .text:0x800BF5F0; // type:function size:0x4 -fn_800BF600 = .text:0x800BF600; // type:function size:0x4 -fn_800BF610 = .text:0x800BF610; // type:function size:0x18 -fn_800BF630 = .text:0x800BF630; // type:function size:0x4 -fn_800BF640 = .text:0x800BF640; // type:function size:0x10 -fn_800BF650 = .text:0x800BF650; // type:function size:0x40 -fn_800BF690 = .text:0x800BF690; // type:function size:0x4 +__ct__20ItemStoryManagerBaseFv = .text:0x800BF270; // type:function size:0x28 +__dt__20ItemStoryManagerBaseFv = .text:0x800BF2A0; // type:function size:0x70 +setFlagSizes__20ItemStoryManagerBaseFUsUs = .text:0x800BF310; // type:function size:0xC +setupUnkFlagStuff__20ItemStoryManagerBaseFP17UnkFlagDefinitionUs = .text:0x800BF320; // type:function size:0x60 +copyFlagsFromSave_Priv__20ItemStoryManagerBaseFv = .text:0x800BF380; // type:function size:0x58 +init__20ItemStoryManagerBaseFv = .text:0x800BF3E0; // type:function size:0x88 +setFlagszptr__20ItemStoryManagerBaseFv = .text:0x800BF470; // type:function size:0x4 +getCounterOrFlag__20ItemStoryManagerBaseFUs = .text:0x800BF480; // type:function size:0x58 +getUncommittedValue_Priv__20ItemStoryManagerBaseFUs = .text:0x800BF4E0; // type:function size:0x50 +setOrClearFlag__20ItemStoryManagerBaseFUsb = .text:0x800BF530; // type:function size:0x78 +setFlag__20ItemStoryManagerBaseFUs = .text:0x800BF5B0; // type:function size:0x8 +unsetFlag__20ItemStoryManagerBaseFUs = .text:0x800BF5C0; // type:function size:0x8 +thunk_setOrClearFlag__20ItemStoryManagerBaseFUsb = .text:0x800BF5D0; // type:function size:0x4 +FUN_800bf5e0__20ItemStoryManagerBaseFUs = .text:0x800BF5E0; // type:function size:0x4 +getUncommittedValue__20ItemStoryManagerBaseFUs = .text:0x800BF5F0; // type:function size:0x4 +FUN_800bf600__20ItemStoryManagerBaseFUs = .text:0x800BF600; // type:function size:0x4 +FUN_800bf610__20ItemStoryManagerBaseFUs = .text:0x800BF610; // type:function size:0x18 +onDirty__20ItemStoryManagerBaseFv = .text:0x800BF630; // type:function size:0x4 +FUN_800bf640__20ItemStoryManagerBaseFUs = .text:0x800BF640; // type:function size:0x10 +doCommit_Priv__20ItemStoryManagerBaseFv = .text:0x800BF650; // type:function size:0x40 +FUN_800bf690__Fv = .text:0x800BF690; // type:function size:0x4 fn_800BF6A0 = .text:0x800BF6A0; // type:function size:0x5C fn_800BF700 = .text:0x800BF700; // type:function size:0x3C fn_800BF740 = .text:0x800BF740; // type:function size:0x10 fn_800BF750 = .text:0x800BF750; // type:function size:0x4 fn_800BF760 = .text:0x800BF760; // type:function size:0x4C fn_800BF7B0 = .text:0x800BF7B0; // type:function size:0x4 -fn_800BF7C0 = .text:0x800BF7C0; // type:function size:0x5C -fn_800BF820 = .text:0x800BF820; // type:function size:0x3C -fn_800BF860 = .text:0x800BF860; // type:function size:0x10 -fn_800BF870 = .text:0x800BF870; // type:function size:0x4 +__ct__15ItemFlagManagerFv = .text:0x800BF7C0; // type:function size:0x5C +copyFlagsFromSave__15ItemFlagManagerFv = .text:0x800BF820; // type:function size:0x3C +setupUnkFlagsStuff__15ItemFlagManagerFv = .text:0x800BF860; // type:function size:0x10 +onDirty__15ItemFlagManagerFv = .text:0x800BF870; // type:function size:0x4 fn_800BF880 = .text:0x800BF880; // type:function size:0x4C fn_800BF8D0 = .text:0x800BF8D0; // type:function size:0x54 fn_800BF930 = .text:0x800BF930; // type:function size:0xC @@ -31009,9 +31009,9 @@ lbl_80510B88 = .data:0x80510B88; // type:object size:0x3C lbl_80510BC4 = .data:0x80510BC4; // type:object size:0x3C lbl_80510C00 = .data:0x80510C00; // type:object size:0x14 lbl_80510C14 = .data:0x80510C14; // type:object size:0x14 -lbl_80510C28 = .data:0x80510C28; // type:object size:0x3C +__vt__15ItemFlagManager = .data:0x80510C28; // type:object size:0x3C lbl_80510C64 = .data:0x80510C64; // type:object size:0x3C -lbl_80510CA0 = .data:0x80510CA0; // type:object size:0x3C +__vt__20ItemStoryManagerBase = .data:0x80510CA0; // type:object size:0x3C __vt__18EnemyDefeatManager = .data:0x80510CDC; // type:object size:0x14 __vt__15TBoxFlagManager = .data:0x80510CF0; // type:object size:0x14 __vt__9FlagSpace = .data:0x80510D04; // type:object size:0xC diff --git a/configure.py b/configure.py index 7082ca12..75d5edec 100644 --- a/configure.py +++ b/configure.py @@ -274,6 +274,8 @@ def nw4rLib(lib_name, objects): Object(Matching, "toBeSorted/sceneflag_manager.cpp"), Object(NonMatching, "toBeSorted/flag_space.cpp"), Object(NonMatching, "toBeSorted/misc_flag_managers.cpp"), + Object(Matching, "toBeSorted/itemstory_manager_base.cpp"), + Object(NonMatching, "toBeSorted/itemflag_manager.cpp"), Object(Matching, "toBeSorted/skipflag_manager.cpp"), Object(Matching, "c/c_list.cpp"), Object(Matching, "c/c_tree.cpp"), diff --git a/include/toBeSorted/itemflag_manager.h b/include/toBeSorted/itemflag_manager.h new file mode 100644 index 00000000..ebad907c --- /dev/null +++ b/include/toBeSorted/itemflag_manager.h @@ -0,0 +1,11 @@ +#include + +class ItemFlagManager: ItemStoryManagerBase { +public: + FlagSpace itemFlags; + + ItemFlagManager(); + void copyFlagsFromSave() override; + void setupUnkFlagsStuff() override; + void onDirty() override; +}; diff --git a/include/toBeSorted/itemstory_manager_base.h b/include/toBeSorted/itemstory_manager_base.h new file mode 100644 index 00000000..612111ee --- /dev/null +++ b/include/toBeSorted/itemstory_manager_base.h @@ -0,0 +1,44 @@ +#include +#include +#include + +class ItemStoryManagerBase { +public: + // vtables, how do they work??? + /** 0x00 */ ItemStoryManagerBase(); + virtual void unk(); + /** 0x08 */ ~ItemStoryManagerBase(); + /** 0x0C */ virtual void setFlagszptr(); + /** 0x10 */ virtual void onDirty(); + /** 0x14 */ virtual void copyFlagsFromSave() = 0; + /** 0x18 */ virtual void setupUnkFlagsStuff() = 0; + /** 0x1C */ virtual void doCommit() = 0; + /** 0x20 */ virtual void setFlag(u16 flag); + /** 0x24 */ virtual void unsetFlag(u16 flag); + /** 0x28 */ virtual void setFlagOrCounterToValue(); + /** 0x2C */ virtual u32 getCounterOrFlag(u16 flag); + /** 0x30 */ virtual u32 getUncommittedValue(u16 flag); + /** 0x34 */ virtual void unk3(); + /** 0x38 */ virtual u16 *getSaveFlagSpace() = 0; + + void init(); + void setFlagSizes(u16 flagSizeMaybe, u16 anotherFlagSizeMaybe); + void copyFlagsFromSave_Priv(); + void setupUnkFlagStuff(UnkFlagDefinition *def, u16 count); + void doCommit_Priv(); + void thunk_setOrClearFlag(u16 flag, bool value); + void setOrClearFlag(u16 flag, bool value); + u32 FUN_800bf5e0(u16 flag); + u16 FUN_800bf600(u16 flag); + void FUN_800bf610(u16 flag); + u16 FUN_800bf640(u16 flag); + void FUN_800bf690(); + + u32 getUncommittedValue_Priv(u16 flag); + + /** 0x04 */ u16 flagSizeMaybe; + /** 0x06 */ u16 anotherSizeMaybe; + /** 0x08 */ FlagSpace *storyFlagsPtr; + /** 0x0C */ UnkFlagStuff *unkFlagsPtr; + /** 0x10 */ bool dirty; +}; diff --git a/include/toBeSorted/unk_flag_stuff.h b/include/toBeSorted/unk_flag_stuff.h index 50a4d5ee..46ec3ed1 100644 --- a/include/toBeSorted/unk_flag_stuff.h +++ b/include/toBeSorted/unk_flag_stuff.h @@ -17,7 +17,7 @@ class UnkFlagStuff { void doNothing(u32 unused); UnkFlagStuff(u16 count, UnkFlagDefinition *definitions); void prepareIndexShiftMask(u16 counterIdx, u32 flagCount, u16 *pIndex, u8 *pShift, u16 *pMask); - u16 maskForIdx(u16 index); + u16 maskForIdx(u16 index, u16 flagSizeMaybe); u32 getCounterOrFlag(u16 counterIdx, u16 *pData, u32 flagCount); void setCounterOrFlag(u16 counterIdx, u16 *pData, u32 flagCount, u32 value); u32 checkFlagValid(u16 counterIdx, u32 flagCount); diff --git a/src/toBeSorted/itemflag_manager.cpp b/src/toBeSorted/itemflag_manager.cpp new file mode 100644 index 00000000..863cd18d --- /dev/null +++ b/src/toBeSorted/itemflag_manager.cpp @@ -0,0 +1,24 @@ +#include + +// TODO Move +extern "C" u16 lbl_805A9BD8[]; +extern "C" UnkFlagDefinition lbl_805116F4[]; + +/** 800bf7c0 */ +ItemFlagManager::ItemFlagManager(): ItemStoryManagerBase(), itemFlags(lbl_805A9BD8, 0x40) { +} + +/** 800bf820 */ +void ItemFlagManager::copyFlagsFromSave() { + ItemStoryManagerBase::setFlagSizes(0x40, 0x80); + ItemStoryManagerBase::copyFlagsFromSave_Priv(); +} + +/** 800bf860 */ +void ItemFlagManager::setupUnkFlagsStuff() { + this->setupUnkFlagStuff(lbl_805116F4, 0x1fe); +} + +/** 800bf870 */ +void ItemFlagManager::onDirty() { +} diff --git a/src/toBeSorted/itemstory_manager_base.cpp b/src/toBeSorted/itemstory_manager_base.cpp new file mode 100644 index 00000000..c4321217 --- /dev/null +++ b/src/toBeSorted/itemstory_manager_base.cpp @@ -0,0 +1,123 @@ +#include + +/** 800bf270 */ +ItemStoryManagerBase::ItemStoryManagerBase(): flagSizeMaybe(0), anotherSizeMaybe(0), storyFlagsPtr(nullptr), unkFlagsPtr(nullptr), dirty(false) { + +} + +/** 800bf2a0 */ +ItemStoryManagerBase::~ItemStoryManagerBase() { + if (this->unkFlagsPtr) { + delete this->unkFlagsPtr; + } +} + +/** 800bf310 */ +void ItemStoryManagerBase::setFlagSizes(u16 flagSizeMaybe, u16 anotherFlagSizeMaybe) { + this->flagSizeMaybe = flagSizeMaybe; + this->anotherSizeMaybe = anotherFlagSizeMaybe; +} + +/** 800bf320 */ +void ItemStoryManagerBase::setupUnkFlagStuff(UnkFlagDefinition *def, u16 count) { + UnkFlagStuff *stuff = new UnkFlagStuff(count, def); + this->unkFlagsPtr = stuff; +} + +/** 800bf380 */ +void ItemStoryManagerBase::copyFlagsFromSave_Priv() { + FlagSpace *current = this->storyFlagsPtr; + u16 *saved = this->getSaveFlagSpace(); + current->copyFromSaveFile(saved, 0, this->flagSizeMaybe); +} + +void ItemStoryManagerBase::init() { + u16 *space = this->getSaveFlagSpace(); + if (space == nullptr || this->unkFlagsPtr == nullptr) { + this->setFlagszptr(); + this->copyFlagsFromSave(); + this->setupUnkFlagsStuff(); + } +} + +/** 800bf470 */ +void ItemStoryManagerBase::setFlagszptr() { + +} + +/** 800bf480 */ +u32 ItemStoryManagerBase::getCounterOrFlag(u16 flag) { + u16 *data = this->getSaveFlagSpace(); + return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); +} + +/** 800bf4e0 */ +u32 ItemStoryManagerBase::getUncommittedValue_Priv(u16 flag) { + u16 *data = this->storyFlagsPtr->getFlagPtrUnchecked(); + return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); +} + +/** 800bf530 */ +void ItemStoryManagerBase::setOrClearFlag(u16 flag, bool value) { + FlagSpace *storyFlagsPtr = this->storyFlagsPtr; + u16 *pData = storyFlagsPtr->getFlagPtrChecked(); + this->unkFlagsPtr->setCounterOrFlag(flag, pData, storyFlagsPtr->mCount, value); + this->FUN_800bf610(flag); +} + +/** 800bf5b0 */ +void ItemStoryManagerBase::setFlag(u16 flag) { + this->setOrClearFlag(flag, true); +} + +/** 800bf5c0 */ +void ItemStoryManagerBase::unsetFlag(u16 flag) { + this->setOrClearFlag(flag, false); +} + +/** 800bf5d0 */ +void ItemStoryManagerBase::thunk_setOrClearFlag(u16 flag, bool value) { + this->setOrClearFlag(flag, value); +} + +/** 800bf5e0 */ +u32 ItemStoryManagerBase::FUN_800bf5e0(u16 flag) { + return ItemStoryManagerBase::getCounterOrFlag(flag); +} + +/** 800bf5f0 */ +u32 ItemStoryManagerBase::getUncommittedValue(u16 flag) { + return this->getUncommittedValue_Priv(flag); +} + +/** 800bf600 */ +u16 ItemStoryManagerBase::FUN_800bf600(u16 flag) { + return this->FUN_800bf640(flag); +} + +/** 800bf610 */ +void ItemStoryManagerBase::FUN_800bf610(u16 flag) { + this->dirty = true; + this->onDirty(); +} + +/** 800bf630 */ +void ItemStoryManagerBase::onDirty() { + +} + +/** 800bf640 */ +u16 ItemStoryManagerBase::FUN_800bf640(u16 flag) { + return this->unkFlagsPtr->maskForIdx(flag, this->flagSizeMaybe); +} + +/** 800bf650 */ +void ItemStoryManagerBase::doCommit_Priv() { + this->doCommit(); + this->dirty = false; +} + +/* 800bf690 */ +void FUN_800bf690() { + +} diff --git a/src/toBeSorted/misc_flag_managers.cpp b/src/toBeSorted/misc_flag_managers.cpp index a3e8f264..a334f527 100644 --- a/src/toBeSorted/misc_flag_managers.cpp +++ b/src/toBeSorted/misc_flag_managers.cpp @@ -137,7 +137,9 @@ class EnemyDefeatManager : public CommittableFlagManager { void setFlag(u16 flag); }; +/** 0x805753F0 */ EnemyDefeatManager *EnemyDefeatManager::sInstance = nullptr; +/** 0x805A7AD8 */ u16 EnemyDefeatManager::sEnemyDefeatFlags[4096] = {}; /* 0x800BEAC0 */ diff --git a/src/toBeSorted/unk_flag_stuff.cpp b/src/toBeSorted/unk_flag_stuff.cpp index 17cbaa87..47c35e01 100644 --- a/src/toBeSorted/unk_flag_stuff.cpp +++ b/src/toBeSorted/unk_flag_stuff.cpp @@ -18,7 +18,7 @@ void UnkFlagStuff::prepareIndexShiftMask(u16 counterIdx, u32 unused, u16 *indexP *maskPtr = calculateMask(mpDefinitions[counterIdx].mShiftMask); } -u16 UnkFlagStuff::maskForIdx(u16 index) { +u16 UnkFlagStuff::maskForIdx(u16 index, u16 flagSizeMaybe) { doNothing(index); return calculateMask(mpDefinitions[index].mShiftMask); From cb4e9c00bf7422d71b29c6e403b54e53f9684c5d Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 28 Apr 2024 00:04:28 +0200 Subject: [PATCH 2/3] Storyflag, header guards --- config/SOUE01/splits.txt | 3 +++ config/SOUE01/symbols.txt | 10 ++++----- configure.py | 1 + include/toBeSorted/itemflag_manager.h | 5 +++++ include/toBeSorted/itemstory_manager_base.h | 5 +++++ include/toBeSorted/storyflag_manager.h | 16 ++++++++++++++ src/toBeSorted/itemstory_manager_base.cpp | 1 + src/toBeSorted/storyflag_manager.cpp | 24 +++++++++++++++++++++ 8 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 include/toBeSorted/storyflag_manager.h create mode 100644 src/toBeSorted/storyflag_manager.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 6bf65058..357213a8 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -125,6 +125,9 @@ toBeSorted/bitwise_flag_helper.cpp: toBeSorted/itemstory_manager_base.cpp: .text start:0x800BF270 end:0x800BF694 +toBeSorted/storyflag_manager.cpp: + .text start:0x800BF6A0 end:0x800BF760 + toBeSorted/itemflag_manager.cpp: .text start:0x800BF7C0 end:0x800BF880 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 8b0cdf4f..7665c296 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4160,10 +4160,10 @@ onDirty__20ItemStoryManagerBaseFv = .text:0x800BF630; // type:function size:0x4 FUN_800bf640__20ItemStoryManagerBaseFUs = .text:0x800BF640; // type:function size:0x10 doCommit_Priv__20ItemStoryManagerBaseFv = .text:0x800BF650; // type:function size:0x40 FUN_800bf690__Fv = .text:0x800BF690; // type:function size:0x4 -fn_800BF6A0 = .text:0x800BF6A0; // type:function size:0x5C -fn_800BF700 = .text:0x800BF700; // type:function size:0x3C -fn_800BF740 = .text:0x800BF740; // type:function size:0x10 -fn_800BF750 = .text:0x800BF750; // type:function size:0x4 +__ct__16StoryFlagManagerFv = .text:0x800BF6A0; // type:function size:0x5C +copyFlagsFromSave__16StoryFlagManagerFv = .text:0x800BF700; // type:function size:0x3C +setupUnkFlagsStuff__16StoryFlagManagerFv = .text:0x800BF740; // type:function size:0x10 +onDirty__16StoryFlagManagerFv = .text:0x800BF750; // type:function size:0x4 fn_800BF760 = .text:0x800BF760; // type:function size:0x4C fn_800BF7B0 = .text:0x800BF7B0; // type:function size:0x4 __ct__15ItemFlagManagerFv = .text:0x800BF7C0; // type:function size:0x5C @@ -31010,7 +31010,7 @@ lbl_80510BC4 = .data:0x80510BC4; // type:object size:0x3C lbl_80510C00 = .data:0x80510C00; // type:object size:0x14 lbl_80510C14 = .data:0x80510C14; // type:object size:0x14 __vt__15ItemFlagManager = .data:0x80510C28; // type:object size:0x3C -lbl_80510C64 = .data:0x80510C64; // type:object size:0x3C +__vt__16StoryFlagManager = .data:0x80510C64; // type:object size:0x3C __vt__20ItemStoryManagerBase = .data:0x80510CA0; // type:object size:0x3C __vt__18EnemyDefeatManager = .data:0x80510CDC; // type:object size:0x14 __vt__15TBoxFlagManager = .data:0x80510CF0; // type:object size:0x14 diff --git a/configure.py b/configure.py index 75d5edec..21fc3873 100644 --- a/configure.py +++ b/configure.py @@ -276,6 +276,7 @@ def nw4rLib(lib_name, objects): Object(NonMatching, "toBeSorted/misc_flag_managers.cpp"), Object(Matching, "toBeSorted/itemstory_manager_base.cpp"), Object(NonMatching, "toBeSorted/itemflag_manager.cpp"), + Object(NonMatching, "toBeSorted/storyflag_manager.cpp"), Object(Matching, "toBeSorted/skipflag_manager.cpp"), Object(Matching, "c/c_list.cpp"), Object(Matching, "c/c_tree.cpp"), diff --git a/include/toBeSorted/itemflag_manager.h b/include/toBeSorted/itemflag_manager.h index ebad907c..13d8e4f7 100644 --- a/include/toBeSorted/itemflag_manager.h +++ b/include/toBeSorted/itemflag_manager.h @@ -1,3 +1,6 @@ +#ifndef ITEMFLAG_MANAGER_H +#define ITEMFLAG_MANAGER_H + #include class ItemFlagManager: ItemStoryManagerBase { @@ -9,3 +12,5 @@ class ItemFlagManager: ItemStoryManagerBase { void setupUnkFlagsStuff() override; void onDirty() override; }; + +#endif diff --git a/include/toBeSorted/itemstory_manager_base.h b/include/toBeSorted/itemstory_manager_base.h index 612111ee..9a586a9f 100644 --- a/include/toBeSorted/itemstory_manager_base.h +++ b/include/toBeSorted/itemstory_manager_base.h @@ -1,3 +1,6 @@ +#ifndef ITEMSTORY_MANAGER_BASE_H +#define ITEMSTORY_MANAGER_BASE_H + #include #include #include @@ -42,3 +45,5 @@ class ItemStoryManagerBase { /** 0x0C */ UnkFlagStuff *unkFlagsPtr; /** 0x10 */ bool dirty; }; + +#endif diff --git a/include/toBeSorted/storyflag_manager.h b/include/toBeSorted/storyflag_manager.h new file mode 100644 index 00000000..fbb18630 --- /dev/null +++ b/include/toBeSorted/storyflag_manager.h @@ -0,0 +1,16 @@ +#ifndef STORYFLAG_MANAGER_H +#define STORYFLAG_MANAGER_H + +#include + +class StoryFlagManager: ItemStoryManagerBase { +public: + FlagSpace storyFlags; + + StoryFlagManager(); + void copyFlagsFromSave() override; + void setupUnkFlagsStuff() override; + void onDirty() override; +}; + +#endif diff --git a/src/toBeSorted/itemstory_manager_base.cpp b/src/toBeSorted/itemstory_manager_base.cpp index c4321217..7a62a3ad 100644 --- a/src/toBeSorted/itemstory_manager_base.cpp +++ b/src/toBeSorted/itemstory_manager_base.cpp @@ -31,6 +31,7 @@ void ItemStoryManagerBase::copyFlagsFromSave_Priv() { current->copyFromSaveFile(saved, 0, this->flagSizeMaybe); } +/** 800bf3e0 */ void ItemStoryManagerBase::init() { u16 *space = this->getSaveFlagSpace(); if (space == nullptr || this->unkFlagsPtr == nullptr) { diff --git a/src/toBeSorted/storyflag_manager.cpp b/src/toBeSorted/storyflag_manager.cpp new file mode 100644 index 00000000..22c1bc65 --- /dev/null +++ b/src/toBeSorted/storyflag_manager.cpp @@ -0,0 +1,24 @@ +#include + +// TODO Move +extern "C" u16 lbl_805A9AD8[]; +extern "C" UnkFlagDefinition lbl_80510D90[]; + +/** 800bf6a0 */ +StoryFlagManager::StoryFlagManager(): ItemStoryManagerBase(), storyFlags(lbl_805A9AD8, 0x80) { +} + +/** 800bf700 */ +void StoryFlagManager::copyFlagsFromSave() { + ItemStoryManagerBase::setFlagSizes(0x80, 0x100); + ItemStoryManagerBase::copyFlagsFromSave_Priv(); +} + +/** 800bf740 */ +void StoryFlagManager::setupUnkFlagsStuff() { + this->setupUnkFlagStuff(lbl_80510D90, 0x4b1); +} + +/** 800bf750 */ +void StoryFlagManager::onDirty() { +} From 20eab06432a7bf22f246996534ed16757cf86930 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 28 Apr 2024 00:22:07 +0200 Subject: [PATCH 3/3] Some more manager stuff --- config/SOUE01/splits.txt | 4 ++-- config/SOUE01/symbols.txt | 8 ++++---- include/toBeSorted/itemflag_manager.h | 1 + include/toBeSorted/itemstory_manager_base.h | 2 +- include/toBeSorted/storyflag_manager.h | 2 ++ src/toBeSorted/itemflag_manager.cpp | 10 ++++++++++ src/toBeSorted/itemstory_manager_base.cpp | 2 +- src/toBeSorted/storyflag_manager.cpp | 15 +++++++++++++++ 8 files changed, 36 insertions(+), 8 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 357213a8..5aec590a 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -126,10 +126,10 @@ toBeSorted/itemstory_manager_base.cpp: .text start:0x800BF270 end:0x800BF694 toBeSorted/storyflag_manager.cpp: - .text start:0x800BF6A0 end:0x800BF760 + .text start:0x800BF6A0 end:0x800BF7B4 toBeSorted/itemflag_manager.cpp: - .text start:0x800BF7C0 end:0x800BF880 + .text start:0x800BF7C0 end:0x800BF8CC toBeSorted/skipflag_manager.cpp: .text start:0x800BFBA0 end:0x800BFE00 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 7665c296..6a4edf52 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4159,18 +4159,18 @@ FUN_800bf610__20ItemStoryManagerBaseFUs = .text:0x800BF610; // type:function siz onDirty__20ItemStoryManagerBaseFv = .text:0x800BF630; // type:function size:0x4 FUN_800bf640__20ItemStoryManagerBaseFUs = .text:0x800BF640; // type:function size:0x10 doCommit_Priv__20ItemStoryManagerBaseFv = .text:0x800BF650; // type:function size:0x40 -FUN_800bf690__Fv = .text:0x800BF690; // type:function size:0x4 +FUN_800bf690__20ItemStoryManagerBaseFv = .text:0x800BF690; // type:function size:0x4 __ct__16StoryFlagManagerFv = .text:0x800BF6A0; // type:function size:0x5C copyFlagsFromSave__16StoryFlagManagerFv = .text:0x800BF700; // type:function size:0x3C setupUnkFlagsStuff__16StoryFlagManagerFv = .text:0x800BF740; // type:function size:0x10 onDirty__16StoryFlagManagerFv = .text:0x800BF750; // type:function size:0x4 -fn_800BF760 = .text:0x800BF760; // type:function size:0x4C -fn_800BF7B0 = .text:0x800BF7B0; // type:function size:0x4 +doCommit__16StoryFlagManagerFv = .text:0x800BF760; // type:function size:0x4C +unsetFlag__16StoryFlagManagerFUs = .text:0x800BF7B0; // type:function size:0x4 __ct__15ItemFlagManagerFv = .text:0x800BF7C0; // type:function size:0x5C copyFlagsFromSave__15ItemFlagManagerFv = .text:0x800BF820; // type:function size:0x3C setupUnkFlagsStuff__15ItemFlagManagerFv = .text:0x800BF860; // type:function size:0x10 onDirty__15ItemFlagManagerFv = .text:0x800BF870; // type:function size:0x4 -fn_800BF880 = .text:0x800BF880; // type:function size:0x4C +doCommit__15ItemFlagManagerFv = .text:0x800BF880; // type:function size:0x4C fn_800BF8D0 = .text:0x800BF8D0; // type:function size:0x54 fn_800BF930 = .text:0x800BF930; // type:function size:0xC fn_800BF940 = .text:0x800BF940; // type:function size:0x3C diff --git a/include/toBeSorted/itemflag_manager.h b/include/toBeSorted/itemflag_manager.h index 13d8e4f7..a1ace08a 100644 --- a/include/toBeSorted/itemflag_manager.h +++ b/include/toBeSorted/itemflag_manager.h @@ -11,6 +11,7 @@ class ItemFlagManager: ItemStoryManagerBase { void copyFlagsFromSave() override; void setupUnkFlagsStuff() override; void onDirty() override; + bool doCommit() override; }; #endif diff --git a/include/toBeSorted/itemstory_manager_base.h b/include/toBeSorted/itemstory_manager_base.h index 9a586a9f..6b1af365 100644 --- a/include/toBeSorted/itemstory_manager_base.h +++ b/include/toBeSorted/itemstory_manager_base.h @@ -15,7 +15,7 @@ class ItemStoryManagerBase { /** 0x10 */ virtual void onDirty(); /** 0x14 */ virtual void copyFlagsFromSave() = 0; /** 0x18 */ virtual void setupUnkFlagsStuff() = 0; - /** 0x1C */ virtual void doCommit() = 0; + /** 0x1C */ virtual bool doCommit() = 0; /** 0x20 */ virtual void setFlag(u16 flag); /** 0x24 */ virtual void unsetFlag(u16 flag); /** 0x28 */ virtual void setFlagOrCounterToValue(); diff --git a/include/toBeSorted/storyflag_manager.h b/include/toBeSorted/storyflag_manager.h index fbb18630..133e4c4a 100644 --- a/include/toBeSorted/storyflag_manager.h +++ b/include/toBeSorted/storyflag_manager.h @@ -11,6 +11,8 @@ class StoryFlagManager: ItemStoryManagerBase { void copyFlagsFromSave() override; void setupUnkFlagsStuff() override; void onDirty() override; + void unsetFlag(u16 flag) override; + bool doCommit() override; }; #endif diff --git a/src/toBeSorted/itemflag_manager.cpp b/src/toBeSorted/itemflag_manager.cpp index 863cd18d..fa1452d7 100644 --- a/src/toBeSorted/itemflag_manager.cpp +++ b/src/toBeSorted/itemflag_manager.cpp @@ -22,3 +22,13 @@ void ItemFlagManager::setupUnkFlagsStuff() { /** 800bf870 */ void ItemFlagManager::onDirty() { } + +/** 800bf880 */ +bool ItemFlagManager::doCommit() { + if (this->dirty) { + ItemStoryManagerBase::doCommit_Priv(); + ItemStoryManagerBase::FUN_800bf690(); + return true; + } + return false; +} diff --git a/src/toBeSorted/itemstory_manager_base.cpp b/src/toBeSorted/itemstory_manager_base.cpp index 7a62a3ad..8d8d69ee 100644 --- a/src/toBeSorted/itemstory_manager_base.cpp +++ b/src/toBeSorted/itemstory_manager_base.cpp @@ -119,6 +119,6 @@ void ItemStoryManagerBase::doCommit_Priv() { } /* 800bf690 */ -void FUN_800bf690() { +void ItemStoryManagerBase::FUN_800bf690() { } diff --git a/src/toBeSorted/storyflag_manager.cpp b/src/toBeSorted/storyflag_manager.cpp index 22c1bc65..8f39b100 100644 --- a/src/toBeSorted/storyflag_manager.cpp +++ b/src/toBeSorted/storyflag_manager.cpp @@ -22,3 +22,18 @@ void StoryFlagManager::setupUnkFlagsStuff() { /** 800bf750 */ void StoryFlagManager::onDirty() { } + +/** 800bf760 */ +bool StoryFlagManager::doCommit() { + if (this->dirty) { + ItemStoryManagerBase::doCommit_Priv(); + ItemStoryManagerBase::FUN_800bf690(); + return true; + } + return false; +} + +/** 800bf7b0 */ +void StoryFlagManager::unsetFlag(u16 flag) { + ItemStoryManagerBase::unsetFlag(flag); +}