Decompiled source of CentralConfig v0.8.1

CentralConfig/CentralConfig.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
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.Versioning;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using CSync.Extensions;
using CSync.Lib;
using DunGen;
using HarmonyLib;
using LethalLevelLoader;
using LethalLevelLoader.Tools;
using LethalLib.Modules;
using TMPro;
using Unity.Netcode;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("CentralConfig")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CentralConfig")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("dce138f0-549d-47b9-82a7-14bf1cf9bed3")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace CentralConfig;

[HarmonyPatch(typeof(HangarShipDoor), "Start")]
public class WaitForDungeonsToRegister
{
	[DataContract]
	public class CreateDungeonConfig : ConfigTemplate
	{
		[DataMember]
		public static Dictionary<string, SyncedEntry<float>> MinDungeonSize;

		[DataMember]
		public static Dictionary<string, SyncedEntry<float>> MaxDungeonSize;

		[DataMember]
		public static Dictionary<string, SyncedEntry<float>> DungeonSizeScaler;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> DungeonPlanetNameList;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> DungeonTagList;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> DungeonRoutePriceList;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> DungeonModNameList;

		public CreateDungeonConfig(ConfigFile cfg)
			: base(cfg, "CentralConfig", 0)
		{
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			MinDungeonSize = new Dictionary<string, SyncedEntry<float>>();
			MaxDungeonSize = new Dictionary<string, SyncedEntry<float>>();
			DungeonSizeScaler = new Dictionary<string, SyncedEntry<float>>();
			DungeonPlanetNameList = new Dictionary<string, SyncedEntry<string>>();
			DungeonTagList = new Dictionary<string, SyncedEntry<string>>();
			DungeonRoutePriceList = new Dictionary<string, SyncedEntry<string>>();
			DungeonModNameList = new Dictionary<string, SyncedEntry<string>>();
			string ignoreList = CentralConfig.SyncConfig.BlackListDungeons.Value;
			List<ExtendedDungeonFlow> list = ((!SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.IsWhiteList)) ? PatchedContent.ExtendedDungeonFlows.Where((ExtendedDungeonFlow dungeon) => !ignoreList.Split(new char[1] { ',' }).Any((string b) => dungeon.DungeonName.Equals(b))).ToList() : PatchedContent.ExtendedDungeonFlows.Where((ExtendedDungeonFlow dungeon) => ignoreList.Split(new char[1] { ',' }).Any((string b) => dungeon.DungeonName.Equals(b))).ToList());
			foreach (ExtendedDungeonFlow item in list)
			{
				string text = item.DungeonName + " (" + ((Object)item).name + ")";
				text = text.Replace("13Exits", "3Exits").Replace("1ExtraLarge", "ExtraLarge");
				string text2 = text.Replace("ExtendedDungeonFlow", "").Replace("Level", "");
				if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoDunSizeOverrides))
				{
					MinDungeonSize[text2] = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, "Dungeon: " + text2, text2 + " - Minimum Size Multiplier", item.DynamicDungeonSizeMinMax.x, "Sets the min size multiplier this dungeon can have.");
					MaxDungeonSize[text2] = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, "Dungeon: " + text2, text2 + " - Maximum Size Multiplier", item.DynamicDungeonSizeMinMax.y, "Sets the max size multiplier this dungeon can have.");
					DungeonSizeScaler[text2] = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, "Dungeon: " + text2, text2 + " - Dungeon Size Scaler", item.DynamicDungeonSizeLerpRate * 100f, "This setting controls the strictness of the clamp. At 0%, the clamp is inactive. At 100%, the clamp is fully enforced, pulling any out-of-bounds values back to the nearest boundary. For percentages in between, out-of-bounds values are partially pulled back towards the nearest boundary. For example given a value of 50%, a value exceeding the max would be adjusted halfway back to the max.");
				}
				if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoDungeonSelectionOverrides))
				{
					string text3 = ConfigAider.ConvertStringWithRarityToString(item.LevelMatchingProperties.planetNames);
					DungeonPlanetNameList[text2] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Dungeon: " + text2, text2 + " - Add Dungeon by Planet Name", text3, "The dungeon will be added to any moons listed here. This must be the exact numberless name. \"Experimentatio\" =/= \"Experimentation\"");
					string text4 = ConfigAider.ConvertStringWithRarityToString(item.LevelMatchingProperties.levelTags);
					DungeonTagList[text2] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Dungeon: " + text2, text2 + " - Add Dungeon by Planet Tags", text4, "The dungeon will be added to all moons with a matching tag");
					string text5 = ConfigAider.ConvertVector2WithRaritiesToString(item.LevelMatchingProperties.currentRoutePrice);
					DungeonRoutePriceList[text2] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Dungeon: " + text2, text2 + " - Add Dungeon by Route Price", text5, "This dungeon will be added to all moons that have a route price between the first two values with a rarity of the final value.");
					string text6 = ConfigAider.ConvertStringWithRarityToString(((MatchingProperties)item.LevelMatchingProperties).modNames);
					DungeonModNameList[text2] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Dungeon: " + text2, text2 + " - Add Dungeon By Mod Name", text6, "The dungeon will be added to all moons of any mod listed here. This doesn't have to be an exact match, \"Rosie\" works for \"Rosie's Moons\".");
				}
			}
			CentralConfig.instance.mls.LogInfo((object)"Dungeon config has been registered.");
		}
	}

	public static CreateDungeonConfig Config;

	private static void Prefix()
	{
		CentralConfig.ConfigFile2 = new CreateDungeonConfig(((BaseUnityPlugin)CentralConfig.instance).Config);
	}
}
public class ApplyDungeonConfig
{
	public static bool Ready;

	public void UpdateDungeonValues()
	{
		//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_0138: Unknown result type (might be due to invalid IL or missing references)
		//IL_0199: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_0237: Unknown result type (might be due to invalid IL or missing references)
		//IL_0286: Unknown result type (might be due to invalid IL or missing references)
		string ignoreList = CentralConfig.SyncConfig.BlackListDungeons.Value;
		List<ExtendedDungeonFlow> list = ((!SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.IsWhiteList)) ? PatchedContent.ExtendedDungeonFlows.Where((ExtendedDungeonFlow dungeon) => !ignoreList.Split(new char[1] { ',' }).Any((string b) => dungeon.DungeonName.Equals(b))).ToList() : PatchedContent.ExtendedDungeonFlows.Where((ExtendedDungeonFlow dungeon) => ignoreList.Split(new char[1] { ',' }).Any((string b) => dungeon.DungeonName.Equals(b))).ToList());
		Vector2 clampRarity = default(Vector2);
		Vector2 clampRarity2 = default(Vector2);
		Vector2 clampRarity3 = default(Vector2);
		Vector2 clampRarity4 = default(Vector2);
		foreach (ExtendedDungeonFlow item in list)
		{
			string text = item.DungeonName + " (" + ((Object)item).name + ")";
			text = text.Replace("13Exits", "3Exits").Replace("1ExtraLarge", "ExtraLarge");
			string key = text.Replace("ExtendedDungeonFlow", "").Replace("Level", "");
			if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoDunSizeOverrides))
			{
				Vector2 dynamicDungeonSizeMinMax = item.DynamicDungeonSizeMinMax;
				dynamicDungeonSizeMinMax.x = SyncedEntry<float>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.MinDungeonSize[key]);
				dynamicDungeonSizeMinMax.y = SyncedEntry<float>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.MaxDungeonSize[key]);
				item.DynamicDungeonSizeMinMax = dynamicDungeonSizeMinMax;
				item.DynamicDungeonSizeLerpRate = SyncedEntry<float>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.DungeonSizeScaler[key]);
			}
			if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoDungeonSelectionOverrides))
			{
				string newInputString = SyncedEntry<string>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.DungeonPlanetNameList[key]);
				((Vector2)(ref clampRarity))..ctor(0f, 99999f);
				List<StringWithRarity> list2 = ConfigAider.ConvertPlanetNameStringToStringWithRarityList(newInputString, clampRarity);
				if (list2.Count > 0)
				{
					item.LevelMatchingProperties.planetNames = list2;
				}
				string newInputString2 = SyncedEntry<string>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.DungeonTagList[key]);
				((Vector2)(ref clampRarity2))..ctor(0f, 99999f);
				List<StringWithRarity> list3 = ConfigAider.ConvertTagStringToStringWithRarityList(newInputString2, clampRarity2);
				if (list3.Count > 0)
				{
					item.LevelMatchingProperties.levelTags = list3;
				}
				string newInputString3 = SyncedEntry<string>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.DungeonModNameList[key]);
				((Vector2)(ref clampRarity3))..ctor(0f, 99999f);
				List<StringWithRarity> list4 = ConfigAider.ConvertModStringToStringWithRarityList(newInputString3, clampRarity3);
				if (list4.Count > 0)
				{
					((MatchingProperties)item.LevelMatchingProperties).modNames = list4;
				}
				string newInputString4 = SyncedEntry<string>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.DungeonRoutePriceList[key]);
				((Vector2)(ref clampRarity4))..ctor(0f, 99999f);
				List<Vector2WithRarity> list5 = ConfigAider.ConvertStringToVector2WithRarityList(newInputString4, clampRarity4);
				if (list5.Count > 0)
				{
					item.LevelMatchingProperties.currentRoutePrice = list5;
				}
			}
		}
		CentralConfig.instance.mls.LogInfo((object)"Dungeon config Values Applied.");
		Ready = true;
	}
}
[HarmonyPatch(typeof(HangarShipDoor), "Start")]
public class FrApplyDungeon
{
	private static void Postfix()
	{
		ApplyDungeonConfig applyDungeonConfig = new ApplyDungeonConfig();
		applyDungeonConfig.UpdateDungeonValues();
	}
}
[HarmonyPatch(typeof(RoundManager), "GenerateNewFloor")]
public static class NewDungeonGenerator
{
	private static int failureCount = 19;

	private static float PreClampValue;

