Decompiled source of ArcadeMode v1.0.1

ArcadeMode.dll

Decompiled 4 months ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using HarmonyLib;
using PluginConfig.API;
using PluginConfig.API.Fields;
using TMPro;
using UnityEngine;
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("ArcadeMode")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ArcadeMode")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("690a5e05-30cc-49aa-a464-9bb590bbfb91")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ArcadeMode;

[BepInPlugin("thebluenebula.ArcadeMode", "ArcadeMode", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
	private enum DifficultyEnum
	{
		Harmless,
		Lenient,
		Standard,
		Violent,
		Brutal
	}

	private PluginConfigurator config;

	private AssetBundle arcade;

	private GameObject arcadeGUI;

	private IntField lifeInt;

	private EnumField<DifficultyEnum> difficultyField;

	private StatsManager StatsManagerObj;

	private TextMeshProUGUI GUIStyleText;

	private TextMeshProUGUI GUIKillsText;

	private TextMeshProUGUI GUILifesText;

	private const string modGUID = "thebluenebula.ArcadeMode";

	private const string modName = "ArcadeMode";

	private const string modVersion = "1.0.0";

	public static bool CurrentlyInArcadeMode = false;

	public int lifeCount = 5;

	public bool DeadLastTick = false;

	public int CurrentStyle = 0;

	public int SavedStyle = 0;

	public int FinalStyle = 0;

	public int CurrentKills = 0;

	public int SavedKills = 0;

	public int FinalKills = 0;

	private static readonly Harmony Harmony = new Harmony("thebluenebula.ArcadeMode");

	public static GameObject FindObjectEvenIfDisabled(string rootName, string objPath = null, int childNum = 0, bool useChildNum = false)
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = null;
		Scene activeScene = SceneManager.GetActiveScene();
		GameObject[] rootGameObjects = ((Scene)(ref activeScene)).GetRootGameObjects();
		bool flag = false;
		GameObject[] array = rootGameObjects;
		foreach (GameObject val2 in array)
		{
			if (((Object)val2).name == rootName)
			{
				val = val2;
				flag = true;
			}
		}
		if (flag)
		{
			GameObject val3 = val;
			if (objPath != null)
			{
				val3 = ((Component)val.transform.Find(objPath)).gameObject;
				if (!useChildNum)
				{
					val = val3;
				}
			}
			if (useChildNum)
			{
				GameObject gameObject = ((Component)val3.transform.GetChild(childNum)).gameObject;
				val = gameObject;
			}
		}
		return val;
	}

	private void Awake()
	{
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Expected O, but got Unknown
		config = PluginConfigurator.Create("Arcade Mode", "thebluenebula.ArcadeMode");
		config.SetIconWithURL("https://gcdn.thunderstore.io/live/repository/icons/thebluenebula-ArcadeMode-1.0.0.png.128x128_q95.jpg");
		lifeInt = new IntField(config.rootPanel, "Lifes", "lifes", 5);
		difficultyField = new EnumField<DifficultyEnum>(config.rootPanel, "Difficulty", "field_guid", DifficultyEnum.Brutal);
		Debug.Log((object)"Mod ArcadeMode version 1.0.0 is loading...");
		Harmony.PatchAll();
		Debug.Log((object)"Mod ArcadeMode version 1.0.0 is loaded!");
		SceneManager.sceneLoaded += OnSceneLoaded;
		difficultyField.onValueChange += SetArcadeButtonDifficulty;
		arcade = Loader.LoadTerminal();
	}

	private void SetArcadeButtonDifficulty(EnumValueChangeEvent<DifficultyEnum> data)
	{
		GameObject val = FindObjectEvenIfDisabled("Canvas", "Difficulty Select (1)/V1 Must Die");
		if (Object.op_Implicit((Object)(object)val))
		{
			if (difficultyField.value == DifficultyEnum.Harmless)
			{
				val.GetComponent<DifficultySelectButton>().difficulty = 1;
			}
			if (difficultyField.value == DifficultyEnum.Lenient)
			{
				val.GetComponent<DifficultySelectButton>().difficulty = 2;
			}
			if (difficultyField.value == DifficultyEnum.Standard)
			{
				val.GetComponent<DifficultySelectButton>().difficulty = 3;
			}
			if (difficultyField.value == DifficultyEnum.Violent)
			{
				val.GetComponent<DifficultySelectButton>().difficulty = 4;
			}
			if (difficultyField.value == DifficultyEnum.Brutal)
			{
				val.GetComponent<DifficultySelectButton>().difficulty = 5;
			}
		}
		if (data != null)
		{
			SceneHelper.LoadScene("Main Menu", false);
		}
	}

	private void EnterArcadeMode()
	{
		CurrentlyInArcadeMode = true;
		lifeCount = lifeInt.value;
		SavedStyle = 0;
		CurrentStyle = 0;
		FinalStyle = 0;
		SavedKills = 0;
		CurrentKills = 0;
		FinalKills = 0;
		SceneHelper.LoadScene("Level 0-1", false);
		FindObjectEvenIfDisabled("Canvas", "Chapter Select").SetActive(false);
	}

	private void SetupArcadeModeButton()
	{
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: Expected O, but got Unknown
		Debug.Log((object)"Test");
		FindObjectEvenIfDisabled("Canvas", "Difficulty Select (1)/Under Construction").SetActive(false);
		((TMP_Text)FindObjectEvenIfDisabled("Canvas", "Difficulty Select (1)/V1 Must Die/Name").GetComponent<TextMeshProUGUI>()).text = "ARCADE MODE";
		((Graphic)FindObjectEvenIfDisabled("Canvas", "Difficulty Select (1)/V1 Must Die/Name").GetComponent<TextMeshProUGUI>()).color = Color.white;
		FindObjectEvenIfDisabled("Canvas", "Difficulty Select (1)/V1 Must Die/Progress").SetActive(false);
		FindObjectEvenIfDisabled("Canvas", "Difficulty Select (1)/V1 Must Die/RankPanel").SetActive(false);
		((Selectable)FindObjectEvenIfDisabled("Canvas", "Difficulty Select (1)/V1 Must Die").GetComponent<Button>()).interactable = true;
		SetArcadeButtonDifficulty(null);
		((UnityEvent)FindObjectEvenIfDisabled("Canvas", "Difficulty Select (1)/V1 Must Die").GetComponent<Button>().onClick).AddListener(new UnityAction(EnterArcadeMode));
	}

	private void IntermissionContinueFromAct()
	{
		if (SceneHelper.CurrentScene.EndsWith("1"))
		{
			SceneHelper.LoadScene("Level 4-1", false);
		}
		if (SceneHelper.CurrentScene.EndsWith("2"))
		{
			SceneHelper.LoadScene("Level 7-1", false);
		}
	}

	private void IntermissionConfirmationShow()
	{
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Expected O, but got Unknown
		//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Expected O, but got Unknown
		((Component)((Component)arcadeGUI.transform.GetChild(2)).transform.GetChild(4)).gameObject.SetActive(true);
		((Component)((Component)arcadeGUI.transform.GetChild(2)).transform.GetChild(2)).gameObject.SetActive(false);
		((UnityEvent)((Component)((Component)((Component)arcadeGUI.transform.GetChild(2)).transform.GetChild(4)).transform.GetChild(0)).GetComponent<Button>().onClick).AddListener(new UnityAction(IntermissionConfirmationYes));
		((UnityEvent)((Component)((Component)((Component)arcadeGUI.transform.GetChild(2)).transform.GetChild(4)).transform.GetChild(1)).GetComponent<Button>().onClick).AddListener(new UnityAction(IntermissionConfirmationNo));
	}

	private void IntermissionConfirmationYes()
	{
		if (Object.op_Implicit((Object)(object)arcadeGUI))
		{
			((Component)arcadeGUI.transform.GetChild(1)).gameObject.SetActive(true);
		}
	}

	private void SetFinalResults(bool dead)
	{
		((TMP_Text)((Component)((Component)arcadeGUI.transform.GetChild(1)).transform.GetChild(3)).GetComponent<TextMeshProUGUI>()).text = "<b>STYLE:</b>" + (SavedStyle + CurrentStyle);
		((TMP_Text)((Component)((Component)arcadeGUI.transform.GetChild(1)).transform.GetChild(4)).GetComponent<TextMeshProUGUI>()).text = "<b>KILLS:</b>" + (SavedKills + CurrentKills);
		((Component)((Component)arcadeGUI.transform.GetChild(1)).transform.GetChild(1)).gameObject.SetActive(false);
		((Component)((Component)arcadeGUI.transform.GetChild(1)).transform.GetChild(5)).gameObject.SetActive(false);
		if (dead)
		{
			((Component)arcadeGUI.transform.GetChild(1)).GetComponent<AudioSource>().playOnAwake = false;
			((TMP_Text)((Component)((Component)arcadeGUI.transform.GetChild(1)).transform.GetChild(6)).GetComponent<TextMeshProUGUI>()).text = "Press [<color=orange>R</color>] to try again";
			if (lifeCount < 1)
			{
				GameProgressSaver.AddMoney(SavedStyle + CurrentStyle);
			}
		}
		else
		{
			GameProgressSaver.AddMoney(SavedStyle + CurrentStyle);
			((TMP_Text)((Component)((Component)arcadeGUI.transform.GetChild(1)).transform.GetChild(6)).GetComponent<TextMeshProUGUI>()).text = "Press [<color=orange>ESC</color>] to continue";
		}
		((TMP_Text)((Component)((Component)arcadeGUI.transform.GetChild(1)).transform.GetChild(7)).GetComponent<TextMeshProUGUI>()).text = "<b>PROFIT:</b> " + (SavedStyle + CurrentStyle) + "<color=orange>P";
	}

	private void IntermissionConfirmationNo()
	{
		((Component)((Component)arcadeGUI.transform.GetChild(2)).transform.GetChild(4)).gameObject.SetActive(false);
		((Component)arcadeGUI.transform.GetChild(2)).gameObject.SetActive(true);
	}

	private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
	{
		//IL_01da: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e4: Expected O, but got Unknown
		//IL_0212: Unknown result type (might be due to invalid IL or missing references)
		//IL_021c: Expected O, but got Unknown
		bool flag = SceneHelper.CurrentScene == "Bootstrap" || SceneHelper.CurrentScene == "Intro";
		if (SceneHelper.CurrentScene == "Main Menu" || SceneHelper.CurrentScene == "Endless" || SceneHelper.CurrentScene == "Sandbox")
		{
			CurrentlyInArcadeMode = false;
			if (SceneHelper.CurrentScene == "Main Menu")
			{
				SetupArcadeModeButton();
			}
		}
		else if (!flag && CurrentlyInArcadeMode)
		{
			SavedStyle = FinalStyle;
			SavedKills = FinalKills;
			CurrentStyle = 0;
			GameObject val = arcade.LoadAsset<GameObject>("ArcadeGUI.prefab");
			arcadeGUI = Object.Instantiate<GameObject>(val);
			arcadeGUI.GetComponent<CanvasScaler>().scaleFactor = 2f;
			((Component)arcadeGUI.transform.GetChild(0)).gameObject.SetActive(true);
			((Selectable)FindObjectEvenIfDisabled("Canvas", "PauseMenu/Restart Checkpoint").GetComponent<Button>()).interactable = false;
			((Selectable)FindObjectEvenIfDisabled("Canvas", "PauseMenu/Restart Mission").GetComponent<Button>()).interactable = false;
		}
		if (SceneHelper.CurrentScene.StartsWith("Intermission") && CurrentlyInArcadeMode)
		{
			FindObjectEvenIfDisabled("Canvas", "PowerUpVignette/Panel").SetActive(false);
			((Component)arcadeGUI.transform.GetChild(2)).gameObject.SetActive(true);
			((UnityEvent)((Component)((Component)arcadeGUI.transform.GetChild(2)).transform.GetChild(1)).GetComponent<Button>().onClick).AddListener(new UnityAction(IntermissionContinueFromAct));
			((UnityEvent)((Component)((Component)arcadeGUI.transform.GetChild(2)).transform.GetChild(2)).GetComponent<Button>().onClick).AddListener(new UnityAction(IntermissionConfirmationShow));
		}
		if (SceneHelper.CurrentScene == "EarlyAccessEnd" && CurrentlyInArcadeMode)
		{
			FindObjectEvenIfDisabled("Canvas", "UnderwaterOverlay/Panel").SetActive(false);
			((TMP_Text)((Component)((Component)((Component)arcadeGUI.transform.GetChild(1)).transform.GetChild(0)).transform.GetChild(1)).GetComponent<TextMeshProUGUI>()).text = "-- COMPLETED RUN --";
			SetFinalResults(dead: false);
			((Component)arcadeGUI.transform.GetChild(0)).gameObject.SetActive(false);
			((Component)arcadeGUI.transform.GetChild(1)).gameObject.SetActive(true);
		}
	}

	private void Update()
	{
		//IL_046c: Unknown result type (might be due to invalid IL or missing references)
		config.interactable = !CurrentlyInArcadeMode;
		bool flag = SceneHelper.CurrentScene == "Bootstrap" || SceneHelper.CurrentScene == "Intro";
		GameObject val = null;
		GameObject val2 = null;
		if ((!Object.op_Implicit((Object)(object)StatsManagerObj) && !flag) & (SceneHelper.CurrentScene != "Main Menu"))
		{
			StatsManagerObj = Object.FindObjectOfType<StatsManager>();
		}
		if (Input.GetKeyDown((KeyCode)27) & (SceneHelper.CurrentScene == "EarlyAccessEnd"))
		{
			SceneHelper.LoadScene("Main Menu", false);
			FindObjectEvenIfDisabled("Canvas", "PauseMenu").SetActive(false);
		}
		if (!flag && SceneHelper.CurrentScene != "Main Menu")
		{
			CurrentStyle = StatsManagerObj.stylePoints;
			CurrentKills = StatsManagerObj.kills;
		}
		if ((Object)(object)arcadeGUI != (Object)null)
		{
			if (!Object.op_Implicit((Object)(object)GUIStyleText))
			{
				GUIStyleText = ((Component)((Component)arcadeGUI.transform.GetChild(0)).gameObject.transform.GetChild(1)).GetComponent<TextMeshProUGUI>();
			}
			if (!Object.op_Implicit((Object)(object)GUIKillsText))
			{
				GUIKillsText = ((Component)((Component)arcadeGUI.transform.GetChild(0)).gameObject.transform.GetChild(3)).GetComponent<TextMeshProUGUI>();
			}
			if (!Object.op_Implicit((Object)(object)GUILifesText))
			{
				GUILifesText = ((Component)((Component)arcadeGUI.transform.GetChild(0)).gameObject.transform.GetChild(2)).GetComponent<TextMeshProUGUI>();
			}
			((TMP_Text)GUILifesText).text = lifeCount + "/" + lifeInt.value;
			((TMP_Text)GUIStyleText).text = "<color=#999999>STYLE:</color> " + (SavedStyle + CurrentStyle);
			((TMP_Text)GUIKillsText).text = "<color=#999999>KILLS:</color> " + (SavedKills + CurrentKills);
			((Component)((Component)arcadeGUI.transform.GetChild(0)).gameObject.transform.GetChild(4)).gameObject.SetActive(false);
		}
		FinalStyle = SavedStyle + CurrentStyle;
		FinalKills = SavedKills + CurrentKills;
		if (flag)
		{
			return;
		}
		if (SceneHelper.CurrentScene != "Main Menu")
		{
			val = FindObjectEvenIfDisabled("Player", "Main Camera/HUD Camera/HUD/FinishCanvas/Panel/Title/Text (1)");
			val2 = FindObjectEvenIfDisabled("Canvas", "BlackScreen/YouDiedText");
		}
		if ((CurrentlyInArcadeMode & (SceneHelper.CurrentScene != "Main Menu")) && ((TMP_Text)val.GetComponent<TextMeshProUGUI>()).text != "-- ARCADE MODE --")
		{
			((TMP_Text)val.GetComponent<TextMeshProUGUI>()).text = "-- ARCADE MODE --";
		}
		if (!((Object)(object)MonoSingleton<NewMovement>.Instance != (Object)null))
		{
			return;
		}
		if (MonoSingleton<NewMovement>.Instance.dead)
		{
			if (!DeadLastTick)
			{
				DeadLastTick = true;
				lifeCount--;
				Debug.Log((object)("ARCADE MODE LIFES: " + lifeCount));
				if (SceneHelper.CurrentScene.StartsWith("Level P"))
				{
					((TMP_Text)((Component)((Component)((Component)arcadeGUI.transform.GetChild(1)).transform.GetChild(0)).transform.GetChild(1)).GetComponent<TextMeshProUGUI>()).text = "-- FAILED PRIME SANCTUM --";
				}
				else
				{
					((TMP_Text)((Component)((Component)((Component)arcadeGUI.transform.GetChild(1)).transform.GetChild(0)).transform.GetChild(1)).GetComponent<TextMeshProUGUI>()).text = "-- FAILED LEVEL --";
				}
				SetFinalResults(dead: true);
				((Transform)FindObjectEvenIfDisabled("Canvas", "BlackScreen").GetComponent<RectTransform>()).localScale = new Vector3(0f, 0f, 0f);
				((Component)arcadeGUI.transform.GetChild(1)).gameObject.SetActive(true);
			}
		}
		else if (DeadLastTick & CurrentlyInArcadeMode)
		{
			if (lifeCount > 0)
			{
				SceneHelper.LoadScene(SceneHelper.CurrentScene, false);
			}
			else
			{
				SceneHelper.LoadScene("Main Menu", false);
			}
			DeadLastTick = false;
		}
	}
}
public static class Scenes
{
	public static string MainMenu = "b3e7f2f8052488a45b35549efb98d902";

	public static string ZeroDashOne = "eb57c9574cb2e624799753de0f8ffcad";
}
public static class Loader
{
	public static AssetBundle LoadTerminal()
	{
		try
		{
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			string name = "ArcadeMode.Bundles.arcade.bundle";
			using Stream stream = executingAssembly.GetManifestResourceStream(name);
			if (stream == null)
			{
				Debug.LogError((object)"Resource 'arcade.bundle' not found in embedded resources.");
				return null;
			}
			byte[] array = new byte[stream.Length];
			stream.Read(array, 0, array.Length);
			return AssetBundle.LoadFromMemory(array);
		}
		catch (Exception ex)
		{
			Debug.LogError((object)("Error loading arcade: " + ex.Message));
			return null;
		}
	}
}