Decompiled source of Devourer of Light v0.10.3

BepInEx/plugins/SkyLiN3.DevourerOfLight/SkyLiN3.DevourerOfLight.dll

Decompiled 4 days ago
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Threading;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HowToFish.BossMaker;
using Microsoft.CodeAnalysis;
using SkyLiN3.Configuration;
using UnityEngine;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: InternalsVisibleTo("BossMakerAPI.Tests")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("SkyLiN3")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Host edits affect new catches and bosses; active bosses keep their balance. Clients edit local preferences. Valid legacy values outside menu ranges are retained until edited. Check the log for update status.")]
[assembly: AssemblyFileVersion("0.10.3.0")]
[assembly: AssemblyInformationalVersion("0.10.3")]
[assembly: AssemblyProduct("Devourer of Light")]
[assembly: AssemblyTitle("SkyLiN3.DevourerOfLight")]
[assembly: AssemblyVersion("0.2.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace SkyLiN3.Configuration
{
	internal sealed class MenuValueRange<T> : AcceptableValueBase where T : struct, IComparable
	{
		private readonly double _minimum;

		private readonly double _maximum;

		private readonly double _step;

		private bool _quantizationEnabled;

		public T MinValue { get; }

		public T MaxValue { get; }

		internal AcceptableValueBase TechnicalRange { get; }

		internal MenuValueRange(T minimum, T maximum, AcceptableValueBase technicalRange, double step = 0.0)
			: base(typeof(T))
		{
			if (!IsNumericType(typeof(T)))
			{
				throw new ArgumentException("Menu ranges require a supported numeric type.");
			}
			TechnicalRange = technicalRange ?? throw new ArgumentNullException("technicalRange");
			if (technicalRange.ValueType != typeof(T))
			{
				throw new ArgumentException("The technical range must validate the same value type.", "technicalRange");
			}
			_minimum = Convert.ToDouble(minimum, CultureInfo.InvariantCulture);
			_maximum = Convert.ToDouble(maximum, CultureInfo.InvariantCulture);
			if (!IsFinite(_minimum) || !IsFinite(_maximum) || !IsFinite(_maximum - _minimum) || _maximum <= _minimum || !technicalRange.IsValid((object)minimum) || !technicalRange.IsValid((object)maximum))
			{
				throw new ArgumentException("Menu endpoints must be finite, ordered and technically valid.");
			}
			if (!IsFinite(step) || step < 0.0 || step > _maximum - _minimum || (step > 0.0 && !IsFinite((_maximum - _minimum) / step)) || (IsIntegralType(typeof(T)) && step != Math.Truncate(step)))
			{
				throw new ArgumentOutOfRangeException("step", "The step must be finite, nonnegative and fit the menu range and value type.");
			}
			MinValue = minimum;
			MaxValue = maximum;
			_step = step;
		}

		internal void EnableQuantization()
		{
			_quantizationEnabled = true;
		}

		public override object Clamp(object value)
		{
			object obj = TechnicalRange.Clamp(value);
			if (!_quantizationEnabled || _step == 0.0 || !(obj is T))
			{
				return obj;
			}
			double num = Convert.ToDouble(obj, CultureInfo.InvariantCulture);
			if (!IsFinite(num) || num < _minimum || num > _maximum)
			{
				return obj;
			}
			double val = _minimum + Math.Round((num - _minimum) / _step, MidpointRounding.AwayFromZero) * _step;
			val = Math.Max(_minimum, Math.Min(_maximum, val));
			object obj2 = Convert.ChangeType(val, typeof(T), CultureInfo.InvariantCulture);
			return TechnicalRange.Clamp(obj2);
		}

		public override bool IsValid(object value)
		{
			return TechnicalRange.IsValid(value);
		}

		public override string ToDescriptionString()
		{
			return TechnicalRange.ToDescriptionString() + "\n# Suggested menu range: " + Convert.ToString(MinValue, CultureInfo.InvariantCulture) + " to " + Convert.ToString(MaxValue, CultureInfo.InvariantCulture) + ". Technically valid saved values outside this range are preserved.";
		}

		private static bool IsFinite(double value)
		{
			if (!double.IsNaN(value))
			{
				return !double.IsInfinity(value);
			}
			return false;
		}

		private static bool IsIntegralType(Type type)
		{
			if (!(type == typeof(byte)) && !(type == typeof(short)) && !(type == typeof(int)))
			{
				return type == typeof(long);
			}
			return true;
		}

		private static bool IsNumericType(Type type)
		{
			if (!IsIntegralType(type) && !(type == typeof(float)) && !(type == typeof(double)))
			{
				return type == typeof(decimal);
			}
			return true;
		}
	}
	internal sealed class MenuValueChoices<T> : AcceptableValueBase
	{
		private readonly T[] _choices;

		private readonly AcceptableValueBase? _technicalValidation;

		public T[] AcceptableValues => (T[])_choices.Clone();

		internal MenuValueChoices(T[] choices, AcceptableValueBase? technicalValidation = null)
			: base(typeof(T))
		{
			if (choices == null)
			{
				throw new ArgumentNullException("choices");
			}
			if (choices.Length == 0 || choices.Length > 256)
			{
				throw new ArgumentException("Supply between 1 and 256 menu choices.", "choices");
			}
			if (technicalValidation != null && technicalValidation.ValueType != typeof(T))
			{
				throw new ArgumentException("Technical validation must use the same value type.", "technicalValidation");
			}
			HashSet<T> hashSet = new HashSet<T>();
			foreach (T val in choices)
			{
				if (val == null || !hashSet.Add(val) || (val is float f && (float.IsNaN(f) || float.IsInfinity(f))) || (val is double d && (double.IsNaN(d) || double.IsInfinity(d))) || (technicalValidation != null && !technicalValidation.IsValid((object)val)))
				{
					throw new ArgumentException("Menu choices must be non-null, distinct and technically valid.", "choices");
				}
			}
			_choices = (T[])choices.Clone();
			_technicalValidation = technicalValidation;
		}

		public override object Clamp(object value)
		{
			if (_technicalValidation != null)
			{
				return _technicalValidation.Clamp(value);
			}
			if (!(value is T))
			{
				throw new ArgumentException("Unexpected configuration value type.", "value");
			}
			return value;
		}

		public override bool IsValid(object value)
		{
			AcceptableValueBase? technicalValidation = _technicalValidation;
			if (technicalValidation == null)
			{
				return value is T;
			}
			return technicalValidation.IsValid(value);
		}

		public override string ToDescriptionString()
		{
			AcceptableValueBase? technicalValidation = _technicalValidation;
			return (((technicalValidation != null) ? technicalValidation.ToDescriptionString() : null) ?? "# Values use the setting's own runtime validation.") + "\n# Suggested menu choices: " + string.Join(", ", Array.ConvertAll(_choices, (T value) => Convert.ToString(value, CultureInfo.InvariantCulture))) + ". Saved values outside this list are preserved by the technical validation policy.";
		}
	}
}
namespace HowToFish.ElDevoraluz
{
	internal sealed class DevoraluzAbilityDamageSetting
	{
		internal string AbilityId { get; }

		internal string ActionId { get; }

		internal string ConfigKey { get; }

		internal string DisplayName { get; }

		internal int DefaultDamage { get; }

		internal bool IsPeriodic { get; }

		internal DevoraluzAbilityDamageSetting(string abilityId, string actionId, string configKey, string displayName, int defaultDamage, bool isPeriodic)
		{
			AbilityId = abilityId;
			ActionId = actionId;
			ConfigKey = configKey;
			DisplayName = displayName;
			DefaultDamage = defaultDamage;
			IsPeriodic = isPeriodic;
		}
	}
	internal sealed class DevoraluzBalanceSettings
	{
		internal const int DefaultBaseHealth = 18000;

		internal const int MinimumBaseHealth = 100;

		internal const int MaximumBaseHealth = 1000000;

		internal const float DefaultContactDamageMultiplier = 1.35f;

		internal const float MinimumContactDamageMultiplier = 0.1f;

		internal const float MaximumContactDamageMultiplier = 10f;

		internal const float DefaultAbilityDamageMultiplier = 1f;

		internal const float MinimumAbilityDamageMultiplier = 0.1f;

		internal const float MaximumAbilityDamageMultiplier = 10f;

		internal const int MinimumAbilityDamage = 1;

		internal const int MaximumAbilityDamage = 1000;

		internal const int MaximumScaledAbilityDamage = 10000;

		internal static IReadOnlyList<DevoraluzAbilityDamageSetting> AbilityDamageSettings { get; } = Array.AsReadOnly(new DevoraluzAbilityDamageSetting[10]
		{
			new DevoraluzAbilityDamageSetting("acecho_del_farol", "acecho-mordida", "LanternStalk", "Lantern Stalk", 16, isPeriodic: false),
			new DevoraluzAbilityDamageSetting("arpon_abismal", "arpon-impacto", "AbyssalHarpoon", "Abyssal Harpoon", 25, isPeriodic: false),
			new DevoraluzAbilityDamageSetting("latigazo_de_luz", "latigazo-damage", "LightLash", "Light Lash", 18, isPeriodic: false),
			new DevoraluzAbilityDamageSetting("caceria_cruzada", "caceria-cruzada-damage", "CrossHunt", "Cross Hunt", 8, isPeriodic: true),
			new DevoraluzAbilityDamageSetting("embestida_voltaica", "voltaica-damage", "VoltaicCharge", "Voltaic Charge", 23, isPeriodic: false),
			new DevoraluzAbilityDamageSetting("marea_de_bilis", "bilis-ticks", "BileTide", "Bile Tide", 7, isPeriodic: true),
			new DevoraluzAbilityDamageSetting("estela_venenosa", "estela-ticks", "VenomousWake", "Venomous Wake", 6, isPeriodic: true),
			new DevoraluzAbilityDamageSetting("apagon_embestida", "apagon-damage", "BlackoutCharge", "Blackout Charge", 34, isPeriodic: false),
			new DevoraluzAbilityDamageSetting("triple_eclipse", "eclipse-damage", "TripleEclipse", "Triple Eclipse", 29, isPeriodic: false),
			new DevoraluzAbilityDamageSetting("mordida_sin_luz", "mordida-damage", "LightlessBite", "Lightless Bite", 31, isPeriodic: false)
		});

		internal static DevoraluzBalanceSettings Default { get; } = new DevoraluzBalanceSettings(18000, 1.35f, 1f);

		internal int BaseHealth { get; }

		internal float ContactDamageMultiplier { get; }

		internal float AbilityDamageMultiplier { get; }

		internal IReadOnlyDictionary<string, int> AbilityDamages { get; }

		internal DevoraluzBalanceSettings(int baseHealth, float contactDamageMultiplier, float abilityDamageMultiplier, IReadOnlyDictionary<string, int>? abilityDamages = null)
		{
			if (baseHealth < 100 || baseHealth > 1000000)
			{
				throw new ArgumentOutOfRangeException("baseHealth", baseHealth, $"Base health must be between {100} and {1000000}.");
			}
			ValidateMultiplier(contactDamageMultiplier, 0.1f, 10f, "contactDamageMultiplier");
			ValidateMultiplier(abilityDamageMultiplier, 0.1f, 10f, "abilityDamageMultiplier");
			Dictionary<string, int> dictionary = new Dictionary<string, int>(StringComparer.Ordinal);
			foreach (DevoraluzAbilityDamageSetting abilityDamageSetting in AbilityDamageSettings)
			{
				dictionary.Add(abilityDamageSetting.AbilityId, abilityDamageSetting.DefaultDamage);
			}
			if (abilityDamages != null)
			{
				foreach (KeyValuePair<string, int> abilityDamage in abilityDamages)
				{
					if (abilityDamage.Key == null || !dictionary.ContainsKey(abilityDamage.Key))
					{
						throw new ArgumentException("Unknown ability damage key: '" + abilityDamage.Key + "'.", "abilityDamages");
					}
					if (abilityDamage.Value < 1 || abilityDamage.Value > 1000)
					{
						throw new ArgumentOutOfRangeException("abilityDamages", abilityDamage.Value, $"Damage for '{abilityDamage.Key}' must be between {1} and {1000}.");
					}
					dictionary[abilityDamage.Key] = abilityDamage.Value;
				}
			}
			BaseHealth = baseHealth;
			ContactDamageMultiplier = contactDamageMultiplier;
			AbilityDamageMultiplier = abilityDamageMultiplier;
			AbilityDamages = new ReadOnlyDictionary<string, int>(dictionary);
		}

		internal int GetDamage(string abilityId)
		{
			if (abilityId == null)
			{
				throw new ArgumentNullException("abilityId");
			}
			if (!AbilityDamages.TryGetValue(abilityId, out var value))
			{
				throw new ArgumentException("Unknown ability damage key: '" + abilityId + "'.", "abilityId");
			}
			double num = Math.Max(1.0, Math.Round((double)value * (double)AbilityDamageMultiplier, MidpointRounding.AwayFromZero));
			if (double.IsNaN(num) || double.IsInfinity(num) || num > 10000.0)
			{
				throw new InvalidOperationException("Effective ability damage exceeds its validated bound.");
			}
			return (int)num;
		}

		private static void ValidateMultiplier(float value, float minimum, float maximum, string parameter)
		{
			if (float.IsNaN(value) || float.IsInfinity(value) || value < minimum || value > maximum)
			{
				throw new ArgumentOutOfRangeException(parameter, value, $"Damage multiplier must be finite and between {minimum} and {maximum}.");
			}
		}
	}
	internal sealed class DevoraluzStartupSettings
	{
		internal float SpawnProbability { get; }

		internal DevoraluzBalanceSettings Balance { get; }

		internal DevoraluzStartupSettings(float spawnProbability, DevoraluzBalanceSettings balance)
		{
			if (float.IsNaN(spawnProbability) || float.IsInfinity(spawnProbability) || spawnProbability < 0f || spawnProbability > 1f)
			{
				throw new ArgumentOutOfRangeException("spawnProbability");
			}
			SpawnProbability = spawnProbability;
			Balance = balance ?? throw new ArgumentNullException("balance");
		}
	}
	internal sealed class DevoraluzConfigBinding : IDisposable
	{
		private readonly ConfigFile _config;

		private readonly Action<string> _warning;

		private readonly IDisposable _diagnostics;

		private readonly HashSet<ConfigDefinition> _ownedDefinitions;

		private bool _disposed;

		private int _revision;

		internal DevoraluzStartupSettings Startup { get; }

		internal int Revision => Volatile.Read(in _revision);

		internal ConfigEntry<float> SpawnChancePercent { get; }

		internal ConfigEntry<int> BaseHealth { get; }

		internal ConfigEntry<string> ContactDamageMultiplier { get; }

		internal ConfigEntry<string> AbilityDamageMultiplier { get; }

		internal IReadOnlyDictionary<string, ConfigEntry<int>> AbilityDamages { get; }

		internal DevoraluzConfigBinding(ConfigFile config, Action<string> warning, ConfigEntry<float> spawnChancePercent, ConfigEntry<int> baseHealth, ConfigEntry<string> contactDamageMultiplier, ConfigEntry<string> abilityDamageMultiplier, IDictionary<string, ConfigEntry<int>> abilityDamages, IDisposable diagnostics)
		{
			_config = config ?? throw new ArgumentNullException("config");
			_warning = warning ?? throw new ArgumentNullException("warning");
			_diagnostics = diagnostics ?? throw new ArgumentNullException("diagnostics");
			SpawnChancePercent = spawnChancePercent ?? throw new ArgumentNullException("spawnChancePercent");
			BaseHealth = baseHealth ?? throw new ArgumentNullException("baseHealth");
			ContactDamageMultiplier = contactDamageMultiplier ?? throw new ArgumentNullException("contactDamageMultiplier");
			AbilityDamageMultiplier = abilityDamageMultiplier ?? throw new ArgumentNullException("abilityDamageMultiplier");
			if (abilityDamages == null)
			{
				throw new ArgumentNullException("abilityDamages");
			}
			AbilityDamages = new ReadOnlyDictionary<string, ConfigEntry<int>>(new Dictionary<string, ConfigEntry<int>>(abilityDamages, StringComparer.Ordinal));
			_ownedDefinitions = new HashSet<ConfigDefinition>
			{
				((ConfigEntryBase)SpawnChancePercent).Definition,
				((ConfigEntryBase)BaseHealth).Definition,
				((ConfigEntryBase)ContactDamageMultiplier).Definition,
				((ConfigEntryBase)AbilityDamageMultiplier).Definition
			};
			foreach (ConfigEntry<int> value in AbilityDamages.Values)
			{
				_ownedDefinitions.Add(((ConfigEntryBase)value).Definition);
			}
			Startup = CaptureSnapshot();
			_config.SettingChanged += OnSettingChanged;
		}

		internal bool TryCaptureLiveSnapshot(out DevoraluzStartupSettings? snapshot)
		{
			snapshot = null;
			if (_disposed)
			{
				return false;
			}
			if (!IsValidRatio(ContactDamageMultiplier, 0.1f, 10f) || !IsValidRatio(AbilityDamageMultiplier, 0.1f, 10f))
			{
				_warning("Live settings were not applied: damage multipliers must be finite decimal-point numbers from 0.1 to 10. The last accepted settings remain in use; correct the text to retry.");
				return false;
			}
			snapshot = CaptureSnapshot();
			return true;
		}

		private static bool IsValidRatio(ConfigEntry<string> entry, float minimum, float maximum)
		{
			if (float.TryParse(entry.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out var result) && !float.IsNaN(result) && !float.IsInfinity(result) && result >= minimum)
			{
				return result <= maximum;
			}
			return false;
		}

		internal DevoraluzStartupSettings CaptureSnapshot()
		{
			float num = SpawnChancePercent.Value;
			if (float.IsNaN(num) || float.IsInfinity(num))
			{
				WarnDefault(((ConfigEntryBase)SpawnChancePercent).Definition, 12f);
				num = 12f;
			}
			num = Math.Max(0f, Math.Min(100f, num));
			int baseHealth = ReadInteger(BaseHealth, 100, 1000000, 18000);
			float contactDamageMultiplier = ReadRatio(ContactDamageMultiplier, 0.1f, 10f, 1.35f);
			float abilityDamageMultiplier = ReadRatio(AbilityDamageMultiplier, 0.1f, 10f, 1f);
			Dictionary<string, int> dictionary = new Dictionary<string, int>(StringComparer.Ordinal);
			foreach (DevoraluzAbilityDamageSetting abilityDamageSetting in DevoraluzBalanceSettings.AbilityDamageSettings)
			{
				dictionary.Add(abilityDamageSetting.AbilityId, ReadInteger(AbilityDamages[abilityDamageSetting.AbilityId], 1, 1000, abilityDamageSetting.DefaultDamage));
			}
			return new DevoraluzStartupSettings(DevoraluzConfiguration.ToProbability(num), new DevoraluzBalanceSettings(baseHealth, contactDamageMultiplier, abilityDamageMultiplier, dictionary));
		}

		private int ReadInteger(ConfigEntry<int> entry, int minimum, int maximum, int fallback)
		{
			int value = entry.Value;
			if (value >= minimum && value <= maximum)
			{
				return value;
			}
			WarnDefault(((ConfigEntryBase)entry).Definition, fallback);
			return fallback;
		}

		private float ReadRatio(ConfigEntry<string> entry, float minimum, float maximum, float fallback)
		{
			if (float.TryParse(entry.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out var result) && !float.IsNaN(result) && !float.IsInfinity(result) && result >= minimum && result <= maximum)
			{
				return result;
			}
			WarnDefault(((ConfigEntryBase)entry).Definition, fallback);
			return fallback;
		}

		private void WarnDefault(ConfigDefinition definition, IFormattable fallback)
		{
			_warning(definition.Section + "/" + definition.Key + " is invalid, non-finite or outside its supported range; the published default " + fallback.ToString(null, CultureInfo.InvariantCulture) + " will be used for this snapshot. The stored entry was not rewritten. Use a decimal point, no quotes and no thousands separator for multipliers.");
		}

		private void OnSettingChanged(object sender, SettingChangedEventArgs args)
		{
			if (!_disposed && _ownedDefinitions.Contains(args.ChangedSetting.Definition))
			{
				Interlocked.Increment(ref _revision);
			}
		}

		public void Dispose()
		{
			if (!_disposed)
			{
				_disposed = true;
				_config.SettingChanged -= OnSettingChanged;
				_diagnostics.Dispose();
			}
		}
	}
	internal sealed class DevoraluzConfigDiagnosticSink : IDisposable
	{
		private Action<string>? _warning;

		internal DevoraluzConfigDiagnosticSink(Action<string> warning)
		{
			_warning = warning ?? throw new ArgumentNullException("warning");
		}

		internal void Report(string message)
		{
			_warning?.Invoke(message);
		}

		public void Dispose()
		{
			_warning = null;
		}
	}
	internal sealed class DevoraluzConfigMigration
	{
		private readonly ConfigFile _config;

		private readonly Action<string> _warning;

		private readonly Dictionary<ConfigDefinition, string> _stored;

		private readonly List<ConfigDefinition> _legacy = new List<ConfigDefinition>();

		internal DevoraluzConfigMigration(ConfigFile config, Action<string> warning)
		{
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Expected O, but got Unknown
			_config = config;
			_warning = warning;
			_stored = ParseStoredEntries(File.Exists(config.ConfigFilePath) ? ((IEnumerable<string>)File.ReadAllLines(config.ConfigFilePath)) : ((IEnumerable<string>)Array.Empty<string>()));
			foreach (KeyValuePair<ConfigDefinition, ConfigEntryBase> item in config)
			{
				_stored[item.Key] = item.Value.GetSerializedValue();
			}
			foreach (DevoraluzAbilityDamageSetting abilityDamageSetting in DevoraluzBalanceSettings.AbilityDamageSettings)
			{
				ConfigDefinition val = new ConfigDefinition("AbilityDamage", abilityDamageSetting.AbilityId);
				if (_stored.ContainsKey(val))
				{
					_legacy.Add(val);
				}
			}
			if (_legacy.Count > 0 && config.SaveOnConfigSet && File.Exists(config.ConfigFilePath))
			{
				string text = config.ConfigFilePath + ".pre-0.10.0.bak";
				if (!File.Exists(text))
				{
					File.Copy(config.ConfigFilePath, text, overwrite: false);
				}
				_warning("English configuration keys are being migrated. The original CFG backup is '" + text + "'.");
			}
		}

		internal int? LegacyValue(DevoraluzAbilityDamageSetting setting)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			string text = "AbilityDamage";
			if (_stored.ContainsKey(new ConfigDefinition(text, setting.ConfigKey)))
			{
				return null;
			}
			if (!_stored.TryGetValue(new ConfigDefinition(text, setting.AbilityId), out string value))
			{
				return null;
			}
			if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result))
			{
				return Math.Max(1, Math.Min(1000, result));
			}
			_warning("Legacy damage setting for " + setting.DisplayName + " is not an integer; its published default will be used. The original text remains in the source CFG or its migration backup.");
			return null;
		}

		internal void Complete()
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			foreach (ConfigDefinition item in _legacy)
			{
				_config.Remove(item);
				_config.Bind<string>(item, string.Empty, new ConfigDescription("Legacy migration only.", (AcceptableValueBase)null, Array.Empty<object>()));
				_config.Remove(item);
			}
		}

		internal static Dictionary<ConfigDefinition, string> ParseStoredEntries(IEnumerable<string> lines)
		{
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Expected O, but got Unknown
			Dictionary<ConfigDefinition, string> dictionary = new Dictionary<ConfigDefinition, string>();
			string text = string.Empty;
			foreach (string line in lines)
			{
				string text2 = line.Trim();
				if (text2.StartsWith("#", StringComparison.Ordinal))
				{
					continue;
				}
				if (text2.StartsWith("[", StringComparison.Ordinal) && text2.EndsWith("]", StringComparison.Ordinal))
				{
					text = text2.Substring(1, text2.Length - 2);
					continue;
				}
				int num = text2.IndexOf('=');
				if (num >= 1 && text.Length != 0)
				{
					string text3 = text2.Substring(0, num).Trim();
					if (text3.Length != 0)
					{
						dictionary[new ConfigDefinition(text, text3)] = text2.Substring(num + 1).Trim();
					}
				}
			}
			return dictionary;
		}
	}
	internal static class DevoraluzConfiguration
	{
		private sealed class StrictRatioValidation : AcceptableValueBase
		{
			private readonly float _minimum;

			private readonly float _maximum;

			internal StrictRatioValidation(float minimum, float maximum)
				: base(typeof(string))
			{
				_minimum = minimum;
				_maximum = maximum;
			}

			public override object Clamp(object value)
			{
				return value;
			}

			public override bool IsValid(object value)
			{
				if (value is string s && float.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out var result) && !float.IsNaN(result) && !float.IsInfinity(result) && result >= _minimum)
				{
					return result <= _maximum;
				}
				return false;
			}

			public override string ToDescriptionString()
			{
				return "# Technical multiplier range: " + _minimum.ToString(CultureInfo.InvariantCulture) + " to " + _maximum.ToString(CultureInfo.InvariantCulture);
			}
		}

		private sealed class FiniteSpawnChanceRange : AcceptableValueRange<float>
		{
			private Action<string>? _warning;

			internal FiniteSpawnChanceRange(Action<string>? warning)
				: base(0f, 100f)
			{
				_warning = warning;
			}

			internal void SetWarning(Action<string>? warning)
			{
				_warning = warning;
			}

			public override object Clamp(object value)
			{
				if (value is float f && (float.IsNaN(f) || float.IsInfinity(f)))
				{
					_warning?.Invoke("Encounter/SpawnChancePercent is not finite; the published default of " + 12f.ToString(CultureInfo.InvariantCulture) + "% will be used. Finite values outside 0–100 retain the legacy clamp behavior.");
					return 12f;
				}
				return base.Clamp(value);
			}

			public override bool IsValid(object value)
			{
				if (value is float f && !float.IsNaN(f) && !float.IsInfinity(f))
				{
					return base.IsValid(value);
				}
				return false;
			}
		}

		internal const string EncounterSection = "Encounter";

		internal const string SpawnChancePercentKey = "SpawnChancePercent";

		internal const float MinimumSpawnChancePercent = 0f;

		internal const float MaximumSpawnChancePercent = 100f;

		internal const float DefaultSpawnChancePercent = 12f;

		internal const string StatsSection = "Stats";

		internal const string BaseHealthKey = "BaseHealth";

		internal const string ContactDamageMultiplierKey = "ContactDamageMultiplier";

		internal const string AbilityDamageSection = "AbilityDamage";

		internal const string GlobalMultiplierKey = "GlobalMultiplier";

		private const string LiveNotice = "Editable during gameplay through ModMenu or another BepInEx config editor. Host changes apply to future catches and newly spawned bosses after validation and synchronization; active bosses retain their current balance. Client edits change local preferences only: the host's effective settings still apply without overwriting this CFG. Check the log for accepted, queued or rejected status.";

		internal static DevoraluzConfigBinding Bind(ConfigFile config, Action<string> warning)
		{
			if (config == null)
			{
				throw new ArgumentNullException("config");
			}
			if (warning == null)
			{
				throw new ArgumentNullException("warning");
			}
			DevoraluzConfigDiagnosticSink devoraluzConfigDiagnosticSink = new DevoraluzConfigDiagnosticSink(warning);
			bool saveOnConfigSet = config.SaveOnConfigSet;
			try
			{
				DevoraluzConfigMigration devoraluzConfigMigration = new DevoraluzConfigMigration(config, warning);
				config.SaveOnConfigSet = false;
				DevoraluzConfigBinding devoraluzConfigBinding = BindCore(config, devoraluzConfigDiagnosticSink, devoraluzConfigMigration);
				try
				{
					devoraluzConfigMigration.Complete();
					if (((ConfigEntryBase)devoraluzConfigBinding.SpawnChancePercent).Description.AcceptableValues is MenuValueRange<float> menuValueRange)
					{
						menuValueRange.EnableQuantization();
					}
					if (saveOnConfigSet)
					{
						config.Save();
					}
					return devoraluzConfigBinding;
				}
				catch
				{
					devoraluzConfigBinding.Dispose();
					throw;
				}
			}
			catch
			{
				devoraluzConfigDiagnosticSink.Dispose();
				throw;
			}
			finally
			{
				config.SaveOnConfigSet = saveOnConfigSet;
			}
		}

		private static DevoraluzConfigBinding BindCore(ConfigFile config, DevoraluzConfigDiagnosticSink diagnostics, DevoraluzConfigMigration migration)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Expected O, but got Unknown
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Expected O, but got Unknown
			//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Expected O, but got Unknown
			Action<string> warning = diagnostics.Report;
			ConfigEntry<float> spawnChancePercent = BindSpawnChancePercentCore(config, warning);
			ConfigEntry<int> baseHealth = config.Bind<int>("Stats", "BaseHealth", 18000, new ConfigDescription("Base boss health before server difficulty scaling. Menu choices: 5,000–50,000 in steps of 500. Existing valid values outside the menu range are retained until you edit them. Editable during gameplay through ModMenu or another BepInEx config editor. Host changes apply to future catches and newly spawned bosses after validation and synchronization; active bosses retain their current balance. Client edits change local preferences only: the host's effective settings still apply without overwriting this CFG. Check the log for accepted, queued or rejected status.", (AcceptableValueBase)(object)new MenuValueChoices<int>(HealthChoices(), (AcceptableValueBase?)(object)new AcceptableValueRange<int>(100, 1000000)), Array.Empty<object>()));
			ConfigEntry<string> contactDamageMultiplier = config.Bind<string>("Stats", "ContactDamageMultiplier", 1.35f.ToString(CultureInfo.InvariantCulture), new ConfigDescription("Multiplier of the vanilla Anglerfish contact damage, before existing phase modifiers. " + StrictRatioDescription(0.1f, 10f, 1.35f), (AcceptableValueBase)(object)new MenuValueChoices<string>(MultiplierChoices(), (AcceptableValueBase?)(object)new StrictRatioValidation(0.1f, 10f)), Array.Empty<object>()));
			ConfigEntry<string> abilityDamageMultiplier = config.Bind<string>("AbilityDamage", "GlobalMultiplier", 1f.ToString(CultureInfo.InvariantCulture), new ConfigDescription("Multiplier applied once to the configured ability damage values in this section; does not change contact damage. " + StrictRatioDescription(0.1f, 10f, 1f), (AcceptableValueBase)(object)new MenuValueChoices<string>(MultiplierChoices(), (AcceptableValueBase?)(object)new StrictRatioValidation(0.1f, 10f)), Array.Empty<object>()));
			Dictionary<string, ConfigEntry<int>> dictionary = new Dictionary<string, ConfigEntry<int>>(StringComparer.Ordinal);
			foreach (DevoraluzAbilityDamageSetting abilityDamageSetting in DevoraluzBalanceSettings.AbilityDamageSettings)
			{
				ConfigEntry<int> val = config.Bind<int>("AbilityDamage", abilityDamageSetting.ConfigKey, abilityDamageSetting.DefaultDamage, new ConfigDescription("Base damage " + (abilityDamageSetting.IsPeriodic ? "per damage tick" : "per hit") + " for " + abilityDamageSetting.DisplayName + ", before GlobalMultiplier and server difficulty scaling. This is not a guaranteed total across repeated hits or ticks. Editable during gameplay through ModMenu or another BepInEx config editor. Host changes apply to future catches and newly spawned bosses after validation and synchronization; active bosses retain their current balance. Client edits change local preferences only: the host's effective settings still apply without overwriting this CFG. Check the log for accepted, queued or rejected status.", (AcceptableValueBase)(object)new MenuValueRange<int>(1, abilityDamageSetting.IsPeriodic ? 30 : 100, (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 1000)), Array.Empty<object>()));
				int? num = migration.LegacyValue(abilityDamageSetting);
				if (num.HasValue)
				{
					val.Value = num.Value;
				}
				dictionary.Add(abilityDamageSetting.AbilityId, val);
			}
			return new DevoraluzConfigBinding(config, warning, spawnChancePercent, baseHealth, contactDamageMultiplier, abilityDamageMultiplier, dictionary, diagnostics);
		}

		internal static ConfigEntry<float> BindSpawnChancePercent(ConfigFile config)
		{
			return BindSpawnChancePercentCore(config, null);
		}

		private static ConfigEntry<float> BindSpawnChancePercentCore(ConfigFile config, Action<string>? warning)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Expected O, but got Unknown
			if (config == null)
			{
				throw new ArgumentNullException("config");
			}
			ConfigEntry<float> val = config.Bind<float>("Encounter", "SpawnChancePercent", 12f, new ConfigDescription("Chance from 0 to 100 that an eligible Anglerfish catch is replaced by Devourer of Light. Editable during gameplay through ModMenu or another BepInEx config editor. Host changes apply to future catches and newly spawned bosses after validation and synchronization; active bosses retain their current balance. Client edits change local preferences only: the host's effective settings still apply without overwriting this CFG. Check the log for accepted, queued or rejected status.", (AcceptableValueBase)(object)new MenuValueRange<float>(0f, 100f, (AcceptableValueBase)(object)new FiniteSpawnChanceRange(warning), 1.0), Array.Empty<object>()));
			if (((ConfigEntryBase)val).Description.AcceptableValues is FiniteSpawnChanceRange finiteSpawnChanceRange)
			{
				finiteSpawnChanceRange.SetWarning(warning);
			}
			else if (((ConfigEntryBase)val).Description.AcceptableValues is MenuValueRange<float> { TechnicalRange: FiniteSpawnChanceRange technicalRange })
			{
				technicalRange.SetWarning(warning);
			}
			return val;
		}

		internal static AcceptableValueRange<float> CreateSpawnChanceRange()
		{
			return (AcceptableValueRange<float>)(object)new FiniteSpawnChanceRange(null);
		}

		private static string StrictRatioDescription(float minimum, float maximum, float fallback)
		{
			return "Allowed range " + minimum.ToString(CultureInfo.InvariantCulture) + " to " + maximum.ToString(CultureInfo.InvariantCulture) + ". Use a decimal point and no quotes or thousands separator (example: " + fallback.ToString(CultureInfo.InvariantCulture) + "). Invalid, non-finite or out-of-range text uses the published default at startup. Invalid live edits are rejected without changing the last accepted balance or rewriting this entry. Menu choices run from 0.25 to 3 in steps of 0.05; existing valid values outside these choices are retained until edited. Editable during gameplay through ModMenu or another BepInEx config editor. Host changes apply to future catches and newly spawned bosses after validation and synchronization; active bosses retain their current balance. Client edits change local preferences only: the host's effective settings still apply without overwriting this CFG. Check the log for accepted, queued or rejected status.";
		}

		private static int[] HealthChoices()
		{
			int[] array = new int[91];
			for (int i = 0; i < array.Length; i++)
			{
				array[i] = 5000 + i * 500;
			}
			return array;
		}

		private static string[] MultiplierChoices()
		{
			string[] array = new string[56];
			for (int i = 0; i < array.Length; i++)
			{
				array[i] = (0.25m + (decimal)i * 0.05m).ToString("0.##", CultureInfo.InvariantCulture);
			}
			return array;
		}

		internal static float ToProbability(float percent)
		{
			if (float.IsNaN(percent) || float.IsInfinity(percent) || percent < 0f || percent > 100f)
			{
				throw new ArgumentOutOfRangeException("percent", percent, $"Spawn chance must be between {0f} and " + $"{100f} percent.");
			}
			return percent / 100f;
		}
	}
	internal static class DevoraluzDefinitionFactory
	{
		private readonly struct DevoraluzVisualReferences
		{
			internal GameObject? VisualPrefab { get; }

			internal GameObject? CyanImpact { get; }

			internal GameObject? ElectricWake { get; }

			internal GameObject? VenomField { get; }

			internal GameObject? BlackoutImpact { get; }

			internal DevoraluzVisualReferences(GameObject? visualPrefab, GameObject? cyanImpact, GameObject? electricWake, GameObject? venomField, GameObject? blackoutImpact)
			{
				VisualPrefab = visualPrefab;
				CyanImpact = cyanImpact;
				ElectricWake = electricWake;
				VenomField = venomField;
				BlackoutImpact = blackoutImpact;
			}
		}

		private const string WarmCorePath = "AuthorVisual/States/WarmCore";

		private const string SpinesPath = "AuthorVisual/States/Spines";

		private const string ElectricPath = "AuthorVisual/States/Electric";

		private const string VenomPath = "AuthorVisual/States/Venom";

		private const string BlackoutPath = "AuthorVisual/States/Blackout";

		internal static BossDefinition CreateMain(DevoraluzVisualAssets assets, float spawnProbability)
		{
			return CreateMain(assets, spawnProbability, DevoraluzBalanceSettings.Default);
		}

		internal static BossDefinition CreateMain(DevoraluzVisualAssets assets, float spawnProbability, DevoraluzBalanceSettings settings)
		{
			if (assets == null)
			{
				throw new ArgumentNullException("assets");
			}
			return CreateMain(new DevoraluzVisualReferences(assets.VisualPrefab, assets.CyanImpact, assets.ElectricWake, assets.VenomField, assets.BlackoutImpact), spawnProbability, settings);
		}

		internal static BossDefinition CreateMainForReleaseAudit()
		{
			return CreateMainForReleaseAudit(0.12f);
		}

		internal static BossDefinition CreateMainForReleaseAudit(float spawnProbability)
		{
			return CreateMainForReleaseAudit(spawnProbability, DevoraluzBalanceSettings.Default);
		}

		internal static BossDefinition CreateMainForReleaseAudit(float spawnProbability, DevoraluzBalanceSettings settings)
		{
			return CreateMain(default(DevoraluzVisualReferences), spawnProbability, settings);
		}

		private static BossDefinition CreateMain(DevoraluzVisualReferences assets, float spawnProbability, DevoraluzBalanceSettings settings)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected O, but got Unknown
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Expected O, but got Unknown
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Expected O, but got Unknown
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Expected O, but got Unknown
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Expected O, but got Unknown
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cd: Expected O, but got Unknown
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Expected O, but got Unknown
			//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021f: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Unknown result type (might be due to invalid IL or missing references)
			//IL_0240: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			//IL_0253: Expected O, but got Unknown
			//IL_025c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0261: Unknown result type (might be due to invalid IL or missing references)
			//IL_026c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0277: Unknown result type (might be due to invalid IL or missing references)
			//IL_027e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0289: Unknown result type (might be due to invalid IL or missing references)
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_0297: Unknown result type (might be due to invalid IL or missing references)
			//IL_029e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02da: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0306: Unknown result type (might be due to invalid IL or missing references)
			//IL_0312: Expected O, but got Unknown
			//IL_0313: Expected O, but got Unknown
			//IL_0337: Unknown result type (might be due to invalid IL or missing references)
			//IL_033c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0347: Unknown result type (might be due to invalid IL or missing references)
			//IL_0367: Unknown result type (might be due to invalid IL or missing references)
			//IL_0380: Unknown result type (might be due to invalid IL or missing references)
			//IL_043d: Expected O, but got Unknown
			//IL_0450: Unknown result type (might be due to invalid IL or missing references)
			//IL_0455: Unknown result type (might be due to invalid IL or missing references)
			//IL_0475: Unknown result type (might be due to invalid IL or missing references)
			//IL_048e: Unknown result type (might be due to invalid IL or missing references)
			//IL_049b: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_04bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_04cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_04dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_04fe: Expected O, but got Unknown
			//IL_0538: Unknown result type (might be due to invalid IL or missing references)
			//IL_053d: Unknown result type (might be due to invalid IL or missing references)
			//IL_055b: Expected O, but got Unknown
			//IL_055b: Expected O, but got Unknown
			//IL_056a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0570: Expected O, but got Unknown
			//IL_05db: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_05eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_05f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_05fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_060d: Unknown result type (might be due to invalid IL or missing references)
			//IL_061e: Expected O, but got Unknown
			//IL_0680: Unknown result type (might be due to invalid IL or missing references)
			//IL_0685: Unknown result type (might be due to invalid IL or missing references)
			//IL_0690: Unknown result type (might be due to invalid IL or missing references)
			//IL_06b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0786: Expected O, but got Unknown
			//IL_0799: Unknown result type (might be due to invalid IL or missing references)
			//IL_079e: Unknown result type (might be due to invalid IL or missing references)
			//IL_07a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_07c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_07e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_086f: Expected O, but got Unknown
			//IL_0879: Unknown result type (might be due to invalid IL or missing references)
			//IL_087f: Expected O, but got Unknown
			//IL_08d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_08dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_08e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_08f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_08f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0909: Unknown result type (might be due to invalid IL or missing references)
			//IL_0919: Unknown result type (might be due to invalid IL or missing references)
			//IL_0929: Unknown result type (might be due to invalid IL or missing references)
			//IL_093a: Expected O, but got Unknown
			//IL_09dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_09e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_09ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a0c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a25: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b12: Expected O, but got Unknown
			//IL_0b25: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b2a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b35: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b55: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b6e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c2b: Expected O, but got Unknown
			//IL_0c3e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c43: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c63: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c7c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0cdc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ce2: Expected O, but got Unknown
			//IL_0ceb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0cf0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0cfb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d02: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d09: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d11: Expected O, but got Unknown
			//IL_0d13: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d18: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d23: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d2a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d32: Expected O, but got Unknown
			//IL_0d4a: Expected O, but got Unknown
			//IL_0d54: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d5a: Expected O, but got Unknown
			//IL_0db2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0db7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0dc2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0dcd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0dd4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0de4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0df4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e04: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e15: Expected O, but got Unknown
			//IL_0efc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f01: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f21: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f3a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fd2: Expected O, but got Unknown
			//IL_0fe5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fea: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ff5: Unknown result type (might be due to invalid IL or missing references)
			//IL_1015: Unknown result type (might be due to invalid IL or missing references)
			//IL_102e: Unknown result type (might be due to invalid IL or missing references)
			//IL_10f6: Expected O, but got Unknown
			//IL_1100: Unknown result type (might be due to invalid IL or missing references)
			//IL_1106: Expected O, but got Unknown
			//IL_115e: Unknown result type (might be due to invalid IL or missing references)
			//IL_1163: Unknown result type (might be due to invalid IL or missing references)
			//IL_116e: Unknown result type (might be due to invalid IL or missing references)
			//IL_1179: Unknown result type (might be due to invalid IL or missing references)
			//IL_1181: Expected O, but got Unknown
			//IL_1183: Unknown result type (might be due to invalid IL or missing references)
			//IL_1188: Unknown result type (might be due to invalid IL or missing references)
			//IL_1193: Unknown result type (might be due to invalid IL or missing references)
			//IL_119e: Unknown result type (might be due to invalid IL or missing references)
			//IL_11a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_11b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_11c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_11d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_11e6: Expected O, but got Unknown
			//IL_122c: Unknown result type (might be due to invalid IL or missing references)
			//IL_1231: Unknown result type (might be due to invalid IL or missing references)
			//IL_123c: Unknown result type (might be due to invalid IL or missing references)
			//IL_1247: Unknown result type (might be due to invalid IL or missing references)
			//IL_124f: Expected O, but got Unknown
			//IL_126d: Unknown result type (might be due to invalid IL or missing references)
			//IL_1272: Unknown result type (might be due to invalid IL or missing references)
			//IL_127d: Unknown result type (might be due to invalid IL or missing references)
			//IL_129d: Unknown result type (might be due to invalid IL or missing references)
			//IL_12b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_1373: Expected O, but got Unknown
			//IL_1386: Unknown result type (might be due to invalid IL or missing references)
			//IL_138b: Unknown result type (might be due to invalid IL or missing references)
			//IL_1396: Unknown result type (might be due to invalid IL or missing references)
			//IL_13b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_13cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_148c: Expected O, but got Unknown
			//IL_149f: Unknown result type (might be due to invalid IL or missing references)
			//IL_14a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_14af: Unknown result type (might be due to invalid IL or missing references)
			//IL_14cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_14e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_1562: Unknown result type (might be due to invalid IL or missing references)
			//IL_1567: Unknown result type (might be due to invalid IL or missing references)
			//IL_156e: Unknown result type (might be due to invalid IL or missing references)
			//IL_1579: Unknown result type (might be due to invalid IL or missing references)
			//IL_1592: Expected O, but got Unknown
			//IL_1592: Expected O, but got Unknown
			if (settings == null)
			{
				throw new ArgumentNullException("settings");
			}
			ValidateSpawnProbability(spawnProbability);
			BossDefinition val = new BossDefinition();
			val.Id = "skylin3.devourer_of_light";
			val.Persistence = new BossPersistenceDefinition
			{
				Mode = (BossPersistenceMode)2
			};
			val.ContentVersion = "0.8.0";
			val.DisplayName = "Devourer of Light";
			val.Template = "Anglerfish";
			val.Visual = new BossVisualDefinition
			{
				Prefab = assets.VisualPrefab,
				LocalPosition = Vector3.zero,
				LocalEulerAngles = Vector3.zero,
				LocalScale = Vector3.one,
				DisableTemplateRenderers = false,
				RemoveVisualColliders = true,
				AssetIdentity = "SkyLiN3.ElDevoraluz:VanillaAnglerfishRig:v3"
			};
			val.Stats = new BossStatOverrides
			{
				MaxHealth = settings.BaseHealth,
				DamageMultiplier = settings.ContactDamageMultiplier,
				AttackCooldownMultiplier = 0.9f,
				DashForceMultiplier = 1.1f,
				DashIntervalMultiplier = 1.1f,
				MassMultiplier = 1.6f,
				ScaleMultiplier = 2.1f,
				VanillaCorpseValueMultiplier = 5f
			};
			val.VanillaIntegration = new BossVanillaIntegrationDefinition
			{
				Mode = (BossVanillaMode)1,
				DurationSeconds = 900f
			};
			val.ShowBossBar = true;
			val.RewardPolicy = (RewardPolicy)1;
			val.Rewards = Array.Empty<BossRewardDefinition>();
			BossEncounterDefinition val2 = new BossEncounterDefinition();
			val2.MaximumOwnedMinions = 6;
			val2.MaximumOwnedHazards = 12;
			val2.MaximumConcurrentAbilities = 1;
			val2.Engagement = new BossEngagementDefinition
			{
				Enabled = true,
				MaximumTargetDistance = 40f,
				ReengageSpeed = 8f,
				MaximumSpeed = 18f,
				PollIntervalSeconds = 0.3f
			};
			val2.AquaticRecovery = new BossAquaticRecoveryDefinition
			{
				Enabled = true,
				IgnoreHorizontalProgress = true
			};
			val2.HookStagger = new BossHookStaggerDefinition
			{
				Enabled = true,
				MinimumSafeTension = 0.34f,
				MaximumSafeTension = 0.7f,
				ProgressPerSecond = 0.2f,
				DecayPerSecond = 0.18f,
				StaggerThreshold = 1f,
				StaggerDurationSeconds = 3f,
				RecoveryDurationSeconds = 10f,
				MaximumSimultaneousHooks = 1,
				InterruptActiveAbilityOnStagger = true
			};
			val2.CatchTriggers = (IReadOnlyList<BossCatchTriggerDefinition>)(object)new BossCatchTriggerDefinition[1]
			{
				new BossCatchTriggerDefinition
				{
					Id = "pesca_del_devoraluz",
					CaughtTemplate = "Anglerfish",
					Probability = spawnProbability,
					CooldownSeconds = 0f,
					MaxActivations = 0,
					RequiredRod = null,
					RequiredBait = null,
					ReplaceCatch = true,
					ResetRodAfterReplacement = true,
					IntroductionGraceSeconds = 3.5f,
					MinimumSpawnDistance = 8f,
					MaximumSpawnDistance = 12f,
					RequireWater = true,
					Placement = new BossPlacementDefinition
					{
						Mode = (BossPlacementMode)2,
						UseBossBodyClearance = true,
						LocalOffset = Vector3.zero,
						ClearanceRadius = 0.35f,
						MaximumAttempts = 12,
						FailurePolicy = (BossPlacementFailurePolicy)0
					}
				}
			};
			val.Encounter = val2;
			val.Abilities = (IReadOnlyList<BossAbilityDefinition>)(object)new BossAbilityDefinition[2]
			{
				Ability("acecho_del_farol", (BossAbilityTrigger)2, 2.8f, 1.35f, (BossAbilityGeometryDefinition)new ConeGeometryDefinition
				{
					Radius = 9f,
					AngleDegrees = 52f
				}, (BossTargetSelectorKind)1, new Color(0.04f, 0.84f, 0.92f, 0.7f), new Color(1f, 0.75f, 0.16f, 1f), (BossActionDefinition[])(object)new BossActionDefinition[4]
				{
					(BossActionDefinition)Dash("acecho-dash", 14f, 24f, 0.12f, 10f, 2f, 0.3f, 0.22f),
					(BossActionDefinition)Damage("acecho-mordida", settings.GetDamage("acecho_del_farol")),
					(BossActionDefinition)Force("acecho-arrastre", (BossForceMode)1, 5f, 0.18f),
					(BossActionDefinition)Effect("acecho-impacto", assets.CyanImpact, 2.2f, (BossVisualEffectAnchor)3, alignToDirection: true, 1.05f)
				}, 0f, 48f, 0f, 0, 1f, null, (BossReactiveRearmPolicy)0, telegraphEnabled: true, lockPositionAtTelegraph: false, 0.45f, 0.75f),
				Ability("farol_quebrado", (BossAbilityTrigger)4, 0f, 0f, (BossAbilityGeometryDefinition)new CircleGeometryDefinition
				{
					Radius = 4.5f
				}, (BossTargetSelectorKind)0, new Color(0.15f, 1f, 0.95f, 0.45f), new Color(1f, 0.72f, 0.13f, 1f), (BossActionDefinition[])(object)new BossActionDefinition[2]
				{
					(BossActionDefinition)new StatMultiplierAction
					{
						Id = "stagger-debilidad",
						ModifierId = "hook-stagger-debilidad",
						Lifetime = (BossModifierLifetime)2,
						DamageMultiplier = 0.55f,
						AttackCooldownMultiplier = 1.8f,
						DashForceMultiplier = 0.45f,
						DashIntervalMultiplier = 1.6f
					},
					(BossActionDefinition)Effect("stagger-impacto", assets.CyanImpact, 2.8f, (BossVisualEffectAnchor)0, alignToDirection: false, 1.25f, 0.5f)
				}, 3f, 0f, 0.25f, 5, 1f, (BossConditionDefinition?)new BossHookedConditionDefinition
				{
					RequiredState = (BossHookLifecycleState)2
				}, (BossReactiveRearmPolicy)0, telegraphEnabled: false, lockPositionAtTelegraph: true, 0f, 0f)
			};
			BossPhaseDefinition[] array = new BossPhaseDefinition[4];
			BossPhaseDefinition val3 = new BossPhaseDefinition();
			val3.Id = "arpon_del_vacio";
			val3.DisplayName = "Void Harpoon";
			val3.TriggerHealthFraction = 0.85f;
			val3.Gate = PhaseGate(6f, 12f, "arpon_abismal");
			val3.Actions = (IReadOnlyList<BossActionDefinition>)(object)new BossActionDefinition[4]
			{
				(BossActionDefinition)Toggle("arpon-warm-off", "AuthorVisual/States/WarmCore", enabled: false),
				(BossActionDefinition)Toggle("arpon-spines-on", "AuthorVisual/States/Spines", enabled: true),
				(BossActionDefinition)new StatMultiplierAction
				{
					Id = "arpon-cadencia",
					ModifierId = "fase-arpon-cadencia",
					Lifetime = (BossModifierLifetime)1,
					DashForceMultiplier = 1f,
					DashIntervalMultiplier = 1f
				},
				(BossActionDefinition)Effect("arpon-despertar", assets.CyanImpact, 2.6f, (BossVisualEffectAnchor)0, alignToDirection: false, 1.4f, 0.4f)
			};
			val3.ExitActions = (IReadOnlyList<BossActionDefinition>)(object)new BossActionDefinition[1] { (BossActionDefinition)Toggle("arpon-spines-off", "AuthorVisual/States/Spines", enabled: false) };
			val3.Abilities = (IReadOnlyList<BossAbilityDefinition>)(object)new BossAbilityDefinition[2]
			{
				Ability("arpon_abismal", (BossAbilityTrigger)0, 0.8f, 1.2f, (BossAbilityGeometryDefinition)new LineGeometryDefinition
				{
					Length = 17f,
					Width = 2.6f
				}, (BossTargetSelectorKind)1, new Color(0.05f, 0.92f, 0.95f, 0.74f), new Color(1f, 0.82f, 0.2f, 1f), (BossActionDefinition[])(object)new BossActionDefinition[4]
				{
					(BossActionDefinition)Dash("arpon-dash", 17f, 27f, 0.1f, 12f, 2.25f, 0.35f, 0.2f),
					(BossActionDefinition)Damage("arpon-impacto", settings.GetDamage("arpon_abismal")),
					(BossActionDefinition)Force("arpon-empuje", (BossForceMode)2, 10f, 0.16f),
					(BossActionDefinition)Effect("arpon-destello", assets.CyanImpact, 2.5f, (BossVisualEffectAnchor)3, alignToDirection: true, 1.25f)
				}, 0f, 50f, 0f, 0, 1f, null, (BossReactiveRearmPolicy)0, telegraphEnabled: true, lockPositionAtTelegraph: false, 0.42f, 0.8f),
				Ability("latigazo_de_luz", (BossAbilityTrigger)3, 2.6f, 0.86f, (BossAbilityGeometryDefinition)new ConeGeometryDefinition
				{
					Radius = 8f,
					AngleDegrees = 72f
				}, (BossTargetSelectorKind)1, new Color(0.02f, 0.72f, 0.9f, 0.68f), new Color(0.76f, 1f, 0.3f, 1f), (BossActionDefinition[])(object)new BossActionDefinition[3]
				{
					(BossActionDefinition)Damage("latigazo-damage", settings.GetDamage("latigazo_de_luz")),
					(BossActionDefinition)Force("latigazo-push", (BossForceMode)0, 8f, 0.2f),
					(BossActionDefinition)Effect("latigazo-impacto", assets.CyanImpact, 2f, (BossVisualEffectAnchor)1, alignToDirection: true, 0.9f)
				}, 0f, 42f, 5.8f, 4, 1f, null, (BossReactiveRearmPolicy)0, telegraphEnabled: true, lockPositionAtTelegraph: false, 0.25f, 0.4f)
			};
			array[0] = val3;
			val3 = new BossPhaseDefinition();
			val3.Id = "caceria_electrica";
			val3.DisplayName = "Electric Hunt";
			val3.TriggerHealthFraction = 0.6f;
			val3.Gate = PhaseGate(7f, 14f, "caceria_cruzada");
			val3.Actions = (IReadOnlyList<BossActionDefinition>)(object)new BossActionDefinition[4]
			{
				(BossActionDefinition)Toggle("caceria-electric-on", "AuthorVisual/States/Electric", enabled: true),
				(BossActionDefinition)new StatMultiplierAction
				{
					Id = "caceria-stats",
					ModifierId = "fase-caceria-stats",
					Lifetime = (BossModifierLifetime)1,
					DamageMultiplier = 1.1f,
					AttackCooldownMultiplier = 0.92f,
					DashForceMultiplier = 1.08f,
					DashIntervalMultiplier = 0.95f
				},
				(BossActionDefinition)Effect("caceria-descarga", assets.ElectricWake, 3f, (BossVisualEffectAnchor)0, alignToDirection: true, 1.15f),
				(BossActionDefinition)Summon("caceria-vanguardia", "skylin3.devourer_of_light.eel", 2, 7.5f, "caceria-electrica", WaterPlacement(6f, 12f, 0.55f), LineFormation(2.8f), 24f)
			};
			val3.ExitActions = (IReadOnlyList<BossActionDefinition>)(object)new BossActionDefinition[1] { (BossActionDefinition)Toggle("caceria-electric-off", "AuthorVisual/States/Electric", enabled: false) };
			BossPhaseDefinition obj = val3;
			BossAbilityDefinition[] obj2 = new BossAbilityDefinition[3]
			{
				Ability("caceria_cruzada", (BossAbilityTrigger)0, 0.75f, 1.2f, (BossAbilityGeometryDefinition)new LineGeometryDefinition
				{
					Length = 18f,
					Width = 3f
				}, (BossTargetSelectorKind)1, new Color(0.08f, 0.42f, 1f, 0.76f), new Color(0.12f, 1f, 0.92f, 1f), (BossActionDefinition[])(object)new BossActionDefinition[5]
				{
					(BossActionDefinition)Dash("caceria-cruzada-dash", 19f, 29f, 0.08f, 14f, 2.5f, 0.4f, 0.16f),
					(BossActionDefinition)PeriodicDamage("caceria-cruzada-damage", settings.GetDamage("caceria_cruzada"), 1.8f, 0.45f, 4),
					(BossActionDefinition)Force("caceria-cruzada-force", (BossForceMode)2, 12f, 0.1f, 0.45f),
					(BossActionDefinition)Effect("caceria-cruzada-estela", assets.ElectricWake, 3.2f, (BossVisualEffectAnchor)1, alignToDirection: true, 1.2f),
					(BossActionDefinition)Effect("caceria-cruzada-impacto", assets.CyanImpact, 2.2f, (BossVisualEffectAnchor)3, alignToDirection: true, 1.1f)
				}, 1.8f, 52f, 0f, 0, 1f, null, (BossReactiveRearmPolicy)0, telegraphEnabled: true, lockPositionAtTelegraph: false, 0.35f, 0.85f),
				Ability("embestida_voltaica", (BossAbilityTrigger)3, 2.2f, 1f, (BossAbilityGeometryDefinition)new LineGeometryDefinition
				{
					Length = 16f,
					Width = 2.5f
				}, (BossTargetSelectorKind)2, new Color(0.06f, 0.34f, 1f, 0.72f), new Color(0.2f, 1f, 0.88f, 1f), (BossActionDefinition[])(object)new BossActionDefinition[4]
				{
					(BossActionDefinition)Dash("voltaica-dash", 18f, 28f, 0.1f, 13f, 2.25f, 0.35f, 0.18f),
					(BossActionDefinition)Damage("voltaica-damage", settings.GetDamage("embestida_voltaica")),
					(BossActionDefinition)Force("voltaica-force", (BossForceMode)2, 11f, 0.08f),
					(BossActionDefinition)Effect("voltaica-estela", assets.ElectricWake, 2.8f, (BossVisualEffectAnchor)1, alignToDirection: true, 1.05f)
				}, 0f, 56f, 5.5f, 5, 1f, null, (BossReactiveRearmPolicy)0, telegraphEnabled: true, lockPositionAtTelegraph: false, 0.24f, 0.75f),
				default(BossAbilityDefinition)
			};
			CircleGeometryDefinition val4 = new CircleGeometryDefinition
			{
				Radius = 5f
			};
			Color color = new Color(0.04f, 0.3f, 0.95f, 0.56f);
			Color borderColor = new Color(0.16f, 1f, 0.92f, 1f);
			BossActionDefinition[] actions = new BossActionDefinition[1] { (BossActionDefinition)Summon("caceria-relevo-eel", "skylin3.devourer_of_light.eel", 1, 5f, "caceria-electrica", WaterPlacement(5f, 10f, 0.55f), LineFormation(2f), 18f) };
			BossAllConditionDefinition val5 = new BossAllConditionDefinition();
			val5.Conditions = (IReadOnlyList<BossConditionDefinition>)(object)new BossConditionDefinition[2]
			{
				(BossConditionDefinition)new BossMinionDefeatedConditionDefinition
				{
					GroupId = "caceria-electrica",
					Comparison = (BossNumericComparison)3,
					Count = 2,
					Scope = (BossConditionScope)1
				},
				(BossConditionDefinition)new BossMinionCountConditionDefinition
				{
					GroupId = "caceria-electrica",
					Comparison = (BossNumericComparison)1,
					Count = 0
				}
			};
			obj2[2] = Ability("caceria_relevo", (BossAbilityTrigger)4, 0f, 1.1f, (BossAbilityGeometryDefinition)val4, (BossTargetSelectorKind)0, color, borderColor, (BossActionDefinition[])(object)actions, 0f, 0f, 8f, 0, 1f, (BossConditionDefinition?)(object)val5, (BossReactiveRearmPolicy)0, telegraphEnabled: true, lockPositionAtTelegraph: true, 0f, 0.25f);
			obj.Abilities = (IReadOnlyList<BossAbilityDefinition>)(object)obj2;
			array[1] = val3;
			val3 = new BossPhaseDefinition();
			val3.Id = "fondo_venenoso";
			val3.DisplayName = "Venomous Depths";
			val3.TriggerHealthFraction = 0.36f;
			val3.Gate = PhaseGate(8f, 16f, "marea_de_bilis");
			val3.Actions = (IReadOnlyList<BossActionDefinition>)(object)new BossActionDefinition[5]
			{
				(BossActionDefinition)Toggle("veneno-on", "AuthorVisual/States/Venom", enabled: true),
				(BossActionDefinition)new StatMultiplierAction
				{
					Id = "veneno-stats",
					ModifierId = "fase-veneno-stats",
					Lifetime = (BossModifierLifetime)1,
					DamageMultiplier = 1.15f,
					AttackCooldownMultiplier = 0.95f,
					DashForceMultiplier = 0.95f,
					DashIntervalMultiplier = 1.1f
				},
				(BossActionDefinition)Effect("veneno-erupcion", assets.VenomField, 4.2f, (BossVisualEffectAnchor)0, alignToDirection: false, 1.35f),
				(BossActionDefinition)Summon("veneno-ancla", "skylin3.devourer_of_light.stonefish", 1, 5.5f, "fondo-venenoso", SeafloorPlacement(6f, 20f, 0.8f), LineFormation(2f), 28f),
				(BossActionDefinition)Summon("veneno-puas", "skylin3.devourer_of_light.urchin", 2, 7f, "fondo-venenoso", SeafloorPlacement(8f, 22f, 0.7f), ConeFormation(5f, 78f), 24f)
			};
			val3.ExitActions = (IReadOnlyList<BossActionDefinition>)(object)new BossActionDefinition[1] { (BossActionDefinition)Toggle("veneno-off", "AuthorVisual/States/Venom", enabled: false) };
			val3.Abilities = (IReadOnlyList<BossAbilityDefinition>)(object)new BossAbilityDefinition[2]
			{
				Ability("marea_de_bilis", (BossAbilityTrigger)0, 0.8f, 1.35f, (BossAbilityGeometryDefinition)new CircleGeometryDefinition
				{
					Radius = 4.8f
				}, (BossTargetSelectorKind)1, new Color(0.56f, 0.1f, 0.9f, 0.7f), new Color(0.42f, 1f, 0.24f, 1f), (BossActionDefinition[])(object)new BossActionDefinition[3]
				{
					(BossActionDefinition)PeriodicDamage("bilis-ticks", settings.GetDamage("marea_de_bilis"), 2.4f, 0.8f, 4),
					(BossActionDefinition)Force("bilis-pull", (BossForceMode)1, 8f, 0.12f, 0.8f),
					(BossActionDefinition)Effect("bilis-campo", assets.VenomField, 4.5f, (BossVisualEffectAnchor)2, alignToDirection: false, 1.15f)
				}, 2.4f, 46f, 0f, 0, 1f, null, (BossReactiveRearmPolicy)0, telegraphEnabled: true, lockPositionAtTelegraph: false, 0.5f, 0.45f),
				Ability("estela_venenosa", (BossAbilityTrigger)3, 2f, 1.1f, (BossAbilityGeometryDefinition)new LineGeometryDefinition
				{
					Length = 15f,
					Width = 3.2f
				}, (BossTargetSelectorKind)1, new Color(0.48f, 0.08f, 0.82f, 0.72f), new Color(0.38f, 1f, 0.26f, 1f), (BossActionDefinition[])(object)new BossActionDefinition[4]
				{
					(BossActionDefinition)Dash("estela-dash", 17f, 27f, 0.08f, 12f, 2.5f, 0.4f, 0.2f),
					(BossActionDefinition)PeriodicDamage("estela-ticks", settings.GetDamage("estela_venenosa"), 2.4f, 0.6f, 4),
					(BossActionDefinition)Force("estela-arrastre", (BossForceMode)2, 7f, 0.06f, 0.6f),
					(BossActionDefinition)Effect("estela-campo", assets.VenomField, 4f, (BossVisualEffectAnchor)3, alignToDirection: true, 0.95f)
				}, 2.4f, 48f, 6f, 4, 1f, null, (BossReactiveRearmPolicy)0, telegraphEnabled: true, lockPositionAtTelegraph: false, 0.3f, 0.8f)
			};
			array[2] = val3;
			val3 = new BossPhaseDefinition();
			val3.Id = "apagon";
			val3.DisplayName = "Blackout";
			val3.TriggerHealthFraction = 0.15f;
			val3.Gate = PhaseGate(8f, 18f, "apagon_embestida");
			val3.Actions = (IReadOnlyList<BossActionDefinition>)(object)new BossActionDefinition[4]
			{
				(BossActionDefinition)Toggle("apagon-on", "AuthorVisual/States/Blackout", enabled: true),
				(BossActionDefinition)new SetVisualScaleAction
				{
					Id = "apagon-scale-up",
					ScaleMultiplier = 1.12f,
					Persistent = true
				},
				(BossActionDefinition)new StatMultiplierAction
				{
					Id = "apagon-stats",
					ModifierId = "fase-apagon-stats",
					Lifetime = (BossModifierLifetime)1,
					DamageMultiplier = 1.2f,
					AttackCooldownMultiplier = 0.88f,
					DashForceMultiplier = 1.15f,
					DashIntervalMultiplier = 0.9f
				},
				(BossActionDefinition)Effect("apagon-estallido", assets.BlackoutImpact, 3.8f, (BossVisualEffectAnchor)0, alignToDirection: false, 1.45f, 0.5f)
			};
			val3.ExitActions = (IReadOnlyList<BossActionDefinition>)(object)new BossActionDefinition[2]
			{
				(BossActionDefinition)Toggle("apagon-off", "AuthorVisual/States/Blackout", enabled: false),
				(BossActionDefinition)new SetVisualScaleAction
				{
					Id = "apagon-scale-reset",
					ScaleMultiplier = 25f / 28f,
					Persistent = true
				}
			};
			val3.Abilities = (IReadOnlyList<BossAbilityDefinition>)(object)new BossAbilityDefinition[3]
			{
				Ability("apagon_embestida", (BossAbilityTrigger)0, 0.65f, 1.2f, (BossAbilityGeometryDefinition)new LineGeometryDefinition
				{
					Length = 20f,
					Width = 3.2f
				}, (BossTargetSelectorKind)2, new Color(0.78f, 0.02f, 0.08f, 0.78f), new Color(0.66f, 0.12f, 1f, 1f), (BossActionDefinition[])(object)new BossActionDefinition[4]
				{
					(BossActionDefinition)Dash("apagon-dash", 22f, 32f, 0.06f, 16f, 3f, 0.45f, 0.12f),
					(BossActionDefinition)Damage("apagon-damage", settings.GetDamage("apagon_embestida")),
					(BossActionDefinition)Force("apagon-force", (BossForceMode)2, 15f, 0.05f),
					(BossActionDefinition)Effect("apagon-impacto", assets.BlackoutImpact, 3f, (BossVisualEffectAnchor)3, alignToDirection: true, 1.3f)
				}, 0f, 60f, 0f, 0, 1f, null, (BossReactiveRearmPolicy)0, telegraphEnabled: true, lockPositionAtTelegraph: false, 0.28f, 0.9f),
				Ability("triple_eclipse", (BossAbilityTrigger)3, 1.4f, 0.95f, (BossAbilityGeometryDefinition)new LineGeometryDefinition
				{
					Length = 18f,
					Width = 2.8f
				}, (BossTargetSelectorKind)1, new Color(0.92f, 0.02f, 0.06f, 0.76f), new Color(0.58f, 0.1f, 1f, 1f), (BossActionDefinition[])(object)new BossActionDefinition[4]
				{
					(BossActionDefinition)Dash("eclipse-dash", 20f, 30f, 0.04f, 14f, 2.75f, 0.4f, 0.1f),
					(BossActionDefinition)Damage("eclipse-damage", settings.GetDamage("triple_eclipse")),
					(BossActionDefinition)Force("eclipse-force", (BossForceMode)2, 14f, 0.04f),
					(BossActionDefinition)Effect("eclipse-impacto", assets.BlackoutImpact, 2.6f, (BossVisualEffectAnchor)3, alignToDirection: true, 1.1f)
				}, 0f, 58f, 4.2f, 3, 1f, null, (BossReactiveRearmPolicy)0, telegraphEnabled: true, lockPositionAtTelegraph: false, 0.2f, 0.7f),
				Ability("mordida_sin_luz", (BossAbilityTrigger)4, 0f, 0.68f, (BossAbilityGeometryDefinition)new ConeGeometryDefinition
				{
					Radius = 8.5f,
					AngleDegrees = 70f
				}, (BossTargetSelectorKind)1, new Color(0.65f, 0.02f, 0.12f, 0.74f), new Color(0.74f, 0.18f, 1f, 1f), (BossActionDefinition[])(object)new BossActionDefinition[3]
				{
					(BossActionDefinition)Damage("mordida-damage", settings.GetDamage("mordida_sin_luz")),
					(BossActionDefinition)Force("mordida-pull", (BossForceMode)1, 10f, 0.1f),
					(BossActionDefinition)Effect("mordida-impacto", assets.BlackoutImpact, 2.2f, (BossVisualEffectAnchor)1, alignToDirection: true, 0.9f)
				}, 0f, 36f, 4.5f, 3, 1f, (BossConditionDefinition?)new BossPlayerDistanceConditionDefinition
				{
					Comparison = (BossNumericComparison)1,
					Distance = 8.5f,
					RequiredPlayerCount = 1
				}, (BossReactiveRearmPolicy)1, telegraphEnabled: true, lockPositionAtTelegraph: false, 0.18f, 0.28f)
			};
			array[3] = val3;
			val.Phases = (IReadOnlyList<BossPhaseDefinition>)(object)array;
			return val;
		}

		private static void ValidateSpawnProbability(float spawnProbability)
		{
			if (float.IsNaN(spawnProbability) || float.IsInfinity(spawnProbability) || spawnProbability < 0f || spawnProbability > 1f)
			{
				throw new ArgumentOutOfRangeException("spawnProbability", spawnProbability, "Spawn probability must be between 0 and 1.");
			}
		}

		internal static BossDefinition CreateUrchin()
		{
			return CreateSupport("skylin3.devourer_of_light.urchin", "Devourer Spine", "Sea Urchin", 260, 1.05f, 0.9f, 1.2f);
		}

		internal static BossDefinition CreateEel()
		{
			return CreateSupport("skylin3.devourer_of_light.eel", "Devourer Bolt", "Eel", 520, 1.18f, 0.72f, 1.18f);
		}

		internal static BossDefinition CreateStonefish()
		{
			return CreateSupport("skylin3.devourer_of_light.stonefish", "Devourer Venom Anchor", "Stonefish", 1150, 1.22f, 0.82f, 1.12f);
		}

		private static BossDefinition CreateSupport(string id, string displayName, string template, int health, float damage, float cooldown, float scale)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Expected O, but got Unknown
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Expected O, but got Unknown
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Expected O, but got Unknown
			return new BossDefinition
			{
				Id = id,
				Persistence = new BossPersistenceDefinition
				{
					Mode = (BossPersistenceMode)2
				},
				ContentVersion = "0.8.0",
				DisplayName = displayName,
				Template = template,
				Visual = new BossVisualDefinition
				{
					DisableTemplateRenderers = false,
					AssetIdentity = "SkyLiN3.ElDevoraluz:VanillaSupport:v2"
				},
				Stats = new BossStatOverrides
				{
					MaxHealth = health,
					DamageMultiplier = damage,
					AttackCooldownMultiplier = cooldown,
					ScaleMultiplier = scale
				},
				Abilities = Array.Empty<BossAbilityDefinition>(),
				Phases = Array.Empty<BossPhaseDefinition>(),
				Rewards = Array.Empty<BossRewardDefinition>(),
				RewardPolicy = (RewardPolicy)1,
				Encounter = new BossEncounterDefinition
				{
					MaximumOwnedMinions = 0,
					MaximumOwnedHazards = 0,
					MaximumConcurrentAbilities = 1,
					CatchTriggers = Array.Empty<BossCatchTriggerDefinition>()
				},
				ShowBossBar = false
			};
		}

		private static BossAbilityDefinition Ability(string id, BossAbilityTrigger trigger, float initialDelaySeconds, float telegraphSeconds, BossAbilityGeometryDefinition geometry, BossTargetSelectorKind targetSelector, Color color, Color borderColor, BossActionDefinition[] actions, float resolveSeconds = 0f, float maximumTargetRange = 0f, float cooldownSeconds = 0f, int maxRepeats = 0, float probability = 1f, BossConditionDefinition? condition = null, BossReactiveRearmPolicy reactiveRearmPolicy = (BossReactiveRearmPolicy)0, bool telegraphEnabled = true, bool lockPositionAtTelegraph = true, float lockBeforeResolveSeconds = 0f, float recoverySeconds = 0.35f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Expected O, but got Unknown
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Expected O, but got Unknown
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Expected O, but got Unknown
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Expected O, but got Unknown
			return new BossAbilityDefinition
			{
				Id = id,
				Trigger = trigger,
				InitialDelaySeconds = initialDelaySeconds,
				CooldownSeconds = cooldownSeconds,
				MaxRepeats = maxRepeats,
				Probability = probability,
				Condition = condition,
				ReactiveRearmPolicy = reactiveRearmPolicy,
				Timeline = new BossAbilityTimelineDefinition
				{
					TelegraphDurationSeconds = telegraphSeconds,
					ResolveDurationSeconds = resolveSeconds,
					RecoveryDurationSeconds = recoverySeconds
				},
				TargetSelector = new BossTargetSelectorDefinition
				{
					Kind = targetSelector,
					MaximumRange = maximumTargetRange,
					LockPositionAtTelegraph = lockPositionAtTelegraph,
					LockBeforeResolveSeconds = lockBeforeResolveSeconds
				},
				Geometry = geometry,
				Telegraph = new BossTelegraphDefinition
				{
					Enabled = telegraphEnabled,
					Color = color,
					BorderColor = borderColor,
					BorderWidth = 0.14f,
					PulseFrequency = 3.1f,
					UseColorBlindPattern = true,
					AudioVolume = 1f
				},
				Actions = actions
			};
		}

		private static AreaDamageAction Damage(string id, int amount)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			return new AreaDamageAction
			{
				Id = id,
				Damage = amount,
				DurationSeconds = 0f,
				TickIntervalSeconds = 0f,
				MaxHitsPerTarget = 1,
				VerticalTolerance = 12f
			};
		}

		private static AreaDamageAction PeriodicDamage(string id, int amount, float durationSeconds, float tickIntervalSeconds, int maximumHits)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			return new AreaDamageAction
			{
				Id = id,
				Damage = amount,
				DurationSeconds = durationSeconds,
				TickIntervalSeconds = tickIntervalSeconds,
				MaxHitsPerTarget = maximumHits,
				VerticalTolerance = 12f
			};
		}

		private static ForceAction Force(string id, BossForceMode mode, float magnitude, float verticalMultiplier, float durationSeconds = 0f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			return new ForceAction
			{
				Id = id,
				Mode = mode,
				Magnitude = magnitude,
				DurationSeconds = durationSeconds,
				VerticalTolerance = 12f,
				VerticalMultiplier = verticalMultiplier,
				MaximumVelocityChange = 28f
			};
		}

		private static DashAction Dash(string id, float impulse, float maximumSpeed, float retainedVelocityFraction, float maximumTravelDistance, float stoppingDistance, float brakeDurationSeconds, float exitVelocityFraction)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Expected O, but got Unknown
			return new DashAction
			{
				Id = id,
				Impulse = impulse,
				VerticalImpulse = 0f,
				RetainedVelocityFraction = retainedVelocityFraction,
				MaximumSpeed = maximumSpeed,
				MaximumTravelDistance = maximumTravelDistance,
				StoppingDistance = stoppingDistance,
				BrakeDurationSeconds = brakeDurationSeconds,
				ExitVelocityFraction = exitVelocityFraction
			};
		}

		private static SpawnMinionsAction Summon(string id, string registeredBossId, int count, float radius, string groupId, BossPlacementDefinition placement, BossFormationDefinition formation, float lifetimeSeconds)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Expected O, but got Unknown
			return new SpawnMinionsAction
			{
				Id = id,
				RegisteredBossId = registeredBossId,
				Count = count,
				SpawnRadius = radius,
				MaxAliveFromThisAction = count,
				GroupId = groupId,
				CleanupPolicy = (MinionCleanupPolicy)2,
				LifetimeSeconds = lifetimeSeconds,
				Placement = placement,
				Formation = formation
			};
		}

		private static ToggleVisualNodeAction Toggle(string id, string path, bool enabled)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			return new ToggleVisualNodeAction
			{
				Id = id,
				RelativeTransformPath = path,
				Enabled = enabled,
				Persistent = true
			};
		}

		private static BossPhaseGateDefinition PhaseGate(float minimumDurationSeconds, float maximumDurationSeconds, string requiredAbilityId, bool protectFromDefeat = false)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			return new BossPhaseGateDefinition
			{
				Enabled = true,
				MinimumDurationSeconds = minimumDurationSeconds,
				MaximumDurationSeconds = maximumDurationSeconds,
				RequiredAbilityId = requiredAbilityId,
				ProtectFromDefeat = protectFromDefeat
			};
		}

		private static SpawnVisualEffectAction Effect(string id, GameObject? prefab, float lifetime, BossVisualEffectAnchor anchor, bool alignToDirection = false, float scale = 1f, float verticalOffset = 0f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Invalid comparison between Unknown and I4
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			return new SpawnVisualEffectAction
			{
				Id = id,
				Prefab = prefab,
				Anchor = anchor,
				ParentToBoss = ((int)anchor == 0),
				AlignToAbilityDirection = alignToDirection,
				LocalOffset = new Vector3(0f, verticalOffset, 0f),
				LocalEulerAngles = Vector3.zero,
				LocalScale = Vector3.one * scale,
				Lifetime = lifetime
			};
		}

		private static BossPlacementDefinition WaterPlacement(float searchRadius, float verticalSearchDistance, float clearanceRadius)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			return new BossPlacementDefinition
			{
				Mode = (BossPlacementMode)1,
				SearchRadius = searchRadius,
				VerticalSearchDistance = verticalSearchDistance,
				ClearanceRadius = clearanceRadius,
				MaximumAttempts = 12,
				FailurePolicy = (BossPlacementFailurePolicy)0
			};
		}

		private static BossPlacementDefinition SeafloorPlacement(float searchRadius, float verticalSearchDistance, float clearanceRadius)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			return new BossPlacementDefinition
			{
				Mode = (BossPlacementMode)3,
				SearchRadius = searchRadius,
				VerticalSearchDistance = verticalSearchDistance,
				ClearanceRadius = clearanceRadius,
				MaximumAttempts = 12,
				FailurePolicy = (BossPlacementFailurePolicy)0
			};
		}

		private static BossFormationDefinition LineFormation(float spacing)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			return new BossFormationDefinition
			{
				Kind = (BossFormationKind)2,
				Spacing = spacing,
				FaceCenter = true
			};
		}

		private static BossFormationDefinition ConeFormation(float radius, float angleDegrees)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			return new BossFormationDefinition
			{
				Kind = (BossFormationKind)3,
				Radius = radius,
				AngleDegrees = angleDegrees,
				FaceCenter = true
			};
		}
	}
	internal static class DevoraluzMetadata
	{
		internal const string PluginGuid = "com.skylin3.howtofish.devoraluz";

		internal const string PluginName = "Devourer of Light";

		internal const string Version = "0.10.3";

		internal const string DefinitionVersion = "0.8.0";

		internal const string BossId = "skylin3.devourer_of_light";

		internal const string BossDisplayName = "Devourer of Light";

		internal const string BossTemplate = "Anglerfish";

		internal const string UrchinId = "skylin3.devourer_of_light.urchin";

		internal const string EelId = "skylin3.devourer_of_light.eel";

		internal const string StonefishId = "skylin3.devourer_of_light.stonefish";

		internal const string UrchinTemplate = "Sea Urchin";

		internal const string EelTemplate = "Eel";

		internal const string StonefishTemplate = "Stonefish";
	}
	[BepInPlugin("com.skylin3.howtofish.devoraluz", "Devourer of Light", "0.10.3")]
	[BepInDependency("com.skylin3.howtofish.bossmakerapi", "0.10.3")]
	public sealed class DevoraluzPlugin : BaseUnityPlugin
	{
		private readonly List<BossRegistrationHandle> _handles = new List<BossRegistrationHandle>();

		private readonly List<BossRegistrationHandle> _supportHandles = new List<BossRegistrationHandle>();

		private DevoraluzVisualAssets? _assets;

		private DevoraluzConfigBinding? _configuration;

		private DevoraluzStartupSettings? _startupSettings;

		private BossRegistrationHandle? _mainHandle;

		private bool _registrationAttempted;

		private bool _mainRegistrationSubmitted;

		private bool _supportFailureReported;

		private int _observedConfigurationRevision;

		private bool _configurationPending;

		private float _configurationApplyAfter;

		private void Awake()
		{
			try
			{
				_startupSettings = (_configuration = DevoraluzConfiguration.Bind(((BaseUnityPlugin)this).Config, delegate(string message)
				{
					((BaseUnityPlugin)this).Logger.LogWarning((