From 578955f4e9b0d352a6a9c70288d8e988a1ec2717 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Fri, 4 Sep 2020 20:07:49 +0200 Subject: [PATCH] ksys/res: Implement Resource (base class) --- CMakeLists.txt | 3 ++ data/uking_functions.csv | 46 ++++++++++---------- src/KingSystem/Resource/resResource.cpp | 38 +++++++++++++++++ src/KingSystem/Resource/resResource.h | 56 +++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 23 deletions(-) create mode 100644 src/KingSystem/Resource/resResource.cpp create mode 100644 src/KingSystem/Resource/resResource.h diff --git a/CMakeLists.txt b/CMakeLists.txt index fbc8550c..5bb7d6ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,9 @@ add_executable(uking src/KingSystem/MessageSystem/mesTransceiver.h + src/KingSystem/Resource/resResource.cpp + src/KingSystem/Resource/resResource.h + src/KingSystem/Terrain/teraSystem.h src/KingSystem/Utils/Byaml.cpp diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 8bfe1516..5912bbad 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -56358,7 +56358,7 @@ 0x00000071009cab10,sub_71009CAB10,8, 0x00000071009cab18,sub_71009CAB18,92, 0x00000071009cab74,sub_71009CAB74,8, -0x00000071009cab7c,ResourceBase::needsParse,8, +0x00000071009cab7c,ResourceBase::needsParse,8,_ZNK4ksys3res8Resource10needsParseEv 0x00000071009cab84,sub_71009CAB84,8, 0x00000071009cad00,nullsub_5460,4, 0x00000071009cad04,sub_71009CAD04,496, @@ -56427,7 +56427,7 @@ 0x00000071009cde70,sub_71009CDE70,132, 0x00000071009cdef4,sub_71009CDEF4,92, 0x00000071009cdf50,sub_71009CDF50,8, -0x00000071009cdf58,ResourceBase::returnTrue,8, +0x00000071009cdf58,ResourceBase::returnTrue,8,_ZN4ksys3res8Resource3m2_Ev 0x00000071009cdf60,sub_71009CDF60,140, 0x00000071009ce10c,_ZN3agl12GPUMemBlockTIhED2Ev,20, 0x00000071009ce120,sub_71009CE120,52, @@ -90751,30 +90751,30 @@ 0x0000007101200abc,nullsub_4691,4, 0x0000007101200ac0,sub_7101200AC0,1444, 0x00000071012011d8,sub_71012011D8,124, -0x0000007101201254,ResourceBase::ctor,64, -0x0000007101201294,j__ZN4sead14DirectResourceD2Ev,4, -0x0000007101201298,sub_7101201298,8, -0x00000071012012a0,ResourceBase::dtorDelete,36, -0x00000071012012c4,sub_71012012C4,40, +0x0000007101201254,ResourceBase::ctor,64,_ZN4ksys3res8ResourceC1Ev +0x0000007101201294,j__ZN4sead14DirectResourceD2Ev,4,_ZN4ksys3res8ResourceD2Ev +0x0000007101201298,sub_7101201298,8,_ZThn32_N4ksys3res8ResourceD1Ev +0x00000071012012a0,ResourceBase::dtorDelete,36,_ZN4ksys3res8ResourceD0Ev +0x00000071012012c4,sub_71012012C4,40,_ZThn32_N4ksys3res8ResourceD0Ev 0x00000071012012ec,res::getResLoadArgAllocSize,16, -0x00000071012012fc,ResourceBase::getField30,8, -0x0000007101201304,ResourceBase::setField30,8, -0x000000710120130c,ResourceBase::callOnDestroy,12, -0x0000007101201318,ResourceBase::callParse,24, -0x0000007101201330,ResourceBase::callM5,32, -0x0000007101201350,ResourceBase::callM6AndClearField30,48, -0x0000007101201380,ResourceBase::callM7,12, -0x000000710120138c,ResourceBase::doCreate,4, -0x0000007101201390,ResourceBase::onDestroy,4, -0x0000007101201394,ResourceBase::parse,8, -0x000000710120139c,ResourceBase::nullsub1,4, -0x00000071012013a0,ResourceBase::afterParse,8, -0x00000071012013a8,ResourceBase::returnTrue4,8, -0x00000071012013b0,ResourceBase::nullsub2,4, +0x00000071012012fc,ResourceBase::getField30,8,_ZNK4ksys3res8Resource10getContextEv +0x0000007101201304,ResourceBase::setField30,8,_ZN4ksys3res8Resource10setContextEPNS0_7ContextE +0x000000710120130c,ResourceBase::callOnDestroy,12,_ZN4ksys3res8Resource9onDestroyEv +0x0000007101201318,ResourceBase::callParse,24,_ZN4ksys3res8Resource5parseEPNS0_7ContextEPN4sead4HeapE +0x0000007101201330,ResourceBase::callM5,32,_ZN4ksys3res8Resource2m5Ev +0x0000007101201350,ResourceBase::callM6AndClearField30,48,_ZN4ksys3res8Resource13finishParsingEv +0x0000007101201380,ResourceBase::callM7,12,_ZN4ksys3res8Resource2m7Ev +0x000000710120138c,ResourceBase::doCreate,4,_ZN4ksys3res8Resource9doCreate_EPhjPN4sead4HeapE +0x0000007101201390,ResourceBase::onDestroy,4,_ZN4ksys3res8Resource10onDestroy_Ev +0x0000007101201394,ResourceBase::parse,8,_ZN4ksys3res8Resource6parse_EPhmPN4sead4HeapE +0x000000710120139c,ResourceBase::nullsub1,4,_ZN4ksys3res8Resource3m5_Ev +0x00000071012013a0,ResourceBase::afterParse,8,_ZN4ksys3res8Resource14finishParsing_Ev +0x00000071012013a8,ResourceBase::returnTrue4,8,_ZN4ksys3res8Resource3m7_Ev +0x00000071012013b0,ResourceBase::nullsub2,4,_ZN4ksys3res8Resource3m8_Ev 0x00000071012013b4,res::setResLoadArgAllocSize,16, 0x00000071012013c4,res::clearResLoadArgAllocSize,16, -0x00000071012013d4,ResourceBase::rtti1,288, -0x00000071012014f4,ResourceBase::rtti2,92, +0x00000071012013d4,ResourceBase::rtti1,288,_ZNK4ksys3res8Resource27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012014f4,ResourceBase::rtti2,92,_ZNK4ksys3res8Resource18getRuntimeTypeInfoEv 0x0000007101201550,nullsub_5570,4, 0x0000007101201554,sub_7101201554,324, 0x0000007101201698,ResourceLoadArgBase::dtorDelete,4, diff --git a/src/KingSystem/Resource/resResource.cpp b/src/KingSystem/Resource/resResource.cpp new file mode 100644 index 00000000..af16b188 --- /dev/null +++ b/src/KingSystem/Resource/resResource.cpp @@ -0,0 +1,38 @@ +#include "KingSystem/Resource/resResource.h" + +namespace ksys::res { + +Resource::Resource() = default; + +Context* Resource::getContext() const { + return mContext; +} + +void Resource::setContext(Context* context) { + mContext = context; +} + +void Resource::onDestroy() { + onDestroy_(); +} + +void Resource::parse(Context*, sead::Heap* heap) { + parse_(mRawData, mRawSize, heap); +} + +bool Resource::m5() { + m5_(); + return true; +} + +bool Resource::finishParsing() { + const bool ret = finishParsing_(); + mContext = nullptr; + return ret; +} + +bool Resource::m7() { + return m7_(); +} + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResource.h b/src/KingSystem/Resource/resResource.h new file mode 100644 index 00000000..a678166b --- /dev/null +++ b/src/KingSystem/Resource/resResource.h @@ -0,0 +1,56 @@ +#pragma once + +#include +#include "KingSystem/Utils/Types.h" + +namespace ksys::res { + +class IResource { +public: + virtual ~IResource() = default; +}; + +class Context { +public: + virtual ~Context() = default; +}; + +class Resource : public sead::DirectResource, public IResource { + SEAD_RTTI_OVERRIDE(Resource, sead::DirectResource) +public: + Resource(); + + void doCreate_(u8* buffer, u32 bufferSize, sead::Heap* heap) override; + + virtual bool needsParse() const { return false; } + virtual bool m2_() { return true; } + + Context* getContext() const; + void setContext(Context* context); + + void onDestroy(); + void parse(Context*, sead::Heap* heap); + bool m5(); + bool finishParsing(); + bool m7(); + +protected: + virtual void onDestroy_() {} + virtual bool parse_(u8* data, size_t size, sead::Heap* heap); + virtual void m5_() {} + virtual bool finishParsing_() { return true; } + virtual bool m7_() { return true; } + virtual void m8_() {} + + u32 mAllocSize = 0; + Context* mContext = nullptr; +}; +KSYS_CHECK_SIZE_NX150(Resource, 0x38); + +inline void Resource::doCreate_(u8*, u32, sead::Heap*) {} + +inline bool Resource::parse_(u8*, size_t, sead::Heap*) { + return true; +} + +} // namespace ksys::res