Decompiled source of Inner Monologue v1.0.1

plugins/InnerMonologue/InnerMonologue.dll

Decompiled a year ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using HarmonyLib;
using ProjectProphet.Patching;
using ProjectProphet.StageAddons;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("ProjectProphet")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ProjectProphet")]
[assembly: AssemblyCopyright("Copyright ©  2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("dfa813c9-c407-48f5-b20f-615a3c8fdbe3")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace ProjectProphet
{
	public static class Utils
	{
		public static bool notifLaunched;

		public const string bundleProjectPath = "Assets\\Maranara\\Projects\\InnerMonologue";

		private static string _packedPath;

		public static Dictionary<string, Shader> shaders;

		public static StyleHUD shud => MonoSingleton<StyleHUD>.Instance;

		public static GunControl gc => MonoSingleton<GunControl>.Instance;

		public static WeaponCharges wc => MonoSingleton<WeaponCharges>.Instance;

		public static TimeController timeController => MonoSingleton<TimeController>.Instance;

		public static string PackedPath
		{
			get
			{
				if (string.IsNullOrEmpty(_packedPath))
				{
					_packedPath = Path.Combine(ModPath() ?? "", "bundles");
				}
				return _packedPath;
			}
		}

		public static AssetBundle curStageBundle { get; private set; }

		private static string ModPath()
		{
			return Assembly.GetExecutingAssembly().Location.Substring(0, Assembly.GetExecutingAssembly().Location.LastIndexOf("\\"));
		}

		public static void InitShaders()
		{
			Shader value = Shader.Find("psx/vertexlit/vertexlit");
			shaders = new Dictionary<string, Shader>();
			shaders.Add("psx/vertexlit/vertexlit", value);
			shaders.Add("Standard", value);
			shaders.Add("psx/unlit/transparent/nocull-fresnel", Shader.Find("psx/unlit/transparent/nocull-fresnel"));
			shaders.Add("psx/unlit/ambient", Shader.Find("psx/unlit/ambient"));
			shaders.Add("psx/unlit/transparent/unlit-scrolling", Shader.Find("psx/unlit/transparent/unlit-scrolling"));
		}

		public static void FixShaders(this GameObject go)
		{
			Renderer[] componentsInChildren = (Renderer[])(object)go.GetComponentsInChildren<SkinnedMeshRenderer>();
			Renderer[] array = componentsInChildren;
			componentsInChildren = (Renderer[])(object)go.GetComponentsInChildren<MeshRenderer>();
			Renderer[] array2 = componentsInChildren;
			Renderer[] array3 = array;
			foreach (Renderer rend in array3)
			{
				FixRenderer(rend);
			}
			Renderer[] array4 = array2;
			foreach (Renderer rend2 in array4)
			{
				FixRenderer(rend2);
			}
		}

		private static void FixRenderer(Renderer rend)
		{
			Material[] sharedMaterials = rend.sharedMaterials;
			foreach (Material val in sharedMaterials)
			{
				if (!((Object)(object)val == (Object)null) && shaders.ContainsKey(((Object)val.shader).name))
				{
					val.shader = shaders[((Object)val.shader).name];
				}
			}
		}

		public static T FindScriptInScene<T>()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			Scene activeScene = SceneManager.GetActiveScene();
			GameObject[] rootGameObjects = ((Scene)(ref activeScene)).GetRootGameObjects();
			GameObject[] array = rootGameObjects;
			foreach (GameObject val in array)
			{
				T componentInChildren = val.GetComponentInChildren<T>(true);
				if (componentInChildren != null)
				{
					return componentInChildren;
				}
			}
			return default(T);
		}

		public static T[] FindScriptsInScene<T>()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			Scene activeScene = SceneManager.GetActiveScene();
			GameObject[] rootGameObjects = ((Scene)(ref activeScene)).GetRootGameObjects();
			List<T> list = new List<T>();
			GameObject[] array = rootGameObjects;
			foreach (GameObject val in array)
			{
				T[] componentsInChildren = val.GetComponentsInChildren<T>(true);
				list.AddRange(componentsInChildren);
			}
			return list.ToArray();
		}

		public static Vector3 ClampMagnitude(this Vector3 v, float max, float min)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: 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_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			double num = ((Vector3)(ref v)).sqrMagnitude;
			if (num > (double)max * (double)max)
			{
				return ((Vector3)(ref v)).normalized * max;
			}
			if (num < (double)min * (double)min)
			{
				return ((Vector3)(ref v)).normalized * min;
			}
			return v;
		}

		public static ObjectActivator LineOnActivate(GameObject target, GameObject lineObj)
		{
			return LineOnActivate(target, lineObj, 0.1f);
		}

		public static ObjectActivator LineOnActivate(GameObject target, GameObject lineObj, float delay)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Expected O, but got Unknown
			lineObj.SetActive(false);
			lineObj.GetComponent<AudioSource>().playOnAwake = true;
			GameObject val = new GameObject("Line OBAC");
			val.transform.parent = target.transform;
			val.transform.localPosition = Vector3.zero;
			ObjectActivator val2 = val.AddComponent<ObjectActivator>();
			val2.delay = delay;
			val2.events = new UltrakillEvent();
			val2.events.toActivateObjects = (GameObject[])(object)new GameObject[1];
			val2.events.toActivateObjects[0] = lineObj.gameObject;
			return val2;
		}

		public static UnityAction LineEvent(GameObject lineObj)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected O, but got Unknown
			lineObj.SetActive(false);
			lineObj.GetComponent<AudioSource>().playOnAwake = true;
			return (UnityAction)delegate
			{
				lineObj.SetActive(true);
			};
		}

		public static void DeathLine(EnemyIdentifier id, GameObject line, float delay)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			line.SetActive(false);
			line.GetComponent<AudioSource>().playOnAwake = true;
			GameObject val = new GameObject("Line OBAC");
			val.SetActive(false);
			ObjectActivator val2 = val.AddComponent<ObjectActivator>();
			val2.delay = delay;
			val2.events = new UltrakillEvent();
			val2.events.toActivateObjects = (GameObject[])(object)new GameObject[1];
			val2.events.toActivateObjects[0] = line.gameObject;
			List<GameObject> list = new List<GameObject>();
			if (id.activateOnDeath != null)
			{
				list.AddRange(id.activateOnDeath);
			}
			list.Add(val);
			id.activateOnDeath = list.ToArray();
		}

		public static void HurtButDontKill(int damage)
		{
			NewMovement instance = MonoSingleton<NewMovement>.Instance;
			int num = 0;
			if (instance.hp != 1)
			{
				num = ((instance.hp > damage) ? damage : (instance.hp - 1));
				instance.GetHurt(num, false, 1f, false, false);
			}
		}

		public static GameObject LoadAndInstantiateStage(string levelName)
		{
			string text = PackedPath + "\\" + levelName + ".lvl";
			if ((Object)(object)curStageBundle == (Object)null)
			{
				curStageBundle = AssetBundle.LoadFromFile(text);
			}
			else
			{
				Debug.Log((object)((Object)curStageBundle).name);
				if (((Object)curStageBundle).name != levelName + ".lvl")
				{
					if ((Object)(object)curStageBundle != (Object)null)
					{
						curStageBundle.Unload(true);
					}
					curStageBundle = AssetBundle.LoadFromFile(text);
					((Object)curStageBundle).name = levelName;
					Debug.Log((object)"Loading stage bundle...");
				}
				else
				{
					Debug.Log((object)"Stage bundle already loaded");
				}
			}
			if (curStageBundle.isStreamedSceneAssetBundle)
			{
				return null;
			}
			GameObject val = curStageBundle.LoadAsset<GameObject>("Assets\\Maranara\\Projects\\InnerMonologue/LevelAddons/" + levelName + ".prefab");
			return Object.Instantiate<GameObject>(val);
		}
	}
	[BepInPlugin("maranara_inner_monologue", "Inner Monologue", "1.0.0")]
	public class InternalMonologue : BaseUnityPlugin
	{
		public static Harmony harmony;

		private static float styleTimer;

		private static GabrielVoice curDeathVoice;

		private static GabrielVoice curStyleVoice;

		private static GameObject deathVoicePrefab;

		private static GameObject ultrakillVoicePrefab;

		public static Dictionary<int, StageAddon> sceneToBundle;

		public static Dictionary<string, StageAddon> specialToBundle;

		private void Start()
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Expected O, but got Unknown
			foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos)
			{
				if (pluginInfo.Key == "maranara_project_prophet")
				{
					Debug.LogError((object)"[INNER MONOLOGUE MOD BLOCKED] Cannot load Inner Monologue as it will break MASQUERADE DIVINITY.");
					Object.Destroy((Object)(object)this);
					return;
				}
			}
			Utils.InitShaders();
			harmony = new Harmony("maranara_inner_monologue");
			harmony.PatchAll(typeof(InternalMonologue));
			InitStageAddons();
			string text = Utils.PackedPath + "\\death.bd";
			AssetBundle val = AssetBundle.LoadFromFile(text);
			((Object)val).hideFlags = (HideFlags)32;
			deathVoicePrefab = val.LoadAsset<GameObject>("Assets\\Maranara\\Projects\\InnerMonologue/LevelAddons/Death.prefab");
			ultrakillVoicePrefab = val.LoadAsset<GameObject>("Assets\\Maranara\\Projects\\InnerMonologue/LevelAddons/Ultrakill.prefab");
		}

		[HarmonyPatch(typeof(NewMovement), "Start")]
		[HarmonyPostfix]
		public static void NewMovStart(NewMovement __instance)
		{
			GameObject val = Object.Instantiate<GameObject>(deathVoicePrefab);
			curDeathVoice = val.GetComponent<GabrielVoice>();
			GameObject val2 = Object.Instantiate<GameObject>(ultrakillVoicePrefab);
			curStyleVoice = val2.GetComponent<GabrielVoice>();
		}

		[HarmonyPatch(typeof(Punch), "ForceHold")]
		[HarmonyPostfix]
		public static void PunchHold(Punch __instance, ItemIdentifier itid)
		{
			Wrath.PickUpFlorpCheck(itid);
		}

		[HarmonyPatch(typeof(Punch), "PlaceHeldObject")]
		[HarmonyPostfix]
		public static void PlaceFlorpCheck(Punch __instance)
		{
			Wrath.PlaceFlorpCheck();
		}

		[HarmonyPatch(typeof(NewMovement), "GetHurt")]
		[HarmonyPostfix]
		public static void GetHurt(NewMovement __instance)
		{
			if (__instance.dead)
			{
				curDeathVoice.Taunt();
			}
		}

		[HarmonyPatch(typeof(NewMovement), "Update")]
		[HarmonyPostfix]
		public static void RankUpdate(NewMovement __instance)
		{
			if (styleTimer > 0f)
			{
				styleTimer -= Time.deltaTime;
			}
		}

		[HarmonyPatch(typeof(StyleHUD), "AscendRank")]
		[HarmonyPostfix]
		public static void RankUp(StyleHUD __instance)
		{
			if (((Object)__instance.currentRank.sprite).name == "RankU" && styleTimer <= 0f)
			{
				styleTimer = 15f;
				curStyleVoice.Taunt();
			}
		}

		[HarmonyPatch(typeof(SceneHelper), "OnSceneLoaded")]
		[HarmonyPostfix]
		private static void OnSceneLoaded(Scene scene, LoadSceneMode mode)
		{
			string currentScene = SceneHelper.CurrentScene;
			if (string.IsNullOrEmpty(currentScene))
			{
				return;
			}
			currentScene = currentScene.Substring(currentScene.Length - 3);
			currentScene = currentScene.Remove(1, 1);
			StageAddon value2;
			if (int.TryParse(currentScene, out var result))
			{
				string path = Utils.PackedPath + "\\" + currentScene + ".lvl";
				if (sceneToBundle.TryGetValue(result, out var value))
				{
					value.RunAddon();
				}
				else if (File.Exists(path))
				{
					Utils.LoadAndInstantiateStage(currentScene);
				}
			}
			else if (specialToBundle.TryGetValue(currentScene, out value2))
			{
				value2.RunAddon();
			}
		}

		private void InitStageAddons()
		{
			sceneToBundle = new Dictionary<int, StageAddon>();
			specialToBundle = new Dictionary<string, StageAddon>();
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			Type[] types = executingAssembly.GetTypes();
			foreach (Type type in types)
			{
				if (type.Namespace != "ProjectProphet.StageAddons")
				{
					continue;
				}
				MethodInfo[] methods = type.GetMethods();
				MethodInfo[] array = methods;
				foreach (MethodInfo methodInfo in array)
				{
					StageAddon customAttribute = methodInfo.GetCustomAttribute<StageAddon>();
					if (customAttribute != null)
					{
						customAttribute.SetMethodInfo(methodInfo);
						if (customAttribute.stage != 0)
						{
							sceneToBundle.Add(customAttribute.stage, customAttribute);
						}
						else
						{
							specialToBundle.Add(customAttribute.specialStageName, customAttribute);
						}
					}
				}
			}
		}
	}
}
namespace ProjectProphet.StageAddons
{
	public static class Gluttony
	{
		[StageAddon(32)]
		public static void Gabriel()
		{
			GameObject val = Utils.LoadAndInstantiateStage("32");
			GameObject gameObject = ((Component)val.transform.GetChild(1)).gameObject;
			ScaleTransform val2 = Utils.FindScriptInScene<ScaleTransform>();
			Utils.LineOnActivate(((Component)((Component)val2).transform.GetChild(3)).gameObject, gameObject, 0.3f);
			CutsceneSkip val3 = Utils.FindScriptInScene<CutsceneSkip>();
			List<GameObject> list = new List<GameObject>();
			list.AddRange(val3.onSkip.toActivateObjects);
			list.Add(gameObject);
			val3.onSkip.toActivateObjects = list.ToArray();
		}

