Decompiled source of FifthChorus v1.0.2

FifthChorus.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using FifthChorus.Patches;
using FifthChorus.Patches.FSM;
using FifthChorus.Systems;
using FifthChorus.UI;
using FifthChorus.Util;
using GenericVariableExtension;
using HarmonyLib;
using HutongGames.PlayMaker;
using HutongGames.PlayMaker.Actions;
using SilksongTestMod.Actions;
using TeamCherry.Localization;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("FifthChorus")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FifthChorus")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("befdf537-2cce-4d11-a71e-a663a05970c7")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace FifthChorus
{
	[BepInPlugin("com.prodigg.fifthchorus", "Fifth Chorus", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		private const string HARMONY_ID = "com.prodigg.fifthchorus";

		internal static ManualLogSource Log;

		private static Harmony _rootHarmony;

		internal static ConfigEntry<KeyboardShortcut> PracticeMenuKey;

		private void Awake()
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			ModLog.Init(((BaseUnityPlugin)this).Logger);
			ModLog.Info<Plugin>("Fifth Chorus mod initializing...");
			PracticeMenuKey = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Controls", "Open Fifth Chorus Menu", new KeyboardShortcut((KeyCode)287, Array.Empty<KeyCode>()), "Open/close the Fifth Chorus Menu.");
			GameObject val = new GameObject("FifthChorusUIHost");
			Object.DontDestroyOnLoad((Object)(object)val);
			val.AddComponent<FifthChorusMenu>();
			ModLog.Info<Plugin>("Fifth Chorus UI initialized.");
			_rootHarmony = new Harmony("com.prodigg.fifthchorus");
			PostLoadPatches.Initialize();
			_rootHarmony.PatchAll(typeof(PostLoadPatches));
			_rootHarmony.PatchAll(typeof(PlayMakerFSMAwakePatch));
			_rootHarmony.PatchAll(typeof(InputCursorPatches.Patch_SetCursorEnabled));
			_rootHarmony.PatchAll(typeof(InputCursorPatches.Patch_InputHandler_Update));
			_rootHarmony.PatchAll(typeof(SaveGamePatches.Patch_SaveGame_Nullify));
			ModLog.Info<Plugin>("Harmony patches applied.");
		}
	}
}
namespace FifthChorus.Util
{
	internal static class FsmDebugUtils
	{
		internal static void LogAllDataInFSM(Fsm fsm)
		{
			//IL_0387: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0403: Unknown result type (might be due to invalid IL or missing references)
			//IL_0485: Unknown result type (might be due to invalid IL or missing references)
			//IL_04da: Unknown result type (might be due to invalid IL or missing references)
			ModLog.Debug(typeof(FsmDebugUtils), "Logging all states in FSM: " + fsm.Name);
			FsmState[] states = fsm.States;
			foreach (FsmState val in states)
			{
				ModLog.Debug(typeof(FsmDebugUtils), "State: " + val.Name);
				FsmStateAction[] actions = val.Actions;
				foreach (FsmStateAction val2 in actions)
				{
					ModLog.Debug(typeof(FsmDebugUtils), "  Action: " + ((object)val2).GetType().Name);
					SetParent val3 = (SetParent)(object)((val2 is SetParent) ? val2 : null);
					if (val3 != null)
					{
						ModLog.Debug(typeof(FsmDebugUtils), "    GameObject: " + ((NamedVariable)val3.gameObject.GameObject).Name);
						ModLog.Debug(typeof(FsmDebugUtils), "    Parent: " + ((NamedVariable)val3.parent).Name);
					}
					SendEventByName val4 = (SendEventByName)(object)((val2 is SendEventByName) ? val2 : null);
					if (val4 != null)
					{
						ModLog.Debug(typeof(FsmDebugUtils), "    Event Target GameObject Name: " + ((NamedVariable)val4.eventTarget.gameObject.GameObject).Name);
						ModLog.Debug(typeof(FsmDebugUtils), "    Event: " + val4.sendEvent.Value);
						ModLog.Debug(typeof(FsmDebugUtils), $"    Delay: {val4.delay.Value}");
					}
					ActivateGameObject val5 = (ActivateGameObject)(object)((val2 is ActivateGameObject) ? val2 : null);
					if (val5 != null)
					{
						ModLog.Debug(typeof(FsmDebugUtils), "    GameObject: " + ((NamedVariable)val5.gameObject.GameObject).Name);
						ModLog.Debug(typeof(FsmDebugUtils), $"    Activate: {val5.activate.Value}");
					}
					ActivateGameObjectDelay val6 = (ActivateGameObjectDelay)(object)((val2 is ActivateGameObjectDelay) ? val2 : null);
					if (val6 != null)
					{
						ModLog.Debug(typeof(FsmDebugUtils), "    GameObject: " + ((NamedVariable)val6.gameObject.GameObject).Name);
						ModLog.Debug(typeof(FsmDebugUtils), $"    Activate: {val6.activate.Value}");
						ModLog.Debug(typeof(FsmDebugUtils), $"    Delay: {val6.delay.Value}");
					}
					PlayParticleEmitter val7 = (PlayParticleEmitter)(object)((val2 is PlayParticleEmitter) ? val2 : null);
					if (val7 != null)
					{
						ModLog.Debug(typeof(FsmDebugUtils), "    GameObject: " + ((NamedVariable)val7.gameObject.GameObject).Name);
					}
					PlayParticleEmitterChildren val8 = (PlayParticleEmitterChildren)(object)((val2 is PlayParticleEmitterChildren) ? val2 : null);
					if (val8 != null)
					{
						ModLog.Debug(typeof(FsmDebugUtils), "    GameObject: " + ((NamedVariable)val8.gameObject.GameObject).Name);
					}
					AnimatePositionTo val9 = (AnimatePositionTo)(object)((val2 is AnimatePositionTo) ? val2 : null);
					if (val9 != null)
					{
						Type typeFromHandle = typeof(FsmDebugUtils);
						FsmGameObject gameObject = val9.gameObject.GameObject;
						object obj;
						if (gameObject == null)
						{
							obj = null;
						}
						else
						{
							GameObject value = gameObject.Value;
							obj = ((value != null) ? ((Object)value).name : null);
						}
						ModLog.Debug(typeFromHandle, "    GameObject: " + (string?)obj);
						ModLog.Debug(typeof(FsmDebugUtils), $"    OwnerOption: {val9.gameObject.OwnerOption}");
						ModLog.Debug(typeof(FsmDebugUtils), $"    ToValue: {val9.toValue.Value}");
						ModLog.Debug(typeof(FsmDebugUtils), $"    Time: {((EaseFsmAction)val9).time.Value}");
						ModLog.Debug(typeof(FsmDebugUtils), $"    EaseType: {((EaseFsmAction)val9).easeType}");
					}
					SetPosition val10 = (SetPosition)(object)((val2 is SetPosition) ? val2 : null);
					if (val10 != null)
					{
						Type typeFromHandle2 = typeof(FsmDebugUtils);
						FsmGameObject gameObject2 = val10.gameObject.GameObject;
						object obj2;
						if (gameObject2 == null)
						{
							obj2 = null;
						}
						else
						{
							GameObject value2 = gameObject2.Value;
							obj2 = ((value2 != null) ? ((Object)value2).name : null);
						}
						ModLog.Debug(typeFromHandle2, "    GameObject: " + (string?)obj2);
						ModLog.Debug(typeof(FsmDebugUtils), $"    OwnerOption: {val10.gameObject.OwnerOption}");
						ModLog.Debug(typeof(FsmDebugUtils), $"    Vector: ({val10.x}, {val10.y}, {val10.z})");
						ModLog.Debug(typeof(FsmDebugUtils), $"    Space: {val10.space}");
						ModLog.Debug(typeof(FsmDebugUtils), $"    EveryFrame: {val10.everyFrame}");
						ModLog.Debug(typeof(FsmDebugUtils), $"    LateUpdate: {val10.lateUpdate}");
					}
					if (val2 is AimSlamSelectAndSend aimSlamSelectAndSend)
					{
						Type typeFromHandle3 = typeof(FsmDebugUtils);
						FsmFloat heroX = aimSlamSelectAndSend.heroX;
						ModLog.Debug(typeFromHandle3, "    Hero X Variable: " + ((heroX != null) ? ((NamedVariable)heroX).Name : null));
						Type typeFromHandle4 = typeof(FsmDebugUtils);
						FsmString lastSlam = aimSlamSelectAndSend.lastSlam;
						ModLog.Debug(typeFromHandle4, "    Last Slam Variable: " + ((lastSlam != null) ? ((NamedVariable)lastSlam).Name : null));
					}
					Wait val11 = (Wait)(object)((val2 is Wait) ? val2 : null);
					if (val11 != null)
					{
						ModLog.Debug(typeof(FsmDebugUtils), string.Format("    Wait: time={0}, finishEvent={1}", val11.time, (val11.finishEvent != null) ? val11.finishEvent.Name : "<null>"));
					}
				}
				if (val.Transitions != null)
				{
					FsmTransition[] transitions = val.Transitions;
					foreach (FsmTransition val12 in transitions)
					{
						Type typeFromHandle5 = typeof(FsmDebugUtils);
						string[] obj3 = new string[7] { "  Transition: Event '", null, null, null, null, null, null };
						FsmEvent fsmEvent = val12.FsmEvent;
						obj3[1] = ((fsmEvent != null) ? fsmEvent.Name : null) ?? "<null>";
						obj3[2] = "' -> State '";
						obj3[3] = val12.ToState;
						obj3[4] = "' (ToFsmState=";
						FsmState toFsmState = val12.ToFsmState;
						obj3[5] = ((toFsmState != null) ? toFsmState.Name : null) ?? "null";
						obj3[6] = ")";
						ModLog.Debug(typeFromHandle5, string.Concat(obj3));
					}
				}
			}
			ModLog.Debug(typeof(FsmDebugUtils), "FSM Variables:");
			NamedVariable[] allNamedVariables = fsm.Variables.GetAllNamedVariables();
			foreach (NamedVariable val13 in allNamedVariables)
			{
				ModLog.Debug(typeof(FsmDebugUtils), "- " + val13.Name + " (Type: " + ((object)val13).GetType().Name + ")");
			}
		}
	}
	internal static class FsmUtils
	{
		internal static FsmEvent EnsureEvent(Fsm fsm, string name, bool isGlobal = false)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Expected O, but got Unknown
			FsmEvent val = fsm.Events?.FirstOrDefault((Func<FsmEvent, bool>)((FsmEvent e) => e != null && e.Name == name));
			if (val != null)
			{
				return val;
			}
			val = new FsmEvent(name);
			val.IsGlobal = isGlobal;
			FsmEvent[] array = fsm.Events ?? Array.Empty<FsmEvent>();
			Array.Resize(ref array, array.Length + 1);
			array[^1] = val;
			fsm.Events = array;
			ModLog.Info(typeof(FsmUtils), $"Created new FSM event '{name}' (IsGlobal={isGlobal})");
			return val;
		}

