summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortheo3 <arisstephenson2@gmail.com>2020-10-05 02:49:54 -0700
committertheo3 <arisstephenson2@gmail.com>2020-10-05 19:08:30 -0700
commit4eae9f9cc89ecef67260d98a77e28f5fdd9ef69d (patch)
tree5646cb20ec07a77a9bd8ed28d448be2b2148e3d5 /src
parent12e6979b6c175d7b9d8b871cb50bbbe9b545a74e (diff)
decompile resResourceLifeCondition
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/Resource/CMakeLists.txt2
-rw-r--r--src/KingSystem/Resource/resResourceLifeCondition.cpp83
-rw-r--r--src/KingSystem/Resource/resResourceLifeCondition.h33
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