Decompiled source of ULTRAROGUE v0.2.7

Ultrarogue.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.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using GameConsole;
using GameConsole.CommandTree;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Steamworks;
using TMPro;
using ULTRAKILL.Portal;
using ULTRAKILL.Portal.Geometry;
using Ultrarogue;
using Ultrarogue.Characters;
using Ultrarogue.Curses;
using Ultrarogue.Items;
using Ultrarogue.SceneStuff;
using Unity.AI.Navigation;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.AddressableAssets;
using UnityEngine.AddressableAssets.ResourceLocators;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceLocations;
using UnityEngine.ResourceManagement.ResourceProviders;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using plog;
using plog.Models;

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

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[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;
		}
	}
}
public class AssetsManager
{
	public static List<WeaponDescriptor> descriptors = new List<WeaponDescriptor>();

	public static Material weaponMat;

	public static GameObject Agony;

	public static GameObject Tundra;

	public static GameObject MirrorReaper;

	public static GameObject VirtueBeam;

	public static GameObject BreakParticle;

	public static Dictionary<EnemyType, List<SpawnableObject>> enemiesByType = new Dictionary<EnemyType, List<SpawnableObject>>();

	public static Dictionary<string, List<SpawnableObject>> enemiesByClass = new Dictionary<string, List<SpawnableObject>>();

	private static int _loadsDone = 0;

	private const int TotalLoads = 2;

	public static GameObject napalmProj;

	public static GameObject mindflayerBeam;

	public static GameObject funnyPowerIntroSpawn;

	public static GameObject zapThingy;

	public static GameObject spawnEffect;

	public static GameObject healingEffect;

	public static AudioClip StalkerWarning;

	public static AudioClip FilthAttack;

	public static Sprite ArmFeedbacker;

	public static Sprite ArmKnuckleBlaster;

	public static Sprite ArmWhiplash;

	private static Material _alchemyMat;

	public static bool IsReady { get; private set; } = false;

	public static void Init()
	{
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: 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_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_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0127: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: 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_0154: Unknown result type (might be due to invalid IL or missing references)
		//IL_0177: Unknown result type (might be due to invalid IL or missing references)
		//IL_017c: Unknown result type (might be due to invalid IL or missing references)
		//IL_019f: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0219: Unknown result type (might be due to invalid IL or missing references)
		//IL_021e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0242: Unknown result type (might be due to invalid IL or missing references)
		//IL_0247: Unknown result type (might be due to invalid IL or missing references)
		//IL_026b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0270: Unknown result type (might be due to invalid IL or missing references)
		((MonoBehaviour)Plugin.Instance).StartCoroutine(GetAllSpawnables());
		((MonoBehaviour)Plugin.Instance).StartCoroutine(GetAllEnemies());
		if ((Object)(object)napalmProj == (Object)null)
		{
			napalmProj = Addressables.LoadAssetAsync<GameObject>((object)"Assets/Prefabs/Attacks and Projectiles/GasolineProjectile.prefab").WaitForCompletion();
		}
		if ((Object)(object)VirtueBeam == (Object)null)
		{
			VirtueBeam = Addressables.LoadAssetAsync<GameObject>((object)"Virtue Insignia").WaitForCompletion();
		}
		if ((Object)(object)BreakParticle == (Object)null)
		{
			BreakParticle = Addressables.LoadAssetAsync<GameObject>((object)"Assets/Particles/Breaks/BreakParticle.prefab").WaitForCompletion();
		}
		if ((Object)(object)Agony == (Object)null)
		{
			Agony = Addressables.LoadAssetAsync<GameObject>((object)"Assets/Prefabs/Enemies/SwordsMachine Agony.prefab").WaitForCompletion();
		}
		if ((Object)(object)healingEffect == (Object)null)
		{
			healingEffect = Addressables.LoadAssetAsync<GameObject>((object)"Assets/Particles/HealingEffect.prefab").WaitForCompletion();
		}
		if ((Object)(object)funnyPowerIntroSpawn == (Object)null)
		{
			funnyPowerIntroSpawn = Addressables.LoadAssetAsync<EndlessEnemy>((object)"Assets/Data/Cyber Grind Patterns/Data/PowerEndlessData.asset").WaitForCompletion().prefab;
		}
		if ((Object)(object)Tundra == (Object)null)
		{
			Tundra = Addressables.LoadAssetAsync<GameObject>((object)"Assets/Prefabs/Enemies/SwordsMachine Tundra.prefab").WaitForCompletion();
		}
		if ((Object)(object)zapThingy == (Object)null)
		{
			zapThingy = Addressables.LoadAssetAsync<GameObject>((object)"Assets/Particles/HitSparkElectricity.prefab").WaitForCompletion();
		}
		if ((Object)(object)spawnEffect == (Object)null)
		{
			spawnEffect = Addressables.LoadAssetAsync<GameObject>((object)"Assets/Particles/Spawn Effects/SpawnEffect Melee Hard.prefab").WaitForCompletion();
		}
		if ((Object)(object)mindflayerBeam == (Object)null)
		{
			mindflayerBeam = Addressables.LoadAssetAsync<GameObject>((object)"Assets/Prefabs/Attacks and Projectiles/Hitscan Beams/Mindflayer Beam.prefab").WaitForCompletion();
		}
		if ((Object)(object)StalkerWarning == (Object)null)
		{
			StalkerWarning = Addressables.LoadAssetAsync<AudioClip>((object)"Assets/Sounds/Enemies/StalkerWarning.wav").WaitForCompletion();
		}
		if ((Object)(object)FilthAttack == (Object)null)
		{
			FilthAttack = Addressables.LoadAssetAsync<AudioClip>((object)"Assets/Sounds/Enemies/Zombie Weak Death Reverse.wav").WaitForCompletion();
		}
		if ((Object)(object)ArmFeedbacker == (Object)null)
		{
			ArmFeedbacker = Addressables.LoadAssetAsync<Sprite>((object)"Assets/Textures/UI/ArmFeedbacker.png").WaitForCompletion();
		}
		if ((Object)(object)ArmKnuckleBlaster == (Object)null)
		{
			ArmKnuckleBlaster = Addressables.LoadAssetAsync<Sprite>((object)"Assets/Textures/UI/ArmKnuckleblaster.png").WaitForCompletion();
		}
		if ((Object)(object)ArmWhiplash == (Object)null)
		{
			ArmWhiplash = Addressables.LoadAssetAsync<Sprite>((object)"Assets/Textures/UI/ArmWhiplash.png").WaitForCompletion();
		}
	}

	private static void OnLoadComplete()
	{
		_loadsDone++;
		if (_loadsDone >= 2)
		{
			IsReady = true;
			Plugin.Logger.LogInfo((object)($"AssetsManager ready — {descriptors.Count} weapon descriptors, " + $"{enemiesByType.Values.Sum((List<SpawnableObject> l) => l.Count)} enemies across " + $"{enemiesByType.Count} type(s) loaded."));
		}
	}

	private static IEnumerator GetAllSpawnables()
	{
		AsyncOperationHandle<IResourceLocator> initHandle = Addressables.InitializeAsync();
		yield return initHandle;
		List<IResourceLocation> allLocations = new List<IResourceLocation>();
		foreach (IResourceLocator locator in Addressables.ResourceLocators)
		{
			List<object> keys = locator.Keys.ToList();
			if (keys.Count != 0)
			{
				AsyncOperationHandle<IList<IResourceLocation>> locHandle = Addressables.LoadResourceLocationsAsync((IList<object>)keys, (MergeMode)1, typeof(WeaponDescriptor));
				yield return locHandle;
				if ((int)locHandle.Status == 1)
				{
					allLocations.AddRange(locHandle.Result);
				}
				Addressables.Release<IList<IResourceLocation>>(locHandle);
			}
		}
		allLocations = (from l in allLocations
			group l by l.InternalId into g
			select g.First()).ToList();
		Plugin.Logger.LogInfo((object)$"Found {allLocations.Count} WeaponDescriptor locations");
		foreach (IResourceLocation location in allLocations)
		{
			AsyncOperationHandle<WeaponDescriptor> loadHandle = Addressables.LoadAssetAsync<WeaponDescriptor>(location);
			yield return loadHandle;
			if ((int)loadHandle.Status == 1)
			{
				descriptors.Add(loadHandle.Result);
			}
		}
		OnLoadComplete();
	}

	private static IEnumerator GetAllEnemies()
	{
		AsyncOperationHandle<IResourceLocator> initHandle = Addressables.InitializeAsync();
		yield return initHandle;
		List<IResourceLocation> allLocations = new List<IResourceLocation>();
		foreach (IResourceLocator locator in Addressables.ResourceLocators)
		{
			List<object> keys = locator.Keys.ToList();
			if (keys.Count != 0)
			{
				AsyncOperationHandle<IList<IResourceLocation>> locHandle = Addressables.LoadResourceLocationsAsync((IList<object>)keys, (MergeMode)1, typeof(SpawnableObject));
				yield return locHandle;
				if ((int)locHandle.Status == 1)
				{
					allLocations.AddRange(locHandle.Result);
				}
				Addressables.Release<IList<IResourceLocation>>(locHandle);
			}
		}
		allLocations = (from l in allLocations
			group l by l.InternalId into g
			select g.First()).ToList();
		Plugin.Logger.LogInfo((object)$"Found {allLocations.Count} SpawnableObject locations");
		int enemyCount = 0;
		foreach (IResourceLocation location in allLocations)
		{
			AsyncOperationHandle<SpawnableObject> loadHandle = Addressables.LoadAssetAsync<SpawnableObject>(location);
			yield return loadHandle;
			if ((int)loadHandle.Status != 1)
			{
				continue;
			}
			SpawnableObject obj = loadHandle.Result;
			if ((int)obj.spawnableObjectType == 1)
			{
				if (!enemiesByType.ContainsKey(obj.enemyType))
				{
					enemiesByType[obj.enemyType] = new List<SpawnableObject>();
				}
				if (!enemiesByClass.ContainsKey(GetClassName(obj.type)))
				{
					enemiesByClass[GetClassName(obj.type)] = new List<SpawnableObject>();
				}
				enemiesByType[obj.enemyType].Add(obj);
				enemiesByClass[GetClassName(obj.type)].Add(obj);
				enemyCount++;
			}
		}
		Plugin.Logger.LogInfo((object)$"Loaded {enemyCount} enemy SpawnableObjects across {enemiesByType.Count} type(s).");
		foreach (KeyValuePair<EnemyType, List<SpawnableObject>> kvp in enemiesByType)
		{
			Plugin.Logger.LogInfo((object)$"  {kvp.Key}: {kvp.Value.Count} variant(s)");
		}
		OnLoadComplete();
	}

	public static string GetClassName(string type)
	{
		type = type.Replace("Supreme ", "");
		type = type.Replace("Lesser ", "");
		type = type.Replace("Greater ", "");
		return type;
	}

