Decompiled source of StarLevelSystem v1.4.0

plugins/StarLevelSystem.dll

Decompiled a week ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Versioning;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using JetBrains.Annotations;
using Jotunn;
using Jotunn.Entities;
using Jotunn.Extensions;
using Jotunn.Managers;
using Jotunn.Utils;
using MonoMod.Utils;
using SimpleJson;
using Splatform;
using StarLevelSystem.Data;
using StarLevelSystem.Modifiers;
using StarLevelSystem.common;
using StarLevelSystem.modules;
using StarLevelSystem.modules.AnimationAndSpeed;
using StarLevelSystem.modules.CreatureSetup;
using StarLevelSystem.modules.Damage;
using StarLevelSystem.modules.Health;
using StarLevelSystem.modules.LevelSystem;
using StarLevelSystem.modules.Loot;
using StarLevelSystem.modules.Modifiers;
using StarLevelSystem.modules.NemesisSystem;
using StarLevelSystem.modules.Raids;
using StarLevelSystem.modules.Sizes;
using StarLevelSystem.modules.UI;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("StarLevelSystem")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("StarLevelSystem")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")]
[assembly: AssemblyFileVersion("1.4.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.4.0.0")]
[CompilerGenerated]
internal delegate void <>f__AnonymousDelegate0<T1, T2, T3>(T1 arg1 = default(T1), T2 arg2 = default(T2), T3 arg3 = default(T3));
namespace StarLevelSystem
{
	[PublicAPI]
	public static class API
	{
		private static readonly Type APIReciever;

		private static readonly MethodInfo UpdateCreatureLevel;

		private static readonly MethodInfo UpdateCreatureColorization;

		private static readonly MethodInfo GetBaseAttributeValue;

		private static readonly MethodInfo UpdateCreatureBaseAttributes;

		private static readonly MethodInfo GetAllBaseAttributeValues;

		private static readonly MethodInfo SetAllBaseAttributeValues;

		private static readonly MethodInfo GetPerLevelAttributeValue;

		private static readonly MethodInfo UpdateCreaturePerLevelAttributes;

		private static readonly MethodInfo GetAllPerLevelAttributeValues;

		private static readonly MethodInfo SetAllPerLevelAttributeValues;

		private static readonly MethodInfo GetCreatureDamageRecievedModifier;

		private static readonly MethodInfo UpdateCreatureDamageRecievedModifier;

		private static readonly MethodInfo GetAllDamageRecievedModifiers;

		private static readonly MethodInfo SetAllDamageRecievedModifiers;

		private static readonly MethodInfo GetCreatureDamageBonus;

		private static readonly MethodInfo UpdateCreatureDamageBonus;

		private static readonly MethodInfo GetAllDamageBonus;

		private static readonly MethodInfo SetAllDamageBonus;

		private static readonly MethodInfo ApplyUpdatesToCreature;

		private static readonly MethodInfo GetPossibleModifiersForType;

		private static readonly MethodInfo GetAllModifiersForCreature;

		private static readonly MethodInfo AddModifierToCreature;

		private static readonly MethodInfo AddNewModifierToSLS;

		public static bool IsAvailable => APIReciever != null;

		static API()
		{
			APIReciever = Type.GetType("StarLevelSystem.modules.APIReciever, StarLevelSystem");
			if (!(APIReciever == null))
			{
				UpdateCreatureLevel = APIReciever.GetMethod("UpdateCreatureLevel", BindingFlags.Static | BindingFlags.Public);
				UpdateCreatureColorization = APIReciever.GetMethod("UpdateCreatureColorization", BindingFlags.Static | BindingFlags.Public);
				GetBaseAttributeValue = APIReciever.GetMethod("GetBaseAttributeValue", BindingFlags.Static | BindingFlags.Public);
				UpdateCreatureBaseAttributes = APIReciever.GetMethod("UpdateCreatureBaseAttributes", BindingFlags.Static | BindingFlags.Public);
				GetAllBaseAttributeValues = APIReciever.GetMethod("GetAllBaseAttributeValues", BindingFlags.Static | BindingFlags.Public);
				SetAllBaseAttributeValues = APIReciever.GetMethod("SetAllBaseAttributeValues", BindingFlags.Static | BindingFlags.Public);
				GetPerLevelAttributeValue = APIReciever.GetMethod("GetPerLevelAttributeValue", BindingFlags.Static | BindingFlags.Public);
				UpdateCreaturePerLevelAttributes = APIReciever.GetMethod("UpdateCreaturePerLevelAttributes", BindingFlags.Static | BindingFlags.Public);
				GetAllPerLevelAttributeValues = APIReciever.GetMethod("GetAllPerLevelAttributeValues", BindingFlags.Static | BindingFlags.Public);
				SetAllPerLevelAttributeValues = APIReciever.GetMethod("SetAllPerLevelAttributeValues", BindingFlags.Static | BindingFlags.Public);
				GetCreatureDamageRecievedModifier = APIReciever.GetMethod("GetCreatureDamageRecievedModifier", BindingFlags.Static | BindingFlags.Public);
				UpdateCreatureDamageRecievedModifier = APIReciever.GetMethod("UpdateCreatureDamageRecievedModifier", BindingFlags.Static | BindingFlags.Public);
				GetAllDamageRecievedModifiers = APIReciever.GetMethod("GetAllDamageRecievedModifiers", BindingFlags.Static | BindingFlags.Public);
				SetAllDamageRecievedModifiers = APIReciever.GetMethod("SetAllDamageRecievedModifiers", BindingFlags.Static | BindingFlags.Public);
				GetCreatureDamageBonus = APIReciever.GetMethod("GetCreatureDamageBonus", BindingFlags.Static | BindingFlags.Public);
				UpdateCreatureDamageBonus = APIReciever.GetMethod("UpdateCreatureDamageBonus", BindingFlags.Static | BindingFlags.Public);
				GetAllDamageBonus = APIReciever.GetMethod("GetAllDamageBonus", BindingFlags.Static | BindingFlags.Public);
				SetAllDamageBonus = APIReciever.GetMethod("SetAllDamageBonus", BindingFlags.Static | BindingFlags.Public);
				ApplyUpdatesToCreature = APIReciever.GetMethod("ApplyUpdatesToCreature", BindingFlags.Static | BindingFlags.Public);
				GetPossibleModifiersForType = APIReciever.GetMethod("GetPossibleModifiersForType", BindingFlags.Static | BindingFlags.Public);
				GetAllModifiersForCreature = APIReciever.GetMethod("GetAllModifiersForCreature", BindingFlags.Static | BindingFlags.Public);
				AddModifierToCreature = APIReciever.GetMethod("AddModifierToCreature", BindingFlags.Static | BindingFlags.Public);
				AddNewModifierToSLS = APIReciever.GetMethod("AddNewModifierToSLS", BindingFlags.Static | BindingFlags.Public);
			}
		}

		public static bool SetCreatureLevel(Character creatureId, int newLevel)
		{
			return (bool)UpdateCreatureLevel.Invoke(null, new object[2] { creatureId, newLevel });
		}

		public static bool SetCreatureColorization(Character creatureId, float value, float hue, float sat, bool emission = false)
		{
			return (bool)UpdateCreatureColorization.Invoke(null, new object[5] { creatureId, value, hue, sat, emission });
		}

		public static float GetCreatureBaseAttribute(Character creatureId, int attribute)
		{
			return (float)GetBaseAttributeValue.Invoke(null, new object[2] { creatureId, attribute });
		}

		public static bool SetCreatureBaseAttribute(Character creatureId, int attribute, float value)
		{
			return (bool)UpdateCreatureBaseAttributes.Invoke(null, new object[3] { creatureId, attribute, value });
		}

		public static Dictionary<int, float> GetAllCreatureBaseAttributes(Character creatureId)
		{
			return (Dictionary<int, float>)GetAllBaseAttributeValues.Invoke(null, new object[1] { creatureId });
		}

		public static bool SetAllCreatureBaseAttributes(Character creatureId, Dictionary<int, float> attributes)
		{
			return (bool)SetAllBaseAttributeValues.Invoke(null, new object[2] { creatureId, attributes });
		}

		public static float GetCreaturePerLevelAttribute(Character creatureId, int attribute)
		{
			return (float)GetPerLevelAttributeValue.Invoke(null, new object[2] { creatureId, attribute });
		}

		public static bool SetCreaturePerLevelAttribute(Character creatureId, int attribute, float value)
		{
			return (bool)UpdateCreaturePerLevelAttributes.Invoke(null, new object[3] { creatureId, attribute, value });
		}

		public static Dictionary<int, float> GetAllCreaturePerLevelAttributes(Character creatureId)
		{
			return (Dictionary<int, float>)GetAllPerLevelAttributeValues.Invoke(null, new object[1] { creatureId });
		}

		public static bool SetAllCreaturePerLevelAttributes(Character creatureId, Dictionary<int, float> attributes)
		{
			return (bool)SetAllPerLevelAttributeValues.Invoke(null, new object[2] { creatureId, attributes });
		}

		public static float GetCreatureDamageReceivedModifier(Character creatureId, int damageType)
		{
			return (float)GetCreatureDamageRecievedModifier.Invoke(null, new object[2] { creatureId, damageType });
		}

		public static bool SetCreatureDamageReceivedModifier(Character creatureId, int damageType, float value)
		{
			return (bool)UpdateCreatureDamageRecievedModifier.Invoke(null, new object[3] { creatureId, damageType, value });
		}

		public static Dictionary<int, float> GetAllCreatureDamageReceivedModifiers(Character creatureId)
		{
			return (Dictionary<int, float>)GetAllDamageRecievedModifiers.Invoke(null, new object[1] { creatureId });
		}

		public static bool SetAllCreatureDamageReceivedModifiers(Character creatureId, Dictionary<int, float> attributes)
		{
			return (bool)SetAllDamageRecievedModifiers.Invoke(null, new object[2] { creatureId, attributes });
		}

		public static float GetCreatureFlatDamageBonus(Character creatureId, int damageType)
		{
			return (float)GetCreatureDamageBonus.Invoke(null, new object[2] { creatureId, damageType });
		}

		public static bool SetCreatureFlatDamageBonus(Character creatureId, int damageType, float value)
		{
			return (bool)UpdateCreatureDamageBonus.Invoke(null, new object[3] { creatureId, damageType, value });
		}

		public static Dictionary<int, float> GetAllCreatureFlatDamageBonuses(Character creatureId)
		{
			return (Dictionary<int, float>)GetAllDamageBonus.Invoke(null, new object[1] { creatureId });
		}

		public static bool SetAllCreatureFlatDamageBonuses(Character creatureId, Dictionary<int, float> attributes)
		{
			return (bool)SetAllDamageBonus.Invoke(null, new object[2] { creatureId, attributes });
		}

		public static bool ApplyCreatureUpdates(Character creatureId)
		{
			return (bool)ApplyUpdatesToCreature.Invoke(null, new object[1] { creatureId });
		}

		public static List<string> GetPossibleModifiers(int modType = 0)
		{
			return (List<string>)GetPossibleModifiersForType.Invoke(null, new object[1] { modType });
		}

		public static Dictionary<string, int> GetCreaturesModifiers(Character creatureId)
		{
			return (Dictionary<string, int>)GetAllModifiersForCreature.Invoke(null, new object[1] { creatureId });
		}

		public static bool AddModifierToTargetCreature(Character creatureId, string modifierName, int modifierType, bool update = true)
		{
			return (bool)AddModifierToCreature.Invoke(null, new object[4] { creatureId, modifierName, modifierType, update });
		}

		public static bool AddNewModifier(int modifierID, string modifier_name, Delegate setupMethod = null, float selectionWeight = 10f, float basepower = 0f, float perlevelpower = 0f, Dictionary<Biome, List<string>> biomeConfig = null, int namingStyle = 2, string name_suffixes = null, string name_prefixes = null, int visualStyle = 0, Sprite starIcon = null, GameObject visualEffect = null, List<string> allowed_creatures = null, List<string> unallowed_creatures = null, List<Biome> allowed_biomes = null)
		{
			return (bool)AddNewModifierToSLS.Invoke(null, new object[16]
			{
				modifierID, modifier_name, setupMethod, selectionWeight, basepower, perlevelpower, biomeConfig, namingStyle, name_suffixes, name_prefixes,
				visualStyle, starIcon, visualEffect, allowed_creatures, unallowed_creatures, allowed_biomes
			});
		}
	}
	internal static class Logger
	{
		public static LogLevel Level = (LogLevel)16;

		public static void EnableDebugLogging(object sender, EventArgs e)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			if (ValConfig.EnableDebugMode.Value)
			{
				Level = (LogLevel)32;
			}
			else
			{
				Level = (LogLevel)16;
			}
		}

