diff --git a/data/uking_functions.csv b/data/uking_functions.csv index bd06e313..c4318f1d 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -90944,10 +90944,10 @@ 0x00000071011675d0,sub_71011675D0,240,_ZThn664_N4ksys3res9ActorLinkD1Ev 0x00000071011676c0,sub_71011676C0,228,_ZThn664_N4ksys3res9ActorLinkD0Ev 0x00000071011677a4,sub_71011677A4,372,_ZN4ksys3res9ActorLink33checkDerivedRuntimeTypeInfoStaticEPKN4sead15RuntimeTypeInfo9InterfaceE -0x0000007101167918,sub_7101167918,548, -0x0000007101167b3c,sub_7101167B3C,316, -0x0000007101167c78,sub_7101167C78,328, -0x0000007101167dc0,sub_7101167DC0,76, +0x0000007101167918,sub_7101167918,548,_ZN4ksys7ParamIO14applyParameterEPcS1_PN3agl3utl13ParameterBaseERKN4sead14SafeStringBaseIcEEPb +0x0000007101167b3c,sub_7101167B3C,316,_ZN4ksys7ParamIO17applyParameterObjEPcS1_PN3agl3utl13IParameterObjERKN4sead14SafeStringBaseIcEEPb +0x0000007101167c78,sub_7101167C78,328,_ZN4ksys7ParamIO18applyParameterListEPcS1_PN3agl3utl14IParameterListERKN4sead14SafeStringBaseIcEEPb +0x0000007101167dc0,sub_7101167DC0,76,_ZN4ksys7ParamIO19applyResourceUpdateEPcS1_ 0x0000007101167e0c,sub_7101167E0C,124,_ZNK4ksys7ParamIO9getStringERKN3agl3utl15ResParameterObjEPKcS7_Pv 0x0000007101167e88,sub_7101167E88,140,_ZNK4ksys7ParamIO7getVec3ERKN3agl3utl15ResParameterObjEPKcN4sead7Vector3IfEEPv? 0x0000007101167f14,sub_7101167F14,152,_ZN4ksys3act13ActorParamMgr18SingletonDisposer_D2Ev diff --git a/lib/agl b/lib/agl index 1ee52998..b1a372a1 160000 --- a/lib/agl +++ b/lib/agl @@ -1 +1 @@ -Subproject commit 1ee52998fa0ca6d4c2ada8bef6dfd70aa2e63cbe +Subproject commit b1a372a1300566e221f2c739bc4348ed1b7c1f4b diff --git a/src/KingSystem/Utils/ParamIO.cpp b/src/KingSystem/Utils/ParamIO.cpp index de9d0bc5..89ae6e19 100644 --- a/src/KingSystem/Utils/ParamIO.cpp +++ b/src/KingSystem/Utils/ParamIO.cpp @@ -1,8 +1,65 @@ #include "KingSystem/Utils/ParamIO.h" #include +#include "KingSystem/ActorSystem/actActorParamMgr.h" namespace ksys { +void ParamIO::applyParameter(char* data, char* data1, agl::utl::ParameterBase* param, + const sead::SafeString& parent_name, bool* applied) { + sead::FixedSafeString<128> name; + name.format("%s/%s", parent_name.cstr(), param->getName().cstr()); + if (name != data) + return; + + if (param->getParameterType() == agl::utl::ParameterBase::ParameterType::StringRef) { + auto* heap = act::ActorParamMgr::instance()->getDebugHeap(); + const auto len = sead::SafeString(data1).calcLength(); + auto* copy = new (heap) char[len + 1]; + std::memcpy(copy, data1, len); + data1 = copy; + data1[len] = '\0'; + } + + param->applyString(data1, false); + *applied = true; +} + +void ParamIO::applyParameterObj(char* data, char* data1, agl::utl::IParameterObj* obj, + const sead::SafeString& parent_name, bool* applied) { + sead::FixedSafeString<128> name; + name.format("%s/%s", parent_name.cstr(), obj->getName().cstr()); + + if (obj->getNext()) + applyParameterObj(data, data1, obj->getNext(), parent_name, applied); + + for (auto param = obj->getParamListHead(); param; param = param->getNext()) { + applyParameter(data, data1, param, name, applied); + if (param == obj->getParamListTail()) + break; + } +} + +void ParamIO::applyParameterList(char* data, char* data1, agl::utl::IParameterList* list, + const sead::SafeString& parent_name, bool* applied) { + sead::FixedSafeString<128> name; + name.format("%s/%s", parent_name.cstr(), list->getName().cstr()); + + if (auto* obj = list->getChildObjHead()) + applyParameterObj(data, data1, obj, name, applied); + + if (auto* next = list->getNext()) + applyParameterList(data, data1, next, parent_name, applied); + + if (auto* child = list->getChildListHead()) + applyParameterList(data, data1, child, name, applied); +} + +bool ParamIO::applyResourceUpdate(char* data, char* data1) { + bool applied = false; + applyParameterList(data, data1, this, "", &applied); + return applied; +} + const char* ParamIO::getString(const agl::utl::ResParameterObj& obj, const char* key, const char* default_value, void*) const { const auto param = agl::utl::getResParameter(obj, key); diff --git a/src/KingSystem/Utils/ParamIO.h b/src/KingSystem/Utils/ParamIO.h index b960f18f..1cb6b0eb 100644 --- a/src/KingSystem/Utils/ParamIO.h +++ b/src/KingSystem/Utils/ParamIO.h @@ -14,7 +14,7 @@ public: virtual bool ParamIO_m0() { return false; } - bool applyResourceUpdate(const char* data, const char* data1); + bool applyResourceUpdate(char* data, char* data1); const char* getString(const agl::utl::ResParameterObj& obj, const char* key, const char* default_value, void* = nullptr) const; @@ -27,6 +27,13 @@ public: void setIndex(u32 idx) { mIdx = idx; } protected: + void applyParameter(char* data, char* data1, agl::utl::ParameterBase* param, + const sead::SafeString& parent_name, bool* applied); + void applyParameterObj(char* data, char* data1, agl::utl::IParameterObj* obj, + const sead::SafeString& parent_name, bool* applied); + void applyParameterList(char* data, char* data1, agl::utl::IParameterList* list, + const sead::SafeString& parent_name, bool* applied); + u32 mIdx = 0x1c; sead::FixedSafeString<128> mPath; };