Decompiled source of SCT BuildUpgrade Scanner v1.1.1

plugins/SCTBuildUpgrade.Scanner.dll

Decompiled an hour ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text.Json;
using System.Threading;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppSystem.Collections.Generic;
using Microsoft.CodeAnalysis;
using SCTCommon;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("SCTBuildUpgrade.Scanner")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("SCTBuildUpgrade.Scanner")]
[assembly: AssemblyTitle("SCTBuildUpgrade.Scanner")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace SCTCommon
{
	internal static class Il2CppUtil
	{
		public static bool IsPlayer(Driller driller)
		{
			if (driller != null)
			{
				return (Object)(object)((Il2CppObjectBase)driller).TryCast<Player>() != (Object)null;
			}
			return false;
		}

		public static string Guid(BasePlugin plugin)
		{
			return MetadataHelper.GetMetadata((object)plugin).GUID;
		}

		public static IEnumerable<PluginInfo> Plugins()
		{
			if (IL2CPPChainloader.Instance == null)
			{
				yield break;
			}
			foreach (PluginInfo value in ((BaseChainloader<BasePlugin>)(object)IL2CPPChainloader.Instance).Plugins.Values)
			{
				yield return value;
			}
		}
	}
	internal static class Safe
	{
		private static readonly ManualLogSource Log = Logger.CreateLogSource("SCT Safe");

		private static readonly HashSet<string> Reported = new HashSet<string>();

		public static void Run(string where, Action action)
		{
			try
			{
				action();
			}
			catch (Exception e)
			{
				Report(where, e);
			}
		}

		public static bool Prefix(string where, Func<bool> prefix)
		{
			try
			{
				return prefix();
			}
			catch (Exception e)
			{
				Report(where, e);
				return true;
			}
		}

		private static void Report(string where, Exception e)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			if (Reported.Add(where + e.GetType().Name + e.Message))
			{
				bool flag = default(bool);
				BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(33, 4, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(where);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" : ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.GetType().Name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" : ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.Message);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" (ignoré, le jeu continue)\n");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.StackTrace);
				}
				Log.LogError(val);
			}
		}
	}
	internal static class Vanilla
	{
		private const string Key = "sct.vanilla";

		public static bool Active
		{
			get
			{
				object data = AppDomain.CurrentDomain.GetData("sct.vanilla");
				bool flag = default(bool);
				int num;
				if (data is bool)
				{
					flag = (bool)data;
					num = 1;
				}
				else
				{
					num = 0;
				}
				return (byte)((uint)num & (flag ? 1u : 0u)) != 0;
			}
		}

		public static void Set(bool active)
		{
			AppDomain.CurrentDomain.SetData("sct.vanilla", active);
		}
	}
	internal static class Lang
	{
		public static bool IsFrench
		{
			get
			{
				try
				{
					Locale selectedLocale = LocalizationSettings.SelectedLocale;
					return ((selectedLocale != null) ? selectedLocale.Identifier.Code : null)?.StartsWith("fr", StringComparison.OrdinalIgnoreCase) ?? false;
				}
				catch (Exception)
				{
					return false;
				}
			}
		}

		public static string Pick(string fr, string en)
		{
			if (!IsFrench)
			{
				return en;
			}
			return fr;
		}
	}
	internal static class SaveSlotApi
	{
		private const string VersionKey = "sct.saveslot.version";

		public const string Prefix = "sct_";

		public static string Directory => GameInstance.SaveDirectory;

		public static int Version
		{
			get
			{
				object data = AppDomain.CurrentDomain.GetData("sct.saveslot.version");
				if (data is int)
				{
					return (int)data;
				}
				return 0;
			}
		}

		public static string PathOf(string name)
		{
			return Path.Combine(Directory, "sct_" + name);
		}

		public static void BumpVersion()
		{
			AppDomain.CurrentDomain.SetData("sct.saveslot.version", Version + 1);
		}

		public static void Migrate(string oldPath, string name)
		{
			try
			{
				string text = PathOf(name);
				if (File.Exists(oldPath) && !File.Exists(text))
				{
					File.Move(oldPath, text);
				}
			}
			catch (Exception)
			{
			}
		}
	}
	internal static class GameInstance
	{
		private const string IndexKey = "sct.instance.index";

		private const string MutexKey = "sct.instance.mutex";

		private const string ErrorKey = "sct.instance.error";

		private const string MutexName = "SCT_SpaceCatDigger_Instance_";

		public const int Max = 4;

		public static int Index
		{
			get
			{
				object data = AppDomain.CurrentDomain.GetData("sct.instance.index");
				if (data is int)
				{
					return (int)data;
				}
				int i = 0;
				Mutex data2 = null;
				for (; i < 4; i++)
				{
					bool createdNew;
					Mutex mutex = new Mutex(initiallyOwned: false, "SCT_SpaceCatDigger_Instance_" + i, out createdNew);
					if (createdNew)
					{
						data2 = mutex;
						break;
					}
					mutex.Dispose();
				}
				AppDomain.CurrentDomain.SetData("sct.instance.mutex", data2);
				AppDomain.CurrentDomain.SetData("sct.instance.index", i);
				if (i > 0)
				{
					PrepareTestSaves(i);
				}
				return i;
			}
		}

		public static bool IsTest => Index > 0;

		public static string Suffix
		{
			get
			{
				if (!IsTest)
				{
					return "";
				}
				return "_test" + (Index + 1);
			}
		}

		public static string SaveDirectory => DirectoryOf(Index);

		public static string Error => AppDomain.CurrentDomain.GetData("sct.instance.error") as string;

		private static string DirectoryOf(int index)
		{
			if (index <= 0)
			{
				return Application.persistentDataPath;
			}
			return Path.Combine(Application.persistentDataPath, "coop_test_" + (index + 1));
		}

		public static int OthersRunning()
		{
			int index = Index;
			int num = 0;
			for (int i = 0; i < 4; i++)
			{
				if (i != index && Mutex.TryOpenExisting("SCT_SpaceCatDigger_Instance_" + i, out Mutex result))
				{
					result.Dispose();
					num++;
				}
			}
			return num;
		}

		private static void PrepareTestSaves(int index)
		{
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Expected O, but got Unknown
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Expected O, but got Unknown
			ManualLogSource val = Logger.CreateLogSource("SCT Instance");
			bool flag = default(bool);
			try
			{
				string persistentDataPath = Application.persistentDataPath;
				string text = DirectoryOf(index);
				Directory.CreateDirectory(text);
				string[] files = Directory.GetFiles(text);
				for (int i = 0; i < files.Length; i++)
				{
					File.Delete(files[i]);
				}
				files = Directory.GetFiles(persistentDataPath);
				foreach (string text2 in files)
				{
					string fileName = Path.GetFileName(text2);
					if (fileName == "persistent.save" || fileName.StartsWith("sct_", StringComparison.Ordinal))
					{
						File.Copy(text2, Path.Combine(text, fileName), overwrite: true);
					}
				}
				string text3 = text + "/game.save";
				string text4 = text + "/persistent.save";
				SaveSystem.GameFileName = text3;
				SaveSystem.PersistentFileName = text4;
				if (SaveSystem.GameFileName != text3 || SaveSystem.PersistentFileName != text4)
				{
					throw new InvalidOperationException("chemins de sauvegarde du jeu non modifiables");
				}
				BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(58, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Exemplaire n° ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(index + 1);
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" du jeu sur ce PC : sauvegarde de test dans ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(text);
				}
				val.LogInfo(val2);
			}
			catch (Exception ex)
			{
				AppDomain.CurrentDomain.SetData("sct.instance.error", ex.Message);
				BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(97, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("Exemplaire n° ");
					((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<int>(index + 1);
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" : sauvegarde de test impossible (");
					((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(ex.Message);
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("). CET EXEMPLAIRE ÉCRIT DANS LA VRAIE SAUVEGARDE.");
				}
				val.LogError(val3);
			}
		}
	}
	internal enum ColorVision
	{
		Normal,
		Protanopia,
		Deuteranopia,
		Tritanopia
	}
	internal static class Palette
	{
		public const string VisionKey = "sct.colorblind.vision";

		public const string RedundantKey = "sct.colorblind.redundant";

		private static readonly Color Black = C(0);

		private static readonly Color Orange = C(15113984);

		private static readonly Color SkyBlue = C(5682409);

		private static readonly Color Green = C(40563);

		private static readonly Color Yellow = C(15787074);

		private static readonly Color Blue = C(29362);

		private static readonly Color Vermillion = C(13983232);

		private static readonly Color Purple = C(13400487);

		private static readonly Color White = C(16777215);

		private static readonly Color Grey = C(7237230);

		public static ColorVision Vision
		{
			get
			{
				object data = AppDomain.CurrentDomain.GetData("sct.colorblind.vision");
				if (data is int)
				{
					return (ColorVision)(int)data;
				}
				return ColorVision.Normal;
			}
		}

		public static bool Adapted => Vision != ColorVision.Normal;

		public static bool Redundant
		{
			get
			{
				if (Adapted)
				{
					object data = AppDomain.CurrentDomain.GetData("sct.colorblind.redundant");
					bool flag = default(bool);
					int num;
					if (data is bool)
					{
						flag = (bool)data;
						num = 1;
					}
					else
					{
						num = 0;
					}
					return num == 0 || flag;
				}
				return false;
			}
		}

		private static bool RedGreen
		{
			get
			{
				if (Vision != ColorVision.Protanopia)
				{
					return Vision == ColorVision.Deuteranopia;
				}
				return true;
			}
		}

		public static Color Good(Color usual)
		{
			//IL_001a: 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_000e: Unknown result type (might be due to invalid IL or missing references)
			if (Adapted)
			{
				if (!RedGreen)
				{
					return Green;
				}
				return SkyBlue;
			}
			return usual;
		}

		public static Color Bad(Color usual)
		{
			//IL_000d: 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)
			if (Adapted)
			{
				return Vermillion;
			}
			return usual;
		}

		public static Color Warning(Color usual)
		{
			//IL_001a: 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_000e: Unknown result type (might be due to invalid IL or missing references)
			if (Adapted)
			{
				if (!RedGreen)
				{
					return Orange;
				}
				return Yellow;
			}
			return usual;
		}

		public static Color Danger(Color usual)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			if (Adapted)
			{
				if (!RedGreen)
				{
					return C(16719904);
				}
				return Vermillion;
			}
			return usual;
		}

		public static Color Accent(Color usual)
		{
			//IL_001a: 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_000e: Unknown result type (might be due to invalid IL or missing references)
			if (Adapted)
			{
				if (!RedGreen)
				{
					return Purple;
				}
				return SkyBlue;
			}
			return usual;
		}

		public static string GoodHex(string usual = "80ff80")
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			if (!Adapted)
			{
				return usual;
			}
			return Hex(Good(White));
		}

		public static string BadHex(string usual = "ff8080")
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			if (!Adapted)
			{
				return usual;
			}
			return Hex(Bad(White));
		}

		public static string WarningHex(string usual = "ffcc66")
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			if (!Adapted)
			{
				return usual;
			}
			return Hex(Warning(White));
		}

		public static Color Ore(ResourceType type, Color usual)
		{
			//IL_0012: 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_004e: Expected I4, but got Unknown
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: 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)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			if (!Adapted)
			{
				return usual;
			}
			bool flag = Vision == ColorVision.Tritanopia;
			switch (type - 2)
			{
			case 9:
				return Grey;
			case 0:
				if (!flag)
				{
					return Blue;
				}
				return Vermillion;
			case 2:
				return Orange;
			case 4:
				return White;
			case 6:
				if (!flag)
				{
					return Yellow;
				}
				return C(16756912);
			case 8:
				return SkyBlue;
			case 10:
				if (!flag)
				{
					return Purple;
				}
				return Blue;
			case 11:
				if (!flag)
				{
					return Green;
				}
				return C(8323072);
			case 12:
				if (!flag)
				{
					return Vermillion;
				}
				return Black;
			default:
				return usual;
			}
		}

		public static Color Tier(int level, Color usual)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			if (!Adapted || level <= 0)
			{
				return usual;
			}
			Color[] array = (Color[])(object)((Vision != ColorVision.Tritanopia) ? new Color[4] { Blue, Orange, White, Yellow } : new Color[4] { SkyBlue, Vermillion, White, Purple });
			return array[Mathf.Clamp(level, 1, array.Length) - 1];
		}

		public static Color Marker(int index, Color usual)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			if (!Adapted)
			{
				return usual;
			}
			Color[] array = (Color[])(object)((Vision != ColorVision.Tritanopia) ? new Color[5] { Yellow, SkyBlue, Orange, White, Purple } : new Color[5]
			{
				Vermillion,
				White,
				SkyBlue,
				C(16756912),
				Green
			});
			return array[Math.Abs(index) % array.Length];
		}

		public static float Blink(float speed = 3f)
		{
			if (!Redundant)
			{
				return 1f;
			}
			return 0.45f + 0.55f * Mathf.Abs(Mathf.Sin(Time.unscaledTime * speed));
		}

		public static string Hex(Color c)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			return $"{Mathf.RoundToInt(Mathf.Clamp01(c.r) * 255f):X2}{Mathf.RoundToInt(Mathf.Clamp01(c.g) * 255f):X2}{Mathf.RoundToInt(Mathf.Clamp01(c.b) * 255f):X2}";
		}

		private static Color C(int rgb)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			return new Color((float)((rgb >> 16) & 0xFF) / 255f, (float)((rgb >> 8) & 0xFF) / 255f, (float)(rgb & 0xFF) / 255f);
		}
	}
	internal static class CraftCosts
	{
		private const string OwnerKey = "sct.craft.owner";

		private const string ProvidersKey = "sct.craft.providers";

		private const float MinFactor = 0.25f;

		private const int MaxBuildId = 512;

		private static readonly Dictionary<int, int[]> Originals = new Dictionary<int, int[]>();

		private static float _appliedFactor = 1f;

		private static bool _isOwner;

		public static float Factor
		{
			get
			{
				float num = 1f;
				if (AppDomain.CurrentDomain.GetData("sct.craft.providers") is Dictionary<string, Func<float>> dictionary)
				{
					foreach (Func<float> value in dictionary.Values)
					{
						try
						{
							num *= 1f - Mathf.Clamp(value(), 0f, 0.9f);
						}
						catch (Exception)
						{
						}
					}
				}
				return Mathf.Max(0.25f, num);
			}
		}

		public static void RegisterDiscount(string id, Func<float> discount)
		{
			lock (AppDomain.CurrentDomain)
			{
				Dictionary<string, Func<float>> dictionary = (AppDomain.CurrentDomain.GetData("sct.craft.providers") as Dictionary<string, Func<float>>) ?? new Dictionary<string, Func<float>>();
				dictionary[id] = discount;
				AppDomain.CurrentDomain.SetData("sct.craft.providers", dictionary);
			}
		}

		public static void Install(Harmony harmony, string owner)
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			lock (AppDomain.CurrentDomain)
			{
				if (AppDomain.CurrentDomain.GetData("sct.craft.owner") != null)
				{
					return;
				}
				AppDomain.CurrentDomain.SetData("sct.craft.owner", owner);
				_isOwner = true;
			}
			HarmonyMethod val = new HarmonyMethod(typeof(CraftCosts), "SyncPrefix", (Type[])null);
			string[] array = new string[3] { "Open", "RefreshCostItems", "TryPurchase" };
			foreach (string text in array)
			{
				MethodInfo methodInfo = AccessTools.Method(typeof(CraftMenu), text, (Type[])null, (Type[])null);
				if (methodInfo != null)
				{
					harmony.Patch((MethodBase)methodInfo, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				}
			}
		}

		private static void SyncPrefix()
		{
			Safe.Run("Coûts de craft", Sync);
		}

		public static void Sync()
		{
			//IL_002f: 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_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			if (!_isOwner)
			{
				return;
			}
			Dictionary<BuildType, List<ResourceTypeQuantity>> craftingCosts = CraftMenu._craftingCosts;
			if (craftingCosts == null)
			{
				return;
			}
			float factor = Factor;
			bool flag = !Mathf.Approximately(factor, _appliedFactor);
			for (int i = 0; i < 512; i++)
			{
				BuildType val = (BuildType)i;
				if (!craftingCosts.ContainsKey(val))
				{
					continue;
				}
				List<ResourceTypeQuantity> val2 = craftingCosts[val];
				if (!Originals.TryGetValue(i, out var value) || value.Length != val2.Count)
				{
					value = new int[val2.Count];
					for (int j = 0; j < val2.Count; j++)
					{
						value[j] = val2[j].quantity;
					}
					Originals[i] = value;
					flag = true;
				}
				if (flag)
				{
					for (int k = 0; k < val2.Count; k++)
					{
						ResourceTypeQuantity val3 = val2[k];
						val3.quantity = ((factor >= 1f) ? value[k] : Mathf.Max(1, Mathf.CeilToInt((float)value[k] * factor)));
						val2[k] = val3;
					}
				}
			}
			_appliedFactor = factor;
		}

		public static void AddRecipe(BuildType type, params (ResourceType Resource, int Quantity)[] ingredients)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: 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)
			//IL_0043: 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)
			Dictionary<BuildType, List<ResourceTypeQuantity>> craftingCosts = CraftMenu._craftingCosts;
			List<ResourceTypeQuantity> val = new List<ResourceTypeQuantity>();
			for (int i = 0; i < ingredients.Length; i++)
			{
				var (resourceType, quantity) = ingredients[i];
				val.Add(new ResourceTypeQuantity
				{
					resourceType = resourceType,
					quantity = quantity
				});
			}
			craftingCosts[type] = val;
		}
	}
	internal static class RefundBonus
	{
		private const string ProvidersKey = "sct.refund.providers";

		private const string ActiveKey = "sct.refund.active";

		public static bool SalvageActive
		{
			get
			{
				if (!(AppDomain.CurrentDomain.GetData("sct.refund.active") is Dictionary<string, Func<bool>> dictionary))
				{
					return false;
				}
				foreach (Func<bool> value in dictionary.Values)
				{
					try
					{
						if (value())
						{
							return true;
						}
					}
					catch (Exception)
					{
					}
				}
				return false;
			}
		}

		public static float Total
		{
			get
			{
				float num = 0f;
				if (AppDomain.CurrentDomain.GetData("sct.refund.providers") is Dictionary<string, Func<float>> dictionary)
				{
					foreach (Func<float> value in dictionary.Values)
					{
						try
						{
							num += Mathf.Max(0f, value());
						}
						catch (Exception)
						{
						}
					}
				}
				return num;
			}
		}

		public static void Register(string id, Func<float> bonus, Func<bool> active)
		{
			lock (AppDomain.CurrentDomain)
			{
				Dictionary<string, Func<float>> dictionary = (AppDomain.CurrentDomain.GetData("sct.refund.providers") as Dictionary<string, Func<float>>) ?? new Dictionary<string, Func<float>>();
				dictionary[id] = bonus;
				AppDomain.CurrentDomain.SetData("sct.refund.providers", dictionary);
				Dictionary<string, Func<bool>> dictionary2 = (AppDomain.CurrentDomain.GetData("sct.refund.active") as Dictionary<string, Func<bool>>) ?? new Dictionary<string, Func<bool>>();
				dictionary2[id] = active;
				AppDomain.CurrentDomain.SetData("sct.refund.active", dictionary2);
			}
		}
	}
	internal static class SctGui
	{
		public const float LineHeight = 22f;

		public const float Gap = 4f;

		private static readonly ManualLogSource Log = Logger.CreateLogSource("SctGui");

		private static readonly HashSet<string> Reported = new HashSet<string>();

		private static bool _useBroken;

		private static readonly HashSet<int> ClickLogged = new HashSet<int>();

		private static GUIStyle _button;

		private static GUIStyle _buttonHover;

		private static GUIStyle _buttonOn;

		private static GUIStyle _check;

		private static GUIStyle _label;

		private static GUIStyle _richBox;

		private static GUIStyle _buttonToggle;

		public static GUIStyle Label
		{
			get
			{
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0025: Unknown result type (might be due to invalid IL or missing references)
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				//IL_0049: Expected O, but got Unknown
				//IL_0059: Unknown result type (might be due to invalid IL or missing references)
				if (_label == null)
				{
					GUIStyle label = GUI.skin.label;
					_label = new GUIStyle
					{
						richText = true,
						wordWrap = false,
						alignment = (TextAnchor)3,
						fontSize = label.fontSize,
						padding = label.padding
					};
					_label.normal.textColor = label.normal.textColor;
				}
				return _label;
			}
		}

		public static GUIStyle ButtonToggle => _buttonToggle ?? (_buttonToggle = GUI.skin.button);

		public static GUIStyle RichBox => _richBox ?? (_richBox = BoxStyle(13, (TextAnchor)0));

		public static bool Contains(Rect r, Vector2 p)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: 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)
			if (p.x >= ((Rect)(ref r)).x && p.x < ((Rect)(ref r)).x + ((Rect)(ref r)).width && p.y >= ((Rect)(ref r)).y)
			{
				return p.y < ((Rect)(ref r)).y + ((Rect)(ref r)).height;
			}
			return false;
		}

		public static void Use(Event e)
		{
			if (_useBroken)
			{
				return;
			}
			try
			{
				e.Use();
			}
			catch (Exception e2)
			{
				_useBroken = true;
				Report("Event.Use", e2);
			}
		}

		public static void NoteClick(int owner, Vector2 position)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			//IL_0039: 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)
			if (ClickLogged.Add(owner))
			{
				bool flag = default(bool);
				BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(36, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Fenêtre ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(owner);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" : premier clic reçu en (");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(position.x, "0");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(position.y, "0");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(")");
				}
				Log.LogInfo(val);
			}
		}

		private static GUIStyle CopyState(GUIStyle source, GUIStyleState state, TextAnchor alignment)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Expected O, but got Unknown
			GUIStyle val = new GUIStyle
			{
				alignment = alignment,
				richText = true,
				fontSize = source.fontSize,
				border = source.border,
				padding = source.padding,
				wordWrap = false
			};
			val.normal.background = state.background;
			val.normal.textColor = state.textColor;
			return val;
		}

		public static void DrawButton(Rect rect, string text, bool on)
		{
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			if (_button == null)
			{
				GUIStyle button = GUI.skin.button;
				_button = CopyState(button, button.normal, (TextAnchor)4);
				_buttonHover = CopyState(button, ((Object)(object)button.hover.background != (Object)null) ? button.hover : button.normal, (TextAnchor)4);
				_buttonOn = CopyState(button, ((Object)(object)button.onNormal.background != (Object)null) ? button.onNormal : button.active, (TextAnchor)4);
			}
			bool flag = GUI.enabled && Event.current != null && Contains(rect, Event.current.mousePosition);
			Color color = GUI.color;
			if (on)
			{
				GUI.color = color * new Color(0.65f, 0.9f, 1f, 1f);
			}
			else if (!GUI.enabled)
			{
				GUI.color = color * new Color(1f, 1f, 1f, 0.5f);
			}
			GUI.Box(rect, text, on ? _buttonOn : (flag ? _buttonHover : _button));
			GUI.color = color;
		}

		public static void DrawCheck(Rect rect, string text, bool on)
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			if (_check == null)
			{
				_check = CopyState(GUI.skin.button, GUI.skin.button.normal, (TextAnchor)4);
			}
			GUI.Box(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y + (((Rect)(ref rect)).height - 16f) / 2f, 16f, 16f), on ? "x" : "", _check);
			GUI.Label(new Rect(((Rect)(ref rect)).x + 20f, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width - 20f, ((Rect)(ref rect)).height), text, Label);
		}

		public static void Report(string where, Exception e)
		{
			string text = where + ": " + e.GetType().Name + ": " + e.Message;
			if (Reported.Add(text))
			{
				Log.LogWarning((object)(text + "\n" + e.StackTrace));
			}
		}

		public static GUIStyle BoxStyle(int fontSize, TextAnchor alignment)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: 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_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Expected O, but got Unknown
			GUIStyle box = GUI.skin.box;
			GUIStyle val = new GUIStyle
			{
				alignment = alignment,
				richText = true,
				fontSize = fontSize,
				border = box.border,
				padding = box.padding,
				margin = box.margin,
				wordWrap = box.wordWrap
			};
			val.normal.background = box.normal.background;
			val.normal.textColor = box.normal.textColor;
			return val;
		}

		public static GUIStyle TextureStyle(Texture2D texture)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			GUIStyle val = new GUIStyle
			{
				border = new RectOffset(),
				padding = new RectOffset(),
				margin = new RectOffset()
			};
			val.normal.background = texture;
			return val;
		}

		public static void DrawTexture(Rect rect, GUIStyle textureStyle)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			GUI.Box(rect, "", textureStyle);
		}

		public static float TextHeight(string text)
		{
			return (float)Math.Max(1, text.Split('\n').Length) * 18f + 4f;
		}
	}
	internal class SctWindow
	{
		private readonly int _id;

		private readonly Func<string> _title;

		private readonly Action<SctLayout> _content;

		private readonly WindowFunction _function;

		private readonly SctLayout _layout = new SctLayout();

		private readonly bool _modal;

		public Rect Rect;

		public SctWindow(int id, Rect rect, Func<string> title, Action<SctLayout> content, bool modal = false)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			_id = id;
			Rect = rect;
			_title = title;
			_content = content;
			_modal = modal;
			_function = WindowFunction.op_Implicit((Action<int>)Draw);
		}

		public void OnGUI()
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			Rect = (_modal ? GUI.ModalWindow(_id, Rect, _function, _title()) : GUI.Window(_id, Rect, _function, _title()));
		}

		private void Draw(int id)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				_layout.Begin(new Rect(8f, 22f, ((Rect)(ref Rect)).width - 16f, ((Rect)(ref Rect)).height - 28f), _id);
				_content(_layout);
				_layout.End();
			}
			catch (Exception ex)
			{
				SctGui.Report("Fenêtre " + _id, ex);
				GUI.Label(new Rect(8f, 22f, ((Rect)(ref Rect)).width - 16f, 60f), "Erreur : " + ex.Message, SctGui.Label);
			}
			if (!_modal)
			{
				GUI.DragWindow(new Rect(0f, 0f, ((Rect)(ref Rect)).width, 20f));
			}
		}
	}
	internal class SctLayout
	{
		private struct Frame
		{
			public float X;

			public float Y;

			public float Width;

			public bool Horizontal;

			public float RowX;

			public float RowHeight;
		}

		private readonly Stack<Frame> _frames = new Stack<Frame>();

		private Frame _f;

		private int _owner;

		private int _counter;

		private static string _activeSlider;

		private static string _focusedField;

		private static readonly Dictionary<string, float> ScrollOffsets = new Dictionary<string, float>();

		private static readonly Dictionary<string, float> ContentHeights = new Dictionary<string, float>();

		private static readonly Dictionary<string, float> BoxHeights = new Dictionary<string, float>();

		private readonly Stack<float> _columnTops = new Stack<float>();

		private readonly Stack<(string Key, float Top)> _boxKeys = new Stack<(string, float)>();

		private readonly Stack<(string Key, float Height)> _scrollKeys = new Stack<(string, float)>();

		public float Width
		{
			get
			{
				if (!_f.Horizontal)
				{
					return _f.Width;
				}
				return _f.Width - (_f.RowX - _f.X);
			}
		}

		public static bool IsTyping => _focusedField != null;

		public void Begin(Rect area, int owner = 0)
		{
			_frames.Clear();
			_owner = owner;
			_counter = 0;
			_f = new Frame
			{
				X = ((Rect)(ref area)).x,
				Y = ((Rect)(ref area)).y,
				Width = ((Rect)(ref area)).width
			};
		}

		public void End()
		{
			if (_f.Horizontal)
			{
				EndHorizontal();
			}
		}

		private string NextKey()
		{
			return _owner + ":" + _counter++;
		}

		private Rect Next(float width, float height)
		{
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			if (_f.Horizontal)
			{
				float num = ((width < 0f) ? (_f.Width - (_f.RowX - _f.X)) : width);
				Rect result = new Rect(_f.RowX, _f.Y, num, height);
				_f.RowX += num + 4f;
				_f.RowHeight = Math.Max(_f.RowHeight, height);
				return result;
			}
			Rect result2 = new Rect(_f.X, _f.Y, (width < 0f) ? _f.Width : width, height);
			_f.Y += height + 4f;
			return result2;
		}

		public void Space(float height = 8f)
		{
			if (_f.Horizontal)
			{
				_f.RowX += height;
			}
			else
			{
				_f.Y += height;
			}
		}

		public void BeginHorizontal()
		{
			_frames.Push(_f);
			_f.Horizontal = true;
			_f.RowX = _f.X;
			_f.RowHeight = 0f;
		}

		public void EndHorizontal()
		{
			float rowHeight = _f.RowHeight;
			_f = _frames.Pop();
			_f.Y += rowHeight + 4f;
		}

		public void BeginColumn(float width = -1f)
		{
			float width2 = ((width < 0f) ? (_f.Width - (_f.RowX - _f.X)) : width);
			_frames.Push(_f);
			_columnTops.Push(_f.Y);
			_f = new Frame
			{
				X = _f.RowX,
				Y = _f.Y,
				Width = width2
			};
		}

		public void EndColumn()
		{
			float val = _f.Y - _columnTops.Pop();
			float width = _f.Width;
			_f = _frames.Pop();
			_f.RowX += width + 4f;
			_f.RowHeight = Math.Max(_f.RowHeight, val);
		}

		public void BeginBox()
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			string text = NextKey();
			BoxHeights.TryGetValue(text, out var value);
			if (value > 0f)
			{
				GUI.Box(new Rect(_f.X, _f.Y, _f.Width, value), "");
			}
			_frames.Push(_f);
			_f.X += 6f;
			_f.Width -= 12f;
			_f.Y += 4f;
			_boxKeys.Push((text, _f.Y - 4f));
		}

		public void EndBox()
		{
			(string Key, float Top) tuple = _boxKeys.Pop();
			string item = tuple.Key;
			float item2 = tuple.Top;
			float y = _f.Y;
			_f = _frames.Pop();
			BoxHeights[item] = y - item2 + 2f;
			_f.Y = y + 2f + 4f;
		}

		public void Label(string text, float width = -1f)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			GUI.Label(Next(width, text.Contains("\n") ? SctGui.TextHeight(text) : 22f), text, SctGui.Label);
		}

		private bool Clicked(Rect rect)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			if (!GUI.enabled)
			{
				return false;
			}
			Event current = Event.current;
			if (current == null || (int)current.type != 0 || !SctGui.Contains(rect, current.mousePosition))
			{
				return false;
			}
			SctGui.NoteClick(_owner, current.mousePosition);
			SctGui.Use(current);
			return true;
		}

		public Rect Area(float width, float height)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			return Next(width, height);
		}

		public bool AreaClick(Rect rect, out Vector2 local, out int button)
		{
			//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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: 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_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			local = Vector2.zero;
			button = -1;
			Event current = Event.current;
			if (!GUI.enabled || current == null || (int)current.type != 0 || !SctGui.Contains(rect, current.mousePosition))
			{
				return false;
			}
			local = new Vector2(current.mousePosition.x - ((Rect)(ref rect)).x, current.mousePosition.y - ((Rect)(ref rect)).y);
			try
			{
				button = current.button;
			}
			catch (Exception)
			{
				button = 0;
			}
			SctGui.NoteClick(_owner, current.mousePosition);
			SctGui.Use(current);
			return true;
		}

		public bool Button(string text, float width = -1f, float height = 22f)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			Rect rect = Next(width, height);
			bool result = Clicked(rect);
			SctGui.DrawButton(rect, text, on: false);
			return result;
		}

		public bool Toggle(bool value, string text, float width = -1f)
		{
			//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)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			Rect rect = Next(width, 22f);
			if (Clicked(rect))
			{
				value = !value;
			}
			SctGui.DrawCheck(rect, text, value);
			return value;
		}

		public bool ToggleButton(bool value, string text, float width = -1f, float height = 22f)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			Rect rect = Next(width, height);
			if (Clicked(rect))
			{
				value = !value;
			}
			SctGui.DrawButton(rect, text, value);
			return value;
		}

		public int Toolbar(int selected, string[] labels, float width = -1f)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			float width2 = (((width < 0f) ? Width : width) - 4f * (float)(labels.Length - 1)) / (float)labels.Length;
			bool horizontal = _f.Horizontal;
			if (!horizontal)
			{
				BeginHorizontal();
			}
			int num = selected;
			for (int i = 0; i < labels.Length; i++)
			{
				Rect rect = Next(width2, 22f);
				if (Clicked(rect))
				{
					num = i;
				}
				SctGui.DrawButton(rect, labels[i], i == num);
			}
			if (!horizontal)
			{
				EndHorizontal();
			}
			return num;
		}

		public float Slider(float value, float min, float max, float width = -1f)
		{
			//IL_000f: 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_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Invalid comparison between Unknown and I4
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Invalid comparison between Unknown and I4
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Invalid comparison between Unknown and I4
			string text = NextKey();
			Rect r = Next(width, 22f);
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(((Rect)(ref r)).x, ((Rect)(ref r)).y + ((Rect)(ref r)).height / 2f - 3f, ((Rect)(ref r)).width, 6f);
			float num = ((max > min) ? Mathf.Clamp01((value - min) / (max - min)) : 0f);
			GUI.Box(val, "");
			GUI.Box(new Rect(((Rect)(ref val)).x + num * (((Rect)(ref val)).width - 12f), ((Rect)(ref r)).y + 2f, 12f, ((Rect)(ref r)).height - 4f), "");
			Event current = Event.current;
			if ((int)current.type == 0 && SctGui.Contains(r, current.mousePosition))
			{
				_activeSlider = text;
				SctGui.Use(current);
			}
			else if ((int)current.type == 1 && _activeSlider == text)
			{
				_activeSlider = null;
				SctGui.Use(current);
			}
			if (_activeSlider == text && ((int)current.type == 3 || (int)current.type == 0 || (int)current.type == 12))
			{
				float num2 = Mathf.Clamp01((current.mousePosition.x - ((Rect)(ref val)).x) / Math.Max(1f, ((Rect)(ref val)).width));
				value = min + num2 * (max - min);
			}
			return value;
		}

		public string TextField(string value, int maxLength, float width = -1f)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Invalid comparison between Unknown and I4
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Invalid comparison between Unknown and I4
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Invalid comparison between Unknown and I4
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Invalid comparison between Unknown and I4
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Invalid comparison between Unknown and I4
			string text = NextKey();
			Rect val = Next(width, 22f);
			bool flag = _focusedField == text;
			Event current = Event.current;
			if ((int)current.type == 0)
			{
				if (SctGui.Contains(val, current.mousePosition))
				{
					_focusedField = text;
					flag = true;
					SctGui.Use(current);
				}
				else if (flag)
				{
					_focusedField = null;
					flag = false;
				}
			}
			value = value ?? "";
			if (flag && (int)current.type == 4)
			{
				if ((int)current.keyCode == 8)
				{
					if (value.Length > 0)
					{
						value = value.Substring(0, value.Length - 1);
					}
					SctGui.Use(current);
				}
				else if ((int)current.keyCode == 13 || (int)current.keyCode == 271 || (int)current.keyCode == 27)
				{
					_focusedField = null;
					SctGui.Use(current);
				}
				else if (current.character != 0 && !char.IsControl(current.character))
				{
					if (value.Length < maxLength)
					{
						value += current.character;
					}
					SctGui.Use(current);
				}
			}
			bool flag2 = flag && Time.realtimeSinceStartup % 1f < 0.5f;
			GUI.Box(val, "");
			GUI.Label(new Rect(((Rect)(ref val)).x + 4f, ((Rect)(ref val)).y, ((Rect)(ref val)).width - 8f, ((Rect)(ref val)).height), value + (flag2 ? "|" : ""), SctGui.Label);
			return value;
		}

		public void BeginScroll(float height, string id = null)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Invalid comparison between Unknown and I4
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			string text = id ?? NextKey();
			Rect r = Next(-1f, height);
			ScrollOffsets.TryGetValue(text, out var value);
			ContentHeights.TryGetValue(text, out var value2);
			Event current = Event.current;
			if ((int)current.type == 6 && SctGui.Contains(r, current.mousePosition))
			{
				value += current.delta.y * 20f;
				SctGui.Use(current);
			}
			value = Mathf.Clamp(value, 0f, Math.Max(0f, value2 - height));
			ScrollOffsets[text] = value;
			if (value2 > height)
			{
				float num = Math.Max(20f, height * height / value2);
				float num2 = ((Rect)(ref r)).y + (height - num) * (value / (value2 - height));
				GUI.Box(new Rect(((Rect)(ref r)).x + ((Rect)(ref r)).width - 6f, num2, 6f, num), "");
			}
			GUI.BeginGroup(new Rect(((Rect)(ref r)).x, ((Rect)(ref r)).y, ((Rect)(ref r)).width - 8f, height));
			_frames.Push(_f);
			_scrollKeys.Push((text, height));
			_f = new Frame
			{
				X = 0f,
				Y = 0f - value,
				Width = ((Rect)(ref r)).width - 8f
			};
		}

		public void EndScroll()
		{
			string item = _scrollKeys.Pop().Key;
			ScrollOffsets.TryGetValue(item, out var value);
			ContentHeights[item] = _f.Y + value;
			GUI.EndGroup();
			_f = _frames.Pop();
		}
	}
}
namespace SCTBuildUpgrades
{
	internal class UpgradeTier
	{
		public string NameFr;

