diff options
| author | theo3 <arisstephenson2@gmail.com> | 2020-10-05 02:49:54 -0700 |
|---|---|---|
| committer | theo3 <arisstephenson2@gmail.com> | 2020-10-05 19:08:30 -0700 |
| commit | 4eae9f9cc89ecef67260d98a77e28f5fdd9ef69d (patch) | |
| tree | 5646cb20ec07a77a9bd8ed28d448be2b2148e3d5 /src | |
| parent | 12e6979b6c175d7b9d8b871cb50bbbe9b545a74e (diff) | |
decompile resResourceLifeCondition
Diffstat (limited to 'src')
| -rw-r--r-- | src/KingSystem/Resource/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/KingSystem/Resource/resResourceLifeCondition.cpp | 83 | ||||
| -rw-r--r-- | src/KingSystem/Resource/resResourceLifeCondition.h | 33 |
3 files changed, 118 insertions, 0 deletions
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 <codec/seadHashCRC32.h> + +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<agl::utl::Parameter<sead::SafeString>>* 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 <agl/Utils/aglParameter.h> +#include <agl/Utils/aglParameterObj.h> +#include <container/seadBuffer.h> +#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<agl::utl::Parameter<sead::SafeString>>* 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<agl::utl::Parameter<sead::SafeString>> mInvalidWeathersBuffer; + sead::Buffer<agl::utl::Parameter<sead::SafeString>> mInvalidTimesBuffer; + agl::utl::Parameter<f32> mDisplayDistance; + agl::utl::Parameter<sead::SafeString> mBoundingY; + agl::utl::Parameter<sead::SafeString> mYLimitAlgorithm; + sead::Buffer<agl::utl::Parameter<sead::SafeString>> mDeleteWeathersBuffer; + sead::Buffer<agl::utl::Parameter<sead::SafeString>> mDeleteTimesBuffer; +}; + +} // namespace ksys::res |
