diff options
| author | Léo Lam <leo@leolam.fr> | 2021-04-07 17:21:27 +0200 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2021-04-07 17:21:58 +0200 |
| commit | f49219d33c5f3fe3798f68b3db620708f4566fda (patch) | |
| tree | dccd90bb444ca41b31e8d54a0ae8cc7640a43e5b /src/KingSystem/GameData/gdtTriggerParam.cpp | |
| parent | f3f4cb78a4789ff4b3fe1d7ecb1b48bfe573412a (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.cpp | 41 |
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) \ |