		public string NameEn;

		public (ResourceType Resource, int Quantity)[] Costs;

		public Color Tint;

		public Color Glow;

		public string Name => Lang.Pick(NameFr, NameEn);
	}
	internal class BuildUpgradeDefinition
	{
		public BuildType Target;

		public string TargetFr;

		public string TargetEn;

		public UpgradeTier[] Tiers;

		public float[] Speed = new float[5] { 1f, 1.15f, 1.3f, 1.5f, 1.75f };

		public float[] Consumption = new float[5] { 1f, 0.9f, 0.8f, 0.7f, 0.6f };

		public float[] EnergyReserve = new float[5] { 1f, 1.5f, 2f, 3f, 4f };

		public float[] Storage = new float[5] { 1f, 1.5f, 2f, 3f, 4f };

		public int[] InputSlot;

		public float[] OutputRate = new float[5] { 1f, 1f, 1.25f, 1.5f, 1.5f };

		public string TargetName => Lang.Pick(TargetFr, TargetEn);

		public static T At<T>(T[] values, int level)
		{
			return values[Math.Max(0, Math.Min(level, values.Length - 1))];
		}
	}
	public abstract class BuildUpgradePlugin : BasePlugin
	{
		internal static BuildUpgradeDefinition Definition;

		internal static ConfigEntry<bool> Enabled;