	public static Sprite prefToSprite(string pref, bool alternate)
	{
		if (!IsReady)
		{
			Plugin.Logger.LogWarning((object)("prefToDescriptor called before assets finished loading! pref=" + pref));
			return null;
		}
		char c = pref.Last();
		if (pref.Contains("rev"))
		{
			IEnumerable<WeaponDescriptor> source = descriptors.Where((WeaponDescriptor x) => x.weaponName.StartsWith((!alternate) ? "Revolver" : "Alternative Revolver"));
			switch (c)
			{
			case '0':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Pierce"))).icon;
			case '1':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Twirl"))).icon;
			case '2':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Ricochet"))).icon;
			}
		}
		else if (pref.Contains("sho"))
		{
			IEnumerable<WeaponDescriptor> source = descriptors.Where((WeaponDescriptor x) => x.weaponName.StartsWith((!alternate) ? "Shotgun" : "Hammer"));
			switch (c)
			{
			case '0':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Grenade"))).icon;
			case '1':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Pump"))).icon;
			case '2':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Saw"))).icon;
			}
		}
		else if (pref.Contains("nai"))
		{
			IEnumerable<WeaponDescriptor> source = descriptors.Where((WeaponDescriptor x) => x.weaponName.StartsWith((!alternate) ? "Nailgun" : "Sawblade Launcher"));
			switch (c)
			{
			case '0':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Magnet"))).icon;
			case '1':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Overheat"))).icon;
			case '2':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Jumpstart"))).icon;
			}
		}
		else if (pref.Contains("rai"))
		{
			IEnumerable<WeaponDescriptor> source = descriptors.Where((WeaponDescriptor x) => x.weaponName.StartsWith("Railcannon"));
			switch (c)
			{
			case '0':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Electric"))).icon;
			case '1':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Harpoon"))).icon;
			case '2':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Malicious"))).icon;
			}
		}
		else if (pref.Contains("rock"))
		{
			IEnumerable<WeaponDescriptor> source = descriptors.Where((WeaponDescriptor x) => x.weaponName.StartsWith("Rocket Launcher"));
			switch (c)
			{
			case '0':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Freeze"))).icon;
			case '1':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Cannonball"))).icon;
			case '2':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Napalm"))).icon;
			}
		}
		else if (pref.Contains("arm"))
		{
			switch (c)
			{
			case '0':
				return ArmFeedbacker;
			case '1':
				return ArmKnuckleBlaster;
			case '2':
				return ArmWhiplash;
			}
		}
		Plugin.Logger.LogWarning((object)("prefToDescriptor: no match for pref='" + pref + "'"));
		return descriptors.Find((WeaponDescriptor x) => x.weaponName == "UNKNOWN").icon;
	}

	public static WeaponDescriptor prefToDescriptor(string pref, bool alternate)
	{
		if (!IsReady)
		{
			Plugin.Logger.LogWarning((object)("prefToDescriptor called before assets finished loading! pref=" + pref));
			return null;
		}
		char c = pref.Last();
		if (pref.Contains("rev"))
		{
			IEnumerable<WeaponDescriptor> source = descriptors.Where((WeaponDescriptor x) => x.weaponName.StartsWith((!alternate) ? "Revolver" : "Alternative Revolver"));
			switch (c)
			{
			case '0':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Pierce")));
			case '1':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Twirl")));
			case '2':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Ricochet")));
			}
		}
		else if (pref.Contains("sho"))
		{
			IEnumerable<WeaponDescriptor> source = descriptors.Where((WeaponDescriptor x) => x.weaponName.StartsWith((!alternate) ? "Shotgun" : "Hammer"));
			switch (c)
			{
			case '0':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Grenade")));
			case '1':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Pump")));
			case '2':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Saw")));
			}
		}
		else if (pref.Contains("nai"))
		{
			IEnumerable<WeaponDescriptor> source = descriptors.Where((WeaponDescriptor x) => x.weaponName.StartsWith((!alternate) ? "Nailgun" : "Sawblade Launcher"));
			switch (c)
			{
			case '0':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Magnet")));
			case '1':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Overheat")));
			case '2':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Jumpstart")));
			}
		}
		else if (pref.Contains("rai"))
		{
			IEnumerable<WeaponDescriptor> source = descriptors.Where((WeaponDescriptor x) => x.weaponName.StartsWith("Railcannon"));
			switch (c)
			{
			case '0':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Electric")));
			case '1':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Harpoon")));
			case '2':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Malicious")));
			}
		}
		else if (pref.Contains("rock"))
		{
			IEnumerable<WeaponDescriptor> source = descriptors.Where((WeaponDescriptor x) => x.weaponName.StartsWith("Rocket Launcher"));
			switch (c)
			{
			case '0':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Freeze")));
			case '1':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Cannonball")));
			case '2':
				return source.FirstOrDefault((Func<WeaponDescriptor, bool>)((WeaponDescriptor x) => x.weaponName.EndsWith("Napalm")));
			}
		}
		Plugin.Logger.LogWarning((object)("prefToDescriptor: no match for pref='" + pref + "'"));
		return descriptors.Find((WeaponDescriptor x) => x.weaponName == "UNKNOWN");
	}

	public static Material getAlchemy()
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)_alchemyMat == (Object)null)
		{
			_alchemyMat = Addressables.LoadAssetAsync<Material>((object)"Assets/Modding/RogueMode/balala.mat").WaitForCompletion();
		}
		return _alchemyMat;
	}

	public static List<SpawnableObject> GetEnemiesOfType(EnemyType type)
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		if (!IsReady)
		{
			Plugin.Logger.LogWarning((object)"GetEnemiesOfType called before assets finished loading!");
			return null;
		}
		List<SpawnableObject> value;
		return enemiesByType.TryGetValue(type, out value) ? value : new List<SpawnableObject>();
	}
}
public class Missle : MonoBehaviour
{
	public EnemyIdentifier enemyThatGotHit;

	private EnemyIdentifier target;

	public float speed = 25f;

	public float upwardForce = 15f;

	public float homingDelay = 0.5f;

	public float turnSpeed = 5f;

	public float damage = 10f;

	public float explosionRadius = 0.1f;

	private float AliveTime = 0f;

	public GameObject freezeEffect;

	public GameObject levelEffect;

	private bool homingActive = false;

	private Rigidbody rb;

	private bool kaboomed = false;

	private bool super = false;

	public bool isRocket = false;

	private float frozenT = 0f;

	public bool frozen => Object.op_Implicit((Object)(object)MonoSingleton<WeaponCharges>.Instance) && MonoSingleton<WeaponCharges>.Instance.rocketFrozen;

	private void Start()
	{
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		rb = ((Component)this).GetComponent<Rigidbody>();
		rb.velocity = Vector3.up * upwardForce;
		target = enemyThatGotHit;
		((MonoBehaviour)this).StartCoroutine(ActivateHoming());
	}

	private IEnumerator ActivateHoming()
	{
		yield return (object)new WaitForSeconds(homingDelay);
		homingActive = true;
	}

	private void FixedUpdate()
	{
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Unknown result type (might be due to invalid IL or missing references)
		//IL_0157: Unknown result type (might be due to invalid IL or missing references)
		//IL_016e: Unknown result type (might be due to invalid IL or missing references)
		//IL_016f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0176: Unknown result type (might be due to invalid IL or missing references)
		//IL_017b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0180: Unknown result type (might be due to invalid IL or missing references)
		//IL_0184: Unknown result type (might be due to invalid IL or missing references)
		//IL_0189: Unknown result type (might be due to invalid IL or missing references)
		//IL_0190: Unknown result type (might be due to invalid IL or missing references)
		//IL_0191: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)freezeEffect != (Object)null)
		{
			freezeEffect.SetActive(frozen);
		}
		if (frozen && isRocket)
		{
			rb.velocity = Vector3.zero;
			frozenT += Time.deltaTime;
			if (frozenT >= 0.5f && !super)
			{
				levelEffect.SetActive(true);
				super = true;
				speed *= 3f;
			}
		}
		else
		{
			if (!homingActive)
			{
				return;
			}
			AliveTime += Time.deltaTime;
			if ((Object)(object)target == (Object)null || target.dead)
			{
				List<EnemyIdentifier> currentEnemies = MonoSingleton<EnemyTracker>.Instance.GetCurrentEnemies();
				if (currentEnemies.Count <= 0)
				{
					return;
				}
				target = currentEnemies[Random.Range(0, currentEnemies.Count)];
			}
			Vector3 val = (((Object)(object)target.weakPoint == (Object)null) ? ((Component)target).transform.position : target.weakPoint.transform.position);
			Vector3 val2 = val - ((Component)this).transform.position;
			Vector3 normalized = ((Vector3)(ref val2)).normalized;
			((Component)this).transform.up = -normalized;
			Vector3 velocity = Vector3.Lerp(rb.velocity, normalized * speed, turnSpeed * Time.fixedDeltaTime);
			rb.velocity = velocity;
			if (AliveTime >= 20f)
			{
				Explode();
			}
		}
	}

	private void OnTriggerEnter(Collider col)
	{
		//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)((Component)col).gameObject.GetComponent<NewMovement>()) && LayerMaskDefaults.IsMatchingLayer(((Component)col).gameObject.layer, (LMD)0) && !kaboomed)
		{
			kaboomed = true;
			Plugin.Logger.LogInfo((object)("I hit " + ((Object)((Component)col).gameObject).name));
			EnemyIdentifierIdentifier component = ((Component)col).gameObject.GetComponent<EnemyIdentifierIdentifier>();
			EnemyIdentifier val = (((Object)(object)component == (Object)null) ? ((Component)col).gameObject.GetComponent<EnemyIdentifier>() : component.eid);
			if ((Object)(object)val != (Object)null)
			{
				val.hitter = "missle";
				val.DeliverDamage(((Component)col).gameObject, Vector3.zero, ((Component)component).transform.position, super ? (damage * 2f) : damage, false, 0f, (GameObject)null, false, false);
			}
			Explode();
		}
	}

	private void Explode()
	{
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		Plugin.Logger.LogInfo((object)$"super={super}, frozenT={frozenT}");
		GameObject val = (super ? MonoSingleton<DefaultReferenceManager>.Instance.superExplosion : MonoSingleton<DefaultReferenceManager>.Instance.explosion);
		GameObject val2 = Object.Instantiate<GameObject>(val, ((Component)this).transform.position, Quaternion.identity);
		Explosion[] componentsInChildren = val2.GetComponentsInChildren<Explosion>();
		foreach (Explosion val3 in componentsInChildren)
		{
			val3.maxSize = (super ? (explosionRadius * 3f) : explosionRadius);
			val3.canHit = (AffectedSubjects)2;
			val3.damage = (super ? (Mathf.RoundToInt(damage) * 4) : (Mathf.RoundToInt(damage) * 2));
		}
		Object.Destroy((Object)(object)((Component)this).gameObject);
	}
}
public class BloodMachine : MonoBehaviour
{
	public GameObject BloodObject;