	private static bool Prefix(RoundManager __instance)
	{
		if (!SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.UseNewGen))
		{
			CentralConfig.instance.mls.LogInfo((object)"New generation is not in use, proceeding with standard generation.");
			return true;
		}
		List<int> list = new List<int>();
		for (int i = 0; i < __instance.currentLevel.dungeonFlowTypes.Length; i++)
		{
			list.Add(__instance.currentLevel.dungeonFlowTypes[i].rarity);
		}
		Random random = new Random(StartOfRound.Instance.randomMapSeed - 69);
		int id = __instance.currentLevel.dungeonFlowTypes[__instance.GetRandomWeightedIndex(list.ToArray(), random)].id;
		__instance.dungeonGenerator.Generator.DungeonFlow = __instance.dungeonFlowTypes[id].dungeonFlow;
		if (id < __instance.firstTimeDungeonAudios.Length && (Object)(object)__instance.firstTimeDungeonAudios[id] != (Object)null)
		{
			EntranceTeleport[] array = Object.FindObjectsOfType<EntranceTeleport>();
			if (array != null && array.Length != 0)
			{
				for (int j = 0; j < array.Length; j++)
				{
					if (array[j].isEntranceToBuilding)
					{
						array[j].firstTimeAudio = __instance.firstTimeDungeonAudios[id];
						array[j].dungeonFlowId = id;
					}
				}
			}
		}
		ExtendedDungeonFlow currentExtendedDungeonFlow = DungeonManager.CurrentExtendedDungeonFlow;
		string text = currentExtendedDungeonFlow.DungeonName + " (" + ((Object)currentExtendedDungeonFlow).name + ")";
		text = text.Replace("13Exits", "3Exits").Replace("1ExtraLarge", "ExtraLarge");
		string key = text.Replace("ExtendedDungeonFlow", "").Replace("Level", "");
		__instance.dungeonGenerator.Generator.ShouldRandomizeSeed = false;
		while (failureCount < 20)
		{
			__instance.dungeonGenerator.Generator.Seed = StartOfRound.Instance.randomMapSeed + 420;
			float num = __instance.currentLevel.factorySizeMultiplier / __instance.dungeonFlowTypes[id].MapTileSize * __instance.mapSizeMultiplier;
			if (WaitForDungeonsToRegister.CreateDungeonConfig.DungeonSizeScaler.ContainsKey(key))
			{
				PreClampValue = num;
				if (num < SyncedEntry<float>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.MinDungeonSize[key]))
				{
					num = Mathf.Lerp(num, SyncedEntry<float>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.MinDungeonSize[key]), SyncedEntry<float>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.DungeonSizeScaler[key]) / 100f);
				}
				else if (num > SyncedEntry<float>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.MaxDungeonSize[key]))
				{
					num = Mathf.Lerp(num, SyncedEntry<float>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.MaxDungeonSize[key]), SyncedEntry<float>.op_Implicit(WaitForDungeonsToRegister.CreateDungeonConfig.DungeonSizeScaler[key]) / 100f);
				}
				CentralConfig.instance.mls.LogInfo((object)("Clamps for the dungeon have been applied. Original value: " + PreClampValue + " New value: " + num));
			}
			else
			{
				CentralConfig.instance.mls.LogInfo((object)"Either the current dungeon is blacklisted, or clamp overrides are false. No clamping will be applied.");
			}
			num = (float)((double)Mathf.Round(num * 100f) / 100.0);
			__instance.dungeonGenerator.Generator.LengthMultiplier = num;
			try
			{
				__instance.dungeonGenerator.Generate();
				CentralConfig.instance.mls.LogInfo((object)"Dungeon has been loaded by Central Config.");
				failureCount = 19;
				return false;
			}
			catch (Exception)
			{
				failureCount++;
			}
		}
		return false;
	}
}
[HarmonyPatch(typeof(DungeonGenerator), "InnerGenerate")]
public static class InnerGenerateWithRetries
{
	private static int retryCount = 20;

	private static bool Prefix(DungeonGenerator __instance, bool isRetry, ref IEnumerator __result)
	{
		if (!SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.UseNewGen))
		{
			return true;
		}
		if (DungeonManager.CurrentExtendedDungeonFlow.DungeonName == "SectorFlow" || DungeonManager.CurrentExtendedDungeonFlow.DungeonName == "CozyOffice" || DungeonManager.CurrentExtendedDungeonFlow.DungeonName == "Black Mesa" || DungeonManager.CurrentExtendedDungeonFlow.DungeonName == "BunkerFlow")
		{
			retryCount = 15;
			CentralConfig.instance.mls.LogInfo((object)"Current Dungeon is incompatible, granting retries.");
		}
		if (isRetry)
		{
			retryCount++;
			if (retryCount >= 20)
			{
				__result = TerminateCoroutine();
				return false;
			}
		}
		else
		{
			retryCount = 20;
		}
		return true;
		static IEnumerator TerminateCoroutine()
		{
			yield break;
		}
	}
}
[HarmonyPatch(typeof(DungeonGenerator), "InnerGenerate")]
public static class LogFinalSize
{
	private static void Postfix(DungeonGenerator __instance)
	{
		float lengthMultiplier = __instance.LengthMultiplier;
		CentralConfig.instance.mls.LogInfo((object)("Final Length Multiplier " + lengthMultiplier));
	}
}
[HarmonyPatch(typeof(HangarShipDoor), "Start")]
public class MiscConfig
{
	[DataContract]
	public class CreateMiscConfig : ConfigTemplate
	{
		[DataMember]
		public static SyncedEntry<float> FineAmount { get; private set; }

		[DataMember]
		public static SyncedEntry<float> InsuranceReduction { get; private set; }

		[DataMember]
		public static SyncedEntry<float> CompanyFineAmount { get; private set; }

		[DataMember]
		public static SyncedEntry<float> CompanyInsuranceReduction { get; private set; }

		[DataMember]
		public static SyncedEntry<bool> ProportionalFine { get; private set; }

		public CreateMiscConfig(ConfigFile cfg)
			: base(cfg, "CentralConfig", 0)
		{
			if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoFineOverrides))
			{
				FineAmount = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, "~Misc~", "Penalty for each fallen player", 20f, "This is the percentage of current credits that will be deducted for each fallen player.");
				InsuranceReduction = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, "~Misc~", "Penalty reduction for player revival", 40f, "This value determines the reduction in penalty if a fallen player's body is revived. For instance, setting this to 0 means no penalty for revived players, 50 means half the penalty is applied upon revival, and 100 means the penalty remains the same regardless of revival. It can be any value between 0 and 100.");
				CompanyFineAmount = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, "~Misc~", "Penalty for each fallen player (on Gordion)", 0f, "This is the percentage of current credits that will be deducted for each fallen player on Gordion.");
				CompanyInsuranceReduction = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, "~Misc~", "Penalty reduction for player revival (on Gordion)", 0f, "This value determines the reduction in penalty on Gordion if a fallen player's body is revived. For instance, setting this to 0 means no penalty for revived players, 50 means half the penalty is applied upon revival, and 100 means the penalty remains the same regardless of revival. It can be any value between 0 and 100.");
				ProportionalFine = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "~Misc~", "Proportional Fine", false, "Should the fine to proportional to the ratio of dead players over total players?\nFor instance, if the penatly if 50% and half of the lobby dies, the fine will be 25% as opposed to being 50% for each dead player.");
			}
		}
	}

	public static CreateMiscConfig Config;
}
[HarmonyPatch(typeof(HUDManager), "ApplyPenalty")]
public class ChangeFineAmount
{
	private static float Grungus;

	private static float Shmunguss;

	private static float totalPlayers = GameNetworkManager.Instance.connectedPlayers + 1;

	private static string Recovered;

	private static string Bodies;

	private static bool Prefix(HUDManager __instance, int playersDead, int bodiesInsured)
	{
		if (!SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoFineOverrides))
		{
			return true;
		}
		if (LevelManager.CurrentExtendedLevel.NumberlessPlanetName == "Gordion")
		{
			Grungus = SyncedEntry<float>.op_Implicit(MiscConfig.CreateMiscConfig.CompanyFineAmount) / 100f;
			Shmunguss = 1f / (SyncedEntry<float>.op_Implicit(MiscConfig.CreateMiscConfig.CompanyInsuranceReduction) / 100f);
		}
		else
		{
			Grungus = SyncedEntry<float>.op_Implicit(MiscConfig.CreateMiscConfig.FineAmount) / 100f;
			Shmunguss = 1f / (SyncedEntry<float>.op_Implicit(MiscConfig.CreateMiscConfig.InsuranceReduction) / 100f);
		}
		Terminal val = Object.FindObjectOfType<Terminal>();
		int groupCredits = val.groupCredits;
		bodiesInsured = Mathf.Max(bodiesInsured, 0);
		for (int i = 0; i < playersDead - bodiesInsured; i++)
		{
			if (SyncedEntry<bool>.op_Implicit(MiscConfig.CreateMiscConfig.ProportionalFine))
			{
				val.groupCredits -= (int)((float)groupCredits * Grungus * ((float)playersDead / totalPlayers));
			}
			else
			{
				val.groupCredits -= (int)((float)groupCredits * Grungus);
			}
		}
		for (int j = 0; j < bodiesInsured; j++)
		{
			if (SyncedEntry<bool>.op_Implicit(MiscConfig.CreateMiscConfig.ProportionalFine))
			{
				val.groupCredits -= (int)((float)groupCredits * (Grungus / Shmunguss) * ((float)playersDead / totalPlayers));
			}
			else
			{
				val.groupCredits -= (int)((float)groupCredits * (Grungus / Shmunguss));
			}
		}
		if (val.groupCredits < 0)
		{
			val.groupCredits = 0;
		}
		int num4;
		if (SyncedEntry<bool>.op_Implicit(MiscConfig.CreateMiscConfig.ProportionalFine))
		{
			int num = playersDead - bodiesInsured;
			float num2 = (float)num / totalPlayers;
			float num3 = (float)bodiesInsured / (Shmunguss * totalPlayers);
			num4 = (int)Mathf.Round(Grungus * 100f * (num2 + num3));
		}
		else
		{
			num4 = (int)Mathf.Round(Grungus * 100f * (float)(playersDead - bodiesInsured) + Grungus * 100f / Shmunguss * (float)bodiesInsured);
		}
		if (playersDead > 1)
		{
			Bodies = "There were " + playersDead + " casualties, ";
		}
		else
		{
			Bodies = "There was " + playersDead + " casualty, ";
		}
		if (bodiesInsured > 0)
		{
			Recovered = "but " + bodiesInsured + " bodies were recovered.";
		}
		else
		{
			Recovered = "and " + bodiesInsured + " bodies were recovered.";
		}
		((TMP_Text)__instance.statsUIElements.penaltyAddition).text = Bodies + Recovered + "\nA fine of " + num4 + "% will be extracted from the crew.";
		((TMP_Text)__instance.statsUIElements.penaltyTotal).text = $"DUE: ${groupCredits - val.groupCredits}";
		return false;
	}
}
[HarmonyPatch(typeof(HangarShipDoor), "Start")]
[HarmonyPriority(666)]
public class WaitForMoonsToRegister
{
	[DataContract]
	public class CreateMoonConfig : ConfigTemplate
	{
		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> RoutePriceOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> RiskLevelOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> DescriptionOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> MinScrapOverrides;

		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> MaxScrapOverrides;

		[DataMember]
		public static Dictionary<string, SyncedEntry<float>> ScrapValueMultiplier;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> ScrapListOverrides;

		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> InteriorEnemyPowerCountOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> InteriorEnemyOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> DaytimeEnemyPowerCountOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> DaytimeEnemyOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> NighttimeEnemyPowerCountOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> NighttimeEnemyOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> MinTurretOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> MaxTurretOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> MinMineOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> MaxMineOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> MinSpikeTrapOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<int>> MaxSpikeTrapOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> WeatherTypeOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<string>> AddTags;

		[DataMember]
		public static Dictionary<string, SyncedEntry<bool>> VisibleOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<bool>> LockedOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<bool>> TimeOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<float>> TimeMultiplierOverride;

		[DataMember]
		public static Dictionary<string, SyncedEntry<bool>> WatiForShipToLandBeforeTimeMoves;

		[DataMember]
		public static Dictionary<string, SyncedEntry<float>> FaciltySizeOverride;

		public static Dictionary<string, float> MoonsNewScrapMultiplier = new Dictionary<string, float>();

