ksys/gdt: Implement more Manager functions

This commit is contained in:
Léo Lam 2020-11-04 12:27:38 +01:00
parent f9373cd154
commit f2a8d32f29
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
3 changed files with 157 additions and 27 deletions

View File

@ -74244,7 +74244,7 @@
0x0000007100dcef34,sub_7100DCEF34,72,_ZN4ksys3gdt7Manager14MethodTreeNodeD2Ev 0x0000007100dcef34,sub_7100DCEF34,72,_ZN4ksys3gdt7Manager14MethodTreeNodeD2Ev
0x0000007100dcef7c,sub_7100DCEF7C,132,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager10ResetEventEED2Ev 0x0000007100dcef7c,sub_7100DCEF7C,132,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager10ResetEventEED2Ev
0x0000007100dcf000,sub_7100DCF000,132,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager11ReinitEventEED2Ev 0x0000007100dcf000,sub_7100DCF000,132,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager11ReinitEventEED2Ev
0x0000007100dcf084,nullsub_3855,4,_ZN4ksys3gdt7Manager15TriggerParamRefD2Ev 0x0000007100dcf084,nullsub_3855,4,_ZN4ksys3gdt15TriggerParamRefD2Ev
0x0000007100dcf088,Res2Array::dtor,280,_ZN4sead9SafeArrayIN4ksys3res6HandleELi32EED2Ev 0x0000007100dcf088,Res2Array::dtor,280,_ZN4sead9SafeArrayIN4ksys3res6HandleELi32EED2Ev
0x0000007100dcf1a0,GameDataMgr::dtorDelete,36,_ZN4ksys3gdt7ManagerD0Ev 0x0000007100dcf1a0,GameDataMgr::dtorDelete,36,_ZN4ksys3gdt7ManagerD0Ev
0x0000007100dcf1c4,GameDataMgr::init,1264,_ZN4ksys3gdt7Manager4initEPN4sead4HeapEPNS2_9FrameworkE? 0x0000007100dcf1c4,GameDataMgr::init,1264,_ZN4ksys3gdt7Manager4initEPN4sead4HeapEPNS2_9FrameworkE?
@ -74252,7 +74252,7 @@
0x0000007100dcf974,EntryFactoryBgdata::dtor,68,_ZN4ksys3res12EntryFactoryINS0_8GameDataEED2Ev 0x0000007100dcf974,EntryFactoryBgdata::dtor,68,_ZN4ksys3res12EntryFactoryINS0_8GameDataEED2Ev
0x0000007100dcf9b8,GameDataMgr::loadGameDataFromArc,1692, 0x0000007100dcf9b8,GameDataMgr::loadGameDataFromArc,1692,
0x0000007100dd0054,GameDataMgr::loadShopGameDataInfo,600, 0x0000007100dd0054,GameDataMgr::loadShopGameDataInfo,600,
0x0000007100dd02ac,GameDataMgr::unloadResources,288, 0x0000007100dd02ac,GameDataMgr::unloadResources,288,_ZN4ksys3gdt7Manager15unloadResourcesEv
0x0000007100dd03cc,GameDataMgr::calc,896, 0x0000007100dd03cc,GameDataMgr::calc,896,
0x0000007100dd074c,GameDataMgr::calc0,548, 0x0000007100dd074c,GameDataMgr::calc0,548,
0x0000007100dd0970,nullsub_3856,4, 0x0000007100dd0970,nullsub_3856,4,
@ -74322,7 +74322,7 @@
0x0000007100dd7ca0,GameDataMgr::doSyncDataVec4fArray,528, 0x0000007100dd7ca0,GameDataMgr::doSyncDataVec4fArray,528,
0x0000007100dd7eb0,GameDataMgr::getName,12,_ZNK4ksys3gdt7Manager7getNameEv 0x0000007100dd7eb0,GameDataMgr::getName,12,_ZNK4ksys3gdt7Manager7getNameEv
0x0000007100dd7ebc,sub_7100DD7EBC,12,_ZThn8_NK4ksys3gdt7Manager7getNameEv 0x0000007100dd7ebc,sub_7100DD7EBC,12,_ZThn8_NK4ksys3gdt7Manager7getNameEv
0x0000007100dd7ec8,j__ZdlPv_893,4,_ZN4ksys3gdt7Manager15TriggerParamRefD0Ev 0x0000007100dd7ec8,j__ZdlPv_893,4,_ZN4ksys3gdt15TriggerParamRefD0Ev
0x0000007100dd7ecc,j__ZdlPv_894,4, 0x0000007100dd7ecc,j__ZdlPv_894,4,
0x0000007100dd7ed0,sub_7100DD7ED0,148,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager11ReinitEventEED0Ev 0x0000007100dd7ed0,sub_7100DD7ED0,148,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager11ReinitEventEED0Ev
0x0000007100dd7f64,sub_7100DD7F64,148,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager10ResetEventEED0Ev 0x0000007100dd7f64,sub_7100DD7F64,148,_ZN4sead13DelegateEventIPN4ksys3gdt7Manager10ResetEventEED0Ev