		public static void CheckEnableDebugLogging()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			if (ValConfig.EnableDebugMode.Value)
			{
				Level = (LogLevel)32;
			}
			else
			{
				Level = (LogLevel)16;
			}
		}

		public static void LogNemesis(string message)
		{
			if (ValConfig.EnableDebugNemesisDetails.Value)
			{
				StarLevelSystem.Log.LogInfo((object)("[Nemesis] " + message));
			}
		}

		public static void LogRaid(string message)
		{
			if (ValConfig.EnableDebugRaidDetails.Value)
			{
				StarLevelSystem.Log.LogInfo((object)("[Raid] " + message));
			}
		}

		public static void LogLoot(string message)
		{
			if (ValConfig.EnableDebugLootDetails.Value)
			{
				StarLevelSystem.Log.LogInfo((object)("[Loot] " + message));
			}
		}

		public static void LogDebug(string message)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Invalid comparison between Unknown and I4
			if ((int)Level >= 32)
			{
				StarLevelSystem.Log.LogInfo((object)message);
			}
		}

		public static void LogInfo(string message)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Invalid comparison between Unknown and I4
			if ((int)Level >= 16)
			{
				StarLevelSystem.Log.LogInfo((object)message);
			}
		}

		public static void LogWarning(string message)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Invalid comparison between Unknown and I4
			if ((int)Level >= 4)
			{
				StarLevelSystem.Log.LogWarning((object)message);
			}
		}

		public static void LogError(string message)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Invalid comparison between Unknown and I4
			if ((int)Level >= 2)
			{
				StarLevelSystem.Log.LogError((object)message);
			}
		}
	}
	[BepInPlugin("MidnightsFX.StarLevelSystem", "StarLevelSystem", "1.4.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	[BepInIncompatibility("org.bepinex.plugins.creaturelevelcontrol")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	internal class StarLevelSystem : BaseUnityPlugin
	{
		public const string PluginGUID = "MidnightsFX.StarLevelSystem";

		public const string PluginName = "StarLevelSystem";

		public const string PluginVersion = "1.4.0";

		public ValConfig cfg;

		public static CustomLocalization Localization = LocalizationManager.Instance.GetLocalization();

		public static AssetBundle EmbeddedResourceBundle;

		public static ManualLogSource Log;

		public static Harmony HarmonyInstance { get; private set; }

		public void Awake()
		{
			Log = ((BaseUnityPlugin)this).Logger;
			cfg = new ValConfig(((BaseUnityPlugin)this).Config);
			cfg.SetupConfigRPCs();
			cfg.LoadYamlConfigs();
			TaskRunner.Setup();
			Compatibility.CheckModCompat();
			EmbeddedResourceBundle = AssetUtils.LoadAssetBundleFromResources("StarLevelSystem.assets.starlevelsystems", typeof(StarLevelSystem).Assembly);
			HarmonyInstance = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "MidnightsFX.StarLevelSystem");
			Compatibility.ApplyConditionalPatches(HarmonyInstance);
			Colorization.Init();
			LevelSystemData.Init();
			LootSystemData.Init();
			CreatureModifiersData.Init();
			RaidsData.Init();
			NemesisSystemData.Init();
			QuickConfigureTool.Init();
			LocalizationLoader.AddLocalizations();
			PrefabManager.OnVanillaPrefabsAvailable += CreatureModifiersData.LoadPrefabs;
			PrefabManager.OnVanillaPrefabsAvailable += UpdateLevelsOnChange.UpdateFishMaxLevel;
			PrefabManager.OnVanillaPrefabsAvailable += UIHudControl.SetDefaultStar;
			PrefabManager.OnVanillaPrefabsAvailable += NemesisRemoteSpawnControl.LoadAssets;
			PrefabManager.OnPrefabsRegistered += LootSystemData.AttachPrefabsWhenReady;
			MinimapManager.OnVanillaMapDataLoaded += DistanceScaleSystem.DelayedMinimapSetup;
			MinimapManager.OnVanillaMapDataLoaded += ZoneScaleSystem.Initialize;
			MinimapManager.OnVanillaMapDataLoaded += NemesisMinimap.OnMapReady;
			PrefabManager.OnPrefabsRegistered += SizeModifications.PrepareSizeRefCache;
			SynchronizationManager.OnConfigurationSynchronized += delegate
			{
				ValConfig.HasServerUpdates();
			};
			UIHudControl.LoadAssets();
			RaidControl.LoadAssets();
			TerminalCommands.AddCommands();
			NemesisSystem.Initialize();
			ConfigFileWatcher.Initialize();
		}
	}
}
namespace StarLevelSystem.modules
{
	public static class APIReciever
	{
		public static bool UpdateCreatureLevel(Character chara, int level)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return false;
			}
			Logger.LogDebug($"SLS-API: Update Creature level {chara} - {level}");
			LevelSelection.SetAndUpdateCharacterLevel(chara, level);
			return true;
		}

		public static bool UpdateCreatureColorization(Character chara, float value, float hue, float sat, bool emission = false)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return false;
			}
			DataObjects.CharacterCacheEntry cacheEntry = CompositeLazyCache.GetCacheEntry(chara);
			if (cacheEntry == null)
			{
				return false;
			}
			cacheEntry.Colorization = Colorization.DetermineCharacterColorization(chara, chara.m_level);
			CompositeLazyCache.UpdateCharacterCacheEntry(chara, cacheEntry);
			Colorization.ApplyColorizationWithoutLevelEffects(((Component)chara).gameObject, cacheEntry.Colorization);
			return true;
		}

		public static float GetBaseAttributeValue(Character chara, int attribute)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return -1f;
			}
			return CompositeLazyCache.GetAndSetLocalCache(chara)?.CreatureBaseValueModifiers[(DataObjects.CreatureBaseAttribute)attribute] ?? (-1f);
		}

		public static bool UpdateCreatureBaseAttributes(Character chara, int attribute, float value)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return false;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return false;
			}
			andSetLocalCache.CreatureBaseValueModifiers[(DataObjects.CreatureBaseAttribute)attribute] = value;
			if (attribute == 4)
			{
				SizeModifications.SetSizeModification(((Component)chara).gameObject, chara.m_nview, andSetLocalCache, update: true);
			}
			return true;
		}

		public static Dictionary<int, float> GetAllBaseAttributes(Character chara)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return null;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return null;
			}
			Dictionary<int, float> dictionary = new Dictionary<int, float>();
			foreach (KeyValuePair<DataObjects.CreatureBaseAttribute, float> creatureBaseValueModifier in andSetLocalCache.CreatureBaseValueModifiers)
			{
				dictionary[(int)creatureBaseValueModifier.Key] = creatureBaseValueModifier.Value;
			}
			return dictionary;
		}

		public static bool SetAllBaseAttributes(Character chara, Dictionary<int, float> attributes)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return false;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return false;
			}
			foreach (KeyValuePair<int, float> attribute in attributes)
			{
				andSetLocalCache.CreatureBaseValueModifiers[(DataObjects.CreatureBaseAttribute)attribute.Key] = attribute.Value;
			}
			CompositeLazyCache.UpdateCharacterCacheEntry(chara, andSetLocalCache);
			SpeedModifications.ApplySpeedModifications(chara, andSetLocalCache);
			DamageModifications.ApplyDamageModification(chara, andSetLocalCache);
			SizeModifications.SetSizeModification(((Component)chara).gameObject, chara.m_nview, andSetLocalCache, update: true);
			HealthModifications.ForceApplyHealthModifications(chara, andSetLocalCache);
			return true;
		}

		public static float GetPerLevelAttributeValue(Character chara, int attribute)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return -1f;
			}
			return CompositeLazyCache.GetAndSetLocalCache(chara)?.CreaturePerLevelValueModifiers[(DataObjects.CreaturePerLevelAttribute)attribute] ?? (-1f);
		}

		public static bool UpdateCreaturePerLevelAttributes(Character chara, int attribute, float value)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return false;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return false;
			}
			andSetLocalCache.CreaturePerLevelValueModifiers[(DataObjects.CreaturePerLevelAttribute)attribute] = value;
			if (attribute == 4)
			{
				SizeModifications.SetSizeModification(((Component)chara).gameObject, chara.m_nview, andSetLocalCache, update: true);
			}
			return true;
		}

		public static Dictionary<int, float> GetAllPerLevelAttributes(Character chara)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return null;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return null;
			}
			Dictionary<int, float> dictionary = new Dictionary<int, float>();
			foreach (KeyValuePair<DataObjects.CreaturePerLevelAttribute, float> creaturePerLevelValueModifier in andSetLocalCache.CreaturePerLevelValueModifiers)
			{
				dictionary[(int)creaturePerLevelValueModifier.Key] = creaturePerLevelValueModifier.Value;
			}
			return dictionary;
		}

		public static bool SetAllPerLevelAttributes(Character chara, Dictionary<int, float> attributes)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return false;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return false;
			}
			foreach (KeyValuePair<int, float> attribute in attributes)
			{
				andSetLocalCache.CreaturePerLevelValueModifiers[(DataObjects.CreaturePerLevelAttribute)attribute.Key] = attribute.Value;
			}
			CompositeLazyCache.UpdateCharacterCacheEntry(chara, andSetLocalCache);
			SpeedModifications.ApplySpeedModifications(chara, andSetLocalCache);
			DamageModifications.ApplyDamageModification(chara, andSetLocalCache);
			SizeModifications.SetSizeModification(((Component)chara).gameObject, chara.m_nview, andSetLocalCache, update: true);
			HealthModifications.ForceApplyHealthModifications(chara, andSetLocalCache);
			return true;
		}

		public static float GetCreatureDamageRecievedModifier(Character chara, int attribute)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return -1f;
			}
			return CompositeLazyCache.GetAndSetLocalCache(chara)?.DamageRecievedModifiers[(DataObjects.DamageType)attribute] ?? (-1f);
		}

		public static bool UpdateCreatureDamageRecievedModifier(Character chara, int attribute, float value)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return false;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return false;
			}
			andSetLocalCache.DamageRecievedModifiers[(DataObjects.DamageType)attribute] = value;
			return true;
		}

		public static Dictionary<int, float> GetAllDamageRecievedModifiers(Character chara)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return null;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return null;
			}
			Dictionary<int, float> dictionary = new Dictionary<int, float>();
			foreach (KeyValuePair<DataObjects.DamageType, float> damageRecievedModifier in andSetLocalCache.DamageRecievedModifiers)
			{
				dictionary[(int)damageRecievedModifier.Key] = damageRecievedModifier.Value;
			}
			return dictionary;
		}

		public static bool SetAllDamageRecievedModifiers(Character chara, Dictionary<int, float> attributes)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return false;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return false;
			}
			foreach (KeyValuePair<int, float> attribute in attributes)
			{
				andSetLocalCache.DamageRecievedModifiers[(DataObjects.DamageType)attribute.Key] = attribute.Value;
			}
			CompositeLazyCache.UpdateCharacterCacheEntry(chara, andSetLocalCache);
			DamageModifications.ApplyDamageModification(chara, andSetLocalCache);
			return true;
		}

		public static float GetCreatureDamageBonus(Character chara, int attribute)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return -1f;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return -1f;
			}
			if (andSetLocalCache.CreatureDamageBonus.ContainsKey((DataObjects.DamageType)attribute))
			{
				return andSetLocalCache.CreatureDamageBonus[(DataObjects.DamageType)attribute];
			}
			return 0f;
		}

		public static bool UpdateCreatureDamageBonus(Character chara, int attribute, float value)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return false;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return false;
			}
			if (!andSetLocalCache.CreatureDamageBonus.ContainsKey((DataObjects.DamageType)attribute))
			{
				andSetLocalCache.CreatureDamageBonus[(DataObjects.DamageType)attribute] = value;
			}
			else
			{
				andSetLocalCache.CreatureDamageBonus.Add((DataObjects.DamageType)attribute, value);
			}
			return true;
		}

		public static Dictionary<int, float> GetAllDamageBonus(Character chara)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return null;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return null;
			}
			Dictionary<int, float> dictionary = new Dictionary<int, float>();
			foreach (KeyValuePair<DataObjects.DamageType, float> creatureDamageBonu in andSetLocalCache.CreatureDamageBonus)
			{
				dictionary[(int)creatureDamageBonu.Key] = creatureDamageBonu.Value;
			}
			return dictionary;
		}

		public static bool SetAllDamageBonus(Character chara, Dictionary<int, float> attributes)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return false;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return false;
			}
			foreach (KeyValuePair<int, float> attribute in attributes)
			{
				andSetLocalCache.CreatureDamageBonus[(DataObjects.DamageType)attribute.Key] = attribute.Value;
			}
			CompositeLazyCache.UpdateCharacterCacheEntry(chara, andSetLocalCache);
			DamageModifications.ApplyDamageModification(chara, andSetLocalCache);
			return true;
		}

		public static bool ApplyUpdatesToCreature(Character chara)
		{
			if ((Object)(object)chara == (Object)null)
			{
				return false;
			}
			DataObjects.CharacterCacheEntry andSetLocalCache = CompositeLazyCache.GetAndSetLocalCache(chara);
			if (andSetLocalCache == null)
			{
				return false;
			}
			SpeedModifications.ApplySpeedModifications(chara, andSetLocalCache);
			DamageModifications.ApplyDamageModification(chara, andSetLocalCache);
			SizeModifications.SetSizeModification(((Component)chara).gameObject, chara.m_nview, andSetLocalCache, update: true);
			HealthModifications.ForceApplyHealthModifications(chara, andSetLocalCache);
			return true;
		}

		public static List<string> GetPossibleModifiersForType(int modifierType)
		{
			List<string> list = new List<string>();
			switch (modifierType)
			{
			case 0:
				foreach (string key in CreatureModifiersData.ActiveCreatureModifiers.MajorModifiers.Keys)
				{
					list.Add(key);
				}
				break;
			case 1:
				foreach (string key2 in CreatureModifiersData.ActiveCreatureModifiers.MinorModifiers.Keys)
				{
					list.Add(key2);
				}
				break;
			case 2:
				foreach (string key3 in CreatureModifiersData.ActiveCreatureModifiers.BossModifiers.Keys)
				{
					list.Add(key3);
				}
				break;
			default:
				Logger.LogWarning($"Invalid modifier type {modifierType} passed to GetAllPossibleModifiers. Valid types are 0 (Major), 1 (Minor), 2 (Boss).");
				break;
			}
			return list;
		}

		public static Dictionary<string, int> GetAllModifiersForCreature(Character chara)
		{
			Dictionary<string, DataObjects.ModifierType> creatureModifiers = CompositeLazyCache.GetCreatureModifiers(chara);
			if (creatureModifiers == null)
			{
				return null;
			}
			Dictionary<string, int> dictionary = new Dictionary<string, int>();
			foreach (KeyValuePair<string, DataObjects.ModifierType> item in creatureModifiers)
			{
				dictionary.Add(item.Key.ToString(), (int)item.Value);
			}
			return dictionary;
		}

		public static bool AddModifierToCreature(Character chara, string modifierName, int modifierType, bool update = true)
		{
			if (CompositeLazyCache.GetAndSetLocalCache(chara) == null)
			{
				return false;
			}
			return CreatureModifiers.AddCreatureModifier(chara, (DataObjects.ModifierType)modifierType, modifierName, update);
		}

		public static bool AddNewModifierToSLS(int modifierID, string modifier_name, Delegate setupMethod = null, float selectionWeight = 10f, float basepower = 0f, float perlevelpower = 0f, Dictionary<Biome, List<string>> biomeConfig = null, int namingStyle = 2, string name_suffixes = null, string name_prefixes = null, int visualStyle = 0, Sprite starIcon = null, GameObject visualEffect = null, List<string> allowed_creatures = null, List<string> unallowed_creatures = null, List<Biome> allowed_biomes = null)
		{
			if (CreatureModifiersData.ModifierNamesLookupTable.ContainsID(modifierID))
			{
				Logger.LogWarning($"Modifier ID {modifierID} already exists as {CreatureModifiersData.ModifierNamesLookupTable.GetValue(modifierID)}, please choose a different ID");
				return false;
			}
			CreatureModifiersData.ModifierNamesLookupTable.AddValue(modifier_name, modifierID);
			DataObjects.CreatureModifierDefinition creatureModifierDefinition = new DataObjects.CreatureModifierDefinition();
			if ((Object)(object)starIcon != (Object)null)
			{
				creatureModifierDefinition.StarVisualAPI = starIcon;
				creatureModifierDefinition.StarVisual = ((Object)starIcon).name;
			}
			if ((Object)(object)visualEffect != (Object)null)
			{
				creatureModifierDefinition.VisualEffectAPI = visualEffect;
				creatureModifierDefinition.VisualEffect = ((Object)visualEffect).name;
			}
			if ((object)setupMethod != null)
			{
				creatureModifierDefinition.SetupEvent = setupMethod;
			}
			if (name_suffixes != null)
			{
				creatureModifierDefinition.NameSuffix = name_suffixes;
			}
			if (name_prefixes != null)
			{
				creatureModifierDefinition.NamePrefix = name_prefixes;
			}
			if (namingStyle > 2 || namingStyle < 0)
			{
				namingStyle = 2;
			}
			creatureModifierDefinition.NamingConvention = (DataObjects.NameSelectionStyle)namingStyle;
			if (visualStyle > 3 || visualStyle < 0)
			{
				visualStyle = 0;
			}
			creatureModifierDefinition.VisualEffectStyle = (DataObjects.VisualEffectStyle)visualStyle;
			DataObjects.CreatureModifierConfiguration creatureModifierConfiguration = new DataObjects.CreatureModifierConfiguration();
			creatureModifierConfiguration.Config = new DataObjects.CreatureModConfig
			{
				BasePower = basepower,
				PerlevelPower = perlevelpower,
				BiomeObjects = biomeConfig
			};
			creatureModifierConfiguration.SelectionWeight = selectionWeight;
			if (allowed_creatures != null)
			{
				creatureModifierConfiguration.AllowedCreatures = allowed_creatures;
			}
			if (unallowed_creatures != null)
			{
				creatureModifierConfiguration.UnallowedCreatures = unallowed_creatures;
			}
			if (allowed_biomes != null)
			{
				creatureModifierConfiguration.AllowedBiomes = allowed_biomes;
			}
			CreatureModifiersData.ClearProbabilityCaches();
			return true;
		}
	}
	public static class Colorization
	{
		[HarmonyPatch(typeof(LevelEffects), "SetupLevelVisualization")]
		public static class PreventDefaultLevelSetup
		{
			public static bool Prefix()
			{
				return false;
			}
		}

		public static DataObjects.CreatureColorizationSettings creatureColorizationSettings = defaultColorizationSettings;

		private static DataObjects.CreatureColorizationSettings defaultColorizationSettings = new DataObjects.CreatureColorizationSettings
		{
			CharacterSpecificColorization = ColorizationData.characterColorizationData,
			DefaultLevelColorization = ColorizationData.defaultColorizationData,
			CharacterColorGenerators = ColorizationData.defaultColorGenerators
		};

		public static List<Color> mapRingColors = new List<Color>();

		public static List<Color> zoneOverlayColors = new List<Color>();

		public static readonly Dictionary<string, string> defaultColors = new Dictionary<string, string>
		{
			{ "Red", "#ff1a1a" },
			{ "Orange", "#ff9933" },
			{ "Yellow", "#ffff1a" },
			{ "Green", "#50f83a" },
			{ "Teal", "#18e7a9" },
			{ "Blue", "#00abff" },
			{ "Purple", "#c966ff" },
			{ "Pink", "#ff4dcf" },
			{ "Gray", "#999999" },
			{ "Brown", "#b37700" },
			{ "Black", "#333333" },
			{ "White", "#f2f2f2" },
			{ "LightYellow", "#ffff99" },
			{ "LightOrange", "#ffc266" },
			{ "DarkOrange", "#cc6600" },
			{ "LightRed", "#ff6666" },
			{ "DarkRed", "#b30000" },
			{ "LightPurple", "#e0b3ff" },
			{ "DarkPurple", "#8000b3" }
		};

		public static DataObjects.ColorDef defaultColorization = new DataObjects.ColorDef
		{
			Hue = 0f,
			Saturation = 0f,
			Value = 0f,
			IsEmissive = false
		};

		public static void Init()
		{
			creatureColorizationSettings = defaultColorizationSettings;
			try
			{
				UpdateYamlConfig(File.ReadAllText(ValConfig.colorsFilePath));
			}
			catch (Exception arg)
			{
				Logger.LogWarning((object)$"There was an error updating the Color Level values, defaults will be used. Exception: {arg}");
			}
		}

		public static string YamlDefaultConfig()
		{
			return DataObjects.yamlSerializer.Serialize((object)defaultColorizationSettings);
		}

		public static bool UpdateYamlConfig(string yaml)
		{
			try
			{
				Colorization.creatureColorizationSettings = DataObjects.yamlDeserializer.Deserialize<DataObjects.CreatureColorizationSettings>(yaml);
				foreach (KeyValuePair<int, DataObjects.ColorDef> item in defaultColorizationSettings.DefaultLevelColorization)
				{
					if (!Enumerable.Contains(Colorization.creatureColorizationSettings.DefaultLevelColorization.Keys, item.Key))
					{
						Colorization.creatureColorizationSettings.DefaultLevelColorization.Add(item.Key, item.Value);
					}
				}
				if (Colorization.creatureColorizationSettings.CharacterColorGenerators != null)
				{
					Logger.LogInfo("Running color generators");
					DataObjects.CreatureColorizationSettings creatureColorizationSettings = Colorization.creatureColorizationSettings;
					if (creatureColorizationSettings.CharacterSpecificColorization == null)
					{
						Dictionary<string, Dictionary<int, DataObjects.ColorDef>> dictionary = (creatureColorizationSettings.CharacterSpecificColorization = new Dictionary<string, Dictionary<int, DataObjects.ColorDef>>());
					}
					foreach (KeyValuePair<string, List<DataObjects.ColorRangeDef>> characterColorGenerator in Colorization.creatureColorizationSettings.CharacterColorGenerators)
					{
						Logger.LogInfo("Building color range for " + characterColorGenerator.Key);
						foreach (DataObjects.ColorRangeDef item2 in characterColorGenerator.Value)
						{
							BuildAddColorRange(characterColorGenerator.Key, item2);
						}
					}
					if (ValConfig.OutputColorizationGeneratorsData.Value)
					{
						File.WriteAllText(Path.Combine(Paths.ConfigPath, "StarLevelSystem", "DebugGeneratedColorValues.yaml"), DataObjects.yamlSerializer.Serialize((object)Colorization.creatureColorizationSettings));
					}
				}
				Logger.LogInfo("Updated ColorizationSettings.");
				Character[] array = Resources.FindObjectsOfTypeAll<Character>();
				foreach (Character val in array)
				{
					if (val.m_level > 1)
					{
						DataObjects.CharacterCacheEntry cacheEntry = CompositeLazyCache.GetCacheEntry(val);
						if (cacheEntry != null)
						{
							cacheEntry.Colorization = DetermineCharacterColorization(val, val.m_level);
							CompositeLazyCache.UpdateCharacterCacheEntry(val, cacheEntry);
							ApplyColorizationWithoutLevelEffects(((Component)val).gameObject, cacheEntry.Colorization);
						}
					}
				}
			}
			catch (Exception ex)
			{
				StarLevelSystem.Log.LogError((object)("Failed to parse ColorizationSettings YAML: " + ex.Message));
				StarLevelSystem.Log.LogError((object)"Colorization will use internal defaults.");
				Colorization.creatureColorizationSettings = defaultColorizationSettings;
				return false;
			}
			return true;
		}

		public static void ApplyLevelVisual(Character charc)
		{
			LevelEffects componentInChildren = ((Component)charc).gameObject.GetComponentInChildren<LevelEffects>();
			if (!((Object)(object)componentInChildren == (Object)null) && componentInChildren.m_levelSetups != null && componentInChildren.m_levelSetups.Count > 0)
			{
				LevelSetup val = componentInChildren.m_levelSetups[Random.Range(0, componentInChildren.m_levelSetups.Count - 1)];
				if ((Object)(object)val.m_enableObject != (Object)null)
				{
					val.m_enableObject.SetActive(true);
				}
			}
		}

		internal static DataObjects.ColorDef DetermineCharacterColorization(Character cgo, int level)
		{
			if ((Object)(object)cgo == (Object)null)
			{
				return null;
			}
			string prefabName = Utils.GetPrefabName(((Component)cgo).gameObject);
			if (creatureColorizationSettings.CharacterSpecificColorization != null && creatureColorizationSettings.CharacterSpecificColorization.ContainsKey(prefabName) && creatureColorizationSettings.CharacterSpecificColorization[prefabName].ContainsKey(level - 1) && creatureColorizationSettings.CharacterSpecificColorization[prefabName].TryGetValue(level - 1, out var value))
			{
				return value;
			}
			return GetDefaultColorization(level - 1);
		}

		internal static void ApplyColorizationWithoutLevelEffects(GameObject cgo, DataObjects.ColorDef colorization)
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Expected O, but got Unknown
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			if (!ValConfig.EnableColorization.Value || colorization == null)
			{
				return;
			}
			LevelSetup val = colorization.ToLevelEffect();
			try
			{
				SkinnedMeshRenderer[] componentsInChildren = cgo.gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
				foreach (SkinnedMeshRenderer val2 in componentsInChildren)
				{
					Material[] sharedMaterials = ((Renderer)val2).sharedMaterials;
					if (sharedMaterials.Length != 0)
					{
						sharedMaterials[0] = new Material(sharedMaterials[0]);
						sharedMaterials[0].SetFloat("_Hue", val.m_hue);
						sharedMaterials[0].SetFloat("_Saturation", val.m_saturation);
						sharedMaterials[0].SetFloat("_Value", val.m_value);
						if (val.m_setEmissiveColor)
						{
							sharedMaterials[0].SetColor("_EmissionColor", val.m_emissiveColor);
						}
						((Renderer)val2).sharedMaterials = sharedMaterials;
					}
				}
			}
			catch (Exception arg)
			{
				Logger.LogError($"Exception while colorizing {arg}");
			}
		}

		internal static void BuildAddColorRange(string creatureKey, DataObjects.ColorRangeDef colorGen)
		{
			float num = Mathf.Abs(colorGen.EndColorDef.Hue) + Mathf.Abs(colorGen.StartColorDef.Hue);
			Mathf.Clamp(num, 0f, 2f);
			float num2 = Mathf.Abs(colorGen.EndColorDef.Saturation) + Mathf.Abs(colorGen.StartColorDef.Saturation);
			Mathf.Clamp(num2, 0f, 2f);
			float num3 = Mathf.Abs(colorGen.EndColorDef.Value) + Mathf.Abs(colorGen.StartColorDef.Value);
			Mathf.Clamp(num3, 0f, 2f);
			int num4 = colorGen.RangeEnd - colorGen.RangeStart;
			float num5 = num / (float)num4;
			float num6 = num2 / (float)num4;
			float num7 = num3 / (float)num4;
			int num8 = ((!(colorGen.StartColorDef.Hue > colorGen.EndColorDef.Hue)) ? 1 : (-1));
			int num9 = ((!(colorGen.StartColorDef.Saturation > colorGen.EndColorDef.Saturation)) ? 1 : (-1));
			int num10 = ((!(colorGen.StartColorDef.Value > colorGen.EndColorDef.Value)) ? 1 : (-1));
			if (colorGen.CharacterSpecific && !creatureColorizationSettings.CharacterSpecificColorization.ContainsKey(creatureKey))
			{
				creatureColorizationSettings.CharacterSpecificColorization.Add(creatureKey, new Dictionary<int, DataObjects.ColorDef>());
			}
			int num11 = colorGen.RangeStart;
			int num12 = 0;
			while (num11 < colorGen.RangeEnd + 1)
			{
				DataObjects.ColorDef value = new DataObjects.ColorDef
				{
					Hue = colorGen.StartColorDef.Hue + num5 * (float)num12 * (float)num8,
					Saturation = colorGen.StartColorDef.Saturation + num6 * (float)num12 * (float)num9,
					Value = colorGen.StartColorDef.Value + num7 * (float)num12 * (float)num10,
					IsEmissive = false
				};
				if (colorGen.CharacterSpecific)
				{
					if (!creatureColorizationSettings.CharacterSpecificColorization.ContainsKey(creatureKey))
					{
						creatureColorizationSettings.CharacterSpecificColorization.Add(creatureKey, new Dictionary<int, DataObjects.ColorDef>());
					}
					if (creatureColorizationSettings.CharacterSpecificColorization[creatureKey].ContainsKey(num11))
					{
						if (colorGen.OverwriteExisting)
						{
							creatureColorizationSettings.CharacterSpecificColorization[creatureKey][num11] = value;
						}
					}
					else
					{
						creatureColorizationSettings.CharacterSpecificColorization[creatureKey].Add(num11, value);
					}
				}
				else if (creatureColorizationSettings.DefaultLevelColorization.ContainsKey(num11))
				{
					if (colorGen.OverwriteExisting)
					{
						creatureColorizationSettings.DefaultLevelColorization[num11] = value;
					}
				}
				else
				{
					creatureColorizationSettings.DefaultLevelColorization.Add(num11, value);
				}
				num11++;
				num12++;
			}
		}

		internal static DataObjects.ColorDef GetDefaultColorization(int level)
		{
			if (creatureColorizationSettings.DefaultLevelColorization.ContainsKey(level))
			{
				return creatureColorizationSettings.DefaultLevelColorization[level];
			}
			return defaultColorization;
		}

		public static void UpdateMapColorSelection()
		{
			ParseColorOptions(ValConfig.DistanceRingColorOptions.Value, mapRingColors, "distance ring");
		}

		public static void UpdateZoneOverlayColorSelection()
		{
			ParseColorOptions(ValConfig.ZoneOverlayColorOptions.Value, zoneOverlayColors, "zone overlay");
		}

		private static void ParseColorOptions(string optionsCsv, List<Color> target, string contextLabel)
		{
			//IL_004c: 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)
			target.Clear();
			Color item = default(Color);
			Color item2 = default(Color);
			foreach (string item3 in optionsCsv.Split(new char[1] { ',' }).ToList())
			{
				if (item3.StartsWith("#"))
				{
					if (ColorUtility.TryParseHtmlString(item3.Trim(), ref item))
					{
						target.Add(item);
						continue;
					}
					Logger.LogWarning("Unable to parse color string " + item3 + " for " + contextLabel + " colors. It will be skipped");
				}
				else
				{
					string key = StringExtensions.CapitalizeFirstLetter(item3.Trim());
					if (defaultColors.TryGetValue(key, out var value) && ColorUtility.TryParseHtmlString(value, ref item2))
					{
						target.Add(item2);
					}
				}
			}
		}
	}
	internal static class Compatibility
	{
		public static bool IsDropThatEnabled;

		public static bool IsExpandWorldEnabled;

		public static bool IsFGNEnabled;

		public static bool IsCustomRaidsEnabled;

		public static bool IsJewelcraftingEnabled;

		private static Type DropThatCharacterDropSessionManager;

		private static MethodInfo DropThatCharacterModifyDrop;

		private static MethodInfo JewelcraftingBossHudPostfix;

		public static bool CustomRaidsCompatActive
		{
			get
			{
				if (IsCustomRaidsEnabled)
				{
					return ValConfig.EnableCustomRaidsCompat.Value;
				}
				return false;
			}
		}

		public static bool DropThatCharacterModifyAvailable => DropThatCharacterModifyDrop != null;

		internal static void CheckModCompat()
		{
			try
			{
				Dictionary<string, BaseUnityPlugin> plugins = BepInExUtils.GetPlugins(false);
				if (plugins == null)
				{
					return;
				}
				if (Enumerable.Contains(plugins.Keys, "asharppen.valheim.drop_that"))
				{
					IsDropThatEnabled = true;
					DropThatCharacterDropSessionManager = Type.GetType("DropThat.Drop.CharacterDropSystem.Managers.CharacterDropSessionManager, DropThat");
					if (DropThatCharacterDropSessionManager != null)
					{
						DropThatCharacterModifyDrop = DropThatCharacterDropSessionManager.GetMethod("ModifyDrop", BindingFlags.Static | BindingFlags.Public, null, new Type[3]
						{
							typeof(GameObject),
							typeof(List<KeyValuePair<GameObject, int>>),
							typeof(int)
						}, null);
					}
					if (!DropThatCharacterModifyAvailable)
					{
						Logger.LogWarning("Warning: DropThat compat method (CharacterDropSessionManager.ModifyDrop) not found; DropThat item modifiers will not be applied to creature loot.");
					}
				}
				if (Enumerable.Contains(plugins.Keys, "com.Fire.FiresGhettoNetworkMod"))
				{
					IsFGNEnabled = true;
				}
				if (Enumerable.Contains(plugins.Keys, "expand_world_size"))
				{
					IsExpandWorldEnabled = true;
				}
				if (Enumerable.Contains(plugins.Keys, "asharppen.valheim.custom_raids"))
				{
					IsCustomRaidsEnabled = true;
					Logger.LogInfo("Valheim.CustomRaids detected; CustomRaids raids will fire alongside SLS raids while EnableCustomRaidsCompat is enabled.");
				}
				if (Enumerable.Contains(plugins.Keys, "org.bepinex.plugins.jewelcrafting"))
				{
					IsJewelcraftingEnabled = true;
					JewelcraftingBossHudPostfix = AccessTools.Method("Jewelcrafting.WorldBosses.BossHud+DisplayMultipleBossHuds:Postfix", (Type[])null, (Type[])null);
					if (JewelcraftingBossHudPostfix == null)
					{
						Logger.LogWarning("Jewelcrafting detected but DisplayMultipleBossHuds.Postfix could not be found; boss-HUD compatibility patch will be skipped.");
					}
				}
			}
			catch
			{
				Logger.LogWarning("Unable to check mod compatibility. Ensure that Bepinex can load.");
			}
		}

		public static void DropThat_ModifyCharacterDrop(GameObject drop, List<KeyValuePair<GameObject, int>> drops, int index)
		{
			if (!DropThatCharacterModifyAvailable)
			{
				return;
			}
			try
			{
				DropThatCharacterModifyDrop.Invoke(null, new object[3] { drop, drops, index });
			}
			catch (Exception ex)
			{
				Logger.LogWarning("DropThat ModifyDrop failed: " + ex.Message);
			}
		}

		internal static void ApplyConditionalPatches(Harmony harmony)
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			if (IsJewelcraftingEnabled && JewelcraftingBossHudPostfix != null)
			{
				harmony.Patch((MethodBase)JewelcraftingBossHudPostfix, new HarmonyMethod(AccessTools.Method(typeof(Compatibility), "SkipJewelcraftingBossHud", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				Logger.LogInfo("Jewelcrafting detected; suppressing its multi-boss HUD layout so SLS controls the boss healthbars.");
			}
		}

		private static bool SkipJewelcraftingBossHud()
		{
			return !ValConfig.EnableJewelCraftingBossHudCompat.Value;
		}
	}
	public static class MultiplayerDamageMod
	{
		[HarmonyPatch(typeof(Game), "GetDifficultyDamageScalePlayer")]
		public static class PatchPerPlayerDamageScaling
		{
			public static bool Prefix(Game __instance, Vector3 pos, ref float __result)
			{
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				if (!ValConfig.EnableMultiplayerEnemyDamageScaling.Value)
				{
					__result = 1f;
					return false;
				}
				int playerDifficulty = __instance.GetPlayerDifficulty(pos);
				if (playerDifficulty >= ValConfig.MultiplayerScalingRequiredPlayersNearby.Value)
				{
					float num = (1f + (float)playerDifficulty) * ValConfig.MultiplayerEnemyDamageModifier.Value;
					__result = 1f + num;
				}
				else
				{
					__result = 1f;
				}
				return false;
			}
		}
	}
	public static class MultiplayerHealthMod
	{
		[HarmonyPatch(typeof(Game), "GetDifficultyDamageScaleEnemy")]
		public static class PatchPerPlayerDamageScaling
		{
			public static bool Prefix(Game __instance, Vector3 pos, ref float __result)
			{
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				if (!ValConfig.EnableMultiplayerEnemyHealthScaling.Value)
				{
					__result = 1f;
					return false;
				}
				int playerDifficulty = __instance.GetPlayerDifficulty(pos);
				if (playerDifficulty >= ValConfig.MultiplayerScalingRequiredPlayersNearby.Value)
				{
					__result = Mathf.Max(1f - (float)playerDifficulty * ValConfig.MultiplayerEnemyHealthModifier.Value, ValConfig.MultiplayerEnemyMinDamageTaken.Value);
				}
				else
				{
					__result = 1f;
				}
				return false;
			}
		}
	}
	internal class SpawnLevelExtension
	{
		[HarmonyPatch]
		internal static class SpawnCommandDelegate
		{
			[HarmonyTargetMethod]
			internal static MethodBase FindSpawnCommandDelegateMethod()
			{
				return (from method in AccessTools.GetDeclaredMethods(typeof(Terminal))
					where method.Name.IndexOf("__spawn|", StringComparison.Ordinal) >= 0
					select method).FirstOrDefault();
			}

			[HarmonyTranspiler]
			internal static IEnumerable<CodeInstruction> SpawnCommandDelegateTranspiler(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
			{
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				//IL_0068: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Expected O, but got Unknown
				//IL_007c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0082: Expected O, but got Unknown
				//IL_0090: Unknown result type (might be due to invalid IL or missing references)
				//IL_0096: Expected O, but got Unknown
				//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00aa: Expected O, but got Unknown
				//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d8: Expected O, but got Unknown
				//IL_0106: Unknown result type (might be due to invalid IL or missing references)
				//IL_010c: Expected O, but got Unknown
				//IL_0136: Unknown result type (might be due to invalid IL or missing references)
				//IL_0140: Expected O, but got Unknown
				//IL_0169: Unknown result type (might be due to invalid IL or missing references)
				//IL_016f: Expected O, but got Unknown
				//IL_0199: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a3: Expected O, but got Unknown
				//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_01d2: Expected O, but got Unknown
				//IL_0200: Unknown result type (might be due to invalid IL or missing references)
				//IL_0206: Expected O, but got Unknown
				//IL_0229: Unknown result type (might be due to invalid IL or missing references)
				//IL_022f: Expected O, but got Unknown
				//IL_023d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0243: Expected O, but got Unknown
				//IL_0251: Unknown result type (might be due to invalid IL or missing references)
				//IL_0257: Expected O, but got Unknown
				//IL_026c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0276: Expected O, but got Unknown
				//IL_027c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0286: Expected O, but got Unknown
				//IL_028c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0296: Expected O, but got Unknown
				Type[] array = new Type[2]
				{
					typeof(int),
					typeof(int)
				};
				return new CodeMatcher(instructions, generator).Start().MatchStartForward((CodeMatch[])(object)new CodeMatch[4]
				{
					new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(ItemDrop), "OnCreateNew", new Type[1] { typeof(GameObject) }, (Type[])null), (string)null),
					new CodeMatch((OpCode?)OpCodes.Ldarg_1, (object)null, (string)null),
					new CodeMatch((OpCode?)OpCodes.Ldfld, (object)null, (string)null),
					new CodeMatch((OpCode?)OpCodes.Ldc_I4_1, (object)null, (string)null)
				}).ThrowIfInvalid("Could not patch Terminal.SpawnCommandDelegate()! (level-compare)")
					.Advance(3)
					.RemoveInstruction()
					.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1]
					{
						new CodeInstruction(OpCodes.Ldc_I4_0, (object)null)
					})
					.MatchStartForward((CodeMatch[])(object)new CodeMatch[1]
					{
						new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(Mathf), "Min", array, (Type[])null), (string)null)
					})
					.ThrowIfInvalid("Could not patch Terminal.SpawnCommandDelegate()! (mathf-min-4)")
					.SetInstructionAndAdvance(new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(SpawnCommandDelegate), "MathfMinDelegate", (Type[])null, (Type[])null)))
					.MatchStartForward((CodeMatch[])(object)new CodeMatch[1]
					{
						new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(Mathf), "Min", array, (Type[])null), (string)null)
					})
					.ThrowIfInvalid("Could not patch Terminal.SpawnCommandDelegate()! (mathf-min-9)")
					.SetInstructionAndAdvance(new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(SpawnCommandDelegate), "MathfMinDelegate", (Type[])null, (Type[])null)))
					.MatchStartForward((CodeMatch[])(object)new CodeMatch[1]
					{
						new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(Character), "SetLevel", (Type[])null, (Type[])null), (string)null)
					})
					.RemoveInstructions(1)
					.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1]
					{
						new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(SpawnCommandDelegate), "SetCreatureSpawnLevel", (Type[])null, (Type[])null))
					})
					.ThrowIfInvalid("Could not patch terminal.SpawnCommandDelegate()! (SetCreatureSpawnLevel)")
					.MatchStartForward((CodeMatch[])(object)new CodeMatch[3]
					{
						new CodeMatch((OpCode?)OpCodes.Ldarg_1, (object)null, (string)null),
						new CodeMatch((OpCode?)OpCodes.Ldc_I4_4, (object)null, (string)null),
						new CodeMatch((OpCode?)OpCodes.Stfld, (object)null, (string)null)
					})
					.ThrowIfInvalid("Could not patch Terminal.SpawnCommandDelegate()! (set-level-4)")
					.SetInstructionAndAdvance(new CodeInstruction(OpCodes.Nop, (object)null))
					.SetInstructionAndAdvance(new CodeInstruction(OpCodes.Nop, (object)null))
					.SetInstructionAndAdvance(new CodeInstruction(OpCodes.Nop, (object)null))
					.InstructionEnumeration();
			}

			private static int MathfMinDelegate(int level, int value)
			{
				return level;
			}

			private static void SetCreatureSpawnLevel(Character chara, int level)
			{
				CompositeLazyCache.GetAndSetLocalCache(chara, level, null, null, updateCache: true);
				chara.m_nview.GetZDO().Set(ZDOVars.s_level, level, false);
				CreatureSetupControl.CreatureSetup(chara, level, multiply: false, 0.01f);
			}
		}
	}
	internal class Spawnrate
	{
		internal static bool CheckSetApplySpawnrate(Character chara, DataObjects.CharacterCacheEntry ccEntry)
		{
			//IL_00a3: 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_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: 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_00c6: 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_0134: Unknown result type (might be due to invalid IL or missing references)
			if (ValConfig.BossCreaturesNeverSpawnMultiply.Value && chara.IsBoss())
			{
				return false;
			}
			bool flag = chara.IsTamed();
			if (flag && ValConfig.SpawnMultiplicationAppliesToTames.Value)
			{
				return false;
			}
			if (chara.m_nview.GetZDO().GetBool(DataObjects.SLS_SPAWN_MULT, false))
			{
				return false;
			}
			chara.m_nview.GetZDO().Set(DataObjects.SLS_SPAWN_MULT, true);
			float spawnRateModifier = ccEntry.SpawnRateModifier;
			if (ValConfig.EnableNemesisSystem.Value && !flag)
			{
				NemesisActions.NemesisRandomSpawner(chara);
			}
			if (spawnRateModifier > 1f)
			{
				for (spawnRateModifier -= 1f; spawnRateModifier > 0f; spawnRateModifier -= 1f)
				{
					if (Random.value <= spawnRateModifier)
					{
						Vector3 val = ((Component)chara).transform.position;
						if (((Component)chara).transform.position.y < 3000f)
						{
							val = DetermineOffsetPosition(val, 15f);
						}
						Quaternion val2 = Quaternion.Euler(0f, Random.Range(0f, 360f), 0f);
						GameObject val3 = Object.Instantiate<GameObject>(PrefabManager.Instance.GetPrefab(ccEntry.RefCreatureName), val, val2);
						Character component = val3.GetComponent<Character>();
						if (flag && (Object)(object)component != (Object)null)
						{
							component.SetTamed(true);
						}
						Logger.LogDebug($"Spawn Multiplier| {spawnRateModifier} Spawned {val3.gameObject} at {val}");
						CreatureSetupControl.CreatureSetup(component, 0, multiply: false);
						component.m_nview.GetZDO().Set(DataObjects.SLS_SPAWN_MULT, true);
						if (ValConfig.MultipliedNightSpawnsRemovedDuringDay.Value && EnvMan.IsNight())
						{
							MonsterAI component2 = ((Component)component).GetComponent<MonsterAI>();
							if ((Object)(object)component2 != (Object)null)
							{
								component2.SetDespawnInDay(true);
							}
						}
					}
				}
			}
			else if (spawnRateModifier < 1f && Random.value >= spawnRateModifier)
			{
				Logger.LogDebug("Spawn Reducer| Selecting " + ccEntry.RefCreatureName + " for deletion.");
				ZNetScene.instance.Destroy(((Component)chara).gameObject);
				return true;
			}
			return false;
		}

		internal static IEnumerator DestroyCoroutine(GameObject go)
		{
			yield return (object)new WaitForEndOfFrame();
			if (!((Object)(object)go != (Object)null))
			{
				yield break;
			}
			Character component = go.GetComponent<Character>();
			if (!((Object)(object)component != (Object)null) || !component.m_tamed)
			{
				CharacterDrop component2 = go.GetComponent<CharacterDrop>();
				if ((Object)(object)component2 != (Object)null)
				{
					Object.Destroy((Object)(object)component2);
				}
				ZNetScene.instance.Destroy(go);
			}
		}

		internal static Vector3 DetermineOffsetPosition(Vector3 sourcePosition, float radius)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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_004f: Unknown result type (might be due to invalid IL or missing references)
			//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_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: 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_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			float num = default(float);
			ZoneSystem.instance.GetGroundHeight(sourcePosition, ref num);
			float num2 = 0f;
			if (num > sourcePosition.y + 2f)
			{
				num2 = Mathf.Abs(sourcePosition.y - num);
				if (num2 < 0f)
				{
					num2 = 0f;
				}
			}
			int num3 = 0;
			if (num3 < 10)
			{
				Vector2 val = Random.insideUnitCircle * (radius * 0.8f);
				Vector3 val2 = sourcePosition + new Vector3(val.x, 0f, val.y);
				num3++;
				float num4 = default(float);
				ZoneSystem.instance.GetGroundHeight(new Vector3(val2.x, val2.y + 100f, val2.z), ref num4);
				val2.y = num4 + num2;
				return val2;
			}
			return sourcePosition;
		}
	}
	internal static class TaskRunner
	{
		internal static GameObject RunnerGO;

		internal static Orchestrator Instance;

		internal static void Setup()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_0020: Expected O, but got Unknown
			GameObject val = new GameObject("StarLevelSystem_TaskRunner");
			Instance = val.AddComponent<Orchestrator>();
			RunnerGO = val;
			Object.DontDestroyOnLoad((Object)val);
		}

		internal static Orchestrator Run()
		{
			if ((Object)(object)Instance != (Object)null)
			{
				return Instance;
			}
			Setup();
			return Instance;
		}
	}
	internal class Orchestrator : MonoBehaviour
	{
	}
}
namespace StarLevelSystem.modules.UI
{
	internal static class MinimapLevelIndicator
	{
		[HarmonyPatch(typeof(Minimap), "Awake")]
		public static class CreateIndicator
		{
			public static void Postfix(Minimap __instance)
			{
				//IL_0048: 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_0066: Unknown result type (might be due to invalid IL or missing references)
				//IL_007c: 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_00b5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)__instance == (Object)null || (Object)(object)__instance.m_mapImageSmall == (Object)null || (Object)(object)indicatorText != (Object)null)
				{
					return;
				}
				try
				{
					Transform transform = ((Component)__instance.m_mapImageSmall).transform;
					indicatorText = GUIManager.Instance.CreateText("", transform, new Vector2(1f, 0f), new Vector2(1f, 0f), new Vector2(-8f, 8f), GUIManager.Instance.AveriaSerifBold, 14, GUIManager.Instance.ValheimYellow, true, Color.black, 200f, 44f, false).GetComponent<Text>();
					((Graphic)indicatorText).rectTransform.pivot = new Vector2(1f, 0f);
					((Graphic)indicatorText).rectTransform.anchoredPosition = new Vector2(-8f, 8f);
					indicatorText.alignment = (TextAnchor)8;
					((Component)indicatorText).gameObject.SetActive(false);
				}
				catch (Exception ex)
				{
					Logger.LogWarning("Failed to create minimap level indicator: " + ex.Message);
				}
			}
		}

