summaryrefslogtreecommitdiff
path: root/src/KingSystem/GameData/gdtTriggerParam.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-04-07 17:21:27 +0200
committerLéo Lam <leo@leolam.fr>2021-04-07 17:21:58 +0200
commitf49219d33c5f3fe3798f68b3db620708f4566fda (patch)
treedccd90bb444ca41b31e8d54a0ae8cc7640a43e5b /src/KingSystem/GameData/gdtTriggerParam.cpp
parentf3f4cb78a4789ff4b3fe1d7ecb1b48bfe573412a (diff)
ksys/gdt: Improve accuracy of reset functions
The previous version was also matching, but this is closer to how it is implemented in the Wii U version.
Diffstat (limited to 'src/KingSystem/GameData/gdtTriggerParam.cpp')
-rw-r--r--src/KingSystem/GameData/gdtTriggerParam.cpp41
1 files changed, 26 insertions, 15 deletions
diff --git a/src/KingSystem/GameData/gdtTriggerParam.cpp b/src/KingSystem/GameData/gdtTriggerParam.cpp
index 951031ee..3b89cc4b 100644
--- a/src/KingSystem/GameData/gdtTriggerParam.cpp
+++ b/src/KingSystem/GameData/gdtTriggerParam.cpp
@@ -375,6 +375,25 @@ bool getFlagArraySize(const sead::PtrArray<sead::PtrArray<FlagBase>>& arrays, s3
return true;
}
+bool resetFlag(bool* was_reset, const sead::PtrArray<FlagBase>& flags, s32 idx,
+ bool check_permissions) {
+ *was_reset = false;
+
+ auto* flag = getFlagByIndexBase(flags, idx);
+ if (!flag)
+ return false;
+
+ if (check_permissions && !flag->isProgramWritable())
+ return false;
+
+ if (flag->isInitialValue())
+ return true;
+
+ flag->resetToInitialValue();
+ *was_reset = true;
+ return true;
+}
+
template <typename T>
inline void copyGameDataResBuffer(sead::Buffer<T>& source, sead::PtrArray<FlagBase>& dest,
sead::Heap* heap) {
@@ -1441,21 +1460,13 @@ SET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setVec4f, getVec4fArrayIdx, cons
#define RESET_FLAG_VALUE_IMPL_(FUNCTION_NAME, FLAGS, T) \
bool FUNCTION_NAME(s32 idx, bool check_permissions) { \
- auto* flag = getFlagByIndexBase(FLAGS, idx); \
- if (!flag) \
- return false; \
- \
- if (check_permissions && !flag->isProgramWritable()) \
- return false; \
- \
- if (flag->isInitialValue()) \
- return true; \
- \
- flag->resetToInitialValue(); \
- recordFlagChange(FLAGS[idx], idx); \
- reportFlagChange<T>(FLAGS[idx]); \
- \
- return true; \
+ bool was_reset = false; \
+ const bool ok = resetFlag(&was_reset, FLAGS, idx, check_permissions); \
+ if (was_reset) { \
+ recordFlagChange(FLAGS[idx], idx); \
+ reportFlagChange<T>(FLAGS[idx]); \
+ } \
+ return ok; \
}
#define RESET_FLAG_VALUE_BY_KEY_IMPL_(FUNCTION_NAME, FLAGS, GET_IDX_FN) \