Can't render this file because it is too large.

View File

@ -113,10 +113,8 @@ void Manager::init(sead::Heap* heap, sead::Framework* framework) {
shop_gamedata_info_path.format("%s/%s.byml", "GameData", "ShopGameDataInfo"); shop_gamedata_info_path.format("%s/%s.byml", "GameData", "ShopGameDataInfo");
loadShopGameDataInfo(shop_gamedata_info_path); loadShopGameDataInfo(shop_gamedata_info_path);
mParam.param1 = &mFlagBuffer1; mParam.setBuffers(&mFlagBuffer1, &mFlagBuffer);
mParam.param = &mFlagBuffer; mParamBypassPerm.setBuffers(&mFlagBuffer1, &mFlagBuffer);
mParamBypassPerm.param1 = &mFlagBuffer1;
mParamBypassPerm.param = &mFlagBuffer;
mMethodTreeNode.method_tree_mgr = framework->getMethodTreeMgr(); mMethodTreeNode.method_tree_mgr = framework->getMethodTreeMgr();
mMethodTreeNode.node.setPauseFlag(sead::MethodTreeNode::cPause_None); mMethodTreeNode.node.setPauseFlag(sead::MethodTreeNode::cPause_None);
@ -127,4 +125,11 @@ void Manager::init(sead::Heap* heap, sead::Framework* framework) {
mNumFlagsToReset = 0; mNumFlagsToReset = 0;
} }
void Manager::unloadResources() {
for (s32 i = 0; i < mBgdataHandles.size(); ++i)
mBgdataHandles[i].requestUnload();
mGameDataArcHandle.requestUnload();
}
} // namespace ksys::gdt } // namespace ksys::gdt

View File

@ -7,6 +7,7 @@
#include <heap/seadDisposer.h> #include <heap/seadDisposer.h>
#include <prim/seadDelegateEventSlot.h> #include <prim/seadDelegateEventSlot.h>
#include <prim/seadTypedBitFlag.h> #include <prim/seadTypedBitFlag.h>
#include "KingSystem/GameData/gdtTriggerParam.h"
#include "KingSystem/Resource/resHandle.h" #include "KingSystem/Resource/resHandle.h"
#include "KingSystem/System/KingEditor.h" #include "KingSystem/System/KingEditor.h"
#include "KingSystem/Utils/Byaml.h" #include "KingSystem/Utils/Byaml.h"
@ -19,7 +20,109 @@ class MethodTreeMgr;
namespace ksys::gdt { 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 { class IManager {
public: public:
@ -53,27 +156,45 @@ public:
virtual ~ReinitEvent() = default; virtual ~ReinitEvent() = default;
}; };
struct TriggerParamRef { using ResetSignal = sead::DelegateEvent<ResetEvent*>;
TriggerParamRef(TriggerParam** param_1, TriggerParam** param, bool check_permissions, using ReinitSignal = sead::DelegateEvent<ReinitEvent*>;
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);
sead::Heap* getGameDataHeap() const { return mGameDataHeap; } sead::Heap* getGameDataHeap() const { return mGameDataHeap; }
sead::Heap* getSaveAreaHeap() const { return mSaveAreaHeap; } sead::Heap* getSaveAreaHeap() const { return mSaveAreaHeap; }
sead::Heap* getGameDataComHeap() const { return mGameDataComHeap; } 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); void init(sead::Heap* heap, sead::Framework* framework);
private: private:
@ -117,6 +238,10 @@ private:
sead::SafeArray<Record, 0xc0> arrays[2]{}; sead::SafeArray<Record, 0xc0> arrays[2]{};
}; };
static FlagHandle makeFlagHandle(u32 prefix, s32 idx) {
return FlagHandle(idx | (prefix << 24));
}
void loadGameData(const sead::SafeString& path); void loadGameData(const sead::SafeString& path);
void loadShopGameDataInfo(const sead::SafeString& path); void loadShopGameDataInfo(const sead::SafeString& path);
void unloadResources(); void unloadResources();
@ -148,10 +273,10 @@ private:
sead::TypedBitFlag<ResetFlag> mResetFlags; sead::TypedBitFlag<ResetFlag> mResetFlags;
u32 _c20 = 0; u32 _c20 = 0;
u32 mNumFlagsToReset = 0; u32 mNumFlagsToReset = 0;
u32 mParam1Flag = 0; u32 mCurrentFlagHandlePrefix = 0;
sead::DelegateEvent<ReinitEvent*> mReinitEvent; ReinitSignal mReinitSignal;
sead::DelegateEvent<ResetEvent*> mResetEvent; ResetSignal mResetSignal;
MethodTreeNode mMethodTreeNode; MethodTreeNode mMethodTreeNode;