		internal static ConfigEntry<Key> HoldKey;

		internal static ConfigEntry<float> HoldSeconds;

		internal static ConfigEntry<bool> GlowEnabled;

		internal static ConfigEntry<int> RefundPercent;

		internal static ConfigEntry<string> LightFactors;

		internal static ManualLogSource Logger;

		private static BuildUpgradePlugin _instance;

		internal static bool Active
		{
			get
			{
				if (Enabled.Value)
				{
					return !Vanilla.Active;
				}
				return false;
			}
		}

		internal abstract BuildUpgradeDefinition CreateDefinition();

		protected abstract void AddHost();

		internal virtual void ApplyEffects(Build build, int level)
		{
		}

		protected virtual void BindConfig()
		{
		}

		public override void Load()
		{
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Expected O, but got Unknown
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Expected O, but got Unknown
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: Expected O, but got Unknown
			_instance = this;
			Logger = ((BasePlugin)this).Log;
			Definition = CreateDefinition();
			Enabled = ((BasePlugin)this).Config.Bind<bool>("Amelioration", "Enabled", true, "Permet d'améliorer les " + Definition.TargetFr.ToLowerInvariant() + "s.");
			HoldKey = ((BasePlugin)this).Config.Bind<Key>("Amelioration", "Key", (Key)35, "Touche à maintenir devant le bâtiment pour l'améliorer.");
			HoldSeconds = ((BasePlugin)this).Config.Bind<float>("Amelioration", "HoldSeconds", 0.6f, new ConfigDescription("Durée de maintien (secondes).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 3f), Array.Empty<object>()));
			GlowEnabled = ((BasePlugin)this).Config.Bind<bool>("Amelioration", "Glow", true, "Lueur pulsée de la couleur du palier (bleu, cuivre, blanc, or).");
			LightFactors = ((BasePlugin)this).Config.Bind<string>("Amelioration", "LightFactors", "1.5, 2.25, 3, 4, 5", "Rayon de lumière par palier (Fer, Cuivre, Quartz, Or, puis paliers suivants), séparés par des virgules. Bâtiment non amélioré : lumière d'origine. Valeur 1 = lumière d'origine pour ce palier.");
			RefundPercent = ((BasePlugin)this).Config.Bind<int>("Amelioration", "RefundPercentWithSalvage", 50, new ConfigDescription("Part des lingots rendue au ramassage d'un bâtiment amélioré, UNIQUEMENT si le mod de perk Récupération est installé et activé (chaque perk prise la remonte jusqu'à 100 %). Sans ce mod, tout est rendu.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			BindConfig();
			UpgradeStore.Name = $"buildupgrade_{Definition.Target}.json";
			UpgradeStore.OldPath = Path.Combine(Paths.BepInExRootPath, "SCTBuildUpgrades", $"{Definition.Target}.json");
			new Harmony(Il2CppUtil.Guid((BasePlugin)(object)this)).PatchAll(((object)this).GetType().Assembly);
			AddHost();
			ManualLogSource log = ((BasePlugin)this).Log;
			bool flag = default(bool);
			BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(37, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Améliorations de ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(Definition.TargetFr);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" chargées (");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(Definition.Tiers.Length);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" paliers)");
			}
			log.LogInfo(val);
		}

		internal static bool IsTarget(Build build)
		{
			//IL_000a: 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)
			if ((Object)(object)build != (Object)null)
			{
				return build.BuildType == Definition.Target;
			}
			return false;
		}

		internal static void Apply(Build build)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			int num = (Active ? UpgradeStore.LevelAt(build.Position) : 0);
			SpriteRenderer component = ((Component)build).GetComponent<SpriteRenderer>();
			if ((Object)(object)component != (Object)null)
			{
				component.color = ((num > 0) ? Palette.Tier(num, Definition.Tiers[num - 1].Tint) : Color.white);
				UpgradeGlow.Apply(component, num);
			}
			BuildStats.Apply(build, num);
			_instance.ApplyEffects(build, num);
		}

		internal static int LevelOf(Build build)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			if (!Active || !((Object)(object)build != (Object)null) || !IsTarget(build))
			{
				return 0;
			}
			return UpgradeStore.LevelAt(build.Position);
		}
	}
	internal static class BuildStats
	{
		private static readonly Dictionary<IntPtr, (float Consumption, float Reserve, int Capacity)> Base = new Dictionary<IntPtr, (float, float, int)>();

