From 4eae9f9cc89ecef67260d98a77e28f5fdd9ef69d Mon Sep 17 00:00:00 2001 From: theo3 Date: Mon, 5 Oct 2020 02:49:54 -0700 Subject: [PATCH] decompile resResourceLifeCondition --- data/uking_functions.csv | 6 +- src/KingSystem/Resource/CMakeLists.txt | 2 + .../Resource/resResourceLifeCondition.cpp | 83 +++++++++++++++++++ .../Resource/resResourceLifeCondition.h | 33 ++++++++ 4 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 src/KingSystem/Resource/resResourceLifeCondition.cpp create mode 100644 src/KingSystem/Resource/resResourceLifeCondition.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index dd871ee9..b77b163d 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -85850,9 +85850,9 @@ 0x0000007101099918,sub_7101099918,116,_ZThn664_N4ksys3res4DropD0Ev 0x0000007101099b00,nullsub_4471,4, 0x0000007101099b04,nullsub_4472,4, -0x0000007101099b08,Blifecondition::parse,1296, -0x000000710109a018,Blifecondition::parseArray,448, -0x000000710109a1d8,ResourceBlifecondition::parse,28, +0x0000007101099b08,Blifecondition::parse,1296,_ZN4ksys3res13LifeCondition6parse_EPhmPN4sead4HeapE? +0x000000710109a018,Blifecondition::parseArray,448,_ZN4ksys3res13LifeCondition10parseArrayEPKN3agl3utl15ResParameterObjEPNS3_13IParameterObjEPN4sead6BufferINS3_9ParameterINS9_14SafeStringBaseIcEEEEEERKSD_SI_PNS9_4HeapE +0x000000710109a1d8,ResourceBlifecondition::parse,28,_ZThn632_N4ksys3res13LifeCondition6parse_EPhmPN4sead4HeapE 0x000000710109a1f4,_ZNK3aal8ShapeMgr20isTemplateRegisteredERKN4sead14SafeStringBaseIcEE,280, 0x000000710109a30c,sub_710109A30C,156, 0x000000710109a3a8,sub_710109A3A8,144, diff --git a/src/KingSystem/Resource/CMakeLists.txt b/src/KingSystem/Resource/CMakeLists.txt index f5424b11..09ec38ef 100644 --- a/src/KingSystem/Resource/CMakeLists.txt +++ b/src/KingSystem/Resource/CMakeLists.txt @@ -122,6 +122,8 @@ target_sources(uking PRIVATE resResourceDrop.h resResourceGParamList.cpp resResourceGParamList.h + resResourceLifeCondition.cpp + resResourceLifeCondition.h resResourceLod.cpp resResourceLod.h resResourceRecipe.cpp diff --git a/src/KingSystem/Resource/resResourceLifeCondition.cpp b/src/KingSystem/Resource/resResourceLifeCondition.cpp new file mode 100644 index 00000000..3c2a1946 --- /dev/null +++ b/src/KingSystem/Resource/resResourceLifeCondition.cpp @@ -0,0 +1,83 @@ +#include "KingSystem/Resource/resResourceLifeCondition.h" +#include + +namespace ksys::res { + +// NON_MATCHING: two instructions swapped +bool LifeCondition::parse_(u8* data, size_t, sead::Heap* heap) { + if (!data) + return true; + + applyResParameterArchive(agl::utl::ResParameterArchive{data}); + const agl::utl::ResParameterArchive archive{data}; + const auto root = archive.getRootList(); + + const auto invalid_weathers_obj = agl::utl::getResParameterObj(root, "InvalidWeathers"); + if (invalid_weathers_obj.ptr()) + LifeCondition::parseArray(&invalid_weathers_obj, &mInvalidWeathersObj, + &mInvalidWeathersBuffer, "InvalidWeathers", "天候", heap); + + const auto invalid_times_obj = agl::utl::getResParameterObj(root, "InvalidTimes"); + if (invalid_times_obj.ptr()) + LifeCondition::parseArray(&invalid_times_obj, &mInvalidTimesObj, &mInvalidTimesBuffer, + "InvalidTimes", "時間", heap); + + const auto display_distance_obj = agl::utl::getResParameterObj(root, "DisplayDistance"); + if (display_distance_obj.ptr()) { + mDisplayDistance.init(0.0, "Item", "表示距離", &mDisplayDistanceObj); + addObj(&mDisplayDistanceObj, "DisplayDistance"); + mDisplayDistanceObj.applyResParameterObj(display_distance_obj, nullptr); + } + + const auto auto_display_distance_algorithm_obj = + agl::utl::getResParameterObj(root, "AutoDisplayDistanceAlgorithm"); + if (auto_display_distance_algorithm_obj.ptr()) { + mBoundingY.init("Bouding.Y", "Item", "自動距離算出アルゴリズム", &mBoundingYObj); + addObj(&mBoundingYObj, "AutoDisplayDistanceAlgorithm"); + mBoundingYObj.applyResParameterObj(auto_display_distance_algorithm_obj, nullptr); + } + + const auto y_limit_algorithm_obj = agl::utl::getResParameterObj(root, "YLimitAlgorithm"); + if (y_limit_algorithm_obj.ptr()) { + mYLimitAlgorithm.init("NoLimit", "Item", "Y制限アルゴリズム", &mYLimitAlgorithmObj); + addObj(&mYLimitAlgorithmObj, "YLimitAlgorithm"); + mYLimitAlgorithmObj.applyResParameterObj(y_limit_algorithm_obj, nullptr); + } + + const auto delete_weathers_obj = agl::utl::getResParameterObj(root, "DeleteWeathers"); + if (delete_weathers_obj.ptr()) + LifeCondition::parseArray(&delete_weathers_obj, &mDeleteWeathersObj, &mDeleteWeathersBuffer, + "DeleteWeathers", "天候", heap); + + const auto delete_times_obj = agl::utl::getResParameterObj(root, "DeleteTimes"); + if (delete_times_obj.ptr()) + LifeCondition::parseArray(&delete_times_obj, &mDeleteTimesObj, &mDeleteTimesBuffer, + "DeleteTimes", "時間", heap); + + return true; +} + +void LifeCondition::parseArray(const agl::utl::ResParameterObj* data, agl::utl::IParameterObj* obj, + sead::Buffer>* buffer, + const sead::SafeString& key, const sead::SafeString& desc, + sead::Heap* heap) { + addObj(obj, key); + obj->applyResParameterObj(*data, nullptr); + + auto count = data->mPtr->getNumParameters(); + if (count == 0) + return; + + buffer->allocBufferAssert(count, heap); + + for (int i = 0; i != count; ++i) { + sead::FormatFixedSafeString<64> s; + s.format("Item%03d", (i + 1)); + + (*buffer)[i].init("", s, desc, obj); + } + + obj->applyResParameterObj(*data, nullptr); +} + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceLifeCondition.h b/src/KingSystem/Resource/resResourceLifeCondition.h new file mode 100644 index 00000000..81983984 --- /dev/null +++ b/src/KingSystem/Resource/resResourceLifeCondition.h @@ -0,0 +1,33 @@ +#include +#include +#include +#include "KingSystem/Resource/resResource.h" +#include "KingSystem/Utils/ParamIO.h" + +namespace ksys::res { + +class LifeCondition : public ParamIO, public Resource { + void parseArray(const agl::utl::ResParameterObj* data, agl::utl::IParameterObj* obj, + sead::Buffer>* buffer, + const sead::SafeString& key, const sead::SafeString& desc, sead::Heap* heap); + + bool parse_(u8* data, size_t size, sead::Heap* heap) override; + + agl::utl::IParameterObj mInvalidWeathersObj; + agl::utl::IParameterObj mInvalidTimesObj; + agl::utl::IParameterObj mDisplayDistanceObj; + agl::utl::IParameterObj mDeleteWeathersObj; + agl::utl::IParameterObj mDeleteTimesObj; + agl::utl::IParameterObj mBoundingYObj; + agl::utl::IParameterObj mYLimitAlgorithmObj; + + sead::Buffer> mInvalidWeathersBuffer; + sead::Buffer> mInvalidTimesBuffer; + agl::utl::Parameter mDisplayDistance; + agl::utl::Parameter mBoundingY; + agl::utl::Parameter mYLimitAlgorithm; + sead::Buffer> mDeleteWeathersBuffer; + sead::Buffer> mDeleteTimesBuffer; +}; + +} // namespace ksys::res