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."); + } +}