		internal static void EnsureVariable(Fsm fsm, Type varType, string name)
		{
			NamedVariable variable = fsm.Variables.GetVariable(name);
			if (variable == null)
			{
				switch (varType.Name)
				{
				case "FsmInt":
					CreateNewIntVariable(fsm, name);
					break;
				case "FsmFloat":
					CreateNewFloatVariable(fsm, name);
					break;
				case "FsmBool":
					CreateNewBoolVariable(fsm, name);
					break;
				case "FsmString":
					CreateNewStringVariable(fsm, name);
					break;
				default:
					ModLog.Error(typeof(FsmUtils), "Unsupported variable type for EnsureVariable: " + varType.Name);
					break;
				}
				ModLog.Info(typeof(FsmUtils), "Created new FSM variable '" + name + "' of type " + varType.Name);
			}
		}

		internal static void CreateNewIntVariable(Fsm fsm, string name, int defaultValue = 0)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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_0036: Expected O, but got Unknown
			NamedVariable variable = fsm.Variables.GetVariable(name);
			if (variable == null)
			{
				FsmInt element = new FsmInt
				{
					Name = name,
					Value = defaultValue,
					UseVariable = false
				};
				fsm.Variables.IntVariables = fsm.Variables.IntVariables.Append(element).ToArray();
			}
		}

		internal static void CreateNewFloatVariable(Fsm fsm, string name, float defaultValue = 0f)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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_0036: Expected O, but got Unknown
			NamedVariable variable = fsm.Variables.GetVariable(name);
			if (variable == null)
			{
				FsmFloat element = new FsmFloat
				{
					Name = name,
					Value = defaultValue,
					UseVariable = false
				};
				fsm.Variables.FloatVariables = fsm.Variables.FloatVariables.Append(element).ToArray();
			}
		}

		internal static void CreateNewBoolVariable(Fsm fsm, string name, bool defaultValue = false)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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_0036: Expected O, but got Unknown
			NamedVariable variable = fsm.Variables.GetVariable(name);
			if (variable == null)
			{
				FsmBool element = new FsmBool
				{
					Name = name,
					Value = defaultValue,
					UseVariable = false
				};
				fsm.Variables.BoolVariables = fsm.Variables.BoolVariables.Append(element).ToArray();
			}
		}

		internal static void CreateNewStringVariable(Fsm fsm, string name, string defaultValue = "")
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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_0036: Expected O, but got Unknown
			NamedVariable variable = fsm.Variables.GetVariable(name);
			if (variable == null)
			{
				FsmString element = new FsmString
				{
					Name = name,
					Value = defaultValue,
					UseVariable = false
				};
				fsm.Variables.StringVariables = fsm.Variables.StringVariables.Append(element).ToArray();
			}
		}

		internal static FsmTransition[] AppendTransition(FsmTransition[] existing, FsmTransition addition)
		{
			if (existing == null)
			{
				return (FsmTransition[])(object)new FsmTransition[1] { addition };
			}
			List<FsmTransition> list = existing.ToList();
			list.Add(addition);
			ModLog.Info(typeof(FsmUtils), $"Appending new transition on event '{addition.FsmEvent.Name}' to state transitions (was {existing.Length} transitions)");
			return list.ToArray();
		}
	}
	public enum LogLevelFlag
	{
		Info,
		Warn,
		Error,
		Debug,
		Message,
		Fatal
	}
	internal static class ModLog
	{
		private enum Level
		{
			Info,
			Warn,
			Error,
			Debug,
			Message,
			Fatal
		}

		private static ManualLogSource _source;

		private static readonly HashSet<Type> _allowedTypes = new HashSet<Type>();

		private static bool _infoEnabled = true;

		private static bool _warnEnabled = true;

		private static bool _errorEnabled = true;

		private static bool _debugEnabled = true;

		private static bool _messageEnabled = true;

		private static bool _fatalEnabled = true;

		private static bool _initialized;

		public static void Init(ManualLogSource src, IEnumerable<Type> allowedTypes = null, IEnumerable<LogLevelFlag> disabledLevels = null)
		{
			_source = src;
			_allowedTypes.Clear();
			if (allowedTypes != null)
			{
				foreach (Type allowedType in allowedTypes)
				{
					if (allowedType != null)
					{
						_allowedTypes.Add(allowedType);
					}
				}
			}
			_infoEnabled = true;
			_warnEnabled = true;
			_errorEnabled = true;
			_debugEnabled = true;
			_messageEnabled = true;
			_fatalEnabled = true;
			if (disabledLevels != null)
			{
				using IEnumerator<LogLevelFlag> enumerator2 = disabledLevels.GetEnumerator();
				while (enumerator2.MoveNext())
				{
					switch (enumerator2.Current)
					{
					case LogLevelFlag.Info:
						_infoEnabled = false;
						break;
					case LogLevelFlag.Warn:
						_warnEnabled = false;
						break;
					case LogLevelFlag.Error:
						_errorEnabled = false;
						break;
					case LogLevelFlag.Debug:
						_debugEnabled = false;
						break;
					case LogLevelFlag.Message:
						_messageEnabled = false;
						break;
					case LogLevelFlag.Fatal:
						_fatalEnabled = false;
						break;
					}
				}
			}
			_initialized = true;
		}

		private static bool ShouldLog(Type from, Level level)
		{
			if (!_initialized)
			{
				return true;
			}
			if (from == null)
			{
				return true;
			}
			switch (level)
			{
			case Level.Info:
				if (!_infoEnabled)
				{
					return false;
				}
				break;
			case Level.Warn:
				if (!_warnEnabled)
				{
					return false;
				}
				break;
			case Level.Error:
				if (!_errorEnabled)
				{
					return false;
				}
				break;
			case Level.Debug:
				if (!_debugEnabled)
				{
					return false;
				}
				break;
			case Level.Message:
				if (!_messageEnabled)
				{
					return false;
				}
				break;
			case Level.Fatal:
				if (!_fatalEnabled)
				{
					return false;
				}
				break;
			}
			if (_allowedTypes.Count > 0 && !_allowedTypes.Contains(from))
			{
				return false;
			}
			return true;
		}

		private static string Format(Type from, string msg)
		{
			string text = from?.Name ?? "Unknown";
			return "[" + text + "] " + msg;
		}

		public static void Info<T>(string msg)
		{
			Info(typeof(T), msg);
		}

		public static void Info(Type from, string msg)
		{
			if (ShouldLog(from, Level.Info))
			{
				ManualLogSource source = _source;
				if (source != null)
				{
					source.LogInfo((object)Format(from, msg));
				}
			}
		}

		public static void Warn<T>(string msg)
		{
			Warn(typeof(T), msg);
		}

		public static void Warn(Type from, string msg)
		{
			if (ShouldLog(from, Level.Warn))
			{
				ManualLogSource source = _source;
				if (source != null)
				{
					source.LogWarning((object)Format(from, msg));
				}
			}
		}

		public static void Error<T>(string msg)
		{
			Error(typeof(T), msg);
		}

		public static void Error(Type from, string msg)
		{
			if (ShouldLog(from, Level.Error))
			{
				ManualLogSource source = _source;
				if (source != null)
				{
					source.LogError((object)Format(from, msg));
				}
			}
		}

		public static void Debug<T>(string msg)
		{
			Debug(typeof(T), msg);
		}

		public static void Debug(Type from, string msg)
		{
			if (ShouldLog(from, Level.Debug))
			{
				ManualLogSource source = _source;
				if (source != null)
				{
					source.LogDebug((object)Format(from, msg));
				}
			}
		}

		public static void Message<T>(string msg)
		{
			Message(typeof(T), msg);
		}

		public static void Message(Type from, string msg)
		{
			if (ShouldLog(from, Level.Message))
			{
				ManualLogSource source = _source;
				if (source != null)
				{
					source.LogMessage((object)Format(from, msg));
				}
			}
		}

		public static void Fatal<T>(string msg)
		{
			Fatal(typeof(T), msg);
		}

		public static void Fatal(Type from, string msg)
		{
			if (ShouldLog(from, Level.Fatal))
			{
				ManualLogSource source = _source;
				if (source != null)
				{
					source.LogFatal((object)Format(from, msg));
				}
			}
		}
	}
}
namespace FifthChorus.UI
{
	public class FifthChorusMenu : MonoBehaviour
	{
		[CompilerGenerated]
		private sealed class <StartSelected>d__13 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public FifthChorusDifficulty diff;