	public int MinFullThreshold = 3;

	public int MaxFullThreshold = 10;

	public int FullThreshold = 10;

	public Vector3 localPositionPartial;

	public Vector3 localPositionFull;

	public UnityEvent onUse;

	public UnityEvent onFill;

	private int bloodDonated;

	private void Awake()
	{
		FullThreshold = RogueDifficultyManager.BloodRNG.Next(MinFullThreshold, MaxFullThreshold);
	}

	public void BLOOD()
	{
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		if (Plugin.SelectedChar.HasPassive(Passive.Greedy))
		{
			MonoSingleton<HudMessageReceiver>.Instance.SendHudMessage("<color=red>INCOMPATIBLE BLOOD</color>", "", "", 0, false, false, true);
			return;
		}
		Debug.Log((object)$"bloodDonated: {bloodDonated}, FullThreshold: {FullThreshold}");
		if (bloodDonated == FullThreshold)
		{
			return;
		}
		int num = Mathf.FloorToInt((float)Plugin.MaxHealth * 0.25f);
		if (Plugin.SelectedChar.HasPassive(Passive.HealFromBlood))
		{
			num = Mathf.RoundToInt(55f);
		}
		if (MonoSingleton<NewMovement>.Instance.hp - num <= 0)
		{
			MonoSingleton<HudMessageReceiver>.Instance.SendHudMessage("<color=red>NOT ENOUGH BLOOD</color>", "", "", 0, false, false, true);
			return;
		}
		bloodDonated++;
		onUse.Invoke();
		if (bloodDonated == 1)
		{
			BloodObject.transform.localPosition = localPositionPartial;
		}
		else if (bloodDonated == FullThreshold)
		{
			BloodObject.transform.localPosition = localPositionFull;
			onFill.Invoke();
			if (Plugin.SelectedChar.HasPassive(Passive.HealFromBlood))
			{
				ItemPickup.CreatePickup(Plugin.GiveRandomItem(RogueDifficultyManager.BloodRNG, DroptableType.CommonOnly), ((Component)this).transform, 5f);
			}
			else
			{
				ItemPickup.CreatePickup(Plugin.GiveRandomItem(RogueDifficultyManager.BloodRNG, DroptableType.BloodMachine), ((Component)this).transform, 5f);
			}
		}
		if (Plugin.SelectedChar.GetType() != typeof(Filth))
		{
			MonoSingleton<NewMovement>.Instance.GetHurt(num, false, 1f, false, false, 0.35f, true);
		}
		else
		{
			for (int i = 0; i < num; i++)
			{
				MonoSingleton<NewMovement>.Instance.GetHurt(1, false, 1f, false, false, 0.35f, true);
			}
		}
		RogueDifficultyManager.Instance.Gold++;
	}
}
public class ExecuteOnSceneLoadRogue : MonoBehaviour
{
	[Tooltip("Lower value ExecuteOnSceneLoad are executed first")]
	public int relativeExecutionOrder = 0;

	public UnityEvent onSceneLoad;

	public void Execute()
	{
		if (onSceneLoad != null)
		{
			onSceneLoad.Invoke();
		}
	}
}
[Serializable]
public class LayerInfoRogue
{
	public string layerName = "";

	public string[] layerLevels = new string[0];
}
public class FirstRoomSpawnerRogue : MonoBehaviour, ISerializationCallbackReceiver
{
	[HideInInspector]
	internal class PlayerForcedMovement : MonoBehaviour
	{
		public NewMovement player;

		private Rigidbody rb;

		public static float defaultMoveForce = 67f;

		public float force = defaultMoveForce;

		public void Awake()
		{
			if ((Object)(object)player == (Object)null)
			{
				player = MonoSingleton<NewMovement>.Instance;
			}
			rb = ((Component)player).GetComponent<Rigidbody>();
			rb.useGravity = false;
		}

		public void LateUpdate()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			rb.velocity = new Vector3(0f, force, 0f);
		}

