diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 9f745287..61609093 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -79909,9 +79909,9 @@ 0x0000007100ec9c3c,sub_7100EC9C3C,328, 0x0000007100ec9d84,sub_7100EC9D84,1308, 0x0000007100eca2a0,sub_7100ECA2A0,248, -0x0000007100eca398,sub_7100ECA398,100, -0x0000007100eca3fc,sub_7100ECA3FC,108, -0x0000007100eca468,ResourceSystem::createInstance,152, +0x0000007100eca398,sub_7100ECA398,100,_ZN4ksys3res18GameResourceSystem18SingletonDisposer_D2Ev +0x0000007100eca3fc,sub_7100ECA3FC,108,_ZN4ksys3res18GameResourceSystem18SingletonDisposer_D0Ev +0x0000007100eca468,ResourceSystem::createInstance,152,_ZN4ksys3res18GameResourceSystem14createInstanceEPN4sead4HeapE 0x0000007100eca500,sub_7100ECA500,68, 0x0000007100eca544,PlayReport::dtor_delete,68, 0x0000007100eca588,ResourceSystem::init,80, diff --git a/src/KingSystem/Resource/CMakeLists.txt b/src/KingSystem/Resource/CMakeLists.txt index e2e23994..6236e6bd 100644 --- a/src/KingSystem/Resource/CMakeLists.txt +++ b/src/KingSystem/Resource/CMakeLists.txt @@ -98,6 +98,8 @@ target_sources(uking PRIVATE resCurrentResNameMgr.h resEntryFactory.cpp resEntryFactory.h + resGameResourceSystem.cpp + resGameResourceSystem.h resHandle.cpp resHandle.h resInfoContainer.cpp diff --git a/src/KingSystem/Resource/resGameResourceSystem.cpp b/src/KingSystem/Resource/resGameResourceSystem.cpp new file mode 100644 index 00000000..ef5cfe46 --- /dev/null +++ b/src/KingSystem/Resource/resGameResourceSystem.cpp @@ -0,0 +1,7 @@ +#include "KingSystem/Resource/resGameResourceSystem.h" + +namespace ksys::res { + +SEAD_SINGLETON_DISPOSER_IMPL(GameResourceSystem) + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resGameResourceSystem.h b/src/KingSystem/Resource/resGameResourceSystem.h new file mode 100644 index 00000000..cab62608 --- /dev/null +++ b/src/KingSystem/Resource/resGameResourceSystem.h @@ -0,0 +1,41 @@ +#pragma once + +#include + +namespace ksys::res { + +class CompactionMgr; + +// Also known as game::ResourceSystem (?) +class GameResourceSystem { + SEAD_SINGLETON_DISPOSER(GameResourceSystem) + GameResourceSystem() = default; + virtual ~GameResourceSystem(); + +public: + struct InitArg { + sead::Heap* heap; + }; + + bool init(const InitArg& arg); + + void calc(); + void pauseCompaction(); + void resumeCompaction(); + +private: + CompactionMgr* mCompactionMgr = nullptr; + bool mPauseCompaction = false; +}; + +class ScopedCompactionPauser { +public: + ScopedCompactionPauser() { GameResourceSystem::instance()->pauseCompaction(); } + ~ScopedCompactionPauser() { GameResourceSystem::instance()->resumeCompaction(); } + ScopedCompactionPauser(const ScopedCompactionPauser&) = delete; + ScopedCompactionPauser(ScopedCompactionPauser&&) = delete; + auto operator=(const ScopedCompactionPauser&) = delete; + auto operator=(ScopedCompactionPauser&&) = delete; +}; + +} // namespace ksys::res