		[HarmonyPatch(typeof(Minimap), "Update")]
		public static class RefreshIndicator
		{
			public static void Postfix()
			{
				MinimapOverlayFog.MaybeRefreshForExploration();
				if (!((Object)(object)indicatorText == (Object)null) && !(Time.time < nextRefresh))
				{
					nextRefresh = Time.time + 5f;
					Refresh();
				}
			}
		}

		private static Text indicatorText;

		private static float nextRefresh;

		private const float RefreshInterval = 5f;

		private static void Refresh()
		{
			//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_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			Player localPlayer = Player.m_localPlayer;
			if (!ValConfig.ShowMinimapLevelIndicator.Value || (Object)(object)localPlayer == (Object)null)
			{
				if (((Component)indicatorText).gameObject.activeSelf)
				{
					((Component)indicatorText).gameObject.SetActive(false);
				}
				return;
			}
			Vector3 position = ((Component)localPlayer).transform.position;
			List<string> list = new List<string>(2);
			if (ValConfig.EnableDistanceLevelScalingBonus.Value)
			{
				list.Add($"Ring {DistanceScaleSystem.GetCurrentRingLevel(position)}");
			}
			if (ValConfig.EnableZoneScalingBonus.Value)
			{
				list.Add($"Zone {ZoneScaleSystemData.GetZoneForPosition(position)?.ZoneLevel ?? 0}");
			}
			if (list.Count == 0)
			{
				if (((Component)indicatorText).gameObject.activeSelf)
				{
					((Component)indicatorText).gameObject.SetActive(false);
				}
				return;
			}
			indicatorText.text = string.Join("\n", list);
			if (!((Component)indicatorText).gameObject.activeSelf)
			{
				((Component)indicatorText).gameObject.SetActive(true);
			}
		}

