From 5e73b2b902c82b51e489e7f1b6d5644388a706de Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 25 Oct 2024 12:08:24 +0200 Subject: [PATCH] OK, checkpoint --- config/SOUE01/symbols.txt | 28 ++++---- configure.py | 2 +- include/d/flag/flag_managers.h | 13 ++++ include/toBeSorted/item_story_flag_manager.h | 27 ++++---- src/REL/d/t/d_t_dowsing.cpp | 8 +-- src/toBeSorted/counters/rupee_counter.cpp | 2 +- .../flag_managers/flag_managers.cpp | 65 ++++++------------- src/toBeSorted/flag_managers/flag_space.inc | 5 +- .../flag_managers/skipflag_manager.inc | 3 +- 9 files changed, 70 insertions(+), 83 deletions(-) create mode 100644 include/d/flag/flag_managers.h diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index a4c38ee4..d052772d 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3560,7 +3560,7 @@ fn_8009EAE0 = .text:0x8009EAE0; // type:function size:0x4 fn_8009EAF0 = .text:0x8009EAF0; // type:function size:0xC fn_8009EB00 = .text:0x8009EB00; // type:function size:0xC fn_8009EB10 = .text:0x8009EB10; // type:function size:0xC -fn_8009EB20 = .text:0x8009EB20; // type:function size:0x8 +setFlag__15ItemflagManagerFUs = .text:0x8009EB20; // type:function size:0x8 copyQueuedEventToCurrentAndHandleSkipEvent = .text:0x8009EB30; // type:function size:0x36C fn_8009EEA0 = .text:0x8009EEA0; // type:function size:0x53C alsoSetAsCurrentEvent__12EventManagerFP9dAcBase_cP5EventPv = .text:0x8009F3E0; // type:function size:0x470 @@ -4147,15 +4147,15 @@ setupUnkFlagStuff__20ItemStoryManagerBaseFP17UnkFlagDefinitionUs = .text:0x800BF 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__20ItemStoryManagerBaseCFUs = .text:0x800BF480; // type:function size:0x58 +getFlag__20ItemStoryManagerBaseCFUs = .text:0x800BF480; // type:function size:0x58 getUncommittedValue_Priv__20ItemStoryManagerBaseFUs = .text:0x800BF4E0; // type:function size:0x50 setOrClearFlag__20ItemStoryManagerBaseFUsUs = .text:0x800BF530; // type:function size:0x78 setFlag__20ItemStoryManagerBaseFUs = .text:0x800BF5B0; // type:function size:0x8 unsetFlag__20ItemStoryManagerBaseFUs = .text:0x800BF5C0; // type:function size:0x8 -thunk_setOrClearFlag__20ItemStoryManagerBaseFUsUs = .text:0x800BF5D0; // type:function size:0x4 -getFlag__20ItemStoryManagerBaseCFUs = .text:0x800BF5E0; // type:function size:0x4 +setFlagOrCounterToValue__20ItemStoryManagerBaseFUsUs = .text:0x800BF5D0; // type:function size:0x4 +getCounterOrFlag__20ItemStoryManagerBaseCFUs = .text:0x800BF5E0; // type:function size:0x4 getUncommittedValue__20ItemStoryManagerBaseFUs = .text:0x800BF5F0; // type:function size:0x4 -FUN_800bf600__20ItemStoryManagerBaseFUs = .text:0x800BF600; // type:function size:0x4 +unk3__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 @@ -4198,7 +4198,7 @@ postSetup__Fv = .text:0x800C01E0; // type:function size:0x8 copyAllFlagManagersFromSave__Fv = .text:0x800C01F0; // type:function size:0x78 updateFlagForFlagIndex__FUs = .text:0x800C0270; // type:function size:0x58 commitAllFlagManagers__Fv = .text:0x800C02D0; // type:function size:0x54 -checkedMemcpy = .text:0x800C0330; // type:function size:0x54 +checkedMemcpy__FPvUlPCvUl = .text:0x800C0330; // type:function size:0x54 getSaveFlagSpace__15ItemflagManagerCFv = .text:0x800C0390; // type:function size:0x8 unk3__15ItemflagManagerFUs = .text:0x800C03A0; // type:function size:0x8 getUncommittedValue__15ItemflagManagerFUs = .text:0x800C03B0; // type:function size:0x8 @@ -4211,10 +4211,10 @@ getSaveFlagSpace__16StoryflagManagerCFv = .text:0x800C0450; // type:function siz doCommit__16StoryflagManagerFv = .text:0x800C0460; // type:function size:0x44 setFlagszptr__16StoryflagManagerFv = .text:0x800C04B0; // type:function size:0xC doCommit__18EnemyDefeatManagerFv = .text:0x800C04C0; // type:function size:0x44 -__dt__18ItemflagManagerSubFv = .text:0x800C0510; // type:function size:0x5C -__dt__19StoryflagManagerSubFv = .text:0x800C0570; // type:function size:0x5C -__dt__21EnemyDefeatManagerSubFv = .text:0x800C05D0; // type:function size:0x40 -__dt__18TBoxFlagManagerSubFv = .text:0x800C0610; // type:function size:0x40 +__dt__32MyFlagManager<15ItemflagManager>Fv = .text:0x800C0510; // type:function size:0x5C +__dt__33MyFlagManager<16StoryflagManager>Fv = .text:0x800C0570; // type:function size:0x5C +__dt__35MyFlagManager<18EnemyDefeatManager>Fv = .text:0x800C05D0; // type:function size:0x40 +__dt__32MyFlagManager<15TBoxFlagManager>Fv = .text:0x800C0610; // type:function size:0x40 fn_800C0650 = .text:0x800C0650; // type:function size:0x3C fn_800C0690 = .text:0x800C0690; // type:function size:0x70 fn_800C0700 = .text:0x800C0700; // type:function size:0x7C @@ -31008,10 +31008,10 @@ lbl_80510B48 = .data:0x80510B48; // type:object size:0xC lbl_80510B54 = .data:0x80510B54; // type:object size:0xC lbl_80510B60 = .data:0x80510B60; // type:object size:0x10 lbl_80510B70 = .data:0x80510B70; // type:object size:0x18 -__vt__18ItemflagManagerSub = .data:0x80510B88; // type:object size:0x3C -__vt__19StoryflagManagerSub = .data:0x80510BC4; // type:object size:0x3C -__vt__21EnemyDefeatManagerSub = .data:0x80510C00; // type:object size:0x14 -__vt__18TBoxFlagManagerSub = .data:0x80510C14; // type:object size:0x14 +__vt__32MyFlagManager<15ItemflagManager> = .data:0x80510B88; // type:object size:0x3C +__vt__33MyFlagManager<16StoryflagManager> = .data:0x80510BC4; // type:object size:0x3C +__vt__35MyFlagManager<18EnemyDefeatManager> = .data:0x80510C00; // type:object size:0x14 +__vt__32MyFlagManager<15TBoxFlagManager> = .data:0x80510C14; // type:object size:0x14 __vt__15ItemflagManager = .data:0x80510C28; // type:object size:0x3C __vt__16StoryflagManager = .data:0x80510C64; // type:object size:0x3C __vt__20ItemStoryManagerBase = .data:0x80510CA0; // type:object size:0x3C diff --git a/configure.py b/configure.py index 0e2d79c1..7186abab 100644 --- a/configure.py +++ b/configure.py @@ -321,7 +321,7 @@ config.libs = [ "progress_category": "game", "host": False, "objects": [ - Object(NonMatching, "toBeSorted/flag_managers/flag_managers.cpp", extra_cflags=["-i src"]), + Object(Matching, "toBeSorted/flag_managers/flag_managers.cpp"), Object(NonMatching, "toBeSorted/special_item_drop_mgr.cpp"), Object(Matching, "d/d_base.cpp"), Object(Matching, "d/d_dvd.cpp"), diff --git a/include/d/flag/flag_managers.h b/include/d/flag/flag_managers.h new file mode 100644 index 00000000..e834dfbf --- /dev/null +++ b/include/d/flag/flag_managers.h @@ -0,0 +1,13 @@ +#ifndef D_FLAG_FLAG_MANAGERS_H +#define D_FLAG_FLAG_MANAGERS_H + +#include "egg/core/eggHeap.h" + +void setupFlagManagers(EGG::Heap *heap); +void copyAllFlagManagersFromSave(); +void updateFlagForFlagIndex(u16 stage); +void commitAllFlagManagers(); + +bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count); + +#endif diff --git a/include/toBeSorted/item_story_flag_manager.h b/include/toBeSorted/item_story_flag_manager.h index 07c96a09..5879954d 100644 --- a/include/toBeSorted/item_story_flag_manager.h +++ b/include/toBeSorted/item_story_flag_manager.h @@ -24,7 +24,7 @@ public: /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value); /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const; /** 0x30 */ virtual u16 getUncommittedValue(u16 flag); - /** 0x34 */ virtual void unk3(u16 arg); + /** 0x34 */ virtual u16 unk3(u16 arg); /** 0x38 */ virtual const u16 *getSaveFlagSpace() const = 0; @@ -33,10 +33,8 @@ public: void copyFlagsFromSave_Priv(); void setupUnkFlagStuff(UnkFlagDefinition *def, u16 count); void doCommit_Priv(); - void thunk_setOrClearFlag(u16 flag, u16 value); void setOrClearFlag(u16 flag, u16 value); - u16 getFlag(u16 flag) const; - u16 FUN_800bf600(u16 flag); + u16 getFlag(u16 flag) const; void FUN_800bf610(u16 flag); u16 FUN_800bf640(u16 flag); void FUN_800bf690(); @@ -72,12 +70,7 @@ public: u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); FileManager::sInstance->setStoryFlags(flags, 0, sz); } - /** 0x20 */ virtual void setFlag(u16 flag) override; /** 0x24 */ virtual void unsetFlag(u16 flag) override; - /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) override; - /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const override; - /** 0x30 */ virtual u16 getUncommittedValue(u16 flag) override; - /** 0x34 */ virtual void unk3(u16 arg) override; /** 0x38 */ virtual const u16 *getSaveFlagSpace() const override { return FileManager::sInstance->getStoryFlagsConst(); }; @@ -108,26 +101,32 @@ public: u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); FileManager::sInstance->setItemFlags(flags, 0, sz); } - /** 0x20 */ virtual void setFlag(u16 flag); + /** 0x20 */ virtual void setFlag(u16 flag) { + ItemStoryManagerBase::setFlag(flag & ~0x4000); + } /** 0x24 */ virtual void unsetFlag(u16 flag) { ItemStoryManagerBase::unsetFlag(flag & ~0x4000); } /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) { - ItemStoryManagerBase::thunk_setOrClearFlag(flag & ~0x4000, value); + ItemStoryManagerBase::setFlagOrCounterToValue(flag & ~0x4000, value); } /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const { - return getFlag(flag & ~0x4000); + return ItemStoryManagerBase::getCounterOrFlag(flag & ~0x4000); } /** 0x30 */ virtual u16 getUncommittedValue(u16 flag) { return ItemStoryManagerBase::getUncommittedValue(flag & ~0x4000); } - /** 0x34 */ virtual void unk3(u16 arg) { - FUN_800bf600(arg & ~0x4000); + /** 0x34 */ virtual u16 unk3(u16 arg) { + return ItemStoryManagerBase::unk3(arg & ~0x4000); } /** 0x38 */ virtual const u16 *getSaveFlagSpace() const { return FileManager::sInstance->getItemFlagsConst(); }; + u16 getFlagDirect(u16 flag) { + return ItemStoryManagerBase::getCounterOrFlag(flag); + } + public: static ItemflagManager *sInstance; static u16 sFlags[0x40]; diff --git a/src/REL/d/t/d_t_dowsing.cpp b/src/REL/d/t/d_t_dowsing.cpp index dee083da..d9e977be 100644 --- a/src/REL/d/t/d_t_dowsing.cpp +++ b/src/REL/d/t/d_t_dowsing.cpp @@ -56,13 +56,13 @@ bool dTgDowsing_c::checkDowsing() const { switch (mDowsingOption) { case TRIAL_0: - return ItemflagManager::sInstance->getFlag(187) && !StoryflagManager::sInstance->getCounterOrFlag(93); + return ItemflagManager::sInstance->getFlagDirect(187) && !StoryflagManager::sInstance->getCounterOrFlag(93); case TRIAL_1: - return ItemflagManager::sInstance->getFlag(188) && !StoryflagManager::sInstance->getCounterOrFlag(97); + return ItemflagManager::sInstance->getFlagDirect(188) && !StoryflagManager::sInstance->getCounterOrFlag(97); case TRIAL_2: - return ItemflagManager::sInstance->getFlag(189) && !StoryflagManager::sInstance->getCounterOrFlag(98); + return ItemflagManager::sInstance->getFlagDirect(189) && !StoryflagManager::sInstance->getCounterOrFlag(98); case TRIAL_3: - return ItemflagManager::sInstance->getFlag(193) && !StoryflagManager::sInstance->getCounterOrFlag(99); + return ItemflagManager::sInstance->getFlagDirect(193) && !StoryflagManager::sInstance->getCounterOrFlag(99); case PROPELLER: return DowsingTarget::hasPropellerDowsing(); case WATER_BASIN: return DowsingTarget::hasWaterBasinDowsing(); case CRYSTAL_BALL: return DowsingTarget::hasCrystalBallDowsing(); diff --git a/src/toBeSorted/counters/rupee_counter.cpp b/src/toBeSorted/counters/rupee_counter.cpp index 0ccfa6eb..69cb0ff9 100644 --- a/src/toBeSorted/counters/rupee_counter.cpp +++ b/src/toBeSorted/counters/rupee_counter.cpp @@ -28,7 +28,7 @@ struct WalletStruct { }; const WalletStruct *wallet = &wallet_definitions[3]; for (; i < 4; i++, wallet--) { - if (ItemflagManager::sInstance->getFlag(wallet->flag)) { + if (ItemflagManager::sInstance->getFlagDirect(wallet->flag)) { return wallet->capacity; } } diff --git a/src/toBeSorted/flag_managers/flag_managers.cpp b/src/toBeSorted/flag_managers/flag_managers.cpp index 2f929ee9..842a76d7 100644 --- a/src/toBeSorted/flag_managers/flag_managers.cpp +++ b/src/toBeSorted/flag_managers/flag_managers.cpp @@ -1,5 +1,7 @@ // clang-format off +#include "d/flag/flag_managers.h" + #include "common.h" #include "toBeSorted/sceneflag_manager.h" #include @@ -61,7 +63,7 @@ void ItemStoryManagerBase::setFlagszptr() { } /** 800bf480 */ -u16 ItemStoryManagerBase::getCounterOrFlag(u16 flag) const { +u16 ItemStoryManagerBase::getFlag(u16 flag) const { const u16 *data = this->getSaveFlagSpace(); return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); } @@ -91,13 +93,13 @@ void ItemStoryManagerBase::unsetFlag(u16 flag) { } /** 800bf5d0 */ -void ItemStoryManagerBase::thunk_setOrClearFlag(u16 flag, u16 value) { +void ItemStoryManagerBase::setFlagOrCounterToValue(u16 flag, u16 value) { this->setOrClearFlag(flag, value); } /** 800bf5e0 */ -u16 ItemStoryManagerBase::getFlag(u16 flag) const { - return ItemStoryManagerBase::getCounterOrFlag(flag); +u16 ItemStoryManagerBase::getCounterOrFlag(u16 flag) const { + return ItemStoryManagerBase::getFlag(flag); } /** 800bf5f0 */ @@ -106,7 +108,7 @@ u16 ItemStoryManagerBase::getUncommittedValue(u16 flag) { } /** 800bf600 */ -u16 ItemStoryManagerBase::FUN_800bf600(u16 flag) { +u16 ItemStoryManagerBase::unk3(u16 flag) { return this->FUN_800bf640(flag); } @@ -203,79 +205,54 @@ bool ItemflagManager::commit() { #include static void postSetup(); -static void updateFlagForFlagIndex(u16 stage); -class TBoxFlagManagerSub : public TBoxFlagManager { + +template +class MyFlagManager : public T { public: - TBoxFlagManagerSub() { - TBoxFlagManager::sInstance = this; + MyFlagManager() { } - // virtual ~TBoxFlagManagerSub() {} -}; - -class EnemyDefeatManagerSub : public EnemyDefeatManager { - // virtual ~EnemyDefeatManagerSub() {} -}; - - -class StoryflagManagerSub : public StoryflagManager { - // virtual ~StoryflagManagerSub() {} -}; - -class ItemflagManagerSub : public ItemflagManager { - // virtual ~ItemflagManagerSub() {} -}; - -class SceneflagManagerSub : public SceneflagManager { - -}; - -class DungeonflagManagerSub : public DungeonflagManager { - -}; - -class SkipflagManagerSub : public SkipflagManager { - + ~MyFlagManager() {} }; void setupFlagManagers(EGG::Heap *heap) { if (SceneflagManager::sInstance == nullptr) { - SceneflagManager::sInstance = new (heap) SceneflagManagerSub(); + SceneflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); SceneflagManager::sInstance->init(); } if (TBoxFlagManager::sInstance == nullptr) { - TBoxFlagManager::sInstance = new (heap) TBoxFlagManagerSub(); + TBoxFlagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); TBoxFlagManager::sInstance->init(); } if (EnemyDefeatManager::sInstance == nullptr) { - EnemyDefeatManager::sInstance = new (heap) EnemyDefeatManagerSub(); + EnemyDefeatManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); EnemyDefeatManager::sInstance->init(); } if (StoryflagManager::sInstance == nullptr) { - StoryflagManager::sInstance = new (heap) StoryflagManagerSub(); + StoryflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); StoryflagManager::sInstance->init(); } if (ItemflagManager::sInstance == nullptr) { - ItemflagManager::sInstance = new (heap) ItemflagManagerSub(); + ItemflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); ItemflagManager::sInstance->init(); } if (DungeonflagManager::sInstance == nullptr) { - DungeonflagManager::sInstance = new (heap) DungeonflagManagerSub(); + DungeonflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); DungeonflagManager::sInstance->init(); } if (SkipflagManager::sInstance == nullptr) { - SkipflagManager::sInstance = new (heap) SkipflagManagerSub(); + SkipflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); SkipflagManager::sInstance->init(); } @@ -298,7 +275,7 @@ void copyAllFlagManagersFromSave() { EnemyDefeatManager::sInstance->copyFromSave(flag); } -static void updateFlagForFlagIndex(u16 stage) { +void updateFlagForFlagIndex(u16 stage) { SceneflagManager::sInstance->updateFlagindex(stage); TBoxFlagManager::sInstance->copyFromSave(stage); EnemyDefeatManager::sInstance->updateFlagIndex(stage); @@ -315,7 +292,7 @@ void commitAllFlagManagers() { EnemyDefeatManager::sInstance->commitIfNecessary(); } -extern "C" bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count) { +bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count) { if (dest == nullptr || src == nullptr || destLen < count || destLen > 0xFFFF) { return true; } else { diff --git a/src/toBeSorted/flag_managers/flag_space.inc b/src/toBeSorted/flag_managers/flag_space.inc index 08e9e83e..93848a41 100644 --- a/src/toBeSorted/flag_managers/flag_space.inc +++ b/src/toBeSorted/flag_managers/flag_space.inc @@ -1,8 +1,7 @@ +#include "d/flag/flag_managers.h" #include "toBeSorted/flag_space.h" #include "toBeSorted/file_manager.h" -#include - -extern "C" bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count); +#include "common.h" u16 *FlagSpace::getFlagPtrChecked() const { filemanagerCheck(); diff --git a/src/toBeSorted/flag_managers/skipflag_manager.inc b/src/toBeSorted/flag_managers/skipflag_manager.inc index 0d859f5e..b568ebd7 100644 --- a/src/toBeSorted/flag_managers/skipflag_manager.inc +++ b/src/toBeSorted/flag_managers/skipflag_manager.inc @@ -1,10 +1,9 @@ #include "common.h" +#include "d/flag/flag_managers.h" #include "toBeSorted/bitwise_flag_helper.h" #include "toBeSorted/file_manager.h" #include "toBeSorted/flag_space.h" -extern "C" bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count); - class SkipflagManager { public: bool mShouldCommit;