Decompiled source of CartInventory v1.4.1

CartInventory.dll

Decompiled 4 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using CartInventory.Challenges;
using CartInventory.DTO;
using CartInventory.Extensions;
using CartInventory.Patches;
using CartInventory.Shop;
using HarmonyLib;
using MenuLib;
using MenuLib.MonoBehaviors;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Photon.Pun;
using REPOLib.Modules;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("Gridorius")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+53b12c1670ec4d0b0955434d7b56a871d0df0b62")]
[assembly: AssemblyProduct("CartInventory")]
[assembly: AssemblyTitle("CartInventory")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.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 CartInventory
{
	public class CarefulHelper
	{
		public static void OnDestroy(ValuableObject component)
		{
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			ValuableObject component2 = component;
			if (!SemiFunc.IsMasterClientOrSingleplayer() || !ModConfig.CarefulMode.Value || !SpawnHelper.SpawnedBags.Contains(component2))
			{
				return;
			}
			RoomVolumeCheck value = Traverse.Create((object)component2).Field("roomVolumeCheck").GetValue<RoomVolumeCheck>();
			if (!Traverse.Create((object)value).Field("inExtractionPoint").GetValue<bool>() && !TruckController.TruckItems.Any((ValuableAndPhysic vf) => (Object)(object)vf.Valuable == (Object)(object)component2))
			{
				List<EnemySetup> enemiesDifficulty = EnemyDirector.instance.enemiesDifficulty2;
				List<EnemySetup> enemiesDifficulty2 = EnemyDirector.instance.enemiesDifficulty3;
				(EnemySetup, int) tuple = (PickEnemy(enemiesDifficulty), 2);
				if (Helpers.Chance(10))
				{
					tuple = (PickEnemy(enemiesDifficulty2), 1);
				}
				CartInventory.Logger.LogWarning((object)("Spawn " + ((Object)tuple.Item1).name));
				SpawnHelper.SpawnEnemy(tuple.Item1, ((Component)component2).transform.position, tuple.Item2);
			}
		}

		public static void RollSpawn(ValuableObject component)
		{
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			if (Helpers.Chance(ModConfig.CarefulSkipChance.Value))
			{
				return;
			}
			List<EnemySetup> enemiesDifficulty = EnemyDirector.instance.enemiesDifficulty1;
			List<EnemySetup> enemiesDifficulty2 = EnemyDirector.instance.enemiesDifficulty2;
			List<EnemySetup> enemiesDifficulty3 = EnemyDirector.instance.enemiesDifficulty3;
			while (LevelStats.TotalValuablesDamage >= (float)ModConfig.CarefulSpawnT1Price.Value)
			{
				(EnemySetup, float, int) tuple = (PickEnemy(enemiesDifficulty), 3000f, Random.Range(1, 4));
				if (LevelStats.TotalValuablesDamage >= (float)ModConfig.CarefulSpawnT3Price.Value)
				{
					tuple = (PickEnemy(enemiesDifficulty3), ModConfig.CarefulSpawnT3Price.Value, 1);
				}
				else if (LevelStats.TotalValuablesDamage >= (float)ModConfig.CarefulSpawnT2Price.Value)
				{
					tuple = (PickEnemy(enemiesDifficulty2), ModConfig.CarefulSpawnT2Price.Value, Random.Range(1, 2));
				}
				CartInventory.Logger.LogWarning((object)("Spawn " + ((Object)tuple.Item1).name));
				SpawnHelper.SpawnEnemy(tuple.Item1, ((Component)component).transform.position, tuple.Item3);
				LevelStats.TotalValuablesDamage -= tuple.Item2;
			}
		}

		public static EnemySetup PickEnemy(List<EnemySetup> enemies)
		{
			int num = Random.Range(0, enemies.Count);
			int num2 = 0;
			foreach (EnemySetup item in enemies.Where((EnemySetup e) => !((Object)e).name.Contains("Ceiling Eye") && !((Object)e).name.Contains("Slow Walker") && !((Object)e).name.Contains("Thin Man") && !((Object)e).name.Contains("Hidden")))
			{
				if (num2 == num)
				{
					return item;
				}
				num2++;
			}
			return enemies.First();
		}
	}
	[BepInPlugin("Gridorius.CartInventory", "CartInventory", "1.0")]
	public class CartInventory : BaseUnityPlugin
	{
		private TruckController _truckController;

		internal static CartInventory Instance { get; private set; }

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		internal Harmony? Harmony { get; set; }

		public bool IsLoaded { get; private set; }

		public SaveManager SaveManager { get; set; }

		private void Awake()
		{
			Instance = this;
			SaveManager = new SaveManager();
			ModConfig.Configure(((BaseUnityPlugin)this).Config);
			((Component)this).gameObject.transform.parent = null;
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			Patch();
			IsLoaded = true;
			Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!");
			_truckController = new TruckController();
			ShopUI.Initialize();
		}

		private void Update()
		{
			if (ModConfig.EnableTruckItems.Value)
			{
				_truckController.CheckTruckValuables();
			}
		}

		internal void Patch()
		{
			//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_0021: Expected O, but got Unknown
			//IL_0026: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID);
				Harmony val2 = val;
				Harmony = val;
			}
			Harmony.PatchAll();
		}

		internal void Unpatch()
		{
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}
	}
	public class Helpers
	{
		public static bool Chance(int chance)
		{
			int num = Random.Range(1, 99);
			return num >= 100 - ((chance > 100) ? 100 : ((chance >= 0) ? chance : 0));
		}

		public static bool Chance(float chance)
		{
			return Chance((int)chance);
		}
	}
	public class LevelLerpBuilder
	{
		private readonly Dictionary<float, (bool, float)> LevelValues = new Dictionary<float, (bool, float)>();

		public LevelLerpBuilder Add(float toLevel, float toValue)
		{
			LevelValues.Add(toLevel, (true, toValue));
			return this;
		}

		public LevelLerpBuilder AddScalar(float toLevel, float toValue)
		{
			LevelValues.Add(toLevel, (false, toValue));
			return this;
		}

		public float GetValue(float outOfRange, float startRange = 1f)
		{
			(float, float) tuple = (-100f, -100f);
			foreach (KeyValuePair<float, (bool, float)> levelValue in LevelValues)
			{
				if ((float)LevelStats.CurrentLevel <= levelValue.Key)
				{
					if (!levelValue.Value.Item1)
					{
						return levelValue.Value.Item2;
					}
					if (tuple.Item1 < 0f)
					{
						return Mathf.Lerp(startRange, levelValue.Value.Item2, Mathf.InverseLerp(1f, levelValue.Key, (float)LevelStats.CurrentLevel));
					}
					return Mathf.Lerp(tuple.Item2, levelValue.Value.Item2, Mathf.InverseLerp(tuple.Item1 + 1f, levelValue.Key, (float)LevelStats.CurrentLevel));
				}
				tuple = (levelValue.Key, levelValue.Value.Item2);
			}
			return outOfRange;
		}

		public int GetIntValue(float outOfRange, float startRange = 1f)
		{
			return Mathf.RoundToInt(GetValue(outOfRange, startRange));
		}
	}
	public class LevelStats
	{
		public static float TotalLost;

		public static int EnemyKills = 0;

		public static List<PhysGrabCart> Carts = new List<PhysGrabCart>();

		public static float LevelDollars;

		public static int TotalModules;

		public static int ExploredModules;

		public static float TotalValuablesDamage;

		public static bool FirstExtractionPointOpened = false;

		public static float Time = 0f;

		public static float ValuableChangeTime = 0f;

		public static PlayerChatBoxState TruckScreenState = (PlayerChatBoxState)0;

		public static List<ValuableObject> ValuableObjects = new List<ValuableObject>();

		public static List<ValuableObject> Orbs = new List<ValuableObject>();

		public static Dictionary<PhysGrabCart, List<ValuableObject>> CartValuables = new Dictionary<PhysGrabCart, List<ValuableObject>>();

		public static List<EnemyParent> ImmortalEnemies = new List<EnemyParent>();

		public static int EnemyTotal = 0;

		public static int CurrentLevel => RunManager.instance.levelsCompleted + 1;

		public static bool TruckLeaving
		{
			get
			{
				//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_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_000a: Invalid comparison between Unknown and I4
				PlayerChatBoxState truckScreenState = TruckScreenState;
				if (truckScreenState - 2 <= 1)
				{
					return true;
				}
				return false;
			}
		}

		public static int CurrentModCount => Traverse.Create((object)LevelGenerator.Instance).Field("ModuleAmount").GetValue<int>();

		public static int CurrentExtractionCount => Traverse.Create((object)LevelGenerator.Instance).Field("ExtractionAmount").GetValue<int>();

		public static void Clear()
		{
			ResetValuables();
			LevelDollars = 0f;
			TotalLost = 0f;
			Time = 0f;
			EnemyKills = 0;
			TotalValuablesDamage = 0f;
			TotalModules = 0;
			EnemyTotal = 0;
			ExploredModules = 0;
			FirstExtractionPointOpened = false;
			Orbs.Clear();
			ImmortalEnemies.Clear();
			Carts.Clear();
			CartValuables.Clear();
		}

		public static void AddModuleExplored()
		{
			ExploredModules++;
		}

		public static (int, float) GetCollectedCount()
		{
			(int, float) result = (0, 0f);
			foreach (ValuableObject valuable in ValuableObjects)
			{
				RoomVolumeCheck value = Traverse.Create((object)valuable).Field("roomVolumeCheck").GetValue<RoomVolumeCheck>();
				bool value2 = Traverse.Create((object)value).Field("inExtractionPoint").GetValue<bool>();
				float dollarValue = valuable.GetDollarValue();
				if (value2 || CartValuables.Any<KeyValuePair<PhysGrabCart, List<ValuableObject>>>((KeyValuePair<PhysGrabCart, List<ValuableObject>> cart) => cart.Value.Contains(valuable)))
				{
					result.Item1++;
					result.Item2 += dollarValue;
				}
			}
			return result;
		}

		public static void UpdateLevelDollars()
		{
			LevelDollars = 0f;
			foreach (ValuableObject valuableObject in ValuableObjects)
			{
				LevelDollars += valuableObject.GetDollarValue();
			}
		}

		public static void RegisterValuableObject(ValuableObject valuableObject)
		{
			if (!ValuableObjects.Contains(valuableObject) && ((Object)valuableObject).name.Contains("(Clone)"))
			{
				ValuableObjects.Add(valuableObject);
				UpdateLevelDollars();
			}
		}

		public static void RemoveValuableObject(ValuableObject valuableObject)
		{
			if (Orbs.Contains(valuableObject))
			{
				Orbs.Remove(valuableObject);
			}
			if (ValuableObjects.Contains(valuableObject))
			{
				ValuableObjects.Remove(valuableObject);
			}
		}

		public static void ResetValuables()
		{
			ValuableObjects = new List<ValuableObject>();
		}

		public static void Update()
		{
			if ((SemiFunc.RunIsLevel() || SemiFunc.RunIsShop()) && FirstExtractionPointOpened && !TruckLeaving)
			{
				Time += Time.deltaTime;
				ValuableChangeTime += Time.deltaTime;
			}
			if (!(ValuableChangeTime >= 120f))
			{
				return;
			}
			ValuableChangeTime -= 120f;
			if (ChallengeManager.CurrentChallengeIs(global::CartInventory.Challenges.Challenges.FastExtraction))
			{
				foreach (ValuableObject valuableObject in ValuableObjects)
				{
					valuableObject.SetDollarValue(valuableObject.GetDollarValue() * 0.9f);
				}
				UpdateLevelDollars();
			}
			if (!ChallengeManager.CurrentChallengeIs(global::CartInventory.Challenges.Challenges.MoneyTime))
			{
				return;
			}
			foreach (ValuableObject valuableObject2 in ValuableObjects)
			{
				valuableObject2.SetDollarValue(valuableObject2.GetDollarValue() * 1.1f);
			}
			UpdateLevelDollars();
		}
	}
	internal class LevelStatsUI : SemiUI
	{
		[CompilerGenerated]
		private sealed class <EnableOvercharge>d__11 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public LevelStatsUI <>4__this;

			private OverchargeUI <objectOfType>5__1;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <EnableOvercharge>d__11(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<objectOfType>5__1 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(2f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					<objectOfType>5__1 = Object.FindObjectOfType<OverchargeUI>(true);
					if (Object.op_Implicit((Object)(object)<objectOfType>5__1))
					{
						((Component)<objectOfType>5__1).gameObject.SetActive(true);
					}
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public static LevelStatsUI instance;

		private static readonly Color DangerColor = new Color(0.89f, 0.15f, 0.24f);

		private static readonly Color DollarColor = new Color(0.15f, 0.53f, 0.39f);

		private static readonly Color GrayColor = new Color(0.79f, 0.79f, 0.79f);

		private static readonly Color KeyColor = new Color(0.95f, 0.47f, 0.21f);

		private bool dontScoot = true;

		public TextMeshProUGUI statsText;

		public LevelStatsUI(CartInventory cartInventory)
		{
		}

		protected override void Start()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			((SemiUI)this).Start();
			if ((Object)(object)instance != (Object)null)
			{
				Object.DestroyImmediate((Object)(object)((Component)instance).gameObject);
			}
			instance = this;
			statsText = ((Component)this).gameObject.GetComponent<TextMeshProUGUI>();
			((TMP_Text)statsText).alignment = (TextAlignmentOptions)257;
			((TMP_Text)statsText).color = Color.white;
			((TMP_Text)statsText).fontStyle = (FontStyles)0;
		}

		protected override void Update()
		{
			//IL_0037: 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_009c: Unknown result type (might be due to invalid IL or missing references)
			((SemiUI)this).Update();
			((TMP_Text)statsText).text = "";
			if (!MapToolControllerPatch.MapIsOpen)
			{
				SetText();
			}
			if (((Component)this).gameObject.transform.localPosition.x != ModConfig.StatusBarX.Value || ((Component)this).gameObject.transform.localPosition.y != ModConfig.StatusBarY.Value)
			{
				((Component)this).gameObject.transform.localPosition = new Vector3(ModConfig.StatusBarX.Value, ModConfig.StatusBarY.Value, 0f);
			}
		}

		public static void Create(StatsUI orig)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Expected O, but got Unknown
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			if ((SemiFunc.RunIsShop() || SemiFunc.RunIsLevel()) && ModConfig.ShowHud.Value)
			{
				GameObject val = GameObject.Find("Game Hud");
				GameObject val2 = GameObject.Find("Tax Haul");
				GameObject val3 = new GameObject("LevelStatsUI");
				val3.transform.localPosition = new Vector3(ModConfig.StatusBarX.Value, ModConfig.StatusBarY.Value, 0f);
				val3.AddComponent(typeof(TextMeshProUGUI));
				TextMeshProUGUI component = val3.GetComponent<TextMeshProUGUI>();
				((TMP_Text)component).font = val2.GetComponent<TMP_Text>().font;
				((TMP_Text)component).fontSize = 19f;
				((TMP_Text)component).enableWordWrapping = false;
				((TMP_Text)component).alignment = (TextAlignmentOptions)257;
				val3.transform.SetParent(val.transform, false);
				val3.AddComponent<LevelStatsUI>();
			}
		}

		[IteratorStateMachine(typeof(<EnableOvercharge>d__11))]
		private IEnumerator EnableOvercharge()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <EnableOvercharge>d__11(0)
			{
				<>4__this = this
			};
		}

		private void ScootLogic()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			((SemiUI)this).SemiUIScoot(new Vector2(0f, 0f));
		}

		public static string ColoredText(string text, Color color)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			string text2 = ColorUtility.ToHtmlStringRGB(color);
			return ColoredText(text, "#" + text2);
		}

		public static string ColoredText(string text, string hexColor)
		{
			return "<color=" + hexColor + ">" + text + "</color>";
		}

		private void SetText()
		{
			//IL_0047: 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_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			//IL_028f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_0312: Unknown result type (might be due to invalid IL or missing references)
			//IL_0347: Unknown result type (might be due to invalid IL or missing references)
			//IL_0374: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03de: Unknown result type (might be due to invalid IL or missing references)
			//IL_0413: Unknown result type (might be due to invalid IL or missing references)
			//IL_0450: Unknown result type (might be due to invalid IL or missing references)
			if (!SemiFunc.RunIsShop() && !SemiFunc.RunIsLevel())
			{
				return;
			}
			if (ModConfig.HudShowLevel.Value)
			{
				DrawLine("<size=150%>LEVEL", LevelStats.CurrentLevel + "<size=100%>", GrayColor);
			}
			if (ModConfig.HudShowLevel.Value)
			{
				DrawLine("CHALLENGE", ChallengeManager.CurrentChallengeName(), GrayColor);
			}
			if (ModConfig.HudShowTime.Value)
			{
				DrawLine("TIME", LevelStats.Time.GetTimeString(), GrayColor);
			}
			if (ModConfig.HudShowSaved.Value && CartInventory.Instance.SaveManager.Data.TrackDollars > 0)
			{
				DrawLine("SAVED", CartInventory.Instance.SaveManager.Data.TrackDollars.FormatDollars(), DollarColor);
			}
			if (SemiFunc.RunIsShop())
			{
				return;
			}
			(int, float) collectedCount = LevelStats.GetCollectedCount();
			if (ModConfig.HudShowCollected.Value)
			{
				string arg = "";
				if (ModConfig.HudShowCollectedPercent.Value)
				{
					decimal num = ((LevelStats.ValuableObjects.Count > 0) ? ((decimal)collectedCount.Item1 / (decimal)LevelStats.ValuableObjects.Count) : 1m);
					arg = $"({num:p})";
				}
				DrawLine("COLLECTED", $"{collectedCount.Item1} / {LevelStats.ValuableObjects.Count}{arg}", GrayColor);
			}
			if (ModConfig.HudShowDollars.Value)
			{
				string text = "";
				if (ModConfig.HudShowDollarsPercent.Value)
				{
					decimal num2 = ((LevelStats.LevelDollars > 0f) ? ((decimal)collectedCount.Item2 / (decimal)LevelStats.LevelDollars) : 1m);
					text = $"({num2:p})";
				}
				DrawLine("DOLLARS", collectedCount.Item2.FormatDollars() + " / " + LevelStats.LevelDollars.FormatDollars() + text, DollarColor);
			}
			if (ModConfig.HudShowLost.Value && LevelStats.TotalLost > 0f)
			{
				DrawLine("LOST", LevelStats.TotalLost.FormatDollars(), DangerColor);
			}
			if (ModConfig.HudShowExplored.Value)
			{
				DrawLine("EXPLORED", $"{LevelStats.ExploredModules} / {LevelStats.TotalModules}", GrayColor);
			}
			if (ModConfig.HudShowImmortal.Value)
			{
				DrawLine("IMMORTAL", $"{LevelStats.ImmortalEnemies.Count} / {LevelStats.EnemyTotal}", DangerColor);
			}
			if (ModConfig.HudShowKills.Value)
			{
				DrawLine("KILLS", $"{LevelStats.EnemyKills}", GrayColor);
			}
			if (!ModConfig.HudShowCarts.Value)
			{
				return;
			}
			int num3 = 0;
			DrawLine("CARTS", "", Color.green);
			foreach (PhysGrabCart cart in LevelStats.Carts)
			{
				if (Object.op_Implicit((Object)(object)cart))
				{
					int value = Traverse.Create((object)cart).Field("haulCurrent").GetValue<int>();
					int num4 = Mathf.RoundToInt(Vector3.Distance(((Component)PlayerController.instance).transform.position, ((Component)cart).transform.position));
					TextMeshProUGUI obj = statsText;
					((TMP_Text)obj).text = ((TMP_Text)obj).text + $"<line-height=60%>  cart-{num3++} / {ColoredText(num4.ToString(), GrayColor)}m";
					if (value > 0)
					{
						TextMeshProUGUI obj2 = statsText;
						((TMP_Text)obj2).text = ((TMP_Text)obj2).text + " / " + ColoredText(value.FormatDollars(), DollarColor);
					}
					TextMeshProUGUI obj3 = statsText;
					((TMP_Text)obj3).text = ((TMP_Text)obj3).text + "\n";
				}
			}
		}

		private void DrawLine(string key, string value, Color valueColor)
		{
			//IL_002d: 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)
			TextMeshProUGUI val = statsText;
			((TMP_Text)val).text = ((TMP_Text)val).text + "<line-height=60%><font-weight=900>" + ColoredText(key + ": ", KeyColor) + "</font-weight> " + ColoredText(value, valueColor) + "\n";
		}
	}
	public static class ModConfig
	{
		private static ConfigDescription ChanceRange = new ConfigDescription("", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>());

		public static ConfigEntry<bool>? EnableValuableConvert { get; private set; }

		public static ConfigEntry<float>? CartVacuumCleanerScale { get; private set; }

		public static ConfigEntry<bool>? EnableInternetShop { get; private set; }

		public static ConfigEntry<bool>? SkipShopLevel { get; private set; }

		public static ConfigEntry<string>? InternetShopKey { get; private set; }

		public static ConfigEntry<bool>? ShowHud { get; private set; }

		public static ConfigEntry<float>? StatusBarX { get; private set; }

		public static ConfigEntry<float>? StatusBarY { get; private set; }

		public static ConfigEntry<bool>? EnableTruckItems { get; private set; }

		public static ConfigEntry<string>? TruckExtractionKey { get; private set; }

		public static ConfigEntry<string>? BagSplitKey { get; private set; }

		public static ConfigEntry<bool>? CarefulMode { get; private set; }

		public static ConfigEntry<bool>? CarefulOrbDamage { get; private set; }

		public static ConfigEntry<int>? CarefulSkipChance { get; private set; }

		public static ConfigEntry<int>? CarefulSpawnT3Price { get; private set; }

		public static ConfigEntry<int>? CarefulSpawnT2Price { get; private set; }

		public static ConfigEntry<int>? CarefulSpawnT1Price { get; private set; }

		public static ConfigEntry<bool>? EnableModuleScaling { get; private set; }

		public static ConfigEntry<bool>? EnableValuableScaling { get; private set; }

		public static ConfigEntry<bool>? EnableEnemyScaling { get; private set; }

		public static ConfigEntry<bool>? EnableImmortalEnemy { get; private set; }

		public static ConfigEntry<int>? ImmortalEnemyChance { get; private set; }

		public static ConfigEntry<int>? EnemyScalingSkipLevels { get; private set; }

		public static ConfigEntry<float>? EnemyTier1Multiplier { get; private set; }

		public static ConfigEntry<float>? EnemyTier2Multiplier { get; private set; }

		public static ConfigEntry<float>? EnemyTier3Multiplier { get; private set; }

		public static ConfigEntry<bool>? EnableExtractionScaling { get; private set; }

		public static ConfigEntry<bool>? HudShowLevel { get; private set; }

		public static ConfigEntry<bool>? HudShowTime { get; private set; }

		public static ConfigEntry<bool>? HudShowSaved { get; private set; }

		public static ConfigEntry<bool>? HudShowCollected { get; private set; }

		public static ConfigEntry<bool>? HudShowCollectedPercent { get; private set; }

		public static ConfigEntry<bool>? HudShowDollars { get; private set; }

		public static ConfigEntry<bool>? HudShowDollarsPercent { get; private set; }

		public static ConfigEntry<bool>? HudShowLost { get; private set; }

		public static ConfigEntry<bool>? HudShowExplored { get; private set; }

		public static ConfigEntry<bool>? HudShowImmortal { get; private set; }

		public static ConfigEntry<bool>? HudShowKills { get; private set; }

		public static ConfigEntry<bool>? HudShowCarts { get; private set; }

		public static void Configure(ConfigFile config)
		{
			Cart(config);
			Shop(config);
			Hud(config);
			Truck(config);
			CfMode(config);
			Scaling(config);
		}

		private static void Cart(ConfigFile config)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			string text = "Cart";
			ConfigDescription val = new ConfigDescription("", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.5f, 10f), Array.Empty<object>());
			EnableValuableConvert = config.Bind<bool>(text, "Enable valuable convert", true, (ConfigDescription)null);
			CartVacuumCleanerScale = config.Bind<float>(text, "Cart vacuum cleaner scale", 0.6f, val);
		}

		private static void Shop(ConfigFile config)
		{
			string text = "Internet shop";
			EnableInternetShop = config.Bind<bool>(text, "Enable new shop interface", true, (ConfigDescription)null);
			SkipShopLevel = config.Bind<bool>(text, "Skip shop level", true, (ConfigDescription)null);
			InternetShopKey = config.Bind<string>(text, "Shop open button", "l", (ConfigDescription)null);
		}

		private static void Hud(ConfigFile config)
		{
			string text = "Status hud";
			ShowHud = config.Bind<bool>(text, "Show hud", true, (ConfigDescription)null);
			StatusBarX = config.Bind<float>(text, "Hud position x", -240f, (ConfigDescription)null);
			StatusBarY = config.Bind<float>(text, "Hud position y", 30f, (ConfigDescription)null);
			HudShowLevel = config.Bind<bool>(text, "Show level", true, (ConfigDescription)null);
			HudShowTime = config.Bind<bool>(text, "Show time", true, (ConfigDescription)null);
			HudShowSaved = config.Bind<bool>(text, "Show saved dollars", true, (ConfigDescription)null);
			HudShowCollected = config.Bind<bool>(text, "Show collected valuables", true, (ConfigDescription)null);
			HudShowCollectedPercent = config.Bind<bool>(text, "Show collected valuables percent", true, (ConfigDescription)null);
			HudShowDollars = config.Bind<bool>(text, "Show level dollars", true, (ConfigDescription)null);
			HudShowDollarsPercent = config.Bind<bool>(text, "Show level dollars collected percent", true, (ConfigDescription)null);
			HudShowLost = config.Bind<bool>(text, "Show lost dollars", true, (ConfigDescription)null);
			HudShowExplored = config.Bind<bool>(text, "Show amount of explored modules", true, (ConfigDescription)null);
			HudShowImmortal = config.Bind<bool>(text, "Show immortal enemies", true, (ConfigDescription)null);
			HudShowKills = config.Bind<bool>(text, "Show kills", true, (ConfigDescription)null);
			HudShowCarts = config.Bind<bool>(text, "Show carts info", true, (ConfigDescription)null);
		}

		private static void Truck(ConfigFile config)
		{
			string text = "Truck";
			EnableTruckItems = config.Bind<bool>(text, "Enable save items in truck", true, (ConfigDescription)null);
			TruckExtractionKey = config.Bind<string>(text, "Button to extract truck dollars into cart", "Slash", (ConfigDescription)null);
			BagSplitKey = config.Bind<string>(text, "Button to split grabbed bag", "Period", (ConfigDescription)null);
		}

		private static void CfMode(ConfigFile config)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			string text = "Careful mode";
			ConfigDescription val = new ConfigDescription("", (AcceptableValueBase)(object)new AcceptableValueRange<int>(2, 20000), Array.Empty<object>());
			CarefulMode = config.Bind<bool>(text, "Enable", true, (ConfigDescription)null);
			CarefulOrbDamage = config.Bind<bool>(text, "Register orb damage", false, (ConfigDescription)null);
			CarefulSkipChance = config.Bind<int>(text, "Chance skip spawn, damage saved to next iteration", 40, ChanceRange);
			CarefulSpawnT3Price = config.Bind<int>(text, "Damage to spawn enemy tier 3", 5000, val);
			CarefulSpawnT2Price = config.Bind<int>(text, "Damage to spawn enemy tier 2", 3000, val);
			CarefulSpawnT1Price = config.Bind<int>(text, "Damage to spawn enemy tier 1", 2000, val);
		}

		private static void Scaling(ConfigFile config)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			string text = "Scaling";
			ConfigDescription val = new ConfigDescription("", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 10f), Array.Empty<object>());
			EnableModuleScaling = config.Bind<bool>(text, "Enable module amount scaling", true, (ConfigDescription)null);
			EnableValuableScaling = config.Bind<bool>(text, "Enable valuable amount and price scaling", true, (ConfigDescription)null);
			EnableEnemyScaling = config.Bind<bool>(text, "Enable enemy amount scaling", true, (ConfigDescription)null);
			EnableImmortalEnemy = config.Bind<bool>(text, "Enable immortal enemies", true, (ConfigDescription)null);
			ImmortalEnemyChance = config.Bind<int>(text, "Immortal spawn chance", 30, ChanceRange);
			EnemyScalingSkipLevels = config.Bind<int>(text, "Enemy scaling skip levels", 1, (ConfigDescription)null);
			EnemyTier3Multiplier = config.Bind<float>(text, "Enemy tier 3 amount multiplier", 1.2f, val);
			EnemyTier2Multiplier = config.Bind<float>(text, "Enemy tier 2 amount multiplier", 1.4f, val);
			EnemyTier1Multiplier = config.Bind<float>(text, "Enemy tier 1 amount multiplier", 1.8f, val);
			EnableExtractionScaling = config.Bind<bool>(text, "Enable extraction amount scaling", true, (ConfigDescription)null);
		}
	}
	public class SaveManager
	{
		private string _currentSaveId = "default";

		public SaveData Data { get; private set; } = new SaveData();


		public void UpdateSaveId()
		{
			try
			{
				if ((Object)(object)StatsManager.instance != (Object)null)
				{
					string text = (string)AccessTools.Field(typeof(StatsManager), "saveFileCurrent").GetValue(StatsManager.instance);
					if (!string.IsNullOrEmpty(text))
					{
						if (text.EndsWith(".sav"))
						{
							text = text.Substring(0, text.Length - 4);
						}
						_currentSaveId = text;
						return;
					}
				}
				if (string.IsNullOrEmpty(_currentSaveId))
				{
					_currentSaveId = "default";
				}
			}
			catch (Exception)
			{
				if (string.IsNullOrEmpty(_currentSaveId))
				{
					_currentSaveId = "default";
				}
			}
		}

		public string GetCurrentSaveFilePath()
		{
			return Path.Combine(Path.Combine(Paths.ConfigPath, "CartInventory"), _currentSaveId + ".json");
		}

		public void Save()
		{
			if (SemiFunc.IsMultiplayer())
			{
				return;
			}
			string currentSaveFilePath = GetCurrentSaveFilePath();
			if (!File.Exists(currentSaveFilePath))
			{
				string directoryName = Path.GetDirectoryName(currentSaveFilePath);
				if (directoryName != null && !Directory.Exists(directoryName))
				{
					Directory.CreateDirectory(directoryName);
				}
			}
			string contents = JsonConvert.SerializeObject((object)Data, (Formatting)1);
			File.WriteAllText(currentSaveFilePath, contents);
		}

		public void Load()
		{
			if (SemiFunc.IsMultiplayer())
			{
				return;
			}
			string currentSaveFilePath = GetCurrentSaveFilePath();
			if (File.Exists(currentSaveFilePath))
			{
				SaveData saveData = JsonConvert.DeserializeObject<SaveData>(File.ReadAllText(currentSaveFilePath));
				if (saveData != null)
				{
					Data = saveData;
				}
			}
		}

		public void Delete()
		{
			if (!SemiFunc.IsMultiplayer())
			{
				Data.TrackDollars = 0;
				string currentSaveFilePath = GetCurrentSaveFilePath();
				if (File.Exists(currentSaveFilePath))
				{
					File.Delete(currentSaveFilePath);
				}
			}
		}
	}
	public static class SpawnHelper
	{
		[CompilerGenerated]
		private sealed class <SpawnEnemyAfterTime>d__7 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public EnemySetup enemySetup;

			public Vector3 position;

			public TimeSpan timeSpan;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <SpawnEnemyAfterTime>d__7(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_002d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0037: Expected O, but got Unknown
				//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)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds((float)timeSpan.TotalSeconds);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					Enemies.SpawnEnemy(enemySetup, position, Quaternion.identity, false);
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public static List<ValuableObject> SpawnedBags { get; } = new List<ValuableObject>();


		public static void SpawnTaxBagInCart(PhysGrabCart cart, int dollars)
		{
			//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_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: 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)
			Vector3 position = ((Component)cart).transform.position;
			Vector3 spawnPosition = default(Vector3);
			((Vector3)(ref spawnPosition))..ctor(position.x, position.y + 0.1f, position.z);
			SpawnTaxBag(spawnPosition, dollars);
		}

		public static void SpawnTaxBag(Vector3 spawnPosition, int dollars)
		{
			//IL_0031: 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_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			GameObject surplusValuableSmall = AssetManager.instance.surplusValuableSmall;
			GameObject val = (SemiFunc.IsMultiplayer() ? PhotonNetwork.InstantiateRoomObject("Valuables/" + ((Object)surplusValuableSmall).name, spawnPosition, Quaternion.identity, (byte)0, (object[])null) : Object.Instantiate<GameObject>(surplusValuableSmall, spawnPosition, Quaternion.identity));
			ValuableObject component = val.GetComponent<ValuableObject>();
			PhysGrabObject component2 = val.GetComponent<PhysGrabObject>();
			Traverse.Create((object)component2).Field("spawnTorque").SetValue((object)(Random.insideUnitSphere * 0.05f));
			component.SetDollarValue(dollars);
			SpawnedBags.Add(component);
		}

		public static void SpawnEnemy(string name, Vector3 spawnPosition, int count = 1)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			if (EnemyDirector.instance.TryGetEnemyThatContainsName(name, out EnemySetup enemySetup))
			{
				SpawnEnemy(enemySetup, spawnPosition, count);
			}
		}

		public static void SpawnEnemy(EnemySetup setup, Vector3 spawnPosition, int count = 1)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: 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_008b: 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)
			LevelPoint val = null;
			float num = 500f;
			foreach (LevelPoint levelPathPoint in LevelGenerator.Instance.LevelPathPoints)
			{
				if ((double)Vector3.Distance(((Component)levelPathPoint).transform.position, spawnPosition) < (double)num)
				{
					val = levelPathPoint;
					num = Vector3.Distance(((Component)levelPathPoint).transform.position, spawnPosition);
				}
			}
			if (!((Object)(object)val == (Object)null))
			{
				for (int i = 0; i < count; i++)
				{
					Enemies.SpawnEnemy(setup, ((Component)val).transform.position, Quaternion.identity, false);
				}
			}
		}

		[IteratorStateMachine(typeof(<SpawnEnemyAfterTime>d__7))]
		private static IEnumerator SpawnEnemyAfterTime(EnemySetup enemySetup, Vector3 position, TimeSpan timeSpan)
		{
			//IL_000e: 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)
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <SpawnEnemyAfterTime>d__7(0)
			{
				enemySetup = enemySetup,
				position = position,
				timeSpan = timeSpan
			};
		}
	}
	public class TruckController
	{
		public static List<ValuableAndPhysic> TruckItems = new List<ValuableAndPhysic>();

		private Transform? _truckTransform;

		private static float objectInTruckCheckTimer = 0.5f;

		public TruckController()
		{
			_truckTransform = FindTruckInterior();
		}

		public void CheckTruckValuables()
		{
			//IL_0044: 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_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_truckTransform == (Object)null)
			{
				_truckTransform = FindTruckInterior();
			}
			else
			{
				if (!SemiFunc.IsMasterClientOrSingleplayer())
				{
					return;
				}
				TruckItems.Clear();
				Collider[] array = Physics.OverlapBox(_truckTransform.position, _truckTransform.localScale / 2f, _truckTransform.rotation);
				Collider[] array2 = array;
				foreach (Collider val in array2)
				{
					if (((Component)val).gameObject.layer != LayerMask.NameToLayer("PhysGrabObject"))
					{
						continue;
					}
					PhysGrabObject componentInParent1 = ((Component)val).GetComponentInParent<PhysGrabObject>();
					if (Object.op_Implicit((Object)(object)componentInParent1) && TruckItems.All((ValuableAndPhysic x) => (Object)(object)x.Physic != (Object)(object)componentInParent1))
					{
						ValuableObject componentInParent2 = ((Component)val).GetComponentInParent<ValuableObject>();
						if (Object.op_Implicit((Object)(object)componentInParent2))
						{
							TruckItems.Add(new ValuableAndPhysic(componentInParent2, componentInParent1));
						}
					}
				}
				if (!TruckItems.Any())
				{
					return;
				}
				foreach (ValuableAndPhysic truckItem in TruckItems)
				{
					float dollarValue = truckItem.Valuable.GetDollarValue();
					CartInventory.Instance.SaveManager.Data.TrackDollars += (int)dollarValue;
					truckItem.Physic.DestroyPhysGrabObject();
				}
				CartInventory.Instance.SaveManager.UpdateSaveId();
				CartInventory.Instance.SaveManager.Save();
			}
		}

		public static Transform? FindTruckInterior()
		{
			RoomVolume[] array = Object.FindObjectsOfType<RoomVolume>();
			foreach (RoomVolume val in array)
			{
				if (val.Truck)
				{
					return ((Component)val).transform;
				}
			}
			GameObject[] array2 = (from go in Object.FindObjectsOfType<GameObject>()
				where ((Object)go).name.Contains("Truck") && (((Object)go).name.Contains("Interior") || ((Object)go).name.Contains("Inside") || ((Object)go).name.Contains("Room"))
				select go).ToArray();
			if (array2.Length != 0)
			{
				return array2[0].transform;
			}
			TruckDoor val2 = Object.FindObjectOfType<TruckDoor>();
			return ((Object)(object)val2 != (Object)null) ? ((Component)val2).transform : null;
		}
	}
}
namespace CartInventory.Shop
{
	public class ShopSystem
	{
		public static Dictionary<Item, int> PurchasedItems = new Dictionary<Item, int>();