		public static void OnShowIndicatorChanged(object s, EventArgs e)
		{
			if (!((Object)(object)indicatorText == (Object)null))
			{
				if (!ValConfig.ShowMinimapLevelIndicator.Value)
				{
					((Component)indicatorText).gameObject.SetActive(false);
				}
				else
				{
					nextRefresh = 0f;
				}
			}
		}
	}
	internal static class QuickConfigureTool
	{
		private class StagedConfig
		{
			public bool enableDistance;

			public bool enableDistanceOverlay;

			public bool enableZone;

			public bool enableZoneOverlay;

			public bool enableConditional;

			public float creatureHpPerLevel;

			public float creatureDmgPerLevel;

			public float bossHpPerLevel;

			public float bossDmgPerLevel;

			public int maxLevel;

			public int maxBossLevel;

			public bool mpHealth;

			public bool mpDamage;

			public float mpHealthMod;

			public float mpDamageMod;

			public int mpRequiredPlayers;

			public DataObjects.LevelGenerator generator;

			public int maxMajor;

			public int maxMinor;

			public int maxBossMods;

			public int prefixLimit;

			public float chanceMajor;

			public float chanceMinor;

			public float chanceBoss;

			public bool limitToStarLevel;

			public bool enableBossMods;

			public bool minorFirst;