		public void DestroyComp()
		{
			rb.useGravity = true;
			Object.Destroy((Object)(object)this);
		}
	}

	[HideInInspector]
	private class LocalMoveTowards : MonoBehaviour
	{
		public Vector3 targetLocalPosition;

		public bool active = false;

		public float speed = 10f;

		public void Update()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			if (active)
			{
				((Component)this).transform.localPosition = Vector3.MoveTowards(((Component)this).transform.localPosition, targetLocalPosition, Time.deltaTime * speed);
				if (((Component)this).transform.localPosition == targetLocalPosition)
				{
					Object.Destroy((Object)(object)this);
				}
			}
		}

		public void Activate()
		{
			active = true;
		}
	}

	[HideInInspector]
	private class CustomHellmapCursor : MonoBehaviour
	{
		public Vector2 targetPosition;

		public Image targetImage;

		public AudioSource aud;

		private bool white = true;

		private RectTransform rect;

		private void Start()
		{
			rect = ((Component)this).GetComponent<RectTransform>();
			((MonoBehaviour)this).Invoke("FlashImage", 0.075f);
		}

		private void Update()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: 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_0044: Unknown result type (might be due to invalid IL or missing references)
			rect.anchoredPosition = Vector2.MoveTowards(rect.anchoredPosition, targetPosition, Time.deltaTime * 4f * Vector3.Distance(Vector2.op_Implicit(rect.anchoredPosition), Vector2.op_Implicit(targetPosition)));
		}

		private void FlashImage()
		{
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			if (white)
			{
				white = false;
				((Graphic)targetImage).color = new Color(0f, 0f, 0f, 0f);
				if (!((Component)this).gameObject.activeSelf)
				{
					return;
				}
				aud.Play();
			}
			else
			{
				white = true;
				((Graphic)targetImage).color = Color.white;
			}
			if (((Component)this).gameObject.activeInHierarchy)
			{
				((MonoBehaviour)this).Invoke("FlashImage", 0.075f);
			}
		}
	}

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

		public static UnityAction <>9__36_5;

		public static Func<GameObject, Transform> <>9__37_1;

		public static Func<GameObject, OnLevelStart> <>9__37_2;

		public static Func<GameObject, bool> <>9__37_4;

		internal void <ConvertToAscendingFirstRoom>b__36_5()
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			MonoSingleton<StatsManager>.Instance.spawnPos = ((Component)MonoSingleton<NewMovement>.Instance).transform.position;
		}

		internal Transform <Spawn>b__37_1(GameObject go)
		{
			return go.transform;
		}

		internal OnLevelStart <Spawn>b__37_2(GameObject go)
		{
			return go.GetComponent<OnLevelStart>();
		}

		internal bool <Spawn>b__37_4(GameObject o)
		{
			return ((Object)o).name == "Canvas";
		}
	}

	[Tooltip("Player will be moved to this position if the room is not ascending variant. If null, default position is used")]
	public Transform playerSpawnPos;

	[Tooltip("If set to true, room will not be deleted. Else, it will be replaced in game")]
	public bool doNotReplace = false;

	[Header("Replace Settings")]
	[Tooltip("Enabling this field causes room to be spawned as the secret variant")]
	public bool secretRoom = false;

	[Tooltip("Enabling this field causes room to be spawned as the prime variant")]
	public bool primeRoom = false;

	[Tooltip("Enabling this field causes room to be spawned as the encore variant")]
	public bool encoreRoom = false;

	[HideInInspector]
	[Tooltip("Enabling this field causes the whole room to be converted into the ascending variant where the player is spawned at the bottom and ascends upwards instead of falling")]
	public bool convertToUpwardRoom = false;

	[HideInInspector]
	[Tooltip("This clip will be played when the trap door closes beneath the player for ascending rooms")]
	public AudioClip upwardRoomDoorCloseClip;

	[HideInInspector]
	[Tooltip("If bottom part of the ascending room collides with out of bounds triggers, this list can temporarely disable them while the player is ascending")]
	public List<GameObject> upwardRoomOutOfBoundsToDisable;

	[Header("Player Fields")]
	[Space(10f)]
	public CameraClearFlags cameraFillMode = (CameraClearFlags)2;

	public Color backgroundColor = Color.black;

	[Header("Level Fields")]
	[Space(10f)]
	[Tooltip("If set to true, level title will be displayed when the door is opened")]
	public bool displayLevelTitle = true;

	[Tooltip("If set to true, music will start when the door is opened")]
	public bool startMusic = true;

	[Header("Hellmap")]
	[Tooltip("Enable the layer and level map when the player spawn")]
	[Space(10f)]
	public bool enableHellMap = false;

	[Tooltip("Sound clip which is played for each beep while falling")]
	public AudioClip hellmapBeepClip;

	[Tooltip("Each layer has a layer name and number of levels. For limbo the header is LIMBO and levels are [1-1, 1-2, 1-3, 1-4]")]
	public List<LayerInfoRogue> layersAndLevels = new List<LayerInfoRogue>();

	[HideInInspector]
	public List<int> levelSizes = new List<int>();

	[HideInInspector]
	public List<string> layerNames = new List<string>();

	[HideInInspector]
	public List<string> levelNames = new List<string>();

	[Tooltip("Which layer the cursor starts from. First layer is 0 and at the top")]
	public int layerIndexToStartFrom;

	[Tooltip("Which level in the layer the cursor starts from. The first level is 0 and is just below the layer title (the uppermost level)")]
	public int levelIndexToStartFrom;

	[Tooltip("Which layer the cursor ends at. First layer is 0 and at the top")]
	public int layerIndexToEndAt;

	[Tooltip("Which level in the layer the cursor ends at. The first level is 0 and is just below the layer title (the uppermost level)")]
	public int levelIndexToEndAt;

	private bool spawned = false;

	public static float upDisablePos = 60f;

	public static float doorClosePos = 10f;

	public static float doorCloseSpeed = 10f;

	public static float actDelay = 0.5f;

	public static float ascendingPlayerSpawnPos = -55f;

	public void OnBeforeSerialize()
	{
		levelSizes.Clear();
		layerNames.Clear();
		levelNames.Clear();
		for (int i = 0; i < layersAndLevels.Count; i++)
		{
			layerNames.Add(layersAndLevels[i].layerName);
			levelSizes.Add(layersAndLevels[i].layerLevels.Length);
			levelNames.AddRange(layersAndLevels[i].layerLevels);
		}
	}

	public void Deserialize()
	{
		layersAndLevels.Clear();
		int num = 0;
		for (int i = 0; i < levelSizes.Count; i++)
		{
			LayerInfoRogue layerInfoRogue = new LayerInfoRogue();
			layerInfoRogue.layerName = layerNames[i];
			int num2 = levelSizes[i];
			layerInfoRogue.layerLevels = new string[num2];
			for (int j = 0; j < num2; j++)
			{
				layerInfoRogue.layerLevels[j] = levelNames[num++];
			}
			layersAndLevels.Add(layerInfoRogue);
		}
	}

	public void OnAfterDeserialize()
	{
	}

	private static Text MakeText(Transform parent)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = new GameObject();
		RectTransform val2 = val.AddComponent<RectTransform>();
		((Transform)val2).SetParent(parent);
		val.transform.localScale = Vector3.one;
		return val.AddComponent<Text>();
	}

	private static RectTransform MakeRect(Transform parent)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		GameObject val = new GameObject();
		RectTransform val2 = val.AddComponent<RectTransform>();
		((Transform)val2).SetParent(parent);
		return val2;
	}

	public static void ConvertToAscendingFirstRoom(GameObject firstRoom, AudioClip doorCloseAud, List<GameObject> toEnable, List<GameObject> toDisable, bool doNotReplace)
	{
		//IL_02be: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0379: Unknown result type (might be due to invalid IL or missing references)
		//IL_038f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0399: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_03bd: Expected O, but got Unknown
		//IL_03f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0402: Unknown result type (might be due to invalid IL or missing references)
		//IL_0423: Unknown result type (might be due to invalid IL or missing references)
		//IL_0473: Unknown result type (might be due to invalid IL or missing references)
		//IL_047d: Expected O, but got Unknown
		//IL_0484: Unknown result type (might be due to invalid IL or missing references)
		//IL_048e: Expected O, but got Unknown
		//IL_04a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ab: Expected O, but got Unknown
		//IL_04ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_04b3: Expected O, but got Unknown
		//IL_04e6: 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_0519: Unknown result type (might be due to invalid IL or missing references)
		//IL_0569: Unknown result type (might be due to invalid IL or missing references)
		//IL_0573: Expected O, but got Unknown
		//IL_057a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0584: Expected O, but got Unknown
		//IL_0597: Unknown result type (might be due to invalid IL or missing references)
		//IL_05a1: Expected O, but got Unknown
		//IL_05b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_05bf: Expected O, but got Unknown
		//IL_05d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_05dd: Expected O, but got Unknown
		//IL_05f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_0603: Expected O, but got Unknown
		//IL_060a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0614: Expected O, but got Unknown
		//IL_0627: Unknown result type (might be due to invalid IL or missing references)
		//IL_0631: Expected O, but got Unknown
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_011f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: Unknown result type (might be due to invalid IL or missing references)
		//IL_015d: Unknown result type (might be due to invalid IL or missing references)
		//IL_017e: Unknown result type (might be due to invalid IL or missing references)
		//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_020b: Unknown result type (might be due to invalid IL or missing references)
		//IL_021d: Unknown result type (might be due to invalid IL or missing references)
		//IL_026c: Unknown result type (might be due to invalid IL or missing references)
		//IL_028d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0652: Unknown result type (might be due to invalid IL or missing references)
		//IL_0657: Unknown result type (might be due to invalid IL or missing references)
		//IL_065d: Expected O, but got Unknown
		Transform val = firstRoom.transform.Find("Room");
		if (!doNotReplace)
		{
			Transform val2 = val.Find("Pit (3)");
			((Component)val2).transform.localPosition = new Vector3(0f, 2f, 41.72f);
			((Component)val2).transform.localRotation = Quaternion.Euler(0f, 0f, 180f);
			Object.Destroy((Object)(object)((Component)((Component)val).transform.Find("Room/Ceiling")).gameObject);
			Transform val3 = ((Component)val).transform.Find("Room/Floor");
			GameObject gameObject = ((Component)val3.GetChild(0)).gameObject;
			GameObject val4 = Object.Instantiate<GameObject>(gameObject, val3);
			val4.transform.localPosition = new Vector3(-15f, 9.7f, 20.28f);
			val4.transform.localRotation = Quaternion.identity;
			GameObject val5 = Object.Instantiate<GameObject>(gameObject, val3);
			val5.transform.localPosition = new Vector3(5f, 9.7f, 20.28f);
			val5.transform.localRotation = Quaternion.identity;
			GameObject val6 = Object.Instantiate<GameObject>(gameObject, val3);
			val6.transform.localPosition = new Vector3(-5f, 9.7f, 0.2f);
			val6.transform.localRotation = Quaternion.Euler(0f, -90f, 0f);
			GameObject val7 = Object.Instantiate<GameObject>(gameObject, val3);
			val7.transform.localPosition = new Vector3(5f, 9.7f, 10.28f);
			val7.transform.localRotation = Quaternion.identity;
			((Renderer)val7.GetComponent<MeshRenderer>()).materials = (Material[])(object)new Material[2]
			{
				UtilsRogue.metalDec20,
				UtilsRogue.metalDec20
			};
			GameObject val8 = Object.Instantiate<GameObject>(gameObject, val3);
			val8.transform.localPosition = new Vector3(-15f, 9.7f, 10.28f);
			val8.transform.localRotation = Quaternion.identity;
			((Renderer)val8.GetComponent<MeshRenderer>()).materials = (Material[])(object)new Material[2]
			{
				UtilsRogue.metalDec20,
				UtilsRogue.metalDec20
			};
			GameObject val9 = Object.Instantiate<GameObject>(gameObject, val3);
			val9.transform.localPosition = new Vector3(-5f, -0.3f, 20.28f);
			val9.transform.localRotation = Quaternion.Euler(0f, -90f, -180f);
		}
		Transform val10 = val.Find("Decorations");
		Transform child = val10.GetChild(12);
		child.localPosition = new Vector3(-5f, 2f, 52f);
		LocalMoveTowards floorMover = ((Component)child).gameObject.AddComponent<LocalMoveTowards>();
		floorMover.targetLocalPosition = new Vector3(-5f, 2f, 42f);
		floorMover.speed = doorCloseSpeed;
		AudioSource floorTileAud = ((Component)child).gameObject.AddComponent<AudioSource>();
		floorTileAud.playOnAwake = false;
		floorTileAud.loop = false;
		floorTileAud.clip = doorCloseAud;
		PlayerActivator act = firstRoom.GetComponentsInChildren<PlayerActivator>().First();
		((Component)act).gameObject.SetActive(false);
		NewMovement instance = MonoSingleton<NewMovement>.Instance;
		((Component)instance).transform.localPosition = new Vector3(((Component)instance).transform.localPosition.x, ascendingPlayerSpawnPos, ((Component)instance).transform.localPosition.z);
		PlayerForcedMovement focedMov = ((Component)instance).gameObject.AddComponent<PlayerForcedMovement>();
		GameObject val11 = new GameObject();
		val11.transform.SetParent(((Component)act).transform.parent);
		val11.transform.localPosition = new Vector3(0f, upDisablePos, 0f);
		val11.transform.localRotation = Quaternion.identity;
		val11.transform.localScale = new Vector3(80f, 0.2f, 80f);
		val11.layer = ((Component)act).gameObject.layer;
		BoxCollider val12 = val11.AddComponent<BoxCollider>();
		((Collider)val12).isTrigger = true;
		ObjectActivator val13 = val11.AddComponent<ObjectActivator>();
		val13.dontActivateOnEnable = true;
		val13.oneTime = true;
		val13.events = new UltrakillEvent();
		val13.events.onActivate = new UnityEvent();
		val13.events.onActivate.AddListener((UnityAction)delegate
		{
			focedMov.DestroyComp();
		});
		GameObject val14 = new GameObject();
		val14.transform.SetParent(((Component)act).transform.parent);
		val14.transform.localPosition = new Vector3(0f, doorClosePos, 0f);
		val14.transform.localRotation = Quaternion.identity;
		val14.transform.localScale = new Vector3(80f, 0.2f, 80f);
		val14.layer = ((Component)act).gameObject.layer;
		BoxCollider val15 = val14.AddComponent<BoxCollider>();
		((Collider)val15).isTrigger = true;
		ObjectActivator val16 = val14.AddComponent<ObjectActivator>();
		val16.dontActivateOnEnable = true;
		val16.oneTime = true;
		val16.events = new UltrakillEvent();
		val16.events.onActivate = new UnityEvent();
		val16.events.onActivate.AddListener((UnityAction)delegate
		{
			floorMover.Activate();
		});
		val16.events.onActivate.AddListener((UnityAction)delegate
		{
			floorTileAud.Play();
		});
		val16.events.onActivate.AddListener((UnityAction)delegate
		{
			foreach (GameObject item in toEnable)
			{
				item.SetActive(true);
			}
			foreach (GameObject item2 in toDisable)
			{
				item2.SetActive(false);
			}
		});
		ObjectActivator val17 = val14.AddComponent<ObjectActivator>();
		val17.dontActivateOnEnable = true;
		val17.oneTime = true;
		val17.events = new UltrakillEvent();
		val17.events.onActivate = new UnityEvent();
		val17.events.onActivate.AddListener((UnityAction)delegate
		{
			((Component)act).gameObject.SetActive(true);
		});
		UnityEvent onActivate = val17.events.onActivate;
		object obj = <>c.<>9__36_5;
		if (obj == null)
		{
			UnityAction val18 = delegate
			{
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				MonoSingleton<StatsManager>.Instance.spawnPos = ((Component)MonoSingleton<NewMovement>.Instance).transform.position;
			};
			<>c.<>9__36_5 = val18;
			obj = (object)val18;
		}
		onActivate.AddListener((UnityAction)obj);
		val17.delay = actDelay;
	}

	public void Spawn()
	{
		//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_023b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0240: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Unknown result type (might be due to invalid IL or missing references)
		//IL_0125: Unknown result type (might be due to invalid IL or missing references)
		//IL_0318: Unknown result type (might be due to invalid IL or missing references)
		//IL_032f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0353: Unknown result type (might be due to invalid IL or missing references)
		//IL_0358: Unknown result type (might be due to invalid IL or missing references)
		//IL_035c: Unknown result type (might be due to invalid IL or missing references)
		//IL_036b: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_041a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0428: Unknown result type (might be due to invalid IL or missing references)
		//IL_0486: Unknown result type (might be due to invalid IL or missing references)
		//IL_048b: Unknown result type (might be due to invalid IL or missing references)
		//IL_050b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0510: Unknown result type (might be due to invalid IL or missing references)
		//IL_0511: Unknown result type (might be due to invalid IL or missing references)
		//IL_0519: Unknown result type (might be due to invalid IL or missing references)
		//IL_052d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0544: Unknown result type (might be due to invalid IL or missing references)
		//IL_0551: Unknown result type (might be due to invalid IL or missing references)
		//IL_055e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0568: Unknown result type (might be due to invalid IL or missing references)
		//IL_0598: Unknown result type (might be due to invalid IL or missing references)
		//IL_05a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_05bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_05c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_05d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_05e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0630: Unknown result type (might be due to invalid IL or missing references)
		//IL_0635: Unknown result type (might be due to invalid IL or missing references)
		//IL_0636: Unknown result type (might be due to invalid IL or missing references)
		//IL_063e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0652: Unknown result type (might be due to invalid IL or missing references)
		//IL_0669: Unknown result type (might be due to invalid IL or missing references)
		//IL_0676: Unknown result type (might be due to invalid IL or missing references)
		//IL_069a: Unknown result type (might be due to invalid IL or missing references)
		//IL_06e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_06ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_070c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0719: Unknown result type (might be due to invalid IL or missing references)
		//IL_0730: Unknown result type (might be due to invalid IL or missing references)
		//IL_073d: Unknown result type (might be due to invalid IL or missing references)
		//IL_074a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0df9: Unknown result type (might be due to invalid IL or missing references)
		//IL_0dfe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0e15: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b37: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b3c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b45: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b75: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b7a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b83: Unknown result type (might be due to invalid IL or missing references)
		//IL_0bac: Unknown result type (might be due to invalid IL or missing references)
		//IL_0bb1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0bb2: Unknown result type (might be due to invalid IL or missing references)
		//IL_0bba: Unknown result type (might be due to invalid IL or missing references)
		//IL_0bce: Unknown result type (might be due to invalid IL or missing references)
		//IL_0be5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0c01: Unknown result type (might be due to invalid IL or missing references)
		//IL_0c0e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0c1b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0c89: Unknown result type (might be due to invalid IL or missing references)
		//IL_0c8b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0ccb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0cd5: Expected O, but got Unknown
		//IL_0786: Unknown result type (might be due to invalid IL or missing references)
		//IL_078b: Unknown result type (might be due to invalid IL or missing references)
		//IL_078c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0794: Unknown result type (might be due to invalid IL or missing references)
		//IL_07a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_07b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_07c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_07e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0811: Unknown result type (might be due to invalid IL or missing references)
		//IL_0816: Unknown result type (might be due to invalid IL or missing references)
		//IL_0817: Unknown result type (might be due to invalid IL or missing references)
		//IL_081f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0833: Unknown result type (might be due to invalid IL or missing references)
		//IL_0840: Unknown result type (might be due to invalid IL or missing references)
		//IL_085c: Unknown result type (might be due to invalid IL or missing references)
		//IL_08d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_08ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_08fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0911: Unknown result type (might be due to invalid IL or missing references)
		//IL_091e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0935: Unknown result type (might be due to invalid IL or missing references)
		//IL_0942: Unknown result type (might be due to invalid IL or missing references)
		//IL_098c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0991: Unknown result type (might be due to invalid IL or missing references)
		//IL_0992: Unknown result type (might be due to invalid IL or missing references)
		//IL_099a: Unknown result type (might be due to invalid IL or missing references)
		//IL_09ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_09c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_09f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_09fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a35: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a3a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a3b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a43: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a57: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a6e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a89: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a96: Unknown result type (might be due to invalid IL or missing references)
		//IL_1025: Unknown result type (might be due to invalid IL or missing references)
		//IL_112a: Unknown result type (might be due to invalid IL or missing references)
		if (spawned)
		{
			return;
		}
		GameObject onLevelStartObj = null;
		bool flag = (Object)(object)MonoSingleton<OnLevelStart>.Instance != (Object)null;
		if (!flag)
		{
			Transform val = ((Component)this).gameObject.transform.Find("OnLevelStart");
			if ((Object)(object)val != (Object)null)
			{
				flag = (Object)(object)((Component)val).GetComponent<OnLevelStart>() != (Object)null;
				onLevelStartObj = ((Component)val).gameObject;
			}
		}
		else
		{
			onLevelStartObj = ((Component)MonoSingleton<OnLevelStart>.Instance).gameObject;
		}
		GameObject val2 = ((Component)this).gameObject;
		GameObject val3 = Addressables.LoadAssetAsync<GameObject>((object)(secretRoom ? "FirstRoom Secret" : (primeRoom ? "FirstRoom Prime" : (encoreRoom ? "Assets/Prefabs/Levels/Special Rooms/FirstRoom Encore.prefab" : "FirstRoom")))).WaitForCompletion();
		Scene activeScene;
		if (!doNotReplace)
		{
			val2 = Object.Instantiate<GameObject>(val3, ((Component)this).transform.parent);
			if (flag)
			{
				Transform? obj = val2.transform.Find("OnLevelStart");
				if (obj == null)
				{
					activeScene = SceneManager.GetActiveScene();
					obj = (from go in ((Scene)(ref activeScene)).GetRootGameObjects()
						where ((Object)go).name == "OnLevelStart" && (Object)(object)go.transform != (Object)(object)onLevelStartObj
						select go.transform).FirstOrDefault();
				}
				Transform val4 = obj;
				if ((Object)(object)val4 != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)val4).gameObject);
				}
				if ((Object)(object)onLevelStartObj != (Object)null)
				{
					onLevelStartObj.transform.SetParent(val2.transform);
				}
			}
		}
		else
		{
			GameObject val5 = Object.Instantiate<GameObject>(val3, ((Component)this).transform.position, ((Component)this).transform.rotation, ((Component)this).transform.parent);
			Object.Destroy((Object)(object)((Component)val5.transform.Find("Room")).gameObject);
			if (flag)
			{
				Transform val6 = val5.transform.Find("OnLevelStart");
				if ((Object)(object)val6 != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)val6).gameObject);
				}
				else
				{
					activeScene = SceneManager.GetActiveScene();
					OnLevelStart val7 = (from go in ((Scene)(ref activeScene)).GetRootGameObjects()
						select go.GetComponent<OnLevelStart>() into ls
						where (Object)(object)ls != (Object)null && (Object)(object)((Component)ls).gameObject != (Object)(object)onLevelStartObj
						select ls).FirstOrDefault();
					if ((Object)(object)val7 != (Object)null)
					{
						Object.Destroy((Object)(object)((Component)val7).gameObject);
					}
				}
			}
		}
		MeshCollider[] componentsInChildren = val2.GetComponentsInChildren<MeshCollider>();
		MeshFilter val9 = default(MeshFilter);
		foreach (MeshCollider val8 in componentsInChildren)
		{
			if (((Component)val8).gameObject.TryGetComponent<MeshFilter>(ref val9))
			{
				val9.mesh = val8.sharedMesh;
			}
		}
		Transform transform = ((Component)MonoSingleton<NewMovement>.Instance).transform;
		((Component)transform).transform.parent = val2.transform;
		val2.transform.position = ((Component)this).transform.position;
		val2.transform.rotation = ((Component)this).transform.rotation;
		((Component)transform).transform.parent = null;
		Quaternion rotation = ((Component)this).transform.rotation;
		UtilsRogue.SetPlayerWorldRotation(Quaternion.Euler(0f, ((Quaternion)(ref rotation)).eulerAngles.y, 0f));
		if ((Object)(object)playerSpawnPos != (Object)null)
		{
			((Component)transform).transform.parent = ((Component)playerSpawnPos).transform.parent;
			((Component)transform).transform.localPosition = playerSpawnPos.localPosition;
			UtilsRogue.SetPlayerWorldRotation(playerSpawnPos.rotation);
			((Component)transform).transform.SetParent((Transform)null);
		}
		MonoSingleton<StatsManager>.Instance.spawnPos = ((Component)transform).transform.position;
		try
		{
			Transform val10 = val2.transform.Find("Room/FinalDoor");
			FinalDoor component = ((Component)val10).GetComponent<FinalDoor>();
			Camera main = Camera.main;
			main.backgroundColor = backgroundColor;
			main.clearFlags = cameraFillMode;
			FinalDoorOpener component2 = ((Component)val2.transform.Find("Room/FinalDoor/FinalDoorOpener")).GetComponent<FinalDoorOpener>();
			component2.startMusic = startMusic;
			FinalDoor component3 = ((Component)val2.transform.Find("Room/FinalDoor")).GetComponent<FinalDoor>();
			Transform obj2 = ((Component)MonoSingleton<NewMovement>.Instance).transform.Find("Canvas");
			if (obj2 == null)
			{
				activeScene = SceneManager.GetActiveScene();
				obj2 = (from o in ((Scene)(ref activeScene)).GetRootGameObjects()
					where ((Object)o).name == "Canvas"
					select o).First().transform;
			}
			Transform val11 = obj2;
			GameObject val12 = null;
			if (enableHellMap)
			{
				Deserialize();
				RectTransform val13 = MakeRect(val11);
				((Object)val13).name = "Hellmap";
				val12 = ((Component)val13).gameObject;
				Vector2 anchorMin = (val13.anchorMax = new Vector2(0.5f, 0.5f));
				val13.anchorMin = anchorMin;
				val13.pivot = new Vector2(0.5f, 0.5f);
				val13.sizeDelta = new Vector2(250f, 650f);
				val13.anchoredPosition = Vector2.zero;
				((Transform)val13).localScale = Vector3.one * 0.82244f;
				((Transform)val13).SetAsFirstSibling();
				RectTransform val15 = MakeRect(((Component)val13).transform);
				((Object)val15).name = "Hellmap Container";
				val15.anchorMin = Vector2.zero;
				val15.anchorMax = Vector2.one;
				val15.pivot = new Vector2(0.5f, 0.5f);
				val15.sizeDelta = Vector2.zero;
				val15.anchoredPosition = Vector2.zero;
				((Transform)val15).localScale = Vector3.one;
				float num2 = 0f;
				Stack<RectTransform> stack = new Stack<RectTransform>();
				foreach (LayerInfoRogue layersAndLevel in layersAndLevels)
				{
					RectTransform val16 = MakeRect((Transform)(object)val15);
					anchorMin = (val16.anchorMax = new Vector2(0f, 1f));
					val16.anchorMin = anchorMin;
					val16.sizeDelta = new Vector2(250f, 50f);
					val16.pivot = new Vector2(0f, 1f);
					((Transform)val16).localScale = Vector3.one;
					val16.anchoredPosition = new Vector2(0f, (num2 == 0f) ? (-3.051758E-05f) : num2);
					num2 -= 50f;
					Text val18 = MakeText((Transform)(object)val16);
					val18.text = layersAndLevel.layerName;
					val18.fontSize = 36;
					val18.font = UtilsRogue.gameFont;
					val18.alignment = (TextAnchor)3;
					((Graphic)val18).color = Color.white;
					RectTransform component4 = ((Component)val18).GetComponent<RectTransform>();
					component4.anchorMin = Vector2.zero;
					component4.anchorMax = Vector2.one;
					component4.sizeDelta = Vector2.zero;
					component4.pivot = new Vector2(0.5f, 0.5f);
					((Transform)component4).localScale = Vector3.one;
					component4.anchoredPosition = Vector2.zero;
					string[] layerLevels = layersAndLevel.layerLevels;
					foreach (string text in layerLevels)
					{
						RectTransform val19 = MakeRect((Transform)(object)val15);
						anchorMin = (val19.anchorMax = new Vector2(0f, 1f));
						val19.anchorMin = anchorMin;
						val19.pivot = new Vector2(0f, 1f);
						((Transform)val19).localScale = Vector3.one;
						val19.anchoredPosition = new Vector2(60f, num2);
						val19.sizeDelta = new Vector2(125f, 45f);
						num2 -= 50f;
						RectTransform val21 = MakeRect(((Component)val19).transform);
						anchorMin = (val21.anchorMax = new Vector2(0.5f, 0.5f));
						val21.anchorMin = anchorMin;
						val21.sizeDelta = new Vector2(25f, 9f);
						val21.anchoredPosition = Vector2.zero;
						((Transform)val21).localScale = new Vector3(5f, 5f, 5f);
						Image val23 = ((Component)val21).gameObject.AddComponent<Image>();
						val23.type = (Type)1;
						val23.sprite = UtilsRogue.levelPanel;
						val23.pixelsPerUnitMultiplier = 1f;
						Text val24 = MakeText(((Component)val19).transform);
						val24.text = text;
						val24.font = UtilsRogue.gameFont;
						val24.fontSize = 32;
						val24.alignment = (TextAnchor)4;
						((Graphic)val24).color = Color.black;
						RectTransform component5 = ((Component)val24).gameObject.GetComponent<RectTransform>();
						component5.anchorMin = Vector2.zero;
						component5.anchorMax = Vector2.one;
						component5.pivot = new Vector2(0.5f, 0.5f);
						component5.sizeDelta = Vector2.zero;
						component5.anchoredPosition = new Vector2(0f, 0f);
						((Transform)component5).localScale = Vector3.one;
					}
					if (layersAndLevel.layerLevels.Length != 0)
					{
						RectTransform val25 = MakeRect((Transform)(object)val15);
						anchorMin = (val25.anchorMax = new Vector2(0.5f, 1f));
						val25.anchorMin = anchorMin;
						val25.pivot = new Vector2(0.5f, 0f);
						val25.anchoredPosition = new Vector2(-95f, num2 + 25f);
						val25.sizeDelta = new Vector2(3f, (float)layersAndLevel.layerLevels.Length * 50f - 27.5f);
						((Transform)val25).localScale = Vector3.one;
						((Component)val25).gameObject.AddComponent<Image>();
						for (int num4 = 0; num4 < layersAndLevel.layerLevels.Length; num4++)
						{
							RectTransform val27 = MakeRect((Transform)(object)val25);
							anchorMin = (val27.anchorMax = new Vector2(0.5f, 0f));
							val27.anchorMin = anchorMin;
							val27.pivot = new Vector2(0f, 0.5f);
							val27.sizeDelta = new Vector2(20f, 3f);
							val27.anchoredPosition = new Vector2(-1.5f, (float)num4 * 50f);
							((Transform)val27).localScale = Vector3.one;
							((Component)val27).gameObject.AddComponent<Image>();
						}
						stack.Push(val25);
					}
				}
				while (stack.Count != 0)
				{
					RectTransform val29 = stack.Pop();
					((Transform)val29).SetAsLastSibling();
				}
				Vector2 anchoredPosition = ((Component)((Transform)val15).GetChild(GetChildIndexFromLayerAndLevel(layerIndexToStartFrom, levelIndexToStartFrom))).GetComponent<RectTransform>().anchoredPosition;
				((Vector2)(ref anchoredPosition))..ctor(210f, anchoredPosition.y - 22.5f);
				Vector2 anchoredPosition2 = ((Component)((Transform)val15).GetChild(GetChildIndexFromLayerAndLevel(layerIndexToEndAt, levelIndexToEndAt))).GetComponent<RectTransform>().anchoredPosition;
				((Vector2)(ref anchoredPosition2))..ctor(210f, anchoredPosition2.y - 22.5f);
				RectTransform val30 = MakeRect((Transform)(object)val13);
				anchorMin = (val30.anchorMax = new Vector2(0f, 1f));
				val30.anchorMin = anchorMin;
				val30.pivot = new Vector2(0.5f, 0.5f);
				val30.sizeDelta = new Vector2(35f, 35f);
				((Transform)val30).rotation = Quaternion.Euler(0f, 0f, 90f);
				((Transform)val30).localScale = Vector3.one;
				val30.anchoredPosition = anchoredPosition;
				AudioSource val32 = ((Component)val30).gameObject.AddComponent<AudioSource>();
				val32.playOnAwake = false;
				val32.loop = false;
				val32.clip = hellmapBeepClip;
				val32.volume = 0.1f;
				Image val33 = ((Component)val30).gameObject.AddComponent<Image>();
				val33.sprite = UtilsRogue.hellmapArrow;
				CustomHellmapCursor customHellmapCursor = ((Component)val30).gameObject.AddComponent<CustomHellmapCursor>();
				customHellmapCursor.targetPosition = anchoredPosition2;
				customHellmapCursor.aud = val32;
				customHellmapCursor.targetImage = val33;
				ObjectActivator val34 = ((Component)UnityUtilsRogue.GetComponentInChildrenRecursive<PlayerActivator>(val2.transform)).gameObject.AddComponent<ObjectActivator>();
				val34.dontActivateOnEnable = true;
				val34.oneTime = true;
				val34.events = new UltrakillEvent();
				val34.events.toDisActivateObjects = (GameObject[])(object)new GameObject[1] { ((Component)val13).gameObject };
			}
			if (convertToUpwardRoom)
			{
				foreach (GameObject item in upwardRoomOutOfBoundsToDisable)
				{
					item.SetActive(false);
				}
				List<GameObject> list = new List<GameObject>();
				if ((Object)(object)val12 != (Object)null)
				{
					list.Add(val12);
				}
				List<GameObject> list2 = new List<GameObject>();
				list2.AddRange(upwardRoomOutOfBoundsToDisable);
				ConvertToAscendingFirstRoom(val2, upwardRoomDoorCloseClip, list2, list, doNotReplace);
			}
			if (!encoreRoom)
			{
				return;
			}
			FinalRank instance = MonoSingleton<FinalRank>.Instance;
			if (!((Object)(object)instance != (Object)null))
			{
				return;
			}
			Transform val35 = ((Component)instance).transform.Find("Extra Info");
			RectTransform val36 = default(RectTransform);
			if ((Object)(object)val35 != (Object)null && ((Component)val35).gameObject.TryGetComponent<RectTransform>(ref val36))
			{
				val36.anchoredPosition = Vector2.op_Implicit(new Vector3(0f, 200f, 0f));
				val36.sizeDelta = new Vector2(480f, 180f);
			}
			Transform val37 = ((Component)instance).transform.Find("Secrets -  Title");
			Transform val38 = ((Component)instance).transform.Find("Secrets - Info");
			Transform val39 = (((Object)(object)val38 == (Object)null) ? null : ((Component)val38).transform.Find("Text (1)"));
			Transform val40 = ((Component)instance).transform.Find("Challenge - Title");
			Transform val41 = ((Component)instance).transform.Find("Challenge");
			List<GameObject> list3 = instance.toAppear.ToList();
			if ((Object)(object)val37 != (Object)null && !list3.Contains(((Component)val37).gameObject))
			{
				list3.Insert(list3.Count - 1, ((Component)val37).gameObject);
			}
			if ((Object)(object)val38 != (Object)null && !list3.Contains(((Component)val38).gameObject))
			{
				list3.Insert(list3.Count - 1, ((Component)val38).gameObject);
			}
			if ((Object)(object)val39 != (Object)null && !list3.Contains(((Component)val39).gameObject))
			{
				list3.Insert(list3.Count - 1, ((Component)val39).gameObject);
			}
			if ((Object)(object)val40 != (Object)null && !list3.Contains(((Component)val40).gameObject))
			{
				((Component)val40).gameObject.SetActive(true);
				list3.Insert(list3.Count - 1, ((Component)val40).gameObject);
			}
			if ((Object)(object)val41 != (Object)null && !list3.Contains(((Component)val41).gameObject))
			{
				list3.Insert(list3.Count - 1, ((Component)val41).gameObject);
			}
			instance.toAppear = list3.ToArray();
			Transform val42 = ((Component)val11).transform.Find("Level Stats Controller");
			if (!((Object)(object)val42 != (Object)null))
			{
				return;
			}
			LevelStats componentInChildren = ((Component)val42).GetComponentInChildren<LevelStats>(true);
			((Component)componentInChildren).GetComponent<RectTransform>().sizeDelta = new Vector2(285f, 315f);
			Transform obj3 = ((Component)componentInChildren).transform.Find("Challenge Title/Challenge");
			componentInChildren.challenge = ((obj3 != null) ? ((Component)obj3).GetComponent<TMP_Text>() : null);
			Transform obj4 = ((Component)componentInChildren).transform.Find("Challenge Title");
			if (obj4 != null)
			{
				((Component)obj4).gameObject.SetActive(true);
			}
			Transform obj5 = ((Component)componentInChildren).transform.Find("Secrets Title");
			if (obj5 != null)
			{
				((Component)obj5).gameObject.SetActive(true);
			}
			List<Image> list4 = new List<Image>();
			for (int num5 = 5; num5 >= 1; num5--)
			{
				Transform val43 = ((Component)componentInChildren).transform.Find($"Secrets Title/Secret {num5}");
				if ((Object)(object)val43 != (Object)null)
				{
					list4.Add(((Component)val43).GetComponent<Image>());
				}
			}
			componentInChildren.secrets = list4.ToArray();
			Transform val44 = ((Component)componentInChildren).transform.Find("Assists Title");
			((Component)val44).GetComponent<RectTransform>().anchoredPosition = new Vector2(10f, -275f);
		}
		catch (Exception ex)
		{
			throw ex;
		}
		finally
		{
			spawned = true;
		}
		int GetChildIndexFromLayerAndLevel(int layer, int level)
		{
			int num6 = 0;
			for (int i = 0; i < layer; i++)
			{
				num6 += 1 + levelSizes[i];
			}
			return num6 + 1 + level;
		}
	}

	public void Awake()
	{
		Spawn();
	}

	public void Start()
	{
		if ((Object)(object)MonoSingleton<OnLevelStart>.Instance != (Object)null)
		{
			MonoSingleton<OnLevelStart>.Instance.levelNameOnStart = displayLevelTitle;
		}
		else
		{
			Debug.LogWarning((object)"Could not find OnLevelStart");
		}
		if (!doNotReplace)
		{
			Object.Destroy((Object)(object)((Component)this).gameObject);
		}
	}
}
public class FloorTheme : MonoBehaviour
{
	[Header("Properties")]
	public int StartFloor;