		public static void Apply(Build build, int level)
		{
			if (!Base.TryGetValue(((Il2CppObjectBase)build).Pointer, out (float, float, int) value))
			{
				value = (build.energyConsumption, build.maxEnergy, build.maxCapacity);
				Base[((Il2CppObjectBase)build).Pointer] = value;
			}
			BuildUpgradeDefinition definition = BuildUpgradePlugin.Definition;
			build.energyConsumption = value.Item1 * BuildUpgradeDefinition.At(definition.Consumption, level);
			build.maxEnergy = value.Item2 * BuildUpgradeDefinition.At(definition.EnergyReserve, level);
			build.maxCapacity = Mathf.RoundToInt((float)value.Item3 * BuildUpgradeDefinition.At(definition.Storage, level));
		}
	}
	[HarmonyPatch(typeof(Build), "GetTaskTime")]
	internal static class UpgradeSpeedPatch
	{
		private static void Postfix(Build __instance, ref float __result)
		{
			int num = BuildUpgradePlugin.LevelOf(__instance);
			if (__result > 0f && num > 0)
			{
				__result /= BuildUpgradeDefinition.At(BuildUpgradePlugin.Definition.Speed, num);
			}
		}
	}
	[HarmonyPatch(typeof(Build), "GetMaxInputSlotCapacity")]
	internal static class UpgradeInputSlotPatch
	{
		private static void Postfix(Build __instance, ref int __result)
		{
			int[] inputSlot = BuildUpgradePlugin.Definition.InputSlot;
			int num = BuildUpgradePlugin.LevelOf(__instance);
			if (inputSlot != null && num > 0)
			{
				__result = Math.Max(__result, BuildUpgradeDefinition.At(inputSlot, num));
			}
		}
	}
	[HarmonyPatch(typeof(Build), "get_TransportOutputInterval")]
	internal static class UpgradeOutputPatch
	{
		private static void Postfix(Build __instance, ref float __result)
		{
			int num = BuildUpgradePlugin.LevelOf(__instance);
			if (num > 0)
			{
				__result /= BuildUpgradeDefinition.At(BuildUpgradePlugin.Definition.OutputRate, num);
			}
		}
	}
	internal static class UpgradeGlow
	{
		private const string ColorProperty = "_SineGlowColor";