		public CreateMoonConfig(ConfigFile cfg)
			: base(cfg, "CentralConfig", 0)
		{
			//IL_0728: Unknown result type (might be due to invalid IL or missing references)
			//IL_072d: Unknown result type (might be due to invalid IL or missing references)
			//IL_073d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0744: Unknown result type (might be due to invalid IL or missing references)
			//IL_074b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0752: Unknown result type (might be due to invalid IL or missing references)
			//IL_0759: Unknown result type (might be due to invalid IL or missing references)
			//IL_0760: Unknown result type (might be due to invalid IL or missing references)
			//IL_0769: Expected O, but got Unknown
			//IL_097e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0983: Unknown result type (might be due to invalid IL or missing references)
			//IL_0993: Unknown result type (might be due to invalid IL or missing references)
			//IL_099a: Unknown result type (might be due to invalid IL or missing references)
			//IL_09a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_09a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_09af: Unknown result type (might be due to invalid IL or missing references)
			//IL_09b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_09bf: Expected O, but got Unknown
			//IL_0bd4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0bd9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0be9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0bf0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0bf7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0bfe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c05: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c0c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c15: Expected O, but got Unknown
			RoutePriceOverride = new Dictionary<string, SyncedEntry<int>>();
			RiskLevelOverride = new Dictionary<string, SyncedEntry<string>>();
			DescriptionOverride = new Dictionary<string, SyncedEntry<string>>();
			MinScrapOverrides = new Dictionary<string, SyncedEntry<int>>();
			MaxScrapOverrides = new Dictionary<string, SyncedEntry<int>>();
			ScrapValueMultiplier = new Dictionary<string, SyncedEntry<float>>();
			ScrapListOverrides = new Dictionary<string, SyncedEntry<string>>();
			InteriorEnemyPowerCountOverride = new Dictionary<string, SyncedEntry<int>>();
			InteriorEnemyOverride = new Dictionary<string, SyncedEntry<string>>();
			DaytimeEnemyPowerCountOverride = new Dictionary<string, SyncedEntry<int>>();
			DaytimeEnemyOverride = new Dictionary<string, SyncedEntry<string>>();
			NighttimeEnemyPowerCountOverride = new Dictionary<string, SyncedEntry<int>>();
			NighttimeEnemyOverride = new Dictionary<string, SyncedEntry<string>>();
			MinTurretOverride = new Dictionary<string, SyncedEntry<int>>();
			MaxTurretOverride = new Dictionary<string, SyncedEntry<int>>();
			MinMineOverride = new Dictionary<string, SyncedEntry<int>>();
			MaxMineOverride = new Dictionary<string, SyncedEntry<int>>();
			MinSpikeTrapOverride = new Dictionary<string, SyncedEntry<int>>();
			MaxSpikeTrapOverride = new Dictionary<string, SyncedEntry<int>>();
			WeatherTypeOverride = new Dictionary<string, SyncedEntry<string>>();
			AddTags = new Dictionary<string, SyncedEntry<string>>();
			VisibleOverride = new Dictionary<string, SyncedEntry<bool>>();
			LockedOverride = new Dictionary<string, SyncedEntry<bool>>();
			TimeOverride = new Dictionary<string, SyncedEntry<bool>>();
			TimeMultiplierOverride = new Dictionary<string, SyncedEntry<float>>();
			WatiForShipToLandBeforeTimeMoves = new Dictionary<string, SyncedEntry<bool>>();
			FaciltySizeOverride = new Dictionary<string, SyncedEntry<float>>();
			string ignoreList = CentralConfig.SyncConfig.BlacklistMoons.Value;
			List<ExtendedLevel> list = ((!SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.IsWhiteList)) ? PatchedContent.ExtendedLevels.Where((ExtendedLevel level) => !ignoreList.Split(new char[1] { ',' }).Any((string b) => level.NumberlessPlanetName.Equals(b))).ToList() : PatchedContent.ExtendedLevels.Where((ExtendedLevel level) => ignoreList.Split(new char[1] { ',' }).Any((string b) => level.NumberlessPlanetName.Equals(b))).ToList());
			foreach (ExtendedLevel item in list)
			{
				string numberlessPlanetName = item.NumberlessPlanetName;
				if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoGenOverrides))
				{
					RoutePriceOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Route Price", item.RoutePrice, "Sets the cost of routing to the moon.");
					RiskLevelOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Risk Level", item.SelectableLevel.riskLevel, "Sets the risk level of the moon (only visual).");
					DescriptionOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Description", item.SelectableLevel.LevelDescription, "Sets the description of the moon, \\n is used to go to the next line (basically the enter key) (only visual).");
				}
				if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoScrapOverrides))
				{
					MinScrapOverrides[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Min Scrap", item.SelectableLevel.minScrap, "Sets the minimum amount of scrap to generate on the moon.");
					MaxScrapOverrides[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Max Scrap", item.SelectableLevel.maxScrap, "Sets the maximum amount of scrap to generate on the moon.");
					ScrapValueMultiplier[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " -  Scrap Value Multiplier", 1f, "Each scrap object on this moon will have its personal min/max values multiplied by this amount.");
					string text = ConfigAider.ConvertItemListToString(item.SelectableLevel.spawnableScrap);
					ScrapListOverrides[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Scrap List", text, "Sets the list of scrap with attached rarities to generate on the moon.");
				}
				if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoEnemyOverrides))
				{
					InteriorEnemyPowerCountOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Interior Enemy Power", item.SelectableLevel.maxEnemyPowerCount, "Sets the power available for interior enemies on the moon.");
					string text2 = ConfigAider.ConvertEnemyListToString(item.SelectableLevel.Enemies);
					InteriorEnemyOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Interior Enemy List", text2, "Sets the spawn weights for interior enemies on the moon.");
					DaytimeEnemyPowerCountOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Daytime Enemy Power", item.SelectableLevel.maxDaytimeEnemyPowerCount, "Sets the power available for daytime enemies on the moon.");
					string text3 = ConfigAider.ConvertEnemyListToString(item.SelectableLevel.DaytimeEnemies);
					DaytimeEnemyOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Daytime Enemy List", text3, "Sets the spawn weights for daytime enemies on the moon.");
					NighttimeEnemyPowerCountOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Nighttime Enemy Power", item.SelectableLevel.maxOutsideEnemyPowerCount, "Sets the power available for nighttime enemies on the moon.");
					string text4 = ConfigAider.ConvertEnemyListToString(item.SelectableLevel.OutsideEnemies);
					NighttimeEnemyOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Nighttime Enemy List", text4, "Sets the spawn weights for nighttime enemies on the moon.");
				}
				if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoTrapOverrides))
				{
					List<string> list2 = item.SelectableLevel.spawnableMapObjects.Select((SpawnableMapObject mapObject) => ((Object)mapObject.prefabToSpawn).name).ToList();
					SpawnableMapObject val = ((IEnumerable<SpawnableMapObject>)item.SelectableLevel.spawnableMapObjects).FirstOrDefault((Func<SpawnableMapObject, bool>)((SpawnableMapObject mo) => ((Object)mo.prefabToSpawn).name == "TurretContainer"));
					if (val != null)
					{
						AnimationCurve numberToSpawn = val.numberToSpawn;
						int num = (int)Math.Round(numberToSpawn.Evaluate(0f));
						int num2 = (int)Math.Round(numberToSpawn.Evaluate(((Keyframe)(ref numberToSpawn.keys[numberToSpawn.length - 1])).time));
						MinTurretOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Min Turrets", num, "Sets the minimum number of turrets to spawn on the moon.");
						MaxTurretOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Max Turrets", num2, "Sets the maximum number of turrets to spawn on the moon.");
						if (turretContainerObjectReference == null)
						{
							turretContainerObjectReference = Array.Find(item.SelectableLevel.spawnableMapObjects, (SpawnableMapObject obj) => (Object)(object)obj.prefabToSpawn != (Object)null && ((Object)obj.prefabToSpawn).name == "TurretContainer");
							if (turretContainerObjectReference == null)
							{
							}
						}
					}
					else
					{
						MinTurretOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Min Turrets", 0, "Sets the minimum number of turrets to spawn on the moon.");
						MaxTurretOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Max Turrets", 0, "Sets the maximum number of turrets to spawn on the moon.");
						if (turretContainerObjectReference != null)
						{
							SpawnableMapObject val2 = new SpawnableMapObject
							{
								prefabToSpawn = turretContainerObjectReference.prefabToSpawn,
								spawnFacingAwayFromWall = true,
								spawnFacingWall = false,
								spawnWithBackToWall = false,
								spawnWithBackFlushAgainstWall = false,
								requireDistanceBetweenSpawns = false,
								disallowSpawningNearEntrances = false
							};
							SpawnableMapObject[] array = (SpawnableMapObject[])(object)new SpawnableMapObject[item.SelectableLevel.spawnableMapObjects.Length + 1];
							Array.Copy(item.SelectableLevel.spawnableMapObjects, array, item.SelectableLevel.spawnableMapObjects.Length);
							array[^1] = val2;
							item.SelectableLevel.spawnableMapObjects = array;
						}
					}
					SpawnableMapObject val3 = ((IEnumerable<SpawnableMapObject>)item.SelectableLevel.spawnableMapObjects).FirstOrDefault((Func<SpawnableMapObject, bool>)((SpawnableMapObject mo) => ((Object)mo.prefabToSpawn).name == "Landmine"));
					if (val3 != null)
					{
						AnimationCurve numberToSpawn2 = val3.numberToSpawn;
						int num3 = (int)Math.Round(numberToSpawn2.Evaluate(0f));
						int num4 = (int)Math.Round(numberToSpawn2.Evaluate(((Keyframe)(ref numberToSpawn2.keys[numberToSpawn2.length - 1])).time));
						MinMineOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Min Mines", num3, "Sets the minimum number of mines to spawn on the moon.");
						MaxMineOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Max Mines", num4, "Sets the maximum number of mines to spawn on the moon.");
						if (landmineObjectReference == null)
						{
							landmineObjectReference = Array.Find(item.SelectableLevel.spawnableMapObjects, (SpawnableMapObject obj) => (Object)(object)obj.prefabToSpawn != (Object)null && ((Object)obj.prefabToSpawn).name == "Landmine");
							if (landmineObjectReference == null)
							{
							}
						}
					}
					else
					{
						MinMineOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Min Mines", 0, "Sets the minimum number of mines to spawn on the moon.");
						MaxMineOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Max Mines", 0, "Sets the maximum number of mines to spawn on the moon.");
						if (landmineObjectReference != null)
						{
							SpawnableMapObject val4 = new SpawnableMapObject
							{
								prefabToSpawn = landmineObjectReference.prefabToSpawn,
								spawnFacingAwayFromWall = false,
								spawnFacingWall = false,
								spawnWithBackToWall = false,
								spawnWithBackFlushAgainstWall = false,
								requireDistanceBetweenSpawns = false,
								disallowSpawningNearEntrances = false
							};
							SpawnableMapObject[] array2 = (SpawnableMapObject[])(object)new SpawnableMapObject[item.SelectableLevel.spawnableMapObjects.Length + 1];
							Array.Copy(item.SelectableLevel.spawnableMapObjects, array2, item.SelectableLevel.spawnableMapObjects.Length);
							array2[^1] = val4;
							item.SelectableLevel.spawnableMapObjects = array2;
						}
					}
					SpawnableMapObject val5 = ((IEnumerable<SpawnableMapObject>)item.SelectableLevel.spawnableMapObjects).FirstOrDefault((Func<SpawnableMapObject, bool>)((SpawnableMapObject mo) => ((Object)mo.prefabToSpawn).name == "SpikeRoofTrapHazard"));
					if (val5 != null)
					{
						AnimationCurve numberToSpawn3 = val5.numberToSpawn;
						int num5 = (int)Math.Round(numberToSpawn3.Evaluate(0f));
						int num6 = (int)Math.Round(numberToSpawn3.Evaluate(((Keyframe)(ref numberToSpawn3.keys[numberToSpawn3.length - 1])).time));
						MinSpikeTrapOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Min Spike Traps", num5, "Sets the minimum number of spike traps to spawn on the moon.");
						MaxSpikeTrapOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Max Spike Traps", num6, "Sets the maximum number of spike traps to spawn on the moon.");
						if (spikeRoofTrapHazardObjectReference == null)
						{
							spikeRoofTrapHazardObjectReference = Array.Find(item.SelectableLevel.spawnableMapObjects, (SpawnableMapObject obj) => (Object)(object)obj.prefabToSpawn != (Object)null && ((Object)obj.prefabToSpawn).name == "SpikeRoofTrapHazard");
							if (spikeRoofTrapHazardObjectReference == null)
							{
							}
						}
					}
					else
					{
						MinSpikeTrapOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Min Spike Traps", 0, "Sets the minimum number of spike traps to spawn on the moon.");
						MaxSpikeTrapOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Max Spike Traps", 0, "Sets the maximum number of spike traps to spawn on the moon.");
						if (spikeRoofTrapHazardObjectReference != null)
						{
							SpawnableMapObject val6 = new SpawnableMapObject
							{
								prefabToSpawn = spikeRoofTrapHazardObjectReference.prefabToSpawn,
								spawnFacingAwayFromWall = false,
								spawnFacingWall = true,
								spawnWithBackToWall = true,
								spawnWithBackFlushAgainstWall = true,
								requireDistanceBetweenSpawns = true,
								disallowSpawningNearEntrances = false
							};
							SpawnableMapObject[] array3 = (SpawnableMapObject[])(object)new SpawnableMapObject[item.SelectableLevel.spawnableMapObjects.Length + 1];
							Array.Copy(item.SelectableLevel.spawnableMapObjects, array3, item.SelectableLevel.spawnableMapObjects.Length);
							array3[^1] = val6;
							item.SelectableLevel.spawnableMapObjects = array3;
						}
					}
				}
				if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoMoonWeatherOverrides))
				{
					string text5 = ConfigAider.ConvertWeatherArrayToString(item.SelectableLevel.randomWeathers);
					WeatherTypeOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Possible Weathers", text5, "Sets the possible weathers that can occur on the moon");
				}
				if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoEnemyTagInjections) || SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoScrapTagInjections))
				{
					string text6 = ConfigAider.ConvertTagsToString(((ExtendedContent)item).ContentTags);
					AddTags[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Content Tags", text6, "Add new content tags to the moon (The tags shown in the default value cannot be removed).");
				}
				if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoDangerBools))
				{
					VisibleOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Should The Moon Be Hidden?", item.IsRouteHidden, "Set to true to hide the moon in the terminal.");
					LockedOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Should The Moon Be Locked?", item.IsRouteLocked, "Set to true to prevent visiting the moon.");
					TimeOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Should The Moon Have Time?", item.SelectableLevel.planetHasTime, "Set to true to enable time progression. Set to false for no time progression.");
					TimeMultiplierOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Day Speed Multiplier", item.SelectableLevel.DaySpeedMultiplier, "Adjusts the speed of day progression. For example, 2 means 2x faster.");
					WatiForShipToLandBeforeTimeMoves[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Should Time Wait on the Ship?", true, "Set to true to make time only progress AFTER the ship has landed.");
				}
				if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoDunSizeOverrides))
				{
					FaciltySizeOverride[numberlessPlanetName] = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, "Moon: " + numberlessPlanetName, numberlessPlanetName + " - Dungeon Size", item.SelectableLevel.factorySizeMultiplier, "Sets the dungeon size multiplier granted by this moon.");
				}
			}
			ConfigAider.Instance.CleanConfig(cfg);
			CentralConfig.instance.mls.LogInfo((object)"Moon config has been registered.");
		}
	}

	public static CreateMoonConfig Config;

	public static SpawnableMapObject turretContainerObjectReference;

	public static SpawnableMapObject landmineObjectReference;

	public static SpawnableMapObject spikeRoofTrapHazardObjectReference;

	private static void Prefix()
	{
		if (StartOfRound.Instance.randomMapSeed == 0 && NetworkManager.Singleton.IsHost)
		{
			StartOfRound.Instance.randomMapSeed = Random.Range(1, 100000000);
			CentralConfig.instance.mls.LogInfo((object)("Starting Seed " + StartOfRound.Instance.randomMapSeed));
		}
		CentralConfig.ConfigFile = new CreateMoonConfig(((BaseUnityPlugin)CentralConfig.instance).Config);
	}
}
public class ApplyMoonConfig
{
	public static bool Ready;