	public string Name;

	[Header("Room Prefabs")]
	[Tooltip("Normal combat room prefabs — one is chosen at random per room.")]
	public List<Room> roomPrefabs = new List<Room>();

	[Tooltip("Optional dedicated prefab for each special room type.\nFalls back to a random roomPrefab when left empty.")]
	public Room treasureRoomPrefab;

	public Room shopRoomPrefab;

	public Room gamblingRoomPrefab;

	public Room bossRoomPrefab;

	public Room planetariumPrefab;

	public Room startRoomPrefab;

	[Tooltip("Other special rooms")]
	public List<Room> specialRoomPrefabs = new List<Room>();

	[Tooltip("SECRET ROOOMMMS")]
	public List<Room> SecretRoomPrefabs = new List<Room>();

	[Tooltip("Large room prefabs (RoomSizeWidth > 1 or RoomSizeHeight > 1). These are never instantiated directly — they are used as data sources to spawn sub-room GameObjects that each occupy one grid cell.")]
	public List<Room> largeRoomPrefabs = new List<Room>();

	public List<AudioClip> CalmMusic = new List<AudioClip>();

	public List<AudioClip> UnCalmMusic = new List<AudioClip>();

	[Header("Room Size")]
	public float roomWidth = 60f;

	public float roomHeight = 30f;
}
public class Gambler : MonoBehaviour
{
	private const float EXPLOSION_BASE_CHANCE = 0.02f;