			public FifthChorusMenu <>4__this;

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

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

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

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

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>4__this.ToggleMenu(visible: false);
					ModLog.Info(typeof(FifthChorusMenu), $"Start selected. Beginning bossfight: {diff}");
					<>2__current = FifthChorusDifficultyConfig.TeleportToFourthChorus(diff);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					return false;
				}
			}

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

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

		private GameObject _canvas;

		private GameObject _panel;

		private Text _description;

		private Button _startBtn;

		private FifthChorusDifficulty? _selected;

		public static bool MenuVisible { get; private set; }

		private void Awake()
		{
			CreateMenu();
			ToggleMenu(visible: false);
			SceneManager.sceneLoaded += delegate
			{
				ToggleMenu(visible: false);
			};
		}

		private void Update()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			KeyboardShortcut value = Plugin.PracticeMenuKey.Value;
			if (((KeyboardShortcut)(ref value)).IsDown())
			{
				GameManager instance = GameManager.instance;
				if ((Object)(object)((instance != null) ? instance.hero_ctrl : null) != (Object)null)
				{
					ToggleMenu(!MenuVisible);
					if (MenuVisible)
					{
						UIManager.instance.inputModule.allowMouseInput = true;
					}
				}
			}
			if (MenuVisible)
			{
				Cursor.lockState = (CursorLockMode)0;
				Cursor.visible = true;
			}
		}

		private void CreateMenu()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: 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_01d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: 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_0244: Expected O, but got Unknown
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Expected O, but got Unknown
			//IL_026c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0276: Expected O, but got Unknown
			//IL_0285: Unknown result type (might be due to invalid IL or missing references)
			//IL_028f: Expected O, but got Unknown
			//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0307: Unknown result type (might be due to invalid IL or missing references)
			//IL_0311: Expected O, but got Unknown
			//IL_0334: Unknown result type (might be due to invalid IL or missing references)
			//IL_034f: 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_0067: Expected O, but got Unknown
			_canvas = new GameObject("BossPracticeCanvas");
			Object.DontDestroyOnLoad((Object)(object)_canvas);
			Canvas val = _canvas.AddComponent<Canvas>();
			val.renderMode = (RenderMode)0;
			_canvas.AddComponent<CanvasScaler>();
			_canvas.AddComponent<GraphicRaycaster>();
			if ((Object)(object)Object.FindFirstObjectByType<EventSystem>() == (Object)null)
			{
				GameObject val2 = new GameObject("EventSystem");
				Object.DontDestroyOnLoad((Object)(object)val2);
				val2.AddComponent<EventSystem>();
				val2.AddComponent<StandaloneInputModule>();
			}
			_panel = new GameObject("BossPracticePanel");
			_panel.transform.SetParent(_canvas.transform, false);
			Image val3 = _panel.AddComponent<Image>();
			((Graphic)val3).color = new Color(0f, 0f, 0f, 0.75f);
			RectTransform component = _panel.GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0.5f, 0.5f);
			component.anchorMax = new Vector2(0.5f, 0.5f);
			component.pivot = new Vector2(0.5f, 0.5f);
			component.sizeDelta = new Vector2(480f, 300f);
			component.anchoredPosition = Vector2.zero;
			_panel.transform.localScale = new Vector3(1.15f, 1.15f, 1f);
			AddLabel(_panel.transform, "Fifth Chorus Config", 22, new Vector2(0f, 110f), (TextAnchor)4);
			Button val4 = CreateButton(_panel.transform, "Free Play", new Vector2(-165f, 50f));
			Button val5 = CreateButton(_panel.transform, "Easy", new Vector2(-55f, 50f));
			Button val6 = CreateButton(_panel.transform, "Normal", new Vector2(55f, 50f));
			Button val7 = CreateButton(_panel.transform, "Hard", new Vector2(165f, 50f));
			((UnityEvent)val4.onClick).AddListener((UnityAction)delegate
			{
				SelectDifficulty(FifthChorusDifficulty.FreePlay);
			});
			((UnityEvent)val5.onClick).AddListener((UnityAction)delegate
			{
				SelectDifficulty(FifthChorusDifficulty.Easy);
			});
			((UnityEvent)val6.onClick).AddListener((UnityAction)delegate
			{
				SelectDifficulty(FifthChorusDifficulty.Normal);
			});
			((UnityEvent)val7.onClick).AddListener((UnityAction)delegate
			{
				SelectDifficulty(FifthChorusDifficulty.Hard);
			});
			_description = AddMultiline(_panel.transform, "Select a difficulty to see details.\nThen press Start to begin.", 16, new Vector2(0f, -30f), new Vector2(420f, 110f));
			_startBtn = CreateButton(_panel.transform, "Start", new Vector2(0f, -90f));
			((UnityEvent)_startBtn.onClick).AddListener((UnityAction)delegate
			{
				if (_selected.HasValue)
				{
					FifthChorusDifficulty value = _selected.Value;
					ModLog.Info(typeof(FifthChorusMenu), $"Start button clicked, selected={value}");
					((MonoBehaviour)this).StartCoroutine(StartSelected(value));
				}
			});
			((Selectable)_startBtn).interactable = false;
			AddLabel(_panel.transform, $"Toggle: {Plugin.PracticeMenuKey.Value}", 12, new Vector2(0f, -125f), (TextAnchor)4);
		}

		private void SelectDifficulty(FifthChorusDifficulty diff)
		{
			_selected = diff;
			_description.text = DifficultyDescription(diff);
			((Selectable)_startBtn).interactable = true;
		}

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

		private void ToggleMenu(bool visible)
		{
			MenuVisible = visible;
			if ((Object)(object)_panel != (Object)null)
			{
				_panel.SetActive(visible);
			}
			if ((Object)(object)_canvas != (Object)null)
			{
				_canvas.SetActive(visible);
			}
			if (!visible)
			{
				_selected = null;
				if ((Object)(object)_description != (Object)null)
				{
					_description.text = "Select a difficulty to see details.\nThen press Start to begin.";
				}
				if ((Object)(object)_startBtn != (Object)null)
				{
					((Selectable)_startBtn).interactable = false;
				}
			}
		}

		private static Button CreateButton(Transform parent, string text, Vector2 pos)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Expected O, but got Unknown
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(text + "Button");
			val.transform.SetParent(parent, false);
			Image val2 = val.AddComponent<Image>();
			((Graphic)val2).color = new Color(0.2f, 0.2f, 0.2f, 0.9f);
			RectTransform component = val.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(110f, 40f);
			component.anchoredPosition = pos;
			Vector2 val3 = default(Vector2);
			((Vector2)(ref val3))..ctor(0.5f, 0.5f);
			component.pivot = val3;
			Vector2 anchorMin = (component.anchorMax = val3);
			component.anchorMin = anchorMin;
			Button val5 = val.AddComponent<Button>();
			ColorBlock colors = ((Selectable)val5).colors;
			((ColorBlock)(ref colors)).normalColor = ((Graphic)val2).color;
			((ColorBlock)(ref colors)).highlightedColor = new Color(0.4f, 0.4f, 0.4f, 0.95f);
			((ColorBlock)(ref colors)).pressedColor = new Color(0.12f, 0.12f, 0.12f, 1f);
			((Selectable)val5).colors = colors;
			GameObject val6 = new GameObject("Text");
			val6.transform.SetParent(val.transform, false);
			Text val7 = val6.AddComponent<Text>();
			val7.text = text;
			val7.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			val7.alignment = (TextAnchor)4;
			((Graphic)val7).color = Color.white;
			RectTransform component2 = val6.GetComponent<RectTransform>();
			component2.anchorMin = Vector2.zero;
			component2.anchorMax = Vector2.one;
			component2.offsetMin = Vector2.zero;
			component2.offsetMax = Vector2.zero;
			return val5;
		}

		private static Text AddLabel(Transform parent, string text, int fontSize, Vector2 pos, TextAnchor align)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Label");
			val.transform.SetParent(parent, false);
			Text val2 = val.AddComponent<Text>();
			val2.text = text;
			val2.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			val2.fontSize = fontSize;
			val2.alignment = align;
			((Graphic)val2).color = Color.white;
			RectTransform component = val.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(440f, 30f);
			component.anchoredPosition = pos;
			Vector2 val3 = default(Vector2);
			((Vector2)(ref val3))..ctor(0.5f, 0.5f);
			component.pivot = val3;
			Vector2 anchorMin = (component.anchorMax = val3);
			component.anchorMin = anchorMin;
			return val2;
		}

		private static Text AddMultiline(Transform parent, string text, int fontSize, Vector2 pos, Vector2 size)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Description");
			val.transform.SetParent(parent, false);
			Text val2 = val.AddComponent<Text>();
			val2.text = text;
			val2.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			val2.fontSize = fontSize;
			val2.alignment = (TextAnchor)0;
			((Graphic)val2).color = Color.white;
			val2.horizontalOverflow = (HorizontalWrapMode)0;
			val2.verticalOverflow = (VerticalWrapMode)0;
			RectTransform component = val.GetComponent<RectTransform>();
			component.sizeDelta = size;
			component.anchoredPosition = pos;
			Vector2 val3 = default(Vector2);
			((Vector2)(ref val3))..ctor(0.5f, 0.5f);
			component.pivot = val3;
			Vector2 anchorMin = (component.anchorMax = val3);
			component.anchorMin = anchorMin;
			return val2;
		}

		private static string DifficultyDescription(FifthChorusDifficulty d)
		{
			return d switch
			{
				FifthChorusDifficulty.FreePlay => "Free Play:\n• Use your current save’s gear, tools, masks, and silk.\n• No changes applied.", 
				FifthChorusDifficulty.Easy => "Easy:\n• 7 masks, 9 silk\n• No upgrades", 
				FifthChorusDifficulty.Normal => "Normal:\n• 6 masks, 9 silk\n• No upgrades, no extra silk skills", 
				FifthChorusDifficulty.Hard => "Hard:\n• 5 masks, 9 silk\n• No tools, no upgrades, no extra silk skills", 
				_ => "", 
			};
		}
	}
}
namespace FifthChorus.Systems
{
	public enum FifthChorusDifficulty
	{
		FreePlay,
		Easy,
		Normal,
		Hard
	}
	internal static class FifthChorusDifficultyConfig
	{
		[CompilerGenerated]
		private sealed class <TeleportToFourthChorus>d__15 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public FifthChorusDifficulty diff;