		private static Material[] _materials;

		private static Material _source;

		private static ColorVision _vision;

		private static bool _failed;

		private static Material For(int level)
		{
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Expected O, but got Unknown
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			VisualManager instance = VisualManager.Instance;
			if (_failed || level <= 0 || (Object)(object)instance == (Object)null || (Object)(object)instance.discoveryMaterial == (Object)null)
			{
				return null;
			}
			if ((Object)(object)_source == (Object)null || ((Il2CppObjectBase)_source).Pointer != ((Il2CppObjectBase)instance.discoveryMaterial).Pointer || _materials == null || _vision != Palette.Vision)
			{
				try
				{
					_source = instance.discoveryMaterial;
					_vision = Palette.Vision;
					Color val = (_source.HasProperty("_SineGlowColor") ? _source.GetColor("_SineGlowColor") : Color.white);
					float num = Mathf.Max(val.r, Mathf.Max(new float[3] { val.g, val.b, 1f }));
					UpgradeTier[] tiers = BuildUpgradePlugin.Definition.Tiers;
					_materials = (Material[])(object)new Material[tiers.Length];
					for (int i = 0; i < tiers.Length; i++)
					{
						Material val2 = Object.Instantiate<Material>(_source);
						((Object)val2).hideFlags = (HideFlags)61;
						Color val3 = Palette.Tier(i + 1, tiers[i].Glow) * num;
						val3.a = val.a;
						val2.SetColor("_SineGlowColor", val3);
						_materials[i] = val2;
					}
				}
				catch (Exception ex)
				{
					_failed = true;
					ManualLogSource logger = BuildUpgradePlugin.Logger;
					bool flag = default(bool);
					BepInExWarningLogInterpolatedStringHandler val4 = new BepInExWarningLogInterpolatedStringHandler(33, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val4).AppendLiteral("Lueur des paliers indisponible : ");
						((BepInExLogInterpolatedStringHandler)val4).AppendFormatted<string>(ex.Message);
					}
					logger.LogWarning(val4);
					return null;
				}
			}
			return _materials[Mathf.Clamp(level, 1, _materials.Length) - 1];
		}

