diff --git a/MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs b/MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs
index 54680f2..da3a399 100644
--- a/MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs
+++ b/MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs
@@ -32,3 +32,33 @@ public class ModdedEnumOptionAttribute(string title, Type enumType, string[]? va
: throw new InvalidOperationException($"HolderOption for option \"{Title}\" with EnumType ${enumType.FullName} is not a ModdedEnumOption");
}
}
+
+///
+/// Generic attribute for creating an enum option.
+///
+/// An enum type.
+[AttributeUsage(AttributeTargets.Property)]
+public class ModdedEnumOptionAttribute(string title, string[]? values = null)
+ : ModdedOptionAttribute(title) where T : struct, Enum
+{
+ internal override IModdedOption CreateOption(object? value, PropertyInfo property)
+ {
+ var opt = new ModdedEnumOption(Title, (T)(value ?? 0), values);
+ return opt;
+ }
+
+ ///
+ public override void SetValue(object value)
+ {
+ var opt = HolderOption as ModdedEnumOption;
+ opt?.SetValue((int)value);
+ }
+
+ ///
+ public override object GetValue()
+ {
+ return HolderOption is ModdedEnumOption opt
+ ? Enum.ToObject(typeof(T), opt.Value)
+ : throw new InvalidOperationException($"HolderOption for option \"{Title}\" is not a ModdedEnumOption<{typeof(T).Name}>");
+ }
+}
diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs
index 3c6c84c..4a92267 100644
--- a/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs
+++ b/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs
@@ -35,9 +35,10 @@ public class ModdedEnumOption : ModdedOption
data.Title = StringName;
data.Type = global::OptionTypes.String;
- data.Values = values is null ?
- Enum.GetNames(enumType).Select(CustomStringName.CreateAndRegister).ToArray()
- : values.Select(CustomStringName.CreateAndRegister).ToArray();
+ data.Values = (values is null
+ ? Enum.GetNames(enumType)
+ : values)
+ .Select(CustomStringName.CreateAndRegister).ToArray();
data.Index = Value;
}
@@ -50,7 +51,7 @@ public class ModdedEnumOption : ModdedOption
stringOption.SetUpFromData(Data, 20);
stringOption.OnValueChanged = (Il2CppSystem.Action)ValueChanged;
- // SetUpFromData method doesnt work correctly so we must set the values manually
+ // SetUpFromData method doesn't work correctly so we must set the values manually
stringOption.Title = StringName;
stringOption.Values = (Data as StringGameSetting)?.Values ?? new Il2CppStructArray(0);
stringOption.Value = Value;
@@ -126,8 +127,9 @@ public class ModdedEnumOption : ModdedOption where T : struct, Enum
data.Title = StringName;
data.Type = global::OptionTypes.String;
data.Values = (values is null
- ? Enum.GetNames().Select(CustomStringName.CreateAndRegister)
- : values.Select(CustomStringName.CreateAndRegister)).ToArray();
+ ? Enum.GetNames()
+ : values)
+ .Select(CustomStringName.CreateAndRegister).ToArray();
data.Index = Convert.ToInt32(Value, NumberFormatInfo.InvariantInfo);
}