			private PlayerData <pd>5__1;

			private FifthChorusDifficulty <>s__2;

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

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

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

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

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					ModLog.Info(typeof(FifthChorusDifficultyConfig), $"Warping to Fourth Chorus (diff={diff})");
					if (firstInit)
					{
						<pd>5__1 = PlayerData.instance;
						<pd>5__1.ShellShards = 9999;
						baseNailUpgrades = <pd>5__1.nailUpgrades;
						baseToolPouchUpgrades = <pd>5__1.ToolPouchUpgrades;
						baseToolKitUpgrades = <pd>5__1.ToolKitUpgrades;
						baseMaxHealth = <pd>5__1.maxHealth;
						baseMaxSilk = <pd>5__1.silkMax;
						baseHasDash = <pd>5__1.hasDash;
						baseHasBrolly = <pd>5__1.hasBrolly;
						baseHasWallJump = <pd>5__1.hasWalljump;
						baseHasDoubleJump = <pd>5__1.hasDoubleJump;
						baseHasSuperJump = <pd>5__1.hasSuperJump;
						baseHasHarpoonDash = <pd>5__1.hasHarpoonDash;
						baseSilkRegen = <pd>5__1.silkRegenMax;
						firstInit = false;
						<pd>5__1 = null;
					}
					SetupFourthChorusBase();
					FifthChorusDifficulty fifthChorusDifficulty = diff;
					<>s__2 = fifthChorusDifficulty;
					switch (<>s__2)
					{
					case FifthChorusDifficulty.FreePlay:
						SetupFreePlay();
						break;
					case FifthChorusDifficulty.Easy:
						SetupEasy();
						break;
					case FifthChorusDifficulty.Normal:
						SetupNormal();
						break;
					case FifthChorusDifficulty.Hard:
						SetupHard();
						break;
					}
					<>2__current = SceneTransitionUtil.DoTransition("Bone_East_08", "right1");
					<>1__state = 1;
					return true;
				}
				case 1:
					<>1__state = -1;
					return false;
				}
			}

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

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

		private const string FourthChorusScene = "Bone_East_08";

		private const string FourthChorusGate = "right1";

		public static bool firstInit = true;

		private static int baseNailUpgrades;

		private static int baseToolPouchUpgrades;

		private static int baseToolKitUpgrades;

		private static int baseMaxHealth;

		private static int baseMaxSilk;

		private static int baseSilkRegen;

		private static bool baseHasDash;

		private static bool baseHasBrolly;

		private static bool baseHasWallJump;

		private static bool baseHasDoubleJump;

		private static bool baseHasSuperJump;

		private static bool baseHasHarpoonDash;

		[IteratorStateMachine(typeof(<TeleportToFourthChorus>d__15))]
		public static IEnumerator TeleportToFourthChorus(FifthChorusDifficulty diff)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <TeleportToFourthChorus>d__15(0)
			{
				diff = diff
			};
		}

		private static void SetupFourthChorusBase()
		{
			PlayerData instance = PlayerData.instance;
			instance.defeatedSongGolem = false;
			instance.destroyedSongGolemRock = false;
			instance.encounteredSongGolem = false;
		}

		private static void SetupFreePlay()
		{
			PlayerData instance = PlayerData.instance;
			PlayerStateUtils.SetMasks(baseMaxHealth);
			PlayerStateUtils.SetSilk(baseMaxSilk);
			instance.nailUpgrades = baseNailUpgrades;
			instance.ToolPouchUpgrades = baseToolPouchUpgrades;
			instance.ToolKitUpgrades = baseToolKitUpgrades;
			instance.hasDash = baseHasDash;
			instance.hasBrolly = baseHasBrolly;
			instance.hasWalljump = baseHasWallJump;
			instance.hasDoubleJump = baseHasDoubleJump;
			instance.hasSuperJump = baseHasSuperJump;
			instance.hasHarpoonDash = baseHasHarpoonDash;
			instance.silkRegenMax = baseSilkRegen;
			PlayMakerFSM.BroadcastEvent("UPDATE NAIL DAMAGE");
			PlayerStateUtils.RefreshMasks();
			PlayerStateUtils.RefreshSpool();
		}

		private static void SetupEasy()
		{
			PlayerData instance = PlayerData.instance;
			instance.hasDash = true;
			instance.hasBrolly = true;
			PlayerStateUtils.SetMasks(7);
			PlayerStateUtils.SetSilk(9);
			PlayerStateUtils.DisableUpgrades();
		}

		private static void SetupNormal()
		{
			PlayerData instance = PlayerData.instance;
			instance.hasDash = true;
			instance.hasBrolly = true;
			PlayerStateUtils.SetMasks(6);
			PlayerStateUtils.SetSilk(9);
			PlayerStateUtils.DisableUpgrades();
			PlayerStateUtils.DisableSilkSkills();
		}

		private static void SetupHard()
		{
			PlayerData instance = PlayerData.instance;
			instance.hasDash = true;
			instance.hasBrolly = true;
			PlayerStateUtils.SetMasks(5);
			PlayerStateUtils.SetSilk(9);
			PlayerStateUtils.DisableUpgrades();
			PlayerStateUtils.DisableSilkSkills();
			PlayerStateUtils.RemoveAllTools();
		}
	}
	internal static class PlayerStateUtils
	{
		public static void SetMasks(int newMax)
		{
			PlayerData instance = PlayerData.instance;
			int maxHealth = instance.maxHealth;
			if (newMax > maxHealth)
			{
				int num = newMax - maxHealth;
				for (int i = 0; i < num; i++)
				{
					instance.MaxHealth();
					instance.AddToMaxHealth(1);
				}
			}
			else if (newMax < maxHealth)
			{
				int num2 = maxHealth - newMax;
				for (int j = 0; j < num2; j++)
				{
					instance.maxHealth--;
					instance.maxHealthBase--;
					instance.health = Math.Min(instance.health, instance.maxHealth);
				}
			}
			RefreshMasks();
		}

		public static void RefreshMasks()
		{
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			Transform transform = ((Component)GameCameras.instance.hudCanvasSlideOut).transform;
			GameObject val = null;
			for (int i = 0; i < transform.childCount; i++)
			{
				GameObject gameObject = ((Component)transform.GetChild(i)).gameObject;
				if (((Object)gameObject).name == "Health")
				{
					val = gameObject;
					break;
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			PlayMakerFSM val2 = FSMUtility.LocateMyFSM(val, "Low Health FX");
			val2.FsmVariables.FindFsmGameObject("Health 1").Value.transform.localPosition = val2.FsmVariables.FindFsmVector3("H1 Initial Pos").Value;
			val2.SetState("Check Health");
			PlayMakerFSM[] componentsInChildren = val.GetComponentsInChildren<PlayMakerFSM>();
			foreach (PlayMakerFSM val3 in componentsInChildren)
			{
				if (!(val3.FsmName != "health_display"))
				{
					if (((Component)val3).gameObject.activeSelf)
					{
						val3.Fsm.OnEnable();
					}
					else
					{
						((Component)val3).gameObject.SetActive(true);
					}
					val3.FsmVariables.FindFsmBool("Initialised").Value = true;
					val3.SetState("Check Max HP");
				}
			}
		}

		public static void SetSilk(int newMax)
		{
			PlayerData instance = PlayerData.instance;
			HeroController instance2 = HeroController.instance;
			int silkMax = instance.silkMax;
			if (newMax > silkMax)
			{
				int num = newMax - silkMax;
				for (int i = 0; i < num; i++)
				{
					instance2.AddToMaxSilk(1);
				}
			}
			else if (newMax < silkMax)
			{
				int num2 = silkMax - newMax;
				for (int j = 0; j < num2; j++)
				{
					instance.silkMax--;
					instance.silk = Math.Min(instance.silk, instance.silkMax);
				}
			}
			RefreshSpool();
			instance.IsSilkSpoolBroken = false;
			EventRegister.SendEvent("SPOOL UNBROKEN", (GameObject)null);
		}

		public static void RefreshSpool()
		{
			SilkSpool silkSpool = GameCameras.instance.silkSpool;
			silkSpool.DrawSpool();
		}

		public static void DisableUpgrades()
		{
			PlayerData instance = PlayerData.instance;
			instance.ToolKitUpgrades = 0;
			instance.ToolPouchUpgrades = 0;
			instance.nailUpgrades = 0;
			PlayMakerFSM.BroadcastEvent("UPDATE NAIL DAMAGE");
		}

		public static void DisableSilkSkills()
		{
			PlayerData instance = PlayerData.instance;
			instance.hasHarpoonDash = false;
			instance.hasWalljump = false;
			instance.hasDoubleJump = false;
			instance.hasSuperJump = false;
			instance.silkRegenMax = 1;
		}

		public static void RemoveAllTools()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			PlayerData instance = PlayerData.instance;
			ToolCrest crestByName = ToolItemManager.GetCrestByName(instance.CurrentCrestID);
			ToolItemManager.AutoEquip(crestByName, false, true);
			instance.ExtraToolEquips = new FloatingCrestSlotsData();
		}
	}
	internal static class SceneTransitionUtil
	{
		[CompilerGenerated]
		private sealed class <DoTransition>d__0 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public string scene;

			public string gate;

			private AudioSourceFadeControl[] <>s__1;

			private int <>s__2;

			private AudioSourceFadeControl <src>5__3;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				//IL_0025: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0045: Expected O, but got Unknown
				//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00db: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ec: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					ScreenFaderUtils.Fade(ScreenFaderUtils.GetColour(), Color.black, 1f);
					<>2__current = (object)new WaitForSeconds(2f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					<>s__1 = Object.FindObjectsByType<AudioSourceFadeControl>((FindObjectsInactive)1, (FindObjectsSortMode)0);
					for (<>s__2 = 0; <>s__2 < <>s__1.Length; <>s__2++)
					{
						<src>5__3 = <>s__1[<>s__2];
						<src>5__3.FadeDown();
						<src>5__3 = null;
					}
					<>s__1 = null;
					GameManager.instance.BeginSceneTransition(new SceneLoadInfo
					{
						SceneName = scene,
						EntryGateName = gate,
						Visualization = (SceneLoadVisualizations)0,
						PreventCameraFadeOut = true
					});
					return false;
				}
			}

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

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

		[IteratorStateMachine(typeof(<DoTransition>d__0))]
		public static IEnumerator DoTransition(string scene, string gate)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DoTransition>d__0(0)
			{
				scene = scene,
				gate = gate
			};
		}
	}
}
namespace FifthChorus.Patches
{
	internal static class InputCursorPatches
	{
		[HarmonyPatch(typeof(InputHandler), "SetCursorEnabled")]
		internal static class Patch_SetCursorEnabled
		{
			[HarmonyPrefix]
			private static bool Prefix(ref bool isEnabled)
			{
				if (FifthChorusMenu.MenuVisible)
				{
					isEnabled = true;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(InputHandler), "Update")]
		internal static class Patch_InputHandler_Update
		{
			[HarmonyPostfix]
			private static void Postfix()
			{
				if (FifthChorusMenu.MenuVisible)
				{
					Cursor.visible = true;
					Cursor.lockState = (CursorLockMode)0;
				}
			}
		}
	}
	[HarmonyPatch(typeof(Language), "Get", new Type[]
	{
		typeof(string),
		typeof(string)
	})]
	internal static class LanguagePatches
	{
		[HarmonyPostfix]
		private static void PatchText(string key, string sheetTitle, ref string __result)
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Invalid comparison between Unknown and I4
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Invalid comparison between Unknown and I4
			ModLog.Debug(typeof(LanguagePatches), "Language.Get called with key='" + key + "', sheetTitle='" + sheetTitle + "', original result='" + __result + "'");
			if (key == "SONG_GOLEM_SUPER")
			{
				LanguageCode val = Language.CurrentLanguage();
				if ((int)val == 44)
				{
					__result = "Fifth";
					ModLog.Info(typeof(LanguagePatches), "Patched SONG_GOLEM_SUPER text to '" + __result + "'");
				}
			}
			if (key == "ARCHITECT_MELODY_GAINED")
			{
				LanguageCode val2 = Language.CurrentLanguage();
				if (!(sheetTitle != "Under") && (int)val2 == 44)
				{
					__result = "<hpage>Master, in my travels I met a large construct of fine design. Shaped for song and combat both. Their craft bears your mark. Tell me, why were they made?<page>Chorus units, yes. Harmony, purpose, p-p-pattern. Directive demanded their creation not by choice, by code. To b-b-build as commanded, to sing for Pharloom eternal.<page>But one failed its song, silenced by a warrior beyond the Citadel’s reach. The loss brought shame, retribution was required.<hpage>Retribution? In what sense?<page>Directive: replace. Improve. The next must surpass all before it. Swift, unyielding, p-p-perfect. It would silence what the others could not.<page>It was the...";
				}
			}
		}
	}
	internal static class PostLoadPatches
	{
		[CompilerGenerated]
		private sealed class <OnReturnToMenu>d__3 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public IEnumerator result;

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

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

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

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

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (result.MoveNext())
				{
					<>2__current = result.Current;
					<>1__state = 1;
					return true;
				}
				_lateHarmony.UnpatchSelf();
				return false;
			}

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

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