		public static bool IsOurs(Material material)
		{
			if ((Object)(object)material == (Object)null || _materials == null)
			{
				return false;
			}
			Material[] materials = _materials;
			foreach (Material val in materials)
			{
				if ((Object)(object)val != (Object)null && ((Il2CppObjectBase)val).Pointer == ((Il2CppObjectBase)material).Pointer)
				{
					return true;
				}
			}
			return false;
		}

		public static void Apply(SpriteRenderer renderer, int level)
		{
			VisualManager instance = VisualManager.Instance;
			Material val = (BuildUpgradePlugin.GlowEnabled.Value ? For(level) : null);
			if ((Object)(object)val != (Object)null)
			{
				((Renderer)renderer).sharedMaterial = val;
			}
			else if (IsOurs(((Renderer)renderer).sharedMaterial) && (Object)(object)instance != (Object)null && (Object)(object)instance.defaultMaterial != (Object)null)
			{
				((Renderer)renderer).sharedMaterial = instance.defaultMaterial;
			}
		}

		public static void Maintain()
		{
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			VisualManager instance = VisualManager.Instance;
			BuildManager instance2 = BuildManager.Instance;
			if (_failed || (Object)(object)instance == (Object)null || (Object)(object)instance2 == (Object)null || !BuildUpgradePlugin.GlowEnabled.Value || !BuildUpgradePlugin.Active)
			{
				return;
			}
			List<Build> builds = instance2.builds;
			for (int i = 0; i < builds.Count; i++)
			{
				Build val = builds[i];
				if (!BuildUpgradePlugin.IsTarget(val))
				{
					continue;
				}
				int num = UpgradeStore.LevelAt(val.Position);
				if (num <= 0)
				{
					continue;
				}
				SpriteRenderer component = ((Component)val).GetComponent<SpriteRenderer>();
				if (!((Object)(object)component == (Object)null))
				{
					Color val2 = Palette.Tier(num, BuildUpgradePlugin.Definition.Tiers[num - 1].Tint);
					if (component.color != val2)
					{
						component.color = val2;
					}
					Material sharedMaterial = ((Renderer)component).sharedMaterial;
					bool num2 = (Object)(object)sharedMaterial != (Object)null && (Object)(object)instance.interactableMaterial != (Object)null && ((Il2CppObjectBase)sharedMaterial).Pointer == ((Il2CppObjectBase)instance.interactableMaterial).Pointer;
					Material val3 = For(num);
					if (!num2 && (Object)(object)val3 != (Object)null && ((Object)(object)sharedMaterial == (Object)null || ((Il2CppObjectBase)sharedMaterial).Pointer != ((Il2CppObjectBase)val3).Pointer))
					{
						((Renderer)component).sharedMaterial = val3;
					}
				}
			}
		}
	}
	[Serializable]
	public class UpgradeEntry
	{
		public int x;

		public int y;

		public int level;

		public List<int> paid = new List<int>();
	}
	[Serializable]
	public class UpgradeSave
	{
		public List<UpgradeEntry> entries = new List<UpgradeEntry>();
	}
	internal static class UpgradeStore
	{
		public static string Name;

		public static string OldPath;

		private static bool _migrated;

		private static int _slotVersion;

		private static UpgradeSave _state;

		private static readonly JsonSerializerOptions Options = new JsonSerializerOptions
		{
			IncludeFields = true,
			WriteIndented = true
		};

		public static string FilePath
		{
			get
			{
				if (!_migrated)
				{
					_migrated = true;
					SaveSlotApi.Migrate(OldPath, Name);
				}
				return SaveSlotApi.PathOf(Name);
			}
		}

		private static UpgradeSave State
		{
			get
			{
				//IL_005c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0062: Expected O, but got Unknown
				if (_slotVersion != SaveSlotApi.Version)
				{
					_slotVersion = SaveSlotApi.Version;
					_state = null;
				}
				if (_state != null)
				{
					return _state;
				}
				try
				{
					if (File.Exists(FilePath))
					{
						_state = JsonSerializer.Deserialize<UpgradeSave>(File.ReadAllText(FilePath), Options);
					}
				}
				catch (Exception ex)
				{
					ManualLogSource logger = BuildUpgradePlugin.Logger;
					bool flag = default(bool);
					BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(21, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Paliers illisibles : ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
					}
					logger.LogWarning(val);
				}
				return _state ?? (_state = new UpgradeSave());
			}
		}

		public static UpgradeEntry At(Vector3Int p)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			return State.entries.Find((UpgradeEntry e) => e.x == ((Vector3Int)(ref p)).x && e.y == ((Vector3Int)(ref p)).y);
		}

		public static int LevelAt(Vector3Int p)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return At(p)?.level ?? 0;
		}

		public static UpgradeEntry GetOrAdd(Vector3Int p)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			UpgradeEntry upgradeEntry = At(p);
			if (upgradeEntry == null)
			{
				upgradeEntry = new UpgradeEntry
				{
					x = ((Vector3Int)(ref p)).x,
					y = ((Vector3Int)(ref p)).y
				};
				State.entries.Add(upgradeEntry);
			}
			return upgradeEntry;
		}

		public static void Remove(UpgradeEntry entry)
		{
			State.entries.Remove(entry);
			Write();
		}

		public static void Write()
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			try
			{
				Directory.CreateDirectory(Path.GetDirectoryName(FilePath));
				File.WriteAllText(FilePath, JsonSerializer.Serialize(State, Options));
			}
			catch (Exception ex)
			{
				ManualLogSource logger = BuildUpgradePlugin.Logger;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(36, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Sauvegarde des paliers impossible : ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
				}
				logger.LogWarning(val);
			}
		}

		public static void Reload()
		{
			_state = null;
		}

		public static void Delete()
		{
			_state = new UpgradeSave();
			try
			{
				if (File.Exists(FilePath))
				{
					File.Delete(FilePath);
				}
			}
			catch (Exception)
			{
			}
		}
	}
	internal static class UpgradeShop
	{
		public static float RefundRate
		{
			get
			{
				if (!RefundBonus.SalvageActive)
				{
					return 1f;
				}
				return Mathf.Clamp01((float)BuildUpgradePlugin.RefundPercent.Value / 100f + RefundBonus.Total);
			}
		}

		public static Build Target()
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Invalid comparison between Unknown and I4
			Game instance = Game.Instance;
			if ((Object)(object)instance == (Object)null || (Object)(object)instance.player == (Object)null || (Object)(object)BlockManager.Instance == (Object)null || (Object)(object)BuildManager.Instance == (Object)null)
			{
				return null;
			}
			Vector3Int val = BlockManager.Instance.PositionToCell(Vector2.op_Implicit(((Component)instance.player).transform.position));
			TileData tile = BlockManager.Instance.GetTile(val);
			if (tile == null || (int)tile.tileType != 4 || (Object)(object)tile.build == (Object)null)
			{
				return null;
			}
			if (!BuildUpgradePlugin.IsTarget(tile.build))
			{
				return null;
			}
			return tile.build;
		}

		public static int Cost(int quantity)
		{
			return Mathf.Max(1, Mathf.CeilToInt((float)quantity * CraftCosts.Factor));
		}

		public static UpgradeTier Next(Build build)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			int num = UpgradeStore.LevelAt(build.Position);
			UpgradeTier[] tiers = BuildUpgradePlugin.Definition.Tiers;
			if (num >= tiers.Length)
			{
				return null;
			}
			return tiers[num];
		}

		public static List<(ResourceType Resource, int Missing)> Missing(UpgradeTier tier)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			Player player = Game.Instance.player;
			List<(ResourceType, int)> list = new List<(ResourceType, int)>();
			(ResourceType, int)[] costs = tier.Costs;
			for (int i = 0; i < costs.Length; i++)
			{
				(ResourceType, int) tuple = costs[i];
				ResourceType item = tuple.Item1;
				int num = Cost(tuple.Item2) - player.GetResourceQuantity(item);
				if (num > 0)
				{
					list.Add((item, num));
				}
			}
			return list;
		}

		public static bool TryUpgrade(Build build)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: 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_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected I4, but got Unknown
			UpgradeTier upgradeTier = Next(build);
			if (upgradeTier == null || Missing(upgradeTier).Count > 0)
			{
				return false;
			}
			UpgradeEntry orAdd = UpgradeStore.GetOrAdd(build.Position);
			(ResourceType, int)[] costs = upgradeTier.Costs;
			for (int i = 0; i < costs.Length; i++)
			{
				(ResourceType, int) tuple = costs[i];
				ResourceType item = tuple.Item1;
				int num = Cost(tuple.Item2);
				Game.Instance.player.RemoveResource(item, num);
				orAdd.paid.Add((int)item);
				orAdd.paid.Add(num);
			}
			orAdd.level++;
			UpgradeStore.Write();
			BuildUpgradePlugin.Apply(build);
			AudioManager.Play("PLACE", (MixerTarget)3, 0.5f, 1.3f);
			return true;
		}

		public static string Describe(Build build, out bool canUpgrade)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			BuildUpgradeDefinition definition = BuildUpgradePlugin.Definition;
			int num = UpgradeStore.LevelAt(build.Position);
			string text = ((num == 0) ? Lang.Pick("base", "basic") : definition.Tiers[num - 1].Name);
			UpgradeTier upgradeTier = Next(build);
			if (upgradeTier == null)
			{
				canUpgrade = false;
				return Lang.Pick(definition.TargetName + " " + text + " (niveau max)", definition.TargetName + " " + text + " (max level)") + RefundNote(num);
			}
			List<(ResourceType, int)> list = Missing(upgradeTier);
			canUpgrade = list.Count == 0;
			string value = string.Join(" + ", Array.ConvertAll(upgradeTier.Costs, ((ResourceType Resource, int Quantity) c) => $"{Cost(c.Quantity)} {ResourceNames.Of(c.Resource)}"));
			string text2 = Lang.Pick($"Améliorer ({text} → {upgradeTier.Name}) : {value}", $"Upgrade ({text} → {upgradeTier.Name}): {value}");
			if (!canUpgrade)
			{
				string value2 = string.Join(", ", list.ConvertAll(((ResourceType Resource, int Missing) m) => $"{m.Missing} {ResourceNames.Short(m.Resource)}"));
				text2 += Lang.Pick($"  <color=#{Palette.BadHex()}>(manque {value2})</color>", $"  <color=#{Palette.BadHex()}>({value2} missing)</color>");
			}
			return text2 + RefundNote(num);
		}

		private static string RefundNote(int level)
		{
			if (level <= 0 || !RefundBonus.SalvageActive)
			{
				return "";
			}
			int num = Mathf.RoundToInt(RefundRate * 100f);
			string value = ((num >= 100) ? ("#" + Palette.GoodHex()) : ("#" + Palette.WarningHex()));
			return Lang.Pick($"  <color={value}>· retrait : {num} % rendu</color>", $"  <color={value}>· pickup: {num}% refunded</color>");
		}
	}
	internal static class ResourceNames
	{
		public unsafe static string Of(ResourceType type)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Expected I4, but got Unknown
			return (type - 1) switch
			{
				2 => Lang.Pick("lingots de fer", "iron ingots"), 
				4 => Lang.Pick("lingots de cuivre", "copper ingots"), 
				6 => Lang.Pick("quartz raffinés", "refined quartz"), 
				8 => Lang.Pick("lingots d'or", "gold ingots"), 
				0 => Lang.Pick("pierres", "stone"), 
				10 => Lang.Pick("charbon", "coal"), 
				_ => ((object)(*(ResourceType*)(&type))/*cast due to .constrained prefix*/).ToString(), 
			};
		}

		public static string Short(ResourceType type)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected I4, but got Unknown
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			return (type - 3) switch
			{
				0 => Lang.Pick("fer", "iron"), 
				2 => Lang.Pick("cuivre", "copper"), 
				4 => Lang.Pick("quartz", "quartz"), 
				6 => Lang.Pick("or", "gold"), 
				_ => Of(type), 
			};
		}
	}
	internal static class UpgradeHold
	{
		internal static float Progress;

		private static bool _waitRelease;

		private static GUIStyle _style;

		internal static bool CanInteract()
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Invalid comparison between Unknown and I4
			Game instance = Game.Instance;
			if (BuildUpgradePlugin.Active && (Object)(object)instance != (Object)null && !instance.paused && !instance._runEnded && !instance.IsUIOpen() && !instance.HideGameplayUI && (Object)(object)BuildManager.Instance != (Object)null)
			{
				return (int)BuildManager.Instance.currentBuildPrefab == 0;
			}
			return false;
		}

		public static void Update()
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			Keyboard current = Keyboard.current;
			Build build = (CanInteract() ? UpgradeShop.Target() : null);
			bool flag = current != null && ((ButtonControl)current[BuildUpgradePlugin.HoldKey.Value]).isPressed;
			if ((Object)(object)build == (Object)null || !flag)
			{
				Progress = 0f;
				_waitRelease = false;
			}
			else
			{
				if (_waitRelease)
				{
					return;
				}
				UpgradeTier upgradeTier = UpgradeShop.Next(build);
				if (upgradeTier == null || UpgradeShop.Missing(upgradeTier).Count > 0)
				{
					Progress = 0f;
					return;
				}
				Progress += Time.deltaTime / Mathf.Max(0.1f, BuildUpgradePlugin.HoldSeconds.Value);
				if (!(Progress < 1f))
				{
					Progress = 0f;
					_waitRelease = true;
					Safe.Run("Amélioration du bâtiment", delegate
					{
						UpgradeShop.TryUpgrade(build);
					});
				}
			}
		}

		public static void LateUpdate()
		{
			Safe.Run("Lueur des paliers", UpgradeGlow.Maintain);
		}

		public static void OnGUI()
		{
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			if (UpgradePrompt.Ready || !CanInteract())
			{
				return;
			}
			Build val = UpgradeShop.Target();
			if (!((Object)(object)val == (Object)null))
			{
				if (_style == null)
				{
					_style = SctGui.BoxStyle(14, (TextAnchor)4);
				}
				bool canUpgrade;
				string text = "[" + UpgradePrompt.KeyName + "] " + UpgradeShop.Describe(val, out canUpgrade) + ((Progress > 0f) ? $"  {Mathf.RoundToInt(Progress * 100f)} %" : "");
				GUI.Box(new Rect((float)(Screen.width - 460) / 2f, (float)(Screen.height - 120), 460f, 30f), text, _style);
			}
		}
	}
	internal static class UpgradePrompt
	{
		private static GameObject _row;

		private static TMP_Text _label;

		private static TMP_Text _key;

		private static Image _fill;

		private static Image _gamepad;

		private static bool _failed;

		public static bool Ready => (Object)(object)_row != (Object)null;

		public static string KeyName
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				try
				{
					return ((InputControl)Keyboard.current[BuildUpgradePlugin.HoldKey.Value]).displayName;
				}
				catch (Exception)
				{
					return ((object)BuildUpgradePlugin.HoldKey.Value/*cast due to .constrained prefix*/).ToString();
				}
			}
		}

		private static void Create(BuildInteractionPrompt prompt)
		{
			ActionPromptRow deleteRow = prompt.deleteRow;
			if ((Object)(object)deleteRow == (Object)null)
			{
				_failed = true;
				return;
			}
			GameObject val = Object.Instantiate<GameObject>(((Component)deleteRow).gameObject, ((Component)deleteRow).transform.parent);
			((Object)val).name = "SCT Upgrade Row";
			val.transform.SetSiblingIndex(((Component)deleteRow).transform.GetSiblingIndex() + 1);
			ActionPromptRow component = val.GetComponent<ActionPromptRow>();
			_key = component.keyboardText;
			_fill = component.holdFill;
			_gamepad = component.gamepadImage;
			_label = (((Object)(object)component.label != (Object)null) ? ((Component)component.label).GetComponent<TMP_Text>() : null);
			if ((Object)(object)component.label != (Object)null)
			{
				Object.Destroy((Object)(object)component.label);
			}
			Object.Destroy((Object)(object)component);
			if ((Object)(object)_label == (Object)null || (Object)(object)_key == (Object)null)
			{
				Object.Destroy((Object)(object)val);
				_failed = true;
			}
			else
			{
				_row = val;
			}
		}

		public static void Refresh(BuildInteractionPrompt prompt)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Expected O, but got Unknown
			if ((Object)(object)_row == (Object)null && !_failed)
			{
				try
				{
					Create(prompt);
				}
				catch (Exception ex)
				{
					_failed = true;
					ManualLogSource logger = BuildUpgradePlugin.Logger;
					bool flag = default(bool);
					BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(80, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Ligne d'amélioration non ajoutée à l'indication du jeu (");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") : affichage de secours");
					}
					logger.LogWarning(val);
				}
			}
			if ((Object)(object)_row == (Object)null)
			{
				return;
			}
			Build val2 = ((UpgradeHold.CanInteract() && (Object)(object)prompt.panel != (Object)null && prompt.panel.activeSelf) ? UpgradeShop.Target() : null);
			_row.SetActive((Object)(object)val2 != (Object)null);
			if (!((Object)(object)val2 == (Object)null))
			{
				_label.text = UpgradeShop.Describe(val2, out var canUpgrade);
				bool flag2 = UpgradeShop.Next(val2) == null;
				_key.text = (flag2 ? "—" : KeyName);
				if ((Object)(object)_gamepad != (Object)null)
				{
					((Component)_gamepad).gameObject.SetActive(false);
				}
				if ((Object)(object)_fill != (Object)null)
				{
					_fill.fillAmount = (canUpgrade ? UpgradeHold.Progress : 0f);
				}
			}
		}
	}
	[HarmonyPatch(typeof(BuildInteractionPrompt), "LateUpdate")]
	internal static class UpgradePromptPatch
	{
		private static void Postfix(BuildInteractionPrompt __instance)
		{
			Safe.Run("Indication d'amélioration", delegate
			{
				UpgradePrompt.Refresh(__instance);
			});
		}
	}
	[HarmonyPatch(typeof(LightEmitter), "FlickerLights")]
	internal static class UpgradeLightPatch
	{
		private static readonly Dictionary<IntPtr, Build> Owners = new Dictionary<IntPtr, Build>();

		private static string _parsedFrom;

		private static float[] _factors = Array.Empty<float>();

		private static readonly List<IntPtr> Scaled = new List<IntPtr>(8);

		private static void Postfix(LightEmitter __instance)
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			if (!BuildUpgradePlugin.Active)
			{
				return;
			}
			if (!Owners.TryGetValue(((Il2CppObjectBase)__instance).Pointer, out var value) || (Object)(object)value == (Object)null)
			{
				value = ((Component)__instance).GetComponentInParent<Build>();
				Owners[((Il2CppObjectBase)__instance).Pointer] = value;
			}
			if ((Object)(object)value == (Object)null || !BuildUpgradePlugin.IsTarget(value))
			{
				return;
			}
			int num = UpgradeStore.LevelAt(value.Position);
			if (num > 0)
			{
				float num2 = LightFactor(num);
				if (!(num2 <= 0f) && !Mathf.Approximately(num2, 1f))
				{
					Scaled.Clear();
					Scale((Component)(object)__instance.lightRenderer, num2);
					Scale((Component)(object)__instance.smallLightRenderer, num2);
					Scale((Component)(object)__instance.smallMask, num2);
					Scale((Component)(object)__instance.bigMask, num2);
					Scale((Component)(object)__instance.shadowMask, num2);
					Scale((Component)(object)__instance.backgroundMask, num2);
				}
			}
		}

		private static float LightFactor(int level)
		{
			string text = BuildUpgradePlugin.LightFactors.Value ?? "";
			if (text != _parsedFrom)
			{
				_parsedFrom = text;
				List<float> list = new List<float>();
				string[] array = text.Split(',');
				for (int i = 0; i < array.Length; i++)
				{
					if (float.TryParse(array[i].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture, out var result))
					{
						list.Add(result);
					}
				}
				_factors = list.ToArray();
			}
			if (_factors.Length != 0)
			{
				return _factors[Mathf.Clamp(level, 1, _factors.Length) - 1];
			}
			return 1f;
		}

		private static void Scale(Component component, float factor)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)component == (Object)null))
			{
				Transform transform = component.transform;
				if (!Scaled.Contains(((Il2CppObjectBase)transform).Pointer))
				{
					Scaled.Add(((Il2CppObjectBase)transform).Pointer);
					transform.localScale *= factor;
				}
			}
		}
	}
	[HarmonyPatch(typeof(BuildManager), "SpawnBuild")]
	internal static class UpgradeSpawnPatch
	{
		private static void Postfix(Build __result)
		{
			if (!BuildUpgradePlugin.IsTarget(__result))
			{
				return;
			}
			Safe.Run("Amélioration (pose)", delegate
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				UpgradeEntry upgradeEntry = UpgradeStore.At(__result.Position);
				if (upgradeEntry != null)
				{
					UpgradeStore.Remove(upgradeEntry);
				}
				BuildUpgradePlugin.Apply(__result);
			});
		}
	}
	[HarmonyPatch(typeof(SaveSystem), "LoadGame")]
	internal static class UpgradeLoadPatch
	{
		private static void Postfix()
		{
			Safe.Run("Amélioration (chargement)", delegate
			{
				UpgradeStore.Reload();
				if (!((Object)(object)BuildManager.Instance == (Object)null))
				{
					List<Build> builds = BuildManager.Instance.builds;
					for (int i = 0; i < builds.Count; i++)
					{
						if (BuildUpgradePlugin.IsTarget(builds[i]))
						{
							BuildUpgradePlugin.Apply(builds[i]);
						}
					}
				}
			});
		}
	}
	[HarmonyPatch(typeof(BuildManager), "RemoveBuild")]
	internal static class UpgradeRemovePatch
	{
		private static void Prefix(Build build)
		{
			if (!BuildUpgradePlugin.IsTarget(build) || build.unique)
			{
				return;
			}
			Safe.Run("Amélioration (ramassage)", delegate
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0041: Unknown result type (might be due to invalid IL or missing references)
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
				UpgradeEntry upgradeEntry = UpgradeStore.At(build.Position);
				if (upgradeEntry != null)
				{
					Player player = Game.Instance.player;
					float refundRate = UpgradeShop.RefundRate;
					Dictionary<ResourceType, int> dictionary = new Dictionary<ResourceType, int>();
					for (int i = 0; i + 1 < upgradeEntry.paid.Count; i += 2)
					{
						ResourceType key = (ResourceType)upgradeEntry.paid[i];
						dictionary[key] = (dictionary.TryGetValue(key, out var value) ? value : 0) + upgradeEntry.paid[i + 1];
					}
					foreach (KeyValuePair<ResourceType, int> item in dictionary)
					{
						int num = Mathf.FloorToInt((float)item.Value * refundRate);
						if (num > 0)
						{
							player.GiveResource(item.Key, num);
						}
					}
					UpgradeStore.Remove(upgradeEntry);
				}
			});
		}
	}
	[HarmonyPatch(typeof(SaveSystem), "DeleteGameFile")]
	internal static class UpgradeDeleteRunPatch
	{
		private static void Postfix()
		{
			UpgradeStore.Delete();
		}
	}
	[HarmonyPatch(typeof(SaveSystem), "DeleteSavedProgress")]
	internal static class UpgradeDeleteProgressPatch
	{
		private static void Postfix()
		{
			UpgradeStore.Delete();
		}
	}
}
namespace SCTBuildUpgrades.Scanner
{
	[BepInPlugin("sct.buildupgrade.scanner", "SCT Amélioration - Scanners", "1.1.1")]
	public class ScannerUpgrade : BuildUpgradePlugin
	{
		private static readonly int[] Range = new int[5] { 10, 12, 14, 18, 24 };