			public DataObjects.ModifierDisplayStyle displayStyle;

			public DataObjects.CreatureModifierCollection modifierSource;

			public Dictionary<DataObjects.ModifierType, HashSet<string>> modifierOn;

			public bool enableSlsRaids;

			public float raidEventRate;

			public int raidCheckMinutes;

			public int maxRaidAttempts;

			public int maxActiveRaids;

			public DataObjects.RaidConfiguration raidSource;

			public HashSet<string> raidsOn;

			public bool enableNemesis;

			public float nemCooldown;

			public float nemInfluence;

			public float nemMinSpawn;

			public float neutralScore;

			public float minScore;

			public float maxScore;

			public float decayPerUpdate;

			public float scoreInterval;

			public float bossKillBonus;

			public float deathReduction;

			public DataObjects.NemesisConfiguration nemesisSource;

			public static StagedConfig Snapshot()
			{
				StagedConfig stagedConfig = new StagedConfig
				{
					enableDistance = ValConfig.EnableDistanceLevelScalingBonus.Value,
					enableDistanceOverlay = ValConfig.EnableMapRingsForDistanceBonus.Value,
					enableZone = ValConfig.EnableZoneScalingBonus.Value,
					enableZoneOverlay = ValConfig.EnableZoneMapOverlay.Value,
					creatureHpPerLevel = ValConfig.EnemyHealthMultiplier.Value,
					creatureDmgPerLevel = ValConfig.EnemyDamageLevelMultiplier.Value,
					bossHpPerLevel = ValConfig.BossEnemyHealthMultiplier.Value,
					bossDmgPerLevel = ValConfig.BossEnemyDamageMultiplier.Value,
					maxLevel = ValConfig.MaxLevel.Value,
					maxBossLevel = ValConfig.MaxBossLevel.Value,
					mpHealth = ValConfig.EnableMultiplayerEnemyHealthScaling.Value,
					mpHealthMod = ValConfig.MultiplayerEnemyHealthModifier.Value,
					mpDamage = ValConfig.EnableMultiplayerEnemyDamageScaling.Value,
					mpDamageMod = ValConfig.MultiplayerEnemyDamageModifier.Value,
					mpRequiredPlayers = ValConfig.MultiplayerScalingRequiredPlayersNearby.Value,
					maxMajor = ValConfig.MaxMajorModifiersPerCreature.Value,
					maxMinor = ValConfig.MaxMinorModifiersPerCreature.Value,
					chanceMajor = ValConfig.ChanceMajorModifier.Value,
					chanceMinor = ValConfig.ChanceMinorModifier.Value,
					limitToStarLevel = ValConfig.LimitCreatureModifiersToCreatureStarLevel.Value,
					enableBossMods = ValConfig.EnableBossModifiers.Value,
					chanceBoss = ValConfig.ChanceOfBossModifier.Value,
					maxBossMods = ValConfig.MaxBossModifiersPerBoss.Value,
					prefixLimit = ValConfig.LimitCreatureModifierPrefixes.Value,
					minorFirst = ValConfig.MinorModifiersFirstInName.Value,
					enableSlsRaids = !ValConfig.UseVanillaRaidConfiguration.Value,
					raidEventRate = ValConfig.RaidEventRate.Value,
					raidCheckMinutes = ValConfig.ServerTimeBetweenRaidStartChecks.Value,
					maxRaidAttempts = ValConfig.MaxRaidAttemptsPerPlayer.Value,
					maxActiveRaids = ValConfig.MaxActiveRaids.Value,
					enableNemesis = ValConfig.EnableNemesisSystem.Value
				};
				DataObjects.CreatureLevelSettings sLE_Level_Settings = LevelSystemData.SLE_Level_Settings;
				stagedConfig.enableConditional = sLE_Level_Settings?.EnableConditionalCreatureLevelupChance ?? false;
				stagedConfig.generator = CloneOrDefaultGenerator(sLE_Level_Settings, stagedConfig.maxLevel);
				if (!Enum.TryParse<DataObjects.ModifierDisplayStyle>(ValConfig.ModifierIconDisplayStyle.Value, out var result))
				{
					result = DataObjects.ModifierDisplayStyle.Stars;
				}
				stagedConfig.displayStyle = result;
				stagedConfig.modifierSource = CreatureModifiersData.ActiveCreatureModifiers;
				stagedConfig.modifierOn = new Dictionary<DataObjects.ModifierType, HashSet<string>>
				{
					{
						DataObjects.ModifierType.Boss,
						KeysOf(stagedConfig.modifierSource?.BossModifiers)
					},
					{
						DataObjects.ModifierType.Major,
						KeysOf(stagedConfig.modifierSource?.MajorModifiers)
					},
					{
						DataObjects.ModifierType.Minor,
						KeysOf(stagedConfig.modifierSource?.MinorModifiers)
					}
				};
				DataObjects.NemesisConfiguration nemesisConfiguration = (stagedConfig.nemesisSource = NemesisSystemData.SLE_Nemesis_Settings);
				if (nemesisConfiguration != null)
				{
					stagedConfig.nemCooldown = nemesisConfiguration.NemesisActionCooldownSeconds;
					stagedConfig.nemInfluence = nemesisConfiguration.NemesisInfluenceRadius;
					stagedConfig.nemMinSpawn = nemesisConfiguration.NemesisMinSpawnDistance;
					DataObjects.NemesisScore nemesisScore = nemesisConfiguration.ScoreSystem ?? new DataObjects.NemesisScore();
					stagedConfig.neutralScore = nemesisScore.NeutralScore;
					stagedConfig.minScore = nemesisScore.MinScore;
					stagedConfig.maxScore = nemesisScore.MaxScore;
					stagedConfig.decayPerUpdate = nemesisScore.DecayPerUpdate;
					stagedConfig.scoreInterval = nemesisScore.ScoreIntervalSeconds;
					stagedConfig.bossKillBonus = nemesisScore.BossKillBonus;
					stagedConfig.deathReduction = nemesisScore.DeathScoreReduction;
				}
				stagedConfig.raidSource = RaidsData.SLE_Raid_Settings;
				stagedConfig.raidsOn = new HashSet<string>();
				if (stagedConfig.raidSource?.Raids != null)
				{
					foreach (DataObjects.RaidDefinition raid in stagedConfig.raidSource.Raids)
					{
						if (raid.Enabled)
						{
							stagedConfig.raidsOn.Add(raid.Name);
						}
					}
				}
				return stagedConfig;
			}