		private static Harmony _lateHarmony;

		internal static void Initialize()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			_lateHarmony = new Harmony("com.prodigg.silksongtestmod.late");
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(GameManager), "SetLoadedGameData", new Type[]
		{
			typeof(SaveGameData),
			typeof(int)
		})]
		private static void OnGameLoaded(GameManager __instance)
		{
			__instance.GetSaveStatsForSlot(PlayerData.instance.profileID, (Action<SaveStats, string>)delegate
			{
				_lateHarmony.PatchAll(typeof(LanguagePatches));
			});
		}

		[IteratorStateMachine(typeof(<OnReturnToMenu>d__3))]
		[HarmonyPostfix]
		[HarmonyPatch(typeof(GameManager), "ReturnToMainMenu")]
		private static IEnumerator OnReturnToMenu(IEnumerator result)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <OnReturnToMenu>d__3(0)
			{
				result = result
			};
		}
	}
	internal static class SaveGamePatches
	{
		[HarmonyPatch(typeof(GameManager), "SaveGame", new Type[]
		{
			typeof(int),
			typeof(Action<bool>),
			typeof(bool),
			typeof(AutoSaveName)
		})]
		internal static class Patch_SaveGame_Nullify
		{
			[HarmonyPrefix]
			private static bool Prefix(int saveSlot, Action<bool> ogCallback, bool withAutoSave, AutoSaveName autoSaveName)
			{
				//IL_001c: Unknown result type (might be due to invalid IL or missing references)
				ModLog.Warn(typeof(Patch_SaveGame_Nullify), $"Blocked GameManager.SaveGame(slot={saveSlot}, auto={withAutoSave}, name={autoSaveName}). " + "Fifth Chorus mod keeps saves unchanged.");
				ogCallback?.Invoke(obj: true);
				return false;
			}
		}
	}
}
namespace FifthChorus.Patches.FSM
{
	internal class FifthChorusCameraControlPatcher
	{
		public static void TryPatch(PlayMakerFSM __instance)
		{
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Expected O, but got Unknown
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: 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_016f: Expected O, but got Unknown
			GameObject val = ((__instance != null) ? ((Component)__instance).gameObject : null);
			if ((Object)(object)val == (Object)null || !((Object)val).name.StartsWith("Boss Scene", StringComparison.OrdinalIgnoreCase) || !string.Equals(__instance.FsmName, "Camera Control", StringComparison.OrdinalIgnoreCase))
			{
				return;
			}
			ModLog.Info(typeof(FifthChorusCameraControlPatcher), "Patching Boss Scene Camera Control FSM");
			try
			{
				Fsm fsm = __instance.Fsm;
				FsmState state = fsm.GetState("Rock Lock");
				if (state == null)
				{
					ModLog.Warn(typeof(FifthChorusCameraControlPatcher), "There was no state named Rock Lock. Aborting patch");
					return;
				}
				state.Transitions = state.Transitions.Append(new FsmTransition
				{
					FsmEvent = FsmEvent.GetFsmEvent("Lock Camera"),
					ToState = "Bot Lock",
					ToFsmState = fsm.GetState("Bot Lock")
				}).ToArray();
				FsmState state2 = fsm.GetState("State 1");
				if (state2 == null)
				{
					ModLog.Warn(typeof(FifthChorusCameraControlPatcher), "There was no state named State 1. Aborting patch");
					return;
				}
				state2.Transitions = state2.Transitions.Append(new FsmTransition
				{
					FsmEvent = FsmEvent.GetFsmEvent("Lock Camera"),
					ToState = "Bot Lock",
					ToFsmState = fsm.GetState("Bot Lock")
				}).ToArray();
				FsmDebugUtils.LogAllDataInFSM(fsm);
				ModLog.Info(typeof(FifthChorusCameraControlPatcher), "Patched Camera Control FSM");
			}
			catch (Exception arg)
			{
				ModLog.Error(typeof(FifthChorusCameraControlPatcher), $"Exception while patching FSM: {arg}");
			}
		}
	}
	internal static class FifthChorusControlPatcher
	{
		public static void TryPatch(PlayMakerFSM __instance)
		{
			GameObject val = ((__instance != null) ? ((Component)__instance).gameObject : null);
			if ((Object)(object)val == (Object)null || !((Object)val).name.StartsWith("song_golem", StringComparison.OrdinalIgnoreCase) || !string.Equals(__instance.FsmName, "Control", StringComparison.OrdinalIgnoreCase))
			{
				return;
			}
			ModLog.Info(typeof(FifthChorusControlPatcher), "Patching song_golem Control FSM");
			try
			{
				Fsm fsm = __instance.Fsm;
				FsmUtils.EnsureVariable(fsm, typeof(FsmString), "LastSlam");
				FsmUtils.EnsureVariable(fsm, typeof(FsmInt), "AimSlamCount");
				FsmUtils.EnsureEvent(fsm, "P5");
				FsmUtils.EnsureEvent(fsm, "Lock Camera", isGlobal: true);
				CreatePhase5(fsm);
				PatchPunchState(fsm);
				PatchPhaseCheck(fsm);
				PatchPhase1(fsm);
				PatchPhase2(fsm);
				PatchPhase3(fsm);
				PatchPhase4(fsm);
				PatchHandSlamAntic(fsm);
				PatchAimSlam(fsm);
				PatchSummon2(fsm);
				FsmDebugUtils.LogAllDataInFSM(fsm);
				ModLog.Info(typeof(FifthChorusControlPatcher), "Patched song_golem Control FSM");
			}
			catch (Exception arg)
			{
				ModLog.Error(typeof(FifthChorusControlPatcher), $"Exception while patching FSM: {arg}");
			}
		}

		private static SendEventByName DuplicateSendEventByNameAction(SendEventByName original, FsmFloat newDelay)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			return new SendEventByName
			{
				eventTarget = original.eventTarget,
				sendEvent = original.sendEvent,
				delay = newDelay,
				everyFrame = original.everyFrame
			};
		}

