diff --git a/MiraAPI/GameOptions/Attributes/ModdedEnumOptionListAttribute.cs b/MiraAPI/GameOptions/Attributes/ModdedEnumOptionListAttribute.cs
new file mode 100644
index 0000000..c8ec447
--- /dev/null
+++ b/MiraAPI/GameOptions/Attributes/ModdedEnumOptionListAttribute.cs
@@ -0,0 +1,67 @@
+using MiraAPI.GameOptions.OptionTypes;
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace MiraAPI.GameOptions.Attributes;
+
+///
+/// Attribute for creating a list of enum options.
+///
+[AttributeUsage(AttributeTargets.Property)]
+public class ModdedEnumOptionListAttribute(Func titler, Type enumType, string[]? values = null)
+ : ModdedOptionListAttribute(titler)
+{
+ internal override IModdedOptionList CreateOptionList(IList value, PropertyInfo property)
+ {
+ var optList = new ModdedOptionList(
+ value.Count, idx => new(Titler(idx), (int)(value[idx] ?? 0), enumType, values));
+ return optList;
+ }
+
+ ///
+ public override void SetValue(int idx, object value)
+ {
+ var opt = HolderOptionList?[idx] as ModdedEnumOption;
+ opt?.SetValue((int)value);
+ }
+
+ ///
+ public override object GetValue(int idx)
+ {
+ return HolderOptionList?[idx] is ModdedEnumOption opt
+ ? Enum.ToObject(enumType, opt.Value)
+ : throw new InvalidOperationException($"HolderOption for option \"{Titler(idx)}\" with EnumType ${enumType.FullName} is not a ModdedEnumOption");
+ }
+}
+
+///
+/// Attribute for creating a list of enum options.
+///
+/// The enum type.
+[AttributeUsage(AttributeTargets.Property)]
+public class ModdedEnumOptionListAttribute(Func titler, string[]? values = null)
+ : ModdedOptionListAttribute(titler) where T : Enum
+{
+ internal override IModdedOptionList CreateOptionList(IList value, PropertyInfo property)
+ {
+ var optList = new ModdedOptionList>(
+ value.Count, idx => new(Titler(idx), (T)(value[idx] ?? 0), values));
+ return optList;
+ }
+
+ ///
+ public override void SetValue(int idx, object value)
+ {
+ var opt = HolderOptionList?[idx] as ModdedEnumOption;
+ opt?.SetValue((T)value);
+ }
+
+ ///
+ public override object GetValue(int idx)
+ {
+ return HolderOptionList?[idx] is ModdedEnumOption opt
+ ? opt.Value
+ : throw new InvalidOperationException($"HolderOption for option \"{Titler(idx)}\" with EnumType ${typeof(T).FullName} is not a ModdedEnumOption");
+ }
+}
diff --git a/MiraAPI/GameOptions/Attributes/ModdedNumberOptionListAttribute.cs b/MiraAPI/GameOptions/Attributes/ModdedNumberOptionListAttribute.cs
new file mode 100644
index 0000000..18d7f37
--- /dev/null
+++ b/MiraAPI/GameOptions/Attributes/ModdedNumberOptionListAttribute.cs
@@ -0,0 +1,55 @@
+using MiraAPI.GameOptions.OptionTypes;
+using MiraAPI.Utilities;
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace MiraAPI.GameOptions.Attributes;
+
+///
+/// A number option attribute for the modded options system.
+///
+[AttributeUsage(AttributeTargets.Property)]
+public class ModdedNumberOptionListAttribute(
+ Func titler,
+ float min,
+ float max,
+ float increment = 1,
+ MiraNumberSuffixes suffixType = MiraNumberSuffixes.None,
+ string? formatString = null,
+ bool zeroInfinity = false)
+ : ModdedOptionListAttribute(titler)
+{
+ internal override IModdedOptionList CreateOptionList(IList value, PropertyInfo property)
+ {
+ return new ModdedOptionList(value.Count, idx =>
+ {
+ return new(
+ Titler(idx),
+ (float)(value[idx] ?? min + increment),
+ min,
+ max,
+ increment,
+ suffixType,
+ formatString,
+ zeroInfinity);
+ });
+ }
+
+ ///
+ public override void SetValue(int idx, object value)
+ {
+ var opt = HolderOptionList?[idx] as ModdedNumberOption;
+ opt?.SetValue((float)value);
+ }
+
+ ///
+ public override object GetValue(int idx)
+ {
+ if (HolderOptionList?[idx] is ModdedNumberOption opt)
+ {
+ return opt.Value;
+ }
+ throw new InvalidOperationException($"HolderOption for option \"{Titler(idx)}\" is not a ModdedNumberOption");
+ }
+}
diff --git a/MiraAPI/GameOptions/Attributes/ModdedToggleOptionListAttribute.cs b/MiraAPI/GameOptions/Attributes/ModdedToggleOptionListAttribute.cs
new file mode 100644
index 0000000..7e34080
--- /dev/null
+++ b/MiraAPI/GameOptions/Attributes/ModdedToggleOptionListAttribute.cs
@@ -0,0 +1,38 @@
+using MiraAPI.GameOptions.OptionTypes;
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace MiraAPI.GameOptions.Attributes;
+
+///
+/// Attribute for a list of toggle options.
+///
+/// The function to get each option's title.
+[AttributeUsage(AttributeTargets.Property)]
+public class ModdedToggleOptionListAttribute(Func titler) : ModdedOptionListAttribute(titler)
+{
+ internal override IModdedOptionList CreateOptionList(IList value, PropertyInfo property)
+ {
+ var optList = new ModdedOptionList(
+ value.Count, idx => new(Titler(idx), (bool)(value[idx] ?? false)));
+ return optList;
+ }
+
+ ///
+ public override void SetValue(int idx, object value)
+ {
+ var opt = HolderOptionList?[idx] as ModdedToggleOption;
+ opt?.SetValue((bool)value);
+ }
+
+ ///
+ public override object GetValue(int idx)
+ {
+ if (HolderOptionList?[idx] is ModdedToggleOption opt)
+ {
+ return opt.Value;
+ }
+ throw new InvalidOperationException($"Holder option for {Titler(idx)} is not a ModdedToggleOption.");
+ }
+}