		public static int PurchasePrice;

		private static readonly Dictionary<Item, int> Items = new Dictionary<Item, int>();

		public static void UpdateShopItems()
		{
			Items.Clear();
			PurchasedItems.Clear();
			Dictionary<string, Item>.ValueCollection values = StatsManager.instance.itemDictionary.Values;
			foreach (Item item in values)
			{
				item.maxAmountInShop = 20;
				item.maxPurchaseAmount = 20;
				item.maxPurchase = true;
				int value = CalculateValue(item);
				Items.Add(item, value);
				PurchasedItems.Add(item, 0);
			}
		}

		public static bool Buy()
		{
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Invalid comparison between Unknown and I4
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Invalid comparison between Unknown and I4
			if (PurchasePrice > SemiFunc.StatGetRunCurrency())
			{
				return false;
			}
			List<Item> list = new List<Item>();
			foreach (KeyValuePair<Item, int> purchasedItem in PurchasedItems)
			{
				if (purchasedItem.Value <= 0)
				{
					continue;
				}
				for (int i = 0; i < purchasedItem.Value; i++)
				{
					StatsManager.instance.ItemPurchase(purchasedItem.Key.itemAssetName);
					if ((int)purchasedItem.Key.itemType == 3)
					{
						StatsManager.instance.AddItemsUpgradesPurchased(purchasedItem.Key.itemAssetName);
					}
					if ((int)purchasedItem.Key.itemType == 5)
					{
						StatsManager.instance.runStats["chargingStationChargeTotal"] += 17;
						if (StatsManager.instance.runStats["chargingStationChargeTotal"] > 100)
						{
							StatsManager.instance.runStats["chargingStationChargeTotal"] = 100;
						}
						else
						{
							Traverse val = Traverse.Create((object)ChargingStation.instance).Field("chargeInt");
							val.SetValue((object)(val.GetValue<int>() + 1));
						}
						UpdateChargeStation();
					}
					else
					{
						list.Add(purchasedItem.Key);
					}
				}
			}
			SemiFunc.StatSetRunCurrency(SemiFunc.StatGetRunCurrency() - PurchasePrice);
			return true;
		}