		[StageAddon(62)]
		public static void Gabriel2()
		{
			GameObject val = Utils.LoadAndInstantiateStage("62");
			GameObject gameObject = ((Component)val.transform.GetChild(1)).gameObject;
			ScaleTransform val2 = Utils.FindScriptInScene<ScaleTransform>();
			GameObject gameObject2 = ((Component)((Component)val2).transform.parent.GetChild(1).GetChild(0)).gameObject;
			Utils.LineOnActivate(gameObject2, gameObject, 7f);
		}
	}
	public static class Special
	{
		[StageAddon("0S")]
		public static void SomethingWicked()
		{
			GameObject val = Utils.LoadAndInstantiateStage("0S");
			GameObject gameObject = ((Component)GameObject.Find("MessageParent").transform.GetChild(0)).gameObject;
			Utils.LineOnActivate(gameObject, ((Component)val.transform.GetChild(0)).gameObject, 4f);
		}

		[StageAddon("1S")]
		public static void Puzzle()
		{
			GameObject val = Utils.LoadAndInstantiateStage("1S");
		}

		[StageAddon("4S")]
		public static void Clash()
		{
			GameObject val = Utils.LoadAndInstantiateStage("4S");
			GameObject gameObject = ((Component)val.transform.GetChild(0)).gameObject;
			gameObject.SetActive(false);
			List<GameObject> list = new List<GameObject>();
			Door val2 = ((Component)GameObject.Find("FirstRoom Secret").transform.Find("Room").Find("FinalDoor")).GetComponent<FinalDoor>().doors[0];
			list.AddRange(val2.activatedRooms);
			list.Add(gameObject);
			val2.activatedRooms = list.ToArray();
		}