	public void UpdateMoonValues()
	{
		//IL_01be: Unknown result type (might be due to invalid IL or missing references)
		//IL_0342: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_041a: Unknown result type (might be due to invalid IL or missing references)
		//IL_051e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0520: Unknown result type (might be due to invalid IL or missing references)
		//IL_0527: Unknown result type (might be due to invalid IL or missing references)
		//IL_0529: Unknown result type (might be due to invalid IL or missing references)
		//IL_052e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0535: Expected O, but got Unknown
		//IL_05c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_05cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_05d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_05d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_05d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_05e0: Expected O, but got Unknown
		//IL_0674: Unknown result type (might be due to invalid IL or missing references)
		//IL_0676: Unknown result type (might be due to invalid IL or missing references)
		//IL_067d: Unknown result type (might be due to invalid IL or missing references)
		//IL_067f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0684: Unknown result type (might be due to invalid IL or missing references)
		//IL_068b: Expected O, but got Unknown
		string ignoreList = CentralConfig.SyncConfig.BlacklistMoons.Value;
		List<ExtendedLevel> list = ((!SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.IsWhiteList)) ? PatchedContent.ExtendedLevels.Where((ExtendedLevel level) => !ignoreList.Split(new char[1] { ',' }).Any((string b) => level.NumberlessPlanetName.Equals(b))).ToList() : PatchedContent.ExtendedLevels.Where((ExtendedLevel level) => ignoreList.Split(new char[1] { ',' }).Any((string b) => level.NumberlessPlanetName.Equals(b))).ToList());
		Vector2 clampRarity = default(Vector2);
		Vector2 clampRarity2 = default(Vector2);
		Vector2 clampRarity3 = default(Vector2);
		Vector2 clampRarity4 = default(Vector2);
		Keyframe val2 = default(Keyframe);
		Keyframe val3 = default(Keyframe);
		Keyframe val5 = default(Keyframe);
		Keyframe val6 = default(Keyframe);
		Keyframe val8 = default(Keyframe);
		Keyframe val9 = default(Keyframe);
		foreach (ExtendedLevel item in list)
		{
			string numberlessPlanetName = item.NumberlessPlanetName;
			if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoGenOverrides))
			{
				item.RoutePrice = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.RoutePriceOverride[numberlessPlanetName]);
				item.SelectableLevel.riskLevel = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.RiskLevelOverride[numberlessPlanetName]);
				item.SelectableLevel.LevelDescription = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.DescriptionOverride[numberlessPlanetName]);
				item.OverrideRouteNodeDescription = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.DescriptionOverride[numberlessPlanetName]);
				item.OverrideRouteConfirmNodeDescription = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.DescriptionOverride[numberlessPlanetName]);
				item.OverrideInfoNodeDescription = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.DescriptionOverride[numberlessPlanetName]);
			}
			if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoScrapOverrides))
			{
				item.SelectableLevel.minScrap = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.MinScrapOverrides[numberlessPlanetName]);
				item.SelectableLevel.maxScrap = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.MaxScrapOverrides[numberlessPlanetName]);
				string newInputString = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.ScrapListOverrides[numberlessPlanetName]);
				((Vector2)(ref clampRarity))..ctor(0f, 99999f);
				List<SpawnableItemWithRarity> list2 = ConfigAider.ConvertStringToItemList(newInputString, clampRarity);
				if (list2.Count > 0)
				{
					item.SelectableLevel.spawnableScrap = list2;
				}
			}
			if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoEnemyOverrides))
			{
				if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.ScaleEnemySpawnRate))
				{
					float multiplier = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.InteriorEnemyPowerCountOverride[numberlessPlanetName]) / item.SelectableLevel.maxEnemyPowerCount;
					item.SelectableLevel.enemySpawnChanceThroughoutDay = ConfigAider.MultiplyYValues(item.SelectableLevel.enemySpawnChanceThroughoutDay, multiplier, item.NumberlessPlanetName, "Interior Curve");
					float multiplier2 = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.DaytimeEnemyPowerCountOverride[numberlessPlanetName]) / item.SelectableLevel.maxDaytimeEnemyPowerCount;
					item.SelectableLevel.daytimeEnemySpawnChanceThroughDay = ConfigAider.MultiplyYValues(item.SelectableLevel.daytimeEnemySpawnChanceThroughDay, multiplier2, item.NumberlessPlanetName, "Daytime Curve");
					float multiplier3 = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.NighttimeEnemyPowerCountOverride[numberlessPlanetName]) / item.SelectableLevel.maxOutsideEnemyPowerCount;
					item.SelectableLevel.outsideEnemySpawnChanceThroughDay = ConfigAider.MultiplyYValues(item.SelectableLevel.outsideEnemySpawnChanceThroughDay, multiplier3, item.NumberlessPlanetName, "Nighttime Curve");
				}
				item.SelectableLevel.maxEnemyPowerCount = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.InteriorEnemyPowerCountOverride[numberlessPlanetName]);
				string newInputString2 = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.InteriorEnemyOverride[numberlessPlanetName]);
				((Vector2)(ref clampRarity2))..ctor(0f, 99999f);
				List<SpawnableEnemyWithRarity> list3 = ConfigAider.ConvertStringToEnemyList(newInputString2, clampRarity2);
				if (list3.Count > 0)
				{
					item.SelectableLevel.Enemies = list3;
				}
				item.SelectableLevel.maxDaytimeEnemyPowerCount = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.DaytimeEnemyPowerCountOverride[numberlessPlanetName]);
				string newInputString3 = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.DaytimeEnemyOverride[numberlessPlanetName]);
				((Vector2)(ref clampRarity3))..ctor(0f, 99999f);
				List<SpawnableEnemyWithRarity> list4 = ConfigAider.ConvertStringToEnemyList(newInputString3, clampRarity3);
				if (list4.Count > 0)
				{
					item.SelectableLevel.DaytimeEnemies = list4;
				}
				item.SelectableLevel.maxOutsideEnemyPowerCount = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.NighttimeEnemyPowerCountOverride[numberlessPlanetName]);
				string newInputString4 = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.NighttimeEnemyOverride[numberlessPlanetName]);
				((Vector2)(ref clampRarity4))..ctor(0f, 99999f);
				List<SpawnableEnemyWithRarity> list5 = ConfigAider.ConvertStringToEnemyList(newInputString4, clampRarity4);
				if (list5.Count > 0)
				{
					item.SelectableLevel.OutsideEnemies = list5;
				}
			}
			if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoTrapOverrides))
			{
				List<string> list6 = item.SelectableLevel.spawnableMapObjects.Select((SpawnableMapObject mapObject) => ((Object)mapObject.prefabToSpawn).name).ToList();
				SpawnableMapObject val = ((IEnumerable<SpawnableMapObject>)item.SelectableLevel.spawnableMapObjects).FirstOrDefault((Func<SpawnableMapObject, bool>)((SpawnableMapObject mo) => ((Object)mo.prefabToSpawn).name == "TurretContainer"));
				if (val != null)
				{
					int num = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.MinTurretOverride[numberlessPlanetName]);
					int num2 = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.MaxTurretOverride[numberlessPlanetName]);
					((Keyframe)(ref val2))..ctor(0f, (float)num);
					((Keyframe)(ref val3))..ctor(1f, (float)num2);
					AnimationCurve numberToSpawn = new AnimationCurve((Keyframe[])(object)new Keyframe[2] { val2, val3 });
					val.numberToSpawn = numberToSpawn;
				}
				SpawnableMapObject val4 = ((IEnumerable<SpawnableMapObject>)item.SelectableLevel.spawnableMapObjects).FirstOrDefault((Func<SpawnableMapObject, bool>)((SpawnableMapObject mo) => ((Object)mo.prefabToSpawn).name == "Landmine"));
				if (val4 != null)
				{
					int num3 = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.MinMineOverride[numberlessPlanetName]);
					int num4 = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.MaxMineOverride[numberlessPlanetName]);
					((Keyframe)(ref val5))..ctor(0f, (float)num3);
					((Keyframe)(ref val6))..ctor(1f, (float)num4);
					AnimationCurve numberToSpawn2 = new AnimationCurve((Keyframe[])(object)new Keyframe[2] { val5, val6 });
					val4.numberToSpawn = numberToSpawn2;
				}
				SpawnableMapObject val7 = ((IEnumerable<SpawnableMapObject>)item.SelectableLevel.spawnableMapObjects).FirstOrDefault((Func<SpawnableMapObject, bool>)((SpawnableMapObject mo) => ((Object)mo.prefabToSpawn).name == "SpikeRoofTrapHazard"));
				if (val7 != null)
				{
					int num5 = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.MinSpikeTrapOverride[numberlessPlanetName]);
					int num6 = SyncedEntry<int>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.MaxSpikeTrapOverride[numberlessPlanetName]);
					((Keyframe)(ref val8))..ctor(0f, (float)num5);
					((Keyframe)(ref val9))..ctor(1f, (float)num6);
					AnimationCurve numberToSpawn3 = new AnimationCurve((Keyframe[])(object)new Keyframe[2] { val8, val9 });
					val7.numberToSpawn = numberToSpawn3;
				}
			}
			if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoMoonWeatherOverrides))
			{
				string newInputString5 = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.WeatherTypeOverride[numberlessPlanetName]);
				RandomWeatherWithVariables[] randomWeathers = ConfigAider.ConvertStringToWeatherArray(newInputString5);
				item.SelectableLevel.randomWeathers = randomWeathers;
				item.SelectableLevel.overrideWeather = false;
				string text = ConfigAider.ConvertWeatherArrayToString(item.SelectableLevel.randomWeathers);
				Ororo ororo = new Ororo();
				ororo.SetSinglePlanetWeather(item);
			}
			if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoEnemyTagInjections) || SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoScrapTagInjections))
			{
				string newInputString6 = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.AddTags[numberlessPlanetName]);
				List<ContentTag> list7 = ConfigAider.ConvertStringToTagList(newInputString6);
				if (list7.Count > 0)
				{
					((ExtendedContent)item).ContentTags.AddRange(list7);
				}
			}
			if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoDangerBools))
			{
				item.IsRouteHidden = SyncedEntry<bool>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.VisibleOverride[numberlessPlanetName]);
				item.IsRouteLocked = SyncedEntry<bool>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.LockedOverride[numberlessPlanetName]);
				item.SelectableLevel.planetHasTime = SyncedEntry<bool>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.TimeOverride[numberlessPlanetName]);
			}
			if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoDunSizeOverrides))
			{
				item.SelectableLevel.factorySizeMultiplier = SyncedEntry<float>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.FaciltySizeOverride[numberlessPlanetName]);
			}
		}
		CentralConfig.instance.mls.LogInfo((object)"Moon config Values Applied.");
		Ready = true;
	}
}
[HarmonyPatch(typeof(HangarShipDoor), "Start")]
public class FrApplyMoon
{
	private static void Postfix()
	{
		ApplyMoonConfig applyMoonConfig = new ApplyMoonConfig();
		applyMoonConfig.UpdateMoonValues();
	}
}
[HarmonyPatch(typeof(RoundManager), "SpawnDaytimeEnemiesOutside")]
public class CountTraps
{
	private static void Postfix(RoundManager __instance)
	{
		Landmine[] array = Object.FindObjectsOfType<Landmine>();
		CentralConfig.instance.mls.LogInfo((object)("Number of landmines in the level: " + array.Length));
		Turret[] array2 = Object.FindObjectsOfType<Turret>();
		CentralConfig.instance.mls.LogInfo((object)("Number of turrets in the level: " + array2.Length));
		SpikeRoofTrap[] array3 = Object.FindObjectsOfType<SpikeRoofTrap>();
		CentralConfig.instance.mls.LogInfo((object)("Number of spike traps in the level: " + array3.Length));
	}
}
[HarmonyPatch(typeof(RoundManager), "SpawnScrapInLevel")]
public class ApplyScrapValueMultiplier
{
	private static void Prefix(RoundManager __instance)
	{
		if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.FreeEnemies))
		{
			__instance.hourTimeBetweenEnemySpawnBatches = 1;
		}
		string numberlessPlanetName = LevelManager.CurrentExtendedLevel.NumberlessPlanetName;
		if (SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoScrapOverrides) && WaitForMoonsToRegister.CreateMoonConfig.ScrapValueMultiplier.ContainsKey(numberlessPlanetName))
		{
			if (!WaitForMoonsToRegister.CreateMoonConfig.MoonsNewScrapMultiplier.ContainsKey(numberlessPlanetName))
			{
				float num = __instance.scrapValueMultiplier * WaitForMoonsToRegister.CreateMoonConfig.ScrapValueMultiplier[numberlessPlanetName].Value;
				WaitForMoonsToRegister.CreateMoonConfig.MoonsNewScrapMultiplier[numberlessPlanetName] = num;
				__instance.scrapValueMultiplier = num;
			}
			else
			{
				__instance.scrapValueMultiplier = WaitForMoonsToRegister.CreateMoonConfig.MoonsNewScrapMultiplier[numberlessPlanetName];
			}
		}
	}
}
[HarmonyPatch(typeof(TimeOfDay), "MoveGlobalTime")]
public static class TimeFix
{
	private static bool Prefix(TimeOfDay __instance)
	{
		if (!SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoDangerBools))
		{
			return true;
		}
		StartOfRound instance = StartOfRound.Instance;
		string numberlessPlanetName = LevelManager.CurrentExtendedLevel.NumberlessPlanetName;
		if (WaitForMoonsToRegister.CreateMoonConfig.WatiForShipToLandBeforeTimeMoves[numberlessPlanetName].Value && !instance.shipHasLanded && !__instance.shipLeavingAlertCalled)
		{
			return false;
		}
		__instance.globalTimeSpeedMultiplier = WaitForMoonsToRegister.CreateMoonConfig.TimeMultiplierOverride[numberlessPlanetName].Value;
		float globalTime = __instance.globalTime;
		__instance.globalTime = Mathf.Clamp(__instance.globalTime + Time.deltaTime * __instance.globalTimeSpeedMultiplier, 0f, __instance.globalTimeAtEndOfDay);
		globalTime = __instance.globalTime - globalTime;
		__instance.timeUntilDeadline -= globalTime;
		CentralConfig.shid += globalTime;
		return false;
	}
}
[HarmonyPatch(typeof(StartOfRound), "PassTimeToNextDay")]
public static class DayTimePassFix
{
	private static bool Prefix(StartOfRound __instance, int connectedPlayersOnServer = 0)
	{
		if (!SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.DoDangerBools))
		{
			return true;
		}
		if (__instance.isChallengeFile)
		{
			TimeOfDay.Instance.globalTime = 100f;
			__instance.SetMapScreenInfoToCurrentLevel();
			return false;
		}
		float num = 980f - CentralConfig.shid;
		if (LevelManager.CurrentExtendedLevel.NumberlessPlanetName != "Gordion" || TimeOfDay.Instance.daysUntilDeadline <= 0)
		{
			TimeOfDay instance = TimeOfDay.Instance;
			instance.timeUntilDeadline -= num;
			TimeOfDay.Instance.OnDayChanged();
		}
		TimeOfDay.Instance.globalTime = 100f;
		TimeOfDay.Instance.UpdateProfitQuotaCurrentTime();
		if (LevelManager.CurrentExtendedLevel.NumberlessPlanetName != "Gordion" || TimeOfDay.Instance.daysUntilDeadline <= 0)
		{
			HUDManager.Instance.DisplayDaysLeft((int)Mathf.Floor(TimeOfDay.Instance.timeUntilDeadline / TimeOfDay.Instance.totalTime));
		}
		Object.FindObjectOfType<Terminal>().SetItemSales();
		__instance.SetMapScreenInfoToCurrentLevel();
		if (TimeOfDay.Instance.timeUntilDeadline > 0f && TimeOfDay.Instance.daysUntilDeadline <= 0 && TimeOfDay.Instance.timesFulfilledQuota <= 0)
		{
			((MonoBehaviour)__instance).StartCoroutine(playDaysLeftAlertSFXDelayed());
		}
		CentralConfig.shid = 0f;
		return false;
	}

	public static IEnumerator playDaysLeftAlertSFXDelayed()
	{
		yield return (object)new WaitForSeconds(3f);
		StartOfRound.Instance.speakerAudioSource.PlayOneShot(StartOfRound.Instance.zeroDaysLeftAlertSFX);
	}
}
public class Ororo
{
	public void SetSinglePlanetWeather(ExtendedLevel level)
	{
		//IL_006c: 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_005c: Unknown result type (might be due to invalid IL or missing references)
		string numberlessPlanetName = level.NumberlessPlanetName;
		string newInputString = SyncedEntry<string>.op_Implicit(WaitForMoonsToRegister.CreateMoonConfig.WeatherTypeOverride[numberlessPlanetName]);
		RandomWeatherWithVariables[] array = ConfigAider.ConvertStringToWeatherArray(newInputString);
		Random random = new Random(StartOfRound.Instance.randomMapSeed + 69);
		if (array != null && array.Length != 0)
		{
			level.SelectableLevel.currentWeather = array[random.Next(0, array.Length)].weatherType;
		}
		else
		{
			level.SelectableLevel.currentWeather = (LevelWeatherType)(-1);
		}
	}
}
[HarmonyPatch(typeof(RoundManager), "PlotOutEnemiesForNextHour")]
public static class ShowIntEnemyCount
{
	public static int IntEnemiesSpawned;

