summaryrefslogtreecommitdiff
path: root/src/KingSystem/GameData/gdtTriggerParam.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-10-25 18:06:13 +0100
committerLéo Lam <leo@leolam.fr>2020-10-28 22:19:34 +0100
commitabf327664226b7b534c1b210cec8db11ebdcdc0d (patch)
tree57c2c0db1da73ffefb06c0ddb161689dfd0d571c /src/KingSystem/GameData/gdtTriggerParam.cpp
parentfd9b8ad11d7552246c3af27ef7398cad810ca910 (diff)
ksys/gdt: Implement more parts of TriggerParam (notably setters)
Diffstat (limited to 'src/KingSystem/GameData/gdtTriggerParam.cpp')
-rw-r--r--src/KingSystem/GameData/gdtTriggerParam.cpp598
1 files changed, 594 insertions, 4 deletions
diff --git a/src/KingSystem/GameData/gdtTriggerParam.cpp b/src/KingSystem/GameData/gdtTriggerParam.cpp
index d400eff7..669d78da 100644
--- a/src/KingSystem/GameData/gdtTriggerParam.cpp
+++ b/src/KingSystem/GameData/gdtTriggerParam.cpp
@@ -1,8 +1,11 @@
#include "KingSystem/GameData/gdtTriggerParam.h"
#include <algorithm>
+#include <devenv/seadStackTrace.h>
#include <mc/seadCoreInfo.h>
#include "KingSystem/GameData/gdtFlagProxy.h"
#include "KingSystem/Resource/resResourceGameData.h"
+#include "KingSystem/System/PlayReportMgr.h"
+#include "KingSystem/Utils/Debug.h"
#include "KingSystem/Utils/InitTimeInfo.h"
#include "KingSystem/Utils/SafeDelete.h"
@@ -81,11 +84,15 @@ inline s32 getFlagIndex(const sead::PtrArray<sead::PtrArray<FlagBase>>& flags, u
return -1;
}
-template <typename T>
-inline Flag<T>* getFlagByIndex(const sead::PtrArray<FlagBase>& flags, s32 index) {
+inline FlagBase* getFlagByIndexBase(const sead::PtrArray<FlagBase>& flags, s32 index) {
if (index < 0 || index >= flags.size())
return nullptr;
- return static_cast<Flag<T>*>(flags[index]);
+ return flags[index];
+}
+
+template <typename T>
+inline Flag<T>* getFlagByIndex(const sead::PtrArray<FlagBase>& flags, s32 index) {
+ return static_cast<Flag<T>*>(getFlagByIndexBase(flags, index));
}
template <typename T>
@@ -147,6 +154,219 @@ inline bool getFlagValue(const sead::PtrArray<sead::PtrArray<FlagBase>>& arrays,
return true;
}
+/// Modifies the value of a flag.
+/// @param success A non-null pointer to a boolean that is set to true if an attempt was made to
+/// change the value.
+/// @return whether the flag contains the specified value at the end of this function.
+template <typename T>
+bool doSetFlagValue(bool* success, const T& value, const sead::PtrArray<FlagBase>& flags, s32 idx,
+ bool check_permissions, bool bypass_one_trigger_check) {
+ *success = false;
+
+ auto* flag = getFlagByIndex<T>(flags, idx);
+ if (!flag)
+ return false;
+
+ if (check_permissions && !flags[idx]->isProgramWritable())
+ return false;
+
+ if constexpr (IsAnyOfType<T, s32, f32>()) {
+ if (!flags[idx]->isOneTrigger() || bypass_one_trigger_check || flag->isInitialValue())
+ *success = flag->setValue(value);
+ else if (!flag->hasValue(value))
+ return false;
+ return true;
+ } else {
+ bool can_set_value = false;
+ if (!flags[idx]->isOneTrigger() || bypass_one_trigger_check || flag->isInitialValue()) {
+ can_set_value = true;
+ *success = flag->setValue(value);
+ } else if (flag->hasValue(value)) {
+ return true;
+ }
+ return can_set_value;
+ }
+}
+
+void sendFlagChangePlayReport(const sead::SafeString& name, const FlagBase* flag) {
+ if (!PlayReportMgr::instance())
+ return;
+
+ for (s32 i = 0; i < sConfig.num_current_rupee_flag_name_changes; ++i) {
+ if (name == sConfig.current_rupee_flag_name) {
+ sead::FixedSafeString<64> value_str;
+ switch (s32(flag->getType())) {
+ case FlagType::Bool:
+ case FlagType::BoolArray:
+ if (static_cast<const FlagBool*>(flag)->getValue())
+ value_str.format("true");
+ else
+ value_str.format("false");
+ break;
+ case FlagType::S32:
+ case FlagType::S32Array:
+ value_str.format("%d", static_cast<const FlagS32*>(flag)->getValue());
+ break;
+ case FlagType::F32:
+ case FlagType::F32Array:
+ value_str.format("%f", static_cast<const FlagF32*>(flag)->getValue());
+ break;
+ case FlagType::String:
+ case FlagType::StringArray:
+ value_str.format("%s", static_cast<const FlagString*>(flag)->getValueRef().cstr());
+ break;
+ case FlagType::String64:
+ case FlagType::String64Array:
+ value_str.format("%s",
+ static_cast<const FlagString64*>(flag)->getValueRef().cstr());
+ break;
+ case FlagType::String256:
+ case FlagType::String256Array:
+ value_str.format("%s",
+ static_cast<const FlagString256*>(flag)->getValueRef().cstr());
+ break;
+ case FlagType::Vector2f:
+ case FlagType::Vector2fArray: {
+ const auto& vector = static_cast<const FlagVector2f*>(flag)->getValueRef();
+ value_str.format("%f %f", vector.x, vector.y);
+ break;
+ }
+ case FlagType::Vector3f:
+ case FlagType::Vector3fArray: {
+ const auto& vector = static_cast<const FlagVector3f*>(flag)->getValueRef();
+ value_str.format("%f %f %f", vector.x, vector.y, vector.z);
+ break;
+ }
+ case FlagType::Vector4f:
+ case FlagType::Vector4fArray: {
+ const auto& vector = static_cast<const FlagVector4f*>(flag)->getValueRef();
+ value_str.format("%f %f %f %f", vector.x, vector.y, vector.z, vector.w);
+ break;
+ }
+ default:
+ break;
+ }
+ PlayReportMgr::instance()->reportDebug(name, value_str);
+ break;
+ }
+ }
+}
+
+template <typename T>
+void reportFlagChange(const FlagBase* flag, s32 sub_idx = -1) {
+ auto* flag_ = static_cast<const Flag<T>*>(flag);
+
+ const sead::SafeString& name = flag->getName();
+ const FlagType type = flag->getType();
+
+ if constexpr (std::is_same<T, bool>()) {
+ if ((s32(type) == FlagType::Bool || s32(type) == FlagType::BoolArray) &&
+ PlayReportMgr::instance()) {
+ if (flag_->getValue())
+ PlayReportMgr::instance()->reportDebug("FlagOn", name);
+ else
+ PlayReportMgr::instance()->reportDebug("FlagOff", name);
+ }
+ } else {
+ sendFlagChangePlayReport(name, flag);
+ }
+
+ if (sConfig.shouldPrintStackTrace(name)) {
+ sead::StackTrace<50> stack_trace;
+ stack_trace.trace(nullptr);
+ }
+
+ if (!shouldLogFlagChange(name, type))
+ return;
+
+ if constexpr (std::is_same<T, bool>()) {
+ sead::FixedSafeString<128> message;
+ const char* name_cstr = flag->getName().cstr();
+ const auto type_ = flag->getType();
+ if (sub_idx < 0 || type_ != FlagType::BoolArray)
+ message.format("%s", name_cstr);
+ else
+ message.format("%s [%3d]", name_cstr, sub_idx);
+
+ switch (s32(flag->getType())) {
+ case FlagType::Bool:
+ case FlagType::BoolArray:
+ if (flag_->getValue())
+ message.append(" : true");
+ else
+ message.append(" : false");
+ break;
+ default:
+ break;
+ }
+ util::PrintDebug(message);
+ } else {
+ const char* name_cstr = flag->getName().cstr();
+ sead::FixedSafeString<128> message;
+ const s32 type_ = flag->getType();
+ if (sub_idx >= 0 && type_ >= FlagType::BoolArray)
+ message.format("%s [%3d] :", name_cstr, sub_idx);
+ else
+ message.format("%s :", name_cstr);
+
+ sead::FixedSafeString<64> value_str;
+ switch (s32(flag->getType())) {
+ case FlagType::Bool:
+ case FlagType::BoolArray:
+ if (static_cast<const FlagBool*>(flag)->getValue())
+ value_str.format("true");
+ else
+ value_str.format("false");
+ break;
+ case FlagType::S32:
+ case FlagType::S32Array:
+ value_str.format("%d", static_cast<const FlagS32*>(flag)->getValue());
+ break;
+ case FlagType::F32:
+ case FlagType::F32Array:
+ value_str.format("%f", static_cast<const FlagF32*>(flag)->getValue());
+ break;
+ case FlagType::String:
+ case FlagType::StringArray:
+ value_str.format("%s", static_cast<const FlagString*>(flag)->getValueRef().cstr());
+ break;
+ case FlagType::String64:
+ case FlagType::String64Array:
+ value_str.format("%s", static_cast<const FlagString64*>(flag)->getValueRef().cstr());
+ break;
+ case FlagType::String256:
+ case FlagType::String256Array:
+ value_str.format("%s", static_cast<const FlagString256*>(flag)->getValueRef().cstr());
+ break;
+ case FlagType::Vector2f:
+ case FlagType::Vector2fArray: {
+ const auto& vector = static_cast<const FlagVector2f*>(flag)->getValueRef();
+ value_str.format("%f %f", vector.x, vector.y);
+ break;
+ }
+ case FlagType::Vector3f:
+ case FlagType::Vector3fArray: {
+ const auto& vector = static_cast<const FlagVector3f*>(flag)->getValueRef();
+ value_str.format("%f %f %f", vector.x, vector.y, vector.z);
+ break;
+ }
+ case FlagType::Vector4f:
+ case FlagType::Vector4fArray: {
+ const auto& vector = static_cast<const FlagVector4f*>(flag)->getValueRef();
+ value_str.format("%f %f %f %f", vector.x, vector.y, vector.z, vector.w);
+ break;
+ }
+ default:
+ break;
+ }
+ message.append(value_str);
+ util::PrintDebug(message);
+ }
+
+ static_cast<void>(getFlagColor(type));
+ sConfig.index = sConfig.index >= 32 ? 0 : sConfig.index + 1;
+}
+
bool getFlagArraySize(const sead::PtrArray<sead::PtrArray<FlagBase>>& arrays, s32 index, s32* out) {
if (index < 0 || index >= arrays.size())
return false;
@@ -885,7 +1105,93 @@ bool TriggerParam::getMaxValueForS32(s32* max, const sead::SafeString& name) con
return true;
}
-void TriggerParam::recordFlagChange(const FlagBase* flag, s32 idx, s16 sub_idx) {
+#define SET_FLAG_VALUE_IMPL_(FUNCTION_NAME, ARG_VALUE_TYPE, FLAGS, T, VALUE) \
+ bool FUNCTION_NAME(ARG_VALUE_TYPE value, s32 idx, bool check_permissions, \
+ bool bypass_one_trigger_check) { \
+ bool success = false; \
+ const bool ret = doSetFlagValue<T>(&success, VALUE, FLAGS, idx, check_permissions, \
+ bypass_one_trigger_check); \
+ if (!success) \
+ return ret; \
+ \
+ recordFlagChange(FLAGS[idx], idx); \
+ reportFlagChange<T>(FLAGS[idx]); \
+ \
+ if constexpr (std::is_same<T, bool>()) { \
+ if (FLAGS[idx]->getProperties().isEventAssociated()) \
+ mBitFlags.ref().set(BitFlag::EventAssociatedFlagModified); \
+ } \
+ \
+ return ret; \
+ }
+
+#define SET_FLAG_VALUE_BY_KEY_IMPL_(FUNCTION_NAME, GET_INDEX_FN, ARG_VALUE_TYPE) \
+ bool FUNCTION_NAME(ARG_VALUE_TYPE value, const sead::SafeString& name, bool check_permissions, \
+ bool, bool bypass_one_trigger_check) { \
+ return FUNCTION_NAME(value, GET_INDEX_FN(name), check_permissions, \
+ bypass_one_trigger_check); \
+ }
+
+#define SET_ARRAY_FLAG_VALUE_IMPL_(FUNCTION_NAME, ARG_VALUE_TYPE, FLAGS, T, VALUE) \
+ bool FUNCTION_NAME(ARG_VALUE_TYPE value, s32 idx, s32 sub_idx, bool check_permissions, \
+ bool bypass_one_trigger_check) { \
+ bool success = false; \
+ \
+ if (idx < 0 || idx >= FLAGS.size()) \
+ return false; \
+ \
+ const auto* array = FLAGS[idx]; \
+ if (!array) \
+ return false; \
+ \
+ const bool ret = doSetFlagValue<T>(&success, VALUE, *array, sub_idx, check_permissions, \
+ bypass_one_trigger_check); \
+ if (!success) \
+ return ret; \
+ \
+ const auto* flag = (*FLAGS[idx])[sub_idx]; \
+ recordFlagChange(flag, idx, sub_idx); \
+ reportFlagChange<T>(flag, sub_idx); \
+ \
+ return ret; \
+ }
+
+#define SET_STRING_ARRAY_FLAG_VALUE_IMPL_(FUNCTION_NAME, FLAGS, T) \
+ bool FUNCTION_NAME(const char* value, s32 idx, s32 sub_idx, bool check_permissions, \
+ bool bypass_one_trigger_check) { \
+ bool success = false; \
+ T value_{value}; \
+ success = false; \
+ \
+ if (idx < 0 || idx >= FLAGS.size()) \
+ return false; \
+ \
+ const auto* array = FLAGS[idx]; \
+ if (!array) \
+ return false; \
+ \
+ const bool ret = doSetFlagValue<T>(&success, value_, *array, sub_idx, check_permissions, \
+ bypass_one_trigger_check); \
+ if (!success) \
+ return ret; \
+ \
+ const auto* flag = (*FLAGS[idx])[sub_idx]; \
+ recordFlagChange(flag, idx, sub_idx); \
+ reportFlagChange<T>(flag, sub_idx); \
+ \
+ return ret; \
+ }
+
+#define SET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(FUNCTION_NAME, GET_INDEX_FN, ARG_VALUE_TYPE) \
+ bool FUNCTION_NAME(ARG_VALUE_TYPE value, const sead::SafeString& name, s32 sub_idx, \
+ bool check_permissions, bool, bool bypass_one_trigger_check) { \
+ return FUNCTION_NAME(value, GET_INDEX_FN(name), sub_idx, check_permissions, \
+ bypass_one_trigger_check); \
+ }
+
+SET_FLAG_VALUE_IMPL_(TriggerParam::setBool, bool, mBoolFlags, bool, value)
+
+void TriggerParam::recordFlagChange(const FlagBase* flag, s32 idx, s32 sub_idx) {
const auto core = sead::CoreInfo::getCurrentCoreId();
const u32 platform_core_id = sead::CoreInfo::getPlatformCoreId(core);
@@ -904,6 +1210,214 @@ void TriggerParam::recordFlagChange(const FlagBase* flag, s32 idx, s16 sub_idx)
mBitFlags.ref().set(BitFlag::_8);
}
+SET_FLAG_VALUE_IMPL_(TriggerParam::setS32, s32, mS32Flags, s32, value)
+SET_FLAG_VALUE_IMPL_(TriggerParam::setF32, f32, mF32Flags, f32, value)
+SET_FLAG_VALUE_IMPL_(TriggerParam::setStr, const char*, mStringFlags, sead::FixedSafeString<32>,
+ sead::FixedSafeString<32>(value))
+SET_FLAG_VALUE_IMPL_(TriggerParam::setStr64, const char*, mString64Flags, sead::FixedSafeString<64>,
+ sead::FixedSafeString<64>(value))
+SET_FLAG_VALUE_IMPL_(TriggerParam::setStr256, const char*, mString256Flags,
+ sead::FixedSafeString<256>, sead::FixedSafeString<256>(value))
+SET_FLAG_VALUE_IMPL_(TriggerParam::setVec2f, const sead::Vector2f&, mVector2fFlags, sead::Vector2f,
+ value)
+SET_FLAG_VALUE_IMPL_(TriggerParam::setVec3f, const sead::Vector3f&, mVector3fFlags, sead::Vector3f,
+ value)
+SET_FLAG_VALUE_IMPL_(TriggerParam::setVec4f, const sead::Vector4f&, mVector4fFlags, sead::Vector4f,
+ value)
+
+SET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setBool, getBoolIdx, bool)
+SET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setS32, getS32Idx, s32)
+SET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setF32, getF32Idx, f32)
+SET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setStr, getStrIdx, const char*)
+SET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setStr64, getStr64Idx, const char*)
+SET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setStr256, getStr256Idx, const char*)
+SET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setVec2f, getVec2fIdx, const sead::Vector2f&)
+SET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setVec3f, getVec3fIdx, const sead::Vector3f&)
+SET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setVec4f, getVec4fIdx, const sead::Vector4f&)
+
+SET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::setBool, bool, mBoolArrayFlags, bool, value)
+SET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::setS32, s32, mS32ArrayFlags, s32, value)
+SET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::setF32, f32, mF32ArrayFlags, f32, value)
+SET_STRING_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::setStr, mStringArrayFlags,
+ sead::FixedSafeString<32>)
+SET_STRING_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::setStr64, mString64ArrayFlags,
+ sead::FixedSafeString<64>)
+SET_STRING_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::setStr256, mString256ArrayFlags,
+ sead::FixedSafeString<256>)
+SET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::setVec2f, const sead::Vector2f&, mVector2fArrayFlags,
+ sead::Vector2f, value)
+SET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::setVec3f, const sead::Vector3f&, mVector3fArrayFlags,
+ sead::Vector3f, value)
+SET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::setVec4f, const sead::Vector4f&, mVector4fArrayFlags,
+ sead::Vector4f, value)
+
+SET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setBool, getBoolArrayIdx, bool)
+SET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setS32, getS32ArrayIdx, s32)
+SET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setF32, getF32ArrayIdx, f32)
+SET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setStr, getStrArrayIdx, const char*)
+SET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setStr64, getStr64ArrayIdx, const char*)
+SET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setStr256, getStr256ArrayIdx, const char*)
+SET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setVec2f, getVec2fArrayIdx, const sead::Vector2f&)
+SET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setVec3f, getVec3fArrayIdx, const sead::Vector3f&)
+SET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::setVec4f, getVec4fArrayIdx, const sead::Vector4f&)
+
+#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; \
+ }
+
+#define RESET_FLAG_VALUE_BY_KEY_IMPL_(FUNCTION_NAME, FLAGS, GET_IDX_FN) \
+ bool FUNCTION_NAME(const sead::SafeString& name, bool check_permissions) { \
+ return FUNCTION_NAME(GET_IDX_FN(name), check_permissions); \
+ }
+
+#define RESET_ARRAY_FLAG_VALUE_IMPL_(FUNCTION_NAME, ARRAYS, T) \
+ bool FUNCTION_NAME(s32 idx, s32 sub_idx, bool check_permissions) { \
+ if (idx < 0 || idx >= ARRAYS.size()) \
+ return false; \
+ \
+ const auto* array = ARRAYS[idx]; \
+ if (!array) \
+ return false; \
+ \
+ auto* flag = getFlagByIndexBase(*array, sub_idx); \
+ if (!flag) \
+ return false; \
+ \
+ if (check_permissions && !flag->isProgramWritable()) \
+ return false; \
+ \
+ if (flag->isInitialValue()) \
+ return true; \
+ \
+ flag->resetToInitialValue(); \
+ const auto* flag_ = [&] { return ARRAYS.at(idx)->at(sub_idx); }(); \
+ recordFlagChange(flag_, idx, sub_idx); \
+ reportFlagChange<T>(flag_, sub_idx); \
+ \
+ return true; \
+ }
+
+#define RESET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(FUNCTION_NAME, FLAGS, GET_IDX_FN) \
+ bool FUNCTION_NAME(const sead::SafeString& name, s32 sub_idx, bool check_permissions) { \
+ return FUNCTION_NAME(GET_IDX_FN(name), sub_idx, check_permissions); \
+ }
+
+RESET_FLAG_VALUE_IMPL_(TriggerParam::resetBool, mBoolFlags, bool)
+RESET_FLAG_VALUE_IMPL_(TriggerParam::resetS32, mS32Flags, s32)
+RESET_FLAG_VALUE_IMPL_(TriggerParam::resetF32, mF32Flags, f32)
+RESET_FLAG_VALUE_IMPL_(TriggerParam::resetStr, mStringFlags, sead::FixedSafeString<32>)
+RESET_FLAG_VALUE_IMPL_(TriggerParam::resetStr64, mString64Flags, sead::FixedSafeString<64>)
+RESET_FLAG_VALUE_IMPL_(TriggerParam::resetStr256, mString256Flags, sead::FixedSafeString<256>)
+RESET_FLAG_VALUE_IMPL_(TriggerParam::resetVec2f, mVector2fFlags, sead::Vector2f)
+RESET_FLAG_VALUE_IMPL_(TriggerParam::resetVec3f, mVector3fFlags, sead::Vector3f)
+RESET_FLAG_VALUE_IMPL_(TriggerParam::resetVec4f, mVector4fFlags, sead::Vector4f)
+
+RESET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetBool, mBoolFlags, getBoolIdx)
+RESET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetS32, mS32Flags, getS32Idx)
+RESET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetF32, mF32Flags, getF32Idx)
+RESET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetStr, mStringFlags, getStrIdx)
+RESET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetStr64, mString64Flags, getStr64Idx)
+RESET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetStr256, mString256Flags, getStr256Idx)
+RESET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetVec2f, mVector2fFlags, getVec2fIdx)
+RESET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetVec3f, mVector3fFlags, getVec3fIdx)
+RESET_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetVec4f, mVector4fFlags, getVec4fIdx)
+
+RESET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::resetBool, mBoolArrayFlags, bool)
+RESET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::resetS32, mS32ArrayFlags, s32)
+RESET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::resetF32, mF32ArrayFlags, f32)
+RESET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::resetStr, mStringArrayFlags, sead::FixedSafeString<32>)
+RESET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::resetStr64, mString64ArrayFlags,
+ sead::FixedSafeString<64>)
+RESET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::resetStr256, mString256ArrayFlags,
+ sead::FixedSafeString<256>)
+RESET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::resetVec2f, mVector2fArrayFlags, sead::Vector2f)
+RESET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::resetVec3f, mVector3fArrayFlags, sead::Vector3f)
+RESET_ARRAY_FLAG_VALUE_IMPL_(TriggerParam::resetVec4f, mVector4fArrayFlags, sead::Vector4f)
+
+RESET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetBool, mBoolArrayFlags, getBoolArrayIdx)
+RESET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetS32, mS32ArrayFlags, getS32ArrayIdx)
+RESET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetF32, mF32ArrayFlags, getF32ArrayIdx)
+RESET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetStr, mStringArrayFlags, getStrArrayIdx)
+RESET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetStr64, mString64ArrayFlags, getStr64ArrayIdx)
+RESET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetStr256, mString256ArrayFlags,
+ getStr256ArrayIdx)
+RESET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetVec2f, mVector2fArrayFlags, getVec2fArrayIdx)
+RESET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetVec3f, mVector3fArrayFlags, getVec3fArrayIdx)
+RESET_ARRAY_FLAG_VALUE_BY_KEY_IMPL_(TriggerParam::resetVec4f, mVector4fArrayFlags, getVec4fArrayIdx)
+
+void TriggerParam::resetAllFlagsToInitialValues() {
+ for (s32 i = 0; i < mBoolFlags.size(); ++i)
+ resetBool(i, false);
+ for (s32 i = 0; i < mS32Flags.size(); ++i)
+ resetS32(i, false);
+ for (s32 i = 0; i < mF32Flags.size(); ++i)
+ resetF32(i, false);
+ for (s32 i = 0; i < mStringFlags.size(); ++i)
+ resetStr(i, false);
+ for (s32 i = 0; i < mString64Flags.size(); ++i)
+ resetStr64(i, false);
+ for (s32 i = 0; i < mString256Flags.size(); ++i)
+ resetStr256(i, false);
+ for (s32 i = 0; i < mVector2fFlags.size(); ++i)
+ resetVec2f(i, false);
+ for (s32 i = 0; i < mVector3fFlags.size(); ++i)
+ resetVec3f(i, false);
+ for (s32 i = 0; i < mVector4fFlags.size(); ++i)
+ resetVec4f(i, false);
+
+ for (s32 i = 0; i < mBoolArrayFlags.size(); ++i) {
+ for (s32 j = 0; j < mBoolArrayFlags[i]->size(); ++j)
+ resetBool(i, j, false);
+ }
+ for (s32 i = 0; i < mS32ArrayFlags.size(); ++i) {
+ for (s32 j = 0; j < mS32ArrayFlags[i]->size(); ++j)
+ resetS32(i, j, false);
+ }
+ for (s32 i = 0; i < mF32ArrayFlags.size(); ++i) {
+ for (s32 j = 0; j < mF32ArrayFlags[i]->size(); ++j)
+ resetF32(i, j, false);
+ }
+ for (s32 i = 0; i < mStringArrayFlags.size(); ++i) {
+ for (s32 j = 0; j < mStringArrayFlags[i]->size(); ++j)
+ resetStr(i, j, false);
+ }
+ for (s32 i = 0; i < mString64ArrayFlags.size(); ++i) {
+ for (s32 j = 0; j < mString64ArrayFlags[i]->size(); ++j)
+ resetStr64(i, j, false);
+ }
+ for (s32 i = 0; i < mString256ArrayFlags.size(); ++i) {
+ for (s32 j = 0; j < mString256ArrayFlags[i]->size(); ++j)
+ resetStr256(i, j, false);
+ }
+ for (s32 i = 0; i < mVector2fArrayFlags.size(); ++i) {
+ for (s32 j = 0; j < mVector2fArrayFlags[i]->size(); ++j)
+ resetVec2f(i, j, false);
+ }
+ for (s32 i = 0; i < mVector3fArrayFlags.size(); ++i) {
+ for (s32 j = 0; j < mVector3fArrayFlags[i]->size(); ++j)
+ resetVec3f(i, j, false);
+ }
+ for (s32 i = 0; i < mVector4fArrayFlags.size(); ++i) {
+ for (s32 j = 0; j < mVector4fArrayFlags[i]->size(); ++j)
+ resetVec4f(i, j, false);
+ }
+}
+
s32 TriggerParam::getBoolIdx(u32 name) const {
return getFlagIndex(mBoolFlags, name);
}
@@ -976,6 +1490,82 @@ s32 TriggerParam::getVec4fArrayIdx(u32 name) const {
return getFlagIndex(mVector4fArrayFlags, name);
}
+FlagBool* TriggerParam::getBoolFlag(s32 idx) const {
+ return static_cast<FlagBool*>(mBoolFlags[idx]);
+}
+
+FlagS32* TriggerParam::getS32Flag(s32 idx) const {
+ return static_cast<FlagS32*>(mS32Flags[idx]);
+}
+
+FlagF32* TriggerParam::getF32Flag(s32 idx) const {
+ return static_cast<FlagF32*>(mF32Flags[idx]);
+}
+
+FlagString* TriggerParam::getStrFlag(s32 idx) const {
+ return static_cast<FlagString*>(mStringFlags[idx]);
+}
+
+FlagString64* TriggerParam::getStr64Flag(s32 idx) const {
+ return static_cast<FlagString64*>(mString64Flags[idx]);
+}
+
+FlagString256* TriggerParam::getStr256Flag(s32 idx) const {
+ return static_cast<FlagString256*>(mString256Flags[idx]);
+}
+
+FlagVector2f* TriggerParam::getVec2fFlag(s32 idx) const {
+ return static_cast<FlagVector2f*>(mVector2fFlags[idx]);
+}
+
+FlagVector3f* TriggerParam::getVec3fFlag(s32 idx) const {
+ return static_cast<FlagVector3f*>(mVector3fFlags[idx]);
+}
+
+FlagVector4f* TriggerParam::getVec4fFlag(s32 idx) const {
+ return static_cast<FlagVector4f*>(mVector4fFlags[idx]);
+}
+
+FlagBool* TriggerParam::getBoolFlag(s32 idx, s32 sub_idx) const {
+ return static_cast<FlagBool*>(mBoolArrayFlags[idx]->at(sub_idx));
+}
+
+FlagS32* TriggerParam::getS32Flag(s32 idx, s32 sub_idx) const {
+ return static_cast<FlagS32*>(mS32ArrayFlags[idx]->at(sub_idx));
+}
+
+FlagF32* TriggerParam::getF32Flag(s32 idx, s32 sub_idx) const {
+ return static_cast<FlagF32*>(mF32ArrayFlags[idx]->at(sub_idx));
+}
+
+FlagString* TriggerParam::getStrFlag(s32 idx, s32 sub_idx) const {
+ return static_cast<FlagString*>(mStringArrayFlags[idx]->at(sub_idx));
+}
+
+FlagString64* TriggerParam::getStr64Flag(s32 idx, s32 sub_idx) const {
+ return static_cast<FlagString64*>(mString64ArrayFlags[idx]->at(sub_idx));
+}
+
+FlagString256* TriggerParam::getStr256Flag(s32 idx, s32 sub_idx) const {
+ return static_cast<FlagString256*>(mString256ArrayFlags[idx]->at(sub_idx));
+}
+
+FlagVector2f* TriggerParam::getVec2fFlag(s32 idx, s32 sub_idx) const {
+ return static_cast<FlagVector2f*>(mVector2fArrayFlags[idx]->at(sub_idx));
+}
+
+FlagVector3f* TriggerParam::getVec3fFlag(s32 idx, s32 sub_idx) const {
+ return static_cast<FlagVector3f*>(mVector3fArrayFlags[idx]->at(sub_idx));
+}
+
+FlagVector4f* TriggerParam::getVec4fFlag(s32 idx, s32 sub_idx) const {
+ return static_cast<FlagVector4f*>(mVector4fArrayFlags[idx]->at(sub_idx));
+}
+
+void TriggerParam::onResetBoolFlagForRadarMgr(FlagBase* flag, s32 sub_idx) {
+ reportFlagChange<bool>(flag, sub_idx);
+}
+
void TriggerParam::setCurrentRupeeFlagName(const sead::SafeString& name) {
if (sConfig.num_current_rupee_flag_name_changes <= 0) {
sConfig.getCurrentRupeeFlagName() = name;