		[StageAddon("P1")]
		public static void PrimeSanctum()
		{
			GameObject val = Utils.LoadAndInstantiateStage("P1");
			MinosPrime val2 = Utils.FindScriptInScene<MinosPrime>();
			CutsceneSkip[] array = Utils.FindScriptsInScene<CutsceneSkip>();
			CutsceneSkip[] array2 = array;
			foreach (CutsceneSkip val3 in array2)
			{
				if (((Object)((Component)val3).gameObject).name == "MinosPrimeIntro")
				{
					List<GameObject> list = new List<GameObject>();
					list.AddRange(val3.onSkip.toActivateObjects);
					list.Add(((Component)val.transform.GetChild(1)).gameObject);
					val3.onSkip.toActivateObjects = list.ToArray();
					Utils.LineOnActivate(((Component)((Component)val3).transform.GetChild(6)).gameObject, ((Component)val.transform.GetChild(1)).gameObject, 24f);
					break;
				}
			}
			List<GameObject> list2 = new List<GameObject>();
			list2.AddRange(val2.onOutroEnd.toActivateObjects);
			list2.Add(((Component)val.transform.GetChild(2)).gameObject);
			val2.onOutroEnd.toActivateObjects = list2.ToArray();
		}
	}
	public static class Wrath
	{
		private static GameObject florpLoop;

