From 364b825ce89c213ded8b06f27a0080b2baad1a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Thu, 8 Apr 2021 01:04:48 +0200 Subject: [PATCH] ksys/res: Start implementing ASList --- data/uking_functions.csv | 42 +++--- src/KingSystem/Resource/resResourceASList.cpp | 134 ++++++++++++++++++ src/KingSystem/Resource/resResourceASList.h | 29 ++-- 3 files changed, 176 insertions(+), 29 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 216b83bc..ee86fa85 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -91502,20 +91502,20 @@ 0x00000071011abc84,sub_71011ABC84,372, 0x00000071011abdf8,nullsub_4622,4, 0x00000071011abdfc,sub_71011ABDFC,372,_ZN4ksys3res6ASListC1Ev -0x00000071011abf70,sub_71011ABF70,668, -0x00000071011ac20c,sub_71011AC20C,8, -0x00000071011ac214,sub_71011AC214,8, -0x00000071011ac21c,sub_71011AC21C,36, -0x00000071011ac240,sub_71011AC240,40, -0x00000071011ac268,sub_71011AC268,40, -0x00000071011ac290,nullsub_4623,4, -0x00000071011ac294,nullsub_4624,4, -0x00000071011ac298,sub_71011AC298,4836, -0x00000071011ad57c,sub_71011AD57C,304, -0x00000071011ad6ac,sub_71011AD6AC,312, -0x00000071011ad7e4,sub_71011AD7E4,8, -0x00000071011ad7ec,sub_71011AD7EC,8, -0x00000071011ad7f4,sub_71011AD7F4,8, +0x00000071011abf70,sub_71011ABF70,668,_ZN4ksys3res6ASListD1Ev +0x00000071011ac20c,sub_71011AC20C,8,_ZThn632_N4ksys3res6ASListD1Ev +0x00000071011ac214,sub_71011AC214,8,_ZThn664_N4ksys3res6ASListD1Ev +0x00000071011ac21c,sub_71011AC21C,36,_ZN4ksys3res6ASListD0Ev +0x00000071011ac240,sub_71011AC240,40,_ZThn632_N4ksys3res6ASListD0Ev +0x00000071011ac268,sub_71011AC268,40,_ZThn664_N4ksys3res6ASListD0Ev +0x00000071011ac290,nullsub_4623,4,_ZN4ksys3res6ASList9doCreate_EPhjPN4sead4HeapE +0x00000071011ac294,nullsub_4624,4,_ZThn632_N4ksys3res6ASList9doCreate_EPhjPN4sead4HeapE +0x00000071011ac298,sub_71011AC298,4836,_ZN4ksys3res6ASList6parse_EPhmPN4sead4HeapE +0x00000071011ad57c,sub_71011AD57C,304,_ZN4sead6BufferIN4ksys3res6ASList6CFPostEE14tryAllocBufferEiPNS_4HeapEi +0x00000071011ad6ac,sub_71011AD6AC,312,_ZN4sead6BufferIN4ksys3res6ASList6AddResEE14tryAllocBufferEiPNS_4HeapEi +0x00000071011ad7e4,sub_71011AD7E4,8,_ZThn632_N4ksys3res6ASList6parse_EPhmPN4sead4HeapE +0x00000071011ad7ec,sub_71011AD7EC,8,_ZN4ksys3res6ASList14finishParsing_Ev +0x00000071011ad7f4,sub_71011AD7F4,8,_ZThn632_N4ksys3res6ASList14finishParsing_Ev 0x00000071011ad7fc,sub_71011AD7FC,108, 0x00000071011ad868,sub_71011AD868,108, 0x00000071011ad8d4,sub_71011AD8D4,356, @@ -91523,13 +91523,13 @@ 0x00000071011ada94,sub_71011ADA94,424, 0x00000071011adc3c,sub_71011ADC3C,424, 0x00000071011adde4,sub_71011ADDE4,1032, -0x00000071011ae1ec,sub_71011AE1EC,8, -0x00000071011ae1f4,sub_71011AE1F4,92, -0x00000071011ae250,sub_71011AE250,8, -0x00000071011ae258,sub_71011AE258,8, -0x00000071011ae260,sub_71011AE260,92, -0x00000071011ae2bc,sub_71011AE2BC,8, -0x00000071011ae2c4,sub_71011AE2C4,372, +0x00000071011ae1ec,sub_71011AE1EC,8,_ZNK4ksys3res6ASList27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071011ae1f4,sub_71011AE1F4,92,_ZNK4ksys3res6ASList18getRuntimeTypeInfoEv +0x00000071011ae250,sub_71011AE250,8,_ZNK4ksys3res6ASList10needsParseEv +0x00000071011ae258,sub_71011AE258,8,_ZThn632_NK4ksys3res6ASList27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071011ae260,sub_71011AE260,92,_ZThn632_NK4ksys3res6ASList18getRuntimeTypeInfoEv +0x00000071011ae2bc,sub_71011AE2BC,8,_ZThn632_NK4ksys3res6ASList10needsParseEv +0x00000071011ae2c4,sub_71011AE2C4,372,_ZN4ksys3res6ASList33checkDerivedRuntimeTypeInfoStaticEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071011ae438,sub_71011AE438,212, 0x00000071011ae50c,Bmodellist::ctor,596,_ZN4ksys3res9ModelListC1Ev 0x00000071011ae760,BmodellistSub::ctor,404,_ZN4ksys3res9ModelList9AttentionC2Ev diff --git a/src/KingSystem/Resource/resResourceASList.cpp b/src/KingSystem/Resource/resResourceASList.cpp index 31880bbf..45c77d41 100644 --- a/src/KingSystem/Resource/resResourceASList.cpp +++ b/src/KingSystem/Resource/resResourceASList.cpp @@ -4,4 +4,138 @@ namespace ksys::res { ASList::ASList() : ParamIO("aslist", 0) {} +ASList::~ASList() { + mASDefines.freeBuffer(); + for (auto& cf : mCFDefines) { + cf.posts.freeBuffer(); + cf.excepts.freeBuffer(); + } + mCFDefines.freeBuffer(); + mAddReses.freeBuffer(); +} + +void ASList::doCreate_(u8* buffer, u32 buffer_size, sead::Heap* heap) {} + +bool ASList::parse_(u8* data, size_t size, sead::Heap* heap) { + if (!data) + return false; + + agl::utl::ResParameterArchive archive{data}; + const auto root = archive.getRootList(); + + const auto ASDefines = agl::utl::getResParameterList(root, "ASDefines"); + auto ASDefine_name = sead::FixedSafeString<32>{"ASDefine_"}; + const auto ASDefine_prefix_len = ASDefine_name.calcLength(); + if (!ASDefines.ptr()) + return true; + const auto ASDefines_num = ASDefines.getResParameterObjNum(); + if (ASDefines_num != 0) { + if (!mASDefines.tryAllocBuffer(ASDefines_num, heap)) + return false; + for (auto it = mASDefines.begin(), end = mASDefines.end(); it != end; ++it) { + it->name.init("", "Name", "", &it->obj); + it->file_name.init("", "Filename", "", &it->obj); + it->as = nullptr; + + ASDefine_name.trim(ASDefine_prefix_len); + ASDefine_name.appendWithFormat("%d", it.getIndex()); + mASDefinesList.addObj(&it->obj, ASDefine_name); + } + addList(&mASDefinesList, "ASDefines"); + + const auto CFDefines = agl::utl::getResParameterList(root, "CFDefines"); + if (int CFDefines_num; + CFDefines.ptr() && (CFDefines_num = CFDefines.getResParameterListNum()) != 0) { + if (!mCFDefines.tryAllocBuffer(CFDefines_num, heap)) + return false; + + auto CFDefine_name = sead::FixedSafeString<32>{"CFDefine_"}; + const auto CFDefine_prefix_len = CFDefine_name.calcLength(); + + auto CFPost_name = sead::FixedSafeString<32>{"CFPost_"}; + const auto CFPost_prefix_len = CFPost_name.calcLength(); + + auto Name_name = sead::FixedSafeString<32>{"Name_"}; + const auto Name_prefix_len = Name_name.calcLength(); + + for (auto it = mCFDefines.begin(), end = mCFDefines.end(); it != end; ++it) { + CFDefine_name.trim(CFDefine_prefix_len); + CFDefine_name.appendWithFormat("%d", it.getIndex()); + mCFDefinesList.addList(&it->list, CFDefine_name); + const auto CFDefine = agl::utl::getResParameterList(CFDefines, CFDefine_name); + + const auto CFPosts = agl::utl::getResParameterList(CFDefine, "CFPosts"); + if (int num; CFPosts.ptr() && (num = CFPosts.getResParameterObjNum()) != 0) { + if (!it->posts.tryAllocBuffer(num, heap)) + return false; + for (auto post = it->posts.begin(), post_end = it->posts.end(); + post != post_end; ++post) { + post->name.init("", "Name", "", &post->obj); + post->frame.init(0, "Frame", "", &post->obj); + post->start_frame_rate.init(0, "StartFrameRate", "", &post->obj); + + CFPost_name.trim(CFPost_prefix_len); + CFPost_name.appendWithFormat("%d", post.getIndex()); + it->posts_list.addObj(&post->obj, CFPost_name); + } + } + + const auto CFExcepts = agl::utl::getResParameterObj(CFDefine, "CFExcepts"); + if (int num; CFExcepts.ptr() && (num = CFExcepts.getNum()) != 0) { + if (!it->excepts.tryAllocBuffer(num, heap)) + return false; + for (auto except = it->excepts.begin(), except_end = it->excepts.end(); + except != except_end; ++except) { + Name_name.trim(Name_prefix_len); + Name_name.appendWithFormat("%d", except.getIndex()); + except->name.init("", Name_name, "", &it->excepts_obj); + } + } + + it->name.init("", "Name", "", &it->pre_obj); + it->list.addObj(&it->pre_obj, "CFPre"); + it->list.addList(&it->posts_list, "CFPosts"); + it->list.addObj(&it->excepts_obj, "CFExcepts"); + } + + addList(&mCFDefinesList, "CFDefines"); + } + } + + const auto AddReses = agl::utl::getResParameterList(root, "AddReses"); + if (int num; AddReses.ptr() && (num = AddReses.getResParameterObjNum()) != 0) { + if (!mAddReses.tryAllocBuffer(num, heap)) + return false; + + auto AddRes_name = sead::FixedSafeString<32>{"AddRes_"}; + const auto AddRes_prefix_len = AddRes_name.calcLength(); + for (auto it = mAddReses.begin(), end = mAddReses.end(); it != end; ++it) { + it->anim.init("", "Anim", "", &it->obj); + it->retarget_model.init("", "RetargetModel", "", &it->obj); + it->retarget_no_correct.init(false, "RetargetNoCorrect", "", &it->obj); + + AddRes_name.trim(AddRes_prefix_len); + AddRes_name.appendWithFormat("%d", it.getIndex()); + mAddResesList.addObj(&it->obj, AddRes_name); + } + addList(&mAddResesList, "AddReses"); + } + + if (agl::utl::getResParameterObj(root, "Common").ptr()) { + const sead::SafeString name = "RateAll"; + const sead::SafeString label = ""; + mCommon->rate_all.init(1.0, name, label, &mCommon->obj); + addObj(&mCommon->obj, "Common"); + } else { + mCommon->rate_all = 1.0; + } + + applyResParameterArchive(agl::utl::ResParameterArchive{data}); + return true; +} + +bool ASList::finishParsing_() { + return true; +} + } // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceASList.h b/src/KingSystem/Resource/resResourceASList.h index 4d976186..49c07fdb 100644 --- a/src/KingSystem/Resource/resResourceASList.h +++ b/src/KingSystem/Resource/resResourceASList.h @@ -25,21 +25,34 @@ public: }; KSYS_CHECK_SIZE_NX150(ASDefine, 0x88); + struct CFPost { + agl::utl::Parameter name; + agl::utl::Parameter frame; + agl::utl::Parameter start_frame_rate; + agl::utl::ParameterObj obj; + }; + KSYS_CHECK_SIZE_NX150(CFPost, 0x98); + + struct CFExcept { + agl::utl::Parameter name; + }; + KSYS_CHECK_SIZE_NX150(CFExcept, 0x28); + struct CFDefine { agl::utl::Parameter name; agl::utl::ParameterObj pre_obj; - sead::Buffer posts; + sead::Buffer posts; agl::utl::ParameterList posts_list; - sead::Buffer excepts; - agl::utl::ParameterObj obj; - agl::utl::ParameterList excepts_list; + sead::Buffer excepts; + agl::utl::ParameterObj excepts_obj; + agl::utl::ParameterList list; }; KSYS_CHECK_SIZE_NX150(CFDefine, 0x138); struct AddRes { - agl::utl::Parameter _0; - agl::utl::Parameter _28; - agl::utl::Parameter _50; + agl::utl::Parameter anim; + agl::utl::Parameter retarget_model; + agl::utl::Parameter retarget_no_correct; agl::utl::ParameterObj obj; }; KSYS_CHECK_SIZE_NX150(AddRes, 0xa0); @@ -79,7 +92,7 @@ private: agl::utl::ParameterList mCFDefinesList; agl::utl::ParameterList mASDefinesList; agl::utl::ParameterList mAddResesList; - sead::StorageFor mCommon{sead::ZeroInitializeTag{}}; + sead::StorageFor mCommon{sead::ZeroInitializeTag{}}; }; KSYS_CHECK_SIZE_NX150(ASList, 0x410);