	private static void Postfix(RoundManager __instance)
	{
		float num = __instance.currentLevel.enemySpawnChanceThroughoutDay.Evaluate(__instance.timeScript.currentDayTime / __instance.timeScript.totalTime);
		float num2 = num + (float)Mathf.Abs(TimeOfDay.Instance.daysUntilDeadline - 3) / 1.6f;
		int num3 = Mathf.Clamp(__instance.AnomalyRandom.Next((int)(num2 - __instance.currentLevel.spawnProbabilityRange), (int)(num + __instance.currentLevel.spawnProbabilityRange)), __instance.minEnemiesToSpawn, 20);
		num3 = Mathf.Clamp(num3, 0, __instance.allEnemyVents.Length);
		IntEnemiesSpawned += num3;
		CentralConfig.instance.mls.LogInfo((object)("There are now " + IntEnemiesSpawned + " interior enemies"));
	}
}
[HarmonyPatch(typeof(RoundManager), "PlotOutEnemiesForNextHour")]
public static class MoarEnemies1
{
	private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
	{
		foreach (CodeInstruction inst in instructions)
		{
			if (inst.opcode == OpCodes.Ldc_I4_S && (sbyte)inst.operand == 20 && SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.FreeEnemies))
			{
				inst.operand = sbyte.MaxValue;
			}
			yield return inst;
		}
	}
}
[HarmonyPatch(typeof(RoundManager), "SpawnDaytimeEnemiesOutside")]
public static class MoarEnemies2
{
	private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
	{
		foreach (CodeInstruction inst in instructions)
		{
			if (inst.opcode == OpCodes.Ldc_I4_S && (sbyte)inst.operand == 20 && SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.FreeEnemies))
			{
				inst.operand = sbyte.MaxValue;
			}
			yield return inst;
		}
	}
}
[HarmonyPatch(typeof(RoundManager), "SpawnEnemiesOutside")]
public static class MoarEnemies3
{
	private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
	{
		foreach (CodeInstruction inst in instructions)
		{
			if (inst.opcode == OpCodes.Ldc_I4_S && (sbyte)inst.operand == 20 && SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.FreeEnemies))
			{
				inst.operand = sbyte.MaxValue;
			}
			yield return inst;
		}
	}
}
[HarmonyPatch(typeof(HangarShipDoor), "Start")]
[HarmonyPriority(1000)]
public class RenameCelest
{
	private static void Prefix()
	{
		List<ExtendedLevel> extendedLevels = PatchedContent.ExtendedLevels;
		foreach (ExtendedLevel item in extendedLevels)
		{
			if (item.NumberlessPlanetName == "Celest" && SyncedEntry<bool>.op_Implicit(CentralConfig.SyncConfig.RenameCelest))
			{
				item.SelectableLevel.PlanetName = "68 Celeste";
			}
		}
	}
}
public class ConfigAider : MonoBehaviour
{
	private static ConfigAider _instance;

