summaryrefslogtreecommitdiff
path: root/src/KingSystem/GameData/gdtFlag.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/KingSystem/GameData/gdtFlag.cpp')
-rw-r--r--src/KingSystem/GameData/gdtFlag.cpp151
1 files changed, 151 insertions, 0 deletions
diff --git a/src/KingSystem/GameData/gdtFlag.cpp b/src/KingSystem/GameData/gdtFlag.cpp
new file mode 100644
index 00000000..5be98096
--- /dev/null
+++ b/src/KingSystem/GameData/gdtFlag.cpp
@@ -0,0 +1,151 @@
+#include "KingSystem/GameData/gdtFlag.h"
+
+namespace ksys::gdt {
+
+SEAD_ENUM_IMPL(FlagType)
+
+FlagProperties::FlagProperties() = default;
+
+FlagProperties::~FlagProperties() = default;
+
+void FlagProperties::setIsProgramReadable(bool on) {
+ set(PropertyFlag::IsProgramReadable, on);
+}
+
+bool FlagProperties::isProgramReadable() const {
+ return get(PropertyFlag::IsProgramReadable);
+}
+
+void FlagProperties::setIsProgramWritable(bool on) {
+ set(PropertyFlag::IsProgramWritable, on);
+}
+
+bool FlagProperties::isProgramWritable() const {
+ return get(PropertyFlag::IsProgramWritable);
+}
+
+void FlagProperties::setIsSave(bool on) {
+ set(PropertyFlag::IsSave, on);
+}
+
+bool FlagProperties::isSave() const {
+ return get(PropertyFlag::IsSave);
+}
+
+void FlagProperties::setIsOneTrigger(bool on) {
+ set(PropertyFlag::IsOneTrigger, on);
+}
+
+bool FlagProperties::isOneTrigger() const {
+ return get(PropertyFlag::IsOneTrigger);
+}
+
+void FlagProperties::setIsEventAssociated(bool on) {
+ set(PropertyFlag::IsEventAssociated, on);
+}
+
+bool FlagProperties::isEventAssociated() const {
+ return get(PropertyFlag::IsEventAssociated);
+}
+
+void FlagProperties::setResetType(ResetType type) {
+ mFlags = (mFlags & 0x1F) | 0x20 * u32(type);
+}
+
+ResetType FlagProperties::getResetType() const {
+ return ResetType(mFlags >> 5);
+}
+
+FlagProperties& FlagProperties::operator=(const FlagProperties& other) {
+ setIsProgramReadable(other.isProgramReadable());
+ setIsProgramWritable(other.isProgramWritable());
+ setIsSave(other.isSave());
+ setIsOneTrigger(other.isOneTrigger());
+ setIsEventAssociated(other.isEventAssociated());
+ setResetType(other.getResetType());
+ return *this;
+}
+
+s32 FlagBase::clampValue_(const s32& min_value, s32* value, const s32& max_value) {
+ if (*value < min_value) {
+ *value = min_value;
+ return -1;
+ }
+ if (*value > max_value) {
+ *value = max_value;
+ return 1;
+ }
+ return 0;
+}
+
+s32 FlagBase::clampValue_(const f32& min_value, f32* value, const f32& max_value) {
+ if (*value < min_value) {
+ *value = min_value;
+ return -1;
+ }
+ if (*value > max_value) {
+ *value = max_value;
+ return 1;
+ }
+ return 0;
+}
+
+s32 FlagBase::clampValue_(const sead::SafeString&, sead::SafeString*, const sead::SafeString&) {
+ return 0;
+}
+
+namespace {
+template <typename T>
+constexpr s32 clampVectorComponentWise(const T& min_value, T* value, const T& max_value) {
+ s32 ret = 0;
+ for (size_t i = 0; i < min_value.e.size(); ++i) {
+ if (value->e[i] < min_value.e[i]) {
+ value->e[i] = min_value.e[i];
+ ret = -1;
+ }
+ }
+ for (size_t i = 0; i < max_value.e.size(); ++i) {
+ if (value->e[i] > max_value.e[i]) {
+ value->e[i] = max_value.e[i];
+ ret = 1;
+ }
+ }
+ return ret;
+}
+} // namespace
+
+s32 FlagBase::clampValue_(const sead::Vector2f& min_value, sead::Vector2f* value,
+ const sead::Vector2f& max_value) {
+ return clampVectorComponentWise(min_value, value, max_value);
+}
+
+s32 FlagBase::clampValue_(const sead::Vector3f& min_value, sead::Vector3f* value,
+ const sead::Vector3f& max_value) {
+ return clampVectorComponentWise(min_value, value, max_value);
+}
+
+s32 FlagBase::clampValue_(const sead::Vector4f& min_value, sead::Vector4f* value,
+ const sead::Vector4f& max_value) {
+ return clampVectorComponentWise(min_value, value, max_value);
+}
+
+bool FlagBase::isBoolean_() const {
+ const auto type = getType();
+ return s32(type) == FlagType::Bool || s32(type) == FlagType::BoolArray;
+}
+
+u32 FlagBase::getCategoryForBool_(const void* data) const {
+ if (!isBoolean_())
+ return 0;
+ return *static_cast<const u8*>(data) >> 1;
+}
+
+void FlagBase::setCategoryForBool_(void* data, u32 category) const {
+ if (!isBoolean_())
+ return;
+
+ auto* ptr = static_cast<u8*>(data);
+ *ptr = (*ptr & 1) | 2 * category;
+}
+
+} // namespace ksys::gdt