			private static HashSet<string> KeysOf(Dictionary<string, DataObjects.CreatureModifierConfiguration> dict)
			{
				HashSet<string> hashSet = new HashSet<string>();
				if (dict == null)
				{
					return hashSet;
				}
				foreach (KeyValuePair<string, DataObjects.CreatureModifierConfiguration> item in dict)
				{
					if (item.Value.Enabled)
					{
						hashSet.Add(item.Key);
					}
				}
				return hashSet;
			}

			private static DataObjects.LevelGenerator CloneOrDefaultGenerator(DataObjects.CreatureLevelSettings settings, int maxLevel)
			{
				DataObjects.LevelGenerator levelGenerator = null;
				if (settings?.DefaultLevelupGenerators != null && settings.DefaultLevelupGenerators.Count > 0)
				{
					levelGenerator = settings.DefaultLevelupGenerators[0];
				}
				if (levelGenerator == null)
				{
					return new DataObjects.LevelGenerator
					{
						MinLevel = 1,
						MaxLevel = Mathf.Max(1, maxLevel),
						LevelUpChance = 0.2f,
						LevelupCalculationStyle = DataObjects.LevelupCalculationStyle.Exponential,
						GaussianOffset = 0f,
						NightMultiplier = 1f
					};
				}
				return new DataObjects.LevelGenerator
				{
					PrefabName = levelGenerator.PrefabName,
					MinLevel = levelGenerator.MinLevel,
					MaxLevel = levelGenerator.MaxLevel,
					LevelUpChance = levelGenerator.LevelUpChance,
					LevelupCalculationStyle = levelGenerator.LevelupCalculationStyle,
					GaussianOffset = levelGenerator.GaussianOffset,
					NightMultiplier = levelGenerator.NightMultiplier
				};
			}
		}

		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static UnityAction <>9__38_0;

			public static UnityAction <>9__38_1;

			public static Action<bool> <>9__40_0;

			public static Action<bool> <>9__40_1;

			public static Action<bool> <>9__40_2;

			public static Action<bool> <>9__40_3;

			public static Action<bool> <>9__40_4;

			public static Action<float> <>9__41_3;

			public static Action<float> <>9__41_4;

			public static Action<float> <>9__41_5;

			public static Action<float> <>9__41_6;

			public static Action<float> <>9__41_7;

			public static Action<float> <>9__41_8;

			public static Action<bool> <>9__41_9;

			public static Action<float> <>9__41_10;

			public static Action<bool> <>9__41_11;

			public static Action<float> <>9__41_12;

			public static Action<float> <>9__41_13;

			public static Action<float> <>9__41_14;

			public static Action<float> <>9__41_15;

			public static Action<float> <>9__41_16;

			public static Action<float> <>9__41_1;

			public static Action<float> <>9__41_2;

			public static Action<bool> <>9__42_0;

			public static Action<float> <>9__42_1;

			public static Action<float> <>9__42_2;

			public static Action<float> <>9__42_3;

			public static Action<float> <>9__42_4;

			public static Func<DataObjects.RaidDefinition, string> <>9__42_5;

			public static Func<DataObjects.RaidSpawnEntry, string> <>9__43_1;

			public static Action<bool> <>9__45_0;

			public static Action<float> <>9__45_1;

			public static Action<float> <>9__45_2;

			public static Action<float> <>9__45_3;

			public static Action<float> <>9__45_4;

			public static Action<float> <>9__45_5;

			public static Action<float> <>9__45_6;

			public static Action<float> <>9__45_7;

			public static Action<float> <>9__45_8;

			public static Action<float> <>9__45_9;

			public static Action<float> <>9__45_10;

			public static Action<float> <>9__46_0;

			public static Action<float> <>9__46_1;

			public static Action<float> <>9__46_2;

			public static Action<float> <>9__46_3;

			public static Action<bool> <>9__46_4;

			public static Action<bool> <>9__46_5;

			public static Action<float> <>9__46_6;

			public static Action<float> <>9__46_7;

			public static Action<float> <>9__46_8;

			public static Action<bool> <>9__46_9;

			public static Action<int> <>9__46_10;

			public static Func<string, string> <>9__47_0;

			internal void <BuildPanel>b__38_0()
			{
				ShowPage(currentPage - 1);
			}

			internal void <BuildPanel>b__38_1()
			{
				ShowPage(currentPage + 1);
			}

			internal void <BuildScalingPage>b__40_0(bool v)
			{
				staged.enableDistance = v;
			}

			internal void <BuildScalingPage>b__40_1(bool v)
			{
				staged.enableDistanceOverlay = v;
			}

			internal void <BuildScalingPage>b__40_2(bool v)
			{
				staged.enableZone = v;
			}

			internal void <BuildScalingPage>b__40_3(bool v)
			{
				staged.enableZoneOverlay = v;
			}

			internal void <BuildScalingPage>b__40_4(bool v)
			{
				staged.enableConditional = v;
			}

