Decompiled source of GetFogged v1.0.0

GetFogged.dll

Decompiled 4 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
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.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Logging;
using GSSerializer;
using GSSerializer.Internal;
using GSSerializer.Internal.DirectConverters;
using HarmonyLib;
using PCGSharp;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("GetFogged")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Make the fog harder.")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+9f69af4d8a0be60322ee9e755828d94cab37f75f")]
[assembly: AssemblyProduct("GetFogged")]
[assembly: AssemblyTitle("GetFogged")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace GetFogged
{
	public static class GF
	{
		private class exceptionOutput
		{
			public string exception;

			public string version;

			public exceptionOutput(string e)
			{
				version = Version;
				exception = e;
			}
		}

		private class ErrorObject
		{
			public readonly List<string> stack = new List<string>();

			public string message;

			public string version = Version;
		}

		public enum Alignment
		{
			Left,
			Right,
			Center
		}

		public class Random : Pcg
		{
			private int count;

			private int seed = 1;

			public int Seed
			{
				get
				{
					return seed;
				}
				set
				{
					seed = value;
					reseed(value);
				}
			}

			public string Id => $"[{seed}=>{count}]";

			public Random(int seed)
				: base(seed)
			{
				Seed = seed;
			}

			public bool NextPick(double chance)
			{
				return NextDouble() < chance;
			}

			public override uint NextUInt()
			{
				count++;
				return base.NextUInt();
			}

			public float Normal(float averageValue, float standardDeviation)
			{
				return averageValue + standardDeviation * (float)(Math.Sqrt(-2.0 * Math.Log(1.0 - NextDouble())) * Math.Sin(Math.PI * 2.0 * NextDouble()));
			}

			public new float NextFloat(float min, float max)
			{
				if (Math.Abs(min - max) < float.MinValue)
				{
					return min;
				}
				if (min > max)
				{
					Warn($"{GetCaller()}-NextFloat: Min > Max. {min} {max}", 59);
					return max;
				}
				return base.NextFloat(min, max);
			}

			public new int Next(int minInclusive, int maxExclusive)
			{
				if (minInclusive == maxExclusive)
				{
					return minInclusive;
				}
				if (minInclusive > maxExclusive)
				{
					Error($"Next: Min > Max. {minInclusive} {maxExclusive}", 74);
					return maxExclusive - 1;
				}
				if (maxExclusive <= 0)
				{
					Error($"Max {maxExclusive} <= 0 {GetCaller()}", 80);
					return maxExclusive;
				}
				return base.Next(minInclusive, maxExclusive);
			}

			public int NextInclusive(int minInclusive, int maxInclusive)
			{
				if (minInclusive == maxInclusive)
				{
					return minInclusive;
				}
				if (minInclusive > maxInclusive)
				{
					Error($"Next: Min > Max. {minInclusive} {maxInclusive}", 93);
					return maxInclusive;
				}
				return base.Next(minInclusive, maxInclusive + 1);
			}

			public float ClampedNormal(float min, float max, int bias)
			{
				float num = max - min;
				float num2 = (float)bias / 100f * num + min;
				float val = (max - num2) / 3f;
				float val2 = (num2 - min) / 3f;
				float standardDeviation = Math.Max(val2, val);
				float num3 = Normal(num2, standardDeviation);
				return Mathf.Clamp(num3, min, max);
			}

			public VectorLF3 PointOnSphere(double radius)
			{
				//IL_008c: 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_0095: Unknown result type (might be due to invalid IL or missing references)
				double num = NextDouble() * 2.0 * radius - radius;
				double num2 = NextDouble() * Math.PI * 2.0;
				double num3 = Math.Sqrt(Math.Pow(radius, 2.0) - Math.Pow(num, 2.0)) * Math.Cos(num2);
				double num4 = Math.Sqrt(Math.Pow(radius, 2.0) - Math.Pow(num, 2.0)) * Math.Sin(num2);
				return new VectorLF3(num3, num4, num);
			}

			public T Item<T>(List<T> items)
			{
				if (items.Count == 0)
				{
					Error("Item Length 0 " + GetCaller(), 124);
				}
				return items[Next(items.Count)];
			}

			public (int, T) ItemWithIndex<T>(List<T> items)
			{
				if (items.Count == 0)
				{
					Error("Item Length 0 " + GetCaller(), 133);
				}
				int num = Next(items.Count);
				return (num, items[num]);
			}

			public T ItemAndRemove<T>(List<T> items)
			{
				if (items.Count == 0)
				{
					Error("Item Length 0 " + GetCaller(), 143);
				}
				int index = Next(items.Count);
				T result = items[index];
				items.RemoveAt(index);
				return result;
			}

			public T Item<T>(T[] items)
			{
				if (items.Length == 0)
				{
					Error("Item Length 0 " + GetCaller(), 154);
				}
				return items[Next(items.Length)];
			}

			public (int, T) ItemWithIndex<T>(T[] items)
			{
				if (items.Length == 0)
				{
					Error("Item Length 0 " + GetCaller(), 163);
				}
				int num = Next(items.Length);
				return (num, items[num]);
			}

			public KeyValuePair<W, X> Item<W, X>(Dictionary<W, X> items)
			{
				if (items.Count == 0)
				{
					Error("Item Length 0 " + GetCaller(), 173);
				}
				W[] array = new W[0];
				items.Keys.CopyTo(array, 0);
				W key = array[Next(array.Length)];
				return new KeyValuePair<W, X>(key, items[key]);
			}
		}

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

			public static Response <>9__31_0;

			internal void <AbortGameStart>b__31_0()
			{
				UIRoot.instance.OpenMainMenuUI();
				UIRoot.ClearFatalError();
			}
		}

		public static int PreferencesVersion = 2104;

		public static string Version;

		public static string AssemblyPath;

		public static bool DebugOn = true;

		public static void DumpObjectToJson(string path, object obj)
		{
			fsSerializer fsSerializer = new fsSerializer();
			fsSerializer.TrySerialize(obj, out var data).AssertSuccessWithoutWarnings();
			string contents = fsJsonPrinter.PrettyJson(data);
			File.WriteAllText(path, contents);
		}

		public static void DumpException(Exception e)
		{
			Error(e.Message + " " + GetCaller(1) + " " + GetCaller(2) + " " + GetCaller(3) + " " + GetCaller(4) + " " + GetCaller(5), 23);
			string text = Path.Combine(AssemblyPath, "ErrorLog");
			if (!Directory.Exists(text))
			{
				Directory.CreateDirectory(text);
			}
			text = Path.Combine(text, DateTime.Now.ToString("yyMMddHHmmss"));
			text += ".exceptionlog.json";
			if (!File.Exists(text))
			{
				Log(text, 31);
				Log("Logging Error to " + text, 32);
				exceptionOutput instance = new exceptionOutput(e.ToString());
				fsSerializer fsSerializer = new fsSerializer();
				fsSerializer.TrySerialize(instance, out var data).AssertSuccessWithoutWarnings();
				string contents = fsJsonPrinter.PrettyJson(data);
				File.WriteAllText(text, contents);
				Log("End", 38);
			}
		}

		public static void DumpError(string message)
		{
			string text = Path.Combine(AssemblyPath, "ErrorLog");
			if (!Directory.Exists(text))
			{
				Directory.CreateDirectory(text);
			}
			text = Path.Combine(text, DateTime.Now.ToString("yyMMddHHmmss"));
			text += ".errorlog.json";
			Log(text, 47);
			Log("Logging Error to " + text, 48);
			ErrorObject errorObject = new ErrorObject();
			errorObject.message = message;
			for (int i = 0; i < 100; i++)
			{
				string caller = GetCaller(i);
				if (caller != "")
				{
					errorObject.stack.Add(caller);
				}
			}
			fsSerializer fsSerializer = new fsSerializer();
			fsSerializer.TrySerialize(errorObject, out var data).AssertSuccessWithoutWarnings();
			string contents = fsJsonPrinter.PrettyJson(data);
			File.AppendAllText(text, contents);
			Log("End", 61);
		}

		private static void CleanErrorLogs()
		{
			string path = Path.Combine(AssemblyPath, "ErrorLog");
			if (!Directory.Exists(path))
			{
				Directory.CreateDirectory(path);
			}
			string[] files = Directory.GetFiles(path, "*.json");
			string[] array = files;
			foreach (string fileName in array)
			{
				FileInfo fileInfo = new FileInfo(fileName);
				if (fileInfo.LastAccessTime < DateTime.Now.AddDays(-7.0))
				{
					fileInfo.Delete();
				}
			}
		}

		private static bool CheckJsonFileExists(string path)
		{
			if (File.Exists(path))
			{
				return true;
			}
			Log("Json file does not exist at " + path, 83);
			return false;
		}

		public static void ConsoleSplash()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			GlobalObject.LoadVersions();
			Version gameVersion = GameConfig.gameVersion;
			string text = ((object)(Version)(ref gameVersion)).ToString();
			Debug.Log((object)"GetFogged.");
		}

		public static void Log(string s, [CallerLineNumber] int lineNumber = 0)
		{
			if (DebugOn)
			{
				Bootstrap.Debug(lineNumber.ToString().PadLeft(4) + ":" + GetCaller() + s);
			}
		}

		public static void LogTop(int width = 80)
		{
			if (BCE.disabled)
			{
				Log("-----", 25);
				return;
			}
			int num = width - 21;
			int num2 = Mathf.FloorToInt((float)(num / 2)) - 2;
			int spaces = num - num2 - 4;
			BCE.Console.Write("\r\n╔═", ConsoleColor.White);
			BCE.Console.Write("═", ConsoleColor.Gray);
			BCE.Console.Write("═", ConsoleColor.DarkGray);
			BCE.Console.Write(SpaceString(num2), ConsoleColor.Green);
			BCE.Console.Write("*", ConsoleColor.Yellow);
			BCE.Console.Write(".·", ConsoleColor.Gray);
			BCE.Console.Write(":", ConsoleColor.DarkGray);
			BCE.Console.Write("·.", ConsoleColor.Gray);
			BCE.Console.Write("✧", ConsoleColor.DarkCyan);
			BCE.Console.Write(" ✦ ", ConsoleColor.Cyan);
			BCE.Console.Write("✧", ConsoleColor.DarkCyan);
			BCE.Console.Write(".·", ConsoleColor.Gray);
			BCE.Console.Write(":", ConsoleColor.DarkGray);
			BCE.Console.Write("·.", ConsoleColor.Gray);
			BCE.Console.Write("*", ConsoleColor.Yellow);
			BCE.Console.Write(SpaceString(spaces), ConsoleColor.Green);
			BCE.Console.Write("═", ConsoleColor.DarkGray);
			BCE.Console.Write("═", ConsoleColor.Gray);
			BCE.Console.Write("═╗\r\n", ConsoleColor.White);
		}

		public static void LogBot(int width = 80)
		{
			if (BCE.disabled)
			{
				Log("-----", 57);
				return;
			}
			int num = width - 21;
			int num2 = Mathf.FloorToInt((float)(num / 2)) - 2;
			int spaces = num - num2 - 4;
			BCE.Console.Write("╚═", ConsoleColor.White);
			BCE.Console.Write("═", ConsoleColor.Gray);
			BCE.Console.Write("═", ConsoleColor.DarkGray);
			BCE.Console.Write(SpaceString(num2), ConsoleColor.Green);
			BCE.Console.Write("*", ConsoleColor.Yellow);
			BCE.Console.Write(".·", ConsoleColor.Gray);
			BCE.Console.Write(":", ConsoleColor.DarkGray);
			BCE.Console.Write("·.", ConsoleColor.Gray);
			BCE.Console.Write("✧", ConsoleColor.DarkCyan);
			BCE.Console.Write(" ✦ ", ConsoleColor.Cyan);
			BCE.Console.Write("✧", ConsoleColor.DarkCyan);
			BCE.Console.Write(".·", ConsoleColor.Gray);
			BCE.Console.Write(":", ConsoleColor.DarkGray);
			BCE.Console.Write("·.", ConsoleColor.Gray);
			BCE.Console.Write("*", ConsoleColor.Yellow);
			BCE.Console.Write(SpaceString(spaces), ConsoleColor.Green);
			BCE.Console.Write("═", ConsoleColor.DarkGray);
			BCE.Console.Write("═", ConsoleColor.Gray);
			BCE.Console.WriteLine("═╝", ConsoleColor.White);
		}

		public static string SpaceString(int spaces)
		{
			return new string(' ', spaces);
		}

		public static void LogMid(string text, int width = 80)
		{
			string[] array = text.Split(new char[1] { '\n' });
			if (array.Length > 1)
			{
				string[] array2 = array;
				foreach (string text2 in array2)
				{
					LogMid(text2, width);
				}
			}
			if (BCE.disabled)
			{
				Log(text, 106);
				return;
			}
			if (text.Length < width - 4)
			{
				LogMidLine(text, width);
				return;
			}
			List<string> list = new List<string>();
			int startIndex = 0;
			while (text.Length > width - 4)
			{
				LogMidLine(text.Substring(startIndex, width - 4), width);
				text = text.Remove(startIndex, width - 4);
			}
		}

		public static void LogMidLine(string text, int width = 80)
		{
			BCE.Console.Write("║ ", ConsoleColor.White);
			BCE.Console.Write(string.Format("{0," + (width - 4) + "}", text), ConsoleColor.Green);
			BCE.Console.Write(" ║\r\n", ConsoleColor.White);
		}

		public static void LogSpace(int lineCount = 1)
		{
			if (DebugOn)
			{
				for (int i = 0; i < lineCount; i++)
				{
					Bootstrap.Debug(" ", (LogLevel)8, isActive: true);
				}
			}
		}

		public static void Error(string message, [CallerLineNumber] int lineNumber = 0)
		{
			Bootstrap.Debug($"{lineNumber,4}:{GetCaller()}{message}", (LogLevel)2, isActive: true);
			DumpError(lineNumber + "|" + message);
		}

		public static void Warn(string message, [CallerLineNumber] int lineNumber = 0)
		{
			Bootstrap.Debug(lineNumber.ToString().PadLeft(4) + ":" + GetCaller() + message, (LogLevel)4, isActive: true);
		}

		public static void LogJson(object o, bool force = false)
		{
			if (DebugOn || force)
			{
				fsSerializer fsSerializer = new fsSerializer();
				fsSerializer.TrySerialize(o, out var data).AssertSuccessWithoutWarnings();
				string text = fsJsonPrinter.PrettyJson(data);
				Bootstrap.Debug(GetCaller() + text);
			}
		}

		public static void WarnJson(object o)
		{
			fsSerializer fsSerializer = new fsSerializer();
			fsSerializer.TrySerialize(o, out var data).AssertSuccessWithoutWarnings();
			string text = fsJsonPrinter.PrettyJson(data);
			Bootstrap.Debug(GetCaller() + text, (LogLevel)4, isActive: true);
		}

		public static string GetCaller(int depth = 0)
		{
			depth += 2;
			StackTrace stackTrace = new StackTrace();
			if (stackTrace.FrameCount <= depth)
			{
				return "";
			}
			string text = stackTrace.GetFrame(depth).GetMethod().Name;
			Type reflectedType = stackTrace.GetFrame(depth).GetMethod().ReflectedType;
			if (reflectedType != null)
			{
				string text2 = reflectedType.ToString().Split(new char[1] { '.' })[^1];
				if (text == ".ctor")
				{
					text = "<Constructor>";
				}
				return text2 + "|" + text + "|";
			}
			return "ERROR GETTING CALLER";
		}

		public static void LogError(object sender, UnhandledExceptionEventArgs e, [CallerLineNumber] int lineNumber = 0)
		{
			Error($"{lineNumber} {GetCaller()}", 187);
			LogException(e.ExceptionObject as Exception);
		}

		private static void LogException(Exception ex)
		{
			Error(ex.StackTrace, 193);
		}

		public static string FormatTableHeader(string[] headers, int[] columnWidths, params Alignment[] alignments)
		{
			if (headers.Length != columnWidths.Length || headers.Length != alignments.Length)
			{
				throw new ArgumentException("Input arrays must have the same length.");
			}
			string format = GenerateFormatString(columnWidths, alignments);
			string text = string.Format(format, headers);
			return text ?? "";
		}

		public static string FormatTable(string[] values, int[] columnWidths, params Alignment[] alignments)
		{
			if (values.Length != columnWidths.Length || values.Length != alignments.Length)
			{
				throw new ArgumentException("Input arrays must have the same length.");
			}
			string format = GenerateFormatString(columnWidths, alignments);
			string text = string.Format(format, values);
			return text ?? "";
		}

		private static string GenerateFormatString(int[] columnWidths, Alignment[] alignments)
		{
			if (columnWidths.Length != alignments.Length)
			{
				throw new ArgumentException("Column widths and alignments must have the same length.");
			}
			string text = "";
			for (int i = 0; i < columnWidths.Length; i++)
			{
				text += $"{{{i},-{columnWidths[i]}}}";
				if (i < columnWidths.Length - 1)
				{
					text += "  ";
				}
			}
			return text;
		}

		public static IEnumerable<CodeInstruction> LogTranspilerError(IEnumerable<CodeInstruction> instructions, string text)
		{
			Error(text, 253);
			Log(GetCaller(), 254);
			LogTop();
			foreach (CodeInstruction instruction in instructions)
			{
				LogMid(((object)instruction).ToString());
			}
			LogBot();
			return instructions;
		}

		public static bool AbortGameStart(string message)
		{
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Expected O, but got Unknown
			Error("Aborting Game Start|" + message, 7);
			UIRoot.instance.CloseLoadingUI();
			UIRoot.instance.CloseGameUI();
			UIRoot.instance.launchSplash.Restart();
			DSPGame.StartDemoGame(0);
			string text = "Cannot Start Game. Possibly reason: " + message;
			object obj = <>c.<>9__31_0;
			if (obj == null)
			{
				Response val = delegate
				{
					UIRoot.instance.OpenMainMenuUI();
					UIRoot.ClearFatalError();
				};
				<>c.<>9__31_0 = val;
				obj = (object)val;
			}
			UIMessageBox.Show("Somewhat Fatal Error", text, "Rats!", 3, (Response)obj);
			UIRoot.ClearFatalError();
			return false;
		}

		public static void EndGame()
		{
			GameMain.End();
		}
	}
	[BepInPlugin("dsp.getfogged", "Get Fogged Plug-In", "1.0.0")]
	public class Bootstrap : BaseUnityPlugin
	{
		public static Bootstrap instance;

		public static ManualLogSource Logger;

		public static Queue buffer = new Queue();

		internal void Awake()
		{
			instance = this;
			InitializeLogger();
			ApplyHarmonyPatches();
		}

		private void InitializeLogger()
		{
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			AppDomain.CurrentDomain.UnhandledException += delegate(object o, UnhandledExceptionEventArgs e)
			{
				GF.LogError(o, e, 34);
			};
			Version version = Assembly.GetExecutingAssembly().GetName().Version;
			Assembly assembly = Assembly.GetAssembly(typeof(Patches));
			GF.Version = $"{version.Major}.{version.Minor}.{version.Build}";
			BCE.Console.Init();
			Logger = new ManualLogSource("GF");
			Logger.Sources.Add((ILogSource)(object)Logger);
			GF.ConsoleSplash();
		}

		private void ApplyHarmonyPatches()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected O, but got Unknown
			try
			{
				Harmony val = new Harmony("dsp.getfogged");
				val.PatchAll(typeof(Patches));
			}
			catch (Exception ex)
			{
				GF.Error(ex.ToString(), 56);
			}
		}

		public static void Debug(object data, LogLevel logLevel, bool isActive)
		{
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			if (isActive && Logger != null)
			{
				while (buffer.Count > 0)
				{
					object obj = buffer.Dequeue();
					(object, LogLevel, bool) tuple = ((object, LogLevel, bool))obj;
					if (tuple.Item3)
					{
						Logger.Log(tuple.Item2, (object)("Q:" + tuple.Item1));
					}
				}
				Logger.Log(logLevel, data);
			}
			else
			{
				buffer.Enqueue((data, logLevel, true));
			}
		}

		public static void Debug(object data)
		{
			Debug(data, (LogLevel)8, isActive: true);
		}
	}
	public static class Patches
	{
		[HarmonyPrefix]
		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		public static bool get_difficulty(ref CombatSettings __instance, ref float __result)
		{
			float num = ((__instance.aggressiveness < -0.1f) ? (-0.2f) : ((__instance.aggressiveness < 0.25f) ? 0f : ((__instance.aggressiveness < 0.75f) ? 0.5f : ((__instance.aggressiveness < 1.5f) ? 0.75f : ((!(__instance.aggressiveness < 2.5f)) ? 1.125f : 0.875f)))));
			float num2 = __instance.initialLevel * 0.8f;
			float num3 = ((__instance.initialGrowth < 0.15f) ? 0f : ((__instance.initialGrowth < 0.3f) ? 0.25f : ((__instance.initialGrowth < 0.65f) ? 0.5f : ((__instance.initialGrowth < 0.8f) ? 0.75f : ((__instance.initialGrowth < 1.15f) ? 1f : ((!(__instance.initialGrowth < 1.65f)) ? __instance.initialGrowth : 1.25f))))));
			float num4 = ((__instance.initialColonize < 0.15f) ? 0f : ((__instance.initialColonize < 0.3f) ? 0.25f : ((__instance.initialColonize < 0.65f) ? 0.5f : ((__instance.initialColonize < 0.8f) ? 0.75f : ((__instance.initialColonize < 1.15f) ? 1f : ((!(__instance.initialColonize < 1.65f)) ? __instance.initialColonize : 1.25f))))));
			float num5 = __instance.maxDensity - 1f;
			float num6 = ((__instance.growthSpeedFactor < 0.35f) ? 0.3f : ((__instance.growthSpeedFactor < 0.75f) ? 0.7f : ((__instance.growthSpeedFactor < 1.5f) ? 1f : ((!(__instance.growthSpeedFactor < 2.5f)) ? (__instance.growthSpeedFactor / 2f) : 1.2f))));
			float num7 = ((__instance.powerThreatFactor < 0.05f) ? 0.125f : ((__instance.powerThreatFactor < 0.15f) ? 0.3f : ((__instance.powerThreatFactor < 0.25f) ? 0.6f : ((__instance.powerThreatFactor < 0.55f) ? 0.8f : ((__instance.powerThreatFactor < 1.15f) ? 1f : ((__instance.powerThreatFactor < 2.15f) ? 1.2f : ((__instance.powerThreatFactor < 5.15f) ? 1.5f : ((!(__instance.powerThreatFactor < 8.15f)) ? (__instance.powerThreatFactor / 4f) : 1.8f))))))));
			float num8 = ((__instance.battleThreatFactor < 0.05f) ? 0.125f : ((__instance.battleThreatFactor < 0.15f) ? 0.3f : ((__instance.battleThreatFactor < 0.25f) ? 0.6f : ((__instance.battleThreatFactor < 0.55f) ? 0.8f : ((__instance.battleThreatFactor < 1.15f) ? 1f : ((__instance.battleThreatFactor < 2.15f) ? 1.2f : ((__instance.battleThreatFactor < 5.15f) ? 1.5f : ((!(__instance.battleThreatFactor < 8.15f)) ? (__instance.battleExpFactor / 4f) : 1.8f))))))));
			float num9 = ((__instance.battleExpFactor < 0.05f) ? 0f : ((__instance.battleExpFactor < 0.15f) ? 1f : ((__instance.battleExpFactor < 0.25f) ? 3f : ((__instance.battleExpFactor < 0.55f) ? 6f : ((__instance.battleExpFactor < 1.15f) ? 10f : ((__instance.battleExpFactor < 2.15f) ? 12f : ((__instance.battleExpFactor < 5.15f) ? 14f : ((!(__instance.battleExpFactor < 8.15f)) ? (__instance.battleExpFactor * 2f) : 16f))))))));
			float num10 = ((num < 0f) ? 0f : (0.25f + num * (num7 * 0.5f + num8 * 0.5f)));
			float num11 = 0.375f + 0.625f * ((num2 + num9) / 10f);
			float num12 = 0.375f + 0.625f * ((num4 * 0.6f + num3 * 0.4f * (num4 * 0.75f + 0.25f)) * 0.6f + num6 * 0.4f * (num4 * 0.8f + 0.2f) + num5 * 0.29f * (num4 * 0.5f + 0.5f));
			__result = (float)(int)(num10 * num11 * num12 * 10000f + 0.5f) / 10000f;
			if (__result < 0f || __result > 9001f)
			{
				__result = 9001f;
			}
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(UICombatSettingsDF), "OnCombatThreatSliderChanged")]
		private static bool OnCombatThreatSliderChanged(ref UICombatSettingsDF __instance, float arg0)
		{
			float value = __instance.combatThreatSlider.value;
			if (value < 0.5f)
			{
				__instance.combatSettings.battleThreatFactor = 0.01f;
			}
			else if (value < 1.5f)
			{
				__instance.combatSettings.battleThreatFactor = 0.1f;
			}
			else if (value < 2.5f)
			{
				__instance.combatSettings.battleThreatFactor = 0.2f;
			}
			else if (value < 3.5f)
			{
				__instance.combatSettings.battleThreatFactor = 0.5f;
			}
			else if (value < 4.5f)
			{
				__instance.combatSettings.battleThreatFactor = 1f;
			}
			else if (value < 5.5f)
			{
				__instance.combatSettings.battleThreatFactor = 2f;
			}
			else if (value < 6.5f)
			{
				__instance.combatSettings.battleThreatFactor = 5f;
			}
			else if (value < 7.5f)
			{
				__instance.combatSettings.battleThreatFactor = 8f;
			}
			else
			{
				__instance.combatSettings.battleThreatFactor = Mathf.FloorToInt(value);
			}
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(UICombatSettingsDF), "OnEXPSliderChanged")]
		private static bool OnEXPSliderChanged(ref UICombatSettingsDF __instance, float arg0)
		{
			float value = __instance.DFExpSlider.value;
			if (value < 0.5f)
			{
				__instance.combatSettings.battleExpFactor = 0.01f;
			}
			else if (value < 1.5f)
			{
				__instance.combatSettings.battleExpFactor = 0.1f;
			}
			else if (value < 2.5f)
			{
				__instance.combatSettings.battleExpFactor = 0.2f;
			}
			else if (value < 3.5f)
			{
				__instance.combatSettings.battleExpFactor = 0.5f;
			}
			else if (value < 4.5f)
			{
				__instance.combatSettings.battleExpFactor = 1f;
			}
			else if (value < 5.5f)
			{
				__instance.combatSettings.battleExpFactor = 2f;
			}
			else if (value < 6.5f)
			{
				__instance.combatSettings.battleExpFactor = 5f;
			}
			else if (value < 7.5f)
			{
				__instance.combatSettings.battleExpFactor = 8f;
			}
			else
			{
				__instance.combatSettings.battleExpFactor = Mathf.FloorToInt(value + 1f);
			}
			__instance.UpdateUIParametersDisplay();
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(UICombatSettingsDF), "OnGrowthSpeedSliderChanged")]
		private static bool OnGrowthSpeedSliderChanged(ref UICombatSettingsDF __instance, float arg0)
		{
			float value = __instance.growthSpeedSlider.value;
			if (value < 0.5f)
			{
				__instance.combatSettings.growthSpeedFactor = 0.25f;
			}
			else if (value < 1.5f)
			{
				__instance.combatSettings.growthSpeedFactor = 0.5f;
			}
			else if (value < 2.5f)
			{
				__instance.combatSettings.growthSpeedFactor = 1f;
			}
			else if (value < 3.5f)
			{
				__instance.combatSettings.growthSpeedFactor = 2f;
			}
			else
			{
				__instance.combatSettings.growthSpeedFactor = Mathf.RoundToInt(value - 1.5f);
			}
			__instance.UpdateUIParametersDisplay();
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(UICombatSettingsDF), "OnInitGrowthSliderChanged")]
		private static bool OnInitGrowthSliderChanged(ref UICombatSettingsDF __instance, float arg0)
		{
			float value = __instance.initGrowthSlider.value;
			if (value < 0.5f)
			{
				__instance.combatSettings.initialGrowth = 0f;
			}
			else if (value < 1.5f)
			{
				__instance.combatSettings.initialGrowth = 0.25f;
			}
			else if (value < 2.5f)
			{
				__instance.combatSettings.initialGrowth = 0.5f;
			}
			else if (value < 3.5f)
			{
				__instance.combatSettings.initialGrowth = 0.75f;
			}
			else if (value < 4.5f)
			{
				__instance.combatSettings.initialGrowth = 1f;
			}
			else if (value < 5.5f)
			{
				__instance.combatSettings.initialGrowth = 1.5f;
			}
			else
			{
				__instance.combatSettings.initialGrowth = Mathf.FloorToInt(value / 3f);
			}
			__instance.UpdateUIParametersDisplay();
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(UICombatSettingsDF), "OnInitOccupiedSliderChanged")]
		private static bool OnInitOccupiedSliderChanged(ref UICombatSettingsDF __instance, float arg0)
		{
			float value = __instance.initOccupiedSlider.value;
			if (value < 0.5f)
			{
				__instance.combatSettings.initialColonize = 0.01f;
			}
			else if (value < 1.5f)
			{
				__instance.combatSettings.initialColonize = 0.25f;
			}
			else if (value < 2.5f)
			{
				__instance.combatSettings.initialColonize = 0.5f;
			}
			else if (value < 3.5f)
			{
				__instance.combatSettings.initialColonize = 0.75f;
			}
			else if (value < 4.5f)
			{
				__instance.combatSettings.initialColonize = 1f;
			}
			else if (value < 5.5f)
			{
				__instance.combatSettings.initialColonize = 1.5f;
			}
			else
			{
				__instance.combatSettings.initialColonize = Mathf.FloorToInt(value / 3f);
			}
			__instance.UpdateUIParametersDisplay();
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(UICombatSettingsDF), "OnMaxDensitySliderChanged")]
		private static bool OnMaxDensitySliderChanged(ref UICombatSettingsDF __instance, float arg0)
		{
			float value = __instance.maxDensitySlider.value;
			if (value < 0.5f)
			{
				__instance.combatSettings.maxDensity = 1f;
			}
			else if (value < 1.5f)
			{
				__instance.combatSettings.maxDensity = 1.5f;
			}
			else if (value < 2.5f)
			{
				__instance.combatSettings.maxDensity = 2f;
			}
			else if (value < 3.5f)
			{
				__instance.combatSettings.maxDensity = 2.5f;
			}
			else
			{
				__instance.combatSettings.maxDensity = Mathf.FloorToInt(value);
			}
			__instance.UpdateUIParametersDisplay();
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(UICombatSettingsDF), "OnPowerThreatSliderChanged")]
		private static bool OnPowerThreatSliderChanged(ref UICombatSettingsDF __instance, float arg0)
		{
			float value = __instance.powerThreatSlider.value;
			if (value < 0.5f)
			{
				__instance.combatSettings.powerThreatFactor = 0.01f;
			}
			else if (value < 1.5f)
			{
				__instance.combatSettings.powerThreatFactor = 0.1f;
			}
			else if (value < 2.5f)
			{
				__instance.combatSettings.powerThreatFactor = 0.2f;
			}
			else if (value < 3.5f)
			{
				__instance.combatSettings.powerThreatFactor = 0.5f;
			}
			else if (value < 4.5f)
			{
				__instance.combatSettings.powerThreatFactor = 1f;
			}
			else if (value < 5.5f)
			{
				__instance.combatSettings.powerThreatFactor = 2f;
			}
			else if (value < 6.5f)
			{
				__instance.combatSettings.powerThreatFactor = 5f;
			}
			else if (value < 7.5f)
			{
				__instance.combatSettings.powerThreatFactor = 8f;
			}
			else
			{
				__instance.combatSettings.powerThreatFactor = Mathf.FloorToInt(value);
			}
			__instance.UpdateUIParametersDisplay();
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(UICombatSettingsDF), "OnInitLevelSliderChanged")]
		private static bool OnInitLevelSliderChanged(ref UICombatSettingsDF __instance, float arg0)
		{
			float value = __instance.initLevelSlider.value;
			if (value < 0.5f)
			{
				__instance.combatSettings.initialLevel = 0f;
			}
			else if (value < 1.5f)
			{
				__instance.combatSettings.initialLevel = 1f;
			}
			else if (value < 2.5f)
			{
				__instance.combatSettings.initialLevel = 2f;
			}
			else if (value < 3.5f)
			{
				__instance.combatSettings.initialLevel = 3f;
			}
			else if (value < 4.5f)
			{
				__instance.combatSettings.initialLevel = 4f;
			}
			else if (value < 5.5f)
			{
				__instance.combatSettings.initialLevel = 5f;
			}
			else if (value < 6.5f)
			{
				__instance.combatSettings.initialLevel = 6f;
			}
			else if (value < 7.5f)
			{
				__instance.combatSettings.initialLevel = 7f;
			}
			else if (value < 8.5f)
			{
				__instance.combatSettings.initialLevel = 8f;
			}
			else if (value < 9.5f)
			{
				__instance.combatSettings.initialLevel = 9f;
			}
			else
			{
				__instance.combatSettings.initialLevel = Mathf.FloorToInt(value);
			}
			__instance.UpdateUIParametersDisplay();
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(UICombatSettingsDF), "UpdateUIParametersDisplay")]
		public static bool UpdateUIParametersDisplay(ref UICombatSettingsDF __instance)
		{
			//IL_0bd1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0bd7: Expected O, but got Unknown
			//IL_0c34: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c3b: Invalid comparison between Unknown and I4
			//IL_0c67: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c6c: Unknown result type (might be due to invalid IL or missing references)
			float aggressiveness = __instance.combatSettings.aggressiveness;
			string text = "";
			if (aggressiveness < -0.99f)
			{
				__instance.aggresiveSlider.value = 0f;
			}
			else if (aggressiveness < 0.01f)
			{
				__instance.aggresiveSlider.value = 1f;
			}
			else if (aggressiveness < 0.51f)
			{
				__instance.aggresiveSlider.value = 2f;
			}
			else if (aggressiveness < 1.01f)
			{
				__instance.aggresiveSlider.value = 3f;
			}
			else if (aggressiveness < 2.01f)
			{
				__instance.aggresiveSlider.value = 4f;
			}
			else
			{
				__instance.aggresiveSlider.value = 5f;
			}
			switch ((int)(__instance.aggresiveSlider.value + 0.5f))
			{
			case 0:
				text = Localization.Translate("活靶子");
				break;
			case 1:
				text = Localization.Translate("被动");
				break;
			case 2:
				text = Localization.Translate("消极");
				break;
			case 3:
				text = Localization.Translate("正常");
				break;
			case 4:
				text = Localization.Translate("积极");
				break;
			case 5:
				text = Localization.Translate("狂暴");
				break;
			}
			__instance.aggresiveText.text = text;
			aggressiveness = __instance.combatSettings.initialLevel;
			if (aggressiveness < 0.01f)
			{
				__instance.initLevelSlider.value = 0f;
			}
			else if (aggressiveness < 1.01f)
			{
				__instance.initLevelSlider.value = 1f;
			}
			else if (aggressiveness < 2.01f)
			{
				__instance.initLevelSlider.value = 2f;
			}
			else if (aggressiveness < 3.01f)
			{
				__instance.initLevelSlider.value = 3f;
			}
			else if (aggressiveness < 4.01f)
			{
				__instance.initLevelSlider.value = 4f;
			}
			else if (aggressiveness < 5.01f)
			{
				__instance.initLevelSlider.value = 5f;
			}
			else if (aggressiveness < 6.01f)
			{
				__instance.initLevelSlider.value = 6f;
			}
			else if (aggressiveness < 7.01f)
			{
				__instance.initLevelSlider.value = 7f;
			}
			else if (aggressiveness < 8.01f)
			{
				__instance.initLevelSlider.value = 8f;
			}
			else if (aggressiveness < 9.01f)
			{
				__instance.initLevelSlider.value = 9f;
			}
			else
			{
				__instance.initLevelSlider.value = Mathf.CeilToInt(__instance.initLevelSlider.value);
			}
			text = aggressiveness.ToString();
			__instance.initLevelText.text = text;
			aggressiveness = __instance.combatSettings.initialGrowth;
			if (aggressiveness < 0.01f)
			{
				__instance.initGrowthSlider.value = 0f;
			}
			else if (aggressiveness < 0.26f)
			{
				__instance.initGrowthSlider.value = 1f;
			}
			else if (aggressiveness < 0.51f)
			{
				__instance.initGrowthSlider.value = 2f;
			}
			else if (aggressiveness < 0.76f)
			{
				__instance.initGrowthSlider.value = 3f;
			}
			else if (aggressiveness < 1.01f)
			{
				__instance.initGrowthSlider.value = 4f;
			}
			else if (aggressiveness < 1.51f)
			{
				__instance.initGrowthSlider.value = 5f;
			}
			else
			{
				__instance.initGrowthSlider.value = Mathf.CeilToInt(aggressiveness * 3.33f);
			}
			text = aggressiveness * 100f + "%";
			__instance.initGrowthText.text = text;
			aggressiveness = __instance.combatSettings.initialColonize;
			if (aggressiveness < 0.02f)
			{
				__instance.initOccupiedSlider.value = 0f;
			}
			else if (aggressiveness < 0.26f)
			{
				__instance.initOccupiedSlider.value = 1f;
			}
			else if (aggressiveness < 0.51f)
			{
				__instance.initOccupiedSlider.value = 2f;
			}
			else if (aggressiveness < 0.76f)
			{
				__instance.initOccupiedSlider.value = 3f;
			}
			else if (aggressiveness < 1.01f)
			{
				__instance.initOccupiedSlider.value = 4f;
			}
			else if (aggressiveness < 1.51f)
			{
				__instance.initOccupiedSlider.value = 5f;
			}
			else
			{
				__instance.initOccupiedSlider.value = Mathf.CeilToInt(aggressiveness * 3.33f);
			}
			text = aggressiveness * 100f + "%";
			__instance.initOccupiedText.text = text;
			aggressiveness = __instance.combatSettings.maxDensity;
			if (aggressiveness < 1.01f)
			{
				__instance.maxDensitySlider.value = 0f;
			}
			else if (aggressiveness < 1.51f)
			{
				__instance.maxDensitySlider.value = 1f;
			}
			else if (aggressiveness < 2.01f)
			{
				__instance.maxDensitySlider.value = 2f;
			}
			else if (aggressiveness < 2.51f)
			{
				__instance.maxDensitySlider.value = 3f;
			}
			else
			{
				__instance.maxDensitySlider.value = Mathf.FloorToInt(aggressiveness);
			}
			text = aggressiveness + "x";
			__instance.maxDensityText.text = text;
			aggressiveness = __instance.combatSettings.growthSpeedFactor;
			if (aggressiveness < 0.26f)
			{
				__instance.growthSpeedSlider.value = 0f;
			}
			else if (aggressiveness < 0.51f)
			{
				__instance.growthSpeedSlider.value = 1f;
			}
			else if (aggressiveness < 1.01f)
			{
				__instance.growthSpeedSlider.value = 2f;
			}
			else if (aggressiveness < 2.01f)
			{
				__instance.growthSpeedSlider.value = 3f;
			}
			else
			{
				__instance.growthSpeedSlider.value = (float)Mathf.CeilToInt(aggressiveness) + 1f;
			}
			text = aggressiveness * 100f + "%";
			__instance.growthSpeedText.text = text;
			aggressiveness = __instance.combatSettings.powerThreatFactor;
			if (aggressiveness < 0.02f)
			{
				__instance.powerThreatSlider.value = 0f;
			}
			else if (aggressiveness < 0.11f)
			{
				__instance.powerThreatSlider.value = 1f;
			}
			else if (aggressiveness < 0.21000001f)
			{
				__instance.powerThreatSlider.value = 2f;
			}
			else if (aggressiveness < 0.51f)
			{
				__instance.powerThreatSlider.value = 3f;
			}
			else if (aggressiveness < 1.01f)
			{
				__instance.powerThreatSlider.value = 4f;
			}
			else if (aggressiveness < 2.01f)
			{
				__instance.powerThreatSlider.value = 5f;
			}
			else if (aggressiveness < 5.01f)
			{
				__instance.powerThreatSlider.value = 6f;
			}
			else if (aggressiveness < 8.01f)
			{
				__instance.powerThreatSlider.value = 7f;
			}
			else
			{
				__instance.powerThreatSlider.value = Mathf.FloorToInt(aggressiveness);
			}
			text = aggressiveness * 100f + "%";
			__instance.powerThreatText.text = text;
			aggressiveness = __instance.combatSettings.battleThreatFactor;
			if (aggressiveness < 0.02f)
			{
				__instance.combatThreatSlider.value = 0f;
			}
			else if (aggressiveness < 0.11f)
			{
				__instance.combatThreatSlider.value = 1f;
			}
			else if (aggressiveness < 0.21000001f)
			{
				__instance.combatThreatSlider.value = 2f;
			}
			else if (aggressiveness < 0.51f)
			{
				__instance.combatThreatSlider.value = 3f;
			}
			else if (aggressiveness < 1.01f)
			{
				__instance.combatThreatSlider.value = 4f;
			}
			else if (aggressiveness < 2.01f)
			{
				__instance.combatThreatSlider.value = 5f;
			}
			else if (aggressiveness < 5.01f)
			{
				__instance.combatThreatSlider.value = 6f;
			}
			else if (aggressiveness < 8.01f)
			{
				__instance.combatThreatSlider.value = 7f;
			}
			else
			{
				__instance.combatThreatSlider.value = Mathf.FloorToInt(aggressiveness);
			}
			text = aggressiveness * 100f + "%";
			__instance.combatThreatText.text = text;
			aggressiveness = __instance.combatSettings.battleExpFactor;
			if (aggressiveness < 0.02f)
			{
				__instance.DFExpSlider.value = 0f;
			}
			else if (aggressiveness < 0.11f)
			{
				__instance.DFExpSlider.value = 1f;
			}
			else if (aggressiveness < 0.21000001f)
			{
				__instance.DFExpSlider.value = 2f;
			}
			else if (aggressiveness < 0.51f)
			{
				__instance.DFExpSlider.value = 3f;
			}
			else if (aggressiveness < 1.01f)
			{
				__instance.DFExpSlider.value = 4f;
			}
			else if (aggressiveness < 2.01f)
			{
				__instance.DFExpSlider.value = 5f;
			}
			else if (aggressiveness < 5.01f)
			{
				__instance.DFExpSlider.value = 6f;
			}
			else if (aggressiveness < 8.01f)
			{
				__instance.DFExpSlider.value = 7f;
			}
			else
			{
				__instance.DFExpSlider.value = Mathf.FloorToInt(aggressiveness + 1f);
			}
			text = aggressiveness * 100f + "%";
			__instance.DFExpText.text = text;
			GameDesc val = new GameDesc();
			float difficulty = ((CombatSettings)(ref __instance.combatSettings)).difficulty;
			string arg = ((difficulty >= 9.9999f) ? difficulty.ToString("0.00") : difficulty.ToString("0.000"));
			__instance.difficultyText.text = string.Format(Localization.Translate("难度系数值"), arg);
			__instance.difficultTipGroupDF.SetActive(((int)((CombatSettings)(ref __instance.combatSettings)).aggressiveLevel == 40 && difficulty > 4.5f) || difficulty > 6f);
			__instance.gameDesc.CopyTo(val);
			val.combatSettings = __instance.combatSettings;
			__instance.propertyMultiplierText.text = Localization.Translate("元数据生成倍率") + " " + val.propertyMultiplier.ToString("0%");
			return false;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(UICombatSettingsDF), "_OnOpen")]
		public static void _OnOpen(ref UICombatSettingsDF __instance)
		{
			__instance.initLevelSlider.maxValue = 100f;
			__instance.initLevelSlider.m_MaxValue = 100f;
			__instance.growthSpeedSlider.maxValue = 300f;
			__instance.growthSpeedSlider.m_MaxValue = 300f;
			__instance.initGrowthSlider.maxValue = 300f;
			__instance.initGrowthSlider.m_MaxValue = 300f;
			__instance.initOccupiedSlider.maxValue = 300f;
			__instance.initOccupiedSlider.m_MaxValue = 300f;
			__instance.maxDensitySlider.maxValue = 30f;
			__instance.maxDensitySlider.m_MaxValue = 30f;
			__instance.powerThreatSlider.maxValue = 1000f;
			__instance.powerThreatSlider.m_MaxValue = 1000f;
			__instance.DFExpSlider.maxValue = 1000f;
			__instance.DFExpSlider.m_MaxValue = 1000f;
			__instance.combatThreatSlider.maxValue = 1000f;
			__instance.combatThreatSlider.m_MaxValue = 1000f;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(EvolveData), "AddExpPoint")]
		public static bool AddExpPoint(ref EvolveData __instance, int _addexpp)
		{
			if (__instance.level >= 100)
			{
				if (__instance.expf != 0 || __instance.expp != 0 || __instance.level != 100)
				{
					__instance.level = 100;
					__instance.expf = 0;
					__instance.expp = 0;
					__instance.expl = EvolveData.LevelCummulativeExp(100);
				}
				return false;
			}
			if (_addexpp > 0)
			{
				__instance.expp += _addexpp;
				if (__instance.expp >= 10000)
				{
					__instance.expf += __instance.expp / 10000;
					__instance.expp %= 10000;
					while (__instance.expf >= EvolveData.levelExps[__instance.level])
					{
						int num = EvolveData.levelExps.Length - 1;
						__instance.expf -= EvolveData.levelExps[__instance.level];
						__instance.expl += EvolveData.levelExps[__instance.level];
						__instance.level++;
						if (__instance.level >= num)
						{
							__instance.level = num;
							__instance.expf = 0;
							__instance.expp = 0;
							return false;
						}
					}
				}
			}
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(EvolveData), "AddExp")]
		public static bool AddExp(ref EvolveData __instance, int _addexp)
		{
			if (__instance.level >= 100)
			{
				if (__instance.expf != 0 || __instance.expp != 0 || __instance.level != 100)
				{
					__instance.level = 100;
					__instance.expf = 0;
					__instance.expp = 0;
					__instance.expl = EvolveData.LevelCummulativeExp(100);
				}
				return false;
			}
			__instance.expf += _addexp;
			while (__instance.expf >= EvolveData.levelExps[__instance.level])
			{
				int num = EvolveData.levelExps.Length - 1;
				__instance.expf -= EvolveData.levelExps[__instance.level];
				__instance.expl += EvolveData.levelExps[__instance.level];
				__instance.level++;
				if (__instance.level >= num)
				{
					__instance.level = num;
					__instance.expf = 0;
					return false;
				}
			}
			return false;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(StarGen), "CreateStar")]
		[HarmonyPatch(typeof(StarGen), "CreateBirthStar")]
		public static void ClampHiveCount(ref StarData __result)
		{
			__result.maxHiveCount = Mathf.Clamp(__result.maxHiveCount, 0, 8);
			__result.initialHiveCount = Mathf.Clamp(__result.initialHiveCount, 0, 8);
		}
	}
	public static class BCE
	{
		public static class Console
		{
			public static void Init()
			{
				Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
				Assembly[] array = assemblies;
				foreach (Assembly assembly in array)
				{
					if (!(assembly.GetName().Name != "BCE"))
					{
						t = assembly.GetType("BCE.console");
						disabled = false;
					}
				}
				initialized = true;
			}

			public static void Write(string s, ConsoleColor c)
			{
				if (!initialized)
				{
					Init();
				}
				if (!disabled)
				{
					t.GetMethod("Write", BindingFlags.Static | BindingFlags.Public)?.Invoke(null, new object[2] { s, c });
				}
				else
				{
					GF.Log(s, 35);
				}
			}

			public static void WriteLine(string s, ConsoleColor c)
			{
				if (!initialized)
				{
					Init();
				}
				if (!disabled)
				{
					t.GetMethod("WriteLine", BindingFlags.Static | BindingFlags.Public)?.Invoke(null, new object[2] { s, c });
				}
			}
		}

		public static bool disabled = true;

		private static bool initialized;

		private static Type t;
	}
	public static class Utils
	{
		public static class AddressHelper
		{
			[StructLayout(LayoutKind.Explicit)]
			private struct ObjectReinterpreter
			{
				[FieldOffset(0)]
				public ObjectWrapper AsObject;

				[FieldOffset(0)]
				public readonly IntPtrWrapper AsIntPtr;
			}

			private class ObjectWrapper
			{
				public object Object;
			}

			private class IntPtrWrapper
			{
				public IntPtr Value;
			}

			private static readonly object mutualObject;

			private static readonly ObjectReinterpreter reinterpreter;

			static AddressHelper()
			{
				mutualObject = new object();
				reinterpreter = default(ObjectReinterpreter);
				reinterpreter.AsObject = new ObjectWrapper();
			}

			public static IntPtr GetAddress(object obj)
			{
				lock (mutualObject)
				{
					reinterpreter.AsObject.Object = obj;
					IntPtr value = reinterpreter.AsIntPtr.Value;
					reinterpreter.AsObject.Object = null;
					return value;
				}
			}

			public static T GetInstance<T>(IntPtr address)
			{
				lock (mutualObject)
				{
					reinterpreter.AsIntPtr.Value = address;
					return (T)reinterpreter.AsObject.Object;
				}
			}
		}

		public static Dictionary<PlanetData, PlanetFactory> PlanetFactories = new Dictionary<PlanetData, PlanetFactory>();

		public static CodeInstruction Call(Type type, string name, Type[] parameters = null, Type[] generics = null)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			MethodInfo methodInfo = AccessTools.Method(type, name, parameters, generics);
			if ((object)methodInfo == null)
			{
				throw new ArgumentException($"No method found for type={type}, name={name}, parameters={GeneralExtensions.Description(parameters)}, generics={GeneralExtensions.Description(generics)}");
			}
			return new CodeInstruction(OpCodes.Call, (object)methodInfo);
		}

		public static CodeInstruction Call(string typeColonMethodname, Type[] parameters = null, Type[] generics = null)
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Expected O, but got Unknown
			MethodInfo methodInfo = AccessTools.Method(typeColonMethodname, parameters, generics);
			if ((object)methodInfo == null)
			{
				throw new ArgumentException("No method found for " + typeColonMethodname + ", parameters=" + GeneralExtensions.Description(parameters) + ", generics=" + GeneralExtensions.Description(generics));
			}
			return new CodeInstruction(OpCodes.Call, (object)methodInfo);
		}

		public static CodeInstruction Call(Expression<Action> expression)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			return new CodeInstruction(OpCodes.Call, (object)SymbolExtensions.GetMethodInfo(expression));
		}

		public static CodeInstruction Call<T>(Expression<Action<T>> expression)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			return new CodeInstruction(OpCodes.Call, (object)SymbolExtensions.GetMethodInfo<T>(expression));
		}

		public static CodeInstruction Call<T, TResult>(Expression<Func<T, TResult>> expression)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			return new CodeInstruction(OpCodes.Call, (object)SymbolExtensions.GetMethodInfo<T, TResult>(expression));
		}

		public static CodeInstruction Call(LambdaExpression expression)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			return new CodeInstruction(OpCodes.Call, (object)SymbolExtensions.GetMethodInfo(expression));
		}

		public static CodeInstruction LoadField(Type type, string name, bool useAddress = false)
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			FieldInfo fieldInfo = AccessTools.Field(type, name);
			if ((object)fieldInfo == null)
			{
				throw new ArgumentException($"No field found for {type} and {name}");
			}
			return new CodeInstruction((!useAddress) ? (fieldInfo.IsStatic ? OpCodes.Ldsfld : OpCodes.Ldfld) : (fieldInfo.IsStatic ? OpCodes.Ldsflda : OpCodes.Ldflda), (object)fieldInfo);
		}

		public static CodeInstruction StoreField(Type type, string name)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			FieldInfo fieldInfo = AccessTools.Field(type, name);
			if ((object)fieldInfo == null)
			{
				throw new ArgumentException($"No field found for {type} and {name}");
			}
			return new CodeInstruction(fieldInfo.IsStatic ? OpCodes.Stsfld : OpCodes.Stfld, (object)fieldInfo);
		}

		public static CodeInstruction LoadLocal(int index, bool useAddress = false)
		{
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Expected O, but got Unknown
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Expected O, but got Unknown
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Expected O, but got Unknown
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Expected O, but got Unknown
			if (useAddress)
			{
				if (index < 256)
				{
					return new CodeInstruction(OpCodes.Ldloca_S, (object)Convert.ToByte(index));
				}
				return new CodeInstruction(OpCodes.Ldloca, (object)index);
			}
			if (index == 0)
			{
				return new CodeInstruction(OpCodes.Ldloc_0, (object)null);
			}
			if (index == 1)
			{
				return new CodeInstruction(OpCodes.Ldloc_1, (object)null);
			}
			if (index == 2)
			{
				return new CodeInstruction(OpCodes.Ldloc_2, (object)null);
			}
			if (index == 3)
			{
				return new CodeInstruction(OpCodes.Ldloc_3, (object)null);
			}
			if (index < 256)
			{
				return new CodeInstruction(OpCodes.Ldloc_S, (object)Convert.ToByte(index));
			}
			return new CodeInstruction(OpCodes.Ldloc, (object)index);
		}

		public static CodeInstruction StoreLocal(int index)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected O, but got Unknown
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Expected O, but got Unknown
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Expected O, but got Unknown
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Expected O, but got Unknown
			if (index == 0)
			{
				return new CodeInstruction(OpCodes.Stloc_0, (object)null);
			}
			if (index == 1)
			{
				return new CodeInstruction(OpCodes.Stloc_1, (object)null);
			}
			if (index == 2)
			{
				return new CodeInstruction(OpCodes.Stloc_2, (object)null);
			}
			if (index == 3)
			{
				return new CodeInstruction(OpCodes.Stloc_3, (object)null);
			}
			if (index < 256)
			{
				return new CodeInstruction(OpCodes.Stloc_S, (object)Convert.ToByte(index));
			}
			return new CodeInstruction(OpCodes.Stloc, (object)index);
		}

		public static CodeInstruction LoadArgument(int index, bool useAddress = false)
		{
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Expected O, but got Unknown
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Expected O, but got Unknown
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Expected O, but got Unknown
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Expected O, but got Unknown
			if (useAddress)
			{
				if (index < 256)
				{
					return new CodeInstruction(OpCodes.Ldarga_S, (object)Convert.ToByte(index));
				}
				return new CodeInstruction(OpCodes.Ldarga, (object)index);
			}
			if (index == 0)
			{
				return new CodeInstruction(OpCodes.Ldarg_0, (object)null);
			}
			if (index == 1)
			{
				return new CodeInstruction(OpCodes.Ldarg_1, (object)null);
			}
			if (index == 2)
			{
				return new CodeInstruction(OpCodes.Ldarg_2, (object)null);
			}
			if (index == 3)
			{
				return new CodeInstruction(OpCodes.Ldarg_3, (object)null);
			}
			if (index < 256)
			{
				return new CodeInstruction(OpCodes.Ldarg_S, (object)Convert.ToByte(index));
			}
			return new CodeInstruction(OpCodes.Ldarg, (object)index);
		}

		public static CodeInstruction StoreArgument(int index)
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			if (index < 256)
			{
				return new CodeInstruction(OpCodes.Starg_S, (object)Convert.ToByte(index));
			}
			return new CodeInstruction(OpCodes.Starg, (object)index);
		}

		public static double ModifyRadius(double vanilla, double realRadius)
		{
			bool flag = false;
			if (realRadius < 0.0)
			{
				flag = true;
				realRadius *= -1.0;
			}
			double num = vanilla - 200.0;
			realRadius += num;
			if (flag)
			{
				realRadius *= -1.0;
			}
			return realRadius;
		}

		public static T GetRadiusFromMecha<T>(T t, Mecha mecha)
		{
			double vanilla = Convert.ToDouble(t);
			float? obj;
			if (mecha == null)
			{
				obj = null;
			}
			else
			{
				Player player = mecha.player;
				if (player == null)
				{
					obj = null;
				}
				else
				{
					PlanetData planetData = player.planetData;
					obj = ((planetData != null) ? new float?(planetData.realRadius) : null);
				}
			}
			double num = ModifyRadius(vanilla, ((double?)obj) ?? 200.0);
			return (T)Convert.ChangeType(num, typeof(T));
		}

		public static T GetRadiusFromFactory<T>(T t, PlanetFactory factory)
		{
			double vanilla = Convert.ToDouble(t);
			float? obj;
			if (factory == null)
			{
				obj = null;
			}
			else
			{
				PlanetData planet = factory.planet;
				obj = ((planet != null) ? new float?(planet.realRadius) : null);
			}
			double num = ModifyRadius(vanilla, ((double?)obj) ?? 200.0);
			return (T)Convert.ChangeType(num, typeof(T));
		}

		public static float GetSquareRadiusFromAstroFactoryId(int id)
		{
			PlanetFactory val = GameMain.data.spaceSector.skillSystem.astroFactories[id];
			float num = val.planet.realRadius * val.planet.realRadius;
			if (VFInput.alt)
			{
				GF.Log($"GetRadiusSquareFromFactory Called By {GF.GetCaller()} {GF.GetCaller(1)} {GF.GetCaller(2)} returning {num}", 48);
			}
			return num;
		}

		public static T GetRadiusFromAstroId<T>(T t, int id)
		{
			double vanilla = Convert.ToDouble(t);
			GalaxyData galaxy = GameMain.data.galaxy;
			float? obj;
			if (galaxy == null)
			{
				obj = null;
			}
			else
			{
				PlanetFactory obj2 = galaxy.astrosFactory[id];
				if (obj2 == null)
				{
					obj = null;
				}
				else
				{
					PlanetData planet = obj2.planet;
					obj = ((planet != null) ? new float?(planet.realRadius) : null);
				}
			}
			double num = ModifyRadius(vanilla, ((double?)obj) ?? 200.0);
			return (T)Convert.ChangeType(num, typeof(T));
		}

		public static T GetRadiusFromLocalPlanet<T>(T t)
		{
			double vanilla = Convert.ToDouble(t);
			PlanetData localPlanet = GameMain.localPlanet;
			double num = ModifyRadius(vanilla, ((double?)((localPlanet != null) ? new float?(localPlanet.realRadius) : null)) ?? 200.0);
			return (T)Convert.ChangeType(num, typeof(T));
		}

		public static T GetRadiusFromEnemyData<T>(T t, ref EnemyData enemyData)
		{
			double vanilla = Convert.ToDouble(t);
			PlanetData obj = GameMain.galaxy.PlanetById(enemyData.astroId);
			double num = ModifyRadius(vanilla, ((double?)((obj != null) ? new float?(obj.realRadius) : null)) ?? 200.0);
			return (T)Convert.ChangeType(num, typeof(T));
		}

		public static T GetRadiusFromAltitude<T>(T t, float alt)
		{
			double num = ModifyRadius(Convert.ToDouble(t), Convert.ToDouble(alt));
			return (T)Convert.ChangeType(num, typeof(T));
		}

		public static PlanetFactory GetPlanetFactoryFromPlanetData(PlanetData planet)
		{
			if (planet == null)
			{
				return null;
			}
			if (PlanetFactories.ContainsKey(planet))
			{
				return PlanetFactories[planet];
			}
			PlanetFactory[] astrosFactory = GameMain.spaceSector.galaxy.astrosFactory;
			foreach (PlanetFactory val in astrosFactory)
			{
				if (((val != null) ? val.planet : null) != null && !PlanetFactories.ContainsKey(val.planet))
				{
					PlanetFactories.Add(val.planet, val);
				}
			}
			return PlanetFactories.ContainsKey(planet) ? PlanetFactories[planet] : null;
		}

		public static float getPlanetSize(float mod = 0f)
		{
			PlanetData localPlanet = GameMain.localPlanet;
			return (localPlanet != null) ? (localPlanet.realRadius + mod) : (200f + mod);
		}

		public static string Serialize(object value, bool pretty = true)
		{
			fsSerializer fsSerializer = new fsSerializer();
			fsSerializer.TrySerialize(value, out var data);
			if (!pretty)
			{
				return fsJsonPrinter.CompressedJson(data);
			}
			return fsJsonPrinter.PrettyJson(data);
		}

		public static T DeSerialize<T>(string json)
		{
			fsSerializer fsSerializer = new fsSerializer();
			fsData data;
			fsResult fsResult = fsJsonParser.Parse(json, out data);
			if (fsResult.Failed)
			{
				GF.Error("Deserialization of Json " + json + " failed. " + fsResult.FormattedMessages, 59);
				return default(T);
			}
			T instance = default(T);
			fsResult fsResult2 = fsSerializer.TryDeserialize(data, ref instance);
			if (fsResult2.Failed)
			{
				GF.Error("Failed to deserialize " + json + ": " + fsResult2.FormattedMessages, 67);
				return default(T);
			}
			return instance;
		}

		public static T[] ResourcesLoadArray<T>(string path, string format, bool emptyNull) where T : Object
		{
			List<T> list = new List<T>();
			T val = Resources.Load<T>(path);
			if ((Object)(object)val == (Object)null)
			{
				return null;
			}
			int num = 0;
			if ((Object)(object)val != (Object)null)
			{
				list.Add(val);
				num = 1;
			}
			do
			{
				val = Resources.Load<T>(string.Format(format, path, num));
				if ((Object)(object)val == (Object)null || ((num == 1 || num == 2) && list.Contains(val)))
				{
					break;
				}
				list.Add(val);
				num++;
			}
			while (num < 1024);
			if (emptyNull && list.Count == 0)
			{
				return null;
			}
			return list.ToArray();
		}

		public static VectorLF3 PolarToCartesian(double p, double theta, double phi)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			double num = p * Math.Sin(phi) * Math.Cos(theta);
			double num2 = p * Math.Sin(phi) * Math.Sin(theta);
			double num3 = p * Math.Cos(phi);
			return new VectorLF3(num3, num2, num3);
		}

		public static Vector3 RandomDirection(GF.Random random)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			Vector3 zero = Vector3.zero;
			zero.x = (float)random.NextDouble() * 2f - 1f;
			zero.y = (float)random.NextDouble() * 2f - 1f;
			zero.z = (float)random.NextDouble() * 2f - 1f;
			return zero;
		}

		public static Type GetCallingType()
		{
			return new StackTrace().GetFrame(2).GetMethod().ReflectedType;
		}

		public static double DistanceVLF3(VectorLF3 a, VectorLF3 b)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			VectorLF3 val = new VectorLF3(a.x - b.x, a.y - b.y, a.z - b.z);
			return ((VectorLF3)(ref val)).magnitude;
		}

		public static bool ArrayCompare<T>(T[] a1, T[] a2)
		{
			return a1.SequenceEqual(a2);
		}

		public static T ReverseLookup<T, W>(Dictionary<T, W> dict, W val)
		{
			foreach (KeyValuePair<T, W> item in dict)
			{
				if (item.Value.ToString() == val.ToString())
				{
					return item.Key;
				}
			}
			return default(T);
		}

		public static float diff(float a, float b)
		{
			return (!(a > b)) ? (b - a) : (a - b);
		}

		public static List<VectorLF3> RegularPointsOnSphere(float radius, int count)
		{
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			List<VectorLF3> list = new List<VectorLF3>();
			if (count == 0)
			{
				return list;
			}
			double num = Math.PI * 4.0 * (Math.Pow(radius, 2.0) / (double)count);
			double num2 = Math.Sqrt(num);
			int num3 = (int)Math.Round(Math.PI / num2);
			double num4 = Math.PI / (double)num3;
			double num5 = num / num4;
			for (int i = 0; i < num3; i++)
			{
				double num6 = Math.PI * ((double)i + 0.5) / (double)num3;
				int num7 = (int)Math.Round(Math.PI * 2.0 * Math.Sin(num6) / num5);
				for (int j = 0; j < num7; j++)
				{
					double num8 = Math.PI * 2.0 * (double)j / (double)num7;
					double num9 = (double)radius * Math.Sin(num6) * Math.Cos(num8);
					double num10 = (double)radius * Math.Sin(num6) * Math.Sin(num8);
					double num11 = (double)radius * Math.Cos(num6);
					list.Add(new VectorLF3(num9, num10, num11));
				}
			}
			return list;
		}

		public static float Round2DP(float num)
		{
			return Mathf.Round(num * 100f) / 100f;
		}
	}
	public static class Methods
	{
		public static MethodInfo GetRadiusFromAstroId(this CodeMatcher matcher)
		{
			return AccessTools.Method(typeof(Utils), "GetRadiusFromAstroId", (Type[])null, (Type[])null).MakeGenericMethod(matcher.Operand?.GetType() ?? typeof(float));
		}

		public static MethodInfo GetRadiusFromLocalPlanet(this CodeMatcher matcher)
		{
			return AccessTools.Method(typeof(Utils), "GetRadiusFromLocalPlanet", (Type[])null, (Type[])null).MakeGenericMethod(matcher.Operand?.GetType() ?? typeof(float));
		}

		public static MethodInfo GetRadiusFromEnemyData(this CodeMatcher matcher)
		{
			return AccessTools.Method(typeof(Utils), "GetRadiusFromEnemyData", (Type[])null, (Type[])null).MakeGenericMethod(matcher.Operand?.GetType() ?? typeof(float));
		}

		public static MethodInfo GetRadiusFromMecha(this CodeMatcher matcher)
		{
			return AccessTools.Method(typeof(Utils), "GetRadiusFromMecha", (Type[])null, (Type[])null).MakeGenericMethod(matcher.Operand?.GetType() ?? typeof(float));
		}

		public static MethodInfo GetRadiusFromFactory(this CodeMatcher matcher)
		{
			return AccessTools.Method(typeof(Utils), "GetRadiusFromFactory", (Type[])null, (Type[])null).MakeGenericMethod(matcher.Operand?.GetType() ?? typeof(float));
		}

		public static MethodInfo GetRadiusFromAltitude(this CodeMatcher matcher)
		{
			return AccessTools.Method(typeof(Utils), "GetRadiusFromAltitude", (Type[])null, (Type[])null).MakeGenericMethod(matcher.Operand?.GetType() ?? typeof(float));
		}

		public static MethodInfo GetSquareRadiusFromAstroFactoryId(this CodeMatcher matcher)
		{
			return AccessTools.Method(typeof(Utils), "GetSquareRadiusFromAstroFactoryId", (Type[])null, (Type[])null);
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "GetFogged";

		public const string PLUGIN_NAME = "GetFogged";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace PCGSharp
{
	public class Pcg
	{
		private const ulong ShiftedIncrement = 721347520444481703uL;

		private const ulong Multiplier = 6364136223846793005uL;

		private const double ToDouble01 = 2.3283064365386963E-10;

		private ulong _increment = 1442695040888963407uL;

		private ulong _state;

		public Pcg(int seed)
			: this((ulong)seed)
		{
		}

		public Pcg(ulong seed, ulong sequence = 721347520444481703uL)
		{
			Initialize(seed, sequence);
		}

		public int Next()
		{
			uint num = NextUInt();
			return (int)(num >> 1);
		}

		public int Next(int maxExclusive)
		{
			if (maxExclusive <= 0)
			{
				throw new ArgumentException("Max Exclusive must be positive");
			}
			uint num = (uint)(0L - (long)(uint)maxExclusive) % (uint)maxExclusive;
			uint num2;
			do
			{
				num2 = NextUInt();
			}
			while (num2 < num);
			return (int)(num2 % (uint)maxExclusive);
		}

		public int Next(int minInclusive, int maxExclusive)
		{
			if (maxExclusive <= minInclusive)
			{
				throw new ArgumentException("MaxExclusive must be larger than MinInclusive");
			}
			uint num = (uint)(maxExclusive - minInclusive);
			uint num2 = (uint)(0L - (long)num) % num;
			uint num3;
			do
			{
				num3 = NextUInt();
			}
			while (num3 < num2);
			return (int)(num3 % num + minInclusive);
		}

		public virtual uint NextUInt()
		{
			ulong state = _state;
			_state = state * 6364136223846793005L + _increment;
			uint num = (uint)(((state >> 18) ^ state) >> 27);
			int num2 = (int)(state >> 59);
			return (num >> num2) | (num << (-num2 & 0x1F));
		}

		public uint NextUInt(uint maxExclusive)
		{
			uint num = (uint)(0L - (long)maxExclusive) % maxExclusive;
			uint num2;
			do
			{
				num2 = NextUInt();
			}
			while (num2 < num);
			return num2 % maxExclusive;
		}

		public uint NextUInt(uint minInclusive, uint maxExclusive)
		{
			if (maxExclusive <= minInclusive)
			{
				throw new ArgumentException();
			}
			uint num = maxExclusive - minInclusive;
			uint num2 = (uint)(0L - (long)num) % num;
			uint num3;
			do
			{
				num3 = NextUInt();
			}
			while (num3 < num2);
			return num3 % num + minInclusive;
		}

		public float NextFloat()
		{
			return (float)((double)NextUInt() * 2.3283064365386963E-10);
		}

		public float NextFloat(float maxInclusive)
		{
			if (maxInclusive <= 0f)
			{
				throw new ArgumentException("MaxInclusive must be larger than 0");
			}
			return (float)((double)NextUInt() * 2.3283064365386963E-10) * maxInclusive;
		}

		public float NextFloat(float minInclusive, float maxInclusive)
		{
			if (maxInclusive < minInclusive)
			{
				throw new ArgumentException("Max must be larger than min");
			}
			return (float)((double)NextUInt() * 2.3283064365386963E-10) * (maxInclusive - minInclusive) + minInclusive;
		}

		public double NextDouble()
		{
			return (double)NextUInt() * 2.3283064365386963E-10;
		}

		public double NextDouble(double maxInclusive)
		{
			if (maxInclusive <= 0.0)
			{
				throw new ArgumentException("Max must be larger than 0");
			}
			return (double)NextUInt() * 2.3283064365386963E-10 * maxInclusive;
		}

		public double NextDouble(double minInclusive, double maxInclusive)
		{
			if (maxInclusive < minInclusive)
			{
				throw new ArgumentException("Max must be larger than min");
			}
			return (double)NextUInt() * 2.3283064365386963E-10 * (maxInclusive - minInclusive) + minInclusive;
		}

		public bool NextBool()
		{
			uint num = NextUInt();
			return num % 2 == 1;
		}

		public void SetStream(ulong sequence)
		{
			_increment = (sequence << 1) | 1;
		}

		protected void reseed(int seed)
		{
			Initialize((ulong)seed, 721347520444481703uL);
		}

		protected void Initialize(ulong seed, ulong initseq)
		{
			_state = 0uL;
			SetStream(initseq);
			NextUInt();
			_state += seed;
			NextUInt();
		}
	}
}
namespace GSSerializer
{
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface)]
	public sealed class fsForwardAttribute : Attribute
	{
		public string MemberName;

		public fsForwardAttribute(string memberName)
		{
			MemberName = memberName;
		}
	}
	public class fsConverterRegistrar
	{
		public static AnimationCurve_DirectConverter Register_AnimationCurve_DirectConverter;

		public static Bounds_DirectConverter Register_Bounds_DirectConverter;

		public static Gradient_DirectConverter Register_Gradient_DirectConverter;

		public static GUIStyleState_DirectConverter Register_GUIStyleState_DirectConverter;

		public static GUIStyle_DirectConverter Register_GUIStyle_DirectConverter;

		public static Keyframe_DirectConverter Register_Keyframe_DirectConverter;

		public static LayerMask_DirectConverter Register_LayerMask_DirectConverter;

		public static RectOffset_DirectConverter Register_RectOffset_DirectConverter;

		public static Rect_DirectConverter Register_Rect_DirectConverter;

		public static List<Type> Converters;

		static fsConverterRegistrar()
		{
			Converters = new List<Type>();
			FieldInfo[] declaredFields = typeof(fsConverterRegistrar).GetDeclaredFields();
			foreach (FieldInfo fieldInfo in declaredFields)
			{
				if (fieldInfo.Name.StartsWith("Register_"))
				{
					Converters.Add(fieldInfo.FieldType);
				}
			}
			MethodInfo[] declaredMethods = typeof(fsConverterRegistrar).GetDeclaredMethods();
			foreach (MethodInfo methodInfo in declaredMethods)
			{
				if (methodInfo.Name.StartsWith("Register_"))
				{
					methodInfo.Invoke(null, null);
				}
			}
			List<Type> list = new List<Type>(Converters);
			foreach (Type converter in Converters)
			{
				object obj = null;
				try
				{
					obj = Activator.CreateInstance(converter);
				}
				catch (Exception)
				{
				}
				if (obj is fsIAotConverter fsIAotConverter2)
				{
					fsMetaType currentModel = fsMetaType.Get(new fsConfig(), fsIAotConverter2.ModelType);
					if (!fsAotCompilationManager.IsAotModelUpToDate(currentModel, fsIAotConverter2))
					{
						list.Remove(converter);
					}
				}
			}
			Converters = list;
		}
	}
	public class fsAotCompilationManager
	{
		public static HashSet<Type> AotCandidateTypes = new HashSet<Type>();

		private static bool HasMember(fsAotVersionInfo versionInfo, fsAotVersionInfo.Member member)
		{
			fsAotVersionInfo.Member[] members = versionInfo.Members;
			foreach (fsAotVersionInfo.Member member2 in members)
			{
				if (member2 == member)
				{
					return true;
				}
			}
			return false;
		}

		public static bool IsAotModelUpToDate(fsMetaType currentModel, fsIAotConverter aotModel)
		{
			if (currentModel.IsDefaultConstructorPublic != aotModel.VersionInfo.IsConstructorPublic)
			{
				return false;
			}
			if (currentModel.Properties.Length != aotModel.VersionInfo.Members.Length)
			{
				return false;
			}
			fsMetaProperty[] properties = currentModel.Properties;
			foreach (fsMetaProperty property in properties)
			{
				if (!HasMember(aotModel.VersionInfo, new fsAotVersionInfo.Member(property)))
				{
					return false;
				}
			}
			return true;
		}

		public static string RunAotCompilationForType(fsConfig config, Type type)
		{
			fsMetaType fsMetaType2 = fsMetaType.Get(config, type);
			fsMetaType2.EmitAotData(throwException: true);
			return GenerateDirectConverterForTypeInCSharp(type, fsMetaType2.Properties, fsMetaType2.IsDefaultConstructorPublic);
		}

		private static string EmitVersionInfo(string prefix, Type type, fsMetaProperty[] members, bool isConstructorPublic)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.AppendLine("new fsAotVersionInfo {");
			stringBuilder.AppendLine(prefix + "    IsConstructorPublic = " + (isConstructorPublic ? "true" : "false") + ",");
			stringBuilder.AppendLine(prefix + "    Members = new fsAotVersionInfo.Member[] {");
			foreach (fsMetaProperty fsMetaProperty in members)
			{
				stringBuilder.AppendLine(prefix + "        new fsAotVersionInfo.Member {");
				stringBuilder.AppendLine(prefix + "            MemberName = \"" + fsMetaProperty.MemberName + "\",");
				stringBuilder.AppendLine(prefix + "            JsonName = \"" + fsMetaProperty.JsonName + "\",");
				stringBuilder.AppendLine(prefix + "            StorageType = \"" + fsMetaProperty.StorageType.CSharpName(includeNamespace: true) + "\",");
				if (fsMetaProperty.OverrideConverterType != null)
				{
					stringBuilder.AppendLine(prefix + "            OverrideConverterType = \"" + fsMetaProperty.OverrideConverterType.CSharpName(includeNamespace: true) + "\",");
				}
				stringBuilder.AppendLine(prefix + "        },");
			}
			stringBuilder.AppendLine(prefix + "    }");
			stringBuilder.Append(prefix + "}");
			return stringBuilder.ToString();
		}

		private static string GetConverterString(fsMetaProperty member)
		{
			if (member.OverrideConverterType == null)
			{
				return "null";
			}
			return $"typeof({member.OverrideConverterType.CSharpName(includeNamespace: true)})";
		}

		public static string GetQualifiedConverterNameForType(Type type)
		{
			return "FullSerializer.Speedup." + type.CSharpName(includeNamespace: true, ensureSafeDeclarationName: true) + "_DirectConverter";
		}

		private static string GenerateDirectConverterForTypeInCSharp(Type type, fsMetaProperty[] members, bool isConstructorPublic)
		{
			StringBuilder stringBuilder = new StringBuilder();
			string text = type.CSharpName(includeNamespace: true);
			string text2 = type.CSharpName(includeNamespace: true, ensureSafeDeclarationName: true);
			stringBuilder.AppendLine("using System;");
			stringBuilder.AppendLine("using System.Collections.Generic;");
			stringBuilder.AppendLine();
			stringBuilder.AppendLine("namespace FullSerializer {");
			stringBuilder.AppendLine("    partial class fsConverterRegistrar {");
			stringBuilder.AppendLine("        public static Speedup." + text2 + "_DirectConverter Register_" + text2 + ";");
			stringBuilder.AppendLine("    }");
			stringBuilder.AppendLine("}");
			stringBuilder.AppendLine();
			stringBuilder.AppendLine("namespace FullSerializer.Speedup {");
			stringBuilder.AppendLine("    public class " + text2 + "_DirectConverter : fsDirectConverter<" + text + ">, fsIAotConverter {");
			stringBuilder.AppendLine("        private fsAotVersionInfo _versionInfo = " + EmitVersionInfo("        ", type, members, isConstructorPublic) + ";");
			stringBuilder.AppendLine("        fsAotVersionInfo fsIAotConverter.VersionInfo { get { return _versionInfo; } }");
			stringBuilder.AppendLine();
			stringBuilder.AppendLine("        protected override fsResult DoSerialize(" + text + " model, Dictionary<string, fsData> serialized) {");
			stringBuilder.AppendLine("            var result = fsResult.Success;");
			stringBuilder.AppendLine();
			foreach (fsMetaProperty fsMetaProperty in members)
			{
				stringBuilder.AppendLine("            result += SerializeMember(serialized, " + GetConverterString(fsMetaProperty) + ", \"" + fsMetaProperty.JsonName + "\", model." + fsMetaProperty.MemberName + ");");
			}
			stringBuilder.AppendLine();
			stringBuilder.AppendLine("            return result;");
			stringBuilder.AppendLine("        }");
			stringBuilder.AppendLine();
			stringBuilder.AppendLine("        protected override fsResult DoDeserialize(Dictionary<string, fsData> data, ref " + text + " model) {");
			stringBuilder.AppendLine("            var result = fsResult.Success;");
			stringBuilder.AppendLine();
			for (int j = 0; j < members.Length; j++)
			{
				fsMetaProperty fsMetaProperty2 = members[j];
				stringBuilder.AppendLine("            var t" + j + " = model." + fsMetaProperty2.MemberName + ";");
				stringBuilder.AppendLine("            result += DeserializeMember(data, " + GetConverterString(fsMetaProperty2) + ", \"" + fsMetaProperty2.JsonName + "\", out t" + j + ");");
				stringBuilder.AppendLine("            model." + fsMetaProperty2.MemberName + " = t" + j + ";");
				stringBuilder.AppendLine();
			}
			stringBuilder.AppendLine("            return result;");
			stringBuilder.AppendLine("        }");
			stringBuilder.AppendLine();
			stringBuilder.AppendLine("        public override object CreateInstance(fsData data, Type storageType) {");
			if (isConstructorPublic)
			{
				stringBuilder.AppendLine("            return new " + text + "();");
			}
			else
			{
				stringBuilder.AppendLine("            return Activator.CreateInstance(typeof(" + text + "), /*nonPublic:*/true);");
			}
			stringBuilder.AppendLine("        }");
			stringBuilder.AppendLine("    }");
			stringBuilder.AppendLine("}");
			return stringBuilder.ToString();
		}
	}
	[CreateAssetMenu(menuName = "Full Serializer AOT Configuration")]
	public class fsAotConfiguration : ScriptableObject
	{
		public enum AotState
		{
			Default,
			Enabled,
			Disabled
		}

		[Serializable]
		public struct Entry
		{
			public AotState State;

			public string FullTypeName;

			public Entry(Type type)
			{
				FullTypeName = type.FullName;
				State = AotState.Default;
			}

			public Entry(Type type, AotState state)
			{
				FullTypeName = type.FullName;
				State = state;
			}
		}

		public List<Entry> aotTypes = new List<Entry>();

		public string outputDirectory = "Assets/AotModels";

		public bool TryFindEntry(Type type, out Entry result)
		{
			string fullName = type.FullName;
			foreach (Entry aotType in aotTypes)
			{
				if (aotType.FullTypeName == fullName)
				{
					result = aotType;
					return true;
				}
			}
			result = default(Entry);
			return false;
		}

		public void UpdateOrAddEntry(Entry entry)
		{
			for (int i = 0; i < aotTypes.Count; i++)
			{
				if (aotTypes[i].FullTypeName == entry.FullTypeName)
				{
					aotTypes[i] = entry;
					return;
				}
			}
			aotTypes.Add(entry);
		}
	}
	public struct fsAotVersionInfo
	{
		public struct Member
		{
			public string MemberName;

			public string JsonName;

			public string StorageType;

			public string OverrideConverterType;

			public Member(fsMetaProperty property)
			{
				MemberName = property.MemberName;
				JsonName = property.JsonName;
				StorageType = property.StorageType.CSharpName(includeNamespace: true);
				OverrideConverterType = null;
				if (property.OverrideConverterType != null)
				{
					OverrideConverterType = property.OverrideConverterType.CSharpName();
				}
			}

			public override bool Equals(object obj)
			{
				if (!(obj is Member))
				{
					return false;
				}
				return this == (Member)obj;
			}

			public override int GetHashCode()
			{
				return MemberName.GetHashCode() + 17 * JsonName.GetHashCode() + 17 * StorageType.GetHashCode() + ((!string.IsNullOrEmpty(OverrideConverterType)) ? (17 * OverrideConverterType.GetHashCode()) : 0);
			}

			public static bool operator ==(Member a, Member b)
			{
				return a.MemberName == b.MemberName && a.JsonName == b.JsonName && a.StorageType == b.StorageType && a.OverrideConverterType == b.OverrideConverterType;
			}

			public static bool operator !=(Member a, Member b)
			{
				return !(a == b);
			}
		}

		public bool IsConstructorPublic;

		public Member[] Members;
	}
	public abstract class fsBaseConverter
	{
		public fsSerializer Serializer;

		public virtual object CreateInstance(fsData data, Type storageType)
		{
			if (RequestCycleSupport(storageType))
			{
				throw new InvalidOperationException("Please override CreateInstance for " + GetType().FullName + "; the object graph for " + storageType?.ToString() + " can contain potentially contain cycles, so separated instance creation is needed");
			}
			return storageType;
		}

		public virtual bool RequestCycleSupport(Type storageType)
		{
			if (storageType == typeof(string))
			{
				return false;
			}
			return storageType.Resolve().IsClass || storageType.Resolve().IsInterface;
		}

		public virtual bool RequestInheritanceSupport(Type storageType)
		{
			return !storageType.Resolve().IsSealed;
		}

		public abstract fsResult TrySerialize(object instance, out fsData serialized, Type storageType);

		public abstract fsResult TryDeserialize(fsData data, ref object instance, Type storageType);

		protected fsResult FailExpectedType(fsData data, params fsDataType[] types)
		{
			return fsResult.Fail(GetType().Name + " expected one of " + string.Join(", ", types.Select((fsDataType t) => t.ToString()).ToArray()) + " but got " + data.Type.ToString() + " in " + data);
		}

		protected fsResult CheckType(fsData data, fsDataType type)
		{
			if (data.Type != type)
			{
				return fsResult.Fail(GetType().Name + " expected " + type.ToString() + " but got " + data.Type.ToString() + " in " + data);
			}
			return fsResult.Success;
		}

		protected fsResult CheckKey(fsData data, string key, out fsData subitem)
		{
			return CheckKey(data.AsDictionary, key, out subitem);
		}

		protected fsResult CheckKey(Dictionary<string, fsData> data, string key, out fsData subitem)
		{
			if (!data.TryGetValue(key, out subitem))
			{
				return fsResult.Fail(GetType().Name + " requires a <" + key + "> key in the data " + data);
			}
			return fsResult.Success;
		}

		protected fsResult SerializeMember<T>(Dictionary<string, fsData> data, Type overrideConverterType, string name, T value)
		{
			fsData data2;
			fsResult result = Serializer.TrySerialize(typeof(T), overrideConverterType, value, out data2);
			if (result.Succeeded)
			{
				data[name] = data2;
			}
			return result;
		}

		protected fsResult DeserializeMember<T>(Dictionary<string, fsData> data, Type overrideConverterType, string name, out T value)
		{
			if (!data.TryGetValue(name, out var value2))
			{
				value = default(T);
				return fsResult.Fail("Unable to find member \"" + name + "\"");
			}
			object result = null;
			fsResult result2 = Serializer.TryDeserialize(value2, typeof(T), overrideConverterType, ref result);
			value = (T)result;
			return result2;
		}
	}
	public static class fsGlobalConfig
	{
		public static bool IsCaseSensitive = true;

		public static bool AllowInternalExceptions = true;

		public static string InternalFieldPrefix = "$";
	}
	public class fsConfig
	{
		public bool CoerceStringsToNumbers = false;

		public string CustomDateTimeFormatString = null;

		public fsMemberSerialization DefaultMemberSerialization = fsMemberSerialization.Default;

		public bool EnablePropertySerialization = true;

		public Func<string, MemberInfo, string> GetJsonNameFromMemberName = (string name, MemberInfo info) => name;

		public Type[] IgnoreSerializeAttributes = new Type[2]
		{
			typeof(NonSerializedAttribute),
			typeof(fsIgnoreAttribute)
		};

		public Type[] IgnoreSerializeTypeAttributes = new Type[1] { typeof(fsIgnoreAttribute) };

		public bool Serialize64BitIntegerAsString = false;

		public Type[] SerializeAttributes = new Type[2]
		{
			typeof(SerializeField),
			typeof(fsPropertyAttribute)
		};

		public bool SerializeEnumsAsInteger = false;

		public bool SerializeNonAutoProperties = false;

		public bool SerializeNonPublicSetProperties = true;
	}
	public sealed class fsContext
	{
		private readonly Dictionary<Type, object> _contextObjects = new Dictionary<Type, object>();

		public void Reset()
		{
			_contextObjects.Clear();
		}

		public void Set<T>(T obj)
		{
			_contextObjects[typeof(T)] = obj;
		}

		public bool Has<T>()
		{
			return _contextObjects.ContainsKey(typeof(T));
		}

		public T Get<T>()
		{
			if (_contextObjects.TryGetValue(typeof(T), out var value))
			{
				return (T)value;
			}
			throw new InvalidOperationException("There is no context object of type " + typeof(T));
		}
	}
	public abstract class fsConverter : fsBaseConverter
	{
		public abstract bool CanProcess(Type type);
	}
	public enum fsDataType
	{
		Array,
		Object,
		Double,
		Int64,
		Boolean,
		String,
		Null
	}
	public sealed class fsData
	{
		private object _value;

		public static readonly fsData True = new fsData(boolean: true);

		public static readonly fsData False = new fsData(boolean: false);

		public static readonly fsData Null = new fsData();

		public fsDataType Type
		{
			get
			{
				if (_value == null)
				{
					return fsDataType.Null;
				}
				if (_value is double)
				{
					return fsDataType.Double;
				}
				if (_value is long)
				{
					return fsDataType.Int64;
				}
				if (_value is bool)
				{
					return fsDataType.Boolean;
				}
				if (_value is string)
				{
					return fsDataType.String;
				}
				if (_value is Dictionary<string, fsData>)
				{
					return fsDataType.Object;
				}
				if (_value is List<fsData>)
				{
					return fsDataType.Array;
				}
				throw new InvalidOperationException("unknown JSON data type");
			}
		}

		public bool IsNull => _value == null;

		public bool IsDouble => _value is double;

		public bool IsInt64 => _value is long;

		public bool IsBool => _value is bool;

		public bool IsString => _value is string;

		public bool IsDictionary => _value is Dictionary<string, fsData>;

		public bool IsList => _value is List<fsData>;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		public double AsDouble => Cast<double>();

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		public long AsInt64 => Cast<long>();

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		public bool AsBool => Cast<bool>();

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		public string AsString => Cast<string>();

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		public Dictionary<string, fsData> AsDictionary => Cast<Dictionary<string, fsData>>();

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		public List<fsData> AsList => Cast<List<fsData>>();

		public override string ToString()
		{
			return fsJsonPrinter.CompressedJson(this);
		}

		public fsData()
		{
			_value = null;
		}

		public fsData(bool boolean)
		{
			_value = boolean;
		}

		public fsData(double f)
		{
			_value = f;
		}

		public fsData(long i)
		{
			_value = i;
		}

		public fsData(string str)
		{
			_value = str;
		}

		public fsData(Dictionary<string, fsData> dict)
		{
			_value = dict;
		}

		public fsData(List<fsData> list)
		{
			_value = list;
		}

		public static fsData CreateDictionary()
		{
			return new fsData(new Dictionary<string, fsData>(fsGlobalConfig.IsCaseSensitive ? StringComparer.Ordinal : StringComparer.OrdinalIgnoreCase));
		}

		public static fsData CreateList()
		{
			return new fsData(new List<fsData>());
		}

		public static fsData CreateList(int capacity)
		{
			return new fsData(new List<fsData>(capacity));
		}

		internal void BecomeDictionary()
		{
			_value = new Dictionary<string, fsData>();
		}

		internal fsData Clone()
		{
			fsData fsData2 = new fsData();
			fsData2._value = _value;
			return fsData2;
		}

		private T Cast<T>()
		{
			if (_value is T)
			{
				return (T)_value;
			}
			throw new InvalidCastException("Unable to cast <" + this?.ToString() + "> (with type = " + _value.GetType()?.ToString() + ") to type " + typeof(T));
		}

		public override bool Equals(object obj)
		{
			return Equals(obj as fsData);
		}

		public bool Equals(fsData other)
		{
			if (other == null || Type != other.Type)
			{
				return false;
			}
			switch (Type)
			{
			case fsDataType.Null:
				return true;
			case fsDataType.Double:
				return AsDouble == other.AsDouble || Math.Abs(AsDouble - other.AsDouble) < double.Epsilon;
			case fsDataType.Int64:
				return AsInt64 == other.AsInt64;
			case fsDataType.Boolean:
				return AsBool == other.AsBool;
			case fsDataType.String:
				return AsString == other.AsString;
			case fsDataType.Array:
			{
				List<fsData> asList = AsList;
				List<fsData> asList2 = other.AsList;
				if (asList.Count != asList2.Count)
				{
					return false;
				}
				for (int i = 0; i < asList.Count; i++)
				{
					if (!asList[i].Equals(asList2[i]))
					{
						return false;
					}
				}
				return true;
			}
			case fsDataType.Object:
			{
				Dictionary<string, fsData> asDictionary = AsDictionary;
				Dictionary<string, fsData> asDictionary2 = other.AsDictionary;
				if (asDictionary.Count != asDictionary2.Count)
				{
					return false;
				}
				foreach (string key in asDictionary.Keys)
				{
					if (!asDictionary2.ContainsKey(key))
					{
						return false;
					}
					if (!asDictionary[key].Equals(asDictionary2[key]))
					{
						return false;
					}
				}
				return true;
			}
			default:
				throw new Exception("Unknown data type");
			}
		}

		public static bool operator ==(fsData a, fsData b)
		{
			if ((object)a == b)
			{
				return true;
			}
			if ((object)a == null || (object)b == null)
			{
				return false;
			}
			if (a.IsDouble && b.IsDouble)
			{
				return Math.Abs(a.AsDouble - b.AsDouble) < double.Epsilon;
			}
			return a.Equals(b);
		}

		public static bool operator !=(fsData a, fsData b)
		{
			return !(a == b);
		}

		public override int GetHashCode()
		{
			return _value.GetHashCode();
		}
	}
	public abstract class fsDirectConverter : fsBaseConverter
	{
		public abstract Type ModelType { get; }
	}
	public abstract class fsDirectConverter<TModel> : fsDirectConverter
	{
		public override Type ModelType => typeof(TModel);

		public sealed override fsResult TrySerialize(object instance, out fsData serialized, Type storageType)
		{
			Dictionary<string, fsData> dictionary = new Dictionary<string, fsData>();
			fsResult result = DoSerialize((TModel)instance, dictionary);
			serialized = new fsData(dictionary);
			return result;
		}

		public sealed override fsResult TryDeserialize(fsData data, ref object instance, Type storageType)
		{
			fsResult success = fsResult.Success;
			fsResult fsResult2 = (success += CheckType(data, fsDataType.Object));
			if (fsResult2.Failed)
			{
				return success;
			}
			TModel model = (TModel)instance;
			success += DoDeserialize(data.AsDictionary, ref model);
			instance = model;
			return success;
		}

		protected abstract fsResult DoSerialize(TModel model, Dictionary<string, fsData> serialized);

		protected abstract fsResult DoDeserialize(Dictionary<string, fsData> data, ref TModel model);
	}
	public sealed class fsMissingVersionConstructorException : Exception
	{
		public fsMissingVersionConstructorException(Type versionedType, Type constructorType)
			: base(versionedType?.ToString() + " is missing a constructor for previous model type " + constructorType)
		{
		}
	}
	public sealed class fsDuplicateVersionNameException : Exception
	{
		public fsDuplicateVersionNameException(Type typeA, Type typeB, string version)
			: base(typeA?.ToString() + " and " + typeB?.ToString() + " have the same version string (" + version + "); please change one of them.")
		{
		}
	}
	public interface fsIAotConverter
	{
		Type ModelType { get; }

		fsAotVersionInfo VersionInfo { get; }
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field)]
	public sealed class fsIgnoreAttribute : Attribute
	{
	}
	public interface fsISerializationCallbacks
	{
		void OnBeforeSerialize(Type storageType);

		void OnAfterSerialize(Type storageType, ref fsData data);

		void OnBeforeDeserialize(Type storageType, ref fsData data);

		void OnAfterDeserialize(Type storageType);
	}
	public class fsJsonParser
	{
		private readonly StringBuilder _cachedStringBuilder = new StringBuilder(256);

		private readonly string _input;

		private int _start;

		private fsJsonParser(string input)
		{
			_input = input;
			_start = 0;
		}

		private fsResult MakeFailure(string message)
		{
			int num = Math.Max(0, _start - 20);
			int length = Math.Min(50, _input.Length - num);
			string warning = "Error while parsing: " + message + "; context = <" + _input.Substring(num, length) + ">";
			return fsResult.Fail(warning);
		}

		private bool TryMoveNext()
		{
			if (_start < _input.Length)
			{
				_start++;
				return true;
			}
			return false;
		}

		private bool HasValue()
		{
			return HasValue(0);
		}

		private bool HasValue(int offset)
		{
			return _start + offset >= 0 && _start + offset < _input.Length;
		}

		private char Character()
		{
			return Character(0);
		}

		private char Character(int offset)
		{
			return _input[_start + offset];
		}

		private void SkipSpace()
		{
			while (HasValue())
			{
				char c = Character();
				if (char.IsWhiteSpace(c))
				{
					TryMoveNext();
					continue;
				}
				if (!HasValue(1) || Character(0) != '/')
				{
					break;
				}
				if (Character(1) == '/')
				{
					while (HasValue() && !Environment.NewLine.Contains(Character().ToString() ?? ""))
					{
						TryMoveNext();
					}
				}
				else
				{
					if (Character(1) != '*')
					{
						continue;
					}
					TryMoveNext();
					TryMoveNext();
					while (HasValue(1))
					{
						if (Character(0) == '*' && Character(1) == '/')
						{
							TryMoveNext();
							TryMoveNext();
							TryMoveNext();
							break;
						}
						TryMoveNext();
					}
				}
			}
		}

		private fsResult TryParseExact(string content)
		{
			for (int i = 0; i < content.Length; i++)
			{
				if (Character() != content[i])
				{
					return MakeFailure("Expected " + content[i]);
				}
				if (!TryMoveNext())
				{
					return MakeFailure("Unexpected end of content when parsing " + content);
				}
			}
			return fsResult.Success;
		}

		private fsResult TryParseTrue(out fsData data)
		{
			fsResult result = TryParseExact("true");
			if (result.Succeeded)
			{
				data = new fsData(boolean: true);
				return fsResult.Success;
			}
			data = null;
			return result;
		}

		private fsResult TryParseFalse(out fsData data)
		{
			fsResult result = TryParseExact("false");
			if (result.Succeeded)
			{
				data = new fsData(boolean: false);
				return fsResult.Success;
			}
			data = null;
			return result;
		}

		private fsResult TryParseNull(out fsData data)
		{
			fsResult result = TryParseExact("null");
			if (result.Succeeded)
			{
				data = new fsData();
				return fsResult.Success;
			}
			data = null;
			return result;
		}

		private bool IsSeparator(char c)
		{
			return char.IsWhiteSpace(c) || c == ',' || c == '}' || c == ']';
		}

		private fsResult TryParseNumber(out fsData data)
		{
			int start = _start;
			while (TryMoveNext() && HasValue() && !IsSeparator(Character()))
			{
			}
			string text = _input.Substring(start, _start - start);
			if (text.Contains(".") || text.Contains("e") || text.Contains("E") || text == "Infinity" || text == "-Infinity" || text == "NaN")
			{
				if (!double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out var result))
				{
					data = null;
					return MakeFailure("Bad double format with " + text);
				}
				data = new fsData(result);
				return fsResult.Success;
			}
			if (!long.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out var result2))
			{
				data = null;
				return MakeFailure("Bad Int64 format with " + text);
			}
			data = new fsData(result2);
			return fsResult.Success;
		}

		private fsResult TryParseString(out string str)
		{
			_cachedStringBuilder.Length = 0;
			if (Character() != '"' || !TryMoveNext())
			{
				str = string.Empty;
				return MakeFailure("Expected initial \" when parsing a string");
			}
			while (HasValue() && Character() != '"')
			{
				char c = Character();
				if (c == '\\')
				{
					char escaped;
					fsResult result = TryUnescapeChar(out escaped);
					if (result.Failed)
					{
						str = string.Empty;
						return result;
					}
					_cachedStringBuilder.Append(escaped);
				}
				else
				{
					_cachedStringBuilder.Append(c);
					if (!TryMoveNext())
					{
						str = string.Empty;
						return MakeFailure("Unexpected end of input when reading a string");
					}
				}
			}
			if (!HasValue() || Character() != '"' || !TryMoveNext())
			{
				str = string.Empty;
				return MakeFailure("No closing \" when parsing a string");
			}
			str = _cachedStringBuilder.ToString();
			return fsResult.Success;
		}

		private fsResult TryParseArray(out fsData arr)
		{
			if (Character() != '[')
			{
				arr = null;
				return MakeFailure("Expected initial [ when parsing an array");
			}
			if (!TryMoveNext())
			{
				arr = null;
				return MakeFailure("Unexpected end of input when parsing an array");
			}
			SkipSpace();
			List<fsData> list = new List<fsData>();
			while (HasValue() && Character() != ']')
			{
				fsData data;
				fsResult result = RunParse(out data);
				if (result.Failed)
				{
					arr = null;
					return result;
				}
				list.Add(data);
				SkipSpace();
				if (HasValue() && Character() == ',')
				{
					if (!TryMoveNext())
					{
						break;
					}
					SkipSpace();
				}
			}
			if (!HasValue() || Character() != ']' || !TryMoveNext())
			{
				arr = null;
				return MakeFailure("No closing ] for array");
			}
			arr = new fsData(list);
			return fsResult.Success;
		}

		private fsResult TryParseObject(out fsData obj)
		{
			if (Character() != '{')
			{
				obj = null;
				return MakeFailure("Expected initial { when parsing an object");
			}
			if (!TryMoveNext())
			{
				obj = null;
				return MakeFailure("Unexpected end of input when parsing an object");
			}
			SkipSpace();
			Dictionary<string, fsData> dictionary = new Dictionary<string, fsData>(fsGlobalConfig.IsCaseSensitive ? StringComparer.Ordinal : StringComparer.OrdinalIgnoreCase);
			while (HasValue() && Character() != '}')
			{
				SkipSpace();
				fsResult result = TryParseString(out var str);
				if (result.Failed)
				{
					obj = null;
					return result;
				}
				SkipSpace();
				if (!HasValue() || Character() != ':' || !TryMoveNext())
				{
					obj = null;
					return MakeFailure("Expected : after key \"" + str + "\"");
				}
				SkipSpace();
				result = RunParse(out var data);
				if (result.Failed)
				{
					obj = null;
					return result;
				}
				dictionary.Add(str, data);
				SkipSpace();
				if (HasValue() && Character() == ',')
				{
					if (!TryMoveNext())
					{
						break;
					}
					SkipSpace();
				}
			}
			if (!HasValue() || Character() != '}' || !TryMoveNext())
			{
				obj = null;
				return MakeFailure("No closing } for object");
			}
			obj = new fsData(dictionary);
			return fsResult.Success;
		}

		private fsResult RunParse(out fsData data)
		{
			SkipSpace();
			if (!HasValue())
			{
				data = null;
				return MakeFailure("Unexpected end of input");
			}
			switch (Character())
			{
			case '+':
			case '-':
			case '.':
			case '0':
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':
			case 'I':
			case 'N':
				return TryParseNumber(out data);
			case '"':
			{
				string str;
				fsResult result = TryParseString(out str);
				if (result.Failed)
				{
					data = null;
					return result;
				}
				data = new fsData(str);
				return fsResult.Success;
			}
			case '[':
				return TryParseArray(out data);
			case '{':
				return TryParseObject(out data);
			case 't':
				return TryParseTrue(out data);
			case 'f':
				return TryParseFalse(out data);
			case 'n':
				return TryParseNull(out data);
			default:
				data = null;
				return MakeFailure("unable to parse; invalid token \"" + Character() + "\"");
			}
		}

		public static fsResult Parse(string input, out fsData data)
		{
			if (string.IsNullOrEmpty(input))
			{
				data = null;
				return fsResult.Fail("No input");
			}
			fsJsonParser fsJsonParser2 = new fsJsonParser(input);
			return fsJsonParser2.RunParse(out data);
		}

		public static fsData Parse(string input)
		{
			Parse(input, out var data).AssertSuccess();
			return data;
		}

		private bool IsHex(char c)
		{
			return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
		}

		private uint ParseSingleChar(char c1, uint multipliyer)
		{
			uint result = 0u;
			if (c1 >= '0' && c1 <= '9')
			{
				result = (uint)(c1 - 48) * multipliyer;
			}
			else if (c1 >= 'A' && c1 <= 'F')
			{
				result = (uint)(c1 - 65 + 10) * multipliyer;
			}
			else if (c1 >= 'a' && c1 <= 'f')
			{
				result = (uint)(c1 - 97 + 10) * multipliyer;
			}
			return result;
		}

		private uint ParseUnicode(char c1, char c2, char c3, char c4)
		{
			uint num = ParseSingleChar(c1, 4096u);
			uint num2 = ParseSingleChar(c2, 256u);
			uint num3 = ParseSingleChar(c3, 16u);
			uint num4 = ParseSingleChar(c4, 1u);
			return num + num2 + num3 + num