		public static void RecalculatePrice()
		{
			PurchasePrice = 0;
			foreach (KeyValuePair<Item, int> purchasedItem in PurchasedItems)
			{
				PurchasePrice += Items[purchasedItem.Key] * purchasedItem.Value;
			}
		}

		public static bool AllowBuy()
		{
			return PurchasePrice <= SemiFunc.StatGetRunCurrency();
		}

		public static Dictionary<Item, int> GetItems()
		{
			return Items;
		}

		private static void UpdateChargeStation()
		{
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			float num = (float)StatsManager.instance.runStats["chargingStationChargeTotal"] / 100f;
			int value = Traverse.Create((object)ChargingStation.instance).Field("chargeSegments").GetValue<int>();
			int num2 = Mathf.RoundToInt(num * (float)value);
			Traverse.Create((object)ChargingStation.instance).Field("chargeTotal").SetValue((object)StatsManager.instance.runStats["chargingStationChargeTotal"]);
			Traverse.Create((object)ChargingStation.instance).Field("chargeFloat").SetValue((object)num);
			Traverse.Create((object)ChargingStation.instance).Field("chargeSegmentCurrent").SetValue((object)num2);
			Traverse.Create((object)ChargingStation.instance).Field("chargeScale").SetValue((object)num);
			Traverse.Create((object)ChargingStation.instance).Field("chargeScaleTarget").SetValue((object)(num2 / value));
			Transform value2 = Traverse.Create((object)ChargingStation.instance).Field("chargeBar").GetValue<Transform>();
			if ((Object)(object)value2 != (Object)null)
			{
				value2.localScale = new Vector3(num, 1f, 1f);
			}
			Debug.Log((object)("Charging station charge total: " + StatsManager.instance.runStats["chargingStationChargeTotal"]));
		}

