mirror of https://github.com/zeldaret/botw.git
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.
This commit is contained in:
parent
f3f4cb78a4
commit
f49219d33c
|
@ -375,6 +375,25 @@ bool getFlagArraySize(const sead::PtrArray<sead::PtrArray<FlagBase>>& arrays, s3
|
||||||
return true;
|
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>
|
template <typename T>
|
||||||
inline void copyGameDataResBuffer(sead::Buffer<T>& source, sead::PtrArray<FlagBase>& dest,
|
inline void copyGameDataResBuffer(sead::Buffer<T>& source, sead::PtrArray<FlagBase>& dest,
|
||||||
sead::Heap* heap) {
|
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) \
|
#define RESET_FLAG_VALUE_IMPL_(FUNCTION_NAME, FLAGS, T) \
|
||||||
bool FUNCTION_NAME(s32 idx, bool check_permissions) { \
|
bool FUNCTION_NAME(s32 idx, bool check_permissions) { \
|
||||||
auto* flag = getFlagByIndexBase(FLAGS, idx); \
|
bool was_reset = false; \
|
||||||
if (!flag) \
|
const bool ok = resetFlag(&was_reset, FLAGS, idx, check_permissions); \
|
||||||
return false; \
|
if (was_reset) { \
|
||||||
\
|
recordFlagChange(FLAGS[idx], idx); \
|
||||||
if (check_permissions && !flag->isProgramWritable()) \
|
reportFlagChange<T>(FLAGS[idx]); \
|
||||||
return false; \
|
} \
|
||||||
\
|
return ok; \
|
||||||
if (flag->isInitialValue()) \
|
|
||||||
return true; \
|
|
||||||
\
|
|
||||||
flag->resetToInitialValue(); \
|
|
||||||
recordFlagChange(FLAGS[idx], idx); \
|
|
||||||
reportFlagChange<T>(FLAGS[idx]); \
|
|
||||||
\
|
|
||||||
return true; \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define RESET_FLAG_VALUE_BY_KEY_IMPL_(FUNCTION_NAME, FLAGS, GET_IDX_FN) \
|
#define RESET_FLAG_VALUE_BY_KEY_IMPL_(FUNCTION_NAME, FLAGS, GET_IDX_FN) \
|
||||||
|
|
Loading…
Reference in New Issue