diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 71075567..9e0668ad 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -74244,7 +74244,7 @@ 0x0000007100dcef34,sub_7100DCEF34,72,_ZN4ksys3gdt7Manager14MethodTreeNodeD2Ev 0x0000007100dcef7c,sub_7100DCEF7C,132,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager10ResetEventEED2Ev 0x0000007100dcf000,sub_7100DCF000,132,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager11ReinitEventEED2Ev -0x0000007100dcf084,nullsub_3855,4,_ZN4ksys3gdt7Manager15TriggerParamRefD2Ev +0x0000007100dcf084,nullsub_3855,4,_ZN4ksys3gdt15TriggerParamRefD2Ev 0x0000007100dcf088,Res2Array::dtor,280,_ZN4sead9SafeArrayIN4ksys3res6HandleELi32EED2Ev 0x0000007100dcf1a0,GameDataMgr::dtorDelete,36,_ZN4ksys3gdt7ManagerD0Ev 0x0000007100dcf1c4,GameDataMgr::init,1264,_ZN4ksys3gdt7Manager4initEPN4sead4HeapEPNS2_9FrameworkE? @@ -74252,7 +74252,7 @@ 0x0000007100dcf974,EntryFactoryBgdata::dtor,68,_ZN4ksys3res12EntryFactoryINS0_8GameDataEED2Ev 0x0000007100dcf9b8,GameDataMgr::loadGameDataFromArc,1692, 0x0000007100dd0054,GameDataMgr::loadShopGameDataInfo,600, -0x0000007100dd02ac,GameDataMgr::unloadResources,288, +0x0000007100dd02ac,GameDataMgr::unloadResources,288,_ZN4ksys3gdt7Manager15unloadResourcesEv 0x0000007100dd03cc,GameDataMgr::calc,896, 0x0000007100dd074c,GameDataMgr::calc0,548, 0x0000007100dd0970,nullsub_3856,4, @@ -74322,7 +74322,7 @@ 0x0000007100dd7ca0,GameDataMgr::doSyncDataVec4fArray,528, 0x0000007100dd7eb0,GameDataMgr::getName,12,_ZNK4ksys3gdt7Manager7getNameEv 0x0000007100dd7ebc,sub_7100DD7EBC,12,_ZThn8_NK4ksys3gdt7Manager7getNameEv -0x0000007100dd7ec8,j__ZdlPv_893,4,_ZN4ksys3gdt7Manager15TriggerParamRefD0Ev +0x0000007100dd7ec8,j__ZdlPv_893,4,_ZN4ksys3gdt15TriggerParamRefD0Ev 0x0000007100dd7ecc,j__ZdlPv_894,4, 0x0000007100dd7ed0,sub_7100DD7ED0,148,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager11ReinitEventEED0Ev 0x0000007100dd7f64,sub_7100DD7F64,148,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager10ResetEventEED0Ev diff --git a/src/KingSystem/GameData/gdtManager.cpp b/src/KingSystem/GameData/gdtManager.cpp index 6d753940..03fac494 100644 --- a/src/KingSystem/GameData/gdtManager.cpp +++ b/src/KingSystem/GameData/gdtManager.cpp @@ -113,10 +113,8 @@ void Manager::init(sead::Heap* heap, sead::Framework* framework) { shop_gamedata_info_path.format("%s/%s.byml", "GameData", "ShopGameDataInfo"); loadShopGameDataInfo(shop_gamedata_info_path); - mParam.param1 = &mFlagBuffer1; - mParam.param = &mFlagBuffer; - mParamBypassPerm.param1 = &mFlagBuffer1; - mParamBypassPerm.param = &mFlagBuffer; + mParam.setBuffers(&mFlagBuffer1, &mFlagBuffer); + mParamBypassPerm.setBuffers(&mFlagBuffer1, &mFlagBuffer); mMethodTreeNode.method_tree_mgr = framework->getMethodTreeMgr(); mMethodTreeNode.node.setPauseFlag(sead::MethodTreeNode::cPause_None); @@ -127,4 +125,11 @@ void Manager::init(sead::Heap* heap, sead::Framework* framework) { mNumFlagsToReset = 0; } +void Manager::unloadResources() { + for (s32 i = 0; i < mBgdataHandles.size(); ++i) + mBgdataHandles[i].requestUnload(); + + mGameDataArcHandle.requestUnload(); +} + } // namespace ksys::gdt diff --git a/src/KingSystem/GameData/gdtManager.h b/src/KingSystem/GameData/gdtManager.h index 43c595b7..eea5d1e3 100644 --- a/src/KingSystem/GameData/gdtManager.h +++ b/src/KingSystem/GameData/gdtManager.h @@ -7,6 +7,7 @@ #include #include #include +#include "KingSystem/GameData/gdtTriggerParam.h" #include "KingSystem/Resource/resHandle.h" #include "KingSystem/System/KingEditor.h" #include "KingSystem/Utils/Byaml.h" @@ -19,7 +20,109 @@ class MethodTreeMgr; namespace ksys::gdt { -class TriggerParam; +enum class FlagHandle : u32 {}; + +class TriggerParamRef { +public: + TriggerParamRef(TriggerParam** param_1, TriggerParam** param, bool check_permissions, + bool propagate_param_1_changes, bool change_only_once) + : mParam1(param_1), mParam(param), mCheckPermissions(check_permissions), + mPropagateParam1Changes(propagate_param_1_changes), mChangeOnlyOne(change_only_once) {} + + virtual ~TriggerParamRef() = default; + + class Proxy { + public: + TriggerParam* getBuffer() const { return mUseParam1 ? *mRef.mParam1 : *mRef.mParam; } + + // region Value getters + +#define PROXY_GET_SET_IMPL_(GET_NAME, SET_NAME, TYPE) \ + bool GET_NAME(TYPE* value, s32 index) const { \ + return getBuffer()->GET_NAME(value, index, mRef.mCheckPermissions); \ + } \ + bool GET_NAME(TYPE* value, s32 array_index, s32 index) const { \ + return getBuffer()->GET_NAME(value, array_index, index, mRef.mCheckPermissions); \ + } \ + bool GET_NAME(TYPE* value, const sead::SafeString& name) const { \ + return getBuffer()->GET_NAME(value, name, mRef.mCheckPermissions); \ + } \ + bool GET_NAME(TYPE* value, const sead::SafeString& array_name, s32 index) const { \ + return getBuffer()->GET_NAME(value, array_name, index, mRef.mCheckPermissions); \ + } \ + \ + bool SET_NAME(TYPE const& value, s32 idx, bool bypass_one_trigger_check = false) { \ + if (mRef.mChangeOnlyOne) \ + return false; \ + return getBuffer()->SET_NAME(value, idx, mRef.mCheckPermissions, \ + bypass_one_trigger_check); \ + } \ + bool SET_NAME(TYPE const& value, s32 array_idx, s32 idx, \ + bool bypass_one_trigger_check = false) { \ + if (mRef.mChangeOnlyOne) \ + return false; \ + return getBuffer()->SET_NAME(value, array_idx, idx, mRef.mCheckPermissions, \ + bypass_one_trigger_check); \ + } \ + bool SET_NAME(TYPE const& value, const sead::SafeString& name, \ + bool bypass_one_trigger_check = false) { \ + if (mRef.mChangeOnlyOne) \ + return false; \ + return getBuffer()->SET_NAME(value, name, mRef.mCheckPermissions, true, \ + bypass_one_trigger_check); \ + } \ + bool SET_NAME(TYPE const& value, const sead::SafeString& name, s32 idx, \ + bool bypass_one_trigger_check = false) { \ + if (mRef.mChangeOnlyOne) \ + return false; \ + return getBuffer()->SET_NAME(value, name, idx, mRef.mCheckPermissions, true, \ + bypass_one_trigger_check); \ + } + + PROXY_GET_SET_IMPL_(getBool, setBool, bool) + PROXY_GET_SET_IMPL_(getS32, setS32, s32) + PROXY_GET_SET_IMPL_(getF32, setF32, f32) + PROXY_GET_SET_IMPL_(getStr, setStr, char const*) + PROXY_GET_SET_IMPL_(getStr64, setStr64, char const*) + PROXY_GET_SET_IMPL_(getStr256, setStr256, char const*) + PROXY_GET_SET_IMPL_(getVec2f, setVec2f, sead::Vector2f) + PROXY_GET_SET_IMPL_(getVec3f, setVec3f, sead::Vector3f) + PROXY_GET_SET_IMPL_(getVec4f, setVec4f, sead::Vector4f) + +#undef PROXY_GET_SET_IMPL_ + + private: + friend class TriggerParamRef; + Proxy(const TriggerParamRef& ref, bool param1) : mUseParam1(param1), mRef(ref) {} + + bool mUseParam1; + const TriggerParamRef& mRef; + }; + + Proxy getParam() const { return Proxy(*this, false); } + Proxy getParam1() const { return Proxy(*this, true); } + + void setBuffers(TriggerParam** param1, TriggerParam** param) { + mParam1 = param1; + mParam = param; + } + + bool shouldCheckPermissions() const { return mCheckPermissions; } + bool shouldPropagateParam1Changes() const { return mPropagateParam1Changes; } + bool shouldChangeOnlyOne() const { return mChangeOnlyOne; } + + void setCheckPermissions(bool on) { mCheckPermissions = on; } + void setPropagateParam1Changes(bool on) { mPropagateParam1Changes = on; } + void setChangeOnlyOne(bool on) { mChangeOnlyOne = on; } + +private: + TriggerParam** mParam1; + TriggerParam** mParam; + bool mCheckPermissions; + bool mPropagateParam1Changes; + bool mChangeOnlyOne; +}; +KSYS_CHECK_SIZE_NX150(TriggerParamRef, 0x20); class IManager { public: @@ -53,27 +156,45 @@ public: virtual ~ReinitEvent() = default; }; - struct TriggerParamRef { - TriggerParamRef(TriggerParam** param_1, TriggerParam** param, bool check_permissions, - bool propagate_param_1_changes, bool change_only_once) - : param1(param_1), param(param), check_permissions(check_permissions), - propagate_param1_changes(propagate_param_1_changes), - change_only_once(change_only_once) {} - - virtual ~TriggerParamRef() = default; - - TriggerParam** param1; - TriggerParam** param; - bool check_permissions; - bool propagate_param1_changes; - bool change_only_once; - }; - KSYS_CHECK_SIZE_NX150(TriggerParamRef, 0x20); + using ResetSignal = sead::DelegateEvent; + using ReinitSignal = sead::DelegateEvent; sead::Heap* getGameDataHeap() const { return mGameDataHeap; } sead::Heap* getSaveAreaHeap() const { return mSaveAreaHeap; } sead::Heap* getGameDataComHeap() const { return mGameDataComHeap; } + TriggerParamRef& getParam() { return mParam; } + TriggerParamRef& getParamBypassPerm() { return mParamBypassPerm; } + +#define GDT_GET_HANDLE_(NAME, GET_IDX_NAME) \ + FlagHandle NAME(const sead::SafeString& name) const { \ + const auto prefix = mCurrentFlagHandlePrefix; \ + const auto hash = sead::HashCRC32::calcStringHash(name); \ + return makeFlagHandle(prefix, mParam.getParam1().getBuffer()->GET_IDX_NAME(hash)); \ + } + + GDT_GET_HANDLE_(getBoolHandle, TriggerParam::getBoolIdx) + GDT_GET_HANDLE_(getS32Handle, TriggerParam::getS32Idx) + GDT_GET_HANDLE_(getF32Handle, TriggerParam::getF32Idx) + GDT_GET_HANDLE_(getStrHandle, TriggerParam::getStrIdx) + GDT_GET_HANDLE_(getStr64Handle, TriggerParam::getStr64Idx) + GDT_GET_HANDLE_(getStr256Handle, TriggerParam::getStr256Idx) + GDT_GET_HANDLE_(getVec2fHandle, TriggerParam::getVec2fIdx) + GDT_GET_HANDLE_(getVec3fHandle, TriggerParam::getVec3fIdx) + GDT_GET_HANDLE_(getVec4fHandle, TriggerParam::getVec4fIdx) + + GDT_GET_HANDLE_(getBoolArrayHandle, TriggerParam::getBoolArrayIdx) + GDT_GET_HANDLE_(getS32ArrayHandle, TriggerParam::getS32ArrayIdx) + GDT_GET_HANDLE_(getF32ArrayHandle, TriggerParam::getF32ArrayIdx) + GDT_GET_HANDLE_(getStrArrayHandle, TriggerParam::getStrArrayIdx) + GDT_GET_HANDLE_(getStr64ArrayHandle, TriggerParam::getStr64ArrayIdx) + GDT_GET_HANDLE_(getStr256ArrayHandle, TriggerParam::getStr256ArrayIdx) + GDT_GET_HANDLE_(getVec2fArrayHandle, TriggerParam::getVec2fArrayIdx) + GDT_GET_HANDLE_(getVec3fArrayHandle, TriggerParam::getVec3fArrayIdx) + GDT_GET_HANDLE_(getVec4fArrayHandle, TriggerParam::getVec4fArrayIdx) + +#undef GDT_GET_HANDLE_ + void init(sead::Heap* heap, sead::Framework* framework); private: @@ -117,6 +238,10 @@ private: sead::SafeArray arrays[2]{}; }; + static FlagHandle makeFlagHandle(u32 prefix, s32 idx) { + return FlagHandle(idx | (prefix << 24)); + } + void loadGameData(const sead::SafeString& path); void loadShopGameDataInfo(const sead::SafeString& path); void unloadResources(); @@ -148,10 +273,10 @@ private: sead::TypedBitFlag mResetFlags; u32 _c20 = 0; u32 mNumFlagsToReset = 0; - u32 mParam1Flag = 0; + u32 mCurrentFlagHandlePrefix = 0; - sead::DelegateEvent mReinitEvent; - sead::DelegateEvent mResetEvent; + ReinitSignal mReinitSignal; + ResetSignal mResetSignal; MethodTreeNode mMethodTreeNode;