using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using System.Text.RegularExpressions; using Archipelago.MultiClient.Net; using Archipelago.MultiClient.Net.BounceFeatures.DeathLink; using Archipelago.MultiClient.Net.Enums; using Archipelago.MultiClient.Net.Helpers; using Archipelago.MultiClient.Net.Models; using Archipelago.MultiClient.Net.Packets; using ArchipelagoULTRAKILL.Commands; using ArchipelagoULTRAKILL.Components; using ArchipelagoULTRAKILL.Config; using ArchipelagoULTRAKILL.Music; using ArchipelagoULTRAKILL.Powerups; using ArchipelagoULTRAKILL.Properties; using ArchipelagoULTRAKILL.Structures; using BepInEx; using BepInEx.Logging; using GameConsole; using HarmonyLib; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using PluginConfig.API; using PluginConfig.API.Decorators; using PluginConfig.API.Fields; using PluginConfig.API.Functionals; using TMPro; using ULTRAKILL.Cheats; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.AddressableAssets.ResourceLocators; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.ResourceManagement.ResourceProviders; using UnityEngine.SceneManagement; using UnityEngine.UI; using plog; using plog.Models; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("ArchipelagoULTRAKILL")] [assembly: AssemblyDescription("Connect to an Archipelago server to play ULTRAKILL randomizer.")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ArchipelagoULTRAKILL")] [assembly: AssemblyCopyright("Copyright © TRPG 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("c7de03cb-cf51-44da-ba1f-6fcecd638e0a")] [assembly: AssemblyFileVersion("3.5.3")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("3.5.3.0")] namespace ArchipelagoULTRAKILL { public static class ColorRandomizer { public static void RandomizeGunColors() { MonoSingleton.Instance.SetBool("gunColorType.1", true); MonoSingleton.Instance.SetBool("gunColorType.1.a", true); MonoSingleton.Instance.SetBool("gunColorType.2", true); MonoSingleton.Instance.SetBool("gunColorType.3", true); MonoSingleton.Instance.SetBool("gunColorType.3.a", true); MonoSingleton.Instance.SetBool("gunColorType.4", true); MonoSingleton.Instance.SetBool("gunColorType.5", true); for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 2; j++) { if (j != 2 || (i != 4 && i != 5)) { bool flag = false; if (j == 2) { flag = true; } for (int k = 1; k <= 3; k++) { MonoSingleton.Instance.SetFloat(string.Concat(new object[6] { "gunColor.", i.ToString(), ".", k.ToString(), flag ? ".a" : ".", "r" }), Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat(string.Concat(new object[6] { "gunColor.", i.ToString(), ".", k.ToString(), flag ? ".a" : ".", "g" }), Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat(string.Concat(new object[6] { "gunColor.", i.ToString(), ".", k.ToString(), flag ? ".a" : ".", "b" }), Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat(string.Concat(new object[6] { "gunColor.", i.ToString(), ".", k.ToString(), flag ? ".a" : ".", "a" }), Random.Range(0f, 1f)); } } } } if (Core.IsPlaying) { MonoSingleton.Instance.UpdateGunColors(); GunColorTypeGetter[] array = Object.FindObjectsOfType(); foreach (GunColorTypeGetter val in array) { val.UpdatePreview(); } } } public static void RandomizeUIColors() { for (int i = 1; i <= 3; i++) { string text = ".r"; if (i == 2) { text = ".g"; } if (i == 3) { text = ".b"; } MonoSingleton.Instance.SetFloat("hudColor.hp" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.hptext" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.hpaft" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.hphdmg" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.hpover" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.stm" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.stmchr" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.stmemp" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.raifull" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.raicha" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.var0" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.var1" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.var2" + text, Random.Range(0f, 1f)); MonoSingleton.Instance.SetFloat("hudColor.var3" + text, Random.Range(0f, 1f)); } if (Core.IsPlaying) { MonoSingleton.Instance.UpdateHudColors(); MonoSingleton.Instance.UpdateWeaponColors(); } } } public static class LevelManager { public static Dictionary skulls = new Dictionary(); public static Door redDoor; public static void FindSkulls() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Invalid comparison between Unknown and I4 //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0047: 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_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Invalid comparison between Unknown and I4 //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Invalid comparison between Unknown and I4 //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Invalid comparison between Unknown and I4 //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Invalid comparison between Unknown and I4 //IL_029d: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Invalid comparison between Unknown and I4 //IL_0320: Unknown result type (might be due to invalid IL or missing references) //IL_0326: Invalid comparison between Unknown and I4 //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Invalid comparison between Unknown and I4 //IL_039b: Unknown result type (might be due to invalid IL or missing references) //IL_03a1: Invalid comparison between Unknown and I4 //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02d4: Invalid comparison between Unknown and I4 //IL_0351: Unknown result type (might be due to invalid IL or missing references) //IL_0357: Invalid comparison between Unknown and I4 //IL_03d1: Unknown result type (might be due to invalid IL or missing references) //IL_03d7: Invalid comparison between Unknown and I4 skulls.Clear(); int num = 0; ItemIdentifier[] array = Resources.FindObjectsOfTypeAll(); foreach (ItemIdentifier val in array) { if ((int)val.itemType != 1 && (int)val.itemType != 2) { continue; } Scene val2 = ((Component)val).gameObject.scene; string name = ((Scene)(ref val2)).name; val2 = SceneManager.GetActiveScene(); if (!(name == ((Scene)(ref val2)).name)) { continue; } if (SceneHelper.CurrentScene == "Level 2-4") { if ((Object)(object)((Component)val).gameObject.transform.parent == (Object)null || ((Object)((Component)val).gameObject.transform.parent.parent).name != "Altar (1)") { continue; } } else if (SceneHelper.CurrentScene == "Level 7-S") { if (((int)val.itemType == 1 && !Object.op_Implicit((Object)(object)((Component)val).transform.parent.parent.parent)) || ((int)val.itemType == 2 && ((Object)((Component)val).transform.parent.parent.parent).name != "Interactives")) { continue; } } else if (SceneHelper.CurrentScene == "Level 8-1") { if (((Object)((Component)val).gameObject.transform.parent.parent.parent).name != "Inside") { continue; } } else if (SceneHelper.CurrentScene == "Level 8-2") { if (((int)val.itemType == 1 && ((Object)((Component)val).transform.parent.parent).name != "Altar (Blue) (1)") || ((int)val.itemType == 2 && ((Object)((Component)val).transform.parent.parent).name != "Altar (Red) (1)")) { continue; } } else if (SceneHelper.CurrentScene == "Level 8-3") { if (((Object)((Component)val).gameObject.transform.parent.parent.parent).name == "10 Nonstuff") { continue; } } else if (SceneHelper.CurrentScene == "Level 8-4") { if (((int)val.itemType == 1 && ((Object)((Component)val).transform.parent).name != "Bathroom") || ((int)val.itemType == 2 && ((Object)((Component)val).transform.parent.parent).name != "Altar (Red)")) { continue; } } else if (SceneHelper.CurrentScene == "Level 0-E") { if (((int)val.itemType == 1 && Object.op_Implicit((Object)(object)((Component)val).transform.parent.parent.parent)) || ((int)val.itemType == 2 && Object.op_Implicit((Object)(object)((Component)val).transform.parent.parent.parent))) { continue; } } else if (SceneHelper.CurrentScene == "Level 1-E" && (((int)val.itemType == 1 && ((Object)((Component)val).transform.parent.parent).name != "Altar (Blue) (1)") || (int)val.itemType == 2)) { continue; } if (skulls.ContainsKey(((object)Unsafe.As(ref val.itemType)/*cast due to .constrained prefix*/).ToString())) { num++; skulls[((object)Unsafe.As(ref val.itemType)/*cast due to .constrained prefix*/).ToString() + num] = ((Component)val).gameObject; } else { skulls[((object)Unsafe.As(ref val.itemType)/*cast due to .constrained prefix*/).ToString()] = ((Component)val).gameObject; } } for (int j = 0; j < skulls.Count; j++) { KeyValuePair keyValuePair = skulls.ElementAt(j); string text = Core.CurrentLevelInfo.Id.ToString(); if (Core.CurrentLevelInfo.Name == "0-S") { text = "0S"; } else if (Core.CurrentLevelInfo.Name == "7-S") { text = "7S"; } string currentScene = SceneHelper.CurrentScene; string text2 = currentScene; if (!(text2 == "Level 1-4")) { if (text2 == "Level 5-1") { if (j + 1 > Core.data.unlockedSkulls5_1) { DeactivateSkull(keyValuePair.Value); } } else if (((Object)keyValuePair.Value).name.Contains("Blue")) { if (!Core.data.unlockedSkulls.Contains(text + "_b")) { DeactivateSkull(keyValuePair.Value); } } else if (((Object)keyValuePair.Value).name.Contains("Red") && !Core.data.unlockedSkulls.Contains(text + "_r")) { DeactivateSkull(keyValuePair.Value); } } else if (j + 1 > Core.data.unlockedSkulls1_4) { DeactivateSkull(keyValuePair.Value); } } } public static void ActivateSkull(GameObject skull) { ItemPlaceZone val = default(ItemPlaceZone); if (((Component)skull.transform.parent).TryGetComponent(ref val)) { val.elementChangeEffect.Play(); InstantiateObject[] altarElements = val.altarElements; foreach (InstantiateObject val2 in altarElements) { ((Component)val2).gameObject.SetActive(true); if (((Component)val2).gameObject.activeInHierarchy) { val2.Instantiate(); } } } else { Core.Logger.LogWarning((object)(((Object)skull).name + " GameObject has no ItemPlaceZone in parent")); } skull.SetActive(true); } public static void DeactivateSkull(GameObject skull) { ItemPlaceZone val = default(ItemPlaceZone); if (((Component)skull.transform.parent).TryGetComponent(ref val)) { InstantiateObject[] altarElements = val.altarElements; foreach (InstantiateObject val2 in altarElements) { ((Component)val2).gameObject.SetActive(false); } } else { Core.Logger.LogWarning((object)(((Object)skull).name + " GameObject has no ItemPlaceZone in parent")); } skull.SetActive(false); } public static void AddDoorClosers() { ItemPlaceZone[] array = Resources.FindObjectsOfTypeAll(); foreach (ItemPlaceZone val in array) { if (SceneHelper.CurrentScene == "Level 1-1") { if ((Object)(object)((Component)val).transform.parent.parent != (Object)null && ((Object)((Component)val).transform.parent.parent).name == "11 Nonstuff") { GameObjectExtensions.GetOrAddComponent(((Component)((Component)val).transform.parent.parent.parent).gameObject); } } else if (SceneHelper.CurrentScene == "Level 1-2") { if ((Object)(object)((Component)val).transform.parent.parent != (Object)null && ((Object)((Component)val).transform.parent.parent).name == "3 Nonstuff") { GameObjectExtensions.GetOrAddComponent(((Component)((Component)val).transform.parent.parent.parent).gameObject); } } else if (SceneHelper.CurrentScene == "Level 2-3") { if ((Object)(object)((Component)val).transform.parent != (Object)null && (((Object)((Component)val).transform.parent).name == "Altar" || ((Object)((Component)val).transform.parent).name == "Altar (1)")) { GameObjectExtensions.GetOrAddComponent(((Component)((Component)val).transform.parent).gameObject); } } else if (SceneHelper.CurrentScene == "Level 4-4") { if ((Object)(object)((Component)val).transform.parent.parent != (Object)null && ((Object)((Component)val).transform.parent.parent).name == "Secret Hall") { GameObjectExtensions.GetOrAddComponent(((Component)((Component)val).transform.parent.parent.parent).gameObject); } } else if (SceneHelper.CurrentScene == "Level 5-2") { if ((Object)(object)((Component)val).transform.parent.parent != (Object)null && (((Object)((Component)val).transform.parent.parent).name == "6" || ((Object)((Component)val).transform.parent.parent).name == "7B")) { GameObjectExtensions.GetOrAddComponent(((Component)((Component)val).transform.parent.parent).gameObject); } } else if (SceneHelper.CurrentScene == "Level 5-3") { if ((Object)(object)((Component)val).transform.parent.parent != (Object)null && ((Object)((Component)val).transform.parent.parent).name == "2A4 - Skullway") { GameObjectExtensions.GetOrAddComponent(((Component)((Component)val).transform.parent.parent).gameObject); } } else if (SceneHelper.CurrentScene == "Level 6-1") { if ((Object)(object)((Component)val).transform.parent.parent != (Object)null && ((Object)((Component)val).transform.parent.parent).name == "3 - Crossroads") { GameObjectExtensions.GetOrAddComponent(((Component)((Component)val).transform.parent.parent).gameObject); } } else if (SceneHelper.CurrentScene == "Level 1-E" && (Object)(object)((Component)val).transform.parent.parent != (Object)null && ((Object)((Component)val).transform.parent.parent).name == "13-3 Connector") { GameObjectExtensions.GetOrAddComponent(((Component)((Component)val).transform.parent.parent).gameObject); } } } public static void DeactivateNailgun() { GearCheckEnabler[] array = Resources.FindObjectsOfTypeAll(); foreach (GearCheckEnabler val in array) { if (((Object)((Component)val).transform.parent).name == "1 - First Room") { ((Component)val).gameObject.SetActive(false); } } } public static void ChangeIntro() { //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0174: 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) if (Core.CurrentLevelHasInfo && Core.CurrentLevelInfo.Id == 1) { TextMeshProUGUI component = ((Component)GameObject.Find("/Canvas").transform.Find("HurtScreen").Find("Text 2 Sound").Find("Text (2)")).GetComponent(); ((TMP_Text)component).text = ((TMP_Text)component).text + "\nARCHIPELAGO BY TRPG"; ((TMP_Text)component).lineSpacing = 25f; TextMeshProUGUI component2 = Object.Instantiate(((Component)component).gameObject, ((TMP_Text)component).transform.parent).GetComponent(); ((TMP_Text)component2).text = "and others!"; ((TMP_Text)component2).fontSize = 32f; ((TMP_Text)component2).transform.localPosition = new Vector3(270f, -70f, 0f); ((TMP_Text)component2).transform.Rotate(new Vector3(0f, 0f, 6f)); GameObject val = Object.Instantiate(((Component)component).gameObject, ((TMP_Text)component).transform.parent); Object.DestroyImmediate((Object)(object)val.GetComponent()); Object.DestroyImmediate((Object)(object)val.GetComponent()); Image val2 = val.AddComponent(); val2.sprite = UIManager.bundle.LoadAsset("assets/trpg.png"); ((Graphic)val2).color = new Color(0.992f, 0.758f, 0.297f); val2.preserveAspect = true; ((Component)val2).transform.localPosition = new Vector3(150f, -32f, 0f); ((Component)val2).transform.localScale = new Vector3(0.08f, 0.08f, 0.08f); ((Component)component).gameObject.AddComponent().objects.Add(((Component)component2).gameObject); ((Component)component).gameObject.AddComponent().objects.Add(((Component)val2).gameObject); } } public static void AddGlassComponents() { if (!Core.CurrentLevelHasInfo || Core.CurrentLevelInfo.Id != 1) { return; } Glass[] array = Resources.FindObjectsOfTypeAll(); foreach (Glass val in array) { string name = ((Object)((Component)val).transform.parent.parent).name; switch (name) { default: if (!(name == "11 Content(Clone)")) { continue; } break; case "5 Stuff": case "5 Stuff(Clone)": case "11 Content": break; } GameObject gameObject = ((Component)((Component)val).transform.parent.parent).gameObject; if (!Object.op_Implicit((Object)(object)gameObject.GetComponent())) { gameObject.AddComponent(); } } } public static void FindHank() { if (!Core.CurrentLevelHasInfo) { return; } HudMessage[] array = Resources.FindObjectsOfTypeAll(); foreach (HudMessage val in array) { if ((Core.CurrentLevelInfo.Id == 9 || Core.CurrentLevelInfo.Id == 22) && ((Object)val).name == "EasterEgg") { string message = val.message; message = message.Replace("Nothing", "Something"); message = message.Replace("but", "and"); val.message = message; ((Component)val).gameObject.AddComponent(); } } } public static void ForceBlueArm() { //IL_0035: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)MonoSingleton.Instance)) { Core.Logger.LogWarning((object)"FistControl.Instance is null!"); return; } MonoSingleton.Instance.forcedLoadout.arm.blueVariant = (VariantOption)1; MonoSingleton.Instance.ResetFists(); } public static void FindRocketRaceButton() { if (!(SceneHelper.CurrentScene != "CreditsMuseum2") && Core.data.rocketReward) { GameObject.Find("/PuzzleScreen (2)/Canvas/Background/Start").AddComponent(); } } } public class Multiworld : MonoBehaviour { public static Version apVersion = new Version(0, 6, 7); public static DeathLinkService DeathLinkService = null; public static DeathLink lastDeathLink = null; public static int currentDeathCount = 0; public static bool Authenticated; public static bool HintMode = false; public static ArchipelagoSession Session; public static List messages = new List(); public GameObject serverCheckBlocker; public TextMeshProUGUI serverCheckText; public static List recentItems = new List(); public static bool CanGetItems { get; private set; } = false; public static bool? AllowConnect { get; private set; } = null; public void SetupServerCheckBlocker() { //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Expected O, but got Unknown //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Expected O, but got Unknown if (!(SceneHelper.CurrentScene != "Main Menu")) { serverCheckBlocker = ((Component)((Component)Object.Instantiate(((Component)((Component)MonoSingleton.Instance.optionsMenu).transform.Find("Save Slots").Find("Reload Consent Blocker")).gameObject, UIManager.canvas.transform).transform.GetChild(0)).transform.parent).gameObject; ((Object)serverCheckBlocker).name = "Archipelago Server Check Blocker"; Object.Destroy((Object)(object)serverCheckBlocker.GetComponent()); Object.Destroy((Object)(object)((Component)serverCheckBlocker.transform.Find("Consent")).GetComponent()); ((Component)serverCheckBlocker.transform.Find("Consent").Find("Panel")).GetComponent().sizeDelta = new Vector2(0f, 180f); serverCheckText = ((Component)serverCheckBlocker.transform.Find("Consent").Find("Panel").Find("Text")).GetComponent(); GameObject gameObject = ((Component)serverCheckBlocker.transform.Find("Consent").Find("Panel").Find("Yes")).gameObject; ((TMP_Text)gameObject.GetComponentInChildren(true)).text = "YES"; Button component = gameObject.GetComponent