diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 1cd24582..569d39e1 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -73684,13 +73684,13 @@ 0x0000007100d3c7fc,sub_7100D3C7FC,56, 0x0000007100d3c834,sub_7100D3C834,64, 0x0000007100d3c874,sub_7100D3C874,52, -0x0000007100d3c8a8,sub_7100D3C8A8,100, -0x0000007100d3c90c,sub_7100D3C90C,108, -0x0000007100d3c978,ModelResourceDivide::createInstance,156, -0x0000007100d3ca14,sub_7100D3CA14,60, -0x0000007100d3ca50,sub_7100D3CA50,68, -0x0000007100d3ca94,ModelResourceDivide::init,296, -0x0000007100d3cbbc,ModelResourceDivide::__auto0,440, +0x0000007100d3c8a8,sub_7100D3C8A8,100,_ZN4ksys3res19ModelResourceDivide18SingletonDisposer_D1Ev +0x0000007100d3c90c,sub_7100D3C90C,108,_ZN4ksys3res19ModelResourceDivide18SingletonDisposer_D0Ev +0x0000007100d3c978,ModelResourceDivide::createInstance,156,_ZN4ksys3res19ModelResourceDivide14createInstanceEPN4sead4HeapE +0x0000007100d3ca14,sub_7100D3CA14,60,_ZN4ksys3res19ModelResourceDivideD1Ev +0x0000007100d3ca50,sub_7100D3CA50,68,_ZN4ksys3res19ModelResourceDivideD0Ev +0x0000007100d3ca94,ModelResourceDivide::init,296,_ZN4ksys3res19ModelResourceDivide4initEPN4sead4HeapE +0x0000007100d3cbbc,ModelResourceDivide::getModelResource,440,_ZNK4ksys3res19ModelResourceDivide16getModelResourceERKN4sead14SafeStringBaseIcEES6_ 0x0000007100d3cd74,sub_7100D3CD74,16, 0x0000007100d3cd84,sub_7100D3CD84,172, 0x0000007100d3ce30,sub_7100D3CE30,168, diff --git a/src/KingSystem/ActorSystem/actDebug.h b/src/KingSystem/ActorSystem/actDebug.h index 8e7b10d8..d51ea28a 100644 --- a/src/KingSystem/ActorSystem/actDebug.h +++ b/src/KingSystem/ActorSystem/actDebug.h @@ -14,6 +14,7 @@ class ActorDebug { public: enum class Flag { _10000000 = 0x10000000, + _20000000 = 0x20000000, }; struct HashUnused { diff --git a/src/KingSystem/Resource/resModelResourceDivide.cpp b/src/KingSystem/Resource/resModelResourceDivide.cpp index 772fac7f..b1c446d3 100644 --- a/src/KingSystem/Resource/resModelResourceDivide.cpp +++ b/src/KingSystem/Resource/resModelResourceDivide.cpp @@ -1,7 +1,60 @@ #include "KingSystem/Resource/resModelResourceDivide.h" +#include "KingSystem/ActorSystem/actDebug.h" +#include "KingSystem/Resource/resLoadRequest.h" +#include "KingSystem/Resource/resResourceMgrTask.h" +#include "KingSystem/Utils/Byaml/Byaml.h" namespace ksys::res { SEAD_SINGLETON_DISPOSER_IMPL(ModelResourceDivide) +ModelResourceDivide::~ModelResourceDivide() { + if (mIter) + delete mIter; +} + +void ModelResourceDivide::init(sead::Heap* heap) { + auto load_request = LoadRequest(); + load_request.mRequester = "ModelResourceDivide"; + load_request.mLoadCompressed = true; + mHandle.load("System/Resource/ModelDivideTable.byml", &load_request); + sead::DirectResource* table = mHandle.getResource(); + auto* cast_table = sead::DynamicCast(table); + mIter = new (heap) al::ByamlIter(cast_table->getRawData()); +} + +const char* ModelResourceDivide::getModelResource(const sead::SafeString& model_name, + const sead::SafeString& fmdb_name) const { + auto* debug = act::ActorDebug::instance(); + if (debug && !debug->hasFlag(act::ActorDebug::Flag::_20000000)) + return nullptr; + + sead::FormatFixedSafeString<128> model_path("Model/%s.bfres", model_name.cstr()); + if (ResourceMgrTask::instance()->isHostPath(model_path)) + return nullptr; + + al::ByamlIter model_iter{}; + if (!mIter->tryGetIterByKey(&model_iter, model_name.cstr())) + return nullptr; + + sead::FormatFixedSafeString<128> fmdb_file_name("%s.fmdb", fmdb_name.cstr()); + + for (int i = 0; i < model_iter.getSize(); ++i) { + al::ByamlIter index_iter; + if (!model_iter.tryGetIterByIndex(&index_iter, i)) + break; + al::ByamlIter models_iter; + if (!index_iter.tryGetIterByKey(&models_iter, "models")) + break; + al::ByamlIter fmdb_iter; + const char* value; + if (models_iter.tryGetIterByKey(&fmdb_iter, fmdb_file_name.cstr())) { + if (index_iter.tryGetStringByKey(&value, "model_resource")) + return value; + return nullptr; + } + } + return nullptr; +} + } // namespace ksys::res