		private static void TruckPopulateItems(List<Item> items)
		{
			if (SemiFunc.IsNotMasterClient())
			{
				return;
			}
			while (items.Count > 0)
			{
				bool flag = false;
				for (int i = 0; i < items.Count; i++)
				{
					Item item = items[i];
					SpawnItem(item);
					items.RemoveAt(i);
				}
			}
		}

		private static void SpawnItem(Item item)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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_0028: 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_005d: 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_007e: 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)
			Quaternion rotation = ((Component)ShopManager.instance.itemRotateHelper).transform.rotation;
			Vector3 position = ((Component)TruckHealer.instance).transform.position;
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(position.x, 1f, position.z);
			if (SemiFunc.IsMasterClient())
			{
				PhotonNetwork.InstantiateRoomObject("Items/" + ((Object)item.prefab).name, val, rotation, (byte)0, (object[])null);
			}
			else if (!SemiFunc.IsMultiplayer())
			{
				Object.Instantiate<GameObject>(item.prefab, val, rotation);
			}
		}

		private static int CalculateValue(Item item)
		{
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Invalid comparison between Unknown and I4
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Invalid comparison between Unknown and I4
			float value = Traverse.Create((object)ShopManager.instance).Field("itemValueMultiplier").GetValue<float>();
			float num = Random.Range(item.value.valueMin, item.value.valueMax) * value;
			if ((double)num < 1000.0)
			{
				num = 1000f;
			}
			float num2 = Mathf.Ceil(num / 1000f);
			if ((int)item.itemType == 3)
			{
				num2 = ShopManager.instance.UpgradeValueGet(num2, item);
			}
			else if ((int)item.itemType == 8)
			{
				num2 = ShopManager.instance.HealthPackValueGet(num2);
			}
			else if ((int)item.itemType == 5)
			{
				num2 = ShopManager.instance.CrystalValueGet(num2);
			}
			return (int)num2;
		}
	}
	public class ShopUI
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static Action <>9__9_1;

			public static BuilderDelegate <>9__9_0;

			public static Action <>9__10_1;

			public static BuilderDelegate <>9__10_0;

			internal void <Initialize>b__9_0(Transform parent)
			{
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("Internet shop", (Action)delegate
				{
					ShowPopup();
				}, parent, new Vector2(350f, 20f));
			}

			internal void <Initialize>b__9_1()
			{
				ShowPopup();
			}

			internal void <ShowPopup>b__10_0(Transform p)
			{
				//IL_0020: 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)
				_label = MenuAPI.CreateREPOLabel($"TOTAL: 0/{SemiFunc.StatGetRunCurrency()}", p, new Vector2(30f, 20f));
				_buyButton = MenuAPI.CreateREPOButton(_buyText, (Action)delegate
				{
					if (!ShopSystem.Buy())
					{
						((TMP_Text)_buyButton.labelTMP).text = _buyErrorText;
						((MonoBehaviour)_buyButton).StartCoroutine(ButtonError(0.5f));
					}
					else
					{
						_popup.ClosePage(false);
					}
				}, p, new Vector2(370f, 20f));
			}

			internal void <ShowPopup>b__10_1()
			{
				if (!ShopSystem.Buy())
				{
					((TMP_Text)_buyButton.labelTMP).text = _buyErrorText;
					((MonoBehaviour)_buyButton).StartCoroutine(ButtonError(0.5f));
				}
				else
				{
					_popup.ClosePage(false);
				}
			}
		}

		[CompilerGenerated]
		private sealed class <ButtonError>d__11 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public float time;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <ButtonError>d__11(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_0031: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(time);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					((TMP_Text)_buyButton.labelTMP).text = _buyText;
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private static readonly List<(REPOSlider, Item, int)> Sliders = new List<(REPOSlider, Item, int)>();

		private static REPOPopupPage? _popup;

		private static REPOLabel _label;

		private static REPOButton _buyButton;

		private static string _selectedType = "All";

		private static Dictionary<string, REPOButton> _buttons = new Dictionary<string, REPOButton>();

		private static string _buyText = "<color=#CCCCCC><b>Buy</b></color>";

		private static string _buyAllowText = "<color=#63ff95><b>Buy</b></color>";

		private static string _buyErrorText = "<color=#c41b27><b>Error</b></color>";

		public static void Initialize()
		{
			//IL_0015: 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_0020: Expected O, but got Unknown
			object obj = <>c.<>9__9_0;
			if (obj == null)
			{
				BuilderDelegate val = delegate(Transform parent)
				{
					//IL_0030: Unknown result type (might be due to invalid IL or missing references)
					MenuAPI.CreateREPOButton("Internet shop", (Action)delegate
					{
						ShowPopup();
					}, parent, new Vector2(350f, 20f));
				};
				<>c.<>9__9_0 = val;
				obj = (object)val;
			}
			MenuAPI.AddElementToEscapeMenu((BuilderDelegate)obj);
		}

		public static void ShowPopup()
		{
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Expected O, but got Unknown
			if (!SemiFunc.IsMasterClientOrSingleplayer() || !ModConfig.EnableInternetShop.Value || ((Object)(object)_popup != (Object)null && ((Behaviour)_popup.menuPage).enabled))
			{
				return;
			}
			_popup = MenuAPI.CreateREPOPopupPage("Shop", (PresetSide)0, false, true, 1.5f);
			REPOPopupPage? popup = _popup;
			object obj = <>c.<>9__10_0;
			if (obj == null)
			{
				BuilderDelegate val = delegate(Transform p)
				{
					//IL_0020: 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)
					_label = MenuAPI.CreateREPOLabel($"TOTAL: 0/{SemiFunc.StatGetRunCurrency()}", p, new Vector2(30f, 20f));
					_buyButton = MenuAPI.CreateREPOButton(_buyText, (Action)delegate
					{
						if (!ShopSystem.Buy())
						{
							((TMP_Text)_buyButton.labelTMP).text = _buyErrorText;
							((MonoBehaviour)_buyButton).StartCoroutine(ButtonError(0.5f));
						}
						else
						{
							_popup.ClosePage(false);
						}
					}, p, new Vector2(370f, 20f));
				};
				<>c.<>9__10_0 = val;
				obj = (object)val;
			}
			popup.AddElement((BuilderDelegate)obj);
			AddItems();
			CreateOutfitButtons();
			_popup.OpenPage(false);
		}

		[IteratorStateMachine(typeof(<ButtonError>d__11))]
		private static IEnumerator ButtonError(float time)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <ButtonError>d__11(0)
			{
				time = time
			};
		}

		private static void AddItems()
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Expected O, but got Unknown
			Sliders.Clear();
			ShopSystem.UpdateShopItems();
			foreach (KeyValuePair<Item, int> item in ShopSystem.GetItems())
			{
				_popup.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
				{
					//IL_0064: Unknown result type (might be due to invalid IL or missing references)
					REPOSlider val = MenuAPI.CreateREPOSlider(Regex.Replace(((Object)item.Key).name, "^Item\\s(Upgrade)?(\\sPlayer)?", "") + $"({item.Value}$)", "", (Action<int>)delegate(int i)
					{
						ShopSystem.PurchasedItems[item.Key] = i;
						OnChangeItems();
					}, scrollView, Vector2.zero, 0, item.Key.maxAmountInShop, 0, "", "", (BarBehavior)0);
					Sliders.Add((val, item.Key, item.Value));
					return ((REPOElement)val).rectTransform;
				}, 0f, 0f);
			}
		}

		private static void OnChangeItems()
		{
			ShopSystem.RecalculatePrice();
			((TMP_Text)_label.labelTMP).text = $"TOTAL: {ShopSystem.PurchasePrice}/{SemiFunc.StatGetRunCurrency()}";
			if (ShopSystem.AllowBuy())
			{
				((TMP_Text)_buyButton.labelTMP).text = _buyAllowText;
			}
			else
			{
				((TMP_Text)_buyButton.labelTMP).text = _buyText;
			}
		}

		private static void CreateOutfitButtons()
		{
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Expected O, but got Unknown
			_buttons.Clear();
			List<string> list = new List<string>
			{
				"All", "Drone", "Cart", "Upgrade", "Tools", "Crystal", "Grenade", "Melee", "HealthPack", "Gun",
				"Mine"
			};
			int num = 0;
			foreach (string type in list)
			{
				string buttonText = "<size=14><color=#CCCCCC>" + type + "</color></size>";
				int yPosition = 300 - (num - 1) * 14;
				REPOPopupPage? popup = _popup;
				if (popup != null)
				{
					popup.AddElement((BuilderDelegate)delegate(Transform parent)
					{
						//IL_0052: Unknown result type (might be due to invalid IL or missing references)
						_buttons[type] = MenuAPI.CreateREPOButton(buttonText, (Action)delegate
						{
							OnChangeType(type);
						}, parent, new Vector2(370f, (float)yPosition));
					});
				}
				num++;
			}
			OnChangeType(_selectedType);
		}

		private static void OnChangeType(string type)
		{
			_selectedType = type;
			foreach (KeyValuePair<string, REPOButton> button in _buttons)
			{
				((TMP_Text)button.Value.labelTMP).text = "<size=14><color=#CCCCCC>" + button.Key + "</color></size>";
			}
			((TMP_Text)_buttons[type].labelTMP).text = "<size=14><color=#63ff95><b>" + type + "</b></color></size>";
			switch (type)
			{
			case "All":
				ShowTypeSliders();
				break;
			case "Drone":
				ShowTypeSliders(default(itemType));
				break;
			case "Cart":
				ShowTypeSliders((itemType)2, (itemType)12);
				break;
			case "Upgrade":
				ShowTypeSliders((itemType)3, (itemType)4);
				break;
			case "Tools":
			{
				itemType[] array = new itemType[3];
				RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
				ShowTypeSliders((itemType[])(object)array);
				break;
			}
			case "Crystal":
				ShowTypeSliders((itemType)5);
				break;
			case "Grenade":
				ShowTypeSliders((itemType)6);
				break;
			case "Melee":
				ShowTypeSliders((itemType)7);
				break;
			case "HealthPack":
				ShowTypeSliders((itemType)8);
				break;
			case "Gun":
				ShowTypeSliders((itemType)9);
				break;
			case "Mine":
				ShowTypeSliders((itemType)11);
				break;
			}
		}

		private static void ShowTypeSliders(params itemType[] types)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			bool flag = types.Length == 0;
			foreach (var slider in Sliders)
			{
				if (flag || types.Contains(slider.Item2.itemType))
				{
					((REPOElement)slider.Item1).repoScrollViewElement.visibility = true;
				}
				else
				{
					((REPOElement)slider.Item1).repoScrollViewElement.visibility = false;
				}
			}
		}
	}
}
namespace CartInventory.Patches
{
	[HarmonyPatch(typeof(ChatManager))]
	internal class ChatManagerPatch
	{
		public static ChatState ChatState;

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void UpdatePatch(ref ChatState ___chatState)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			ChatState = ___chatState;
		}
	}
	[HarmonyPatch(typeof(EnemyDirector))]
	internal class EnemyDirectorPatch
	{
		[HarmonyPatch("AmountSetup")]
		[HarmonyPrefix]
		private static bool AmountSetupPrefix(ref EnemyDirector __instance, ref int ___amountCurve1Value, ref int ___amountCurve2Value, ref int ___amountCurve3Value, ref int ___totalAmount, ref List<EnemySetup> ___enemiesDifficulty1, ref List<EnemySetup> ___enemiesDifficulty2, ref List<EnemySetup> ___enemiesDifficulty3, ref List<EnemySetup> ___enemyListCurrent, ref float ___despawnedTimeMultiplier)
		{
			if (!ModConfig.EnableEnemyScaling.Value || LevelStats.CurrentLevel < ModConfig.EnemyScalingSkipLevels.Value + 1)
			{
				return true;
			}
			float num = SemiFunc.RunGetDifficultyMultiplier1();
			float num2 = SemiFunc.RunGetDifficultyMultiplier2();
			float num3 = SemiFunc.RunGetDifficultyMultiplier3();
			if ((double)num2 > 0.0)
			{
				___amountCurve3Value = Mathf.CeilToInt(__instance.amountCurve3_2.Evaluate(num2) * ModConfig.EnemyTier3Multiplier.Value) + 2;
				___amountCurve2Value = Mathf.CeilToInt(__instance.amountCurve2_2.Evaluate(num2) * ModConfig.EnemyTier2Multiplier.Value) + 2;
				___amountCurve1Value = Mathf.CeilToInt(__instance.amountCurve1_2.Evaluate(num2) * ModConfig.EnemyTier1Multiplier.Value) + 2;
			}
			else
			{
				___amountCurve3Value = Mathf.CeilToInt(__instance.amountCurve3_1.Evaluate(num) * ModConfig.EnemyTier3Multiplier.Value) + 1;
				___amountCurve2Value = Mathf.CeilToInt(__instance.amountCurve2_1.Evaluate(num) * ModConfig.EnemyTier2Multiplier.Value) + 1;
				___amountCurve1Value = Mathf.CeilToInt(__instance.amountCurve1_1.Evaluate(num) * ModConfig.EnemyTier1Multiplier.Value) + 1;
			}
			if (ChallengeManager.CurrentChallengeIs(global::CartInventory.Challenges.Challenges.MoneyTime))
			{
				___amountCurve3Value += 2;
				___amountCurve2Value += 4;
				___amountCurve1Value += 8;
			}
			Traverse val = Traverse.Create((object)EnemyDirector.instance);
			___enemyListCurrent.Clear();
			for (int i = 0; i < ___amountCurve1Value; i++)
			{
				val.Method("PickEnemies", new object[1] { ___enemiesDifficulty1 }).GetValue();
			}
			for (int j = 0; j < ___amountCurve2Value; j++)
			{
				val.Method("PickEnemies", new object[1] { ___enemiesDifficulty2 }).GetValue();
			}
			for (int k = 0; k < ___amountCurve3Value; k++)
			{
				val.Method("PickEnemies", new object[1] { ___enemiesDifficulty3 }).GetValue();
			}
			___despawnedTimeMultiplier = 1f;
			if ((double)num3 > 0.0)
			{
				___despawnedTimeMultiplier = __instance.despawnTimeCurve_2.Evaluate(num3);
			}
			else if ((double)num2 > 0.0)
			{
				___despawnedTimeMultiplier = __instance.despawnTimeCurve_1.Evaluate(num2);
			}
			___totalAmount = ___amountCurve1Value + ___amountCurve2Value + ___amountCurve3Value;
			return false;
		}

		[HarmonyPatch("PickEnemies")]
		[HarmonyPrefix]
		private static bool PickEnemies(EnemyDirector __instance)
		{
			if (SemiFunc.IsMasterClientOrSingleplayer() && ChallengeManager.CurrentChallengeIs(global::CartInventory.Challenges.Challenges.DuckRaid))
			{
				EnemySetup enemyThatContainsName = __instance.GetEnemyThatContainsName("Duck");
				__instance.GetEnemyListCurrent().Add(enemyThatContainsName);
				__instance.GetEnemyList().Add(enemyThatContainsName);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(EnemyHealth))]
	public class EnemyHealthPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		private static void Update(EnemyHealth __instance)
		{
			if (SemiFunc.IsMasterClientOrSingleplayer() && ModConfig.EnableImmortalEnemy.Value)
			{
				EnemyParent componentInParent = ((Component)__instance).GetComponentInParent<EnemyParent>();
				if ((Object)(object)componentInParent != (Object)null && LevelStats.ImmortalEnemies.Contains(componentInParent))
				{
					Traverse.Create((object)__instance).Field("deadImpulse").SetValue((object)false);
				}
			}
		}
	}
	[HarmonyPatch(typeof(EnemyParent))]
	public class EnemyParentPatch
	{
		private static List<string> ImmortalEnemies = new List<string> { "Head", "Robe", "Hunter", "Beamer" };

		[HarmonyPatch("Awake")]
		[HarmonyPrefix]
		private static void Awake(EnemyParent __instance)
		{
			LevelStats.EnemyTotal++;
		}

		[HarmonyPatch("SpawnRPC")]
		[HarmonyPostfix]
		private static void SpawnRPC(EnemyParent __instance)
		{
			EnemyParent __instance2 = __instance;
			LevelStats.EnemyTotal++;
			if (SemiFunc.IsMasterClientOrSingleplayer() && ModConfig.EnableImmortalEnemy.Value && ImmortalEnemies.Any((string name) => ((Object)((Component)__instance2).gameObject).name.Contains(name)) && Helpers.Chance(ModConfig.ImmortalEnemyChance.Value))
			{
				LevelStats.ImmortalEnemies.Add(__instance2);
			}
		}

		[HarmonyPatch("DespawnRPC")]
		[HarmonyPostfix]
		private static void DespawnRPC(EnemyParent __instance)
		{
			LevelStats.EnemyTotal--;
			if (SemiFunc.IsMasterClientOrSingleplayer() && LevelStats.ImmortalEnemies.Contains(__instance))
			{
				LevelStats.ImmortalEnemies.Remove(__instance);
			}
		}
	}
	[HarmonyPatch(typeof(EnemyValuable))]
	public class EnemyValuablePatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPrefix]
		private static void Start(EnemyValuable __instance)
		{
			LevelStats.EnemyKills++;
			ValuableObject component = ((Component)__instance).GetComponent<ValuableObject>();
			if ((Object)(object)component != (Object)null)
			{
				LevelStats.Orbs.Add(component);
			}
		}
	}
	[HarmonyPatch(typeof(ExtractionPoint))]
	public class ExtractionPointPatch
	{
		[HarmonyPatch("ActivateTheFirstExtractionPointAutomaticallyWhenAPlayerLeaveTruck")]
		[HarmonyPostfix]
		private static void ActivateTheFirstExtractionPointAutomaticallyWhenAPlayerLeaveTruck()
		{
			LevelStats.FirstExtractionPointOpened = true;
		}
	}
	[HarmonyPatch(typeof(LevelGenerator))]
	internal class LevelGeneratorPatch
	{
		private static int GetNewModuleCount()
		{
			if (!SemiFunc.RunIsLevel() || !ModConfig.EnableModuleScaling.Value)
			{
				return LevelStats.CurrentModCount;
			}
			return new LevelLerpBuilder().AddScalar(2f, 4 + LevelStats.CurrentLevel).Add(6f, 8f).Add(10f, 12f)
				.Add(20f, 16f)
				.Add(50f, 20f)
				.Add(100f, 25f)
				.GetIntValue(30f, 6f);
		}

		public static int GetNewExtractionCount()
		{
			if (!SemiFunc.RunIsLevel())
			{
				return 0;
			}
			if (!ModConfig.EnableExtractionScaling.Value)
			{
				return LevelStats.CurrentExtractionCount;
			}
			int currentLevel = LevelStats.CurrentLevel;
			if (1 == 0)
			{
			}
			int result = ((currentLevel <= 20) ? ((currentLevel <= 10) ? ((currentLevel <= 3) ? ((currentLevel > 2) ? 1 : 0) : ((currentLevel > 5) ? 3 : 2)) : ((currentLevel > 15) ? 5 : 4)) : ((currentLevel <= 50) ? ((currentLevel > 30) ? 7 : 6) : ((currentLevel > 100) ? 9 : 8)));
			if (1 == 0)
			{
			}
			return result;
		}

		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		[HarmonyTranspiler]
		private static IEnumerable<CodeInstruction> TileGenerationTranspiler(IEnumerable<CodeInstruction> inst)
		{
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Expected O, but got Unknown
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Expected O, but got Unknown
			//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Expected O, but got Unknown
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Expected O, but got Unknown
			//IL_022d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0237: Expected O, but got Unknown
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Expected O, but got Unknown
			List<CodeInstruction> list = new List<CodeInstruction>(inst);
			if (list.Count <= 20)
			{
				return list;
			}
			int num = -1;
			for (int i = 3; i < list.Count - 1; i++)
			{
				if (list[i].opcode == OpCodes.Ldfld && (FieldInfo)list[i].operand == AccessTools.Field(typeof(LevelGenerator), "ModuleAmount") && list[i + 1].opcode == OpCodes.Ldc_I4_3)
				{
					num = i - 3;
					break;
				}
			}
			if (num == -1)
			{
				return list;
			}
			int num2 = -1;
			for (int j = 1; j < list.Count - 1; j++)
			{
				if (list[j].opcode == OpCodes.Ldarg_0 && list[j + 1].opcode == OpCodes.Ldc_I4_M1 && list[j + 4].opcode == OpCodes.Ldfld && (FieldInfo)list[j + 4].operand == AccessTools.Field(typeof(LevelGenerator), "ExtractionAmount"))
				{
					num2 = j - 1;
					break;
				}
			}
			if (num2 == -1)
			{
				return list;
			}
			List<CodeInstruction> list2 = new List<CodeInstruction>();
			list2.Add(new CodeInstruction(OpCodes.Ldloc_1, (object)null));
			list2.Add(new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(LevelGeneratorPatch), "GetNewModuleCount", (Type[])null, (Type[])null)));
			list2.Add(new CodeInstruction(OpCodes.Stfld, (object)AccessTools.Field(typeof(LevelGenerator), "ModuleAmount")));
			List<CodeInstruction> collection = list2;
			list2 = new List<CodeInstruction>();
			list2.Add(new CodeInstruction(OpCodes.Ldloc_1, (object)null));
			list2.Add(new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(LevelGeneratorPatch), "GetNewExtractionCount", (Type[])null, (Type[])null)));
			list2.Add(new CodeInstruction(OpCodes.Stfld, (object)AccessTools.Field(typeof(LevelGenerator), "ExtractionAmount")));
			List<CodeInstruction> collection2 = list2;
			list.InsertRange(num2, collection2);
			list.InsertRange(num, collection);
			return list;
		}

		[HarmonyPatch("GenerateDone")]
		[HarmonyPostfix]
		private static void GenerateDonePostfix(ref int ___ModuleAmount, ref int ___ExtractionAmount)
		{
			LevelStats.Carts = (from cart in Object.FindObjectsOfType<PhysGrabCart>()
				where (Object)(object)cart != (Object)null
				select cart).ToList();
			CartInventory.Instance.SaveManager.UpdateSaveId();
			CartInventory.Instance.SaveManager.Load();
		}
	}
	[HarmonyPatch(typeof(MapModule))]
	internal class MapModulePatch
	{
		[HarmonyPatch("Hide")]
		[HarmonyPrefix]
		private static void HideP(ref bool ___animating)
		{
			if (!___animating)
			{
				LevelStats.AddModuleExplored();
			}
		}
	}
	[HarmonyPatch(typeof(Map))]
	internal class MapPatch
	{
		[HarmonyPatch("AddRoomVolume")]
		[HarmonyPostfix]
		private static void AddRoomVolumeP(ref Map __instance)
		{
			if (SemiFunc.IsMasterClientOrSingleplayer() && SemiFunc.RunIsLevel())
			{
				LevelStats.TotalModules = __instance.MapModules.Count;
			}
		}
	}
	[HarmonyPatch(typeof(MapToolController))]
	public class MapToolControllerPatch
	{
		public static bool MapIsOpen;

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void UpdateP2(ref bool ___Active, ref PhotonView ___photonView)
		{
			if (!GameManager.Multiplayer() || ___photonView.IsMine)
			{
				MapIsOpen = ___Active;
			}
		}
	}
	[HarmonyPatch(typeof(PhysGrabCart))]
	internal class PhysGrabCartPatch
	{
		private static float objectInCartCheckTimer = 0.5f;

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void Update(PhysGrabCart __instance, Transform ___inCart)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: 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)
			if ((double)objectInCartCheckTimer > 0.0)
			{
				objectInCartCheckTimer -= Time.deltaTime;
				return;
			}
			List<PhysGrabObject> list = new List<PhysGrabObject>();
			Collider[] array = Physics.OverlapBox(___inCart.position, ___inCart.localScale * ModConfig.CartVacuumCleanerScale.Value, ___inCart.rotation);
			Collider[] array2 = array;
			foreach (Collider val in array2)
			{
				if (((Component)val).gameObject.layer == LayerMask.NameToLayer("PhysGrabObject"))
				{
					PhysGrabObject componentInParent = ((Component)val).GetComponentInParent<PhysGrabObject>();
					if ((Object)(object)componentInParent != (Object)null && !list.Contains(componentInParent))
					{
						list.Add(componentInParent);
					}
				}
			}
			ObjectsInCart(__instance, list);
		}

		private static void ObjectsInCart(PhysGrabCart cart, List<PhysGrabObject> cartItems)
		{
			if (!CartInventory.Instance.IsLoaded)
			{
				return;
			}
			List<ValuableAndPhysic> list = (from x in cartItems
				where (Object)(object)x != (Object)null && (Object)(object)((Component)x).GetComponent<ValuableObject>() != (Object)null
				select x into v
				select new ValuableAndPhysic(((Component)v).GetComponent<ValuableObject>(), v)).ToList();
			if (list.Count == 0)
			{
				return;
			}
			List<ValuableAndPhysic> source = list.Where((ValuableAndPhysic v) => SpawnHelper.SpawnedBags.Contains(v.Valuable)).ToList();
			LevelStats.CartValuables[cart] = list.Select((ValuableAndPhysic vp) => vp.Valuable).ToList();
			float num = 0f;
			if (!ModConfig.EnableValuableConvert.Value || !SemiFunc.IsMasterClientOrSingleplayer())
			{
				return;
			}
			foreach (ValuableAndPhysic item in list)
			{
				float dollarValue = item.Valuable.GetDollarValue();
				if (!SpawnHelper.SpawnedBags.Contains(item.Valuable))
				{
					num += dollarValue;
					cartItems.Remove(item.Physic);
					item.Physic.DestroyPhysGrabObject();
				}
			}
			if (!source.Any())
			{
				SpawnHelper.SpawnTaxBagInCart(cart, (int)num);
			}
			else if (source.Count() > 1)
			{
				foreach (ValuableAndPhysic item2 in source.Skip(1))
				{
					float dollarValue2 = item2.Valuable.GetDollarValue();
					num += dollarValue2;
					cartItems.Remove(item2.Physic);
					SpawnHelper.SpawnedBags.Remove(item2.Valuable);
					item2.Physic.DestroyPhysGrabObject();
				}
			}
			if (num > 0f && source.Any())
			{
				ValuableAndPhysic valuableAndPhysic = source.First();
				float dollarValue3 = valuableAndPhysic.Valuable.GetDollarValue();
				float value = num + dollarValue3;
				valuableAndPhysic.Valuable.SetDollarValue(value);
			}
		}
	}
	[HarmonyPatch(typeof(PhysGrabObjectImpactDetector))]
	public class PhysGrabObjectImpactDetectorPatches
	{
		[HarmonyPatch("BreakRPC")]
		[HarmonyPostfix]
		private static void StartPostFix(float valueLost, PhysGrabObjectImpactDetector? __instance, bool _loseValue)
		{
			if (!_loseValue)
			{
				return;
			}
			LevelStats.TotalLost += valueLost;
			LevelStats.UpdateLevelDollars();
			ValuableObject val = ((__instance != null) ? ((Component)__instance).GetComponent<ValuableObject>() : null);
			if (ModConfig.CarefulMode.Value && (Object)(object)val != (Object)null && (!LevelStats.Orbs.Contains(val) || ModConfig.CarefulOrbDamage.Value))
			{
				LevelStats.TotalValuablesDamage += valueLost;
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					CarefulHelper.RollSpawn(val);
				}
			}
		}

		[HarmonyPatch(typeof(PhysGrabObject), "DestroyPhysGrabObjectRPC")]
		[HarmonyPostfix]
		public static void DestroyPhysGrabObjectPostfix(PhysGrabObject __instance)
		{
			if (SemiFunc.RunIsLevel())
			{
				ValuableObject component = ((Component)__instance).GetComponent<ValuableObject>();
				if ((Object)(object)component != (Object)null)
				{
					LevelStats.RemoveValuableObject(component);
					CarefulHelper.OnDestroy(component);
				}
			}
		}
	}
	[HarmonyPatch(typeof(PlayerController))]
	public class PlayerControllerPatch
	{
		public static GameObject? GrabbedObject = null;

		public static bool IsGrab = false;

		private static float LastSplit;

		private static readonly List<string> mouseBtns = new List<string> { "leftButton", "rightButton", "middleButton", "forwardButton", "backButton" };

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void UpdatePatch(PlayerController __instance)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Invalid comparison between Unknown and I4
			if ((int)ChatManagerPatch.ChatState != 1)
			{
				if (IsButtonPressed(ModConfig.TruckExtractionKey.Value))
				{
					ExtractDollars();
				}
				if (IsButtonPressed(ModConfig.BagSplitKey.Value))
				{
					SplitBags();
				}
				if (IsButtonPressed(ModConfig.InternetShopKey.Value))
				{
					ShopUI.ShowPopup();
				}
			}
		}

		[HarmonyPatch("FixedUpdate")]
		[HarmonyPostfix]
		private static void PlayerGrabItemPatch(PlayerController __instance)
		{
			if (!SemiFunc.RunIsShop() && !((Object)(object)__instance == (Object)null))
			{
				if (__instance.physGrabActive && (Object)(object)__instance.physGrabObject != (Object)null)
				{
					GrabbedObject = __instance.physGrabObject;
					IsGrab = true;
				}
				else
				{
					IsGrab = false;
				}
			}
		}

		private static void ExtractDollars()
		{
			//IL_0079: 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)
			if (CartInventory.Instance.SaveManager.Data.TrackDollars == 0)
			{
				return;
			}
			CartInventory.Instance.SaveManager.UpdateSaveId();
			CartInventory.Instance.SaveManager.Load();
			int num = 100000;
			PhysGrabCart val = null;
			foreach (PhysGrabCart cart in LevelStats.Carts)
			{
				if ((Object)(object)cart != (Object)null)
				{
					int num2 = Mathf.RoundToInt(Vector3.Distance(((Component)PlayerController.instance).transform.position, ((Component)cart).transform.position));
					if (num2 < num)
					{
						num = num2;
						val = cart;
					}
				}
			}
			if ((Object)(object)val != (Object)null)
			{
				SpawnHelper.SpawnTaxBagInCart(val, CartInventory.Instance.SaveManager.Data.TrackDollars);
				CartInventory.Instance.SaveManager.Data.TrackDollars = 0;
				CartInventory.Instance.SaveManager.Save();
			}
		}

		private static void SplitBags()
		{
			//IL_0076: 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_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			if (LevelStats.Time - LastSplit < 3f || !IsGrab)
			{
				return;
			}
			ValuableObject component = GrabbedObject.GetComponent<ValuableObject>();
			if ((Object)(object)component != (Object)null && SpawnHelper.SpawnedBags.Contains(component))
			{
				float dollarValue = component.GetDollarValue();
				if (!(dollarValue < 50f))
				{
					float num = dollarValue / 2f;
					Vector3 spawnPosition = default(Vector3);
					((Vector3)(ref spawnPosition))..ctor(((Component)component).transform.position.x, ((Component)component).transform.position.y + 1f, ((Component)component).transform.position.z);
					SpawnHelper.SpawnTaxBag(spawnPosition, (int)num);
					component.SetDollarValue(num);
					LastSplit = LevelStats.Time;
				}
			}
		}

		private static bool IsButtonPressed(string btn)
		{
			//IL_002b: 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)
			return ((!mouseBtns.Contains(btn)) ? ((ButtonControl)((InputControl)Keyboard.current)[btn]) : ((ButtonControl)((InputControl)Mouse.current)[btn])).isPressed;
		}
	}
	[HarmonyPatch(typeof(RunManager))]
	internal class RunManagerPatch
	{
		private static bool _goingToManiMenu;

		private static Level _nextLevel;

		[HarmonyPatch("ChangeLevel")]
		[HarmonyPrefix]
		private static void ChangeLevelPrefix(RunManager __instance, ChangeLevelType _changeLevelType)
		{
			if (CartInventory.Instance.IsLoaded)
			{
				SpawnHelper.SpawnedBags.Clear();
				LevelStats.Clear();
			}
		}

		[HarmonyPatch("ChangeLevel")]
		[HarmonyPostfix]
		private static void ChangeLevelPostfix(RunManager __instance, bool _completedLevel, bool _levelFailed, ChangeLevelType _changeLevelType)
		{
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				return;
			}
			if (ModConfig.SkipShopLevel.Value)
			{
				bool flag = false;
				if ((Object)(object)__instance.levelCurrent == (Object)(object)__instance.levelShop)
				{
					__instance.levelCurrent = __instance.levelLobby;
					_nextLevel = __instance.levelLobby;
					flag = true;
				}
				if ((Object)(object)_nextLevel != (Object)null)
				{
					Level nextLevel = _nextLevel;
					Level levelCurrent = __instance.levelCurrent;
					__instance.levelCurrent = nextLevel;
					_nextLevel = levelCurrent;
					flag = true;
				}
				if (SemiFunc.RunIsLevel())
				{
					_nextLevel = null;
				}
				if (flag && GameManager.Multiplayer())
				{
					RunManagerPUN value = Traverse.Create((object)__instance).Field("runManagerPUN").GetValue<RunManagerPUN>();
					PhotonView value2 = Traverse.Create((object)value).Field("photonView").GetValue<PhotonView>();
					value2.RPC("UpdateLevelRPC", (RpcTarget)4, new object[3]
					{
						((Object)__instance.levelCurrent).name,
						__instance.levelsCompleted,
						Traverse.Create((object)__instance).Field("gameOver").GetValue<bool>()
					});
				}
			}
			CartInventory.Instance.SaveManager.UpdateSaveId();
			if (SemiFunc.RunIsLevel() && LevelStats.CurrentLevel > 1)
			{
				ChallengeManager.RollChallenge();
			}
		}

		[HarmonyPatch("UpdateLevel")]
		[HarmonyPostfix]
		private static void UpdateLevelPostfix(RunManager __instance, string _levelName, int _levelsCompleted, bool _gameOver)
		{
			CartInventory.Instance.SaveManager.UpdateSaveId();
		}

		[HarmonyPatch("ResetProgress")]
		[HarmonyPostfix]
		private static void ResetProgressPostfix(RunManager __instance)
		{
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				CartInventory.Instance.SaveManager.UpdateSaveId();
			}
		}
	}
	[HarmonyPatch(typeof(StatsManager), "SaveFileDelete")]
	public class SaveFileDeletionPatch
	{
		[HarmonyPrefix]
		private static bool Prefix(string saveFileName)
		{
			CartInventory.Instance.SaveManager.Delete();
			return true;
		}
	}
	[HarmonyPatch(typeof(StatsManager))]
	public class StatsManagerPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void UpdateP()
		{
			LevelStats.Update();
		}
	}
	[HarmonyPatch(typeof(StatsUI))]
	internal class StatsUIPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		private static void StartP(ref StatsUI __instance)
		{
			LevelStatsUI.Create(__instance);
		}
	}
	[HarmonyPatch(typeof(TruckScreenText))]
	internal class TruckScreenTextPatch
	{
		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		private static void TruckScreenText_Awake()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			LevelStats.TruckScreenState = (PlayerChatBoxState)0;
		}

		[HarmonyPatch("PlayerChatBoxStateUpdateRPC")]
		[HarmonyPostfix]
		private static void TruckScreenText_PlayerChatBoxStateUpdateRPC(ref PlayerChatBoxState _state)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			LevelStats.TruckScreenState = _state;
		}
	}
	[HarmonyPatch(typeof(ValuableDirector))]
	internal class ValuableDirectorPatch
	{
		private static int TotalMaxAmount => Traverse.Create((object)ValuableDirector.instance).Field("totalMaxAmount").GetValue<int>();

		private static int TinyMaxAmount => Traverse.Create((object)ValuableDirector.instance).Field("tinyMaxAmount").GetValue<int>();

		private static int SmallMaxAmount => Traverse.Create((object)ValuableDirector.instance).Field("smallMaxAmount").GetValue<int>();

		private static int MediumMaxAmount => Traverse.Create((object)ValuableDirector.instance).Field("mediumMaxAmount").GetValue<int>();

		private static int BigMaxAmount => Traverse.Create((object)ValuableDirector.instance).Field("bigMaxAmount").GetValue<int>();

		private static int WideMaxAmount => Traverse.Create((object)ValuableDirector.instance).Field("wideMaxAmount").GetValue<int>();

		private static int TallMaxAmount => Traverse.Create((object)ValuableDirector.instance).Field("tallMaxAmount").GetValue<int>();

		private static int VeryTallMaxAmount => Traverse.Create((object)ValuableDirector.instance).Field("veryTallMaxAmount").GetValue<int>();

		private static float TotalMaxValue => Traverse.Create((object)ValuableDirector.instance).Field("totalMaxValue").GetValue<float>();

		public static float NewValueCount()
		{
			if (!ModConfig.EnableValuableScaling.Value)
			{
				return TotalMaxValue;
			}
			return new LevelLerpBuilder().Add(7f, 180f).Add(11f, 250f).Add(50f, 700f)
				.Add(100f, 1500f)
				.Add(1000f, 5000f)
				.Add(2000f, 10000f)
				.GetValue(10000f, 30f);
		}

		private static int MultiplyItemCount(int inAmount)
		{
			if (!ModConfig.EnableValuableScaling.Value)
			{
				return inAmount;
			}
			float value = new LevelLerpBuilder().AddScalar(2f, 1f).Add(4f, 1.4f).Add(6f, 1.8f)
				.Add(10f, 2f)
				.Add(15f, 2.4f)
				.Add(20f, 2.7f)
				.Add(30f, 3f)
				.Add(50f, 3.6f)
				.Add(75f, 4f)
				.Add(100f, 4.7f)
				.GetValue(5f);
			return Mathf.RoundToInt((float)inAmount * value);
		}

		private static int NewTotalItemCount()
		{
			return MultiplyItemCount(TotalMaxAmount);
		}

		private static int NewTinyItemCount()
		{
			if (ChallengeManager.CurrentChallengeIs(global::CartInventory.Challenges.Challenges.BigItems))
			{
				return 0;
			}
			return MultiplyItemCount(TinyMaxAmount);
		}

		private static int NewSmallItemCount()
		{
			if (ChallengeManager.CurrentChallengeIs(global::CartInventory.Challenges.Challenges.BigItems))
			{
				return 0;
			}
			return MultiplyItemCount(SmallMaxAmount);
		}

		private static int NewMediumItemCount()
		{
			if (ChallengeManager.CurrentChallengeIs(global::CartInventory.Challenges.Challenges.BigItems))
			{
				return 0;
			}
			return MultiplyItemCount(MediumMaxAmount);
		}

		private static int NewBigItemCount()
		{
			return MultiplyItemCount(BigMaxAmount);
		}

		private static int NewWideItemCount()
		{
			if (ChallengeManager.CurrentChallengeIs(global::CartInventory.Challenges.Challenges.BigItems))
			{
				return 0;
			}
			return MultiplyItemCount(WideMaxAmount);
		}

		private static int NewTallItemCount()
		{
			if (ChallengeManager.CurrentChallengeIs(global::CartInventory.Challenges.Challenges.BigItems))
			{
				return 0;
			}
			return MultiplyItemCount(TallMaxAmount);
		}

		private static int NewVeryTallItemCount()
		{
			return MultiplyItemCount(VeryTallMaxAmount);
		}

		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		[HarmonyTranspiler]
		private static IEnumerable<CodeInstruction> SetupHostTranspiler(IEnumerable<CodeInstruction> inst)
		{
			List<CodeInstruction> list = new List<CodeInstruction>(inst);
			if (list.Count <= 20)
			{
				return list;
			}
			int num = -1;
			for (int i = 1; i < list.Count - 1; i++)
			{
				if (list[i].opcode == OpCodes.Stfld && list[i + 1].opcode == OpCodes.Call && (FieldInfo)list[i].operand == AccessTools.Field(typeof(ValuableDirector), "veryTallMaxAmount") && (MethodInfo)list[i + 1].operand == AccessTools.Method(typeof(SemiFunc), "RunIsArena", (Type[])null, (Type[])null))
				{
					num = i;
					break;
				}
			}
			if (num == -1)
			{
				return list;
			}
			List<CodeInstruction> list2 = new List<CodeInstruction>();
			list2.SetField(typeof(ValuableDirectorPatch), "NewValueCount", typeof(ValuableDirector), "totalMaxValue").SetField(typeof(ValuableDirectorPatch), "NewTotalItemCount", typeof(ValuableDirector), "totalMaxAmount").SetField(typeof(ValuableDirectorPatch), "NewSmallItemCount", typeof(ValuableDirector), "smallMaxAmount")
				.SetField(typeof(ValuableDirectorPatch), "NewMediumItemCount", typeof(ValuableDirector), "mediumMaxAmount")
				.SetField(typeof(ValuableDirectorPatch), "NewBigItemCount", typeof(ValuableDirector), "bigMaxAmount")
				.SetField(typeof(ValuableDirectorPatch), "NewWideItemCount", typeof(ValuableDirector), "wideMaxAmount")
				.SetField(typeof(ValuableDirectorPatch), "NewVeryTallItemCount", typeof(ValuableDirector), "tallMaxAmount")
				.SetField(typeof(ValuableDirectorPatch), "NewTallItemCount", typeof(ValuableDirector), "tallMaxAmount")
				.SetField(typeof(ValuableDirectorPatch), "NewTinyItemCount", typeof(ValuableDirector), "tinyMaxAmount");
			list.InsertRange(num, list2);
			return list;
		}
	}
	[HarmonyPatch(typeof(ValuableObject))]
	public static class ValuableObjectPatch
	{
		private static float Time;

		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		private static void Start()
		{
		}

		[HarmonyPatch("DollarValueSetLogic")]
		[HarmonyPostfix]
		[HarmonyPriority(1000)]
		private static void DollarValueSetLogic(ref ValuableObject __instance)
		{
			if (SemiFunc.IsMasterClientOrSingleplayer() && ModConfig.EnableValuableScaling.Value && !SpawnHelper.SpawnedBags.Contains(__instance) && !LevelStats.ValuableObjects.Contains(__instance))
			{
				Traverse dollarTraverse = __instance.GetDollarTraverse();
				float value = dollarTraverse.GetValue<float>();
				if ((double)value <= 1000.0)
				{
					dollarTraverse.SetValue((object)(float)((double)value * 1.7));
				}
				else if ((double)value <= 5000.0)
				{
					dollarTraverse.SetValue((object)(float)((double)value * 1.5));
				}
				else if ((double)value <= 10000.0)
				{
					dollarTraverse.SetValue((object)(float)((double)value * 1.3));
				}
				else
				{
					dollarTraverse.SetValue((object)(float)((double)value * 1.1));
				}
			}
			LevelStats.RegisterValuableObject(__instance);
		}

		[HarmonyPatch("DollarValueSetRPC")]
		[HarmonyPostfix]
		private static void DollarValueSetRPC(ValuableObject __instance)
		{
			LevelStats.RegisterValuableObject(__instance);
		}
	}
}
namespace CartInventory.Extensions
{
	public static class EnemyDirectorExtensions
	{
		public static List<EnemySetup> GetEnemies(this EnemyDirector enemyDirector)
		{
			List<EnemySetup> enemiesDifficulty = enemyDirector.enemiesDifficulty1;
			List<EnemySetup> enemiesDifficulty2 = enemyDirector.enemiesDifficulty2;
			List<EnemySetup> enemiesDifficulty3 = enemyDirector.enemiesDifficulty3;
			List<EnemySetup> list = new List<EnemySetup>(enemiesDifficulty.Count + enemiesDifficulty2.Count + enemiesDifficulty3.Count);
			list.AddRange(enemiesDifficulty);
			list.AddRange(enemiesDifficulty2);
			list.AddRange(enemiesDifficulty3);
			return list;
		}