	private const float EXPLOSION_CHANCE_RAMP = 0.02f;

	public GameObject ExplosionWarningThing;

	public ShopZone zone;

	private int useCount = 0;

	private bool exploded = false;

	private Coroutine activeRoutine = null;

	private Transform itemPlacementThing;

	public GameObject Slot1;

	public GameObject Slot2;

	public GameObject Slot3;

	public Texture2D coinText;

	public Texture2D keyText;

	private List<GameObject> slots = new List<GameObject>();

	private const float ITEM_CHANCE = 0.35f;

	private const float COIN_CHANCE = 0.2f;

	private const float KEY_CHANCE = 0.05f;

	private Texture skullText;

	private List<Texture2D> texts = new List<Texture2D>();

	private float Threshold = 240f;

	public void Gamble()
	{
		if (exploded || activeRoutine != null)
		{
			return;
		}
		RogueDifficultyManager instance = RogueDifficultyManager.Instance;
		if ((Object)(object)instance == (Object)null)
		{
			return;
		}
		if (instance.Gold <= 0)
		{
			HudMessageReceiver instance2 = MonoSingleton<HudMessageReceiver>.Instance;
			if (instance2 != null)
			{
				instance2.SendHudMessage("No gold to gamble!", "", "", 0, false, false, true);
			}
		}
		else
		{
			instance.Gold--;
			Spin();
		}
	}

