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 DataModel; using HarmonyLib; using Newtonsoft.Json; using RadialUI; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("DeepMenusPlugin")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Nth Dimension")] [assembly: AssemblyProduct("DeepMenusPlugin")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("DeepMenusPlugin")] [assembly: ComVisible(false)] [assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")] [assembly: AssemblyFileVersion("2.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("2.0.0.0")] namespace LordAshes; [BepInPlugin("org.lordashes.plugins.deepmenus", "Deep Menus Plugin", "2.0.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class DeepMenusPlugin : BaseUnityPlugin { [HarmonyPatch(typeof(CreatureMenuBoardTool), "Begin")] private class PatchOnOp { private static bool Prefix() { LoggingPlugin.LogTrace("Resetting Current Menu"); currentMenu = ""; return true; } } public const string Name = "Deep Menus Plugin"; public const string Guid = "org.lordashes.plugins.deepmenus"; public const string Version = "2.0.0.0"; public const string Author = "Lord Ashes"; public static DeepMenusPlugin _self = null; public static string currentMenu = ""; public static List menuItems = new List(); private void Awake() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown _self = this; LoggingPlugin.SetLogLevel(((BaseUnityPlugin)this).Config.Bind("Settings", "Diagnostic Level", (DiagnosticLevel)3, (ConfigDescription)null).Value); Debug.Log((object)(((object)this).GetType().AssemblyQualifiedName + ": Active. (Diagnostic Mode = " + ((object)LoggingPlugin.GetLogLevel()/*cast due to .constrained prefix*/).ToString() + ")")); Harmony val = new Harmony("org.lordashes.plugins.deepmenus"); val.PatchAll(); } public void CreateSubMenu(string menuLocation, ItemArgs item, Func checker = null) { item.Obj = "org.lordashes.plugins.deepmenus" + menuLocation; item.Action = delegate { NavigateTo(item.Title); }; EnsureMenuExists(menuLocation); RadialSubmenu.CreateSubMenuItem("org.lordashes.plugins.deepmenus" + menuLocation, item, (Action)null, checker); } public void CreateSubMenuItem(string menuLocation, ItemArgs item, Func checker = null) { item.Obj = "org.lordashes.plugins.deepmenus" + menuLocation; EnsureMenuExists(menuLocation); RadialSubmenu.CreateSubMenuItem("org.lordashes.plugins.deepmenus" + menuLocation, item, (Action)null, checker); } public ItemArgs MakeItemEntry(string item, Action callback, Sprite icon, bool fadeName = false, bool closeMenu = true) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0038: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown return new ItemArgs { Title = item, Action = delegate { callback(item, currentMenu); }, Icon = icon, FadeName = fadeName, CloseMenuOnActivate = closeMenu }; } public ItemArgs MakeSubMenuEntry(string item, Sprite icon, bool fadeName = false, bool closeMenu = true) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001f: 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_0038: 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_0048: Expected O, but got Unknown return new ItemArgs { Title = item, Action = delegate { NavigateTo(item); }, Icon = icon, FadeName = fadeName, CloseMenuOnActivate = closeMenu }; } public static void NavigateTo(string selection) { currentMenu = currentMenu + "/" + selection.ToString(); LoggingPlugin.LogDebug("Navigating To " + currentMenu); ((MonoBehaviour)_self).StartCoroutine(OpenSubMenu(currentMenu)); } private void EnsureMenuExists(string menuLocation) { FieldInfo fieldInfo = (from f in typeof(RadialSubmenu).GetRuntimeFields() where f.Name == "subMenuEntries" select f).ElementAt(0); Dictionary> dictionary = (Dictionary>)fieldInfo.GetValue(null); if (!dictionary.ContainsKey("org.lordashes.plugins.deepmenus" + menuLocation)) { dictionary.Add("org.lordashes.plugins.deepmenus" + menuLocation, new List()); fieldInfo.SetValue(null, dictionary); } } public static IEnumerator OpenSubMenu(string menuLocation) { yield return (object)new WaitForSeconds(0.1f); LoggingPlugin.LogDebug("Reopening Sub-Menu " + currentMenu); CreatureBoardAsset asset = default(CreatureBoardAsset); CreaturePresenter.TryGetAsset(new CreatureGuid(RadialUIPlugin.GetLastRadialTargetCreature()), ref asset); if (!((Object)(object)asset != (Object)null)) { yield break; } FieldInfo fi = (from f in typeof(RadialSubmenu).GetRuntimeFields() where f.Name == "subMenuEntries" select f).ElementAt(0); Dictionary> subMenuEntries = (Dictionary>)fi.GetValue(null); MapMenu mapMenu = MapMenuManager.OpenMenu(((Component)asset).transform.position + Vector3.up * 0.5f, true); foreach (ItemArgs item in subMenuEntries["org.lordashes.plugins.deepmenus" + menuLocation]) { mapMenu.AddItem(item); } } public static void RemoveMenuBranch(string menuLocation) { menuLocation = "org.lordashes.plugins.deepmenus" + menuLocation; FieldInfo field = typeof(RadialSubmenu).GetField("subMenuEntries", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { Dictionary> dictionary = (Dictionary>)field.GetValue(null); List list = new List(); for (int i = 0; i < dictionary.Count; i++) { LoggingPlugin.LogTrace("Found Entry " + dictionary.ElementAt(i).Key + " With " + dictionary.ElementAt(i).Value.Count + " Entries"); if (dictionary.ElementAt(i).Key.StartsWith(menuLocation)) { LoggingPlugin.LogTrace("Removing '" + dictionary.ElementAt(i).Key + "'s " + dictionary.ElementAt(i).Value.Count + " Entries"); list.Add(dictionary.ElementAt(i).Key); } else { LoggingPlugin.LogTrace("Keeping '" + dictionary.ElementAt(i).Key + "'s " + dictionary.ElementAt(i).Value.Count + " Entries"); } } { foreach (string item in list) { dictionary.Remove(item); } return; } } LoggingPlugin.LogWarning("Could Not Find Field 'subMenuEntries'"); } public static Dictionary> MenuEntries() { FieldInfo field = typeof(RadialSubmenu).GetField("subMenuEntries", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { Dictionary> dictionary = (Dictionary>)field.GetValue(null); return JsonConvert.DeserializeObject>>(JsonConvert.SerializeObject((object)dictionary)); } return null; } }