		private static void PatchPunchState(Fsm fsm)
		{
			FsmState state = fsm.GetState("Punch");
			if (state == null)
			{
				ModLog.Warn(typeof(FifthChorusControlPatcher), "There was no state named Punch. Aborting patch");
				return;
			}
			List<SendEventByName> list = (from a in state.Actions.OfType<SendEventByName>()
				where a.sendEvent.Value == "DROP"
				select a).ToList();
			List<FsmStateAction> list2 = new List<FsmStateAction>();
			int i;
			for (i = 0; i < state.Actions.Length; i++)
			{
				FsmStateAction obj = state.Actions[i];
				SendEventByName val = (SendEventByName)(object)((obj is SendEventByName) ? obj : null);
				if (val != null && val.sendEvent.Value == "DROP")
				{
					break;
				}
				list2.Add(state.Actions[i]);
			}
			foreach (SendEventByName item in list)
			{
				list2.Add((FsmStateAction)(object)DuplicateSendEventByNameAction(item, FsmFloat.op_Implicit(0f)));
				list2.Add((FsmStateAction)(object)DuplicateSendEventByNameAction(item, FsmFloat.op_Implicit(0f)));
				list2.Add((FsmStateAction)(object)DuplicateSendEventByNameAction(item, FsmFloat.op_Implicit(0f)));
			}
			for (i += list.Count; i < state.Actions.Length; i++)
			{
				list2.Add(state.Actions[i]);
			}
			state.Actions = list2.ToArray();
			Wait val2 = state.Actions.OfType<Wait>().FirstOrDefault();
			if (val2 != null)
			{
				val2.time = FsmFloat.op_Implicit(0.9f);
			}
			ModLog.Info(typeof(FifthChorusControlPatcher), "Successfully patched Punch state.");
		}

		private static void PatchPhaseCheck(Fsm fsm)
		{
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: 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_00e9: Expected O, but got Unknown
			FsmState state = fsm.GetState("Phase Check");
			if (state == null)
			{
				ModLog.Warn(typeof(FifthChorusControlPatcher), "There was no state named Phase Check. Aborting patch");
				return;
			}
			IntSwitch val = state.Actions.OfType<IntSwitch>().FirstOrDefault();
			if (val != null)
			{
				FsmInt[] array = val.compareTo;
				Array.Resize(ref array, array.Length + 1);
				array[^1] = FsmInt.op_Implicit(5);
				val.compareTo = array;
				FsmEvent[] array2 = val.sendEvent;
				Array.Resize(ref array2, array2.Length + 1);
				array2[^1] = FsmEvent.GetFsmEvent("P5");
				val.sendEvent = array2;
			}
			state.Transitions = FsmUtils.AppendTransition(state.Transitions, new FsmTransition
			{
				FsmEvent = FsmEvent.GetFsmEvent("P5"),
				ToState = "P5",
				ToFsmState = fsm.GetState("P5")
			});
			ModLog.Info(typeof(FifthChorusControlPatcher), "Successfully patched Phase Check.");
		}

		private static void PatchPhase1(Fsm fsm)
		{
			FsmState state = fsm.GetState("P1");
			if (state == null)
			{
				ModLog.Warn(typeof(FifthChorusControlPatcher), "There was no state named P1. Aborting patch");
				return;
			}
			SetFloatValue val = state.Actions.OfType<SetFloatValue>().FirstOrDefault((Func<SetFloatValue, bool>)((SetFloatValue a) => ((NamedVariable)a.floatVariable).Name == "Idle Time"));
			if (val != null)
			{
				val.floatValue = FsmFloat.op_Implicit(0.1f);
			}
			SendRandomEventV4 val2 = state.Actions.OfType<SendRandomEventV4>().FirstOrDefault();
			if (val2 != null)
			{
				val2.weights = (FsmFloat[])(object)new FsmFloat[3]
				{
					FsmFloat.op_Implicit(1f),
					FsmFloat.op_Implicit(0f),
					FsmFloat.op_Implicit(0f)
				};
			}
			ModLog.Info(typeof(FifthChorusControlPatcher), "Successfully patched Phase 1.");
		}

		private static void PatchPhase2(Fsm fsm)
		{
			FsmState state = fsm.GetState("P2");
			if (state == null)
			{
				ModLog.Warn(typeof(FifthChorusControlPatcher), "There was no state named P2. Aborting patch");
				return;
			}
			SetFloatValue val = state.Actions.OfType<SetFloatValue>().FirstOrDefault((Func<SetFloatValue, bool>)((SetFloatValue a) => ((NamedVariable)a.floatVariable).Name == "Idle Time"));
			if (val != null)
			{
				val.floatValue = FsmFloat.op_Implicit(0.2f);
			}
			SendRandomEventV4 val2 = state.Actions.OfType<SendRandomEventV4>().FirstOrDefault();
			if (val2 != null)
			{
				val2.weights = (FsmFloat[])(object)new FsmFloat[4]
				{
					FsmFloat.op_Implicit(1f),
					FsmFloat.op_Implicit(0f),
					FsmFloat.op_Implicit(0f),
					FsmFloat.op_Implicit(0f)
				};
				val2.eventMax = (FsmInt[])(object)new FsmInt[4]
				{
					FsmInt.op_Implicit(1),
					FsmInt.op_Implicit(0),
					FsmInt.op_Implicit(0),
					FsmInt.op_Implicit(1)
				};
				val2.missedMax = (FsmInt[])(object)new FsmInt[4]
				{
					FsmInt.op_Implicit(1),
					FsmInt.op_Implicit(99),
					FsmInt.op_Implicit(99),
					FsmInt.op_Implicit(1)
				};
			}
			ModLog.Info(typeof(FifthChorusControlPatcher), "Successfully patched Phase 2.");
		}

		private static void PatchPhase3(Fsm fsm)
		{
			FsmState state = fsm.GetState("P3");
			if (state == null)
			{
				ModLog.Warn(typeof(FifthChorusControlPatcher), "There was no state named P3. Aborting patch");
				return;
			}
			SetFloatValue val = state.Actions.OfType<SetFloatValue>().FirstOrDefault((Func<SetFloatValue, bool>)((SetFloatValue a) => ((NamedVariable)a.floatVariable).Name == "Idle Time"));
			if (val != null)
			{
				val.floatValue = FsmFloat.op_Implicit(0.15f);
			}
			SendRandomEventV4 val2 = state.Actions.OfType<SendRandomEventV4>().FirstOrDefault();
			if (val2 != null)
			{
				val2.weights = (FsmFloat[])(object)new FsmFloat[4]
				{
					FsmFloat.op_Implicit(1f),
					FsmFloat.op_Implicit(0f),
					FsmFloat.op_Implicit(0f),
					FsmFloat.op_Implicit(0f)
				};
				val2.eventMax = (FsmInt[])(object)new FsmInt[4]
				{
					FsmInt.op_Implicit(2),
					FsmInt.op_Implicit(0),
					FsmInt.op_Implicit(0),
					FsmInt.op_Implicit(1)
				};
				val2.missedMax = (FsmInt[])(object)new FsmInt[4]
				{
					FsmInt.op_Implicit(1),
					FsmInt.op_Implicit(99),
					FsmInt.op_Implicit(99),
					FsmInt.op_Implicit(2)
				};
			}
			ModLog.Info(typeof(FifthChorusControlPatcher), "Successfully patched Phase 3.");
		}

		private static void PatchPhase4(Fsm fsm)
		{
			FsmState state = fsm.GetState("P4");
			if (state == null)
			{
				ModLog.Warn(typeof(FifthChorusControlPatcher), "There was no state named P4. Aborting patch");
				return;
			}
			SetFloatValue val = state.Actions.OfType<SetFloatValue>().FirstOrDefault((Func<SetFloatValue, bool>)((SetFloatValue a) => ((NamedVariable)a.floatVariable).Name == "Idle Time"));
			if (val != null)
			{
				val.floatValue = FsmFloat.op_Implicit(0.15f);
			}
			SendRandomEventV4 val2 = state.Actions.OfType<SendRandomEventV4>().FirstOrDefault();
			if (val2 != null)
			{
				val2.weights = (FsmFloat[])(object)new FsmFloat[3]
				{
					FsmFloat.op_Implicit(1f),
					FsmFloat.op_Implicit(0f),
					FsmFloat.op_Implicit(0f)
				};
				val2.eventMax = (FsmInt[])(object)new FsmInt[3]
				{
					FsmInt.op_Implicit(99),
					FsmInt.op_Implicit(0),
					FsmInt.op_Implicit(0)
				};
				val2.missedMax = (FsmInt[])(object)new FsmInt[3]
				{
					FsmInt.op_Implicit(99),
					FsmInt.op_Implicit(99),
					FsmInt.op_Implicit(99)
				};
			}
			ModLog.Info(typeof(FifthChorusControlPatcher), "Successfully patched Phase 4.");
		}