	public const string DaComma = ",";

	public const string DaColon = ":";

	public const string DaDash = "-";

	public static ConfigAider Instance
	{
		get
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_instance == (Object)null)
			{
				_instance = new GameObject("ConfigAider").AddComponent<ConfigAider>();
			}
			return _instance;
		}
	}

	public static List<Item> Items { get; internal set; } = new List<Item>();


	public static string CauterizeString(string inputString)
	{
		return Extensions.RemoveWhitespace(Extensions.SkipToLetters(inputString)).ToLower();
	}

	internal static List<Item> GrabFullItemList()
	{
		List<Item> itemsList = StartOfRound.Instance.allItemsList.itemsList;
		foreach (Item item in itemsList)
		{
			if (!Items.Contains(item))
			{
				Items.Add(item);
			}
		}
		return Items.ToList();
	}

	public static List<EnemyType> GrabFullEnemyList()
	{
		List<EnemyType> list = new List<EnemyType>();
		foreach (EnemyType enemy in OriginalContent.Enemies)
		{
			if (!list.Contains(enemy))
			{
				list.Add(enemy);
			}
		}
		foreach (ExtendedEnemyType extendedEnemyType in PatchedContent.ExtendedEnemyTypes)
		{
			if (!list.Contains(extendedEnemyType.EnemyType))
			{
				list.Add(extendedEnemyType.EnemyType);
			}
		}
		foreach (SpawnableEnemy spawnableEnemy in Enemies.spawnableEnemies)
		{
			if (!list.Contains(spawnableEnemy.enemy))
			{
				list.Add(spawnableEnemy.enemy);
			}
		}
		return list;
	}

	public static List<ContentTag> GrabFullTagList()
	{
		List<ContentTag> list = new List<ContentTag>();
		List<ExtendedLevel> extendedLevels = PatchedContent.ExtendedLevels;
		foreach (ExtendedMod item in PatchedContent.ExtendedMods.Concat(new List<ExtendedMod> { PatchedContent.VanillaMod }))
		{
			foreach (ExtendedContent extendedContent in item.ExtendedContents)
			{
				foreach (ContentTag contentTag in extendedContent.ContentTags)
				{
					if (extendedLevels.Any((ExtendedLevel level) => ((ExtendedContent)level).ContentTags.Contains(contentTag)) && !list.Contains(contentTag))
					{
						list.Add(contentTag);
					}
				}
			}
		}
		return list;
	}

	public static List<string> SplitStringsByDaComma(string newInputString)
	{
		List<string> list = new List<string>();
		string text = newInputString;
		while (text.Contains(","))
		{
			string text2 = text.Substring(text.IndexOf(","));
			list.Add(text.Replace(text2, ""));
			if (text2.Contains(","))
			{
				text = text2.Substring(text2.IndexOf(",") + 1);
			}
		}
		list.Add(text);
		return list;
	}

	public static (string, string) SplitStringsByDaColon(string inputString)
	{
		return SplitStringByChars(inputString, ":");
	}

	public static (string, string) SplitStringByDaDash(string inputString)
	{
		return SplitStringByChars(inputString, "-");
	}

	public static (string, string) SplitStringByChars(string newInputString, string splitValue)
	{
		if (!newInputString.Contains(splitValue))
		{
			return (newInputString, string.Empty);
		}
		string empty = string.Empty;
		string empty2 = string.Empty;
		empty = newInputString.Replace(newInputString.Substring(newInputString.IndexOf(splitValue)), "");
		empty2 = newInputString.Substring(newInputString.IndexOf(splitValue) + 1);
		return (empty, empty2);
	}

	public static List<StringWithRarity> ConvertStringToList(string newInputString, Vector2 clampRarity)
	{
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Expected O, but got Unknown
		//IL_0060: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		List<StringWithRarity> list = new List<StringWithRarity>();
		List<string> list2 = SplitStringsByDaComma(newInputString);
		foreach (string item2 in list2)
		{
			(string, string) tuple = SplitStringsByDaColon(item2);
			string item = tuple.Item1;
			int num = 0;
			if (int.TryParse(tuple.Item2, out var result))
			{
				num = result;
			}
			if (clampRarity != Vector2.zero)
			{
				num = Mathf.Clamp(num, Mathf.RoundToInt(clampRarity.x), Mathf.RoundToInt(clampRarity.y));
			}
			list.Add(new StringWithRarity(item, num));
		}
		return list;
	}

	public static string ConvertEnemyListToString(List<SpawnableEnemyWithRarity> spawnableEnemiesList)
	{
		string text = string.Empty;
		foreach (SpawnableEnemyWithRarity spawnableEnemies in spawnableEnemiesList)
		{
			if (spawnableEnemies.enemyType.enemyName != "Lasso" && spawnableEnemies.rarity > 0)
			{
				text = text + spawnableEnemies.enemyType.enemyName + ":" + spawnableEnemies.rarity + ",";
			}
		}
		if (text.Contains(",") && text.LastIndexOf(",") == text.Length - 1)
		{
			text = text.Remove(text.LastIndexOf(","), 1);
		}
		if (text == string.Empty)
		{
			text = "Default Values Were Empty";
		}
		return text;
	}

	public static List<SpawnableEnemyWithRarity> ConvertStringToEnemyList(string newInputString, Vector2 clampRarity)
	{
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Expected O, but got Unknown
		if (string.IsNullOrEmpty(newInputString) || newInputString == "Default Values Were Empty")
		{
			return new List<SpawnableEnemyWithRarity>();
		}
		List<StringWithRarity> list = ConvertStringToList(newInputString, clampRarity);
		List<SpawnableEnemyWithRarity> list2 = new List<SpawnableEnemyWithRarity>();
		List<EnemyType> list3 = GrabFullEnemyList();
		foreach (EnemyType item in list3)
		{
			foreach (StringWithRarity item2 in new List<StringWithRarity>(list))
			{
				if (item.enemyName.ToLower().Contains(item2.Name.ToLower()))
				{
					SpawnableEnemyWithRarity val = new SpawnableEnemyWithRarity();
					val.enemyType = item;
					val.rarity = item2.Rarity;
					list2.Add(val);
					list.Remove(item2);
				}
			}
		}
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.AppendLine("Return List:");
		foreach (SpawnableEnemyWithRarity item3 in list2)
		{
			stringBuilder.AppendLine($"Item Name: {item3.enemyType.enemyName}, Rarity: {item3.rarity}");
		}
		return list2;
	}

	public static List<SpawnableEnemyWithRarity> RemoveLowerRarityDuplicateEnemies(List<SpawnableEnemyWithRarity> enemies)
	{
		return (from e in enemies
			group e by e.enemyType.enemyName into g
			select g.OrderByDescending((SpawnableEnemyWithRarity e) => e.rarity).First()).ToList();
	}

	public static List<SpawnableEnemyWithRarity> ReplaceEnemies(List<SpawnableEnemyWithRarity> EnemyList, string ReplaceConfig)
	{
		//IL_017b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0182: Expected O, but got Unknown
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c7: Expected O, but got Unknown
		if (string.IsNullOrEmpty(ReplaceConfig) || ReplaceConfig == "Default Values Were Empty")
		{
			return EnemyList;
		}
		List<SpawnableEnemyWithRarity> list = new List<SpawnableEnemyWithRarity>();
		List<string> list2 = new List<string>();
		string[] array = ReplaceConfig.Split(new char[1] { ',' });
		string[] array2 = array;
		foreach (string text in array2)
		{
			string[] array3 = text.Split(new char[1] { ':' });
			if (array3.Length != 2)
			{
				continue;
			}
			string text2 = array3[0].Trim();
			string text3 = array3[1].Trim();
			foreach (SpawnableEnemyWithRarity Enemy in EnemyList)
			{
				if (Enemy.enemyType.enemyName.Equals(text2))
				{
					SpawnableEnemyWithRarity val = new SpawnableEnemyWithRarity();
					val.enemyType = GetEnemyTypeByName(text3);
					val.rarity = Enemy.rarity;
					list.Add(val);
					list2.Add(text2);
					CentralConfig.instance.mls.LogInfo((object)("Replaced enemy: " + text2 + " -> " + text3));
				}
			}
		}
		foreach (SpawnableEnemyWithRarity Enemy2 in EnemyList)
		{
			if (!list2.Contains(Enemy2.enemyType.enemyName))
			{
				SpawnableEnemyWithRarity val2 = new SpawnableEnemyWithRarity();
				val2.enemyType = Enemy2.enemyType;
				val2.rarity = Enemy2.rarity;
				list.Add(val2);
				CentralConfig.instance.mls.LogInfo((object)("Added non replaced enemy: " + val2.enemyType.enemyName));
			}
		}
		return list;
	}

	public static EnemyType GetEnemyTypeByName(string enemyName)
	{
		List<EnemyType> list = GrabFullEnemyList();
		foreach (EnemyType item in list)
		{
			if (item.enemyName == enemyName)
			{
				return item;
			}
		}
		return null;
	}

	public static string ConvertItemListToString(List<SpawnableItemWithRarity> spawnableItemsList)
	{
		string text = string.Empty;
		foreach (SpawnableItemWithRarity spawnableItems in spawnableItemsList)
		{
			if (spawnableItems.rarity > 0)
			{
				text = text + spawnableItems.spawnableItem.itemName + ":" + spawnableItems.rarity + ",";
			}
		}
		if (text.Contains(",") && text.LastIndexOf(",") == text.Length - 1)
		{
			text = text.Remove(text.LastIndexOf(","), 1);
		}
		if (text == string.Empty)
		{
			text = "Default Values Were Empty";
		}
		return text;
	}

	public static List<SpawnableItemWithRarity> ConvertStringToItemList(string newInputString, Vector2 clampRarity)
	{
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Expected O, but got Unknown
		if (string.IsNullOrEmpty(newInputString) || newInputString == "Default Values Were Empty")
		{
			return new List<SpawnableItemWithRarity>();
		}
		List<StringWithRarity> list = ConvertStringToList(newInputString, clampRarity);
		List<SpawnableItemWithRarity> list2 = new List<SpawnableItemWithRarity>();
		List<Item> list3 = GrabFullItemList();
		foreach (Item item in list3)
		{
			foreach (StringWithRarity item2 in new List<StringWithRarity>(list))
			{
				if (CauterizeString(item.itemName).Contains(CauterizeString(item2.Name)) || CauterizeString(item2.Name).Contains(CauterizeString(item.itemName)))
				{
					SpawnableItemWithRarity val = new SpawnableItemWithRarity();
					val.spawnableItem = item;
					val.rarity = item2.Rarity;
					list2.Add(val);
					list.Remove(item2);
				}
			}
		}
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.AppendLine("Return List:");
		foreach (SpawnableItemWithRarity item3 in list2)
		{
			stringBuilder.AppendLine($"Item Name: {item3.spawnableItem.itemName}, Rarity: {item3.rarity}");
		}
		return list2;
	}

	public static List<SpawnableItemWithRarity> RemoveLowerRarityDuplicateItems(List<SpawnableItemWithRarity> items)
	{
		return (from e in items
			group e by e.spawnableItem.itemName into g
			select g.OrderByDescending((SpawnableItemWithRarity e) => e.rarity).First()).ToList();
	}

	public static string ConvertWeatherArrayToString(RandomWeatherWithVariables[] randomWeatherArray)
	{
		string text = "";
		bool flag = false;
		foreach (RandomWeatherWithVariables val in randomWeatherArray)
		{
			if (((object)(LevelWeatherType)(ref val.weatherType)).ToString() == "None")
			{
				flag = true;
			}
			text = text + ((object)(LevelWeatherType)(ref val.weatherType)).ToString() + ",";
		}
		if (!flag)
		{
			text = "None," + text;
		}
		if (text.Contains(",") && text.LastIndexOf(",") == text.Length - 1)
		{
			text = text.Remove(text.LastIndexOf(","), 1);
		}
		return text;
	}

	public static RandomWeatherWithVariables[] ConvertStringToWeatherArray(string newInputString)
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Expected O, but got Unknown
		//IL_006e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_007c: Expected O, but got Unknown
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		if (string.IsNullOrEmpty(newInputString) || newInputString == "Default Values Were Empty")
		{
			return (RandomWeatherWithVariables[])(object)new RandomWeatherWithVariables[1]
			{
				new RandomWeatherWithVariables
				{
					weatherType = (LevelWeatherType)(-1)
				}
			};
		}
		string[] array = newInputString.Split(new char[1] { ',' });
		RandomWeatherWithVariables[] array2 = (RandomWeatherWithVariables[])(object)new RandomWeatherWithVariables[array.Length];
		for (int i = 0; i < array.Length; i++)
		{
			if (Enum.TryParse<LevelWeatherType>(array[i], out LevelWeatherType result))
			{
				array2[i] = new RandomWeatherWithVariables
				{
					weatherType = result
				};
			}
		}
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.AppendLine("Return Array:");
		RandomWeatherWithVariables[] array3 = array2;
		foreach (RandomWeatherWithVariables val in array3)
		{
			stringBuilder.AppendLine($"{val.weatherType}");
		}
		return array2;
	}

	public static string ConvertTagsToString(List<ContentTag> contentTags)
	{
		string text = string.Empty;
		foreach (ContentTag contentTag in contentTags)
		{
			text = text + contentTag.contentTagName + ",";
		}
		if (text.EndsWith(","))
		{
			text = text.Remove(text.LastIndexOf(","), 1);
		}
		if (string.IsNullOrEmpty(text))
		{
			text = "Default Values Were Empty";
		}
		return text;
	}

	public static List<ContentTag> ConvertStringToTagList(string newInputString)
	{
		if (string.IsNullOrEmpty(newInputString) || newInputString == "Default Values Were Empty")
		{
			return new List<ContentTag>();
		}
		List<string> list = newInputString.Split(new char[1] { ',' }).ToList();
		List<ContentTag> list2 = new List<ContentTag>();
		List<ContentTag> list3 = GrabFullTagList();
		foreach (ContentTag item in list3)
		{
			foreach (string item2 in new List<string>(list))
			{
				if (CauterizeString(item.contentTagName).Contains(CauterizeString(item2)) || CauterizeString(item2).Contains(CauterizeString(item.contentTagName)))
				{
					list2.Add(item);
					list.Remove(item2);
				}
			}
		}
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.AppendLine("Return List:");
		foreach (ContentTag item3 in list2)
		{
			stringBuilder.AppendLine(item3.contentTagName ?? "");
		}
		return list2;
	}

	public static string ConvertStringWithRarityToString(List<StringWithRarity> names)
	{
		string text = string.Empty;
		foreach (StringWithRarity name in names)
		{
			if (name.Rarity > 0)
			{
				text = text + name.Name + ":" + name.Rarity + ",";
			}
		}
		if (text.Contains(",") && text.LastIndexOf(",") == text.Length - 1)
		{
			text = text.Remove(text.LastIndexOf(","), 1);
		}
		if (text == string.Empty)
		{
			text = "Default Values Were Empty";
		}
		return text;
	}

	public static List<StringWithRarity> ConvertModStringToStringWithRarityList(string newInputString, Vector2 clampRarity)
	{
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Expected O, but got Unknown
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		if (string.IsNullOrEmpty(newInputString) || newInputString == "Default Values Were Empty" || newInputString == "Default Values Were Empty:0" || newInputString == ":0")
		{
			return new List<StringWithRarity>();
		}
		List<StringWithRarity> list = new List<StringWithRarity>();
		List<string> list2 = SplitStringsByDaComma(newInputString);
		foreach (string item2 in list2)
		{
			(string, string) tuple = SplitStringsByDaColon(item2);
			string item = tuple.Item1;
			int num = 0;
			if (int.TryParse(tuple.Item2, out var result))
			{
				num = result;
			}
			if (clampRarity != Vector2.zero)
			{
				Mathf.Clamp(num, Mathf.RoundToInt(clampRarity.x), Mathf.RoundToInt(clampRarity.y));
			}
			list.Add(new StringWithRarity(item, num));
		}
		return list;
	}

	public static List<StringWithRarity> ConvertTagStringToStringWithRarityList(string newInputString, Vector2 clampRarity)
	{
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Expected O, but got Unknown
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		if (string.IsNullOrEmpty(newInputString) || newInputString == "Default Values Were Empty" || newInputString == "Default Values Were Empty:0" || newInputString == ":0")
		{
			return new List<StringWithRarity>();
		}
		List<StringWithRarity> list = new List<StringWithRarity>();
		List<string> list2 = SplitStringsByDaComma(newInputString);
		foreach (string item2 in list2)
		{
			(string, string) tuple = SplitStringsByDaColon(item2);
			string item = tuple.Item1;
			int num = 0;
			if (int.TryParse(tuple.Item2, out var result))
			{
				num = result;
			}
			if (clampRarity != Vector2.zero)
			{
				Mathf.Clamp(num, Mathf.RoundToInt(clampRarity.x), Mathf.RoundToInt(clampRarity.y));
			}
			list.Add(new StringWithRarity(item, num));
		}
		return list;
	}

	public static List<StringWithRarity> ConvertPlanetNameStringToStringWithRarityList(string newInputString, Vector2 clampRarity)
	{
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_0107: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Expected O, but got Unknown
		if (string.IsNullOrEmpty(newInputString) || newInputString == "Default Values Were Empty" || newInputString == "Default Values Were Empty:0" || newInputString == ":0")
		{
			return new List<StringWithRarity>();
		}
		List<StringWithRarity> list = new List<StringWithRarity>();
		List<string> list2 = SplitStringsByDaComma(newInputString);
		HashSet<string> hashSet = new HashSet<string>(PatchedContent.ExtendedLevels.Select((ExtendedLevel level) => level.NumberlessPlanetName));
		foreach (string item3 in list2)
		{
			(string, string) tuple = SplitStringsByDaColon(item3);
			string item = tuple.Item1;
			string item2 = tuple.Item2;
			int num = 0;
			if (int.TryParse(item2, out var result))
			{
				num = result;
			}
			if (clampRarity != Vector2.zero)
			{
				Mathf.Clamp(num, Mathf.RoundToInt(clampRarity.x), Mathf.RoundToInt(clampRarity.y));
			}
			if (hashSet.Contains(item))
			{
				list.Add(new StringWithRarity(item, num));
			}
		}
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.AppendLine("Return List:");
		foreach (StringWithRarity item4 in list)
		{
			stringBuilder.AppendLine($"{item4.Name}: {item4.Rarity}");
		}
		return list;
	}

	public static string ConvertVector2WithRaritiesToString(List<Vector2WithRarity> values)
	{
		string text = string.Empty;
		foreach (Vector2WithRarity value in values)
		{
			text = text + value.Min + "-" + value.Max + ":" + value.Rarity + ",";
		}
		if (text.Contains(",") && text.LastIndexOf(",") == text.Length - 1)
		{
			text = text.Remove(text.LastIndexOf(","), 1);
		}
		if (text == string.Empty)
		{
			text = "Default Values Were Empty";
		}
		return text;
	}

	public static List<Vector2WithRarity> ConvertStringToVector2WithRarityList(string newInputString, Vector2 clampRarity)
	{
		//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0117: Unknown result type (might be due to invalid IL or missing references)
		//IL_011e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0128: Expected O, but got Unknown
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0101: Unknown result type (might be due to invalid IL or missing references)
		if (!string.IsNullOrEmpty(newInputString))
		{
			switch (newInputString)
			{
			default:
			{
				if (newInputString == "0-0:0")
				{
					break;
				}
				List<Vector2WithRarity> list = new List<Vector2WithRarity>();
				List<string> list2 = SplitStringsByDaComma(newInputString);
				foreach (string item in list2)
				{
					(string, string) tuple = SplitStringsByDaColon(item);
					(string, string) tuple2 = SplitStringByDaDash(tuple.Item1);
					float num = 0f;
					float num2 = 0f;
					int num3 = 0;
					if (float.TryParse(tuple2.Item1, out var result))
					{
						num = result;
					}
					if (float.TryParse(tuple2.Item2, out var result2))
					{
						num2 = result2;
					}
					if (int.TryParse(tuple.Item2, out var result3))
					{
						num3 = result3;
					}
					if (clampRarity != Vector2.zero)
					{
						Mathf.Clamp(num3, Mathf.RoundToInt(clampRarity.x), Mathf.RoundToInt(clampRarity.y));
					}
					list.Add(new Vector2WithRarity(new Vector2(num, num2), num3));
				}
				return list;
			}
			case "Default Values Were Empty":
			case "Default Values Were Empty:0":
			case ":0":
				break;
			}
		}
		return new List<Vector2WithRarity>();
	}

	public static List<ExtendedDungeonFlowWithRarity> ConvertStringToDungeonFlowWithRarityList(string newInputString, Vector2 clampRarity)
	{
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e3: Expected O, but got Unknown
		if (string.IsNullOrEmpty(newInputString) || newInputString == "Default Values Were Empty" || newInputString == "Default Values Were Empty:0" || newInputString == ":0")
		{
			return new List<ExtendedDungeonFlowWithRarity>();
		}
		List<StringWithRarity> list = ConvertStringToList(newInputString, clampRarity);
		List<ExtendedDungeonFlowWithRarity> list2 = new List<ExtendedDungeonFlowWithRarity>();
		List<ExtendedDungeonFlow> extendedDungeonFlows = PatchedContent.ExtendedDungeonFlows;
		foreach (ExtendedDungeonFlow item in extendedDungeonFlows)
		{
			foreach (StringWithRarity item2 in new List<StringWithRarity>(list))
			{
				if (CauterizeString(item.DungeonName).Contains(CauterizeString(item2.Name)) || CauterizeString(item2.Name).Contains(CauterizeString(item.DungeonName)))
				{
					ExtendedDungeonFlowWithRarity val = new ExtendedDungeonFlowWithRarity(item, item2.Rarity);
					val.extendedDungeonFlow = item;
					val.rarity = item2.Rarity;
					list2.Add(val);
					list.Remove(item2);
				}
			}
		}
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.AppendLine("Return List:");
		foreach (ExtendedDungeonFlowWithRarity item3 in list2)
		{
			stringBuilder.AppendLine($"Item Name: {item3.extendedDungeonFlow.DungeonName}, Rarity: {item3.rarity}");
		}
		return list2;
	}

	public static AnimationCurve MultiplyYValues(AnimationCurve curve, float multiplier, string LevelName, string TypeOf)
	{
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Expected O, but got Unknown
		Keyframe[] array = (Keyframe[])(object)new Keyframe[curve.length];
		for (int i = 0; i < curve.length; i++)
		{
			Keyframe val = curve[i];
			((Keyframe)(ref val)).value = ((Keyframe)(ref val)).value * multiplier;
			array[i] = val;
		}
		return new AnimationCurve(array);
	}

	public void CleanConfig(ConfigFile cfg)
	{
		((MonoBehaviour)this).StartCoroutine(CQueen(cfg));
	}

	private IEnumerator CQueen(ConfigFile cfg)
	{
		while (!ApplyMoonConfig.Ready || !ApplyDungeonConfig.Ready || !ApplyTagConfig.Ready || !ApplyWeatherConfig.Ready)
		{
			yield return null;
		}
		ConfigCleaner(cfg);
	}

	private void ConfigCleaner(ConfigFile cfg)
	{
		PropertyInfo property = ((object)cfg).GetType().GetProperty("OrphanedEntries", BindingFlags.Instance | BindingFlags.NonPublic);
		Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)property.GetValue(cfg, null);
		dictionary.Clear();
		cfg.Save();
		CentralConfig.instance.mls.LogInfo((object)"Config Cleaned");
	}
}
[BepInPlugin("impulse.CentralConfig", "CentralConfig", "0.8.0")]
public class CentralConfig : BaseUnityPlugin
{
	private const string modGUID = "impulse.CentralConfig";

