Big settings refactor
This commit is contained in:
@@ -42,21 +42,27 @@
|
||||
internal class NoSettingNameAttribute : RandomizerSpecificAttribute {
|
||||
public NoSettingNameAttribute() : base(null) { }
|
||||
|
||||
public NoSettingNameAttribute(RandomizerInstance[] randomizers) : base(randomizers) { }
|
||||
public NoSettingNameAttribute(params RandomizerInstance[] randomizers) : base(randomizers) { }
|
||||
}
|
||||
|
||||
internal class IgnoreSettingAttribute : RandomizerSpecificAttribute {
|
||||
public IgnoreSettingAttribute(params RandomizerInstance[] randomizers) : base(randomizers) { }
|
||||
}
|
||||
|
||||
[AttributeUsage(AttributeTargets.Field, AllowMultiple=true)]
|
||||
internal class AdditionalSettingAttribute : RandomizerSpecificAttribute {
|
||||
public AdditionalSettingAttribute(string setting) : base(null) {
|
||||
this.Setting = setting;
|
||||
public AdditionalSettingAttribute(params string[] settings) : base(null) {
|
||||
this.Settings = settings;
|
||||
}
|
||||
|
||||
public AdditionalSettingAttribute(RandomizerInstance[] randomizers, string setting) : base(randomizers) {
|
||||
this.Setting = setting;
|
||||
public AdditionalSettingAttribute(RandomizerInstance[] randomizers, params string[] settings) : base(randomizers) {
|
||||
this.Settings = settings;
|
||||
}
|
||||
|
||||
public string Setting { get; }
|
||||
public string[] Settings { get; }
|
||||
}
|
||||
|
||||
[AttributeUsage(AttributeTargets.Field, AllowMultiple=true)]
|
||||
internal class AddStartingItemsAttribute : RandomizerSpecificAttribute {
|
||||
public AddStartingItemsAttribute(params string[] items) : base(null) {
|
||||
this.Items = items;
|
||||
@@ -69,6 +75,7 @@
|
||||
public string[] Items { get; }
|
||||
}
|
||||
|
||||
[AttributeUsage(AttributeTargets.Property, AllowMultiple=true)]
|
||||
internal class RequiredSettingAttribute : RandomizerSpecificAttribute {
|
||||
public RequiredSettingAttribute(params object[] values) : base(null) {
|
||||
this.Values = values;
|
||||
@@ -81,6 +88,7 @@
|
||||
public object[] Values { get; }
|
||||
}
|
||||
|
||||
[AttributeUsage(AttributeTargets.Property, AllowMultiple=true)]
|
||||
internal class ForbiddenSettingAttribute : RandomizerSpecificAttribute {
|
||||
public ForbiddenSettingAttribute(params object[] values) : base(null) {
|
||||
this.Values = values;
|
||||
|
||||
@@ -13,11 +13,16 @@
|
||||
if (prop.Name == nameof(SeedSettings.PlayerName)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var value = prop.GetValue(settings) ?? throw new SettingsLookupException("settings.{0} not found", prop.Name);
|
||||
var valueFieldName = value.ToString() ?? throw new SettingsLookupException("settings.{0}.ToString() returned null", prop.Name);
|
||||
var fi = prop.PropertyType.GetField(valueFieldName, BindingFlags.Static | BindingFlags.Public)
|
||||
?? throw new SettingsLookupException("Could not get field info for value {0}.{1}", prop.PropertyType, valueFieldName);
|
||||
|
||||
if (prop.GetCustomAttributes<IgnoreSettingAttribute>().Any(att => att.HasRandomizer(randomizer))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!prop.GetCustomAttributes<NoSettingNameAttribute>().Any(att => att.HasRandomizer(randomizer))) {
|
||||
var settingName =
|
||||
prop.GetCustomAttributes<SettingNameAttribute>()
|
||||
@@ -30,7 +35,9 @@
|
||||
}
|
||||
|
||||
foreach (var att in fi.GetCustomAttributes<AdditionalSettingAttribute>().Where(att => att.HasRandomizer(randomizer))) {
|
||||
yield return att.Setting;
|
||||
foreach (var setting in att.Settings) {
|
||||
yield return setting;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var att in fi.GetCustomAttributes<AddStartingItemsAttribute>().Where(att => att.HasRandomizer(randomizer))) {
|
||||
@@ -79,11 +86,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
public class SettingsLookupException : Exception {
|
||||
public SettingsLookupException(string message, params object?[] args) : base(string.Format(message, args)) { }
|
||||
}
|
||||
public class SettingsLookupException(string message, params object?[] args) : Exception(string.Format(message, args)) { }
|
||||
|
||||
public class InvalidSettingsException : Exception {
|
||||
public InvalidSettingsException(string message, params object?[] args) : base(string.Format(message, args)) { }
|
||||
}
|
||||
public class InvalidSettingsException(string message, params object?[] args) : Exception(string.Format(message, args)) { }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user