using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using NukeLib.UI; using PluginConfig.API; using PluginConfig.API.Decorators; using PluginConfig.API.Fields; using TMPro; using Taberry.Cybergrind; using Taberry.NormalLevel; using Taberry.NormalLevel.Ranks; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Taberry")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+fae6dd83acde3bf93896593dfdec1a5f276a5814")] [assembly: AssemblyProduct("Taberry")] [assembly: AssemblyTitle("Taberry")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace Taberry { public static class ConfigManager { public enum RequirementType { Next, SRank } public enum DeadEnemyIconDisplayType { Cross, Hide } private static PluginConfigurator config; public static BoolField ShowByDefault; public static FloatField PanelScale; public static BoolField ToggleAnimation; public static BoolField ShowLevelName; public static BoolField ShowLevelDifficulty; public static BoolField ShowRankStats; public static BoolField ShowRequirements; public static EnumField RequirementStyle; public static BoolField ShowSecrets; public static BoolField ShowChallenge; public static BoolField ShowWave; public static BoolField ShowCGDifficulty; public static BoolField ShowEnemies; public static EnumField IconStyle; public static BoolField ShowTotalTime; public static BoolField ShowWaveTime; public static EnumField DeadEnemyDisplayType; public static void Initialize() { } static ConfigManager() { //IL_0048: 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_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Expected O, but got Unknown //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Expected O, but got Unknown //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Expected O, but got Unknown //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Expected O, but got Unknown //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Expected O, but got Unknown //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Expected O, but got Unknown //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Expected O, but got Unknown //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Expected O, but got Unknown //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Expected O, but got Unknown //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Expected O, but got Unknown //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Expected O, but got Unknown //IL_0232: Unknown result type (might be due to invalid IL or missing references) //IL_023c: Expected O, but got Unknown //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Expected O, but got Unknown //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_0299: Expected O, but got Unknown //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Expected O, but got Unknown config = PluginConfigurator.Create("Taberry", "com.github.end-4.taberry"); string text = Path.Combine(Plugin.workingDir, "icon.png"); if (File.Exists(text)) { config.SetIconWithURL(text); } new ConfigHeader(config.rootPanel, "", 10); new ConfigHeader(config.rootPanel, "-- GENERAL --", 24); ShowByDefault = new BoolField(config.rootPanel, "Show by default", "showByDefault", true); PanelScale = new FloatField(config.rootPanel, "Panel scale", "panelScale", 1f); PanelScale.postValueChangeEvent += (PostFloatValueChangeEvent)delegate(float f) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) UIUtils.FindRecursive("Canvas/Level Stats Controller/").transform.localScale = f * Vector3.one; }; ToggleAnimation = new BoolField(config.rootPanel, "Toggle animation", "toggleAnimation", true); new ConfigHeader(config.rootPanel, "-- NORMAL LEVELS --", 24); ShowLevelName = new BoolField(config.rootPanel, "Show level name", "showLevelName", true); ShowLevelDifficulty = new BoolField(config.rootPanel, "Show difficulty", "showLevelDifficulty", true); ShowRankStats = new BoolField(config.rootPanel, "Show rank stats", "showRankStats", true); ShowRequirements = new BoolField(config.rootPanel, "Show rank requirements", "showRequirements", true); RequirementStyle = new EnumField(config.rootPanel, "Requirement style", "requirementStyle", RequirementType.Next); ShowSecrets = new BoolField(config.rootPanel, "Show secrets", "showSecrets", true); ShowChallenge = new BoolField(config.rootPanel, "Show challenge", "showChallenge", true); new ConfigHeader(config.rootPanel, "", 10); new ConfigHeader(config.rootPanel, "-- CYBER GRIND --", 24); ShowWave = new BoolField(config.rootPanel, "Show wave", "showWave", true); ShowCGDifficulty = new BoolField(config.rootPanel, "Show difficulty", "showCGDifficulty", true); ShowEnemies = new BoolField(config.rootPanel, "Show enemy icons", "showEnemies", true); IconStyle = new EnumField(config.rootPanel, "Icon style", "cgIconStyle", (IconStyle)0); ShowTotalTime = new BoolField(config.rootPanel, "Show total time", "showTotalTime", true); ShowWaveTime = new BoolField(config.rootPanel, "Show wave time", "showWaveTime", true); DeadEnemyDisplayType = new EnumField(config.rootPanel, "Dead enemy display type", "deadEnemyDisplayType", DeadEnemyIconDisplayType.Cross); } } internal static class DifficultyHelper { public static int difficulty => MonoSingleton.Instance.GetInt("difficulty", 0); public static string GetDifficultyName(int difficulty) { return difficulty switch { 0 => "Harmless", 1 => "Lenient", 2 => "Standard", 3 => "Violent", 4 => "Brutal", 5 => "ULTRAKILL Must Die", _ => "Unknown difficulty", }; } public static string GetDifficultyName() { return GetDifficultyName(difficulty); } } [BepInPlugin("com.github.end-4.taberry", "Taberry", "1.1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { internal static Plugin Instance; internal static ManualLogSource Log; public static string workingPath = Assembly.GetExecutingAssembly().Location; public static string workingDir = Path.GetDirectoryName(workingPath); public const string PluginGUID = "com.github.end-4.taberry"; public const string PluginName = "Taberry"; public const string PluginVersion = "1.1.0"; internal static readonly string BundlePath = Path.Combine(workingDir, "assets", "taberry.bundle"); private void Awake() { //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)Instance != (Object)null)) { Instance = this; Log = ((BaseUnityPlugin)this).Logger; ConfigManager.Initialize(); new Harmony("Taberry").PatchAll(); SceneManager.sceneLoaded += OnSceneLoaded; Log.LogInfo((object)"Taberry loaded"); } } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) GameObject val = UIUtils.FindRecursive("Canvas/Level Stats Controller/"); if ((Object)(object)val != (Object)null) { val.transform.localScale = ConfigManager.PanelScale.value * Vector3.one; } if (SceneHelper.CurrentScene == "Main Menu" || SceneHelper.CurrentScene == "uk_construct") { return; } if (SceneHelper.CurrentScene == "Endless") { CybergrindHandler.Setup(); return; } GameObject val2 = UIUtils.FindRecursive("Canvas/Level Stats Controller"); if (!((Object)(object)val2 == (Object)null) && val2.activeSelf) { NormalLevelHandler.Setup(); } } } public class TabEnabler : MonoBehaviour { public GameObject levelStats; private void Start() { if ((Object)(object)levelStats != (Object)null) { UpdateAnchors(); levelStats.SetActive(ConfigManager.ShowByDefault.value); } } private void OnEnable() { PrefsManager.onPrefChanged = (Action)Delegate.Combine(PrefsManager.onPrefChanged, new Action(OnPrefChanged)); } private void OnDisable() { PrefsManager.onPrefChanged = (Action)Delegate.Remove(PrefsManager.onPrefChanged, new Action(OnPrefChanged)); } private void OnPrefChanged(string key, object value) { if (key == "weaponHoldPosition") { UpdateAnchors(); } } private void UpdateAnchors() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)levelStats == (Object)null)) { int num = MonoSingleton.Instance.GetInt("weaponHoldPosition", 0); RectTransform val = (RectTransform)levelStats.transform; if (num == 2) { val.anchoredPosition = Vector2.one; val.pivot = Vector2.one; } else { val.anchoredPosition = new Vector2(0f, 1f); val.pivot = new Vector2(0f, 1f); } ((Transform)val).localPosition = Vector3.zero; } } private void Update() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) if (MonoSingleton.Instance.InputSource.Stats.WasPerformedThisFrame && !((Object)(object)levelStats == (Object)null)) { SlideFadeToggleEffectExtensions.SetActiveAnimated(levelStats, !levelStats.activeSelf, new Vector2(0f, 30f), 25f); } } } } namespace Taberry.NormalLevel { public class LevelMiscController : MonoBehaviour { private GameObject SecretsGroup; private GameObject Challenge; private GameObject ChallengeDone; private List SecretOrbs = new List(); private List SecretOrbDoneMarks = new List(); private HashSet ActivatedSecretOrbs = new HashSet(); private bool? lastChallengeActiveState; private bool? lastChallengeDoneActiveState; private static StatsManager sman => MonoSingleton.Instance; private void Awake() { SecretsGroup = UIUtils.FindRecursive(((Component)this).gameObject, "Secrets/SecretOrbs"); Challenge = UIUtils.FindRecursive(((Component)this).gameObject, "Challenge"); ChallengeDone = UIUtils.FindRecursive(((Component)this).gameObject, "ChallengeDone"); } private void Start() { for (int i = 0; i < sman.secretObjects.Length; i++) { GameObject val = Object.Instantiate(NormalLevelHandler.SecretPrefab, SecretsGroup.transform); SecretOrbs.Add(val); GameObject item = UIUtils.FindRecursive(val, "DoneMark"); SecretOrbDoneMarks.Add(item); } UpdateVisibilities(); NormalLevelHandler.UnfuckLayouts(); } public void UpdateVisibilities() { GameObject val = UIUtils.FindRecursive(((Component)this).gameObject, "Secrets"); if (!((Object)(object)val == (Object)null)) { UIUtils.FindRecursive(((Component)this).gameObject, "Secrets/SecretIcon").SetActive(SecretOrbs.Count > 0); val.SetActive(ConfigManager.ShowSecrets.value && SecretOrbs.Count > 0); UIUtils.FindRecursive(((Component)this).gameObject, "padder").SetActive(!val.activeSelf); } } private void Update() { foreach (int prevSecret in sman.prevSecrets) { if (ActivatedSecretOrbs.Add(prevSecret) && prevSecret < SecretOrbDoneMarks.Count && (Object)(object)SecretOrbDoneMarks[prevSecret] != (Object)null) { SecretOrbDoneMarks[prevSecret].SetActive(true); } } foreach (int newSecret in sman.newSecrets) { if (ActivatedSecretOrbs.Add(newSecret) && newSecret < SecretOrbDoneMarks.Count && (Object)(object)SecretOrbDoneMarks[newSecret] != (Object)null) { SecretOrbDoneMarks[newSecret].SetActive(true); } } bool flag = false; bool flag2 = false; ChallengeManager instance = MonoSingleton.Instance; if ((Object)(object)instance != (Object)null && instance.challengeDone && !instance.challengeFailed) { flag = false; flag2 = ConfigManager.ShowChallenge.value; } else { flag = ConfigManager.ShowChallenge.value; flag2 = false; } if ((Object)(object)Challenge != (Object)null && (!lastChallengeActiveState.HasValue || lastChallengeActiveState.Value != flag)) { Challenge.SetActive(flag); lastChallengeActiveState = flag; } if ((Object)(object)ChallengeDone != (Object)null && (!lastChallengeDoneActiveState.HasValue || lastChallengeDoneActiveState.Value != flag2)) { ChallengeDone.SetActive(flag2); lastChallengeDoneActiveState = flag2; } } } public class LevelScoresController : MonoBehaviour { private class ScoreComponentCache { public GameObject Root; public Image CircProgMaskImage; public Image CircProgBorderImage; public TextMeshProUGUI ValueTextComp; public TextMeshProUGUI RequirementTextComp; public float LastValue = -1f; public Color LastBorderColor = Color.clear; public string LastValueText = string.Empty; public string LastRequirementText = string.Empty; public float LastFillAmount = -1f; public ConfigManager.RequirementType LastReqStyle = (ConfigManager.RequirementType)(-1); } private GameObject? TimeObj; private GameObject? KillsObj; private GameObject? StyleObj; private ScoreComponentCache? timeCache; private ScoreComponentCache? killsCache; private ScoreComponentCache? styleCache; private static StatsManager sman => MonoSingleton.Instance; private Color RankColor(string formattedRankText) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) Match match = Regex.Match(formattedRankText, "#([A-Fa-f0-9]{6})"); Color result = default(Color); if (match.Success && ColorUtility.TryParseHtmlString(match.Value, ref result)) { return result; } return Color.white; } private string FormatTime(float seconds) { int num = (int)seconds / 60; float num2 = seconds % 60f; return string.Format("{0}:{1}", num, num2.ToString("00.000")); } private void Awake() { TimeObj = UIUtils.FindRecursive(((Component)this).gameObject, "Time"); KillsObj = UIUtils.FindRecursive(((Component)this).gameObject, "Kills"); StyleObj = UIUtils.FindRecursive(((Component)this).gameObject, "Style"); if ((Object)(object)TimeObj != (Object)null) { timeCache = CreateCache(TimeObj); } if ((Object)(object)KillsObj != (Object)null) { killsCache = CreateCache(KillsObj); } if ((Object)(object)StyleObj != (Object)null) { styleCache = CreateCache(StyleObj); } } private ScoreComponentCache CreateCache(GameObject target) { return new ScoreComponentCache { Root = target, CircProgMaskImage = UIUtils.FindRecursive(target, "CircProg/CircProgMask").GetComponent(), CircProgBorderImage = UIUtils.FindRecursive(target, "CircProg/CircProgMask/CircProgBorder").GetComponent(), ValueTextComp = UIUtils.FindRecursive(target, "ValueText").GetComponent(), RequirementTextComp = UIUtils.FindRecursive(target, "RequirementText").GetComponent() }; } private void Start() { UpdateVisibilities(); NormalLevelHandler.UnfuckLayouts(); } internal void UpdateVisibilities() { if ((Object)(object)TimeObj != (Object)null) { UIUtils.FindRecursive(TimeObj, "RequirementText").SetActive(ConfigManager.ShowRequirements.value && !NormalLevelHandler.IsSecretLevel); } if ((Object)(object)KillsObj != (Object)null) { UIUtils.FindRecursive(KillsObj, "RequirementText").SetActive(ConfigManager.ShowRequirements.value && !NormalLevelHandler.IsSecretLevel); } if ((Object)(object)StyleObj != (Object)null) { UIUtils.FindRecursive(StyleObj, "RequirementText").SetActive(ConfigManager.ShowRequirements.value && !NormalLevelHandler.IsSecretLevel); } if (NormalLevelHandler.IsSecretLevel) { if ((Object)(object)TimeObj != (Object)null) { UIUtils.FindRecursive(TimeObj, "CircProg/CircProgMask").SetActive(false); } if ((Object)(object)KillsObj != (Object)null) { KillsObj.SetActive(false); } if ((Object)(object)StyleObj != (Object)null) { StyleObj.SetActive(false); } } } private void UpdateRank(ScoreComponentCache cache, int[] ranks, float currentValue, bool reverse, Func? valueToStringTransform = null) { //IL_00c1: 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_00d5: 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_00df: Unknown result type (might be due to invalid IL or missing references) if (valueToStringTransform == null) { valueToStringTransform = (float f) => f.ToString(); } string text = valueToStringTransform(currentValue); if (cache.LastValueText != text) { ((TMP_Text)cache.ValueTextComp).text = text; cache.LastValueText = text; } float num = (reverse ? ranks[0] : ranks[^1]); float num2 = ((num != 0f) ? (currentValue / num) : 0f); if (reverse) { num2 = 1f - num2; } num2 = Mathf.Clamp01(num2); if (!Mathf.Approximately(cache.LastFillAmount, num2)) { cache.CircProgMaskImage.fillAmount = num2; cache.LastFillAmount = num2; } int rank = SingularRankHelper.GetRank(ranks, currentValue, reverse); Color val = default(Color); ColorUtility.TryParseHtmlString(SingularRankHelper.GetRankForegroundColor(rank), ref val); if (cache.LastBorderColor != val) { ((Graphic)cache.CircProgBorderImage).color = val; cache.LastBorderColor = val; } ConfigManager.RequirementType value = ConfigManager.RequirementStyle.value; if (!Mathf.Approximately(cache.LastValue, currentValue) || cache.LastReqStyle != value) { int num3 = rank; switch (value) { case ConfigManager.RequirementType.Next: num3 = SingularRankHelper.ClampRank(rank + ((!reverse) ? 1 : 0), ranks); break; case ConfigManager.RequirementType.SRank: num3 = ranks.Length; break; } int num4 = Math.Min(num3 - 1, ranks.Length - 1); float arg = ranks[num4]; string rankForegroundColor = SingularRankHelper.GetRankForegroundColor(num3); string text2 = valueToStringTransform(arg); string text3 = "/" + text2 + ""; if (cache.LastRequirementText != text3) { ((TMP_Text)cache.RequirementTextComp).text = text3; cache.LastRequirementText = text3; } cache.LastReqStyle = value; } cache.LastValue = currentValue; } private void Update() { if (timeCache != null && (Object)(object)TimeObj != (Object)null && TimeObj.activeSelf) { UpdateRank(timeCache, sman.timeRanks, sman.seconds, reverse: true, FormatTime); } if (killsCache != null && (Object)(object)KillsObj != (Object)null && KillsObj.activeSelf) { UpdateRank(killsCache, sman.killRanks, sman.kills, reverse: false); } if (styleCache != null && (Object)(object)StyleObj != (Object)null && StyleObj.activeSelf) { UpdateRank(styleCache, sman.styleRanks, sman.stylePoints, reverse: false); } } } public class LevelTitleController : MonoBehaviour { private GameObject SmallText; private GameObject BigText; private TextMeshProUGUI? smallTextComp; private TextMeshProUGUI? bigTextComp; private string lastSmallText = string.Empty; private string lastBigText = string.Empty; internal void UpdateTitle() { if (!((Object)(object)smallTextComp == (Object)null) && !((Object)(object)bigTextComp == (Object)null)) { MapInfo instance = MapInfo.Instance; StockMapInfo instance2 = StockMapInfo.Instance; string text = ((MapInfoBase)(instance?)).levelName ?? instance2?.assets.LargeText ?? SceneHelper.CurrentScene ?? "???"; int num = text.IndexOf(':'); string text2; string text3; if (num != -1) { ReadOnlySpan readOnlySpan = text.AsSpan(); text2 = readOnlySpan.Slice(0, num).Trim().ToString(); text3 = readOnlySpan.Slice(num + 1).Trim().ToString(); } else { text2 = (SceneHelper.IsPlayingCustom ? "Custom level" : "Campaign"); text3 = ((text.Length > 0) ? text : (SceneHelper.CurrentScene ?? string.Empty)); } string text4 = ((!ConfigManager.ShowLevelDifficulty.value) ? text2 : (DifficultyHelper.GetDifficultyName() + " > " + text2)); bool flag = false; if (lastSmallText != text4) { ((TMP_Text)smallTextComp).text = text4; lastSmallText = text4; flag = true; } if (lastBigText != text3) { ((TMP_Text)bigTextComp).text = text3; lastBigText = text3; flag = true; } if (flag) { NormalLevelHandler.UnfuckLayouts(); } } } internal void UpdateTitle(bool _) { UpdateTitle(); } private void Awake() { //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Expected O, but got Unknown SmallText = UIUtils.FindRecursive(((Component)this).gameObject, "LevelInfoRow/Small"); BigText = UIUtils.FindRecursive(((Component)this).gameObject, "Main"); if ((Object)(object)SmallText != (Object)null) { smallTextComp = SmallText.GetComponent(); } if ((Object)(object)BigText != (Object)null) { bigTextComp = BigText.GetComponent(); } ConfigManager.ShowLevelDifficulty.postValueChangeEvent += new PostBoolValueChangeEvent(UpdateTitle); } private void Start() { UpdateTitle(); } private void OnDestroy() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown ConfigManager.ShowLevelDifficulty.postValueChangeEvent -= new PostBoolValueChangeEvent(UpdateTitle); } } internal static class NormalLevelHandler { internal static GameObject LevelStatsPrefab; internal static GameObject SecretPrefab; internal static bool IsSecretLevel; private static GameObject LevelStats; internal static GameObject LevelName; internal static GameObject LevelStatsColumn; internal static GameObject LevelMiscRow; static NormalLevelHandler() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Expected O, but got Unknown ConfigManager.ShowLevelName.postValueChangeEvent += new PostBoolValueChangeEvent(UpdateVisibilities); ConfigManager.ShowRankStats.postValueChangeEvent += new PostBoolValueChangeEvent(UpdateVisibilities); ConfigManager.ShowRequirements.postValueChangeEvent += new PostBoolValueChangeEvent(UpdateVisibilities); ConfigManager.ShowSecrets.postValueChangeEvent += new PostBoolValueChangeEvent(UpdateVisibilities); ConfigManager.ShowChallenge.postValueChangeEvent += new PostBoolValueChangeEvent(UpdateVisibilities); } private static void UpdateVisibilities(bool _) { UpdateVisibilities(); } private static void UpdateVisibilities() { if ((Object)(object)LevelName != (Object)null) { LevelName.SetActive(ConfigManager.ShowLevelName.value); } if ((Object)(object)LevelStatsColumn != (Object)null) { LevelStatsColumn.SetActive(ConfigManager.ShowRankStats.value); LevelStatsColumn.GetComponent().UpdateVisibilities(); } if ((Object)(object)LevelMiscRow != (Object)null) { LevelMiscRow.SetActive((ConfigManager.ShowSecrets.value || ConfigManager.ShowChallenge.value) && !IsSecretLevel); LevelMiscRow.GetComponent().UpdateVisibilities(); } if ((Object)(object)LevelStats != (Object)null) { LevelStats.SetActive(ConfigManager.ShowLevelName.value || ConfigManager.ShowRankStats.value || ConfigManager.ShowSecrets.value || ConfigManager.ShowChallenge.value); } } public static void UnfuckLayouts() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown LayoutRebuilder.ForceRebuildLayoutImmediate((RectTransform)LevelStats.transform); } internal static void Setup() { GameObject val = UIUtils.FindRecursive("Canvas/Level Stats Controller"); GameObject obj = UIUtils.FindRecursive(val, "Level Stats (1)"); if ((Object)(object)LevelStatsPrefab == (Object)null || (Object)(object)SecretPrefab == (Object)null) { AssetBundle val2 = AssetBundle.LoadFromFile(Plugin.BundlePath); if ((Object)(object)LevelStatsPrefab == (Object)null) { LevelStatsPrefab = val2.LoadAsset("LevelStats"); } if ((Object)(object)SecretPrefab == (Object)null) { SecretPrefab = val2.LoadAsset("Secret"); } val2.Unload(false); } IsSecretLevel = Object.FindObjectOfType().secretLevel; Object.Destroy((Object)(object)obj); LevelStats = Object.Instantiate(LevelStatsPrefab, val.transform); LevelName = UIUtils.FindRecursive(LevelStats, "Name"); LevelStatsColumn = UIUtils.FindRecursive(LevelStats, "StatsColumn"); LevelMiscRow = UIUtils.FindRecursive(LevelStats, "MiscRow"); UnfuckLayouts(); Object.Destroy((Object)(object)val.GetComponent()); val.AddComponent().levelStats = LevelStats; LevelName.AddComponent(); LevelStatsColumn.AddComponent(); LevelMiscRow.AddComponent(); UpdateVisibilities(); } } } namespace Taberry.NormalLevel.Ranks { public static class SingularRankHelper { public static int GetRank(int[] ranksToCheck, float value, bool reverse) { int i; for (i = 0; i < ranksToCheck.Length && ((reverse && value <= (float)ranksToCheck[i]) || (!reverse && value >= (float)ranksToCheck[i])); i++) { } if (ranksToCheck != null && ranksToCheck.Length != 0) { return Mathf.Clamp(i, 0, ranksToCheck.Length); } return 0; } public static int ClampRank(int rank, int[] ranksToCheck) { return Mathf.Clamp(rank, 0, ranksToCheck.Length); } public static string GetRankForegroundColor(int rank) { return rank switch { 0 => "#0094FF", 1 => "#4CFF00", 2 => "#FFD800", 3 => "#FF6A00", 4 => "#FF0000", _ => "#FFFFFF", }; } } } namespace Taberry.Cybergrind { internal static class CybergrindHandler { internal enum EnemyCategory { Common, Uncommon, Special, Mass } internal class EnemyIconRecord : IComparable { public readonly EnemyIdentifier Enemy; public readonly EnemyCategory Type; public readonly bool IsRadiant; public readonly GameObject IconObject; public readonly GameObject RadiantModifier; public readonly GameObject IdolModifier; public readonly GameObject Eliminated; public bool LastActiveState = true; public bool LastBlessedState; public bool LastDeadState; public EnemyIconRecord(EnemyIdentifier enemy, EnemyCategory type, bool isRadiant, GameObject iconObject) { Enemy = enemy; Type = type; IsRadiant = isRadiant; IconObject = iconObject; RadiantModifier = UIUtils.FindRecursive(iconObject, "RadiantModifier"); IdolModifier = UIUtils.FindRecursive(iconObject, "IdolModifier"); Eliminated = UIUtils.FindRecursive(iconObject, "Eliminated"); } public int CompareTo(EnemyIconRecord other) { if (other == null) { return 1; } int num = Type.CompareTo(other.Type); if (num != 0) { return num; } int num2 = MonoSingleton.Instance.GetEnemyRank(Enemy).CompareTo(MonoSingleton.Instance.GetEnemyRank(other.Enemy)); if (num2 != 0) { return num2; } int num3 = string.Compare(Enemy.FullName, other.Enemy.FullName, StringComparison.InvariantCultureIgnoreCase); if (num3 == 0) { return ((Object)Enemy).GetInstanceID().CompareTo(((Object)other.Enemy).GetInstanceID()); } return num3; } } internal static GameObject EnemyIconPrefab; internal static GameObject CGStatsPrefab; internal static GameObject? CGStatsObject; internal static GameObject? WaveProgress; internal static GameObject? CGEnemies; internal static GameObject? TimeGroup; internal static GameObject? TotalTime; internal static GameObject? ThisWaveTime; internal static TextMeshProUGUI? TotalTimeTextComp; internal static TextMeshProUGUI? ThisWaveTimeTextComp; internal static WaveIndicatorController? WaveIndicatorComp; private static bool? lastWaveVisible; private static bool? lastEnemiesVisible; private static bool? lastTotalTimeVisible; private static bool? lastWaveTimeVisible; private static bool? lastTimeGroupVisible; private static bool? lastStatsObjectVisible; internal static List icons; static CybergrindHandler() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown icons = new List(); ConfigManager.ShowWave.postValueChangeEvent += new PostBoolValueChangeEvent(UpdateVisibilities); ConfigManager.ShowEnemies.postValueChangeEvent += new PostBoolValueChangeEvent(UpdateVisibilities); ConfigManager.ShowTotalTime.postValueChangeEvent += new PostBoolValueChangeEvent(UpdateVisibilities); ConfigManager.ShowWaveTime.postValueChangeEvent += new PostBoolValueChangeEvent(UpdateVisibilities); ConfigManager.ShowCGDifficulty.postValueChangeEvent += new PostBoolValueChangeEvent(UpdateVisibilities); } private static bool AreAnyIconsActive() { for (int i = 0; i < icons.Count; i++) { EnemyIconRecord enemyIconRecord = icons[i]; if ((Object)(object)enemyIconRecord?.IconObject != (Object)null && enemyIconRecord.IconObject.activeSelf) { return true; } } return false; } internal static void UpdateVisibilities() { bool value = ConfigManager.ShowWave.value; if ((Object)(object)WaveProgress != (Object)null && (!lastWaveVisible.HasValue || lastWaveVisible.Value != value)) { WaveProgress.SetActive(value); lastWaveVisible = value; } bool flag = ConfigManager.ShowEnemies.value && AreAnyIconsActive(); if ((Object)(object)CGEnemies != (Object)null && (!lastEnemiesVisible.HasValue || lastEnemiesVisible.Value != flag)) { CGEnemies.SetActive(flag); lastEnemiesVisible = flag; } bool value2 = ConfigManager.ShowTotalTime.value; if ((Object)(object)TotalTime != (Object)null && (!lastTotalTimeVisible.HasValue || lastTotalTimeVisible.Value != value2)) { TotalTime.SetActive(value2); lastTotalTimeVisible = value2; } bool value3 = ConfigManager.ShowWaveTime.value; if ((Object)(object)ThisWaveTime != (Object)null && (!lastWaveTimeVisible.HasValue || lastWaveTimeVisible.Value != value3)) { ThisWaveTime.SetActive(value3); lastWaveTimeVisible = value3; } bool flag2 = ConfigManager.ShowTotalTime.value || ConfigManager.ShowWaveTime.value; if ((Object)(object)TimeGroup != (Object)null && (!lastTimeGroupVisible.HasValue || lastTimeGroupVisible.Value != flag2)) { TimeGroup.SetActive(flag2); lastTimeGroupVisible = flag2; } bool flag3 = ((Object)(object)WaveProgress != (Object)null && WaveProgress.activeSelf) || ((Object)(object)CGEnemies != (Object)null && CGEnemies.activeSelf) || ((Object)(object)TimeGroup != (Object)null && TimeGroup.activeSelf); if ((Object)(object)CGStatsObject != (Object)null && (!lastStatsObjectVisible.HasValue || lastStatsObjectVisible.Value != flag3)) { CGStatsObject.SetActive(flag3); lastStatsObjectVisible = flag3; } if ((Object)(object)WaveIndicatorComp != (Object)null) { WaveIndicatorComp.UpdateVisibilities(); } } private static void UpdateVisibilities(bool _) { UpdateVisibilities(); } public static void Setup() { GameObject val = UIUtils.FindRecursive("Canvas/Level Stats Controller"); GameObject obj = UIUtils.FindRecursive(val, "Level Stats (1)"); if ((Object)(object)CGStatsPrefab == (Object)null || (Object)(object)EnemyIconPrefab == (Object)null) { AssetBundle val2 = AssetBundle.LoadFromFile(Plugin.BundlePath); if ((Object)(object)CGStatsPrefab == (Object)null) { CGStatsPrefab = val2.LoadAsset("CGStats"); } if ((Object)(object)EnemyIconPrefab == (Object)null) { EnemyIconPrefab = val2.LoadAsset("CGEnemy"); } val2.Unload(false); } Object.Destroy((Object)(object)obj); CGStatsObject = Object.Instantiate(CGStatsPrefab, val.transform); GameObject val3 = (WaveProgress = UIUtils.FindRecursive(CGStatsObject, "Wave")); CGEnemies = UIUtils.FindRecursive(CGStatsObject, "Enemies"); TimeGroup = UIUtils.FindRecursive(CGStatsObject, "Time"); TotalTime = UIUtils.FindRecursive(TimeGroup, "Total"); ThisWaveTime = UIUtils.FindRecursive(TimeGroup, "ThisWave"); if ((Object)(object)TotalTime != (Object)null) { TotalTimeTextComp = TotalTime.GetComponent(); } if ((Object)(object)ThisWaveTime != (Object)null) { ThisWaveTimeTextComp = ThisWaveTime.GetComponent(); } Object.Destroy((Object)(object)val.GetComponent()); val.AddComponent().levelStats = CGStatsObject; if ((Object)(object)val3 != (Object)null) { WaveIndicatorComp = val3.AddComponent(); } CGStatsObject.AddComponent(); if ((Object)(object)CGEnemies != (Object)null) { CGEnemies.AddComponent(); } lastWaveVisible = null; lastEnemiesVisible = null; lastTotalTimeVisible = null; lastWaveTimeVisible = null; lastTimeGroupVisible = null; lastStatsObjectVisible = null; UpdateVisibilities(); } public static void UnfuckEnemiesLayout() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown if (!((Object)(object)CGEnemies == (Object)null)) { LayoutRebuilder.ForceRebuildLayoutImmediate((RectTransform)CGEnemies.transform); } } } [HarmonyPatch] internal static class CybergrindPatches { private static float lastSeconds; private static StatsManager sman => MonoSingleton.Instance; [HarmonyPatch(typeof(EndlessGrid), "Start")] [HarmonyPostfix] private static void EndlessGrid_Start() { CybergrindHandler.icons.Clear(); lastSeconds = sman.seconds; } [HarmonyPatch(typeof(EndlessGrid), "SpawnOnGrid")] [HarmonyPostfix] private static void EndlessGrid_SpawnOnGrid(GameObject obj, bool radiant, GameObject __result, PrefabDatabase ___prefabs) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) EnemyIdentifier val = ((__result != null) ? __result.GetComponentInChildren(true) : null); if (val != null) { GameObject val2 = Object.Instantiate(CybergrindHandler.EnemyIconPrefab, CybergrindHandler.CGEnemies.transform); EnemyIconController obj2 = UIUtils.FindRecursive(val2, "TypeIcon").AddComponent(); obj2.enemyIdentifier = val; obj2.style = ConfigManager.IconStyle.value; CybergrindHandler.EnemyCategory type = CybergrindHandler.EnemyCategory.Common; if (___prefabs.uncommonEnemies.Any((EndlessEnemy prefab) => (Object)(object)prefab.prefab == (Object)(object)obj)) { type = CybergrindHandler.EnemyCategory.Uncommon; } else if (___prefabs.specialEnemies.Any((EndlessEnemy prefab) => (Object)(object)prefab.prefab == (Object)(object)obj)) { type = CybergrindHandler.EnemyCategory.Special; } else if ((Object)(object)obj == (Object)(object)___prefabs.hideousMass) { type = CybergrindHandler.EnemyCategory.Mass; } CybergrindHandler.EnemyIconRecord enemyIconRecord = new CybergrindHandler.EnemyIconRecord(val, type, radiant, val2); if (radiant && (Object)(object)enemyIconRecord.RadiantModifier != (Object)null) { enemyIconRecord.RadiantModifier.SetActive(true); } if ((Object)(object)enemyIconRecord.IdolModifier != (Object)null) { enemyIconRecord.IdolModifier.SetActive(val.blessed); } enemyIconRecord.LastBlessedState = val.blessed; CybergrindHandler.icons.Add(enemyIconRecord); CybergrindHandler.icons.Sort(); for (int num = 0; num < CybergrindHandler.icons.Count; num++) { CybergrindHandler.icons[num].IconObject.transform.SetAsLastSibling(); } CybergrindHandler.UnfuckEnemiesLayout(); CybergrindHandler.UpdateVisibilities(); } } [HarmonyPatch(typeof(EndlessGrid), "Update")] [HarmonyPostfix] private static void EndlessGrid_Update() { bool flag = false; bool flag2 = false; for (int num = CybergrindHandler.icons.Count - 1; num >= 0; num--) { CybergrindHandler.EnemyIconRecord enemyIconRecord = CybergrindHandler.icons[num]; if ((Object)(object)enemyIconRecord.IconObject == (Object)null) { CybergrindHandler.icons.RemoveAt(num); flag = true; flag2 = true; } else if ((Object)(object)enemyIconRecord.Enemy == (Object)null) { if (enemyIconRecord.LastActiveState) { enemyIconRecord.IconObject.SetActive(false); enemyIconRecord.LastActiveState = false; flag = true; flag2 = true; } } else { bool blessed = enemyIconRecord.Enemy.blessed; if (blessed != enemyIconRecord.LastBlessedState) { if ((Object)(object)enemyIconRecord.IdolModifier != (Object)null) { enemyIconRecord.IdolModifier.SetActive(blessed); } enemyIconRecord.LastBlessedState = blessed; } bool dead = enemyIconRecord.Enemy.dead; if (dead != enemyIconRecord.LastDeadState) { if ((Object)(object)enemyIconRecord.Eliminated != (Object)null) { enemyIconRecord.Eliminated.SetActive(dead); } enemyIconRecord.LastDeadState = dead; bool flag3 = !dead || ConfigManager.DeadEnemyDisplayType.value == ConfigManager.DeadEnemyIconDisplayType.Cross; if (enemyIconRecord.LastActiveState != flag3) { enemyIconRecord.IconObject.SetActive(flag3); enemyIconRecord.LastActiveState = flag3; flag = true; flag2 = true; } } } } if (flag) { CybergrindHandler.UnfuckEnemiesLayout(); } if (flag2) { CybergrindHandler.UpdateVisibilities(); } float seconds = sman.seconds; float num2 = Mathf.Max(0f, seconds - lastSeconds); int num3 = (int)(seconds / 60f); float num4 = seconds % 60f; int num5 = (int)(num2 / 60f); float num6 = num2 % 60f; if ((Object)(object)CybergrindHandler.TotalTimeTextComp != (Object)null) { ((TMP_Text)CybergrindHandler.TotalTimeTextComp).text = string.Format("{0}:{1}", num3, num4.ToString("00.000")); } if ((Object)(object)CybergrindHandler.ThisWaveTimeTextComp != (Object)null) { ((TMP_Text)CybergrindHandler.ThisWaveTimeTextComp).text = string.Format("+ {0}:{1}", num5, num6.ToString("00.000")); } } [HarmonyPatch(typeof(EndlessGrid), "NextWave")] [HarmonyPostfix] private static void EndlessGrid_NextWave() { for (int i = 0; i < CybergrindHandler.icons.Count; i++) { if ((Object)(object)CybergrindHandler.icons[i].IconObject != (Object)null) { Object.Destroy((Object)(object)CybergrindHandler.icons[i].IconObject); } } CybergrindHandler.icons.Clear(); lastSeconds = sman.seconds; CybergrindHandler.UnfuckEnemiesLayout(); CybergrindHandler.UpdateVisibilities(); } } public class WaveIndicatorController : MonoBehaviour { private TextMeshProUGUI WaveText; private GameObject? DifficultyTextObj; private Image CircProgMask; private ActivateNextWave NextWaveObj; private int lastWave = -1; private float lastFontSize = -1f; private float lastPercentage = -1f; private bool? lastDifficultyVisibility; internal void UpdateVisibilities() { bool value = ConfigManager.ShowCGDifficulty.value; if ((Object)(object)DifficultyTextObj != (Object)null && (!lastDifficultyVisibility.HasValue || lastDifficultyVisibility.Value != value)) { DifficultyTextObj.SetActive(value); lastDifficultyVisibility = value; } } private void Start() { WaveText = UIUtils.FindRecursive(((Component)this).gameObject, "WaveNumber/NumberText").GetComponent(); DifficultyTextObj = UIUtils.FindRecursive(((Component)this).gameObject, "WaveNumber/Difficulty"); CircProgMask = UIUtils.FindRecursive(((Component)this).gameObject, "WaveCircularProgress").GetComponent(); NextWaveObj = Object.FindObjectOfType(); if ((Object)(object)DifficultyTextObj != (Object)null) { TextMeshProUGUI component = DifficultyTextObj.GetComponent(); if ((Object)(object)component != (Object)null) { ((TMP_Text)component).text = DifficultyHelper.GetDifficultyName(); } } UpdateVisibilities(); } private void Update() { EndlessGrid instance = MonoSingleton.Instance; if ((Object)(object)instance == (Object)null) { return; } int currentWave = instance.currentWave; if (currentWave != lastWave) { string text = currentWave.ToString(); ((TMP_Text)WaveText).text = text; lastWave = currentWave; float num = ((text.Length > 2) ? 20f : 24f); if (!Mathf.Approximately(((TMP_Text)WaveText).fontSize, num)) { ((TMP_Text)WaveText).fontSize = num; } } if ((Object)(object)NextWaveObj != (Object)null) { float num2 = ((instance.enemyAmount == 0) ? 0f : ((float)NextWaveObj.deadEnemies / (float)instance.enemyAmount)); num2 = Mathf.Clamp01(num2); if (!Mathf.Approximately(lastPercentage, num2)) { CircProgMask.fillAmount = num2; lastPercentage = num2; } } } } public class WeaponPosLayoutAdapter : MonoBehaviour { private void OnEnable() { PrefsManager.onPrefChanged = (Action)Delegate.Combine(PrefsManager.onPrefChanged, new Action(OnPrefChanged)); } private void OnDisable() { PrefsManager.onPrefChanged = (Action)Delegate.Remove(PrefsManager.onPrefChanged, new Action(OnPrefChanged)); } private void Start() { OnPrefChanged("weaponHoldPosition", MonoSingleton.Instance.GetInt("weaponHoldPosition", 0)); } private void OnPrefChanged(string key, object value) { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Invalid comparison between Unknown and I4 if (!(key == "weaponHoldPosition")) { return; } int num = (int)value; HorizontalLayoutGroup component = ((Component)this).GetComponent(); if ((Object)(object)component != (Object)null) { ((HorizontalOrVerticalLayoutGroup)component).reverseArrangement = num == 2; return; } GridLayoutGroup component2 = ((Component)this).GetComponent(); if ((Object)(object)component2 != (Object)null) { if ((int)component2.startCorner == 0 || (int)component2.startCorner == 1) { component2.startCorner = (Corner)(num == 2); } else { component2.startCorner = (Corner)((num == 2) ? 3 : 2); } } } } }