	private const string modName = "CentralConfig";

	private const string modVersion = "0.8.0";

	public static Harmony harmony = new Harmony("impulse.CentralConfig");

	public ManualLogSource mls;

	public static CentralConfig instance;

	public static int LastUsedSeed;

	public static float shid = 0f;

	public static WaitForMoonsToRegister.CreateMoonConfig ConfigFile;

	public static WaitForDungeonsToRegister.CreateDungeonConfig ConfigFile2;

	public static MiscConfig.CreateMiscConfig ConfigFile3;

	public static WaitForTagsToRegister.CreateTagConfig ConfigFile4;

	public static WaitForWeathersToRegister.CreateWeatherConfig ConfigFile5;

	public static GeneralConfig SyncConfig;

	private void Awake()
	{
		instance = this;
		SyncConfig = new GeneralConfig(((BaseUnityPlugin)this).Config);
		mls = Logger.CreateLogSource("impulse.CentralConfig");
		ConfigFile = new WaitForMoonsToRegister.CreateMoonConfig(((BaseUnityPlugin)this).Config);
		ConfigFile2 = new WaitForDungeonsToRegister.CreateDungeonConfig(((BaseUnityPlugin)this).Config);
		ConfigFile3 = new MiscConfig.CreateMiscConfig(((BaseUnityPlugin)this).Config);
		ConfigFile4 = new WaitForTagsToRegister.CreateTagConfig(((BaseUnityPlugin)this).Config);
		ConfigFile5 = new WaitForWeathersToRegister.CreateWeatherConfig(((BaseUnityPlugin)this).Config);
		harmony.PatchAll(typeof(RenameCelest));
		harmony.PatchAll(typeof(WaitForMoonsToRegister));
		harmony.PatchAll(typeof(FrApplyMoon));
		harmony.PatchAll(typeof(ApplyScrapValueMultiplier));
		harmony.PatchAll(typeof(TimeFix));
		harmony.PatchAll(typeof(DayTimePassFix));
		harmony.PatchAll(typeof(WaitForDungeonsToRegister));
		harmony.PatchAll(typeof(FrApplyDungeon));
		harmony.PatchAll(typeof(NewDungeonGenerator));
		harmony.PatchAll(typeof(InnerGenerateWithRetries));
		harmony.PatchAll(typeof(MiscConfig));
		harmony.PatchAll(typeof(ChangeFineAmount));
		harmony.PatchAll(typeof(WaitForWeathersToRegister));
		harmony.PatchAll(typeof(FrApplyWeather));
		harmony.PatchAll(typeof(ResetWeatherLists));
		harmony.PatchAll(typeof(EnactWeatherInjections));
		harmony.PatchAll(typeof(ResetMoonsScrapAfterWeather));
		harmony.PatchAll(typeof(ApplyWeatherScrapMultipliers));
		harmony.PatchAll(typeof(WaitForTagsToRegister));
		harmony.PatchAll(typeof(FrApplyTag));
		harmony.PatchAll(typeof(EnactTagInjections));
		harmony.PatchAll(typeof(MoarEnemies1));
		harmony.PatchAll(typeof(MoarEnemies2));
		harmony.PatchAll(typeof(MoarEnemies3));
	}
}
[DataContract]
public class GeneralConfig : SyncedConfig2<GeneralConfig>
{
	[DataMember]
	public SyncedEntry<string> BlacklistMoons { get; private set; }