		private static void CreatePhase5(Fsm fsm)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected O, but got Unknown
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			//IL_0152: 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_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Expected O, but got Unknown
			//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_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Expected O, but got Unknown
			FsmState val = new FsmState(fsm)
			{
				Name = "P5"
			};
			fsm.States = fsm.States.Append(val).ToArray();
			SetFloatValue val2 = new SetFloatValue
			{
				floatVariable = fsm.Variables.GetFsmFloat("Idle Time"),
				floatValue = FsmFloat.op_Implicit(0.15f)
			};
			SendRandomEventV4 val3 = new SendRandomEventV4();
			val3.events = (FsmEvent[])(object)new FsmEvent[2]
			{
				((IEnumerable<FsmEvent>)fsm.Events).FirstOrDefault((Func<FsmEvent, bool>)((FsmEvent e) => string.Equals(e.Name, "AIM SLAM", StringComparison.Ordinal))),
				((IEnumerable<FsmEvent>)fsm.Events).FirstOrDefault((Func<FsmEvent, bool>)((FsmEvent e) => string.Equals(e.Name, "COAL BARRAGE", StringComparison.Ordinal)))
			};
			val3.weights = (FsmFloat[])(object)new FsmFloat[2]
			{
				FsmFloat.op_Implicit(1f),
				FsmFloat.op_Implicit(0f)
			};
			val3.eventMax = (FsmInt[])(object)new FsmInt[2]
			{
				FsmInt.op_Implicit(2),
				FsmInt.op_Implicit(1)
			};
			val3.missedMax = (FsmInt[])(object)new FsmInt[2]
			{
				FsmInt.op_Implicit(1),
				FsmInt.op_Implicit(1)
			};
			val3.activeBool = FsmBool.op_Implicit(false);
			SendRandomEventV4 val4 = val3;
			val.Actions = (FsmStateAction[])(object)new FsmStateAction[2]
			{
				(FsmStateAction)val2,
				(FsmStateAction)val4
			};
			val.Transitions = (FsmTransition[])(object)new FsmTransition[2]
			{
				new FsmTransition
				{
					FsmEvent = ((IEnumerable<FsmEvent>)fsm.Events).FirstOrDefault((Func<FsmEvent, bool>)((FsmEvent e) => string.Equals(e.Name, "AIM SLAM", StringComparison.Ordinal))),
					ToState = "Aim Slam",
					ToFsmState = fsm.GetState("Aim Slam")
				},
				new FsmTransition
				{
					FsmEvent = ((IEnumerable<FsmEvent>)fsm.Events).FirstOrDefault((Func<FsmEvent, bool>)((FsmEvent e) => string.Equals(e.Name, "COAL BARRAGE", StringComparison.Ordinal))),
					ToState = "Punch Antic",
					ToFsmState = fsm.GetState("Punch Antic")
				}
			};
		}

		private static void PatchHandSlamAntic(Fsm fsm)
		{
			FsmState state = fsm.GetState("HandSlam Antic");
			if (state == null)
			{
				ModLog.Warn(typeof(FifthChorusControlPatcher), "There was no state named Hand Slam Antic. Aborting patch");
			}
			Wait val = state.Actions.OfType<Wait>().FirstOrDefault();
			if (val != null)
			{
				val.time = FsmFloat.op_Implicit(0.4f);
			}
			ModLog.Info(typeof(FifthChorusControlPatcher), "Successfully patched Hand Slam Antic state.");
		}

		private static void PatchAimSlam(Fsm fsm)
		{
			FsmState state = fsm.GetState("Aim Slam");
			if (state == null)
			{
				ModLog.Warn(typeof(FifthChorusControlPatcher), "There was no state named Aim Slam. Aborting patch");
				return;
			}
			FsmStateAction val = state.Actions.FirstOrDefault();
			if (val != null)
			{
				state.Actions = (FsmStateAction[])(object)new FsmStateAction[1] { val };
			}
			AimSlamSelectAndSend item = new AimSlamSelectAndSend
			{
				heroX = state.Actions.OfType<GetPosition>().FirstOrDefault()?.x,
				lastSlam = VariableExtensionsGeneric.GetVariable<FsmString>((object)fsm, "LastSlam"),
				phase = fsm.Variables.GetFsmInt("Phase"),
				aimSlamCount = fsm.Variables.GetFsmInt("AimSlamCount")
			};
			List<FsmStateAction> list = state.Actions.ToList();
			list.Add((FsmStateAction)(object)item);
			state.Actions = list.ToArray();
			ModLog.Info(typeof(FifthChorusControlPatcher), "Successfully patched Aim Slam state.");
		}

		private static void PatchSummon2(Fsm fsm)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Expected O, but got Unknown
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Expected O, but got Unknown
			FsmState state = fsm.GetState("Summon 2");
			if (state == null)
			{
				ModLog.Warn(typeof(FifthChorusControlPatcher), "There was no state named Summon 2. Aborting patch");
				return;
			}
			FsmGameObject fsmGameObject = fsm.Variables.GetFsmGameObject("Head");
			SetInvincibilityDirection item = new SetInvincibilityDirection
			{
				gameObject = new FsmOwnerDefault
				{
					OwnerOption = (OwnerDefaultOption)1,
					GameObject = fsmGameObject
				},
				invincibilityDirection = new FsmInt
				{
					Value = 0
				}
			};
			List<FsmStateAction> list = state.Actions.ToList();
			list.Add((FsmStateAction)(object)item);
			state.Actions = list.ToArray();
			ModLog.Info(typeof(FifthChorusControlPatcher), "Successfully patched Summon 2 state.");
		}
	}
	internal static class FifthChorusEnvironmentPatcher
	{
		public static void TryPatch(PlayMakerFSM __instance)
		{
			try
			{
				RemoveUpdraftRegion(__instance);
			}
			catch (Exception arg)
			{
				ModLog.Error(typeof(FifthChorusEnvironmentPatcher), $"Exception while patching environment FSMs: {arg}");
			}
		}

		private static void RemoveUpdraftRegion(PlayMakerFSM __instance)
		{
			GameObject val = ((__instance != null) ? ((Component)__instance).gameObject : null);
			if (!((Object)(object)val == (Object)null) && (((Object)val).name.Equals("Updraft Region", StringComparison.OrdinalIgnoreCase) || ((Object)val).name.Equals("Updraft Region (1)", StringComparison.OrdinalIgnoreCase)) && string.Equals(__instance.FsmName, "Control", StringComparison.OrdinalIgnoreCase))
			{
				ModLog.Info(typeof(FifthChorusCameraControlPatcher), "Patching " + ((Object)val).name);
				val.SetActive(false);
				ModLog.Info(typeof(FifthChorusCameraControlPatcher), "Patched " + ((Object)val).name);
			}
		}
	}
	internal static class FifthChorusHeadPatcher
	{
		public static void TryPatch(PlayMakerFSM __instance)
		{
			GameObject val = ((__instance != null) ? ((Component)__instance).gameObject : null);
			if ((Object)(object)val == (Object)null || !((Object)val).name.StartsWith("SG_head", StringComparison.OrdinalIgnoreCase))
			{
				return;
			}
			ModLog.Info(typeof(FifthChorusHeadPatcher), "Patching song_golem_head object");
			HealthManager component = val.GetComponent<HealthManager>();
			if ((Object)(object)component == (Object)null)
			{
				return;
			}
			component.hp = 515;
			ModLog.Error(typeof(FifthChorusCameraControlPatcher), $"HealthManager found: Starting Health = {component.hp}");
			component.IsInvincible = true;
			ModLog.Info(typeof(FifthChorusHeadPatcher), $"Patched song_golem_head HealthManager: InvincibleFromDirection = {component.InvincibleFromDirection}, IsInvincible = {component.IsInvincible}");
			try
			{
				ModLog.Info(typeof(FifthChorusHeadPatcher), "Patching song_golem_head FSMs");
				Fsm fsm = __instance.Fsm;
				PatchFourthChorusHeadExplosionFSM(fsm);
				PatchFourthChorusHeadPhaseControl(fsm);
				FsmDebugUtils.LogAllDataInFSM(fsm);
				ModLog.Info(typeof(FifthChorusCameraControlPatcher), "Patched song_golem_head FSMs");
			}
			catch (Exception arg)
			{
				ModLog.Error(typeof(FifthChorusCameraControlPatcher), $"Exception while patching FSM: {arg}");
			}
		}

		private static void PatchFourthChorusHeadPhaseControl(Fsm fsm)
		{
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Expected O, but got Unknown
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Expected O, but got Unknown
			if (!string.Equals(fsm.Name, "Phase Control", StringComparison.OrdinalIgnoreCase))
			{
				return;
			}
			ModLog.Info(typeof(FifthChorusCameraControlPatcher), "Patching song_golem_head Control FSM");
			GameObject val = GameObject.Find("DropBomb Rock SG");
			GameObject obj = GameObject.Find("explode_wall");
			GameObject obj2 = GameObject.Find("explode_wall (1)");
			List<GameObject> list = new List<GameObject>();
			AddToEnableListIfNotNull(list, val, "Rock");
			AddToEnableListIfNotNull(list, obj, "Wall");
			AddToEnableListIfNotNull(list, obj2, "Wall 2");
			FsmState state = fsm.GetState("Stun 3");
			foreach (GameObject item2 in list)
			{
				ActivateGameObject item = new ActivateGameObject
				{
					gameObject = new FsmOwnerDefault
					{
						OwnerOption = (OwnerDefaultOption)1,
						GameObject = FsmGameObject.op_Implicit(item2)
					},
					activate = FsmBool.op_Implicit(true),
					recursive = FsmBool.op_Implicit(false),
					resetOnExit = false,
					everyFrame = false
				};
				List<FsmStateAction> list2 = state.Actions.ToList();
				list2.Add((FsmStateAction)(object)item);
				state.Actions = list2.ToArray();
				ModLog.Info(typeof(FifthChorusCameraControlPatcher), "Added ActivateGameObject action in Stun 3 state");
			}
			ModLog.Debug(typeof(FifthChorusCameraControlPatcher), $"Found rock: {(Object)(object)val != (Object)null}");
			ModLog.Info(typeof(FifthChorusCameraControlPatcher), "Patched song_golem_head Control FSM");
		}

		private static void AddToEnableListIfNotNull(List<GameObject> list, GameObject obj, string textForWarning)
		{
			if ((Object)(object)obj == (Object)null)
			{
				ModLog.Warn(typeof(FifthChorusCameraControlPatcher), "Object " + textForWarning + " to enable is null, skipping.");
				return;
			}
			list.Add(obj);
			obj.SetActive(false);
		}

		private static void PatchFourthChorusHeadExplosionFSM(Fsm fsm)
		{
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Expected O, but got Unknown
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Expected O, but got Unknown
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: 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_00bb: Expected O, but got Unknown
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Expected O, but got Unknown
			//IL_00f0: Expected O, but got Unknown
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Expected O, but got Unknown
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Expected O, but got Unknown
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Expected O, but got Unknown
			//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Expected O, but got Unknown
			if (string.Equals(fsm.Name, "Receive Explosion Dmg", StringComparison.OrdinalIgnoreCase))
			{
				ModLog.Info(typeof(FifthChorusCameraControlPatcher), "Patching song_golem_head Recieve Explosion Dmg FSM");
				FsmState state = fsm.GetState("Take Damage");
				TakeDamage val = state.Actions.OfType<TakeDamage>().FirstOrDefault();
				val.DamageDealt = FsmInt.op_Implicit(0);
				SetInvincibilityDirection item = new SetInvincibilityDirection
				{
					gameObject = new FsmOwnerDefault
					{
						OwnerOption = (OwnerDefaultOption)0
					},
					invincibilityDirection = new FsmInt
					{
						Value = 4
					}
				};
				FsmGameObject fsmGameObject = fsm.Variables.GetFsmGameObject("Golem");
				SetFsmInt item2 = new SetFsmInt
				{
					gameObject = new FsmOwnerDefault
					{
						OwnerOption = (OwnerDefaultOption)1,
						GameObject = fsmGameObject
					},
					fsmName = FsmString.op_Implicit("Control"),
					variableName = FsmString.op_Implicit("Phase"),
					setValue = new FsmInt
					{
						Value = 5
					}
				};
				GameObject obj = GameObject.Find("Boss Scene");
				PlayMakerFSM val2 = ((obj != null) ? ((IEnumerable<PlayMakerFSM>)obj.GetComponents<PlayMakerFSM>()).FirstOrDefault((Func<PlayMakerFSM, bool>)((PlayMakerFSM f) => f.FsmName == "Camera Control")) : null);
				ModLog.Info(typeof(FifthChorusCameraControlPatcher), $"Found Camera Control FSM: {(Object)(object)val2 != (Object)null}");
				SendEventByName item3 = new SendEventByName
				{
					eventTarget = new FsmEventTarget
					{
						target = (EventTarget)3,
						fsmComponent = val2
					},
					sendEvent = new FsmString
					{
						Value = "Lock Camera"
					},
					delay = new FsmFloat
					{
						Value = 0f
					},
					everyFrame = false
				};
				List<FsmStateAction> list = state.Actions.ToList();
				list.Add((FsmStateAction)(object)item);
				list.Add((FsmStateAction)(object)item2);
				list.Add((FsmStateAction)(object)item3);
				state.Actions = list.ToArray();
				ModLog.Info(typeof(FifthChorusCameraControlPatcher), "Patched song_golem_head Recieve Explosion Dmg FSM");
			}
		}
	}
	internal static class PlayMakerFSMAwakePatch
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(PlayMakerFSM), "Awake")]
		private static void Postfix(PlayMakerFSM __instance)
		{
			GameObject val = ((__instance != null) ? ((Component)__instance).gameObject : null);
			if ((Object)(object)val != (Object)null && ((__instance != null) ? __instance.FsmName : null) != null)
			{
				ModLog.Debug(typeof(PlayMakerFSMAwakePatch), "Found FSM: " + ((Object)val).name + " - " + __instance.FsmName);
			}
			FifthChorusControlPatcher.TryPatch(__instance);
			FifthChorusHeadPatcher.TryPatch(__instance);
			FifthChorusCameraControlPatcher.TryPatch(__instance);
			FifthChorusEnvironmentPatcher.TryPatch(__instance);
		}
	}
}
namespace FifthChorus.Patches.FSM.Fourth_Chorus
{
	internal static class FifthChorusConstants
	{
		public const string LAST_SLAM_VARIABLE_NAME = "LastSlam";

