Decompiled source of BillionNemesis v0.3.0

BillionNemesis.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using BillionNemesis.Func;
using Configgy;
using Discord;
using HarmonyLib;
using Logic;
using Microsoft.CodeAnalysis;
using Steamworks;
using TMPro;
using ULTRAKILL.Cheats;
using Unity.AI.Navigation;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.AddressableAssets;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("BillionNemesis")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("0.3.0.0")]
[assembly: AssemblyInformationalVersion("0.3.0+5a951ddcdc1c7f559a8f29e96b43156ef7901ff4")]
[assembly: AssemblyProduct("Billion Nemesis")]
[assembly: AssemblyTitle("BillionNemesis")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.3.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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace BillionNemesis
{
	[BepInPlugin("billy.billionnemesis", "Billion Nemesis", "0.3.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		private ConfigBuilder config;

		[Configgable("", "Enable Billion Nemesis", 0, "Lets you enable or disable the custom enemy encounters. If you're currently in a level, changing this will require a level restart")]
		public static ConfigToggle IsEnabled = new ConfigToggle(true);

		public static bool IsPatched = false;

		public static bool forceDefaultLevelPath = false;

		public static Dictionary<string, GameObject> objectsLookedUpThisScene = new Dictionary<string, GameObject>();

		public const string NemesisColorHex = "ff00af";

		private static readonly Harmony Harmony = new Harmony("billy.billionnemesis");

		internal static ManualLogSource Logger;

		public void Awake()
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Expected O, but got Unknown
			Logger = ((BaseUnityPlugin)this).Logger;
			Harmony.PatchAll();
			Logger.LogInfo((object)"Plugin BillionNemesis is loaded!");
			SceneManager.activeSceneChanged += LevelPatching.SceneManagerActiveSceneChanged;
			LevelAssets.GetAssets();
			config = new ConfigBuilder("billy.billionnemesis", "Billion Nemesis");
			ConfigToggle isEnabled = IsEnabled;
			((ConfigValueElement<bool>)(object)isEnabled).OnValueChanged = (Action<bool>)Delegate.Combine(((ConfigValueElement<bool>)(object)isEnabled).OnValueChanged, new Action<bool>(EnabledValueChanged));
			config.BuildAll();
			Logger.LogInfo((object)"Plugin BillionNemesis is loadedest!");
		}

		public static void EnabledValueChanged(bool v)
		{
			RankStuff.UpdateRanks();
		}
	}
	public static class ChangedInfo
	{
		public static int[] ChangedLevels = new int[4] { 1, 2, 3, 4 };

		public static string[] ChangedScenes = new string[4] { "Level 0-1", "Level 0-2", "Level 0-3", "Level 0-4" };

		public static Dictionary<string, string> NewLevelNames = new Dictionary<string, string>
		{
			["INTO THE FIRE"] = "UNTO THE CORE",
			["THE MEATGRINDER"] = "THE BACKBURNER",
			["DOUBLE DOWN"] = "<size=150%>UP</size> THE ANTE",
			["A ONE-MACHINE ARMY"] = "DELTA P",
			["CERBERUS"] = "the Kiln"
		};

		public static Dictionary<string, string> PlainLevelNames = new Dictionary<string, string> { ["<size=150%>UP</size> THE ANTE"] = "UP THE ANTE" };
	}
	[HarmonyPatch]
	public class DeadcaughtEnemyPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch(typeof(Deathcatcher), "EnemyDeath")]
		public static bool EnemyDeathPrefix(EnemyIdentifier eid, Deathcatcher __instance)
		{
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Invalid comparison between Unknown and I4
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Expected O, but got Unknown
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.IsPatched())
			{
				return true;
			}
			if ((Object)(object)eid == (Object)null)
			{
				Debug.LogWarning((object)"EnemyIdentifier is null. Cannot track death.");
				return false;
			}
			if ((Object)(object)((Component)eid).gameObject.GetComponent<DontCatch>() != (Object)null)
			{
				return false;
			}
			Debug.Log((object)("EnemyDeath called for " + ((Object)eid).name));
			if (!__instance.canRespawnIdols && (int)eid.enemyType == 21)
			{
				return false;
			}
			EnemyTracker instance = MonoSingleton<EnemyTracker>.Instance;
			if ((Object)(object)instance == (Object)null)
			{
				Debug.LogWarning((object)"EnemyTracker instance not found. Cannot track enemy death.");
				return false;
			}
			if (!instance.spawnedEnemies.TryGetValue(((Object)eid).GetInstanceID(), out var value))
			{
				Debug.LogWarning((object)("Enemy " + ((Object)eid).name + " not found in spawned enemies. Cannot track death."));
				return false;
			}
			TeleportOnCondition teleportOnCondition = null;
			GameObject[] activateOnDeath = eid.activateOnDeath;
			foreach (GameObject val in activateOnDeath)
			{
				if (!(((Object)val).name != "TeleportOnCondition"))
				{
					teleportOnCondition = val.GetComponent<TeleportOnCondition>();
				}
			}
			CaughtEnemy val2 = new CaughtEnemy(eid, value);
			if (!__instance.deadCaughtEnemies.Contains(val2))
			{
				Debug.Log((object)$"Tracking death of enemy {eid} at position {val2.position} with rotation {val2.rotation}");
				__instance.deadCaughtEnemies.Add(val2);
				if ((Object)(object)teleportOnCondition != (Object)null && teleportOnCondition.onDeadcaught)
				{
					val2.position = TeleportOnCondition.CheckConditions(val2.position, teleportOnCondition.conditions, teleportOnCondition.returnOnFirstSuccess);
				}
			}
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(CaughtEnemy), "UpdatePuppet")]
		public static void UpdatePuppetPrefix(GameObject newPuppet, CaughtEnemy __instance)
		{
			ReaddComponents(newPuppet, __instance.original, __instance);
		}

		public static void ReaddComponents(GameObject puppet, EnemyIdentifier original, CaughtEnemy __instance)
		{
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			GameObject[] activateOnDeath = original.activateOnDeath;
			foreach (GameObject val in activateOnDeath)
			{
				switch (((Object)val).name)
				{
				case "StopEnemyMovement":
				{
					StopEnemyMovement component2 = val.GetComponent<StopEnemyMovement>();
					StopEnemyMovement orAddComponent2 = GameObjectExtensions.GetOrAddComponent<StopEnemyMovement>(puppet);
					component2.CopyValuesTo(orAddComponent2);
					break;
				}
				case "MoveTo":
				{
					MoveTo component3 = val.GetComponent<MoveTo>();
					MoveTo orAddComponent3 = GameObjectExtensions.GetOrAddComponent<MoveTo>(puppet);
					component3.CopyValuesTo(orAddComponent3);
					break;
				}
				case "TeleportOnCondition":
				{
					TeleportOnCondition component = val.GetComponent<TeleportOnCondition>();
					TeleportOnCondition orAddComponent = GameObjectExtensions.GetOrAddComponent<TeleportOnCondition>(puppet);
					component.CopyValuesTo(orAddComponent);
					if (orAddComponent.onDeadcaught)
					{
						TeleportOnCondition.ChangeAxisTargetsToPuppet(orAddComponent.conditions, puppet.transform);
						__instance.position = TeleportOnCondition.CheckConditions(__instance.position, orAddComponent.conditions, orAddComponent.returnOnFirstSuccess);
					}
					puppet.transform.position = __instance.position;
					break;
				}
				}
			}
		}
	}
	public class DontCatch : MonoBehaviour
	{
	}
	public class EnemyBlockBreakables : MonoBehaviour
	{
		public EnemyIdentifier eid;

		public void Awake()
		{
			eid = ((Component)this).GetComponent<EnemyIdentifier>();
		}

		public void Start()
		{
			BreakableAllower[] array = Object.FindObjectsByType<BreakableAllower>((FindObjectsInactive)1, (FindObjectsSortMode)0);
			BreakableAllower[] array2 = array;
			foreach (BreakableAllower breakableAllower in array2)
			{
				breakableAllower.enemyBlocks.Add(this);
			}
		}
	}
	[HarmonyPatch]
	public class GroundWavePatch
	{
		[HarmonyPatch(typeof(GroundWave), "FixedUpdate")]
		public static bool FixedUpdatePrefix(GroundWave __instance, bool __runOriginal)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: 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_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.IsPatched())
			{
				return true;
			}
			if (!__instance.isTraversingLink || !__runOriginal)
			{
				return false;
			}
			Vector3 val = __instance.traversalVelocity * Time.fixedDeltaTime;
			Transform transform = ((Component)__instance).transform;
			transform.position += val;
			if (((Vector3)(ref __instance.traversalVelocity)).sqrMagnitude > 0.001f)
			{
				((Component)__instance).transform.rotation = Quaternion.LookRotation(((Vector3)(ref __instance.traversalVelocity)).normalized, Vector3.up);
			}
			if (Object.op_Implicit((Object)(object)__instance.rb))
			{
				__instance.rb.position = ((Component)__instance).transform.position;
				__instance.rb.rotation = ((Component)__instance).transform.rotation;
			}
			if (__instance.hasCrossed)
			{
				__instance.postTeleportDistance += ((Vector3)(ref val)).magnitude;
				if (__instance.postTeleportDistance >= 2f)
				{
					__instance.isTraversingLink = false;
					((Behaviour)__instance.nma).enabled = true;
					__instance.nma.Warp(((Component)__instance).transform.position);
					__instance.nma.velocity = __instance.traversalVelocity;
					if ((Object)(object)__instance.nma != (Object)null && ((Behaviour)__instance.nma).enabled)
					{
						__instance.nma.SetDestination(__instance.target.GetNavPoint());
					}
				}
			}
			return false;
		}
	}
	public class MoveTo : MonoBehaviour
	{
		public float speed = 20f;

		public Transform targetTransform = null;

		public bool removeOnDeath = true;

		public float delay = -1f;

		public float delayProgress = 0f;

		public bool moveX = true;

		public bool moveY = true;

		public bool moveZ = true;

		public float targetX = 0f;

		public float targetY = 0f;

		public float targetZ = 0f;

		public MoveTo MoveXYZ(bool moveX = true, bool moveY = true, bool moveZ = true)
		{
			this.moveX = moveX;
			this.moveY = moveY;
			this.moveZ = moveZ;
			return this;
		}

		public MoveTo TargetXYZ(float targetX = 0f, float targetY = 0f, float targetZ = 0f)
		{
			this.targetX = targetX;
			this.targetY = targetY;
			this.targetZ = targetZ;
			return this;
		}

		public void Update()
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)targetTransform == (Object)null))
			{
				if (delayProgress < delay)
				{
					delayProgress += Time.deltaTime;
					return;
				}
				Vector3 position = targetTransform.position;
				targetTransform.position = new Vector3(moveX ? Mathf.MoveTowards(position.x, targetX, speed * Time.deltaTime) : position.x, moveY ? Mathf.MoveTowards(position.y, targetY, speed * Time.deltaTime) : position.y, moveZ ? Mathf.MoveTowards(position.z, targetZ, speed * Time.deltaTime) : position.z);
			}
		}

		public void Start()
		{
			SaveForPuppet();
		}

		public void SaveForPuppet()
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			EnemyIdentifier componentInChildren = ((Component)this).GetComponentInChildren<EnemyIdentifier>();
			if ((Object)(object)componentInChildren == (Object)null)
			{
				return;
			}
			GameObject[] activateOnDeath = componentInChildren.activateOnDeath;
			foreach (GameObject val in activateOnDeath)
			{
				if (((Object)val).name == "MoveTo")
				{
					return;
				}
			}
			GameObject val2 = new GameObject("MoveTo");
			MoveTo newMover = val2.AddComponent<MoveTo>();
			CopyValuesTo(newMover);
			Util.ArrayAdd(ref componentInChildren.activateOnDeath, val2);
		}

		public void CopyValuesTo(MoveTo newMover)
		{
			newMover.speed = speed;
			newMover.targetTransform = targetTransform;
			newMover.removeOnDeath = removeOnDeath;
			newMover.MoveXYZ(moveX, moveY, moveZ);
			newMover.TargetXYZ(targetX, targetY, targetZ);
		}
	}
	[HarmonyPatch(typeof(EnemyIdentifier), "ProcessDeath")]
	public class DeathPatch
	{
		public static void Prefix(EnemyIdentifier __instance)
		{
			MoveTo component = ((Component)__instance).GetComponent<MoveTo>();
			if ((Object)(object)component != (Object)null && component.removeOnDeath)
			{
				Object.Destroy((Object)(object)component);
			}
		}
	}
	[HarmonyPatch(typeof(Power), "Awake")]
	public class PowerPatch
	{
		public static bool Prefix(Power __instance)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.IsPatched())
			{
				return true;
			}
			__instance.anim = ((Component)__instance).GetComponent<Animator>();
			__instance.eid = ((Component)__instance).GetComponent<EnemyIdentifier>();
			__instance.rb = ((Component)__instance).GetComponent<Rigidbody>();
			__instance.mach = ((Component)__instance).GetComponent<Enemy>();
			__instance.environmentMask = LayerMaskDefaults.Get((LMD)1);
			__instance.ensims = ((Component)__instance).GetComponentsInChildren<EnemySimplifier>();
			__instance.aud = ((Component)__instance).GetComponent<AudioSource>();
			if (__instance.voicePitch == -1f)
			{
				__instance.voicePitch = Random.Range(0.95f, 1.05f);
			}
			if (__instance.originalPosition == Vector3.zero)
			{
				__instance.originalPosition = ((Component)__instance).transform.position;
			}
			if (Object.op_Implicit((Object)(object)__instance.stabEffect))
			{
				__instance.stabParticle = __instance.stabEffect.GetComponentInChildren<ParticleSystem>();
				__instance.stabTrail = __instance.stabEffect.GetComponentInChildren<TrailRenderer>();
				__instance.stabAudio = __instance.stabEffect.GetComponentInChildren<AudioSource>();
			}
			if ((Object)(object)__instance.physicsArm == (Object)null)
			{
				__instance.physicsArm = new GameObject("NemesisPhysicsArm").transform;
			}
			__instance.physicsArm.SetParent(((Component)__instance).transform.parent);
			return false;
		}
	}
	public class PowerStayClose : MonoBehaviour
	{
		public float distanceLimit = 22.5f;
	}
	[HarmonyPatch(typeof(Power), "FixedUpdate")]
	public class PowerStayClosePatch
	{
		public static void Postfix(Power __instance)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			PowerStayClose component = ((Component)__instance).GetComponent<PowerStayClose>();
			if (!((Object)(object)component == (Object)null) && !(Vector3.Distance(((Component)__instance).transform.position, ((Component)MonoSingleton<NewMovement>.Instance).transform.position) <= component.distanceLimit))
			{
				__instance.Teleport(true, false, false, false, false, true);
			}
		}
	}
	public class StatueSpeed : MonoBehaviour
	{
		public float multiplier = 1.2f;
	}
	[HarmonyPatch(typeof(StatueFake), "Start")]
	public class StatueFakePatch
	{
		public static void Postfix(StatueFake __instance)
		{
			StatueSpeed component = ((Component)__instance).GetComponent<StatueSpeed>();
			if (!((Object)(object)component == (Object)null))
			{
				Animator anim = __instance.anim;
				anim.speed *= component.multiplier;
			}
		}
	}
	public class StopEnemyMovement : MonoBehaviour
	{
		public bool stopWalking = false;

		public bool stopDashing = true;

		public NavMeshAgent nma;

		public static bool CheckDash(Component __instance)
		{
			StopEnemyMovement component = __instance.GetComponent<StopEnemyMovement>();
			if (component != null && ((Behaviour)component).enabled && component != null && component.stopDashing)
			{
				return false;
			}
			return true;
		}

		public void Awake()
		{
			nma = ((Component)this).GetComponent<NavMeshAgent>();
		}

		public void Start()
		{
			SaveForPuppet();
		}

		public void SaveForPuppet()
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			EnemyIdentifier component = ((Component)this).GetComponent<EnemyIdentifier>();
			if ((Object)(object)component == (Object)null)
			{
				return;
			}
			GameObject[] activateOnDeath = component.activateOnDeath;
			foreach (GameObject val in activateOnDeath)
			{
				if (((Object)val).name == "StopEnemyMovement")
				{
					return;
				}
			}
			GameObject val2 = new GameObject("StopEnemyMovement");
			StopEnemyMovement newStopper = val2.AddComponent<StopEnemyMovement>();
			CopyValuesTo(newStopper);
			Util.ArrayAdd(ref component.activateOnDeath, val2);
		}

		public void FixedUpdate()
		{
			if (stopWalking && (Object)(object)nma != (Object)null && ((Behaviour)nma).enabled)
			{
				((Behaviour)nma).enabled = false;
			}
		}

		public void CopyValuesTo(StopEnemyMovement newStopper)
		{
			newStopper.stopWalking = stopWalking;
			newStopper.stopDashing = stopDashing;
		}
	}
	[HarmonyPatch(typeof(StatueBoss))]
	public class CerberusMovementPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch(typeof(StatueBoss), "Tackle")]
		[HarmonyPriority(800)]
		public static bool TacklePrefix(StatueBoss __instance)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			bool flag = StopEnemyMovement.CheckDash((Component)(object)__instance);
			if (!flag)
			{
				__instance.inAction = true;
				if (Vector3.Distance(((Component)__instance).transform.position, __instance.targetPlanePos) >= 9f)
				{
					__instance.Throw();
				}
				else
				{
					__instance.Stomp();
				}
			}
			return flag;
		}
	}
	[HarmonyPatch(typeof(Drone))]
	public class DroneMovementPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch(typeof(Drone), "Dodge", new Type[] { typeof(Vector3) })]
		[HarmonyPriority(800)]
		public static bool DodgePrefix(Drone __instance)
		{
			return StopEnemyMovement.CheckDash((Component)(object)__instance);
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Drone), "ProcessTargeting")]
		[HarmonyPriority(800)]
		public static bool ProcessTargetingPrefix(Drone __instance)
		{
			return StopEnemyMovement.CheckDash((Component)(object)__instance);
		}
	}
	public class AddDeathANW : MonoBehaviour
	{
		public void Add()
		{
			ActivateNextWave component = ((Component)this).GetComponent<ActivateNextWave>();
			component.deadEnemies++;
		}
	}
	[HarmonyPatch(typeof(SwordsMachine), "TeleportAway")]
	public class SwordsMachinePatch
	{
		public static bool Prefix(SwordsMachine __instance)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00f0: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.IsPatched())
			{
				return true;
			}
			BossHealthBar component = ((Component)__instance).GetComponent<BossHealthBar>();
			component.DisappearBar();
			new Vector3(((Component)__instance).transform.position.x, ((Component)__instance).transform.position.y + 1.5f, ((Component)__instance).transform.position.z);
			__instance.teleportEffect.SetActive(true);
			__instance.teleportEffect.transform.SetParent((Transform)null, true);
			((Component)__instance).gameObject.SetActive(false);
			SwordsMachine[] componentsInChildren = ((Component)__instance.secondPhasePosTarget).GetComponentsInChildren<SwordsMachine>();
			if (componentsInChildren.Length != 0)
			{
				SwordsMachine[] array = componentsInChildren;
				SwordsMachine[] array2 = array;
				foreach (SwordsMachine val in array2)
				{
					((Component)val).gameObject.SetActive(false);
					Object.Destroy((Object)(object)((Component)val).gameObject);
				}
			}
			((Component)__instance).transform.position = __instance.secondPhasePosTarget.position;
			((Component)__instance).transform.parent = __instance.secondPhasePosTarget;
			__instance.eid.spawnIn = true;
			((Component)__instance).gameObject.SetActive(true);
			((Behaviour)component).enabled = true;
			__instance.secondPhasePosTarget = null;
			AddDeathANW[] array3 = Object.FindObjectsByType<AddDeathANW>((FindObjectsInactive)1, (FindObjectsSortMode)0);
			AddDeathANW[] array4 = array3;
			foreach (AddDeathANW addDeathANW in array4)
			{
				addDeathANW.Add();
			}
			CheckPointPatch.InheritCheckpointRooms(__instance.cpToReset);
			__instance.cpToReset.UpdateRooms();
			return false;
		}
	}
	public class TeleportOnCondition : MonoBehaviour
	{
		public bool processPassively = false;

		public bool processIfEnemyDead = false;

		public bool onDeadcaught = true;

		public bool returnOnFirstSuccess = false;

		public TeleportCondition[] conditions = Array.Empty<TeleportCondition>();

		public EnemyIdentifier eid = null;

		public void Configure(bool processPassively = true, bool processIfEnemyDead = false, bool onDeadcaught = true, bool returnOnFirstSuccess = false)
		{
			this.processPassively = processPassively;
			this.processIfEnemyDead = processIfEnemyDead;
			this.onDeadcaught = onDeadcaught;
			this.returnOnFirstSuccess = returnOnFirstSuccess;
		}

		public TeleportCondition AddCondition(Vector3 moveVector, bool isMoveVectorAbsolute = false, bool ignoreAbsoluteMoveVectorZeroAxes = false)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("TeleportCondition" + conditions.Length);
			val.transform.SetParent(((Component)this).transform);
			TeleportCondition teleportCondition = new TeleportCondition(moveVector, isMoveVectorAbsolute, ignoreAbsoluteMoveVectorZeroAxes);
			Util.ArrayAdd(ref conditions, teleportCondition);
			return teleportCondition;
		}

		public void Awake()
		{
			eid = ((Component)this).GetComponentInChildren<EnemyIdentifier>();
		}

		public void Start()
		{
			SaveForPuppet();
		}

		public void SaveForPuppet()
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			if ((Object)(object)eid == (Object)null)
			{
				return;
			}
			GameObject[] activateOnDeath = eid.activateOnDeath;
			foreach (GameObject val in activateOnDeath)
			{
				if (((Object)val).name == "TeleportOnCondition")
				{
					return;
				}
			}
			GameObject val2 = new GameObject("TeleportOnCondition");
			TeleportOnCondition newTeleport = val2.AddComponent<TeleportOnCondition>();
			CopyValuesTo(newTeleport);
			Util.ArrayAdd(ref eid.activateOnDeath, val2);
		}

		public void FixedUpdate()
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			bool flag = !processIfEnemyDead && ((Object)(object)eid == (Object)null || eid.dead);
			if (!(!processPassively || flag))
			{
				((Component)this).transform.position = CheckConditions(((Component)this).transform.position, conditions, returnOnFirstSuccess);
			}
		}

		public static Vector3 CheckConditions(Vector3 moveTargetPosition, TeleportCondition[] conditions, bool returnOnFirstSuccess = false)
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: 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)
			foreach (TeleportCondition teleportCondition in conditions)
			{
				if (teleportCondition != null && teleportCondition.CheckCondition())
				{
					moveTargetPosition = Teleport(teleportCondition, moveTargetPosition);
					if (returnOnFirstSuccess)
					{
						return moveTargetPosition;
					}
				}
			}
			return moveTargetPosition;
		}

		public static Vector3 Teleport(TeleportCondition condition, Vector3 moveTargetPosition)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: 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_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: 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_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			Vector3 moveVector = condition.moveVector;
			if (!condition.isMoveVectorAbsolute)
			{
				moveTargetPosition += moveVector;
				return moveTargetPosition;
			}
			if (!condition.ignoreAbsoluteMoveVectorZeroAxes)
			{
				moveTargetPosition = moveVector;
				return moveTargetPosition;
			}
			((Vector3)(ref moveTargetPosition))..ctor((moveVector.x != 0f) ? moveVector.x : moveTargetPosition.x, (moveVector.y != 0f) ? moveVector.y : moveTargetPosition.y, (moveVector.z != 0f) ? moveVector.z : moveTargetPosition.z);
			return moveTargetPosition;
		}

		public static void ChangeAxisTargetsToPuppet(TeleportCondition[] conditions, Transform puppet)
		{
			foreach (TeleportCondition teleportCondition in conditions)
			{
				TeleportConditionAxis[] conditionAxes = teleportCondition.conditionAxes;
				foreach (TeleportConditionAxis teleportConditionAxis in conditionAxes)
				{
					if (teleportConditionAxis.canChangeTargetToPuppet)
					{
						teleportConditionAxis.checkTarget = puppet;
					}
				}
			}
		}

		public void CopyValuesTo(TeleportOnCondition newTeleport)
		{
			newTeleport.Configure(processPassively, processIfEnemyDead, onDeadcaught, returnOnFirstSuccess);
			newTeleport.conditions = conditions;
			newTeleport.eid = eid;
		}
	}
	public class TeleportCondition
	{
		public TeleportConditionAxis[] conditionAxes = Array.Empty<TeleportConditionAxis>();

		public Vector3 moveVector = Vector3.zero;

		public bool isMoveVectorAbsolute = false;

		public bool ignoreAbsoluteMoveVectorZeroAxes = false;

		public bool Success { get; private set; }

		public TeleportCondition(Vector3 moveVector, bool isMoveVectorAbsolute = false, bool ignoreAbsoluteMoveVectorZeroAxes = false)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			Success = false;
			this.moveVector = moveVector;
			this.isMoveVectorAbsolute = isMoveVectorAbsolute;
			this.ignoreAbsoluteMoveVectorZeroAxes = ignoreAbsoluteMoveVectorZeroAxes;
		}

		public TeleportConditionAxis AddAxis(Transform checkTarget, char axis = 'y', float value = -25f, bool greater = false, bool orEqual = false, bool useLastTargetPositionIfNull = true, bool canChangeTargetToPuppet = true)
		{
			TeleportConditionAxis teleportConditionAxis = new TeleportConditionAxis(checkTarget, axis, value, greater, orEqual, useLastTargetPositionIfNull, canChangeTargetToPuppet);
			Util.ArrayAdd(ref conditionAxes, teleportConditionAxis);
			return teleportConditionAxis;
		}

		public bool CheckCondition()
		{
			TeleportConditionAxis[] array = conditionAxes;
			foreach (TeleportConditionAxis teleportConditionAxis in array)
			{
				if (teleportConditionAxis != null && !teleportConditionAxis.CheckAxis())
				{
					Success = false;
					return Success;
				}
			}
			Success = true;
			return Success;
		}
	}
	public class TeleportConditionAxis
	{
		public Transform checkTarget;

		public Vector3 lastTargetPosition;

		public char axis = 'y';

		public float value = -25f;

		public bool greater = false;

		public bool orEqual = false;

		public bool useLastTargetPositionIfNull = true;

		public bool canChangeTargetToPuppet = true;

		public bool Success { get; private set; }

		public TeleportConditionAxis(Transform checkTarget, char axis = 'y', float value = -25f, bool greater = false, bool orEqual = false, bool useLastTargetPositionIfNull = true, bool canChangeTargetToPuppet = true)
		{
			Success = false;
			this.checkTarget = checkTarget;
			this.axis = axis;
			this.value = value;
			this.greater = greater;
			this.orEqual = orEqual;
			this.useLastTargetPositionIfNull = useLastTargetPositionIfNull;
			this.canChangeTargetToPuppet = canChangeTargetToPuppet;
			if (axis != 'x' && axis != 'y' && axis != 'z')
			{
				Plugin.Logger.LogWarning((object)$"(new) TeleportConditionAxis must have axis 'x', 'y' or 'z', not {axis}. Resetting to 'y'");
				this.axis = 'y';
			}
		}

		public bool CheckAxis()
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)checkTarget == (Object)null && !useLastTargetPositionIfNull)
			{
				return false;
			}
			if ((Object)(object)checkTarget != (Object)null)
			{
				lastTargetPosition = checkTarget.position;
			}
			bool success;
			switch (axis)
			{
			case 'x':
				success = CheckX();
				break;
			case 'y':
				success = CheckY();
				break;
			case 'z':
				success = CheckZ();
				break;
			default:
				Plugin.Logger.LogWarning((object)$"(FixedUpdate) TeleportConditionAxis must have axis 'x', 'y' or 'z', not {axis}. Resetting to 'y'");
				axis = 'y';
				success = CheckY();
				break;
			}
			Success = success;
			return Success;
		}

		public bool CheckX()
		{
			bool flag = ((!greater) ? (lastTargetPosition.x < value) : (lastTargetPosition.x > value));
			if (orEqual)
			{
				flag = flag || lastTargetPosition.x == value;
			}
			return flag;
		}

		public bool CheckY()
		{
			bool flag = ((!greater) ? (lastTargetPosition.y < value) : (lastTargetPosition.y > value));
			if (orEqual)
			{
				flag = flag || lastTargetPosition.y == value;
			}
			return flag;
		}

		public bool CheckZ()
		{
			bool flag = ((!greater) ? (lastTargetPosition.z < value) : (lastTargetPosition.z > value));
			if (orEqual)
			{
				flag = flag || lastTargetPosition.z == value;
			}
			return flag;
		}
	}
	public class ArenaDelay : MonoBehaviour
	{
		public float delay = 0f;

		public ActivateArena target = null;
	}
	public class ArenaLink : MonoBehaviour
	{
		public ActivateArena[] linkedArenas = Array.Empty<ActivateArena>();

		public bool delete = true;

		public bool activated = false;

		public ArenaLink unclonedSelf = null;

		public void Update()
		{
			if (activated)
			{
				return;
			}
			ActivateArena[] array = linkedArenas;
			foreach (ActivateArena val in array)
			{
				if ((Object)(object)val != (Object)null && val.activated)
				{
					OnArenaActivated(val);
					break;
				}
			}
		}

		public void OnArenaActivated(ActivateArena arenaActivated = null)
		{
			ActivateArena[] array = linkedArenas;
			foreach (ActivateArena val in array)
			{
				bool flag = (Object)(object)arenaActivated != (Object)null && (Object)(object)val == (Object)(object)arenaActivated;
				if (!((Object)(object)val == (Object)null || flag))
				{
					if (delete)
					{
						Object.Destroy((Object)(object)val);
					}
					else
					{
						val.Activate();
					}
				}
			}
			activated = true;
			if ((Object)(object)unclonedSelf != (Object)null && (Object)(object)unclonedSelf != (Object)(object)this)
			{
				unclonedSelf.OnArenaActivated();
			}
		}
	}
	public class AudioOnEnable : MonoBehaviour
	{
		public AudioSource audioSource;

		public void OnEnable()
		{
			if (!((Object)(object)audioSource == (Object)null))
			{
				audioSource.Play();
			}
		}
	}
	public class BackAndForth : MonoBehaviour
	{
		public float speed = 10f;

		public float startZ = 0f;

		public float endZ = -40f;

		public bool forward = true;

		public void FixedUpdate()
		{
			//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_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: 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: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: 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)
			Vector3 localPosition = ((Component)this).transform.localPosition;
			Vector3 val = default(Vector3);
			if (forward)
			{
				((Vector3)(ref val))..ctor(localPosition.x, localPosition.y, endZ);
				((Component)this).transform.localPosition = Vector3.MoveTowards(localPosition, val, speed * Time.deltaTime);
			}
			else
			{
				((Vector3)(ref val))..ctor(localPosition.x, localPosition.y, startZ);
				((Component)this).transform.localPosition = Vector3.MoveTowards(localPosition, val, speed * Time.deltaTime);
			}
			if (((Component)this).transform.localPosition == val)
			{
				forward = !forward;
			}
		}

		public BackAndForth Configure(float speed = 10f, float startZ = 0f, float endZ = -40f)
		{
			this.speed = speed;
			this.startZ = startZ;
			this.endZ = endZ;
			return this;
		}
	}
	public class BeamDelayHelper : MonoBehaviour
	{
		public float chargeUpTimeToSubtract = 0f;

		public bool subtracted = false;

		public ObjectActivator objectActivator = null;

		public void Subtract()
		{
			if (!subtracted)
			{
				ObjectActivator obj = objectActivator;
				obj.delay -= chargeUpTimeToSubtract;
				subtracted = true;
			}
		}
	}
	public class BreakableAllower : MonoBehaviour
	{
		public Breakable breakable;

		public List<EnemyBlockBreakables> enemyBlocks = new List<EnemyBlockBreakables>();

		public void FixedUpdate()
		{
			if ((Object)(object)breakable == (Object)null)
			{
				return;
			}
			List<EnemyBlockBreakables> list = new List<EnemyBlockBreakables>();
			foreach (EnemyBlockBreakables enemyBlock in enemyBlocks)
			{
				if ((Object)(object)enemyBlock == (Object)null || !((Behaviour)enemyBlock).enabled || (Object)(object)enemyBlock.eid == (Object)null || enemyBlock.eid.Dead)
				{
					list.Add(enemyBlock);
					Object.Destroy((Object)(object)enemyBlock);
				}
				else if (!enemyBlock.eid.Dead)
				{
					breakable.broken = true;
					RemoveEnemyBlocks(list);
					return;
				}
			}
			breakable.broken = false;
			RemoveEnemyBlocks(list);
		}

		public void RemoveEnemyBlocks(List<EnemyBlockBreakables> toRemove)
		{
			foreach (EnemyBlockBreakables item in toRemove)
			{
				enemyBlocks.Remove(item);
			}
		}
	}
	public class CheckPointActivator : MonoBehaviour
	{
		public CheckPoint checkpoint;

		public void OnEnable()
		{
			if (!((Object)(object)checkpoint == (Object)null))
			{
				checkpoint.activated = false;
				checkpoint.SetForceOff(false);
				checkpoint.SetInvisibility(false);
				checkpoint.ActivateCheckPoint();
			}
		}
	}
	public class CheckPointConstantOff : MonoBehaviour
	{
		public CheckPoint checkpoint;

		public void FixedUpdate()
		{
			if (!((Object)(object)checkpoint == (Object)null) && !checkpoint.forceOff)
			{
				checkpoint.SetForceOff(true);
				checkpoint.SetInvisibility(true);
				checkpoint.unteleportable = true;
			}
		}
	}
	public class CheckPointToUpdate : MonoBehaviour
	{
		public Dictionary<int, GameObject> rooms = new Dictionary<int, GameObject>();
	}
	public class CheckPointTurnOn : MonoBehaviour
	{
		public CheckPoint checkpoint;

		public void OnEnable()
		{
			if (!((Object)(object)checkpoint == (Object)null))
			{
				checkpoint.activated = false;
				checkpoint.SetForceOff(false);
			}
		}
	}
	public class DontManipulateLight : MonoBehaviour
	{
		public Light targetLight;
	}
	public class DoorAltarHelper : MonoBehaviour
	{
		public Door door = null;

		public ItemPlaceZone[] itemPlaceZones = Array.Empty<ItemPlaceZone>();

		public bool reversed = false;

		public bool playerInArena = false;

		public void Update()
		{
			if (!playerInArena && !((Object)(object)door == (Object)null))
			{
				ProcessDoor(CheckShouldUnlock());
			}
		}

		public bool CheckShouldUnlock()
		{
			bool flag = true;
			bool flag2 = true;
			ItemPlaceZone[] array = itemPlaceZones;
			foreach (ItemPlaceZone val in array)
			{
				bool flag3 = (val.acceptedItemPlaced && !reversed) || (!val.acceptedItemPlaced && reversed);
				if (flag2)
				{
					flag = flag3;
					flag2 = false;
				}
				else if (flag3 != flag)
				{
					flag = reversed;
					break;
				}
			}
			return flag;
		}

		public void ProcessDoor(bool shouldUnlock)
		{
			if (shouldUnlock && door.locked)
			{
				door.Unlock();
				door.Open(false, true);
			}
			else if (!shouldUnlock && !door.locked)
			{
				door.Lock();
				door.Close(false);
			}
		}
	}
	public class DoorConstantLocker : MonoBehaviour
	{
		public Door door;

		public bool unlockOnDisable = true;

		public void FixedUpdate()
		{
			if (!((Object)(object)door == (Object)null) && !door.locked)
			{
				door.Lock();
			}
		}

		public void OnDisable()
		{
			if (!((Object)(object)door == (Object)null) && unlockOnDisable)
			{
				door.Unlock();
			}
		}
	}
	public class InheritRoomExceptions : MonoBehaviour
	{
		public string[] roomNames = Array.Empty<string>();
	}
	public class LightManipulator : MonoBehaviour
	{
		public float multiplier = 0.125f;

		public int dimmedCounter = 0;

		public bool invertColors = true;

		public bool ignoreEnemies = true;

		public void OnEnable()
		{
			DimLights();
		}

		public void DimLights(bool reversed = false)
		{
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			Light[] array = Object.FindObjectsByType<Light>((FindObjectsInactive)1, (FindObjectsSortMode)0);
			Light[] array2 = array;
			foreach (Light val in array2)
			{
				if (ignoreEnemies && ((Object)(object)((Component)val).GetComponentInChildren<EnemyIdentifier>() != (Object)null || (Object)(object)((Component)val).GetComponentInParent<EnemyIdentifier>() != (Object)null))
				{
					continue;
				}
				DontManipulateLight component = ((Component)val).GetComponent<DontManipulateLight>();
				if (!((Object)(object)component != (Object)null) || !((Behaviour)component).enabled || !((Object)(object)component.targetLight == (Object)(object)val))
				{
					val.intensity *= ((!reversed) ? multiplier : (1f / multiplier));
					if (invertColors)
					{
						val.color = new Color(1f - val.color.r, 1f - val.color.g, 1f - val.color.b);
					}
				}
			}
			dimmedCounter += ((!reversed) ? 1 : (-1));
			if (invertColors)
			{
				Color fogColor = RenderSettings.fogColor;
				RenderSettings.fogColor = new Color(1f - fogColor.r, 1f - fogColor.g, 1f - fogColor.b);
			}
		}

		public LightManipulator Configure(float multiplier = 0.125f, bool invertColors = true, bool ignoreEnemies = true)
		{
			this.multiplier = multiplier;
			this.invertColors = invertColors;
			this.ignoreEnemies = ignoreEnemies;
			return this;
		}
	}
	public class MusicSlower : MonoBehaviour
	{
		public float multiplier = 0.1f;

		public int slowedCounter = 0;

		public bool isGradualPitch = false;

		public float gradualPitchSpeed = 0.2f;

		public float gradualPitchMultiplierTarget = 1.25f;

		public Dictionary<int, float> gradualPitchOriginals = new Dictionary<int, float>();

		public bool gradualPitchOriginalsSet = false;

		public void OnEnable()
		{
			Slow();
		}

		public void Slow(bool reversed = false)
		{
			if (!((Object)(object)MonoSingleton<MusicManager>.Instance == (Object)null))
			{
				AudioSource[] allThemes = MonoSingleton<MusicManager>.Instance.allThemes;
				foreach (AudioSource val in allThemes)
				{
					float num = AudioSourceExtensions.GetPitch(val) * ((!reversed) ? multiplier : (1f / multiplier));
					AudioSourceExtensions.SetPitch(val, num);
				}
				slowedCounter += ((!reversed) ? 1 : (-1));
			}
		}

		public void Update()
		{
			if (!isGradualPitch || (Object)(object)MonoSingleton<MusicManager>.Instance == (Object)null)
			{
				return;
			}
			bool flag = true;
			AudioSource[] allThemes = MonoSingleton<MusicManager>.Instance.allThemes;
			foreach (AudioSource val in allThemes)
			{
				int key = Array.IndexOf(MonoSingleton<MusicManager>.Instance.allThemes, val);
				if (!gradualPitchOriginalsSet)
				{
					gradualPitchOriginals[key] = AudioSourceExtensions.GetPitch(val);
				}
				float num = Mathf.MoveTowards(AudioSourceExtensions.GetPitch(val), gradualPitchOriginals[key] * gradualPitchMultiplierTarget, gradualPitchSpeed * Time.deltaTime);
				AudioSourceExtensions.SetPitch(val, num);
				if (AudioSourceExtensions.GetPitch(val) != gradualPitchOriginals[key] * gradualPitchMultiplierTarget)
				{
					flag = false;
				}
			}
			if (!gradualPitchOriginalsSet)
			{
				gradualPitchOriginalsSet = true;
			}
			if (flag)
			{
				isGradualPitch = false;
			}
		}

		public void GradualPitchChange(float gradualPitchMultiplierTarget = 1.25f, float gradualPitchSpeed = 0.2f)
		{
			isGradualPitch = true;
			this.gradualPitchMultiplierTarget = gradualPitchMultiplierTarget;
			this.gradualPitchSpeed = gradualPitchSpeed;
			gradualPitchOriginalsSet = false;
		}
	}
	public class SimpleScrollingText : MonoBehaviour
	{
		public TMP_Text text;

		public float secondsBetweenLetters = 0.025f;

		public int totalCharacters;

		public bool running = true;

		public bool finished = false;

		public float cooldown = 0f;

		public bool isLevelName = false;

		public string stringLevelName = null;

		public TMP_Text textLevelName;

		public void Start()
		{
			if (text == null)
			{
				text = ((Component)this).GetComponent<TMP_Text>();
			}
			Reset();
		}

		public void Reset()
		{
			text.ForceMeshUpdate(true, true);
			totalCharacters = text.textInfo.characterCount;
			text.maxVisibleCharacters = 0;
		}

		public void Update()
		{
			if (!((Component)this).gameObject.activeInHierarchy || !running || finished)
			{
				return;
			}
			cooldown += Time.deltaTime;
			if (!(cooldown < secondsBetweenLetters))
			{
				cooldown -= secondsBetweenLetters;
				TMP_Text obj = text;
				obj.maxVisibleCharacters += 1;
				if (isLevelName)
				{
					int length = Mathf.Min(2 + GetLastVisibleLetterIndex(), stringLevelName.Length);
					textLevelName.text = stringLevelName.Substring(0, length);
				}
				if (text.maxVisibleCharacters >= totalCharacters)
				{
					finished = true;
					running = false;
				}
			}
		}

		public int GetLastVisibleLetterIndex()
		{
			//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_0030: 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)
			int result = -1;
			for (int num = text.textInfo.characterCount - 1; num >= 0; num--)
			{
				TMP_CharacterInfo val = text.textInfo.characterInfo[num];
				if (val.isVisible)
				{
					result = val.index;
					break;
				}
			}
			return result;
		}
	}
	public class SimpleScrollingTextActivator : MonoBehaviour
	{
		public SimpleScrollingText simpleScrollingText;

		public void OnEnable()
		{
			simpleScrollingText.running = true;
		}

		public void OnDisable()
		{
			simpleScrollingText.running = false;
		}
	}
	[HarmonyPatch(typeof(ActivateArena), "Activate")]
	public class ActivateArenaPatch
	{
		public static bool Prefix(ActivateArena __instance)
		{
			if (!Util.IsPatched())
			{
				return true;
			}
			if (DisableEnemySpawns.DisableArenaTriggers || __instance.activated)
			{
				return false;
			}
			__instance.activated = true;
			if (!__instance.onlyWave && !__instance.forEnemy)
			{
				MonoSingleton<MusicManager>.Instance.ArenaMusicStart(true);
			}
			float num = -1f;
			ArenaDelay[] components = ((Component)__instance).GetComponents<ArenaDelay>();
			ArenaDelay[] array = components;
			foreach (ArenaDelay arenaDelay in array)
			{
				if (!((Object)(object)arenaDelay.target != (Object)(object)__instance))
				{
					num = arenaDelay.delay;
					break;
				}
			}
			if (__instance.doors.Length != 0)
			{
				Door[] doors = __instance.doors;
				Door[] array2 = doors;
				foreach (Door val in array2)
				{
					if ((Object)(object)val != (Object)null)
					{
						if (!((Component)val).gameObject.activeSelf)
						{
							((Component)val).gameObject.SetActive(true);
						}
						DoorAltarHelper componentInChildren = ((Component)val).GetComponentInChildren<DoorAltarHelper>();
						if (componentInChildren != null)
						{
							componentInChildren.playerInArena = true;
						}
						val.Lock();
					}
				}
				if (__instance.enemies.Length != 0)
				{
					if (num < 0f)
					{
						((MonoBehaviour)__instance).Invoke("SpawnEnemy", 1f);
					}
					else
					{
						((MonoBehaviour)__instance).Invoke("SpawnEnemy", num);
					}
				}
				else
				{
					Object.Destroy((Object)(object)__instance);
				}
			}
			else if (__instance.enemies.Length != 0)
			{
				if (num < 0f)
				{
					__instance.SpawnEnemy();
				}
				else
				{
					((MonoBehaviour)__instance).Invoke("SpawnEnemy", num);
				}
			}
			else
			{
				Object.Destroy((Object)(object)__instance);
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(ActivateNextWave))]
	public class ActivateNextWavePatch
	{
		[HarmonyPrefix]
		[HarmonyPatch(typeof(ActivateNextWave), "FixedUpdate")]
		public static bool FixedUpdatePrefix(ActivateNextWave __instance)
		{
			if (!Util.IsPatched())
			{
				return true;
			}
			if (__instance.deadEnemies < 0)
			{
				__instance.deadEnemies = 0;
			}
			if (__instance.activated || __instance.deadEnemies < __instance.enemyCount)
			{
				return false;
			}
			__instance.activated = true;
			if (__instance.lastWave)
			{
				((MonoBehaviour)__instance).Invoke("EndWaves", (float)((!__instance.noActivationDelay) ? 1 : 0));
				if (!__instance.forEnemies)
				{
					MonoSingleton<TimeController>.Instance.SlowDown(0.15f);
				}
				return false;
			}
			if (__instance.toActivate.Length != 0)
			{
				GameObject[] toActivate = __instance.toActivate;
				GameObject[] array = toActivate;
				foreach (GameObject val in array)
				{
					if (val != null)
					{
						val.SetActive(true);
					}
				}
			}
			if (__instance.doors.Length != 0)
			{
				Door[] doors = __instance.doors;
				Door[] array2 = doors;
				foreach (Door val2 in array2)
				{
					if (!((Object)(object)val2 != (Object)null))
					{
						continue;
					}
					DoorAltarHelper componentInChildren = ((Component)val2).GetComponentInChildren<DoorAltarHelper>();
					if (componentInChildren != null)
					{
						componentInChildren.playerInArena = false;
					}
					val2.Unlock();
					if (componentInChildren != null)
					{
						Door door = componentInChildren.door;
						if (door != null)
						{
							door.Open(false, true);
						}
					}
				}
			}
			((MonoBehaviour)__instance).Invoke("SpawnEnemy", (float)((!__instance.noActivationDelay) ? 1 : 0));
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(ActivateNextWave), "EndWaves")]
		public static bool EndWavesPrefix(ActivateNextWave __instance)
		{
			if (!Util.IsPatched())
			{
				return true;
			}
			if (__instance.toActivate.Length != 0 && !__instance.objectsActivated)
			{
				GameObject[] toActivate = __instance.toActivate;
				GameObject[] array = toActivate;
				foreach (GameObject val in array)
				{
					if (val != null)
					{
						val.SetActive(true);
					}
				}
				__instance.objectsActivated = true;
				__instance.EndWaves();
			}
			else if (__instance.currentDoor < __instance.doors.Length)
			{
				Door val2 = __instance.doors[__instance.currentDoor];
				DoorAltarHelper componentInChildren = ((Component)val2).GetComponentInChildren<DoorAltarHelper>();
				if (componentInChildren != null)
				{
					componentInChildren.playerInArena = false;
				}
				val2.Unlock();
				if ((Object)(object)val2 == (Object)(object)__instance.doorForward)
				{
					val2.Open(false, true);
				}
				else if (componentInChildren != null)
				{
					Door door = componentInChildren.door;
					if (door != null)
					{
						door.Open(false, true);
					}
				}
				__instance.currentDoor++;
				((MonoBehaviour)__instance).Invoke("EndWaves", 0.1f);
			}
			else
			{
				if (!__instance.forEnemies)
				{
					MonoSingleton<MusicManager>.Instance.ArenaMusicEnd();
					__instance.slowDown = 1f;
				}
				if (__instance.killChallenge)
				{
					MonoSingleton<ChallengeManager>.Instance.ChallengeDone();
				}
				Object.Destroy((Object)(object)__instance);
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(CheckPoint))]
	public class CheckPointPatch
	{
		[CompilerGenerated]
		private sealed class <UpdateRooms>d__1 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public CheckPoint __instance;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Expected O, but got Unknown
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_0073: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(1f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					__instance.i = 0;
					__instance.UpdateRooms();
					<>2__current = (object)new WaitForSeconds(0.1f);
					<>1__state = 2;
					return true;
				case 2:
					<>1__state = -1;
					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();
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(CheckPoint), "Start")]
		public static void StartPostfix(CheckPoint __instance)
		{
			if (!Util.IsPatched())
			{
				return;
			}
			InheritRoomExceptions component = ((Component)__instance).GetComponent<InheritRoomExceptions>();
			if ((Object)(object)component != (Object)null)
			{
				string[] roomNames = component.roomNames;
				foreach (string item in roomNames)
				{
					if (__instance.inheritNames.Contains(item))
					{
						int index = __instance.inheritNames.IndexOf(item);
						__instance.roomsToInherit.RemoveAt(index);
						__instance.inheritNames.RemoveAt(index);
						__instance.inheritParents.RemoveAt(index);
						break;
					}
				}
			}
			CheckPointToUpdate component2 = ((Component)__instance).GetComponent<CheckPointToUpdate>();
			if ((Object)(object)component2 == (Object)null || __instance.defaultRooms.Count == 0)
			{
				return;
			}
			foreach (int key in component2.rooms.Keys)
			{
				__instance.defaultRooms[key] = component2.rooms[key];
			}
			((MonoBehaviour)__instance).StartCoroutine(UpdateRooms(__instance));
		}

		[IteratorStateMachine(typeof(<UpdateRooms>d__1))]
		public static IEnumerator UpdateRooms(CheckPoint __instance)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <UpdateRooms>d__1(0)
			{
				__instance = __instance
			};
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(CheckPoint), "ResetRoom")]
		public static bool ResetRoomPrefix(CheckPoint __instance)
		{
			//IL_0068: 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_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			//IL_022e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0255: Unknown result type (might be due to invalid IL or missing references)
			//IL_029e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0302: Unknown result type (might be due to invalid IL or missing references)
			//IL_0393: Unknown result type (might be due to invalid IL or missing references)
			//IL_0399: Invalid comparison between Unknown and I4
			//IL_0378: Unknown result type (might be due to invalid IL or missing references)
			//IL_037d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0381: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0409: Unknown result type (might be due to invalid IL or missing references)
			//IL_040f: Unknown result type (might be due to invalid IL or missing references)
			//IL_043b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0446: 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)
			//IL_0455: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c7: Invalid comparison between Unknown and I4
			//IL_04e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_04f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0513: Unknown result type (might be due to invalid IL or missing references)
			//IL_053f: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.IsPatched())
			{
				return true;
			}
			if ((Object)(object)__instance.newRooms[__instance.i] != (Object)null && (Object)(object)__instance.defaultRooms[__instance.i] != (Object)null)
			{
				Vector3 position = __instance.newRooms[__instance.i].transform.position;
				__instance.newRooms[__instance.i].SetActive(false);
				Object.Destroy((Object)(object)__instance.newRooms[__instance.i]);
				__instance.newRooms[__instance.i] = Object.Instantiate<GameObject>(__instance.defaultRooms[__instance.i], position, __instance.defaultRooms[__instance.i].transform.rotation, __instance.defaultRooms[__instance.i].transform.parent);
				__instance.newRooms[__instance.i].SetActive(true);
				Bonus[] componentsInChildren = __instance.newRooms[__instance.i].GetComponentsInChildren<Bonus>(true);
				if (componentsInChildren != null && componentsInChildren.Length != 0)
				{
					Bonus[] array = componentsInChildren;
					for (int i = 0; i < array.Length; i++)
					{
						array[i].UpdateStatsManagerReference();
					}
				}
			}
			if (__instance.i + 1 < __instance.defaultRooms.Count)
			{
				__instance.i++;
				__instance.ResetRoom();
				return false;
			}
			if (Object.op_Implicit((Object)(object)__instance.toActivate))
			{
				__instance.toActivate.SetActive(true);
			}
			UnityEvent onRestart = __instance.onRestart;
			if (onRestart != null)
			{
				onRestart.Invoke();
			}
			if (!__instance.activated)
			{
				__instance.activated = true;
				if (Object.op_Implicit((Object)(object)__instance.graphic))
				{
					__instance.graphic.SetActive(false);
				}
			}
			__instance.player.transform.position = ((Component)__instance).transform.position + ((Component)__instance).transform.up * 1.25f;
			Rigidbody component = __instance.player.GetComponent<Rigidbody>();
			component.velocity = Vector3.zero;
			if ((Object)(object)__instance.nm == (Object)null)
			{
				__instance.nm = MonoSingleton<NewMovement>.Instance;
			}
			CameraController cc = __instance.nm.cc;
			PhysicsExtensions.SetCustomGravityMode(__instance.nm.rb, false);
			cc.gravityRotation = Quaternion.identity;
			Vector3 gravity = Physics.gravity;
			cc.gravityVec = ((Vector3)(ref gravity)).normalized;
			cc.rotationOffset = Quaternion.identity;
			cc.transitionRotationZ = 0f;
			cc.transitionRotationZSmooth = 0f;
			cc.tiltRotationZ = 0f;
			cc.tiltRotationZSmooth = 0f;
			Quaternion rotation = ((Component)__instance).transform.rotation;
			float num = ((Quaternion)(ref rotation)).eulerAngles.y + 0.01f + __instance.additionalSpawnRotation;
			if (Object.op_Implicit((Object)(object)__instance.player) && Object.op_Implicit((Object)(object)__instance.player.transform.parent) && ((Component)__instance.player.transform.parent).gameObject.CompareTag("Moving"))
			{
				float num2 = num;
				rotation = __instance.player.transform.parent.rotation;
				num = num2 - ((Quaternion)(ref rotation)).eulerAngles.y;
			}
			if ((int)MonoSingleton<PlayerTracker>.Instance.playerType == 0)
			{
				cc.ResetCamera(num, 0f);
			}
			else
			{
				MonoSingleton<PlatformerMovement>.Instance.ResetCamera(num, 0f);
			}
			cc.ApplyRotations(false);
			PhysicsExtensions.SetCustomGravity(__instance.nm.rb, __instance.gravity);
			PhysicsExtensions.SetCustomGravityMode(__instance.nm.rb, true);
			__instance.nm.gc.heavyFall = false;
			cc.Transform(Matrix4x4.identity, (Vector3?)__instance.gravity, (Quaternion?)null);
			MonoSingleton<CameraController>.Instance.activated = true;
			component.position = ((Component)__instance).transform.position + ((Component)__instance).transform.up * 1.25f;
			if (!((Behaviour)__instance.nm).enabled)
			{
				((Behaviour)__instance.nm).enabled = true;
			}
			__instance.nm.Respawn();
			__instance.nm.GetHealth(0, true, false, true);
			__instance.nm.cc.StopShake();
			__instance.nm.ActivatePlayer();
			if ((int)MonoSingleton<PlayerTracker>.Instance.playerType == 1)
			{
				((Component)MonoSingleton<PlatformerMovement>.Instance).transform.position = ((Component)__instance).transform.position;
				MonoSingleton<PlatformerMovement>.Instance.rb.velocity = Vector3.zero;
				MonoSingleton<PlatformerMovement>.Instance.playerModel.rotation = ((Component)__instance).transform.rotation;
				if (__instance.additionalSpawnRotation != 0f)
				{
					MonoSingleton<PlatformerMovement>.Instance.playerModel.Rotate(Vector3.up, __instance.additionalSpawnRotation);
				}
				((Component)MonoSingleton<PlatformerMovement>.Instance).gameObject.SetActive(true);
				MonoSingleton<PlatformerMovement>.Instance.SnapCamera();
				MonoSingleton<PlatformerMovement>.Instance.Respawn();
				MonoSingleton<CrateCounter>.Instance.ResetUnsavedStuff();
			}
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(CheckPoint), "UpdateRooms")]
		public static void UpdateRoomsPrefix(CheckPoint __instance)
		{
			if (!((Object)(object)__instance.defaultRooms[__instance.i].GetComponent<GoreZone>() != (Object)null))
			{
				if (__instance.i + 1 < __instance.defaultRooms.Count)
				{
					__instance.i++;
					__instance.UpdateRooms();
				}
				else
				{
					__instance.i = 0;
				}
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(CheckPoint), "ActivateCheckPoint")]
		public static bool ActivateCheckPointPrefix(CheckPoint __instance)
		{
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.IsPatched())
			{
				return true;
			}
			__instance.sm = MonoSingleton<StatsManager>.Instance;
			__instance.inDuringResetSafety = false;
			if (Object.op_Implicit((Object)(object)__instance.sm.currentCheckPoint) && (Object)(object)__instance.sm.currentCheckPoint != (Object)(object)__instance)
			{
				MonoSingleton<NewMovement>.Instance.sameCheckpointRestarts = 0;
				if (__instance.sm.currentCheckPoint.resetOnGetOtherCheckpoint)
				{
					__instance.sm.currentCheckPoint.ReactivateCheckpoint();
				}
			}
			__instance.gravity = PhysicsExtensions.GetGravityVector(MonoSingleton<NewMovement>.Instance.rb);
			__instance.sm.currentCheckPoint = __instance;
			__instance.activated = true;
			if (!__instance.invisible && __instance.activateEffect.RuntimeKeyIsValid())
			{
				Object.Instantiate<GameObject>(AddressablesExtensions.ToAsset(__instance.activateEffect), MonoSingleton<PlayerTracker>.Instance.GetPlayer().position, Quaternion.identity);
			}
			if (Object.op_Implicit((Object)(object)__instance.graphic))
			{
				__instance.graphic.SetActive(false);
			}
			if (Object.op_Implicit((Object)(object)MonoSingleton<PlatformerMovement>.Instance))
			{
				MonoSingleton<CrateCounter>.Instance.SaveStuff();
			}
			if (Object.op_Implicit((Object)(object)MonoSingleton<MapVarManager>.Instance))
			{
				MonoSingleton<MapVarManager>.Instance.StashStore();
			}
			__instance.stylePoints = __instance.sm.stylePoints;
			__instance.restartKills = 0;
			if (Object.op_Implicit((Object)(object)MonoSingleton<ChallengeManager>.Instance))
			{
				__instance.challengeAlreadyFailed = MonoSingleton<ChallengeManager>.Instance.challengeFailed;
			}
			if (Object.op_Implicit((Object)(object)MonoSingleton<ChallengeManager>.Instance))
			{
				__instance.challengeAlreadyDone = MonoSingleton<ChallengeManager>.Instance.challengeDone;
			}
			if (!__instance.firstTime)
			{
				__instance.defaultRooms.Clear();
				__instance.newRooms.Clear();
				if (__instance.rooms.Length != 0)
				{
					GameObject[] rooms = __instance.rooms;
					GameObject[] array = rooms;
					foreach (GameObject val in array)
					{
						__instance.roomsToInherit.Add(val);
						__instance.inheritNames.Add(((Object)val).name);
						__instance.inheritParents.Add(val.transform.parent);
					}
					__instance.rooms = (GameObject[])(object)new GameObject[0];
				}
			}
			if ((Object)(object)__instance.shud == (Object)null)
			{
				__instance.shud = MonoSingleton<StyleHUD>.Instance;
			}
			InheritCheckpointRooms(__instance);
			MonoSingleton<BloodsplatterManager>.Instance.SaveBloodstains();
			__instance.firstTime = false;
			return false;
		}

		public static void InheritCheckpointRooms(CheckPoint __instance)
		{
			if (__instance.roomsToInherit.Count == 0)
			{
				return;
			}
			for (int i = 0; i < __instance.roomsToInherit.Count; i++)
			{
				string text = __instance.inheritNames[i];
				text = text.Replace("(Clone)", "");
				GameObject val = null;
				if (!((Object)(object)__instance.inheritParents[i] == (Object)null))
				{
					for (int num = __instance.inheritParents[i].childCount - 1; num >= 0; num--)
					{
						GameObject gameObject = ((Component)__instance.inheritParents[i].GetChild(num)).gameObject;
						if (((Object)gameObject).name.Replace("(Clone)", "") == text)
						{
							if ((Object)(object)val == (Object)null)
							{
								val = gameObject;
							}
							else
							{
								Object.Destroy((Object)(object)gameObject);
							}
						}
					}
				}
				if ((Object)(object)val != (Object)null && (Object)(object)val.GetComponent<GoreZone>() != (Object)null)
				{
					__instance.InheritRoom(val);
				}
			}
		}
	}
	[HarmonyPatch(typeof(ItemPlaceZone))]
	public class ItemPlaceZonePatch
	{
		[HarmonyPrefix]
		[HarmonyPatch(typeof(ItemPlaceZone), "CheckItem")]
		public static bool CheckItemPrefix(bool prelim, ItemPlaceZone __instance)
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0456: Unknown result type (might be due to invalid IL or missing references)
			//IL_0464: Unknown result type (might be due to invalid IL or missing references)
			//IL_046b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0472: Unknown result type (might be due to invalid IL or missing references)
			//IL_0477: Unknown result type (might be due to invalid IL or missing references)
			//IL_0503: Unknown result type (might be due to invalid IL or missing references)
			//IL_0508: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.IsPatched())
			{
				return true;
			}
			ItemIdentifier componentInChildren = ((Component)__instance).GetComponentInChildren<ItemIdentifier>();
			GameObject[] activateOnSuccess;
			Door[] doors;
			InstantiateObject[] altarElements;
			if ((Object)(object)componentInChildren != (Object)null)
			{
				if (componentInChildren.itemType == __instance.acceptedItemType)
				{
					if (!prelim && !__instance.hideEffects && !__instance.acceptedItemPlaced)
					{
						if (Object.op_Implicit((Object)(object)__instance.elementChangeEffect))
						{
							__instance.elementChangeEffect.Play();
						}
						if (Object.op_Implicit((Object)(object)__instance.soundOnActivated))
						{
							Object.Instantiate<AudioSource>(__instance.soundOnActivated, ((Component)__instance).transform.position, Quaternion.identity);
						}
					}
					__instance.acceptedItemPlaced = true;
					componentInChildren.ipz = __instance;
					if (!__instance.hideEffects)
					{
						((Component)componentInChildren).SendMessage("OnCorrectUse", (SendMessageOptions)1);
					}
					activateOnSuccess = __instance.activateOnSuccess;
					for (int i = 0; i < activateOnSuccess.Length; i++)
					{
						activateOnSuccess[i].SetActive(true);
					}
					activateOnSuccess = __instance.deactivateOnSuccess;
					for (int j = 0; j < activateOnSuccess.Length; j++)
					{
						activateOnSuccess[j].SetActive(false);
					}
					doors = __instance.doors;
					foreach (Door val in doors)
					{
						DoorAltarHelper componentInChildren2 = ((Component)val).GetComponentInChildren<DoorAltarHelper>();
						if ((Object)(object)componentInChildren2 == (Object)null)
						{
							val.Open(false, true);
						}
					}
					doors = __instance.reverseDoors;
					foreach (Door val2 in doors)
					{
						DoorAltarHelper componentInChildren3 = ((Component)val2).GetComponentInChildren<DoorAltarHelper>();
						if ((Object)(object)componentInChildren3 == (Object)null)
						{
							val2.Close(false);
						}
					}
					if (!__instance.hideEffects)
					{
						altarElements = __instance.altarElements;
						InstantiateObject[] array = altarElements;
						foreach (InstantiateObject val3 in array)
						{
							((Component)val3).gameObject.SetActive(true);
							if (!prelim && ((Component)val3).gameObject.activeInHierarchy)
							{
								val3.Instantiate();
							}
						}
					}
					if (!prelim)
					{
						ArenaStatus[] arenaStatuses = __instance.arenaStatuses;
						foreach (ArenaStatus obj in arenaStatuses)
						{
							obj.currentStatus++;
						}
						arenaStatuses = __instance.reverseArenaStatuses;
						foreach (ArenaStatus obj2 in arenaStatuses)
						{
							obj2.currentStatus--;
						}
					}
				}
				else
				{
					activateOnSuccess = __instance.activateOnFailure;
					for (int num2 = 0; num2 < activateOnSuccess.Length; num2++)
					{
						activateOnSuccess[num2].SetActive(true);
					}
				}
				if (Object.op_Implicit((Object)(object)__instance.col))
				{
					__instance.col.enabled = false;
				}
				return false;
			}
			if (Object.op_Implicit((Object)(object)__instance.col))
			{
				__instance.col.enabled = true;
			}
			if (!prelim && !__instance.acceptedItemPlaced)
			{
				return false;
			}
			activateOnSuccess = __instance.activateOnSuccess;
			for (int num3 = 0; num3 < activateOnSuccess.Length; num3++)
			{
				activateOnSuccess[num3].SetActive(false);
			}
			activateOnSuccess = __instance.activateOnFailure;
			for (int num4 = 0; num4 < activateOnSuccess.Length; num4++)
			{
				activateOnSuccess[num4].SetActive(false);
			}
			activateOnSuccess = __instance.deactivateOnSuccess;
			for (int num5 = 0; num5 < activateOnSuccess.Length; num5++)
			{
				activateOnSuccess[num5].SetActive(true);
			}
			doors = __instance.doors;
			Door[] array2 = doors;
			foreach (Door val4 in array2)
			{
				DoorAltarHelper componentInChildren4 = ((Component)val4).GetComponentInChildren<DoorAltarHelper>();
				if ((Object)(object)componentInChildren4 == (Object)null && ((int)val4.doorType != 0 || ((Component)val4).transform.localPosition != val4.closedPos))
				{
					val4.Close(false);
				}
			}
			doors = __instance.reverseDoors;
			Door[] array3 = doors;
			foreach (Door val5 in array3)
			{
				DoorAltarHelper componentInChildren5 = ((Component)val5).GetComponentInChildren<DoorAltarHelper>();
				if ((Object)(object)componentInChildren5 == (Object)null && ((int)val5.doorType != 0 || ((Component)val5).transform.localPosition != val5.closedPos + val5.openPos))
				{
					val5.Open(false, true);
				}
			}
			if (!prelim)
			{
				__instance.acceptedItemPlaced = false;
				if (!__instance.hideEffects)
				{
					if (Object.op_Implicit((Object)(object)__instance.elementChangeEffect))
					{
						__instance.elementChangeEffect.Play();
					}
					if (Object.op_Implicit((Object)(object)__instance.soundOnDeactivated))
					{
						Object.Instantiate<AudioSource>(__instance.soundOnDeactivated, ((Component)__instance).transform.position, Quaternion.identity);
					}
				}
				ArenaStatus[] arenaStatuses2 = __instance.arenaStatuses;
				foreach (ArenaStatus obj3 in arenaStatuses2)
				{
					obj3.currentStatus--;
				}
				arenaStatuses2 = __instance.reverseArenaStatuses;
				foreach (ArenaStatus obj4 in arenaStatuses2)
				{
					obj4.currentStatus++;
				}
			}
			altarElements = __instance.altarElements;
			for (int num10 = 0; num10 < altarElements.Length; num10++)
			{
				((Component)altarElements[num10]).gameObject.SetActive(false);
			}
			return false;
		}
	}
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public class LeaderboardPatch
	{
		public static bool Prefix(ref bool __result)
		{
			if (!Util.IsPatched())
			{
				return true;
			}
			__result = false;
			return false;
		}
	}
	[HarmonyPatch(typeof(GetMissionName), "GetMissionNameOnly")]
	public class GetMissionNamePatch
	{
		public static void Postfix(int missionNum, ref string __result)
		{
			if (!Util.IsEnabled() || !ChangedInfo.ChangedLevels.Contains(missionNum))
			{
				return;
			}
			__result += " <color=#ff00af>(NEMESIS)</color>";
			foreach (string key in ChangedInfo.NewLevelNames.Keys)
			{
				if (!__result.Contains(key))
				{
					continue;
				}
				__result = __result.Replace(key, ChangedInfo.NewLevelNames[key]);
				break;
			}
		}
	}
	[HarmonyPatch(typeof(MapInfoBase), "Awake")]
	public class MapInfoBasePatch
	{
		public static void Postfix(MapInfoBase __instance)
		{
			if (!Util.IsEnabled() || !ChangedInfo.ChangedScenes.Contains(SceneHelper.CurrentScene))
			{
				return;
			}
			__instance.levelName += " <color=#ff00af>(NEMESIS)</color>";
			foreach (string key in ChangedInfo.NewLevelNames.Keys)
			{
				if (!__instance.levelName.Contains(key))
				{
					continue;
				}
				__instance.levelName = __instance.levelName.Replace(key, ChangedInfo.NewLevelNames[key]);
				break;
			}
		}
	}
	[HarmonyPatch(typeof(StockMapInfo), "Awake")]
	public class StockMapInfoPatch
	{
		public static void Postfix(StockMapInfo __instance)
		{
			if (!Util.IsEnabled() || !ChangedInfo.ChangedScenes.Contains(SceneHelper.CurrentScene))
			{
				return;
			}
			__instance.assets.LargeText += " (NEMESIS)";
			foreach (string key in ChangedInfo.NewLevelNames.Keys)
			{
				if (!__instance.assets.LargeText.Contains(key))
				{
					continue;
				}
				__instance.assets.LargeText = __instance.assets.LargeText.Replace(key, ChangedInfo.NewLevelNames[key]);
				break;
			}
		}
	}
	[HarmonyPatch(typeof(LevelStats), "Start")]
	public class LevelStatsPatch
	{
		public static void Postfix(LevelStats __instance)
		{
			if (!Util.IsEnabled() || !ChangedInfo.ChangedScenes.Contains(SceneHelper.CurrentScene))
			{
				return;
			}
			__instance.levelName.text = __instance.levelName.text.Replace("(NEMESIS)", "<color=#ff00af>(NEMESIS)</color>");
			foreach (string key in ChangedInfo.NewLevelNames.Keys)
			{
				if (!__instance.levelName.text.Contains(key))
				{
					continue;
				}
				__instance.levelName.text = __instance.levelName.text.Replace(key, ChangedInfo.NewLevelNames[key]);
				break;
			}
		}
	}
	[HarmonyPatch]
	public class LevelNamePopupPatch
	{
		[CompilerGenerated]
		private sealed class <NewShowNameText>d__2 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public LevelNamePopup __instance;

			private SimpleScrollingText <sst>5__1;

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

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

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

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

			private bool MoveNext()
			{
				//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ea: Expected O, but got Unknown
				//IL_014d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0157: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<sst>5__1 = ComponentExtensions.GetOrAddComponent<SimpleScrollingText>((Component)(object)__instance.nameText);
					<sst>5__1.running = false;
					<sst>5__1.text = __instance.nameText;
					((Component)<sst>5__1).GetComponent<TMP_Text>().text = __instance.nameString;
					<sst>5__1.Reset();
					<sst>5__1.secondsBetweenLetters = 0.015f;
					__instance.countTime = true;
					__instance.currentLetter = 0;
					AudioSourceExtensions.Play(__instance.aud, true);
					<sst>5__1.running = true;
					goto IL_00fb;
				case 1:
					<>1__state = -1;
					goto IL_00fb;
				case 2:
					{
						<>1__state = -1;
						__instance.fadingOut = true;
						__instance.nameAppearRoutine = null;
						return false;
					}
					IL_00fb:
					if (!<sst>5__1.finished)
					{
						<>2__current = (object)new WaitForSeconds(0.015f);
						<>1__state = 1;
						return true;
					}
					__instance.currentLetter = __instance.nameString.Length + 1;
					__instance.countTime = false;
					__instance.aud.Stop();
					<>2__current = (object)new WaitForSeconds(3f);
					<>1__state = 2;
					return true;
				}
			}

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

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

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

			private object <>2__current;

			public LevelNamePopup __instance;

			private SimpleScrollingText <sst>5__1;

			private GameObject <textPlaceholderObject>5__2;

			private TextMeshProUGUI <textPlaceholder>5__3;

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

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

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

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<sst>5__1 = null;
				<textPlaceholderObject>5__2 = null;
				<textPlaceholder>5__3 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0065: Unknown result type (might be due to invalid IL or missing references)
				//IL_006f: Expected O, but got Unknown
				//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
				//IL_0170: Unknown result type (might be due to invalid IL or missing references)
				//IL_017a: Expected O, but got Unknown
				//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
				//IL_01e7: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<sst>5__1 = ComponentExtensions.GetOrAddComponent<SimpleScrollingText>((Component)(object)__instance.nameText);
					<sst>5__1.running = false;
					<sst>5__1.isLevelName = true;
					<textPlaceholderObject>5__2 = new GameObject("Nemesis TextPlaceholder");
					<textPlaceholderObject>5__2.transform.SetParent(((Component)__instance).transform);
					<textPlaceholder>5__3 = <textPlaceholderObject>5__2.AddComponent<TextMeshProUGUI>();
					((Graphic)<textPlaceholder>5__3).color = new Color(1f, 1f, 1f, 0f);
					((TMP_Text)<textPlaceholder>5__3).text = __instance.nameString;
					<sst>5__1.text = (TMP_Text)(object)<textPlaceholder>5__3;
					<sst>5__1.stringLevelName = __instance.nameString;
					<sst>5__1.textLevelName = __instance.nameText;
					<sst>5__1.Reset();
					<sst>5__1.secondsBetweenLetters = 0.015f;
					__instance.countTime = true;
					__instance.currentLetter = 0;
					AudioSourceExtensions.Play(__instance.aud, true);
					<sst>5__1.running = true;
					goto IL_018b;
				case 1:
					<>1__state = -1;
					goto IL_018b;
				case 2:
					{
						<>1__state = -1;
						__instance.fadingOut = true;
						__instance.nameAppearRoutine = null;
						return false;
					}
					IL_018b:
					if (!<sst>5__1.finished)
					{
						<>2__current = (object)new WaitForSeconds(0.015f);
						<>1__state = 1;
						return true;
					}
					__instance.currentLetter = __instance.nameString.Length + 1;
					__instance.countTime = false;
					__instance.aud.Stop();
					<>2__current = (object)new WaitForSeconds(3f);
					<>1__state = 2;
					return true;
				}
			}

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

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

		[HarmonyPrefix]
		[HarmonyPatch(typeof(LevelNamePopup), "ShowNameText")]
		public static bool ShowNameTextPrefix(LevelNamePopup __instance, ref IEnumerator __result)
		{
			if (!Util.IsPatched())
			{
				return true;
			}
			__result = NewerShowNameText(__instance);
			return false;
		}

		[IteratorStateMachine(typeof(<NewerShowNameText>d__1))]
		public static IEnumerator NewerShowNameText(LevelNamePopup __instance)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <NewerShowNameText>d__1(0)
			{
				__instance = __instance
			};
		}

		[IteratorStateMachine(typeof(<NewShowNameText>d__2))]
		public static IEnumerator NewShowNameText(LevelNamePopup __instance)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <NewShowNameText>d__2(0)
			{
				__instance = __instance
			};
		}
	}
	[HarmonyPatch(typeof(DiscordController), "FetchSceneActivity")]
	public class DiscordPatch
	{
		public static bool Prefix(string scene, DiscordController __instance)
		{
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0277: Unknown result type (might be due to invalid IL or missing references)
			//IL_0285: Unknown result type (might be due to invalid IL or missing references)
			//IL_0287: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.IsPatched())
			{
				return true;
			}
			if (!Object.op_Implicit((Object)(object)DiscordController.Instance) || DiscordController.Instance.disabled || DiscordController.Instance.discord == null)
			{
				return false;
			}
			__instance.ResetActivityCache();
			if (SceneHelper.IsPlayingCustom)
			{
				__instance.cachedActivity.State = "Playing Custom Level";
				__instance.cachedActivity.Assets = ((SerializedActivityAssets)(ref __instance.customLevelActivityAssets)).Deserialize();
			}
			else
			{
				StockMapInfo instance = StockMapInfo.Instance;
				if (Object.op_Implicit((Object)(object)instance))
				{
					__instance.cachedActivity.Assets = ((SerializedActivityAssets)(ref instance.assets)).Deserialize();
					if (string.IsNullOrEmpty(__instance.cachedActivity.Assets.LargeImage))
					{
						__instance.cachedActivity.Assets.LargeImage = ((SerializedActivityAssets)(ref __instance.missingActivityAssets)).Deserialize().LargeImage;
					}
					if (string.IsNullOrEmpty(__instance.cachedActivity.Assets.LargeText))
					{
						__instance.cachedActivity.Assets.LargeText = ((SerializedActivityAssets)(ref __instance.missingActivityAssets)).Deserialize().LargeText;
					}
				}
				else
				{
					__instance.cachedActivity.Assets = ((SerializedActivityAssets)(ref __instance.missingActivityAssets)).Deserialize();
				}
				foreach (string key in ChangedInfo.PlainLevelNames.Keys)
				{
					if (!__instance.cachedActivity.Assets.LargeText.Contains(key))
					{
						continue;
					}
					__instance.cachedActivity.Assets.LargeText = __instance.cachedActivity.Assets.LargeText.Replace(key, ChangedInfo.PlainLevelNames[key]);
					break;
				}
				if (scene == "Main Menu")
				{
					__instance.cachedActivity.State = "Main Menu";
				}
				else
				{
					__instance.cachedActivity.State = "(NEMESIS) ";
					ref string state = ref __instance.cachedActivity.State;
					state = state + "DIFFICULTY: " + MonoSingleton<PresenceController>.Instance.diffNames[MonoSingleton<PrefsManager>.Instance.GetInt("difficulty", 0)];
				}
			}
			DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
			long start = (long)(DateTime.UtcNow - dateTime).TotalSeconds;
			__instance.cachedActivity.Timestamps = new ActivityTimestamps
			{
				Start = start
			};
			__instance.SendActivity();
			return false;
		}
	}
	[HarmonyPatch(typeof(SteamController), "FetchSceneActivity")]
	public static class SteamPatch
	{
		public static bool Prefix(string scene)
		{
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.IsPatched())
			{
				return true;
			}
			if (!SteamClient.IsValid)
			{
				return false;
			}
			if (SceneHelper.IsPlayingCustom)
			{
				SteamFriends.SetRichPresence("steam_display", "#AtCustomLevel");
				return false;
			}
			StockMapInfo instance = StockMapInfo.Instance;
			if (scene == "Main Menu")
			{
				SteamFriends.SetRichPresence("steam_display", "#AtMainMenu");
			}
			else if (scene == "Endless")
			{
				SteamFriends.SetRichPresence("steam_display", "#AtCyberGrind");
				SteamFriends.SetRichPresence("difficulty", MonoSingleton<PresenceController>.Instance.diffNames[MonoSingleton<PrefsManager>.Instance.GetInt("difficulty", 0)]);
				SteamFriends.SetRichPresence("wave", "0");
			}
			else if ((Object)(object)instance != (Object)null && !string.IsNullOrEmpty(((SerializedActivityAssets)(ref instance.assets)).Deserialize().LargeText))
			{
				SteamFriends.SetRichPresence("steam_display", "#AtStandardLevel");
				SteamFriends.SetRichPresence("difficulty", MonoSingleton<PresenceController>.Instance.diffNames[MonoSingleton<PrefsManager>.Instance.GetInt("difficulty", 0)]);
				string text = ((SerializedActivityAssets)(ref instance.assets)).Deserialize().LargeText;
				foreach (string key in ChangedInfo.PlainLevelNames.Keys)
				{
					if (!text.Contains(key))
					{
						continue;
					}
					text = text.Replace(key, ChangedInfo.PlainLevelNames[key]);
					break;
				}
				SteamFriends.SetRichPresence("level", text);
			}
			else
			{
				SteamFriends.SetRichPresence("steam_display", "#UnknownLevel");
			}
			return false;
		}
	}
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public class GameProgressSaverPatch
	{
		[HarmonyPriority(0)]
		public static void Postfix(out string path, int lvl, bool returnNull, RankData __instance, ref RankData __result)
		{
			path = ((lvl < 0) ? GameProgressSaver.resolveCurrentLevelPath : GameProgressSaver.LevelProgressPath(lvl));
			if (__result == null)
			{
				return;
			}
			int value = ((lvl < 0) ? MonoSingleton<StatsManager>.Instance.levelNumber : lvl);
			if (ChangedInfo.ChangedLevels.Contains(value) && Util.IsEnabled())
			{
				Plugin.forceDefaultLevelPath = true;
				string text = ((lvl < 0) ? GameProgressSaver.resolveCurrentLevelPath : GameProgressSaver.LevelProgressPath(lvl));
				Plugin.forceDefaultLevelPath = false;
				string text2 = ((lvl < 0) ? GameProgressSaver.resolveCurrentLevelPath : GameProgressSaver.LevelProgressPath(lvl));
				path = text2;
				object obj = GameProgressSaver.ReadFile(text);
				RankData val = (RankData)((obj is RankData) ? obj : null);
				if (val != null)
				{
					__result.challenge = val.challenge;
				}
			}
		}
	}
	[HarmonyPatch(typeof(GameProgressSaver), "LevelProgressPath")]
	public class LevelProgressPathPatch
	{
		[HarmonyPriority(0)]
		public static void Postfix(int lvl, ref string __result)
		{
			string[] array = Path.GetFileName(__result).Split(".");
			if (array.Length != 0)
			{
				if (!ChangedInfo.ChangedLevels.Contains(lvl) || !Util.IsEnabled() || Plugin.forceDefaultLevelPath)
				{
					array[0] = array[0].Replace("_nemesis", "");
					__result = Path.Join(Path.GetDirectoryName(__result).AsSpan(), string.Join(".", array).AsSpan());
					Plugin.forceDefaultLevelPath = false;
				}
				else if (!__result.Contains("_nemesis"))
				{
					array[0] += "_nemesis";
					__result = Path.Join(Path.GetDirectoryName(__result).AsSpan(), string.Join(".", array).AsSpan());
				}
			}
		}
	}
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public class RankDataConstructorPatch
	{
		public static void Postfix(StatsManager sman, RankData __instance)
		{
			Plugin.forceDefaultLevelPath = true;
			RankData rank = GameProgressSaver.GetRank(true, -1);
			Plugin.forceDefaultLevelPath = false;
			if (rank != null)
			{
				__instance.challenge = rank.challenge;
			}
		}
	}
	public static class LevelAssets
	{
		public static Dictionary<string, GameObject> Enemies = new Dictionary<string, GameObject>
		{
			["Filth"] = null,
			["Stray"] = null,
			["Stalker"] = null,
			["Schism"] = null,
			["Soldier"] = null,
			["Insurrectionist"] = null,
			["Ferryman"] = null,
			["MirrorReaper"] = null,
			["Drone"] = null,
			["Streetcleaner"] = null,
			["Swordsmachine"] = null,
			["Mindflayer"] = null,
			["Sentry"] = null,
			["Gutterman"] = null,
			["Guttertank"] = null,
			["RocketLauncher"] = null,
			["RocketLauncherNoStand"] = null,
			["Mortar"] = null,
			["Tower"] = null,
			["MaliciousFace"] = null,
			["Cerberus"] = null,
			["CerberusStatue"] = null,
			["CerberusStatueWhite"] = null,
			["Idol"] = null,
			["Mannequin"] = null,
			["MannequinPoser"] = null,
			["Deathcatcher"] = null,
			["DeathcatcherCase"] = null,
			["DeathcatcherClosed"] = null,
			["HideousMass"] = null,
			["Virtue"] = null,
			["Providence"] = null,
			["Power"] = null,
			["PowerNoEffect"] = null,
			["Eye"] = null,
			["EyeYellow"] = null,
			["EyeMalicious"] = null,
			["VeryCancerousRodent"] = null,
			["BombSpawner"] = null,
			["BombSpawnerBreaker"] = null,
			["BombSpawnerGutterman"] = null,
			["BombSpawnerGuttertank"] = null
		};

		public static Dictionary<string, GameObject> Objects = new Dictionary<string, GameObject>
		{
			["Checkpoint"] = null,
			["CheckpointReusable"] = null,
			["Altar"] = null,
			["AltarBlue"] = null,
			["AltarRed"] = null,
			["AltarTorch"] = null,
			["HookpointGreen"] = null,
			["HookpointBlue"] = null,
			["HookpointYellow"] = null,
			["HookpointProvidence"] = null,
			["JumpPad"] = null,
			["JumpPadSmall"] = null,
			["JumpPadSteam"] = null,
			["ElectricityBox"] = null,
			["TeslaCoils"] = null,
			["SuicideTree"] = null,
			["Terminal"] = null,
			["TerminalTestament"] = null,
			["TerminalPrime"] = null,
			["TerminalPrime1"] = null,
			["Plank"] = null,
			["PlankBlocker"] = null,
			["GlassFloor"] = null,
			["GlassWall"] = null,
			["GlassWall2"] = null,
			["Speakers"] = null,
			["SpeakersChime"] = null,
			["Breakable"] = null,
			["ScreenUsable"] = null,
			["ScreenInteractive"] = null,
			["ScreenInteractiveButton"] = null,
			["ScreenInteractiveStand"] = null,
			["ScreenPuzzle"] = null,
			["ScreenPuzzle5x5"] = null,
			["PierPlatform"] = null,
			["PierSegment"] = null,
			["PierStairs"] = null,
			["Crusher"] = null,
			["CrusherBad"] = null,
			["Fan"] = null,
			["Grinder"] = null,
			["EnergyBeam"] = null,
			["BrainBeam"] = null,
			["BrainBeamObstacle"] = null
		};

		public static Dictionary<string, GameObject> Particles = new Dictionary<string, GameObject>
		{
			["Break"] = null,
			["BreakBig"] = null,
			["BreakMetal"] = null
		};

		public static Dictionary<string, GameObject> DebugObjects = new Dictionary<string, GameObject> { ["AxisPoint"] = null };

		public static Dictionary<string, AudioClip> AudioClips = new Dictionary<string, AudioClip> { ["Shutdown"] = null };

		public static object[] Things = Array.Empty<object>();

		public static T Ass<T>(string path)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			return Addressables.LoadAssetAsync<T>((object)path).WaitForCompletion();
		}

		public static GameObject AssGO(string path)
		{
			return Ass<GameObject>(path);
		}

		public static void GetAssets()
		{
			GetEnemiesHusks();
			GetEnemiesMachines();
			GetEnemiesDemons();
			GetEnemiesAngels();
			GetEnemiesOther();
			GetObjectsMain();
			GetObjectsSecondary();
			GetObjectsObstacles();
			GetParticles();
			GetAudioClips();
			GetDebugObjects();
		}

		public static void GetEnemiesHusks()
		{
			Enemies["Filth"] = AssGO("Assets/Prefabs/Enemies/Filth.prefab");
			Enemies["Stray"] = AssGO("Assets/Prefabs/Enemies/Stray.prefab");
			Enemies["Stalker"] = AssGO("Assets/Prefabs/Enemies/Stalker.prefab");
			Enemies["Schism"] = AssGO("Assets/Prefabs/Enemies/Schism.prefab");
			Enemies["Soldier"] = AssGO("Assets/Prefabs/Enemies/Soldier.prefab");
			Enemies["Insurrectionist"] = AssGO("Assets/Prefabs/Enemies/Sisyphus.prefab");
			Enemies["Ferryman"] = AssGO("Assets/Prefabs/Enemies/Ferryman.prefab");
			Enemies["MirrorReaper"] = AssGO("Assets/Prefabs/Enemies/MirrorReaperCyberGrind.prefab");
		}

		public static void GetEnemiesMachines()
		{
			Enemies["Drone"] = AssGO("Assets/Prefabs/Enemies/Drone.prefab");
			Enemies["Streetcleaner"] = AssGO("Assets/Prefabs/Enemies/Streetcleaner.prefab");
			Enemies["Swordsmachine"] = AssGO("Assets/Prefabs/Enemies/SwordsMachine NonBoss.prefab");
			Enemies["Mindflayer"] = AssGO("Assets/Prefabs/Enemies/Mindflayer.prefab");
			Enemies["Sentry"] = AssGO("Assets/Prefabs/Enemies/Turret.prefab");
			Enemies["Gutterman"] = AssGO("Assets/Prefabs/Enemies/Gutterman.prefab");
			Enemies["Guttertank"] = AssGO("Assets/Prefabs/Enemies/Guttertank.prefab");
			Enemies["RocketLauncher"] = AssGO("Assets/Prefabs/Enemies/CentaurRocketLauncherStand.prefab");
			Enemies["RocketLauncherNoStand"] = AssGO("Assets/Prefabs/Enemies/CentaurRocketLauncher.prefab");
			Enemies["Mortar"] = AssGO("Assets/Prefabs/Enemies/CentaurMortar.prefab");
			Enemies["Tower"] = AssGO("Assets/Prefabs/Enemies/CentaurTower.prefab");
		}

		public static void GetEnemiesDemons()
		{
			Enemies["MaliciousFace"] = AssGO("Assets/Prefabs/Enemies/Malicious Face.prefab");
			Enemies["Cerberus"] = AssGO("Assets/Prefabs/Enemies/Cerberus.prefab");
			Enemies["CerberusStatue"] = AssGO("Assets/Prefabs/Enemies/CerberusStatue.prefab");
			Enemies["CerberusStatueWhite"] = AssGO("Assets/Prefabs/Enemies/CerberusStatueWhite.prefab");
			Enemies["Idol"] = AssGO("Assets/Prefabs/Enemies/Idol.prefab");
			Enemies["Mannequin"] = AssGO("Assets/Prefabs/Enemies/Mannequin.prefab");
			Enemies["MannequinPoser"] = AssGO("Assets/Prefabs/Enemies/MannequinPoserWithEnemy.prefab");
			Enemies["Deathcatcher"] = AssGO("Assets/Prefabs/Enemies/Deathcatcher.prefab");
			Enemies["DeathcatcherCase"] = AssGO("Assets/Prefabs/Enemies/DeathcatcherCase.prefab");
			Enemies["DeathcatcherClosed"] = AssGO("Assets/Prefabs/Enemies/DeathcatcherClosed.prefab");
			Enemies["HideousMass"] = AssGO("Assets/Prefabs/Enemies/Mass.prefab");
		}

		public static void GetEnemiesAngels()
		{
			Enemies["Virtue"] = AssGO("Assets/Prefabs/Enemies/Virtue.prefab");
			Enemies["Providence"] = AssGO("Assets/Prefabs/Enemies/Providence.prefab");
			Enemies["Power"] = AssGO("Assets/Prefabs/Enemies/PowerWithSpawnEffect.prefab");
			Enemies["PowerNoEffect"] = AssGO("Assets/Prefabs/Enemies/Power.prefab");
		}

		public static void GetEnemiesOther()
		{
			Enemies["Eye"] = ((Component)AssGO("Assets/