From 9846d6fef9ede738532f16149d7d33c13248426d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Sat, 10 Apr 2021 22:14:51 +0200 Subject: [PATCH] ksys/res: Implement remaining AS param parser classes --- data/uking_functions.csv | 104 ++++---- .../Resource/resResourceASResource.cpp | 239 ++++++++++++++++++ .../Resource/resResourceASResource.h | 220 +++++++++++++++- .../Resource/resResourceASSetting.h | 1 + 4 files changed, 511 insertions(+), 53 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 16680dec..15580b80 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -90766,7 +90766,7 @@ 0x00000071011611c4,nullsub_4590,4, 0x00000071011611c8,nullsub_4591,4, 0x00000071011611cc,nullsub_4592,4, -0x00000071011611d0,sub_71011611D0,140, +0x00000071011611d0,sub_71011611D0,140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys3res13ASParamParserEE9isDerivedEPKNS0_9InterfaceE 0x000000710116125c,sub_710116125C,140, 0x00000071011612e8,sub_71011612E8,140, 0x0000007101161374,sub_7101161374,140, @@ -96583,18 +96583,18 @@ 0x00000071012f0578,sub_71012F0578,100, 0x00000071012f05dc,sub_71012F05DC,88, 0x00000071012f0634,sub_71012F0634,8, -0x00000071012f063c,sub_71012F063C,708, -0x00000071012f0900,sub_71012F0900,1036, -0x00000071012f0d0c,sub_71012F0D0C,952, -0x00000071012f10c4,sub_71012F10C4,308, -0x00000071012f11f8,sub_71012F11F8,796, -0x00000071012f1514,sub_71012F1514,852, -0x00000071012f1868,sub_71012F1868,756, -0x00000071012f1b5c,sub_71012F1B5C,756, -0x00000071012f1e50,sub_71012F1E50,168, +0x00000071012f063c,sub_71012F063C,708,_ZN4ksys3res17ASFrameCtrlParser5parseERKNS0_13ASParamParser9ParseArgsE +0x00000071012f0900,sub_71012F0900,1036,_ZN4ksys3res21ASTriggerEventsParser5parseERKNS0_13ASParamParser9ParseArgsE +0x00000071012f0d0c,sub_71012F0D0C,952,_ZN4ksys3res18ASHoldEventsParser5parseERKNS0_13ASParamParser9ParseArgsE +0x00000071012f10c4,sub_71012F10C4,308,_ZN4sead6BufferIN4ksys3res18ASHoldEventsParser5EventEE14tryAllocBufferEiPNS_4HeapEi +0x00000071012f11f8,sub_71012F11F8,796,_ZN4ksys3res19ASStringArrayParser5parseERKNS0_13ASParamParser9ParseArgsE +0x00000071012f1514,sub_71012F1514,852,_ZN4ksys3res14ASRangesParser5parseERKNS0_13ASParamParser9ParseArgsE +0x00000071012f1868,sub_71012F1868,756,_ZN4ksys3res18ASFloatArrayParser5parseERKNS0_13ASParamParser9ParseArgsE +0x00000071012f1b5c,sub_71012F1B5C,756,_ZN4ksys3res16ASIntArrayParser5parseERKNS0_13ASParamParser9ParseArgsE +0x00000071012f1e50,sub_71012F1E50,168,_ZN4ksys3res16ASBitIndexParser5parseERKNS0_13ASParamParser9ParseArgsE 0x00000071012f1ef8,sub_71012F1EF8,896,_ZN4ksys3res9ASSetting10BoneParams5parseERKNS0_13ASParamParser9ParseArgsE 0x00000071012f2278,sub_71012F2278,300,_ZNK4ksys3res9ASSetting10BoneParams13getBoneWeightERKN4sead14SafeStringBaseIcEE -0x00000071012f23a4,sub_71012F23A4,132, +0x00000071012f23a4,sub_71012F23A4,132,_ZN4ksys3res12ASExtensionsD1Ev 0x00000071012f2428,sub_71012F2428,508, 0x00000071012f2624,sub_71012F2624,636, 0x00000071012f28a0,sub_71012F28A0,428,_ZNK4ksys3act9ASSetting13getBoneParamsERKN4sead14SafeStringBaseIcEE? @@ -96616,38 +96616,38 @@ 0x00000071012f33d4,ASSetting::createInstance,152,_ZN4ksys3act9ASSetting14createInstanceEPN4sead4HeapE 0x00000071012f346c,sub_71012F346C,88,_ZN4ksys3act9ASSetting14deleteInstanceEv 0x00000071012f34c4,ASSetting::init,132,_ZN4ksys3act9ASSetting4initERKN4sead14SafeStringBaseIcEE -0x00000071012f3548,sub_71012F3548,204, -0x00000071012f3614,sub_71012F3614,92, -0x00000071012f3670,sub_71012F3670,104, -0x00000071012f36d8,j__ZdlPv_1319,4, -0x00000071012f36dc,sub_71012F36DC,204, -0x00000071012f37a8,sub_71012F37A8,92, -0x00000071012f3804,sub_71012F3804,288, -0x00000071012f3924,sub_71012F3924,252, -0x00000071012f3a20,sub_71012F3A20,204, -0x00000071012f3aec,sub_71012F3AEC,92, -0x00000071012f3b48,sub_71012F3B48,168, -0x00000071012f3bf0,sub_71012F3BF0,132, -0x00000071012f3c74,sub_71012F3C74,204, -0x00000071012f3d40,sub_71012F3D40,92, -0x00000071012f3d9c,sub_71012F3D9C,160, -0x00000071012f3e3c,sub_71012F3E3C,108, -0x00000071012f3ea8,sub_71012F3EA8,204, -0x00000071012f3f74,sub_71012F3F74,92, -0x00000071012f3fd0,sub_71012F3FD0,164, -0x00000071012f4074,sub_71012F4074,128, -0x00000071012f40f4,sub_71012F40F4,204, -0x00000071012f41c0,sub_71012F41C0,92, -0x00000071012f421c,sub_71012F421C,240, -0x00000071012f430c,sub_71012F430C,188, -0x00000071012f43c8,sub_71012F43C8,204, -0x00000071012f4494,sub_71012F4494,92, -0x00000071012f44f0,sub_71012F44F0,240, -0x00000071012f45e0,sub_71012F45E0,188, -0x00000071012f469c,sub_71012F469C,204, -0x00000071012f4768,sub_71012F4768,92, +0x00000071012f3548,sub_71012F3548,204,_ZNK4ksys3res17ASFrameCtrlParser27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f3614,sub_71012F3614,92,_ZNK4ksys3res17ASFrameCtrlParser18getRuntimeTypeInfoEv +0x00000071012f3670,sub_71012F3670,104,_ZN4ksys3res17ASFrameCtrlParserD2Ev +0x00000071012f36d8,j__ZdlPv_1319,4,_ZN4ksys3res17ASFrameCtrlParserD0Ev +0x00000071012f36dc,sub_71012F36DC,204,_ZNK4ksys3res21ASTriggerEventsParser27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f37a8,sub_71012F37A8,92,_ZNK4ksys3res21ASTriggerEventsParser18getRuntimeTypeInfoEv +0x00000071012f3804,sub_71012F3804,288,_ZN4ksys3res21ASTriggerEventsParserD2Ev +0x00000071012f3924,sub_71012F3924,252,_ZN4ksys3res21ASTriggerEventsParserD0Ev +0x00000071012f3a20,sub_71012F3A20,204,_ZNK4ksys3res18ASHoldEventsParser27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f3aec,sub_71012F3AEC,92,_ZNK4ksys3res18ASHoldEventsParser18getRuntimeTypeInfoEv +0x00000071012f3b48,sub_71012F3B48,168,_ZN4ksys3res18ASHoldEventsParserD2Ev +0x00000071012f3bf0,sub_71012F3BF0,132,_ZN4ksys3res18ASHoldEventsParserD0Ev +0x00000071012f3c74,sub_71012F3C74,204,_ZNK4ksys3res19ASStringArrayParser27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f3d40,sub_71012F3D40,92,_ZNK4ksys3res19ASStringArrayParser18getRuntimeTypeInfoEv +0x00000071012f3d9c,sub_71012F3D9C,160,_ZN4ksys3res19ASStringArrayParserD2Ev +0x00000071012f3e3c,sub_71012F3E3C,108,_ZN4ksys3res19ASStringArrayParserD0Ev +0x00000071012f3ea8,sub_71012F3EA8,204,_ZNK4ksys3res14ASRangesParser27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f3f74,sub_71012F3F74,92,_ZNK4ksys3res14ASRangesParser18getRuntimeTypeInfoEv +0x00000071012f3fd0,sub_71012F3FD0,164,_ZN4ksys3res14ASRangesParserD2Ev +0x00000071012f4074,sub_71012F4074,128,_ZN4ksys3res14ASRangesParserD0Ev +0x00000071012f40f4,sub_71012F40F4,204,_ZNK4ksys3res18ASFloatArrayParser27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f41c0,sub_71012F41C0,92,_ZNK4ksys3res18ASFloatArrayParser18getRuntimeTypeInfoEv +0x00000071012f421c,sub_71012F421C,240,_ZN4ksys3res18ASFloatArrayParserD2Ev +0x00000071012f430c,sub_71012F430C,188,_ZN4ksys3res18ASFloatArrayParserD0Ev +0x00000071012f43c8,sub_71012F43C8,204,_ZNK4ksys3res16ASIntArrayParser27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f4494,sub_71012F4494,92,_ZNK4ksys3res16ASIntArrayParser18getRuntimeTypeInfoEv +0x00000071012f44f0,sub_71012F44F0,240,_ZN4ksys3res16ASIntArrayParserD2Ev +0x00000071012f45e0,sub_71012F45E0,188,_ZN4ksys3res16ASIntArrayParserD0Ev +0x00000071012f469c,sub_71012F469C,204,_ZNK4ksys3res16ASBitIndexParser27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012f4768,sub_71012F4768,92,_ZNK4ksys3res16ASBitIndexParser18getRuntimeTypeInfoEv 0x00000071012f47c4,sub_71012F47C4,36,_ZN4ksys3res13ASParamParserD2Ev -0x00000071012f47e8,j__ZdlPv_1320,4, +0x00000071012f47e8,j__ZdlPv_1320,4,_ZN4ksys3res16ASBitIndexParserD0Ev 0x00000071012f47ec,sub_71012F47EC,204,_ZNK4ksys3res9ASSetting10BoneParams27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071012f48b8,sub_71012F48B8,92,_ZNK4ksys3res9ASSetting10BoneParams18getRuntimeTypeInfoEv 0x00000071012f4914,sub_71012F4914,164,_ZN4ksys3res9ASSetting10BoneParamsD1Ev @@ -96660,16 +96660,16 @@ 0x00000071012f4b08,sub_71012F4B08,8,_ZThn464_NK4ksys3res9ASSetting10needsParseEv 0x00000071012f4b10,sub_71012F4B10,20,_ZN4ksys3act9ASSettingD1Ev 0x00000071012f4b24,sub_71012F4B24,52,_ZN4ksys3act9ASSettingD0Ev -0x00000071012f4b58,sub_71012F4B58,56, -0x00000071012f4b90,sub_71012F4B90,124, -0x00000071012f4c0c,sub_71012F4C0C,124, -0x00000071012f4c88,sub_71012F4C88,148, -0x00000071012f4d1c,sub_71012F4D1C,124, -0x00000071012f4d98,sub_71012F4D98,148, -0x00000071012f4e2c,sub_71012F4E2C,148, -0x00000071012f4ec0,sub_71012F4EC0,124, -0x00000071012f4f3c,sub_71012F4F3C,8, -0x00000071012f4f44,sub_71012F4F44,268, +0x00000071012f4b58,sub_71012F4B58,56,_ZN4ksys3resL12factoryImpl_INS0_17ASFrameCtrlParserEEEPNS0_13ASParamParserEPN4sead4HeapE +0x00000071012f4b90,sub_71012F4B90,124,_ZN4ksys3resL12factoryImpl_INS0_21ASTriggerEventsParserEEEPNS0_13ASParamParserEPN4sead4HeapE +0x00000071012f4c0c,sub_71012F4C0C,124,_ZN4ksys3resL12factoryImpl_INS0_18ASHoldEventsParserEEEPNS0_13ASParamParserEPN4sead4HeapE +0x00000071012f4c88,sub_71012F4C88,148,_ZN4ksys3resL12factoryImpl_INS0_19ASStringArrayParserEEEPNS0_13ASParamParserEPN4sead4HeapE +0x00000071012f4d1c,sub_71012F4D1C,124,_ZN4ksys3resL12factoryImpl_INS0_14ASRangesParserEEEPNS0_13ASParamParserEPN4sead4HeapE +0x00000071012f4d98,sub_71012F4D98,148,_ZN4ksys3resL12factoryImpl_INS0_18ASFloatArrayParserEEEPNS0_13ASParamParserEPN4sead4HeapE +0x00000071012f4e2c,sub_71012F4E2C,148,_ZN4ksys3resL12factoryImpl_INS0_16ASIntArrayParserEEEPNS0_13ASParamParserEPN4sead4HeapE +0x00000071012f4ec0,sub_71012F4EC0,124,_ZN4ksys3resL12factoryImpl_INS0_16ASBitIndexParserEEEPNS0_13ASParamParserEPN4sead4HeapE +0x00000071012f4f3c,sub_71012F4F3C,8,_ZN4ksys3resL25dummyASParserFactoryImpl_EPN4sead4HeapE +0x00000071012f4f44,sub_71012F4F44,268,_ZN4ksys3res17ASFrameCtrlParserC2Ev 0x00000071012f5050,sub_71012F5050,112,_ZNK4ksys3res13ASParamParser27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071012f50c0,sub_71012F50C0,92,_ZNK4ksys3res13ASParamParser18getRuntimeTypeInfoEv 0x00000071012f511c,j__ZdlPv_1321,4,_ZN4ksys3res13ASParamParserD0Ev diff --git a/src/KingSystem/Resource/resResourceASResource.cpp b/src/KingSystem/Resource/resResourceASResource.cpp index fb2f4bec..0025bfe1 100644 --- a/src/KingSystem/Resource/resResourceASResource.cpp +++ b/src/KingSystem/Resource/resResourceASResource.cpp @@ -1 +1,240 @@ #include "KingSystem/Resource/resResourceASResource.h" +#include + +namespace ksys::res { + +bool ASFrameCtrlParser::parse(const ASParamParser::ParseArgs& args) { + mRate.init(1.0, "Rate", "再生速度", "Min=0.f,Max=10.f", &mObj); + mStartFrame.init(0.0, "StartFrame", "開始フレーム", "Min=0.f,Max=100.f", &mObj); + mEndFrame.init(-1.0, "EndFrame", "終了フレーム", "Min=-1.f,Max=100.f", &mObj); + mLoopStopCount.init(-1.0, "LoopStopCount", "ループ停止回数", "Min=-1.f,Max=10.f", &mObj); + mLoopStopCountRandom.init(0.0, "LoopStopCountRandom", "ランダムループ追加回数", + "Min=0.f,Max=10.f", &mObj); + mReversePlay.init(false, "ReversePlay", "逆再生", "", &mObj); + mUseGlobalFrame.init(false, "UseGlobalFrame", "グローバルフレーム使う", "", &mObj); + mFootType.init(0, "FootType", "足解決", "", &mObj); + mConnect.init(false, "Connect", "接続", "", &mObj); + mAnmLoop.init(0, "AnmLoop", "ループ設定", "", &mObj); + + mList.addObj(&mObj, "FrameCtrl0"); + return true; +} + +bool ASTriggerEventsParser::parse(const ASParamParser::ParseArgs& args) { + const int num_objs = args.res_list.getResParameterObjNum(); + if (num_objs == 0) + return true; + + if (!mEvents.tryAllocBuffer(num_objs, args.heap)) + return false; + + auto it = mEvents.begin(); + const auto end = mEvents.end(); + + sead::FixedSafeString<32> obj_name{"Event"}; + const auto obj_name_prefix_len = obj_name.calcLength(); + + auto res_it = args.res_list.objBegin(); + const auto res_end = args.res_list.objEnd(); + + while (res_it != res_end && it != end) { + u32 type_index = -1; + const auto TypeIndex = agl::utl::getResParameter(res_it.getObj(), "TypeIndex"); + if (TypeIndex.ptr()) + type_index = *TypeIndex.getData(); + + // TODO: add a TypeIndex enum + it->type_index = type_index > 33 ? 88 : int(type_index) + 54; + + it->frame.init(0.0, "Frame", "フレーム", "Min=0.f,Max=100.f", &it->obj); + it->value.init("", "Value", "値", "", &it->obj); + + obj_name.trim(obj_name_prefix_len); + obj_name.appendWithFormat("%d", it.getIndex()); + mList.addObj(&it->obj, obj_name); + + ++res_it; + ++it; + } + + return true; +} + +bool ASHoldEventsParser::parse(const ASParamParser::ParseArgs& args) { + const int num_objs = args.res_list.getResParameterObjNum(); + if (num_objs == 0) + return true; + + if (!mEvents.tryAllocBuffer(num_objs, args.heap)) + return false; + + auto it = mEvents.begin(); + const auto end = mEvents.end(); + + sead::FixedSafeString<32> obj_name{"Event"}; + const auto obj_name_prefix_len = obj_name.calcLength(); + + auto res_it = args.res_list.objBegin(); + const auto res_end = args.res_list.objEnd(); + + while (res_it != res_end && it != end) { + u32 type_index = -1; + const auto TypeIndex = agl::utl::getResParameter(res_it.getObj(), "TypeIndex"); + if (TypeIndex.ptr()) + type_index = *TypeIndex.getData(); + + // TODO: add a TypeIndex enum + it->type_index = type_index > 53 ? 88 : int(type_index); + + it->start_frame.init(0.0, "StartFrame", "開始フレーム", "Min=0.f,Max=100.f", &it->obj); + it->end_frame.init(0.0, "EndFrame", "終了フレーム", "Min=0.f,Max=100.f", &it->obj); + it->value.init("", "Value", "値", "", &it->obj); + + obj_name.trim(obj_name_prefix_len); + obj_name.appendWithFormat("%d", it.getIndex()); + mList.addObj(&it->obj, obj_name); + + ++res_it; + ++it; + } + + return true; +} + +bool ASStringArrayParser::parse(const ASParamParser::ParseArgs& args) { + const int size = args.res_list.getResParameterObj(0).getNum(); + if (size != 0) { + if (!mValues.tryAllocBuffer(size, args.heap)) + return false; + + sead::FixedSafeString<32> param_name{"Value"}; + const auto param_name_prefix_len = param_name.calcLength(); + + for (int i = 0; i < size; ++i) { + param_name.trim(param_name_prefix_len); + param_name.appendWithFormat("%d", i); + mValues[i].value.init("", param_name, "値", "", &mObj); + } + } + + mList.addObj(&mObj, "StringArray0"); + return true; +} + +bool ASRangesParser::parse(const ASParamParser::ParseArgs& args) { + const int num_objs = args.res_list.getResParameterObjNum(); + if (num_objs == 0) + return true; + + if (!mRanges.tryAllocBuffer(num_objs, args.heap)) + return false; + + auto it = mRanges.begin(); + const auto end = mRanges.end(); + + sead::FixedSafeString<32> obj_name{"Range"}; + const auto obj_name_prefix_len = obj_name.calcLength(); + + auto res_it = args.res_list.objBegin(); + const auto res_end = args.res_list.objEnd(); + + while (res_it != res_end && it != end) { + obj_name.trim(obj_name_prefix_len); + obj_name.appendWithFormat("%d", it.getIndex()); + + it->start.init(0.0, "Start", "開始", "Min=0.f,Max=1.f", &it->obj); + it->end.init(0.0, "End", "終了", "Min=0.f,Max=1.f", &it->obj); + + mList.addObj(&it->obj, obj_name); + + ++res_it; + ++it; + } + + return true; +} + +bool ASFloatArrayParser::parse(const ASParamParser::ParseArgs& args) { + const int size = args.res_list.getResParameterObj(0).getNum(); + if (size != 0) { + if (!mValues.tryAllocBuffer(size, args.heap)) + return false; + + sead::FixedSafeString<32> param_name{"Value"}; + const auto param_name_prefix_len = param_name.calcLength(); + + for (int i = 0; i < size; ++i) { + param_name.trim(param_name_prefix_len); + param_name.appendWithFormat("%d", i); + mValues[i].value.init(1.0, param_name, "値", "", &mObj); + } + } + + mList.addObj(&mObj, "FloatArray0"); + return true; +} + +bool ASIntArrayParser::parse(const ASParamParser::ParseArgs& args) { + const int size = args.res_list.getResParameterObj(0).getNum(); + if (size != 0) { + if (!mValues.tryAllocBuffer(size, args.heap)) + return false; + + sead::FixedSafeString<32> param_name{"Value"}; + const auto param_name_prefix_len = param_name.calcLength(); + + for (int i = 0; i < size; ++i) { + param_name.trim(param_name_prefix_len); + param_name.appendWithFormat("%d", i); + mValues[i].value.init(1, param_name, "値", "", &mObj); + } + } + + mList.addObj(&mObj, "IntArray0"); + return true; +} + +bool ASBitIndexParser::parse(const ASParamParser::ParseArgs& args) { + const auto obj = args.res_list.getResParameterObj(0); + if (obj.getNum() < 1) + return true; + + const auto TypeIndex = agl::utl::getResParameter(obj, "TypeIndex"); + if (!TypeIndex.ptr()) + return true; + + mTypeIndex = *TypeIndex.getData(); + return true; +} + +template +static ASParamParser* factoryImpl_(sead::Heap* heap) { + return new (heap) T; +} + +static ASParamParser* dummyASParserFactoryImpl_(sead::Heap*) { + return nullptr; +} + +std::array ASExtensions::sFactories{{ + {"FrameCtrl", factoryImpl_}, + {"TriggerEvents", factoryImpl_}, + {"HoldEvents", factoryImpl_}, + {"StringArray", factoryImpl_}, + {"Ranges", factoryImpl_}, + {"FloatArray", factoryImpl_}, + {"IntArray", factoryImpl_}, + {"BitIndex", factoryImpl_}, + {"BlenderBone", dummyASParserFactoryImpl_}, +}}; + +ASExtensions::~ASExtensions() { + for (auto*& parser : mParsers) { + if (parser && parser->getType() != ASParamParser::Type::BlenderBone) + delete parser; + parser = nullptr; + } + mParsers.freeBuffer(); +} + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceASResource.h b/src/KingSystem/Resource/resResourceASResource.h index 40b42c75..0a2ab6bb 100644 --- a/src/KingSystem/Resource/resResourceASResource.h +++ b/src/KingSystem/Resource/resResourceASResource.h @@ -1,8 +1,12 @@ #pragma once +#include #include +#include #include +#include #include +#include #include #include "KingSystem/Utils/Types.h" @@ -15,22 +19,236 @@ namespace ksys::res { class ASParamParser { SEAD_RTTI_BASE(ASParamParser) public: + enum class Type { + FrameCtrl = 0, + TriggerEvents = 1, + HoldEvents = 2, + StringArray = 3, + Ranges = 4, + FloatArray = 5, + IntArray = 6, + BitIndex = 7, + BlenderBone = 8, + }; + static constexpr int NumTypes = 9; + struct ParseArgs { void* user_data; agl::utl::ResParameterList res_list; sead::Heap* heap; }; + explicit ASParamParser(Type type) : mType(type) {} virtual ~ASParamParser() = default; virtual bool parse(const ParseArgs& args) { return true; } + Type getType() const { return mType; } agl::utl::ParameterList& getList() { return mList; } const agl::utl::ParameterList& getList() const { return mList; } protected: - u32 _8 = 8; + Type mType; agl::utl::ParameterList mList; }; KSYS_CHECK_SIZE_NX150(ASParamParser, 0x58); +class ASExtensions { +public: + ASExtensions() = default; + ~ASExtensions(); + ASExtensions(const ASExtensions&) = delete; + auto operator=(const ASExtensions&) = delete; + + const sead::Buffer& getParsers() const { return mParsers; } + +private: + struct Factory { + const char* name; + ASParamParser* (*make)(sead::Heap* heap); + }; + static std::array sFactories; + + agl::utl::ParameterList mList; + sead::Buffer mParsers; +}; + +class ASFrameCtrlParser : public ASParamParser { + SEAD_RTTI_OVERRIDE(ASFrameCtrlParser, ASParamParser) +public: + ASFrameCtrlParser() : ASParamParser(Type::FrameCtrl) {} + + const auto& getRate() const { return *mRate; } + const auto& getStartFrame() const { return *mStartFrame; } + const auto& getEndFrame() const { return *mEndFrame; } + const auto& getLoopStopCount() const { return *mLoopStopCount; } + const auto& getLoopStopCountRandom() const { return *mLoopStopCountRandom; } + const auto& getReversePlay() const { return *mReversePlay; } + const auto& getUseGlobalFrame() const { return *mUseGlobalFrame; } + const auto& getConnect() const { return *mConnect; } + const auto& getFootType() const { return *mFootType; } + const auto& getAnmLoop() const { return *mAnmLoop; } + + bool parse(const ParseArgs& args) override; + +private: + agl::utl::ParameterObj mObj; + agl::utl::Parameter mRate; + agl::utl::Parameter mStartFrame; + agl::utl::Parameter mEndFrame; + agl::utl::Parameter mLoopStopCount; + agl::utl::Parameter mLoopStopCountRandom; + agl::utl::Parameter mReversePlay; + agl::utl::Parameter mUseGlobalFrame; + agl::utl::Parameter mConnect; + agl::utl::Parameter mFootType; + agl::utl::Parameter mAnmLoop; +}; + +class ASTriggerEventsParser : public ASParamParser { + SEAD_RTTI_OVERRIDE(ASTriggerEventsParser, ASParamParser) +public: + struct Event { + agl::utl::ParameterObj obj; + int type_index; + agl::utl::Parameter frame; + agl::utl::Parameter value; + }; + + ASTriggerEventsParser() : ASParamParser(Type::TriggerEvents) {} + ~ASTriggerEventsParser() override { mEvents.freeBuffer(); } + ASTriggerEventsParser(const ASTriggerEventsParser&) = delete; + auto operator=(const ASTriggerEventsParser&) = delete; + + const sead::Buffer& getEvents() const { return mEvents; } + + bool parse(const ParseArgs& args) override; + +private: + sead::Buffer mEvents; +}; + +class ASHoldEventsParser : public ASParamParser { + SEAD_RTTI_OVERRIDE(ASHoldEventsParser, ASParamParser) +public: + struct Event { + agl::utl::ParameterObj obj; + int type_index; + agl::utl::Parameter start_frame; + agl::utl::Parameter end_frame; + agl::utl::Parameter value; + }; + + ASHoldEventsParser() : ASParamParser(Type::HoldEvents) {} + ~ASHoldEventsParser() override { mEvents.freeBuffer(); } + ASHoldEventsParser(const ASHoldEventsParser&) = delete; + auto operator=(const ASHoldEventsParser&) = delete; + + const sead::Buffer& getEvents() const { return mEvents; } + + bool parse(const ParseArgs& args) override; + +private: + sead::Buffer mEvents; +}; + +class ASStringArrayParser : public ASParamParser { + SEAD_RTTI_OVERRIDE(ASStringArrayParser, ASParamParser) +public: + struct Value { + agl::utl::Parameter value; + }; + + ASStringArrayParser() : ASParamParser(Type::StringArray) {} + ~ASStringArrayParser() override { mValues.freeBuffer(); } + ASStringArrayParser(const ASStringArrayParser&) = delete; + auto operator=(const ASStringArrayParser&) = delete; + + const sead::Buffer& getValues() const { return mValues; } + + bool parse(const ParseArgs& args) override; + +private: + agl::utl::ParameterObj mObj; + sead::Buffer mValues; +}; + +class ASRangesParser : public ASParamParser { + SEAD_RTTI_OVERRIDE(ASRangesParser, ASParamParser) +public: + struct Range { + agl::utl::ParameterObj obj; + agl::utl::Parameter start; + agl::utl::Parameter end; + }; + + ASRangesParser() : ASParamParser(Type::Ranges) {} + ~ASRangesParser() override { mRanges.freeBuffer(); } + ASRangesParser(const ASRangesParser&) = delete; + auto operator=(const ASRangesParser&) = delete; + + const sead::Buffer& getRanges() const { return mRanges; } + + bool parse(const ParseArgs& args) override; + +private: + sead::Buffer mRanges; +}; + +class ASFloatArrayParser : public ASParamParser { + SEAD_RTTI_OVERRIDE(ASFloatArrayParser, ASParamParser) +public: + struct Value { + agl::utl::Parameter value; + }; + + ASFloatArrayParser() : ASParamParser(Type::FloatArray) {} + + ~ASFloatArrayParser() override { mValues.freeBuffer(); } + ASFloatArrayParser(const ASFloatArrayParser&) = delete; + auto operator=(const ASFloatArrayParser&) = delete; + + const sead::Buffer& getValues() const { return mValues; } + + bool parse(const ParseArgs& args) override; + +private: + agl::utl::ParameterObj mObj; + sead::Buffer mValues; +}; + +class ASIntArrayParser : public ASParamParser { + SEAD_RTTI_OVERRIDE(ASIntArrayParser, ASParamParser) +public: + struct Value { + agl::utl::Parameter value; + }; + + ASIntArrayParser() : ASParamParser(Type::IntArray) {} + + ~ASIntArrayParser() override { mValues.freeBuffer(); } + ASIntArrayParser(const ASIntArrayParser&) = delete; + auto operator=(const ASIntArrayParser&) = delete; + + const sead::Buffer& getValues() const { return mValues; } + + bool parse(const ParseArgs& args) override; + +private: + agl::utl::ParameterObj mObj; + sead::Buffer mValues; +}; + +class ASBitIndexParser : public ASParamParser { + SEAD_RTTI_OVERRIDE(ASBitIndexParser, ASParamParser) +public: + ASBitIndexParser() : ASParamParser(Type::BitIndex) {} + + int getBitIndex() const { return mTypeIndex; } + + bool parse(const ParseArgs& args) override; + +private: + int mTypeIndex = -1; +}; + } // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceASSetting.h b/src/KingSystem/Resource/resResourceASSetting.h index f786767f..069f98ff 100644 --- a/src/KingSystem/Resource/resResourceASSetting.h +++ b/src/KingSystem/Resource/resResourceASSetting.h @@ -28,6 +28,7 @@ public: class BoneParams : public ASParamParser { SEAD_RTTI_OVERRIDE(BoneParams, ASParamParser) public: + BoneParams() : ASParamParser(Type::BlenderBone) {} ~BoneParams() override; bool parse(const ParseArgs& args) override; f32 getBoneWeight(const sead::SafeString& name) const;