	[DataMember]
	public SyncedEntry<bool> IsWhiteList { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoGenOverrides { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoScrapOverrides { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoEnemyOverrides { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoTrapOverrides { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoMoonWeatherOverrides { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoDangerBools { get; private set; }

	[DataMember]
	public SyncedEntry<string> BlackListDungeons { get; private set; }

	[DataMember]
	public SyncedEntry<bool> IsDunWhiteList { get; private set; }

	[DataMember]
	public SyncedEntry<bool> UseNewGen { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoDunSizeOverrides { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoDungeonSelectionOverrides { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoFineOverrides { get; private set; }

	[DataMember]
	public SyncedEntry<string> BlacklistTags { get; private set; }

	[DataMember]
	public SyncedEntry<bool> IsTagWhiteList { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoEnemyTagInjections { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoScrapTagInjections { get; private set; }

	[DataMember]
	public SyncedEntry<bool> FreeEnemies { get; private set; }

	[DataMember]
	public SyncedEntry<bool> ScaleEnemySpawnRate { get; private set; }

	[DataMember]
	public SyncedEntry<bool> RenameCelest { get; private set; }

	[DataMember]
	public SyncedEntry<bool> RemoveDuplicateEnemies { get; private set; }

	[DataMember]
	public SyncedEntry<string> BlacklistWeathers { get; private set; }

	[DataMember]
	public SyncedEntry<bool> IsWeatherWhiteList { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoEnemyWeatherInjections { get; private set; }

	[DataMember]
	public SyncedEntry<bool> DoScrapWeatherInjections { get; private set; }

	public GeneralConfig(ConfigFile cfg)
		: base("CentralConfig")
	{
		ConfigManager.Register<GeneralConfig>((SyncedConfig2<GeneralConfig>)this);
		BlacklistMoons = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "_MoonLists_", "Blacklisted Moons", "Liquidation,Gordion", "Excludes the listed moons from the config. If they are already created, they will be removed on config regeneration.");
		IsWhiteList = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_MoonLists_", "Is Moon Blacklist a Whitelist?", false, "If set to true, only the moons listed above will be generated.");
		DoGenOverrides = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Moons_", "Enable General Overrides?", false, "If set to true, allows altering of some basic properties including the route price, risk level, and description for each moon.");
		DoScrapOverrides = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Moons_", "Enable Scrap Overrides?", false, "If set to true, allows altering of the min/max scrap count, the list of scrap objects on each moon, and a multiplier for the individual scrap item's values.");
		DoEnemyOverrides = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Moons_", "Enable Enemy Overrides?", false, "If set to true, allows altering of the max power counts and lists for enemies on each moon (Interior, Nighttime, and Daytime).");
		FreeEnemies = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Moons_", "Free Them?", false, "If set to true, extends the 20 inside/day/night enemy caps to the maximum (127) and sets the interior enemy spawn waves to be hourly instead of every other hour.");
		ScaleEnemySpawnRate = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Moons_", "Scale Enemy Spawn Rate?", false, "When enabled, this setting adjusts the enemy spawn rate to match the new enemy powers. Note that this requires the ‘Enemy Overrides’ setting to be true.\nFor example, Experimentation has a default max power of 4 for interior enemies. If you set this to 6, interior enemies will spawn ~1.5x as fast.\nThis applies to interior, day, and night enemy spawns.");
		DoTrapOverrides = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Moons_", "Enable Trap Overrides?", false, "If set to true, allows altering of the min/max count for each trap on each moon.");
		DoMoonWeatherOverrides = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Moons_", "Enable Weather Overrides?", false, "If set to true, allows altering of the possible weathers to each moon.\nBeware that adding new weathers to moons that didn't have them before will likely cause funky buggies.\nDO NOT USE WITH WEATHER REGISTRY!!");
		DoDangerBools = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Moons_", "Enable Misc Overrides?", false, "If set to true, allows altering of miscellaneous traits of moons such as hidden/unhidden status, locked/unlocked status, if time exists, the time speed multiplier, and if time should wait until the ship lands to begin moving (Keep this false for Selene's Choice to work).");
		RenameCelest = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Moons_", "Rename Celest?", false, "If set to true, Celest will be renamed to Celeste. This fixes any config entry mismatches between her and Celestria.");
		BlackListDungeons = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "_DungeonLists_", "Blacklisted Dungeons", "", "Excludes the listed dungeons from the config. If they are already created, they will be removed on config regeneration.");
		IsDunWhiteList = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_DungeonLists_", "Is Dungeon Blacklist a Whitelist?", false, "If set to true, only the dungeons listed above will be generated.");
		UseNewGen = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Dungeons_", "Enable Overhauled Dungeon Generation?", true, "If set to true, this reconfigures the dungeon loading process to avoid loading failure.");
		DoDunSizeOverrides = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Dungeons_", "Enable Dungeon Size Overrides?", false, "If set to true, allows altering of the min/max dungeon size multipliers, and the size scaler.\nThis also allows you to set the dungeon size multiplier applied by the individual moons.");
		DoDungeonSelectionOverrides = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Dungeons_", "Enable Dungeon Selection Overrides?", false, "If set to true, allows altering of the dungeon selection settings (By moon name, route price range, and mod name.");
		DoFineOverrides = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "~Misc~", "Enable Fine Overrides?", false, "If set to true, allows you to set the fine for dead/missing players and the reduction on the fine for having brought the body back to the ship.");
		BlacklistTags = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "_TagLists_", "Blacklisted Tags", "", "Excludes the listed tags from the config. If they are already created, they will be removed on config regeneration.");
		IsTagWhiteList = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_TagLists_", "Is Tag Blacklist a Whitelist?", false, "If set to true, only the tags listed above will be generated.");
		DoEnemyTagInjections = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Tags_", "Enable Enemy Injection by Tag?", false, "If set to true, allows adding/replacing enemies on levels based on matching tags (inside, day, and night).");
		DoScrapTagInjections = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Tags_", "Enable Scrap Injection by Tag?", false, "If set to true, allows adding scrap to levels based on matching tags.");
		RemoveDuplicateEnemies = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, "_Enemies_", "Remove Duplicate Enemies?", false, "If set to true, after enemy spawn lists are updated by various means, any time there are 2 or more of the same enemy, only the entry for the enemy with the highest rarity will be kept.\nThis means that if 4 sources add the bracken at various rarities, only the highest value is kept. (In \"Flowerman:5,Flowerman:75,Flowerman:66,Flowerman:73\" The bracken will only be added once with a rarity of 75.)");
		BlacklistWeathers = SyncedBindingExtensions.BindSyncedEntry<string>(cfg, "_WeatherLists_", "Blacklisted Weathers", "", "Excludes the listed weathers from the config. If they are already created, they will be