		public const string AIM_SLAM_COUNT_VARIABLE_NAME = "AimSlamCount";

		public const string PHASE_VARIABLE_NAME = "Phase";

		public const string LOCK_CAMERA_VARIABLE_NAME = "Lock Camera";

		public const string BOT_LOCK_VARIABLE_NAME = "Bot Lock";

		public const string PHASE_5_EVENT_NAME = "P5";

		public const string PHASE_5_STATE_NAME = "P5";
	}
}
namespace SilksongTestMod.Actions
{
	[ActionCategory(/*Could not decode attribute arguments.*/)]
	[Tooltip("Selects slam from Hero X; if it repears LastSlam, nudge to the nearest neighbor; then sends the SLAM event")]
	public class AimSlamSelectAndSend : FsmStateAction
	{
		public FsmFloat heroX;

		public FsmString lastSlam;

		public FsmInt aimSlamCount;

		public FsmInt phase;

		private const float EDGE_L_ML = 74.55f;

		private const float EDGE_ML_M = 76.73f;

		private const float EDGE_M_MR = 83.6f;

		private const float EDGE_MR_R = 86.26f;

		private bool phase1OrderInit;

		private string[] phase1Order;

		public override void OnEnter()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Expected O, but got Unknown
			if (aimSlamCount == null)
			{
				aimSlamCount = new FsmInt
				{
					Value = 0
				};
			}
			if (lastSlam == null)
			{
				lastSlam = new FsmString();
			}
			if (phase != null && phase.Value == 1 && aimSlamCount.Value < 3)
			{
				if (!phase1OrderInit)
				{
					List<string> list = new List<string> { "SLAM L", "SLAM R" };
					int num = Random.Range(0, 2);
					List<string> list2 = list;
					int index = num;
					string value = list[num];
					string value2 = list[0];
					list[0] = value;
					list2[index] = value2;
					int index2 = Random.Range(1, 3);
					list.Insert(index2, "SLAM M");
					phase1Order = list.ToArray();
					phase1OrderInit = true;
					ModLog.Info(typeof(AimSlamSelectAndSend), "Phase 1 slam order initialized: " + string.Join(", ", phase1Order));
				}
				string state = phase1Order[aimSlamCount.Value];
				lastSlam.Value = state;
				FsmEvent val = ((IEnumerable<FsmEvent>)((FsmStateAction)this).Fsm.Events).FirstOrDefault((Func<FsmEvent, bool>)((FsmEvent e) => string.Equals(e.Name, state, StringComparison.Ordinal)));
				if (val != null)
				{
					((FsmStateAction)this).Fsm.Event(val);
				}
				FsmInt obj = aimSlamCount;
				obj.Value += 1;
				((FsmStateAction)this).Finish();
			}
			else
			{
				float value3 = heroX.Value;
				string picked = PickBaseState(value3);
				string text = lastSlam.Value ?? "";
				if (!string.IsNullOrEmpty(text) && string.Equals(picked, text, StringComparison.Ordinal))
				{
					picked = Nudge(picked, value3);
				}
				lastSlam.Value = picked;
				FsmEvent[] events = ((FsmStateAction)this).Fsm.Events;
				FsmEvent val2 = ((IEnumerable<FsmEvent>)events).FirstOrDefault((Func<FsmEvent, bool>)((FsmEvent e) => string.Equals(e.Name, picked, StringComparison.Ordinal)));
				if (val2 == null)
				{
					ModLog.Error(typeof(AimSlamSelectAndSend), "Could not find event for slam state '" + picked + "'");
					((FsmStateAction)this).Finish();
				}
				else
				{
					((FsmStateAction)this).Fsm.Event(val2);
					((FsmStateAction)this).Finish();
				}
			}
		}

		private static string PickBaseState(float x)
		{
			if (x < 74.55f)
			{
				return "SLAM L";
			}
			if (x < 76.73f)
			{
				return "SLAM ML";
			}
			if (x < 83.6f)
			{
				return "SLAM M";
			}
			if (x < 86.26f)
			{
				return "SLAM MR";
			}
			return "SLAM R";
		}

		private static string Nudge(string cand, float x)
		{
			float num = 75.64f;
			float num2 = 80.165f;
			float num3 = 84.93f;
			return cand switch
			{
				"SLAM L" => "SLAM ML", 
				"SLAM R" => "SLAM MR", 
				"SLAM ML" => (x < num) ? "SLAM L" : "SLAM M", 
				"SLAM M" => (x < num2) ? "SLAM ML" : "SLAM MR", 
				"SLAM MR" => (x < num3) ? "SLAM M" : "SLAM R", 
				_ => cand, 
			};
		}

		public override string ErrorCheck()
		{
			if (heroX == null)
			{
				return "Hero X is not set.";
			}
			if (lastSlam == null)
			{
				return "LastSlam is not set.";
			}
			return "";
		}
	}
	[ActionCategory(/*Could not decode attribute arguments.*/)]
	[Tooltip("Sets the invincibilityDirection of the gameObject")]
	public class SetInvincibilityDirection : FsmStateAction
	{
		[RequiredField]
		[Tooltip("The GameObject to set the invincibility direction on.")]
		public FsmOwnerDefault gameObject;

		[Tooltip("The invincibility direction to set.")]
		public FsmInt invincibilityDirection;

		public override void Reset()
		{
			gameObject = null;
			invincibilityDirection = FsmInt.op_Implicit(4);
		}

		public override void OnEnter()
		{
			GameObject ownerDefaultTarget = ((FsmStateAction)this).Fsm.GetOwnerDefaultTarget(gameObject);
			if ((Object)(object)ownerDefaultTarget == (Object)null)
			{
				ModLog.Warn(typeof(SetInvincibilityDirection), "SetInvincibilityDirection: GameObject is null");
				((FsmStateAction)this).Finish();
				return;
			}
			HealthManager component = ownerDefaultTarget.GetComponent<HealthManager>();
			if ((Object)(object)component == (Object)null)
			{
				ModLog.Warn(typeof(SetInvincibilityDirection), "SetInvincibilityDirection: HealthManager component not found on GameObject");
				((FsmStateAction)this).Finish();
				return;
			}
			component.InvincibleFromDirection = invincibilityDirection.Value;
			if (invincibilityDirection.Value == 4)
			{
				component.IsInvincible = false;
			}
			((FsmStateAction)this).Finish();
		}
	}
}