		private static ItemIdentifier florpId;

		[StageAddon(52)]
		public static void Ferryman()
		{
			GameObject val = Utils.LoadAndInstantiateStage("52");
			GameObject gameObject = ((Component)val.transform.GetChild(0)).gameObject;
			Ferryman val2 = Utils.FindScriptInScene<Ferryman>();
			Utils.LineOnActivate(((Component)val2).gameObject, gameObject);
			Idol[] array = Utils.FindScriptsInScene<Idol>();
			Idol[] array2 = array;
			foreach (Idol val3 in array2)
			{
				if (((Object)((Component)val3).transform.root).name == "3 - Ferryman's Cabin")
				{
					((Component)val3).GetComponent<EnemyIdentifier>().onDeath.AddListener(Utils.LineEvent(((Component)val.transform.GetChild(1)).gameObject));
					break;
				}
			}
			ItemPlaceZone val4 = null;
			ItemPlaceZone val5 = null;
			ItemPlaceZone[] array3 = Utils.FindScriptsInScene<ItemPlaceZone>();
			ItemPlaceZone[] array4 = array3;
			foreach (ItemPlaceZone val6 in array4)
			{
				if (((Object)((Component)val6).transform.root).name == "JakitoCaged" && ((Object)((Component)val6).transform.parent).name == "Altar")
				{
					val4 = val6;
				}
				else if (((Object)((Component)val6).transform.root).name == "8 - Ship")
				{
					val5 = val6;
				}
			}
			florpLoop = ((Component)val.transform.GetChild(2)).gameObject;
			florpId = ((Component)val5).GetComponentInChildren<ItemIdentifier>();
			List<GameObject> list = new List<GameObject>();
			list.AddRange(val4.activateOnSuccess);
			list.Add(((Component)val.transform.GetChild(3)).gameObject);
			val4.activateOnSuccess = list.ToArray();
			List<GameObject> list2 = new List<GameObject>();
			list2.AddRange(val4.deactivateOnSuccess);
			list2.Add(florpLoop);
			val4.deactivateOnSuccess = list2.ToArray();
			((MonoBehaviour)ThreadingHelper.Instance).StartCoroutine(WaitWaitWait(florpLoop));
		}