			internal void <BuildStatsPage>b__41_3(float v)
			{
				staged.creatureHpPerLevel = v;
				UpdateExampleMath();
			}

			internal void <BuildStatsPage>b__41_4(float v)
			{
				staged.creatureDmgPerLevel = v;
				UpdateExampleMath();
			}

			internal void <BuildStatsPage>b__41_5(float v)
			{
				staged.maxLevel = (int)v;
				UpdateExampleMath();
			}

			internal void <BuildStatsPage>b__41_6(float v)
			{
				staged.bossHpPerLevel = v;
				UpdateExampleMath();
			}

			internal void <BuildStatsPage>b__41_7(float v)
			{
				staged.bossDmgPerLevel = v;
				UpdateExampleMath();
			}

			internal void <BuildStatsPage>b__41_8(float v)
			{
				staged.maxBossLevel = (int)v;
				UpdateExampleMath();
			}

			internal void <BuildStatsPage>b__41_9(bool v)
			{
				staged.mpHealth = v;
			}

			internal void <BuildStatsPage>b__41_10(float v)
			{
				staged.mpHealthMod = v;
			}

			internal void <BuildStatsPage>b__41_11(bool v)
			{
				staged.mpDamage = v;
			}

			internal void <BuildStatsPage>b__41_12(float v)
			{
				staged.mpDamageMod = v;
			}

			internal void <BuildStatsPage>b__41_13(float v)
			{
				staged.mpRequiredPlayers = (int)v;
			}

			internal void <BuildStatsPage>b__41_14(float v)
			{
				staged.generator.MinLevel = (int)v;
			}

			internal void <BuildStatsPage>b__41_15(float v)
			{
				staged.generator.MaxLevel = (int)v;
			}

			internal void <BuildStatsPage>b__41_16(float v)
			{
				staged.generator.LevelUpChance = v;
			}

			internal void <BuildStatsPage>b__41_1(float v)
			{
				staged.generator.GaussianOffset = v;
			}

			internal void <BuildStatsPage>b__41_2(float v)
			{
				staged.generator.NightMultiplier = v;
			}

			internal void <BuildRaidsPage>b__42_0(bool v)
			{
				staged.enableSlsRaids = v;
			}

			internal void <BuildRaidsPage>b__42_1(float v)
			{
				staged.raidEventRate = v;
			}

			internal void <BuildRaidsPage>b__42_2(float v)
			{
				staged.raidCheckMinutes = (int)v;
			}

			internal void <BuildRaidsPage>b__42_3(float v)
			{
				staged.maxRaidAttempts = (int)v;
			}

			internal void <BuildRaidsPage>b__42_4(float v)
			{
				staged.maxActiveRaids = (int)v;
			}

			internal string <BuildRaidsPage>b__42_5(DataObjects.RaidDefinition r)
			{
				return r.Name;
			}

			internal string <AddRaidEntry>b__43_1(DataObjects.RaidSpawnEntry sp)
			{
				return sp.PrefabName;
			}

			internal void <BuildNemesisPage>b__45_0(bool v)
			{
				staged.enableNemesis = v;
			}

			internal void <BuildNemesisPage>b__45_1(float v)
			{
				staged.nemCooldown = v;
			}

			internal void <BuildNemesisPage>b__45_2(float v)
			{
				staged.nemInfluence = v;
			}

			internal void <BuildNemesisPage>b__45_3(float v)
			{
				staged.nemMinSpawn = v;
			}

			internal void <BuildNemesisPage>b__45_4(float v)
			{
				staged.neutralScore = v;
			}

			internal void <BuildNemesisPage>b__45_5(float v)
			{
				staged.minScore = v;
			}

			internal void <BuildNemesisPage>b__45_6(float v)
			{
				staged.maxScore = v;
			}

			internal void <BuildNemesisPage>b__45_7(float v)
			{
				staged.decayPerUpdate = v;
			}

			internal void <BuildNemesisPage>b__45_8(float v)
			{
				staged.scoreInterval = v;
			}

			internal void <BuildNemesisPage>b__45_9(float v)
			{
				staged.bossKillBonus = v;
			}

			internal void <BuildNemesisPage>b__45_10(float v)
			{
				staged.deathReduction = v;
			}

			internal void <BuildModifiersPage>b__46_0(float v)
			{
				staged.maxMajor = (int)v;
			}

			internal void <BuildModifiersPage>b__46_1(float v)
			{
				staged.maxMinor = (int)v;
			}

			internal void <BuildModifiersPage>b__46_2(float v)
			{
				staged.chanceMajor = v;
			}

			internal void <BuildModifiersPage>b__46_3(float v)
			{
				staged.chanceMinor = v;
			}

			internal void <BuildModifiersPage>b__46_4(bool v)
			{
				staged.limitToStarLevel = v;
			}

			internal void <BuildModifiersPage>b__46_5(bool v)
			{
				staged.enableBossMods = v;
			}

			internal void <BuildModifiersPage>b__46_6(float v)
			{
				staged.chanceBoss = v;
			}

			internal void <BuildModifiersPage>b__46_7(float v)
			{
				staged.maxBossMods = (int)v;
			}

			internal void <BuildModifiersPage>b__46_8(float v)
			{
				staged.prefixLimit = (int)v;
			}

			internal void <BuildModifiersPage>b__46_9(bool v)
			{
				staged.minorFirst = v;
			}

			internal void <BuildModifiersPage>b__46_10(int i)
			{
				staged.displayStyle = (DataObjects.ModifierDisplayStyle)i;
			}

			internal string <AddModifierCategory>b__47_0(string n)
			{
				return n;
			}
		}

		private const float PanelW = 900f;

		private const float PanelH = 690f;

		private const float Margin = 26f;

		private const float ContentTop = 92f;

		private const float RowHeight = 34f;

		private const float SubRowHeight = 26f;

		private const float RowGap = 4f;

		private const int PageCount = 5;

		private const float TrollHp = 600f;

		private const float TrollDmg = 70f;

		private const float TheElderHP = 2500f;

		private const float TheElderDmg = 60f;

		private static readonly string[] CalcStyleOptions = Enum.GetNames(typeof(DataObjects.LevelupCalculationStyle));

		private static readonly string[] DisplayStyleOptions = Enum.GetNames(typeof(DataObjects.ModifierDisplayStyle));

		private static readonly Dictionary<string, string> ModifierDescriptions = new Dictionary<string, string>
		{
			{ "BossSummoner", "Summons minion creatures at regular intervals." },
			{ "SoulEater", "Grows stronger as nearby creatures die; self-heals." },
			{ "LifeLink", "Redirects some damage taken to a nearby creature." },
			{ "Splitter", "Spawns replacement creatures when it dies." },
			{ "Lootbags", "Tankier and faster; drops extra loot." },
			{ "Fire", "Adds fire damage to its attacks." },
			{ "Frost", "Adds frost damage to its attacks." },
			{ "Poison", "Adds poison damage to its attacks." },
			{ "Lightning", "Adds lightning damage to its attacks." },
			{ "FireNova", "Explodes in fire on death, damaging nearby targets." },
			{ "FrostNova", "Explodes in frost on death, damaging nearby targets." },
			{ "PoisonNova", "Explodes in poison on death, damaging nearby targets." },
			{ "LightningNova", "Explodes in lightning on death, damaging nearby targets." },
			{ "Evolving", "Gains a level after enough kills." },
			{ "ResistSlash", "Reduces damage taken from slash." },
			{ "ResistBlunt", "Reduces damage taken from blunt." },
			{ "ResistPierce", "Reduces damage taken from pierce (e.g. arrows)." },
			{ "ResistFire", "Reduces damage taken from fire." },
			{ "ResistFrost", "Reduces damage taken from frost." },
			{ "ResistPoison", "Reduces damage taken from poison." },
			{ "ResistSpirit", "Reduces damage taken from spirit." },
			{ "Alert", "Increases the creature's hearing range." },
			{ "Big", "Increases the creature's size." },
			{ "Fast", "Increases the creature's movement speed." },
			{ "StaminaDrain", "Its attacks drain your stamina. Dodging avoids it; blocking or parrying lessens it." },
			{ "EitrDrain", "Its attacks drain your eitr. Dodging avoids it; blocking or parrying lessens it." },
			{ "Brutal", "Increases the creature's attack speed." },
			{ "ElementalChaos", "Adds random elemental damage on each hit." }
		};

		private static Sprite DistanceExample;

		private static Sprite ZoneExample;

		private static GameObject panel;

		private static GameObject[] pageRoots;

		private static int currentPage;

		private static Text titleText;

		private static GameObject backBtn;

		private static GameObject cancelBtn;

		private static GameObject nextBtn;

		private static GameObject applyBtn;

		private static Text creatureExampleText;

		private static Text bossExampleText;

		private static StagedConfig staged;

		private static GameObject mainMenuButton;

		private static GameObject pauseMenuButton;

		internal static void Init()
		{
			GUIManager.OnCustomGUIAvailable += OnCustomGUIAvailable;
			DistanceExample = StarLevelSystem.EmbeddedResourceBundle.LoadAsset<Sprite>("distance_rings");
			ZoneExample = StarLevelSystem.EmbeddedResourceBundle.LoadAsset<Sprite>("region_zones");
		}

		private static void OnCustomGUIAvailable()
		{
			try
			{
				if (!GUIManager.IsHeadless() && GUIManager.Instance != null && (Object)(object)FejdStartup.instance != (Object)null)
				{
					CreateMainMenuButton();
				}
			}
			catch (Exception ex)
			{
				Logger.LogWarning("QuickConfigureTool failed to set up main menu button: " + ex.Message);
			}
		}

		internal static void CreatePauseMenuButton(Menu menu)
		{
			try
			{
				if (!GUIManager.IsHeadless() && GUIManager.Instance != null && !((Object)(object)menu == (Object)null) && !((Object)(object)menu.m_root == (Object)null) && !((Object)(object)pauseMenuButton != (Object)null))
				{
					pauseMenuButton = CreateCornerButton(menu.m_root);
					pauseMenuButton.SetActive(ValConfig.ShowQuickConfigureButton.Value && SynchronizationManager.Instance.PlayerIsAdmin);
				}
			}
			catch (Exception ex)
			{
				Logger.LogWarning("QuickConfigureTool failed to set up pause menu button: " + ex.Message);
			}
		}

		public static void OnShowButtonChanged(object s, EventArgs e)
		{
			bool value = ValConfig.ShowQuickConfigureButton.Value;
			if ((Object)(object)mainMenuButton != (Object)null)
			{
				mainMenuButton.SetActive(value);
			}
			if ((Object)(object)pauseMenuButton != (Object)null)
			{
				pauseMenuButton.SetActive(value && SynchronizationManager.Instance.PlayerIsAdmin);
			}
		}

		private static void CreateMainMenuButton()
		{
			if (!((Object)(object)mainMenuButton != (Object)null) && !((Object)(object)GUIManager.CustomGUIFront == (Object)null))
			{
				mainMenuButton = CreateCornerButton(GUIManager.CustomGUIFront.transform);
				mainMenuButton.SetActive(ValConfig.ShowQuickConfigureButton.Value);
			}
		}

