diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 232dd3e7..5aec590a 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -122,6 +122,15 @@ 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/storyflag_manager.cpp: + .text start:0x800BF6A0 end:0x800BF7B4 + +toBeSorted/itemflag_manager.cpp: + .text start:0x800BF7C0 end:0x800BF8CC + 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..6a4edf52 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,45 +4132,45 @@ 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 -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 -fn_800BF880 = .text:0x800BF880; // type:function size:0x4C +__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__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 +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 +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 @@ -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 -lbl_80510C64 = .data:0x80510C64; // type:object size:0x3C -lbl_80510CA0 = .data:0x80510CA0; // type:object size:0x3C +__vt__15ItemFlagManager = .data:0x80510C28; // 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 __vt__9FlagSpace = .data:0x80510D04; // type:object size:0xC diff --git a/configure.py b/configure.py index 7082ca12..21fc3873 100644 --- a/configure.py +++ b/configure.py @@ -274,6 +274,9 @@ 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(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 new file mode 100644 index 00000000..a1ace08a --- /dev/null +++ b/include/toBeSorted/itemflag_manager.h @@ -0,0 +1,17 @@ +#ifndef ITEMFLAG_MANAGER_H +#define ITEMFLAG_MANAGER_H + +#include + +class ItemFlagManager: ItemStoryManagerBase { +public: + FlagSpace itemFlags; + + ItemFlagManager(); + 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 new file mode 100644 index 00000000..6b1af365 --- /dev/null +++ b/include/toBeSorted/itemstory_manager_base.h @@ -0,0 +1,49 @@ +#ifndef ITEMSTORY_MANAGER_BASE_H +#define ITEMSTORY_MANAGER_BASE_H + +#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 bool 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; +}; + +#endif diff --git a/include/toBeSorted/storyflag_manager.h b/include/toBeSorted/storyflag_manager.h new file mode 100644 index 00000000..133e4c4a --- /dev/null +++ b/include/toBeSorted/storyflag_manager.h @@ -0,0 +1,18 @@ +#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; + void unsetFlag(u16 flag) override; + bool doCommit() override; +}; + +#endif 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..fa1452d7 --- /dev/null +++ b/src/toBeSorted/itemflag_manager.cpp @@ -0,0 +1,34 @@ +#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() { +} + +/** 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 new file mode 100644 index 00000000..8d8d69ee --- /dev/null +++ b/src/toBeSorted/itemstory_manager_base.cpp @@ -0,0 +1,124 @@ +#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); +} + +/** 800bf3e0 */ +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 ItemStoryManagerBase::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/storyflag_manager.cpp b/src/toBeSorted/storyflag_manager.cpp new file mode 100644 index 00000000..8f39b100 --- /dev/null +++ b/src/toBeSorted/storyflag_manager.cpp @@ -0,0 +1,39 @@ +#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() { +} + +/** 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); +} 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);