		private static IEnumerator WaitWaitWait(GameObject loooop)
		{
			yield return (object)new WaitForEndOfFrame();
			yield return (object)new WaitForEndOfFrame();
			yield return (object)new WaitForEndOfFrame();
			loooop.SetActive(false);
		}

		public static void PickUpFlorpCheck(ItemIdentifier id)
		{
			if (!((Object)(object)florpLoop == (Object)null) && !((Object)(object)florpId == (Object)null) && !((Object)(object)id != (Object)(object)florpId))
			{
				florpLoop.SetActive(florpId.pickedUp);
			}
		}

		public static void PlaceFlorpCheck()
		{
			if (!((Object)(object)florpLoop == (Object)null) && !((Object)(object)florpId == (Object)null))
			{
				florpLoop.SetActive(false);
			}
		}

		[StageAddon(53)]
		public static void RocketLauncherPickup()
		{
			GameObject val = Utils.LoadAndInstantiateStage("53");
			GameObject gameObject = ((Component)val.transform.GetChild(1)).gameObject;
			gameObject.SetActive(false);
			AudioSource component = gameObject.GetComponent<AudioSource>();
			component.playOnAwake = true;
			WeaponPickUp val2 = Utils.FindScriptInScene<WeaponPickUp>();
			val2.activateOnPickup = gameObject;
		}