		public static bool TryGetEnemyByName(this EnemyDirector enemyDirector, string name, [NotNullWhen(true)] out EnemySetup? enemySetup)
		{
			enemySetup = enemyDirector.GetEnemyByName(name);
			return (Object)(object)enemySetup != (Object)null;
		}

		public static EnemySetup? GetEnemyByName(this EnemyDirector enemyDirector, string name)
		{
			string name2 = name;
			return ((IEnumerable<EnemySetup>)enemyDirector.GetEnemies()).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup x) => ((Object)x).name.Equals(name2)));
		}

		public static bool TryGetEnemyThatContainsName(this EnemyDirector enemyDirector, string name, out EnemySetup? enemySetup)
		{
			enemySetup = enemyDirector.GetEnemyThatContainsName(name);
			return (Object)(object)enemySetup != (Object)null;
		}

		public static EnemySetup? GetEnemyThatContainsName(this EnemyDirector enemyDirector, string name)
		{
			string name2 = name;
			return ((IEnumerable<EnemySetup>)enemyDirector.GetEnemies()).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup x) => ((Object)x).name.Contains(name2)));
		}

		public static List<EnemySetup> GetEnemyList(this EnemyDirector director)
		{
			return Traverse.Create((object)director).Field("enemyList").GetValue<List<EnemySetup>>();
		}

		public static List<EnemySetup> GetEnemyListCurrent(this EnemyDirector director)
		{
			return Traverse.Create((object)director).Field("enemyListCurrent").GetValue<List<EnemySetup>>();
		}
	}
	public static class ListExtension
	{
		public static List<CodeInstruction> SetField(this List<CodeInstruction> list, Type type, string method, Type setType, string fieldName)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			list.Add(new CodeInstruction(OpCodes.Ldloc_1, (object)null));
			list.Add(new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(type, method, (Type[])null, (Type[])null)));
			list.Add(new CodeInstruction(OpCodes.Stfld, (object)AccessTools.Field(setType, fieldName)));
			return list;
		}
	}
	public static class StringExtension
	{
		public static string FormatDollars(this int nuber)
		{
			return (nuber > 0) ? nuber.ToString("#,#$").Replace(",", " ") : "0$";
		}

		public static string FormatDollars(this float nuber)
		{
			return (nuber > 0f) ? nuber.ToString("#,#$").Replace(",", " ") : "0$";
		}

		public static string GetTimeString(this float seconds)
		{
			seconds = Mathf.Clamp(seconds, 0f, 360000f);
			int num = (int)((double)seconds * 1000.0) % 1000;
			int num2 = (int)seconds % 60;
			int num3 = (int)((double)seconds / 60.0) % 60;
			return $"{(int)((double)seconds / 3600.0):00}:{num3:00}:{num2:00}<size=75%>.{num:000}</size>";
		}
	}
	public static class ValuableObjectExtension
	{
		public static void SetDollarValue(this ValuableObject valuable, float value)
		{
			//IL_0005: 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)
			valuable.DollarValueSetRPC(value, default(PhotonMessageInfo));
			if (SemiFunc.IsMasterClient())
			{
				Traverse.Create((object)valuable).Field("photonView").GetValue<PhotonView>()
					.RPC("DollarValueSetRPC", (RpcTarget)0, new object[1] { value });
			}
		}

		public static float GetDollarValue(this ValuableObject valuable)
		{
			return Traverse.Create((object)valuable).Field("dollarValueCurrent").GetValue<float>();
		}

		public static Traverse GetDollarTraverse(this ValuableObject valuable)
		{
			return Traverse.Create((object)valuable).Field("dollarValueCurrent");
		}
	}
}
namespace CartInventory.DTO
{
	public class SaveData
	{
		public int TrackDollars { get; set; } = 0;

	}
	public class ValuableAndPhysic
	{
		public ValuableObject Valuable { get; }

		public PhysGrabObject Physic { get; }

		public ValuableAndPhysic(ValuableObject valuable, PhysGrabObject physic)
		{
			Valuable = valuable;
			Physic = physic;
			base..ctor();
		}
	}
}
namespace CartInventory.Challenges
{
	public class ChallengeManager
	{
		public static Challenges CurrentChallenge;

		public static bool CurrentChallengeIs(Challenges challenge)
		{
			return CurrentChallenge == challenge;
		}

		public static string CurrentChallengeName()
		{
			return CurrentChallenge.ToString();
		}

		public static void RollChallenge()
		{
			Challenges[] array = Enum.GetValues(typeof(Challenges)).Cast<Challenges>().ToArray();
			CurrentChallenge = array[Random.Range(0, array.Length)];
		}
	}
	public enum Challenges
	{
		None,
		FastExtraction,
		MoneyTime,
		BigItems,
		DuckRaid
	}
}