	private void Awake()
	{
		//IL_0018: 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_016c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0176: Expected O, but got Unknown
		if ((Object)(object)itemPlacementThing == (Object)null)
		{
			itemPlacementThing = new GameObject("ItemPar").transform;
			((Component)itemPlacementThing).transform.parent = ((Component)this).transform.parent;
			itemPlacementThing.position = ((Component)this).transform.position;
		}
		if ((Object)(object)Slot1 == (Object)null)
		{
			Slot1 = GetSlot("Slot (1)");
		}
		if ((Object)(object)Slot2 == (Object)null)
		{
			Slot2 = GetSlot("Slot (2)");
		}
		if ((Object)(object)Slot3 == (Object)null)
		{
			Slot3 = GetSlot("Slot (3)");
		}
		slots.Add(Slot1);
		slots.Add(Slot2);
		slots.Add(Slot3);
		foreach (BaseItem possibleItem in Plugin.possibleItems)
		{
			texts.Add(possibleItem.ItemTexture);
		}
		skullText = ((Graphic)((Component)Slot1.transform.Find("Slots")).GetComponentInChildren<RawImage>()).mainTexture;
		texts.Add((Texture2D)skullText);
		texts.Add(coinText);
		texts.Add(keyText);
		foreach (GameObject slot in slots)
		{
			Transform parent = slot.transform.Find("Slots");
			AssignImage(2, parent, texts[Random.Range(0, texts.Count)]);
			AssignImage(4, parent, texts[Random.Range(0, texts.Count)]);
			AssignImage(3, parent, texts[Random.Range(0, texts.Count)]);
		}
	}

	private GameObject GetSlot(string name)
	{
		return ((Component)((Component)this).transform.Find("Canvas/Background/Text Inset/" + name)).gameObject;
	}

	private void Spin()
	{
		activeRoutine = ((MonoBehaviour)this).StartCoroutine(SpinRoutine());
	}

	private void AssignImage(int num, Transform parent, Texture2D text)
	{
		Transform val = parent.Find($"RawImage ({num})");
		Transform val2 = parent.Find($"RawImage ({num + 3})");
		((Component)val).GetComponent<RawImage>().texture = (Texture)(object)text;
		((Component)val2).GetComponent<RawImage>().texture = (Texture)(object)text;
	}

	private IEnumerator SpinRoutine()
	{
		BaseItem item = null;
		bool willExplode = false;
		bool winCoins = false;
		bool winKeys = false;
		useCount++;
		float explosionChance = 0.02f + 0.02f * (float)(useCount - 1);
		float explosionRoll = Plugin.getChanceVal(RogueDifficultyManager.GambleItemRNG, luckaffected: false);
		int luck = Plugin.luck;
		if (luck >= 0)
		{
			for (int i = 0; i < luck; i++)
			{
				float candidate = (float)RogueDifficultyManager.GambleItemRNG.NextDouble();
				if (candidate > explosionRoll)
				{
					explosionRoll = candidate;
				}
			}
		}
		else
		{
			for (int j = 0; j < -luck; j++)
			{
				float candidate2 = (float)RogueDifficultyManager.GambleItemRNG.NextDouble();
				if (candidate2 < explosionRoll)
				{
					explosionRoll = candidate2;
				}
			}
		}
		if (explosionRoll <= explosionChance)
		{
			willExplode = true;
		}
		else
		{
			float rewardRoll = Plugin.getChanceVal();
			if (rewardRoll <= 0.35f)
			{
				item = Plugin.GiveRandomItem(RogueDifficultyManager.GambleItemRNG);
			}
			else if (rewardRoll <= 0.55f)
			{
				winCoins = true;
			}
			else if (rewardRoll <= 0.6f)
			{
				winKeys = true;
			}
		}
		foreach (GameObject s in slots)
		{
			Transform ss = s.transform.Find("Slots");
			AssignImage(2, ss, texts[Random.Range(0, texts.Count)]);
			AssignImage(4, ss, texts[Random.Range(0, texts.Count)]);
			if (willExplode)
			{
				AssignImage(3, ss, (Texture2D)skullText);
			}
			else if (item != null)
			{
				AssignImage(3, ss, item.ItemTexture);
			}
			else if (winCoins)
			{
				AssignImage(3, ss, coinText);
			}
			else if (winKeys)
			{
				AssignImage(3, ss, keyText);
			}
			else
			{
				AssignImage(3, ss, texts[Random.Range(0, texts.Count)]);
			}
		}
		float snapTime = 0.35f;
		float duration = 1f;
		float t = 0f;
		Dictionary<GameObject, float> slotSpeeds = new Dictionary<GameObject, float>();
		foreach (GameObject slot in slots)
		{
			slotSpeeds[slot] = Random.Range(0.7f, 1.3f);
		}
		while (t <= duration)
		{
			t += Time.deltaTime;
			float progress = t / duration;
			float baseSpeed = Mathf.Lerp(10f, 0f, progress);
			foreach (GameObject slot2 in slots)
			{
				Transform s2 = slot2.transform.Find("Slots");
				float speed = baseSpeed * slotSpeeds[slot2];
				float maxStep = 74f;
				float step = Mathf.Min(speed * Time.deltaTime, maxStep);
				s2.position -= Vector3.up * step;
				if (s2.localPosition.y <= 0f - Threshold)
				{
					float offset = s2.localPosition.y + Threshold;
					s2.localPosition = new Vector3(s2.localPosition.x, offset, s2.localPosition.z);
				}
			}
			yield return null;
		}
		t = 0f;
		while (t <= 1f)
		{
			t += Time.deltaTime / snapTime;
			foreach (GameObject slot3 in slots)
			{
				Transform s3 = slot3.transform.Find("Slots");
				float position = Mathf.Lerp(s3.localPosition.y, 0f, t);
				s3.localPosition = new Vector3(s3.localPosition.x, position, s3.localPosition.z);
			}
			yield return null;
		}
		foreach (GameObject slot4 in slots)
		{
			Transform s4 = slot4.transform.Find("Slots");
			s4.localPosition = new Vector3(s4.localPosition.x, 0f, s4.localPosition.z);
		}
		if (willExplode)
		{
			Explode();
		}
		else if (item != null)
		{
			ItemPickup.CreatePickup(item, itemPlacementThing, 8f);
			MonoSingleton<HudMessageReceiver>.Instance.SendHudMessage("You won an item!", "", "", 0, false, false, true);
		}
		else if (winCoins)
		{
			RogueDifficultyManager.Instance.Gold++;
			MonoSingleton<HudMessageReceiver>.Instance.SendHudMessage("You won a coin!", "", "", 0, false, false, true);
		}
		else if (winKeys)
		{
			RogueDifficultyManager.Instance.Keys++;
			MonoSingleton<HudMessageReceiver>.Instance.SendHudMessage("You won a key!", "", "", 0, false, false, true);
		}
		else
		{
			MonoSingleton<HudMessageReceiver>.Instance.SendHudMessage("You lost... try again?", "", "", 0, false, false, true);
		}
		activeRoutine = null;
	}

	private void Explode()
	{
		exploded = true;
		((MonoBehaviour)this).StartCoroutine(explosionNumerator());
	}

	private IEnumerator explosionNumerator()
	{
		yield return (object)new WaitForSeconds(1.5f);
		GameObject explosionPrefab = MonoSingleton<DefaultReferenceManager>.Instance.explosion;
		if ((Object)(object)explosionPrefab != (Object)null)
		{
			Object.Instantiate<GameObject>(explosionPrefab, ((Component)this).transform.position, Quaternion.identity);
			zone.ForceOff();
			MonoSingleton<AudioMixerController>.Instance.SetMusicVolume(zone.originalMusicVolume);
		}
		Object.Destroy((Object)(object)((Component)this).gameObject);
	}
}
public class GoldPickup : MonoBehaviour
{
	private bool pickedUp = false;

	private void Update()
	{
		//IL_000b: 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)
		if (Vector3.Distance(((Component)MonoSingleton<NewMovement>.Instance).transform.position, ((Component)this).transform.position) <= 2f && !pickedUp)
		{
			pickedUp = true;
			RogueDifficultyManager.Instance.Gold++;
			Object.Destroy((Object)(object)((Component)this).gameObject);
		}
	}

	public static void CreatePickup(Vector3 position)
	{
		//IL_0022: 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_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = GameObject.CreatePrimitive((PrimitiveType)0);
		val.GetComponent<Collider>().enabled = false;
		val.AddComponent<GoldPickup>();
		val.transform.position = position + Vector3.up * 2f;
	}
}
public class ItemPedestal : MonoBehaviour
{
	public UltrakillEvent onPickup;