		internal const int DoubleRingLevel = 4;

		protected override void AddHost()
		{
			((BasePlugin)this).AddComponent<ScannerUpgradeHost>();
		}

		internal override BuildUpgradeDefinition CreateDefinition()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0217: Unknown result type (might be due to invalid IL or missing references)
			BuildUpgradeDefinition buildUpgradeDefinition = new BuildUpgradeDefinition();
			buildUpgradeDefinition.Target = (BuildType)4;
			buildUpgradeDefinition.TargetFr = "Scanner";
			buildUpgradeDefinition.TargetEn = "Scanner";
			buildUpgradeDefinition.Tiers = new UpgradeTier[4]
			{
				new UpgradeTier
				{
					NameFr = "Fer",
					NameEn = "Iron",
					Costs = new(ResourceType, int)[2]
					{
						((ResourceType)3, 3),
						((ResourceType)7, 2)
					},
					Tint = new Color(0.6f, 0.75f, 1f),
					Glow = new Color(0.25f, 0.5f, 1f)
				},
				new UpgradeTier
				{
					NameFr = "Cuivre",
					NameEn = "Copper",
					Costs = new(ResourceType, int)[2]
					{
						((ResourceType)5, 4),
						((ResourceType)7, 4)
					},
					Tint = new Color(1f, 0.62f, 0.35f),
					Glow = new Color(1f, 0.45f, 0.15f)
				},
				new UpgradeTier
				{
					NameFr = "Quartz",
					NameEn = "Quartz",
					Costs = new(ResourceType, int)[2]
					{
						((ResourceType)7, 6),
						((ResourceType)9, 4)
					},
					Tint = new Color(0.8f, 0.92f, 1f),
					Glow = new Color(1f, 1f, 1f)
				},
				new UpgradeTier
				{
					NameFr = "Or",
					NameEn = "Gold",
					Costs = new(ResourceType, int)[2]
					{
						((ResourceType)9, 10),
						((ResourceType)3, 10)
					},
					Tint = new Color(1f, 0.85f, 0.3f),
					Glow = new Color(1f, 0.75f, 0.1f)
				}
			};
			return buildUpgradeDefinition;
		}