		[StageAddon(54)]
		public static void Leviathan()
		{
			GameObject val = Utils.LoadAndInstantiateStage("54");
			GameObject gameObject = ((Component)val.transform.GetChild(0)).gameObject;
			LeviathanController val2 = Utils.FindScriptInScene<LeviathanController>();
			Utils.LineOnActivate(((Component)val2).gameObject, gameObject, 1f);
			EnemyIdentifier component = ((Component)val2).GetComponent<EnemyIdentifier>();
			Utils.DeathLine(component, ((Component)val.transform.GetChild(1)).gameObject, 0.7f);
		}
	}
	public static class Greed
	{
		[StageAddon(42)]
		public static void Sisyphus()
		{
			GameObject val = Utils.LoadAndInstantiateStage("42");
			GameObject gameObject = ((Component)val.transform.GetChild(1)).gameObject;
			Sisyphus val2 = Utils.FindScriptInScene<Sisyphus>();
			Utils.LineOnActivate(((Component)val2).gameObject, gameObject);
			((Component)val2).GetComponent<Machine>().onDeath.AddListener(Utils.LineEvent(((Component)val.transform.GetChild(2)).gameObject));
		}

		[StageAddon(43)]
		public static void TorchOn()
		{
			GameObject val = Utils.LoadAndInstantiateStage("43");
			GameObject gameObject = ((Component)val.transform.GetChild(1)).gameObject;
			gameObject.SetActive(false);
			gameObject.GetComponent<AudioSource>().playOnAwake = true;
			ItemPlaceZone[] array = Utils.FindScriptsInScene<ItemPlaceZone>();
			ItemPlaceZone[] array2 = array;
			foreach (ItemPlaceZone val2 in array2)
			{
				if (((Object)((Component)val2).transform.root).name == "7 - Generator Room")
				{
					List<GameObject> list = new List<GameObject>();
					list.AddRange(val2.activateOnSuccess);
					list.Add(gameObject);
					val2.activateOnSuccess = list.ToArray();
				}
			}
			Mandalore val3 = Utils.FindScriptInScene<Mandalore>();
			Utils.DeathLine(((Component)val3).GetComponent<EnemyIdentifier>(), ((Component)val.transform.GetChild(2)).gameObject, 3f);
		}

		[StageAddon(44)]
		public static void V22()
		{
			GameObject val = Utils.LoadAndInstantiateStage("44");
			GameObject gameObject = ((Component)val.transform.GetChild(2)).gameObject;
			HudMessage[] array = Utils.FindScriptsInScene<HudMessage>();
			HudMessage[] array2 = array;
			foreach (HudMessage val2 in array2)
			{
				if (((Object)((Component)val2).gameObject).name == "Message" && val2.timed)
				{
					Utils.LineOnActivate(((Component)val2).gameObject, gameObject);
					break;
				}
			}
		}
	}
	public static class Lust
	{
		[StageAddon(23)]
		public static void Mindflayer()
		{
			GameObject val = Utils.LoadAndInstantiateStage("23");
			GameObject gameObject = ((Component)val.transform.GetChild(0)).gameObject;
			Mindflayer val2 = Utils.FindScriptInScene<Mindflayer>();
			Utils.LineOnActivate(((Component)val2).gameObject, gameObject, 1f);
		}

		[StageAddon(24)]
		public static void MinosCorpse()
		{
			GameObject val = Utils.LoadAndInstantiateStage("24");
			GameObject gameObject = ((Component)val.transform.GetChild(0)).gameObject;
			MinosBoss val2 = Utils.FindScriptInScene<MinosBoss>();
			Utils.LineOnActivate(((Component)val2).gameObject, gameObject, 1f);
			FinalRoom val3 = Utils.FindScriptInScene<FinalRoom>();
			Utils.LineOnActivate(((Component)val3).gameObject, ((Component)val.transform.GetChild(1)).gameObject, 0f);
		}
	}
	public static class Limbo
	{
		[StageAddon(12)]
		public static void BurningWorld()
		{
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Expected O, but got Unknown
			GameObject val = Utils.LoadAndInstantiateStage("12");
			GameObject line = ((Component)val.transform.GetChild(0)).gameObject;
			line.SetActive(false);
			((Component)GameObject.Find("FirstRoom").transform.Find("Room").Find("FinalDoor")).GetComponent<FinalDoor>().doors[0].onFullyOpened.AddListener((UnityAction)delegate
			{
				FinalizeScene(line);
			});
			CancerousRodent[] array = Utils.FindScriptsInScene<CancerousRodent>();
			CancerousRodent[] array2 = array;
			foreach (CancerousRodent val2 in array2)
			{
				if (val2.harmless)
				{
					Utils.DeathLine(((Component)val2).GetComponent<EnemyIdentifier>(), ((Component)val.transform.GetChild(1)).gameObject, 0.5f);
					break;
				}
			}
		}