	public float offset = 3f;

	public bool forceItem;

	public bool forceWeapon;

	public DroptableType tableType;

	private BaseItem chosenItem;

	private void Start()
	{
		if (Plugin.SelectedChar.GetType() == typeof(Filth))
		{
			forceItem = true;
		}
		if (forceItem)
		{
			SpawnItem();
		}
		else if (forceWeapon)
		{
			SpawnWeapon();
		}
		else if ((float)RogueDifficultyManager.ItemRNG.NextDouble() <= 0.5f)
		{
			SpawnItem();
		}
		else
		{
			SpawnWeapon();
		}
	}

	public void SpawnItem()
	{
		chosenItem = Plugin.GiveRandomItem(null, tableType);
		ItemPickup.CreatePickupConditional(chosenItem, ((Component)this).transform, delegate
		{
			onPickup.Invoke("");
			return true;
		}, offset);
	}

	public void SpawnWeapon()
	{
		WeaponPickupRogue.CreatePickupConditional(((Component)this).transform, delegate
		{
			onPickup.Invoke("");
			return true;
		}, offset);
	}
}
public class ItemPickup : MonoBehaviour
{
	public BaseItem item;

	private bool pickedUp = false;

	private Func<bool> canPickup;

	private void Update()
	{
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		((Component)((Component)this).transform).transform.LookAt(((Component)Camera.main).transform);
		((Component)((Component)this).transform).transform.Rotate(0f, 180f, 0f);
		if (Vector3.Distance(((Component)MonoSingleton<NewMovement>.Instance).transform.position, ((Component)this).transform.position) <= 2f && !pickedUp && (canPickup == null || canPickup()))
		{
			pickedUp = true;
			HudMessageReceiver instance = MonoSingleton<HudMessageReceiver>.Instance;
			if (instance != null)
			{
				instance.SendHudMessage(item.ToString(), "", "", 0, false, false, true);
			}
			if (Plugin.SelectedChar.GetType() == typeof(Filth))
			{
				MonoSingleton<NewMovement>.Instance.FullHeal(false);
			}
			Plugin.GiveItem(item);
			Object.Destroy((Object)(object)((Component)this).gameObject);
		}
	}

	public static void CreatePickup(BaseItem item, Transform position, float offset = 3f)
	{
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0041: Expected O, but got Unknown
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = GameObject.CreatePrimitive((PrimitiveType)5);
		val.GetComponent<Collider>().enabled = false;
		val.AddComponent<ItemPickup>().item = item;
		Material val2 = new Material(Object.op_Implicit((Object)(object)item.materialOverride) ? item.materialOverride : AssetsManager.weaponMat);
		val2.mainTexture = (Texture)(object)item.ItemTexture;
		item.OnMaterialApply(val2);
		((Renderer)val.GetComponent<MeshRenderer>()).material = val2;
		val.transform.position = position.position + Vector3.up * offset;
		val.transform.parent = position;
		Transform transform = val.transform;
		transform.localScale *= 3f;
	}

	public static void CreatePickupConditional(BaseItem item, Transform position, Func<bool> pickupCon, float offset = 3f)
	{
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Expected O, but got Unknown
		//IL_006e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = GameObject.CreatePrimitive((PrimitiveType)5);
		val.GetComponent<Collider>().enabled = false;
		val.AddComponent<ItemPickup>().item = item;
		val.GetComponent<ItemPickup>().canPickup = pickupCon;
		Material val2 = new Material(Object.op_Implicit((Object)(object)item.materialOverride) ? item.materialOverride : AssetsManager.weaponMat);
		val2.mainTexture = (Texture)(object)item.ItemTexture;
		((Renderer)val.GetComponent<MeshRenderer>()).material = val2;
		val.transform.position = position.position + Vector3.up * offset;
		Transform transform = val.transform;
		transform.localScale *= 3f;
		val.transform.parent = position;
	}
}
public enum DroptableType
{
	Shop,
	RationShop,
	Planetarium,
	RandomDrop,
	Boss,
	LegendaryOnly,
	UncommonOnly,
	CommonOnly,
	BloodMachine
}
public class KeyEater : MonoBehaviour
{
	public UnityEvent OnKeyGotten;

	public UnityEvent OnNoKey;

	public float DistanceForActivation = 2f;

	private float cooldown = 1f;

	private float c = 0f;

	private bool canUse = true;

	private void Update()
	{
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		c -= Time.deltaTime;
		if (!(Vector3.Distance(((Component)MonoSingleton<NewMovement>.Instance).transform.position, ((Component)this).transform.position) <= DistanceForActivation) || !(c <= 0f) || !canUse)
		{
			return;
		}
		if (RogueDifficultyManager.Instance.Keys <= 0)
		{
			c = 2f;
			UnityEvent onNoKey = OnNoKey;
			if (onNoKey != null)
			{
				onNoKey.Invoke();
			}
			MonoSingleton<HudMessageReceiver>.Instance.SendHudMessage("NO KEYS TO GIVE", "", "", 0, false, false, true);
			return;
		}
		RogueDifficultyManager.Instance.Gold++;
		RogueDifficultyManager.Instance.Keys--;
		UnityEvent onKeyGotten = OnKeyGotten;
		if (onKeyGotten != null)
		{
			onKeyGotten.Invoke();
		}
		canUse = false;
	}

	public void AllowUsageAgain()
	{
		canUse = true;
	}
}
public class MinimapUI : MonoBehaviour
{
	[Header("References")]
	public RectTransform minimapPanel;

	[Header("Layout")]
	public float cellSize = 16f;

	[Range(0.2f, 0.6f)]
	public float corridorFraction = 0.4f;

	[Header("Room Colors")]
	public Color colorNormal = new Color(0.52f, 0.52f, 0.55f);

	public Color colorStart = new Color(0.28f, 0.82f, 0.38f);

	public Color colorBoss = new Color(0.88f, 0.14f, 0.14f);

	public Color colorTreasure = new Color(0.95f, 0.78f, 0.08f);

	public Color colorShop = new Color(0.22f, 0.52f, 0.95f);

	public Color colorGambling = new Color(0.72f, 0.22f, 0.92f);

	public Color colorPlanet = new Color(0f, 0f, 0.95f);

	[Header("UI Colors")]
	public Color colorSilhouette = new Color(0.28f, 0.28f, 0.3f);

	public Color colorCorridor = new Color(0.38f, 0.38f, 0.4f);

	[Header("Current Room Outline")]
	[Tooltip("Color of the pulsing outline drawn around the current room.")]
	public Color colorOutline = new Color(0.95f, 0.95f, 1f);

	[Tooltip("Extra pixels added to each side of the cell for the outline border.")]
	public float outlinePadding = 3f;

	[Header("Direction Arrow")]
	[Tooltip("Color of the direction arrow drawn on the current room.")]
	public Color colorArrow = new Color(1f, 1f, 1f, 0.92f);

	[Tooltip("Arrow size as a fraction of cellSize. 0.5 = half the cell.")]
	[Range(0.3f, 0.9f)]
	public float arrowFraction = 0.55f;

	[Tooltip("Which Transform to read the look direction from. Leave null to fall back to NewMovement.Instance's camera.")]
	public Transform lookTarget;

	[Header("Animation")]
	public float pulseSpeed = 2.8f;

	private readonly Dictionary<Vector2Int, Image> _cells = new Dictionary<Vector2Int, Image>();

	private readonly Dictionary<(Vector2Int, Vector2Int), Image> _corridors = new Dictionary<(Vector2Int, Vector2Int), Image>();

	private readonly HashSet<Vector2Int> _visited = new HashSet<Vector2Int>();

	private readonly HashSet<Vector2Int> _scouted = new HashSet<Vector2Int>();

	private Vector2Int _currentPos = new Vector2Int(int.MinValue, 0);

	private float _pulseTimer;

	private RectTransform _outlineRT;

	private Image _outlineImg;

	private RectTransform _arrowRT;

	private Image _arrowImg;

	private static readonly Vector2Int[] Dirs = (Vector2Int[])(object)new Vector2Int[4]
	{
		Vector2Int.up,
		Vector2Int.down,
		Vector2Int.left,
		Vector2Int.right
	};

	private Dictionary<Vector2Int, Room> _placedRooms;

	private Vector2Int? _manualOverridePos = null;

	public static MinimapUI Instance { get; private set; }

	private void Awake()
	{
		if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
		{
			Object.Destroy((Object)(object)((Component)this).gameObject);
		}
		else
		{
			Instance = this;
		}
	}

	public void SetRoomOverride(Vector2Int? pos)
	{
		_manualOverridePos = pos;
	}

	private void Update()
	{
		//IL_005d: 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_0054: 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_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		if (_placedRooms == null || (Object)(object)RoomGenerator.Instance == (Object)null)
		{
			return;
		}
		NewMovement instance = MonoSingleton<NewMovement>.Instance;
		if (!((Object)(object)instance == (Object)null))
		{
			Vector2Int val = (Vector2Int)(((??)_manualOverridePos) ?? RoomGenerator.Instance.WorldToGrid(((Component)instance).transform.position));
			if (val != _currentPos)
			{
				_currentPos = val;
				MarkVisited(val);
			}
			_pulseTimer += Time.deltaTime * pulseSpeed;
			UpdateOutline();
			UpdateArrow();
		}
	}

	public void BuildMinimap(Dictionary<Vector2Int, Room> placedRooms, HashSet<(Vector2Int, Vector2Int)> validConnections, IReadOnlyDictionary<Vector2Int, Vector2Int> largeRoomAnchorOf = null, IReadOnlyDictionary<Vector2Int, List<Vector2Int>> largeRoomCells = null)
	{
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0214: Unknown result type (might be due to invalid IL or missing references)
		//IL_0216: Unknown result type (might be due to invalid IL or missing references)
		//IL_0218: Unknown result type (might be due to invalid IL or missing references)
		//IL_021d: 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_0376: Unknown result type (might be due to invalid IL or missing references)
		//IL_037b: Unknown result type (might be due to invalid IL or missing references)
		//IL_022f: 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_05f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0251: Unknown result type (might be due to invalid IL or missing references)
		//IL_0253: Unknown result type (might be due to invalid IL or missing references)
		//IL_023a: Unknown result type (might be due to invalid IL or missing references)
		//IL_023c: Unknown result type (might be due to invalid IL or missing references)
		//IL_056d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0571: Unknown result type (might be due to invalid IL or missing references)
		//IL_0576: Unknown result type (might be due to invalid IL or missing references)
		//IL_0578: Unknown result type (might be due to invalid IL or missing references)
		//IL_057d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0585: Unknown result type (might be due to invalid IL or missing references)
		//IL_0597: Unknown result type (might be due to invalid IL or missing references)
		//IL_05a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_05b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_05c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_03aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0392: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_04b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_04bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_04c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_04c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_04c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_04c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_04e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_04f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_04fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_050d: 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_0521: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02da: Unknow