		internal static int RangeOf(Build build)
		{
			return BuildUpgradeDefinition.At(Range, BuildUpgradePlugin.LevelOf(build));
		}
	}
	[HarmonyPatch(typeof(Scanner), "CanPerformTask")]
	internal static class ScannerRangePatch
	{
		private static void Postfix(Scanner __instance, ref bool __result)
		{
			if (BuildUpgradePlugin.Active)
			{
				__result = __instance.currentRange < ScannerUpgrade.RangeOf((Build)(object)__instance);
			}
		}
	}
	[HarmonyPatch(typeof(Scanner), "ProcessTask")]
	internal static class ScannerDoubleRingPatch
	{
		private static void Postfix(Scanner __instance)
		{
			if (BuildUpgradePlugin.LevelOf((Build)(object)__instance) >= 4 && __instance.currentRange < ScannerUpgrade.RangeOf((Build)(object)__instance))
			{
				Safe.Run("Scanner doré", delegate
				{
					Scanner obj = __instance;
					int currentRange = obj.currentRange;
					obj.currentRange = currentRange + 1;
					__instance.ShowScanEffect();
					__instance.RevealOres();
				});
			}
		}
	}
	internal class ScannerUpgradeHost : MonoBehaviour
	{
		public ScannerUpgradeHost(IntPtr ptr)
			: base(ptr)
		{
		}

		private void Update()
		{
			UpgradeHold.Update();
		}

		private void LateUpdate()
		{
			UpgradeHold.LateUpdate();
		}

		private void OnGUI()
		{
			UpgradeHold.OnGUI();
		}
	}
}