		private static void FinalizeScene(GameObject toActivate)
		{
			Transform transform = GameObject.Find("1 - First Room").transform;
			GameObject gameObject = ((Component)transform.GetChild(0).GetChild(2)).gameObject;
			Utils.LineOnActivate(gameObject, toActivate, 0.5f);
		}

		[StageAddon(13)]
		public static void Sister()
		{
			GameObject val = Utils.LoadAndInstantiateStage("13");
			GameObject gameObject = ((Component)val.transform.GetChild(0)).gameObject;
			Mass val2 = Utils.FindScriptInScene<Mass>();
			Utils.LineOnActivate(((Component)val2).gameObject, gameObject, 0.3f);
		}

		[StageAddon(14)]
		public static void Mirror()
		{
			GameObject val = Utils.LoadAndInstantiateStage("14");
			GameObject gameObject = ((Component)val.transform.GetChild(0)).gameObject;
			V2 val2 = Utils.FindScriptInScene<V2>();
			Utils.LineOnActivate(((Component)val2).gameObject, gameObject, 0.6f);
			WeaponPickUp val3 = Utils.FindScriptInScene<WeaponPickUp>();
			Utils.LineOnActivate(val3.activateOnPickup, ((Component)val.transform.GetChild(1)).gameObject);
		}
	}
	public static class Prelude
	{
		[StageAddon(3)]
		public static void ShotgunPickup()
		{
			GameObject val = Utils.LoadAndInstantiateStage("03");
			GameObject gameObject = ((Component)val.transform.GetChild(1)).gameObject;
			gameObject.SetActive(false);
			AudioSource component = gameObject.GetComponent<AudioSource>();
			component.playOnAwake = true;
			WeaponPickUp val2 = Utils.FindScriptInScene<WeaponPickUp>();
			val2.activateOnPickup = gameObject;
		}

		[StageAddon(5)]
		public static void Cerberus()
		{
			GameObject val = Utils.LoadAndInstantiateStage("05");
			StatueFake[] array = Utils.FindScriptsInScene<StatueFake>();
			StatueFake cerb = null;
			StatueFake cerb2 = null;
			StatueFake[] array2 = array;
			foreach (StatueFake val2 in array2)
			{
				if (val2.quickSpawn)
				{
					cerb2 = val2;
				}
				else
				{
					cerb = val2;
				}
			}
			SubscribeCerb(cerb, val.transform.GetChild(0));
			SubscribeCerb(cerb2, val.transform.GetChild(1));
		}

		private static void SubscribeCerb(StatueFake cerb, Transform line)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Expected O, but got Unknown
			((Component)line).gameObject.SetActive(false);
			((Component)line).GetComponent<AudioSource>().playOnAwake = true;
			ObjectActivator val = cerb.toActivate[1].AddComponent<ObjectActivator>();
			val.events = new UltrakillEvent();
			val.events.toActivateObjects = (GameObject[])(object)new GameObject[1];
			val.events.toActivateObjects[0] = ((Component)line).gameObject;
		}
	}
}
namespace ProjectProphet.Patching
{
	[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
	public class StageAddon : Attribute
	{
		public int stage;

		public string specialStageName;

		private MethodInfo method;

		public StageAddon(int stage)
		{
			this.stage = stage;
		}

		public StageAddon(string stage)
		{
			specialStageName = stage;
		}

		public void SetMethodInfo(MethodInfo info)
		{
			method = info;
		}

		public void RunAddon()
		{
			method.Invoke(null, null);
		}
	}
}