		private static GameObject CreateCornerButton(Transform parent)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Expected O, but got Unknown
			GameObject obj = GUIManager.Instance.CreateButton("SLS Config", parent, new Vector2(1f, 0f), new Vector2(1f, 0f), new Vector2(-20f, 20f), 150f, 38f);
			RectTransform val = (RectTransform)obj.transform;
			val.pivot = new Vector2(1f, 0f);
			val.anchoredPosition = new Vector2(-20f, 20f);
			((UnityEvent)obj.GetComponent<Button>().onClick).AddListener(new UnityAction(OpenPanel));
			return obj;
		}

		internal static void OpenPanel()
		{
			staged = StagedConfig.Snapshot();
			if ((Object)(object)panel != (Object)null)
			{
				Object.Destroy((Object)(object)panel);
				panel = null;
			}
			try
			{
				BuildPanel();
			}
			catch (Exception arg)
			{
				Logger.LogWarning($"QuickConfigureTool failed to build panel: {arg}");
				if ((Object)(object)panel != (Object)null)
				{
					Object.Destroy((Object)(object)panel);
					panel = null;
				}
				return;
			}
			currentPage = 0;
			ShowPage(0);
		}

		private static void ClosePanel()
		{
			if ((Object)(object)panel != (Object)null)
			{
				Object.Destroy((Object)(object)panel);
				panel = null;
			}
		}

		private static void BuildPanel()
		{
			//IL_0019: 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_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Expected O, but got Unknown
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Expected O, but got Unknown
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021e: Expected O, but got Unknown
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e9: Expected O, but got Unknown
			panel = GUIManager.Instance.CreateWoodpanel(GUIManager.CustomGUIFront.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 0f), 900f, 690f, true);
			titleText = AddText(panel.transform, 26f, 18f, 848f, 34f, "StarLevelSystem - Quick Configure", 22, (TextAnchor)4, GUIManager.Instance.ValheimYellow);
			pageRoots = (GameObject[])(object)new GameObject[5];
			for (int i = 0; i < 5; i++)
			{
				pageRoots[i] = NewRect("Page" + i, panel.transform, 26f, 92f, 848f, 528f);
			}
			BuildScalingPage(pageRoots[0].transform);
			BuildStatsPage(pageRoots[1].transform);
			BuildModifiersPage(pageRoots[2].transform);
			BuildRaidsPage(pageRoots[3].transform);
			BuildNemesisPage(pageRoots[4].transform);
			float y = 634f;
			Transform transform = panel.transform;
			object obj = <>c.<>9__38_0;
			if (obj == null)
			{
				UnityAction val = delegate
				{
					ShowPage(currentPage - 1);
				};
				<>c.<>9__38_0 = val;
				obj = (object)val;
			}
			backBtn = AddButton(transform, 26f, y, 130f, "< Back", (UnityAction)obj);
			cancelBtn = AddButton(panel.transform, 176f, y, 130f, "Cancel", new UnityAction(ClosePanel));
			Transform transform2 = panel.transform;
			object obj2 = <>c.<>9__38_1;
			if (obj2 == null)
			{
				UnityAction val2 = delegate
				{
					ShowPage(currentPage + 1);
				};
				<>c.<>9__38_1 = val2;
				obj2 = (object)val2;
			}
			nextBtn = AddButton(transform2, 704f, y, 170f, "Next >", (UnityAction)obj2);
			applyBtn = AddButton(panel.transform, 704f, y, 170f, "Apply & Save", new UnityAction(ApplyAndSave));
		}

		private static void ShowPage(int page)
		{
			currentPage = Mathf.Clamp(page, 0, 4);
			for (int i = 0; i < pageRoots.Length; i++)
			{
				pageRoots[i].SetActive(i == currentPage);
			}
			string[] array = new string[5] { "Scaling Mechanisms", "Stats & Level Generator", "Modifiers", "Raids", "Nemesis System" };
			titleText.text = $"StarLevelSystem - {array[currentPage]}  (Page {currentPage + 1} of {5})";
			backBtn.SetActive(currentPage > 0);
			bool flag = currentPage == 4;
			nextBtn.SetActive(!flag);
			applyBtn.SetActive(flag);
			if (currentPage == 1)
			{
				UpdateExampleMath();
			}
		}

		private static void BuildScalingPage(Transform parent)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
			List<GameObject> rows = new List<GameObject>
			{
				AddHeaderRow(parent, 460f, "$sls_cfg_scaling_selection_header", (TextAnchor)4),
				AddTextRow(parent, 760f, 34f, "Here are some high level configurations from the mod, many more things can be customized within the yaml configuration.", 13, GUIManager.Instance.ValheimBeige, (TextAnchor)1),
				AddScalingFeatureRow(parent, 760f, 300f, 168f, DistanceExample, "$sls_cfg_distance_scale_header", "$sls_cfg_distance_scale_desc", staged.enableDistance, delegate(bool v)
				{
					staged.enableDistance = v;
				}, "$sls_cfg_distance_overlay_toggle", staged.enableDistanceOverlay, delegate(bool v)
				{
					staged.enableDistanceOverlay = v;
				}),
				AddDividerRow(parent, 760f),
				AddScalingFeatureRow(parent, 760f, 300f, 168f, ZoneExample, "$sls_cfg_zone_scale_header", "$sls_cfg_zone_scale_desc", staged.enableZone, delegate(bool v)
				{
					staged.enableZone = v;
				}, "$sls_cfg_zone_overlay_toggle", staged.enableZoneOverlay, delegate(bool v)
				{
					staged.enableZoneOverlay = v;
				}),
				AddDividerRow(parent, 760f),
				AddToggleRow(parent, 760f, 360f, "$sls_cfg_conditional_scale_header", staged.enableConditional, delegate(bool v)
				{
					staged.enableConditional = v;
				}, toggleOnLeft: true),
				AddTextRow(parent, 760f, 24f, "$sls_cfg_conditional_scale_desc", 13, GUIManager.Instance.ValheimBeige, (TextAnchor)0)
			};
			float x = Mathf.Max(0f, 44f);
			LayoutColumn(rows, x, 4f);
		}

		private static void BuildStatsPage(Transform parent)
		{
			//IL_0459: 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)
			LayoutColumn(new List<GameObject>
			{
				AddHeaderRow(parent, 430f, "Per-level stats", (TextAnchor)3),
				AddSliderRow(parent, 430f, 168f, 150f, 60f, "Creature HP / level", 0f, 5f, staged.creatureHpPerLevel, wholeNumbers: false, delegate(float v)
				{
					staged.creatureHpPerLevel = v;
					UpdateExampleMath();
				}),
				AddSliderRow(parent, 430f, 168f, 150f, 60f, "Creature dmg / level", 0f, 2f, staged.creatureDmgPerLevel, wholeNumbers: false, delegate(float v)
				{
					staged.creatureDmgPerLevel = v;
					UpdateExampleMath();
				}),
				AddSliderRow(parent, 430f, 168f, 150f, 60f, "Max level (stars)", 1f, 200f, staged.maxLevel, wholeNumbers: true, delegate(float v)
				{
					staged.maxLevel = (int)v;
					UpdateExampleMath();
				}),
				AddDividerRow(parent, 848f),
				AddSliderRow(parent, 430f, 168f, 150f, 60f, "Boss HP / level", 0f, 5f, staged.bossHpPerLevel, wholeNumbers: false, delegate(float v)
				{
					staged.bossHpPerLevel = v;
					UpdateExampleMath();
				}),
				AddSliderRow(parent, 430f, 168f, 150f, 60f, "Boss dmg / level", 0f, 5f, staged.bossDmgPerLevel, wholeNumbers: false, delegate(float v)
				{
					staged.bossDmgPerLevel = v;
					UpdateExampleMath();
				}),
				AddSliderRow(parent, 430f, 168f, 150f, 60f, "Max boss level", 1f, 200f, staged.maxBossLevel, wholeNumbers: true, delegate(float v)
				{
					staged.maxBossLevel = (int)v;
					UpdateExampleMath();
				}),
				AddSpacerRow(parent, 430f, 4f),
				AddHeaderRow(parent, 430f, "Multiplayer scaling", (TextAnchor)3),
				AddToggleRow(parent, 430f, 338f, "Enemies gain HP with more players", staged.mpHealth, delegate(bool v)
				{
					staged.mpHealth = v;
				}),
				AddSliderRow(parent, 430f, 168f, 150f, 60f, "HP per extra player", 0f, 0.99f, staged.mpHealthMod, wholeNumbers: false, delegate(float v)
				{
					staged.mpHealthMod = v;
				}),
				AddToggleRow(parent, 430f, 338f, "Enemies gain dmg with more players", staged.mpDamage, delegate(bool v)
				{
					staged.mpDamage = v;
				}),
				AddSliderRow(parent, 430f, 168f, 150f, 60f, "Dmg per extra player", 0f, 2f, staged.mpDamageMod, wholeNumbers: false, delegate(float v)
				{
					staged.mpDamageMod = v;
				}),
				AddSliderRow(parent, 430f, 168f, 150f, 60f, "Players needed nearby", 1f, 20f, staged.mpRequiredPlayers, wholeNumbers: true, delegate(float v)
				{
					staged.mpRequiredPlayers = (int)v;
				})
			}, 0f, 2f);
			PositionRow(AddHeaderRow(parent, 398f, "Example scaling preview", (TextAnchor)3), 450f, 2f);
			GameObject obj = AddTextRow(parent, 398f, 80f, "", 15, GUIManager.Instance.ValheimBeige, (TextAnchor)0);
			creatureExampleText = obj.GetComponentInChildren<Text>();
			PositionRow(obj, 450f, 40f);
			float num = 16f;
			GameObject obj2 = AddTextRow(parent, 398f, 80f, "", 15, GUIManager.Instance.ValheimBeige, (TextAnchor)0);
			bossExampleText = obj2.GetComponentInChildren<Text>();
			PositionRow(obj2, 450f, 154f + num);
			float genStartY = 230f + num + 8f;
			GameObject gaussianRow = null;
			List<GameObject> gen = new List<GameObject>
			{
				AddHeaderRow(parent, 398f, "Default level generator", (TextAnchor)3),
				AddSliderRow(parent, 398f, 168f, 150f, 60f, "Min level", 1f, 50f, staged.generator.MinLevel, wholeNumbers: true, delegate(float v)
				{
					staged.generator.MinLevel = (int)v;
				}),
				AddSliderRow(parent, 398f, 168f, 150f, 60f, "Max level", 1f, 200f, staged.generator.MaxLevel, wholeNumbers: true, delegate(float v)
				{
					staged.generator.MaxLevel = (int)v;
				}),
				AddSliderRow(parent, 398f, 168f, 150f, 60f, "Level-up chance", 0f, 1f, staged.generator.LevelUpChance, wholeNumbers: false, delegate(float v)
				{
					staged.generator.LevelUpChance = v;
				})
			};
			gen.Add(AddEnumCycleRow(parent, 398f, 168f, 150f, "Curve style", CalcStyleOptions, (int)staged.generator.LevelupCalculationStyle, delegate(int i)
			{
				staged.generator.LevelupCalculationStyle = (DataObjects.LevelupCalculationStyle)i;
				if ((Object)(object)gaussianRow != (Object)null)
				{
					gaussianRow.SetActive(i == 0);
					LayoutColumn(gen, 450f, genStartY);
				}
			}));
			gaussianRow = AddSliderRow(parent, 398f, 168f, 150f, 60f, "Gaussian offset", -1f, 1f, staged.generator.GaussianOffset, wholeNumbers: false, delegate(float v)
			{
				staged.generator.GaussianOffset = v;
			});
			gen.Add(gaussianRow);
			gen.Add(AddSliderRow(parent, 398f, 168f, 150f, 60f, "Night multiplier", 0f, 5f, staged.generator.NightMultiplier, wholeNumbers: false, delegate(float v)
			{
				staged.generator.NightMultiplier = v;
			}));
			gaussianRow.SetActive(staged.generator.LevelupCalculationStyle == DataObjects.LevelupCalculationStyle.Gaussian);
			LayoutColumn(gen, 450f, genStartY);
			UpdateExampleMath();
		}

		private static void BuildRaidsPage(Transform parent)
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0231: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0298: Unknown result type (might be due to invalid IL or missing references)
			PositionRow(AddHeaderRow(parent, 848f, "Raids", (TextAnchor)4), 0f, 4f);
			PositionRow(AddTextRow(parent, 848f, 40f, "StarLevelSystem replaces vanilla raids with its own configurable raids. Detailed per-raid settings live in RaidSettings.yaml.", 13, GUIManager.Instance.ValheimBeige, (TextAnchor)1), 0f, 42f);
			float num = 90f;
			LayoutColumn(new List<GameObject>
			{
				AddToggleRow(parent, 430f, 300f, "Enable SLS Raids", staged.enableSlsRaids, delegate(bool v)
				{
					staged.enableSlsRaids = v;
				}, toggleOnLeft: true),
				AddSliderRow(parent, 430f, 235f, 130f, 56f, "Raid frequency (lower = more often)", 0.1f, 10f, staged.raidEventRate, wholeNumbers: false, delegate(float v)
				{
					staged.raidEventRate = v;
				}),
				AddSliderRow(parent, 430f, 235f, 130f, 56f, "Minutes between checks", 1f, 120f, staged.raidCheckMinutes, wholeNumbers: true, delegate(float v)
				{
					staged.raidCheckMinutes = (int)v;
				}),
				AddSliderRow(parent, 430f, 235f, 130f, 56f, "Max attempts / player", 0f, 50f, staged.maxRaidAttempts, wholeNumbers: true, delegate(float v)
				{
					staged.maxRaidAttempts = (int)v;
				}),
				AddSliderRow(parent, 430f, 235f, 130f, 56f, "Max active raids", 1f, 20f, staged.maxActiveRaids, wholeNumbers: true, delegate(float v)
				{
					staged.maxActiveRaids = (int)v;
				})
			}, 0f, num);
			AddText(parent, 446f, num, 402f, 34f, "Enable / disable raids", 16, (TextAnchor)3, GUIManager.Instance.ValheimYellow);
			GameObject val = NewRect("RaidScrollHolder", parent, 446f, num + 34f, 402f, 398f);
			T