diff --git a/data/uking_functions.csv b/data/uking_functions.csv index b5c19286..c64d1bd3 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -91478,28 +91478,28 @@ 0x00000071011aac00,ResourceAiprog::m1,92,_ZThn632_NK4ksys3res9AIProgram18getRuntimeTypeInfoEv 0x00000071011aac5c,ResourceAiprog::needsParse,8,_ZThn632_NK4ksys3res9AIProgram10needsParseEv 0x00000071011aac64,sub_71011AAC64,372,_ZN4ksys3res9AIProgram33checkDerivedRuntimeTypeInfoStaticEPKN4sead15RuntimeTypeInfo9InterfaceE -0x00000071011aadd8,sub_71011AADD8,364, -0x00000071011aaf44,sub_71011AAF44,140, -0x00000071011aafd0,sub_71011AAFD0,136, -0x00000071011ab058,sub_71011AB058,144, -0x00000071011ab0e8,sub_71011AB0E8,140, -0x00000071011ab174,sub_71011AB174,136, -0x00000071011ab1fc,sub_71011AB1FC,144, -0x00000071011ab28c,nullsub_4620,4, -0x00000071011ab290,nullsub_4621,4, -0x00000071011ab294,sub_71011AB294,1992, -0x00000071011aba5c,_ZN3agl3g3d15MaterialAnimObj13GetResTextureEPN2nn3g3d15MaterialAnimObjEi,28, -0x00000071011aba78,sub_71011ABA78,8, -0x00000071011aba80,sub_71011ABA80,104, -0x00000071011abae8,sub_71011ABAE8,104, -0x00000071011abb50,sub_71011ABB50,92, -0x00000071011abbac,sub_71011ABBAC,8, -0x00000071011abbb4,sub_71011ABBB4,92, -0x00000071011abc10,sub_71011ABC10,8, -0x00000071011abc18,sub_71011ABC18,8, -0x00000071011abc20,sub_71011ABC20,92, -0x00000071011abc7c,sub_71011ABC7C,8, -0x00000071011abc84,sub_71011ABC84,372, +0x00000071011aadd8,sub_71011AADD8,364,_ZN4ksys3res2ASC1Ev +0x00000071011aaf44,sub_71011AAF44,140,_ZN4ksys3res2ASD1Ev +0x00000071011aafd0,sub_71011AAFD0,136,_ZThn632_N4ksys3res2ASD1Ev +0x00000071011ab058,sub_71011AB058,144,_ZThn664_N4ksys3res2ASD1Ev +0x00000071011ab0e8,sub_71011AB0E8,140,_ZN4ksys3res2ASD0Ev +0x00000071011ab174,sub_71011AB174,136,_ZThn632_N4ksys3res2ASD0Ev +0x00000071011ab1fc,sub_71011AB1FC,144,_ZThn664_N4ksys3res2ASD0Ev +0x00000071011ab28c,nullsub_4620,4,_ZN4ksys3res2AS9doCreate_EPhjPN4sead4HeapE +0x00000071011ab290,nullsub_4621,4,_ZThn632_N4ksys3res2AS9doCreate_EPhjPN4sead4HeapE +0x00000071011ab294,sub_71011AB294,1992,_ZN4ksys3res2AS6parse_EPhmPN4sead4HeapE? +0x00000071011aba5c,xxx,28,_ZNK4ksys3res2AS16getFirstResourceEv +0x00000071011aba78,sub_71011ABA78,8,_ZThn632_N4ksys3res2AS6parse_EPhmPN4sead4HeapE +0x00000071011aba80,sub_71011ABA80,104,_ZN4ksys3res2AS9finalize_Ev +0x00000071011abae8,sub_71011ABAE8,104,_ZThn632_N4ksys3res2AS9finalize_Ev +0x00000071011abb50,sub_71011ABB50,92,_ZNK4ksys3res2AS13getRandomRateEv +0x00000071011abbac,sub_71011ABBAC,8,_ZNK4ksys3res2AS27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071011abbb4,sub_71011ABBB4,92,_ZNK4ksys3res2AS18getRuntimeTypeInfoEv +0x00000071011abc10,sub_71011ABC10,8,_ZNK4ksys3res2AS10needsParseEv +0x00000071011abc18,sub_71011ABC18,8,_ZThn632_NK4ksys3res2AS27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071011abc20,sub_71011ABC20,92,_ZThn632_NK4ksys3res2AS18getRuntimeTypeInfoEv +0x00000071011abc7c,sub_71011ABC7C,8,_ZThn632_NK4ksys3res2AS10needsParseEv +0x00000071011abc84,sub_71011ABC84,372,_ZN4ksys3res2AS33checkDerivedRuntimeTypeInfoStaticEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071011abdf8,nullsub_4622,4, 0x00000071011abdfc,sub_71011ABDFC,372,_ZN4ksys3res6ASListC1Ev 0x00000071011abf70,sub_71011ABF70,668,_ZN4ksys3res6ASListD1Ev @@ -96502,7 +96502,7 @@ 0x00000071012ee050,sub_71012EE050,340,_ZN4ksys3res17ASBlenderResource15callOnChildren_EMNS0_10ASResourceEFivE 0x00000071012ee1a4,sub_71012EE1A4,168,_ZN4ksys3res15ASAssetResource7doParseERKNS0_10ASResource9ParseArgsE 0x00000071012ee24c,sub_71012EE24C,356,_ZN4ksys3res22ASSkeltalAssetResource7doParseERKNS0_10ASResource9ParseArgsE -0x00000071012ee3b0,sub_71012EE3B0,236,_ZN4ksys3res10ASResource4makeERKNS1_16MakeResourceArgsE +0x00000071012ee3b0,sub_71012EE3B0,236,_ZN4ksys3res10ASResource4makeERKNS1_9ParseArgsE 0x00000071012ee49c,sub_71012EE49C,204,_ZNK4ksys3res22ASResourceWithChildren27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071012ee568,sub_71012EE568,92,_ZNK4ksys3res22ASResourceWithChildren18getRuntimeTypeInfoEv 0x00000071012ee5c4,sub_71012EE5C4,20,_ZN4ksys3res22ASResourceWithChildren2m4Ev @@ -96532,17 +96532,17 @@ 0x00000071012ef0c8,sub_71012EF0C8,112,_ZN4ksys3res22ASSkeltalAssetResourceD2Ev 0x00000071012ef138,sub_71012EF138,100,_ZN4ksys3res22ASSkeltalAssetResourceD0Ev 0x00000071012ef19c,sub_71012EF19C,8, -0x00000071012ef1a4,sub_71012EF1A4,244,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_17ASBlenderResourceEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE +0x00000071012ef1a4,sub_71012EF1A4,244,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_17ASBlenderResourceEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE 0x00000071012ef298,sub_71012EF298,84, -0x00000071012ef2ec,sub_71012EF2EC,220,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_18ASSelectorResourceEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE +0x00000071012ef2ec,sub_71012EF2EC,220,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_18ASSelectorResourceEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE 0x00000071012ef3c8,sub_71012EF3C8,84, 0x00000071012ef41c,sub_71012EF41C,84, 0x00000071012ef470,sub_71012EF470,84, -0x00000071012ef4c4,sub_71012EF4C4,240,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_17ASAssetExResourceEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE +0x00000071012ef4c4,sub_71012EF4C4,240,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_17ASAssetExResourceEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE 0x00000071012ef5b4,sub_71012EF5B4,84, 0x00000071012ef608,sub_71012EF608,84, 0x00000071012ef65c,sub_71012EF65C,84, -0x00000071012ef6b0,sub_71012EF6B0,136,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_10ASResourceEEEPS3_iRKNS3_16MakeResourceArgsE +0x00000071012ef6b0,sub_71012EF6B0,136,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_10ASResourceEEEPS3_iRKNS3_9ParseArgsE 0x00000071012ef738,sub_71012EF738,84, 0x00000071012ef78c,sub_71012EF78C,84, 0x00000071012ef7e0,sub_71012EF7E0,84, @@ -96558,13 +96558,13 @@ 0x00000071012efb28,sub_71012EFB28,84, 0x00000071012efb7c,sub_71012EFB7C,84, 0x00000071012efbd0,sub_71012EFBD0,84, -0x00000071012efc24,sub_71012EFC24,208,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_31ASSequencePlayContainerResourceEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE +0x00000071012efc24,sub_71012EFC24,208,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_31ASSequencePlayContainerResourceEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE 0x00000071012efcf4,sub_71012EFCF4,84, -0x00000071012efd48,sub_71012EFD48,300,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_22ASSkeltalAssetResourceEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE +0x00000071012efd48,sub_71012EFD48,300,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_22ASSkeltalAssetResourceEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE 0x00000071012efe74,sub_71012EFE74,84, 0x00000071012efec8,sub_71012EFEC8,84, 0x00000071012eff1c,sub_71012EFF1C,84, -0x00000071012eff70,sub_71012EFF70,160,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_22ASResourceWithChildrenEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE +0x00000071012eff70,sub_71012EFF70,160,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_22ASResourceWithChildrenEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE 0x00000071012f0010,sub_71012F0010,84, 0x00000071012f0064,sub_71012F0064,84, 0x00000071012f00b8,sub_71012F00B8,84, diff --git a/src/KingSystem/Resource/resResourceAS.cpp b/src/KingSystem/Resource/resResourceAS.cpp index e4d0dbdc..53aaf594 100644 --- a/src/KingSystem/Resource/resResourceAS.cpp +++ b/src/KingSystem/Resource/resResourceAS.cpp @@ -1 +1,170 @@ #include "KingSystem/Resource/resResourceAS.h" +#include +#include +#include "KingSystem/Resource/resResourceASResource.h" +#include "KingSystem/Utils/HeapUtil.h" +#include "KingSystem/Utils/SafeDelete.h" + +namespace ksys::res { + +namespace { +sead::SafeString str_Elements = "Elements"; +sead::SafeString str_CommonParams = "CommonParams"; +} // namespace + +AS::AS() : ParamIO("as", 0) {} + +AS::~AS() = default; + +void AS::doCreate_(u8*, u32, sead::Heap*) {} + +// NON_MATCHING: SafeString vtable load is reordered +bool AS::parse_(u8* data, size_t size, sead::Heap* parent_heap) { + mHeap = util::tryCreateDualHeap(parent_heap); + if (!mHeap) + return false; + + mHeap->enableWarning(false); + auto* heap = mHeap; + + agl::utl::ResParameterArchive archive{data}; + const auto root = archive.getRootList(); + + const auto Elements = agl::utl::getResParameterList(root, str_Elements); + if (!Elements) { + mHeap->adjust(); + return true; + } + + const int num_elements = Elements.getResParameterListNum(); + if (num_elements == 0) { + mHeap->adjust(); + return true; + } + + if (!mElementResources.tryAllocBuffer(num_elements, heap)) { + mHeap->adjust(); + return false; + } + + for (int i = 0, n = mElementResources.size(); i < n; ++i) + mElementResources(i) = nullptr; + + ASResource::ParseArgs args; + args.list = {}; + args.heap = heap; + args.as = this; + args.index = 0; + + auto res_it = Elements.listBegin(); + const auto res_end = Elements.listEnd(); + + sead::FixedSafeString<16> name{"Element"}; + const auto name_prefix_len = name.calcLength(); + + for (auto it = mElementResources.begin(), end = mElementResources.end(); + it != end && res_it != res_end; ++it, ++res_it) { + args.list = res_it.getList(); + *it = ASResource::make(args); + if (*it == nullptr) { + mHeap->adjust(); + return false; + } + + name.trim(name_prefix_len); + name.appendWithFormat("%d", args.index); + mElementsList.addList(&(*it)->getList(), name); + ++args.index; + } + + addList(&mElementsList, str_Elements); + + mRandomRateMin.init(1.0, "RandomRateMin", "ランダム再生率小", "Min=0.f,Max=10.f", + &mCommonParams); + mRandomRateMax.init(1.0, "RandomRateMax", "ランダム再生率大", "Min=0.f,Max=10.f", + &mCommonParams); + mForbidPartialDemoAS.init(false, "ForbidPartialDemoAS", "一括再生する", "", &mCommonParams); + mUseIK.init(true, "UseIK", "IKする", "", &mCommonParams); + + addObj(&mCommonParams, str_CommonParams); + + _3bb = 0; + + res_it = Elements.listBegin(); + args.index = 0; + for (auto it = mElementResources.begin(), end = mElementResources.end(); + it != end && res_it != res_end; ++it, ++res_it) { + args.list = res_it.getList(); + if (!(*it)->parse(args)) { + mHeap->adjust(); + return false; + } + + _3ba |= (*it)->m7() & 1; + + switch ((*it)->getTypeIndex()) { + case 62: + _3bb |= 1 << 0; + break; + case 63: + _3bb |= 1 << 1; + break; + case 64: + _3bb |= 1 << 2; + break; + case 83: + _3bb |= 1 << 3; + break; + case 6: + _3bb |= 1 << 4; + break; + case 39: + _3bb |= 1 << 5; + break; + } + ++args.index; + } + + applyResParameterArchive(archive); + + if (auto* first = getFirstResource()) { + u32 x = first->m4(); + x = x >= 0xff ? 0xff : x; + u32 y = first->m5(); + y = y >= 0xff ? 0xff : y; + + _3b8 = x; + _3b9 = y; + } else { + _3b8 = 0; + _3b9 = 0; + } + + mHeap->adjust(); + return true; +} + +ASResource* AS::getFirstResource() const { + if (mElementResources.size() == 0) + return nullptr; + return mElementResources[0]; +} + +void AS::finalize_() { + for (auto* ptr : mElementResources) { + if (ptr) + std::destroy_at(ptr); + } + + util::safeDeleteHeap(mHeap); +} + +float AS::getRandomRate() const { + const auto max = getRandomRateMax(); + const auto min = getRandomRateMin(); + if (max - min > 0.0) + return sead::GlobalRandom::instance()->getF32Range(min, max); + return min; +} + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceAS.h b/src/KingSystem/Resource/resResourceAS.h index 91853282..14a6b1e4 100644 --- a/src/KingSystem/Resource/resResourceAS.h +++ b/src/KingSystem/Resource/resResourceAS.h @@ -16,8 +16,11 @@ class AS : public ParamIO, public Resource { SEAD_RTTI_OVERRIDE(AS, Resource) public: AS(); + ~AS() override; + AS(const AS&) = delete; + auto operator=(const AS&) = delete; - void doCreate_(u8*, u32, sead::Heap*) override {} + void doCreate_(u8*, u32, sead::Heap*) override; bool needsParse() const override { return true; } bool parse_(u8* data, size_t size, sead::Heap* heap) override; void finalize_() override; @@ -28,6 +31,9 @@ public: const auto& getForbidPartialDemoAs() const { return *mForbidPartialDemoAS; } const auto& getUseIk() const { return *mUseIK; } + ASResource* getFirstResource() const; + float getRandomRate() const; + private: friend class ASList; diff --git a/src/KingSystem/Resource/resResourceASResource.cpp b/src/KingSystem/Resource/resResourceASResource.cpp index 92db7010..e7b348db 100644 --- a/src/KingSystem/Resource/resResourceASResource.cpp +++ b/src/KingSystem/Resource/resResourceASResource.cpp @@ -13,7 +13,7 @@ namespace { struct ASElementFactory { const char* name; - ASResource* (*make_res)(int type_index, const ASResource::MakeResourceArgs& args); + ASResource* (*make_res)(int type_index, const ASResource::ParseArgs& args); // FIXME: signature as::Element* (*make)(); /// Arbitrary value that is passed to the Element class @@ -23,7 +23,7 @@ struct ASElementFactory { sead::SafeString sStr_default = "default"; template -ASResource* resFactoryImpl_(int type_index, const ASResource::MakeResourceArgs& arg) { +ASResource* resFactoryImpl_(int type_index, const ASResource::ParseArgs& arg) { return new (arg.heap) T(type_index, arg.index); } @@ -358,7 +358,7 @@ bool ASSkeltalAssetResource::doParse(const ASResource::ParseArgs& args) { return true; } -ASResource* ASResource::make(const ASResource::MakeResourceArgs& args) { +ASResource* ASResource::make(const ASResource::ParseArgs& args) { const auto Parameters = agl::utl::getResParameterObj(args.list, "Parameters"); const auto TypeIndex = agl::utl::getResParameter(Parameters, "TypeIndex"); diff --git a/src/KingSystem/Resource/resResourceASResource.h b/src/KingSystem/Resource/resResourceASResource.h index d3b37f44..167fbe01 100644 --- a/src/KingSystem/Resource/resResourceASResource.h +++ b/src/KingSystem/Resource/resResourceASResource.h @@ -17,12 +17,6 @@ public: agl::utl::ResParameterList list; sead::Heap* heap; AS* as; - }; - - struct MakeResourceArgs { - agl::utl::ResParameterList list; - sead::Heap* heap; - void* x; int index; }; @@ -37,18 +31,20 @@ public: virtual int m7() { return 0; } static const sead::SafeString& getDefaultStr(); - static ASResource* make(const MakeResourceArgs& args); + static ASResource* make(const ParseArgs& args); - s16 getTypeIndex() const { return mTypeIndex; } - s16 getIndex() const { return mIndex; } + u16 getTypeIndex() const { return mTypeIndex; } + u16 getIndex() const { return mIndex; } int findStringIndex(const sead::SafeString& value) const; int findIntIndex(int value) const; + agl::utl::ParameterList& getList() { return mList; } + protected: virtual bool doParse(const ParseArgs& args) { return true; } - s16 mTypeIndex{}; - s16 mIndex{}; + u16 mTypeIndex{}; + u16 mIndex{}; agl::utl::ParameterList mList; ASExtensions mExtensions; };