Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of TerminalPlus v1.1.2
TerminalPlus.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using LethalLevelLoader; using LethalLib.Modules; using MoreShipUpgrades.Managers; using MoreShipUpgrades.Misc.TerminalNodes; using TMPro; using TerminalPlus.LGU; using TerminalPlus.Mods; using UnityEngine; 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("TerminalPlus")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("TerminalPlus")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("649df9d8-4a43-40c9-9bc6-ed098cb5ed6e")] [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 TerminalPlus { [BepInPlugin("Slam.TerminalPlus", "TerminalPlus", "1.1.1")] public class PluginMain : BaseUnityPlugin { internal static ManualLogSource mls; internal static Harmony harmony = new Harmony("Slam.TerminalPlus"); private static PluginMain instance; public static ConfigFile configFile; internal static bool LLLExists = false; internal static bool LethalLibExists = false; internal static bool LGUExists = false; public static string PluginPath { get; } private void Awake() { if ((Object)(object)instance == (Object)null) { instance = this; } mls = Logger.CreateLogSource("TerminalPlus"); harmony.PatchAll(typeof(Nodes)); harmony.PatchAll(typeof(ConfigManager)); harmony.PatchAll(typeof(TerminalPatches)); harmony.PatchAll(typeof(PluginMain)); configFile = ((BaseUnityPlugin)this).Config; if (!File.Exists(((BaseUnityPlugin)this).Config.ConfigFilePath)) { configFile.Save(); } mls.LogInfo((object)"TerminalPlus has loaded!"); if (Chainloader.PluginInfos.ContainsKey("imabatby.lethallevelloader")) { LLLExists = true; harmony.PatchAll(typeof(LLLCompatibility)); mls.LogInfo((object)"LethalLevelLoader detected. Utilizing..."); } if (Chainloader.PluginInfos.ContainsKey("evaisa.lethallib")) { LethalLibExists = true; harmony.PatchAll(typeof(LethalLibCompatibility)); mls.LogInfo((object)"LethalLib detected. Utilizing..."); } if (Chainloader.PluginInfos.ContainsKey("com.malco.lethalcompany.moreshipupgrades")) { LGUExists = true; harmony.PatchAll(typeof(LGUCompatibility)); mls.LogInfo((object)"LateGameUpgrades detected. Utilizing..."); } } } public class Nodes { private readonly string symTwoHand = "<voffset=-1><space=-2.73><size=115%>I<space=-5.5>I</size><space=-2.73></voffset>"; private readonly string symConduct = "<voffset=-0.9><space=-0.64><size=115%><rotate=-45>Ϟ</rotate></size><space=-0.64></voffset>"; private readonly string symWeapon = "<voffset=-2.4><space=-0.83><size=135%><rotate=145>†</rotate></size><space=-2.12></voffset>"; private readonly string symBattery = "<voffset=-1.8><space=-0.63><size=115%>±</size><space=-0.63></voffset>"; private readonly string symValue = "<voffset=-1.5><space=-0.6><size=115%>$</size><space=-3.6></voffset>"; public static List<Item> storeItems = new List<Item>(); public static List<TerminalNode> storeDecorations = new List<TerminalNode>(); public static List<UnlockableItem> storeShipUpgrades = new List<UnlockableItem>(); private readonly string symDollar2 = "<space=0.256em><size=92%><voffset=0.72><rotate=-90><space=-0.39em>▲</rotate></voffset><size=74%><voffset=0.54><space=-0.6em>■</voffset></size></size><space=0.19em>"; public static int customSens = 136; public static bool terminalKeyPressed = false; public static float currentScrollPosition = 1f; public static int currentStep = 0; public static float stepValue = 0f; public static int loopCount = 0; public static List<TerminalNode> testNodes = new List<TerminalNode>(); public static bool[] priceOverride; public static string displayTime; public static string numTime; public static int placeholder; public static List<SelectableLevel> moonsList = new List<SelectableLevel>(); public static Dictionary<int, MoonMaster> moonMasters = new Dictionary<int, MoonMaster>(); public static List<MoonMaster> masterList = new List<MoonMaster>(); public static CompatibleNoun[] routeNouns = (CompatibleNoun[])(object)new CompatibleNoun[0]; public static TerminalNode[] confirmNodes = (from k in Resources.FindObjectsOfTypeAll<TerminalNode>() where k.buyRerouteToMoon >= 0 select k).ToArray(); public static string catalogueSort = " DEFAULT ⇩"; public static ManualLogSource mls = Logger.CreateLogSource("TerminalPlus"); public static Terminal terminal = Object.FindAnyObjectByType<Terminal>(); private static string[] nounTPList = new string[0]; public static int dayPowerMult = 0; public static int nightPowerMult = 0; public static int insidePowerMult = 0; public static int dayCountMult = 0; public static int nightCountMult = 0; public static int insideCountMult = 0; public static int sizeMult = 0; public static int valueMult = 0; public static int weatherMult = 0; internal static Dictionary<string, int> weathersDic = new Dictionary<string, int> { { string.Empty, 0 }, { "none", 0 }, { "dustclouds", 1 }, { "rainy", 2 }, { "stormy", 3 }, { "foggy", 4 }, { "flooded", 5 }, { "eclipsed", 6 }, { "[unknown]", 7 }, { "unknown", 7 } }; public string MainHelpPage() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(">MOONS\nTo see the list of moons your ship can route to.\n"); stringBuilder.AppendLine(">STORE\nTo see The Company Store's selection of items.\n"); stringBuilder.AppendLine(">BESTIARY\nTo see the list of wildlife on record.\n"); stringBuilder.AppendLine(">STORAGE\nTo access objects placed into storage.\n"); stringBuilder.AppendLine(">OTHER\nTo see the list of other commands.\n"); return stringBuilder.ToString(); } public string OtherHelpPage() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("<line-height=100%>Other Commands:\n"); stringBuilder.AppendLine(">VIEW MONITOR\nTo toggle ON and OFF the main monitor's map cam.\n"); stringBuilder.AppendLine(">SWITCH [Player Name]\nTo switch view to a player on the main monitor.\n"); stringBuilder.AppendLine(">PING [Rader Booster Name]\nTo make a radar booster play a noise.\n"); stringBuilder.AppendLine(">TRANSMIT [Message]\nTo transmit a message with the signal translator.\n"); stringBuilder.AppendLine(">SCAN\nTo scan the current moon for remaining items and their properties.\n"); stringBuilder.AppendLine(">SORT [sort setting]\nTo sort the moon catalogue by one of several possible settings. Type \"sort info\" for settings.\n"); stringBuilder.AppendLine(">REVERSE [sort setting]\nTo sort and reverse the moon catalogue. \n"); return stringBuilder.ToString(); } public string HelpInfoPage() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("\n\n <size=120%><color=yellow>\"SORT\"</color> and <color=red>\"REVERSE\"</color> Settings</size> "); stringBuilder.AppendLine("<line-height=70%> <size=120%>‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ "); stringBuilder.AppendLine("</line-height></size>>\"DEFAULT\" or \"ID\" <size=90%><color=yellow>(LOWEST first) <color=red>(HIGHEST first)</color></color></size>"); stringBuilder.AppendLine("Sorts moons by internal ID; the default setting.<line-height=50%>\n</line-height>"); stringBuilder.AppendLine(">\"NAME\" <size=90%><color=yellow>('A' first) <color=red>('Z' first)</color></color></size>"); stringBuilder.AppendLine("Sorts moons alphabetically by name.<line-height=50%>\n</line-height>"); stringBuilder.AppendLine(">\"PREFIX\" <size=90%><color=yellow>(LOWEST first) <color=red>(HIGHEST first)</color></color></size>"); stringBuilder.AppendLine("Sorts moons by prefix (number left of the name).<line-height=50%>\n</line-height>"); stringBuilder.AppendLine(">\"GRADE\" <size=90%><color=yellow>(WORST first) <color=red>(BEST first)</color></color></size>"); stringBuilder.AppendLine("Sorts moons by hazard level / grade (\"GD\").<line-height=50%>\n</line-height>"); stringBuilder.AppendLine(">\"PRICE\" <size=90%><color=yellow>(LOWEST first) <color=red>(HIGHEST first)</color></color></size>"); stringBuilder.AppendLine("Sorts moons by price.<line-height=50%>\n</line-height>"); stringBuilder.AppendLine(">\"WEATHER\" <size=90%><color=yellow>(CLEAR first) <color=red>(ECLIPSED first)</color></color></size>"); stringBuilder.AppendLine("Sorts moons by current weather conditions.<line-height=50%>\n</line-height>"); stringBuilder.AppendLine(">\"DIFFICULTY\" <size=90%><color=yellow>(EASIEST first) <color=red>(HARDEST first)</color></color></size>"); stringBuilder.AppendLine("Sorts moons by calculated difficulty.<line-height=50%>\n</line-height>"); stringBuilder.AppendLine(">\"CURRENT\", \"LIST\", or NONE <size=90%><color=yellow>(N/A) <color=red>(Reverse current)</color></color></size>"); stringBuilder.AppendLine("Reverse the current page."); return stringBuilder.ToString(); } public string RoutePage(TerminalNode terminalNode, Terminal terminal) { StringBuilder stringBuilder = new StringBuilder(); MoonMaster moonMaster = moonMasters[terminalNode.displayPlanetInfo]; string text = ((moonMaster.mPrefix.Length > 0) ? (moonMaster.mPrefix + "-" + moonMaster.mName) : moonMaster.mName); text = ((text.Length <= 26) ? text.ToUpper().PadRight(26) : text.Substring(0, 26).ToUpper()); string text2 = ((moonMaster.mWeather != string.Empty) ? moonMaster.mWeather : "Clear"); stringBuilder.AppendLine("\n<line-height=100%> "); stringBuilder.AppendLine("<line-height=100%> ╔═══════════════════╦═══════════─════─═══──═─-- -"); stringBuilder.AppendLine(" ║ ╦╗╔╗╦╗╔╗╦╦╔╦╗╔╗╔╗ ║ <voffset=-3>Preparing reroute to:</voffset> "); stringBuilder.AppendLine(" ║ ║╣╠ ║╣║║║║ ║ ╠ ╔╝ ║ <voffset=-18.5><size=125%>" + text + "</size></voffset>"); stringBuilder.AppendLine(" ║ ╩╚╚╝╩╚╚╝╚╝ ╩ ╚╝<voffset=3><space=2>□<space=-2></voffset> ║ "); stringBuilder.AppendLine(" ╚═══════════════════╝ \n"); stringBuilder.AppendLine(" +-──-"); stringBuilder.AppendLine(" │ Current Weather: " + text2); stringBuilder.AppendLine(" │ Hazard Lvl/Grade: " + moonMaster.mGrade); stringBuilder.AppendLine(" + "); stringBuilder.AppendLine($" │ Rerouting to {moonMaster.mName} costs ${moonMaster.mPrice}."); stringBuilder.AppendLine($" │ Your current balance is ${terminal.groupCredits}."); stringBuilder.AppendLine(" +-──-\n\n"); stringBuilder.AppendLine(" <space=0.2en>Please <size=120%>CONFIRM</size> (\"C\") or <size=120%>DENY</size> (\"D\")"); return stringBuilder.ToString(); } public string Logo() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(" ╔═════╗ ╔═╗ ╔═╗ "); stringBuilder.AppendLine(" ╚═╗ ╔═╝═╗══╗════╬═╣═══╗═══╣ ║ "); stringBuilder.AppendLine(" ║ ║ '═╣ ╔╝ ║ ║ ║ ' ║ ║ "); stringBuilder.AppendLine(" ╚═╝═══╝═╝═╩═╩═╝═╝═╩═╝═╩═╝═╝ <line-height=40%>"); stringBuilder.AppendLine("</li ╔══╗══╗══════════════════════════╗══════════════╗╗"); stringBuilder.AppendLine(" ║ ╔════════════════════╗══════════════════════╗╗ ║"); stringBuilder.AppendLine(" ║ ║ ╔═══════╗╗╔════╗╗ ╔══╗╗ ╔══╗╗╔═══════╗╗ ║ ║"); stringBuilder.AppendLine(" ║ ║ ╚═╗ ╔══╗ ║╚═╗ ╔═╝ ╚╗ ╔╝ ╚╗ ╔╝║ ╔════╗ ║ ║ ║"); stringBuilder.AppendLine(" ║ ║ ║ ╚══╝ ║ ║ ║ ║ ║ ║ ║ ║ ╚╗═══╩╗╣ ║ ║"); stringBuilder.AppendLine(" ║ ║ ║ ╔══╗═╝ ║ ║ ╔╗╗║ ║ ║ ║ ╠═╗════╗ ║ ║ ║"); stringBuilder.AppendLine(" ║ ║ ╔═╝ ╚╗╗ ╔═╝ ╚══╝ ║║ ╚╗══╝ ║ ║ ╚════╝ ║ ║ ║"); stringBuilder.AppendLine(" ║ ║ ╚╗════╝ ╚═╗═╗════╝╚═════╗═╝ ╚═══╗══╗═╝ ║ ║"); stringBuilder.AppendLine(" ║ ╚═════════════════════════════════╗══════════╝ ║"); stringBuilder.AppendLine(" ╚══════╗═══════════════╗════════╗═══════════╗════╝"); return stringBuilder.ToString(); } public string ScanShipPage() { List<GrabbableObject> list = new List<GrabbableObject>(); string empty = string.Empty; list = (from g in Resources.FindObjectsOfTypeAll<GrabbableObject>() where !g.itemProperties.isScrap && ((Object)g.itemProperties).name != "Clipboard" && ((Object)g.itemProperties).name != "StickyNote" && (g.isInShipRoom || g.isInElevator) select g).ToList(); list.Sort((GrabbableObject a, GrabbableObject b) => a.itemProperties.creditsWorth.CompareTo(b.itemProperties.creditsWorth)); int count = list.FindAll((GrabbableObject c) => c.itemProperties.isConductiveMetal).Count; int count2 = list.FindAll((GrabbableObject t) => t.itemProperties.twoHanded).Count; int count3 = list.FindAll((GrabbableObject w) => w.itemProperties.isDefensiveWeapon).Count; int count4 = list.FindAll((GrabbableObject b) => b.itemProperties.requiresBattery).Count; int num = list.Sum((GrabbableObject v) => v.scrapValue); string text = ((count <= 19) ? string.Empty.PadLeft(count, '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text2 = ((count2 <= 19) ? string.Empty.PadLeft(count2, '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text3 = ((count3 <= 19) ? string.Empty.PadLeft(count3, '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text4 = ((count4 <= 19) ? string.Empty.PadLeft(count4, '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text5 = ((num <= 1949) ? string.Empty.PadLeft(Mathf.RoundToInt((float)(num / 100)), '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text6 = ((list.Count <= 19) ? string.Empty.PadLeft(list.Count, '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text7 = ((count <= 999) ? count.ToString().PadLeft(2, '0').PadRight(5) : "999+ "); string text8 = ((count2 <= 999) ? count2.ToString().PadLeft(2, '0').PadRight(5) : "999+ "); string text9 = ((count3 <= 999) ? count3.ToString().PadLeft(2, '0').PadRight(5) : "999+ "); string text10 = ((count4 <= 999) ? count4.ToString().PadLeft(2, '0').PadRight(5) : "999+ "); string text11 = ((num <= 9999) ? num.ToString().PadRight(5) : "9999+"); string text12 = ((list.Count <= 999) ? list.Count.ToString().PadLeft(2, '0').PadRight(5) : "999+ "); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("\n<line-height=100%> "); stringBuilder.AppendLine("<line-height=100%> ╔════╗_╔════╦═══════════════════════╗_╔═══════╗ "); stringBuilder.AppendLine(" ║ │‾ ║ <voffset=-0.4em>╔═╗╔═╗╔═╗╔╗╔</voffset> ┌────┐ ║‾ ║ "); stringBuilder.AppendLine(" ║ │ ║ <voffset=-0.4em>╚═╗║ ╠═╣║║║</voffset> │+--+│ ║ ╚═╗"); stringBuilder.AppendLine(" ║ │ ║ <voffset=-0.4em>╚═╝╚═╝╩ ╩╝╚╝</voffset> │+-+-│ ║ ║"); stringBuilder.AppendLine(" ║ │ ║ <voffset=-0.4em>ITEM SUMMARY</voffset> │-+-+│ ║ ║"); stringBuilder.AppendLine(" ║ │ ║ └────┘ ║ ║"); stringBuilder.AppendLine(" ║ ╰──────╚═══════════════════════╝ ║"); stringBuilder.AppendLine(" ║ ║"); stringBuilder.AppendLine(" ║ ╭─────────────────────────────────────╮ ║"); stringBuilder.AppendLine(" ║[--]│ SCANNING: Company-Ship™ Equipment │[--]║"); stringBuilder.AppendLine(" ║[---╯ ----------------------------------- ╰---]║"); stringBuilder.AppendLine(" ║] ╔═══════════════════╗ [║"); stringBuilder.AppendLine(" ║] Two-Handed [" + symTwoHand + "]║" + text2 + "║" + text8 + " [║"); stringBuilder.AppendLine(" ║] Conductive [" + symConduct + "]║" + text + "║" + text7 + " [║"); stringBuilder.AppendLine(" ║] Is Weapon [" + symWeapon + "]║" + text3 + "║" + text9 + " [║"); stringBuilder.AppendLine(" ║] Has Battery [" + symBattery + "]║" + text4 + "║" + text10 + " [║"); stringBuilder.AppendLine(" ║] Total Items [∑]║" + text6 + "║" + text12 + " [║"); stringBuilder.AppendLine(" ║] Total Value [" + symValue + "]║" + text5 + "║" + text11 + " [║"); stringBuilder.AppendLine(" ║] ╠╤╤╤╤╦╤╤╤╤╦╤╤╤╤╦╤╤╤╤╣ [║"); stringBuilder.AppendLine(" ║[-╮ 0 5 10 15 20+ ╭-]║"); if (list.Count > 0) { stringBuilder.AppendLine(" ╠══╧══════════════════╦═══════╦═══════╦══════╧══╣"); stringBuilder.AppendLine(" ║ EQUIPMENT NAME ║ OWNED ║ WGT. ║ NOTES ║"); stringBuilder.AppendLine(" ╠═════════════════════╩═══════╩═══════╩═════════╣"); foreach (GrabbableObject item in list) { string itemName = item.itemProperties.itemName; string text13 = item.itemProperties.creditsWorth.ToString(); string text14 = Mathf.RoundToInt(Mathf.Clamp(item.itemProperties.weight - 1f, 0f, 100f) * 105f).ToString(); string text15 = (item.itemProperties.twoHanded ? symTwoHand : " "); string text16 = (item.itemProperties.isConductiveMetal ? symConduct : " "); string text17 = (item.itemProperties.isDefensiveWeapon ? symWeapon : " "); string text18 = (item.itemProperties.requiresBattery ? symBattery : " "); string text19 = " " + text15 + " " + text16 + " " + text17 + " " + text18 + " "; itemName = ((itemName.Length <= 19) ? itemName.PadRight(19) : (itemName.Substring(0, 16) + "...")); text13 = ((text13.Length <= 4) ? text13.PadRight(4) : "9999"); text14 = ((text14.Length <= 3) ? text14.PadRight(3) : "999"); stringBuilder.AppendLine(" ║ " + itemName + " | <space=-1.5>$<space=-1>" + text13 + " | " + text14 + "lb |" + text19 + "║"); } } else { stringBuilder.AppendLine(" ╠══╧═════════════════════════════════════════╧══╣"); stringBuilder.AppendLine(" ║ NO EQUIPMENT FOUND :( ║"); } stringBuilder.AppendLine(" ╠═══════════════════════════════════════════════╣"); stringBuilder.AppendLine(" ║└──┘╰─────────────────────────────────────╯└──┘║"); stringBuilder.AppendLine(" ║ │ │ ║"); stringBuilder.AppendLine(" ╚════╧═════════════════════════════════════╧════╝"); return stringBuilder.ToString(); } public string ScanMoonPage() { List<GrabbableObject> list = new List<GrabbableObject>(); string empty = string.Empty; string text = "<voffset=-1><space=-2.73><size=115%>I<space=-5.5>I</size><space=-2.73></voffset>"; string text2 = "<voffset=-0.9><space=-0.64><size=115%><rotate=-45>Ϟ</rotate></size><space=-0.64></voffset>"; string text3 = "<voffset=-2.4><space=-0.83><size=135%><rotate=145>†</rotate></size><space=-2.12></voffset>"; string text4 = "<voffset=-1.8><space=-0.63><size=115%>±</size><space=-0.63></voffset>"; string text5 = "<voffset=-1.5><space=-0.6><size=115%>$</size><space=-3.6></voffset>"; if (((Object)StartOfRound.Instance.currentLevel).name == "CompanyBuildingLevel" || StartOfRound.Instance.inShipPhase) { list = (from g in Object.FindObjectsOfType<GrabbableObject>() where g.itemProperties.isScrap && (g.isInShipRoom || g.isInElevator) select g).ToList(); empty = " Company-Ship™ Interior".PadRight(24); } else { list = (from g in Object.FindObjectsOfType<GrabbableObject>() where g.itemProperties.isScrap && !g.isInShipRoom && !g.isInElevator select g).ToList(); empty = ((StartOfRound.Instance.currentLevel.PlanetName.Length <= 22) ? ("\"" + StartOfRound.Instance.currentLevel.PlanetName + "\"").PadRight(24) : ("\"" + StartOfRound.Instance.currentLevel.PlanetName.Substring(0, 19) + "...\"")); } list.Sort((GrabbableObject a, GrabbableObject b) => a.scrapValue.CompareTo(b.scrapValue)); int count = list.FindAll((GrabbableObject c) => c.itemProperties.isConductiveMetal).Count; int count2 = list.FindAll((GrabbableObject t) => t.itemProperties.twoHanded).Count; int count3 = list.FindAll((GrabbableObject w) => w.itemProperties.isDefensiveWeapon).Count; int count4 = list.FindAll((GrabbableObject b) => b.itemProperties.requiresBattery).Count; int num = list.Sum((GrabbableObject v) => v.scrapValue); string text6 = ((count <= 19) ? string.Empty.PadLeft(count, '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text7 = ((count2 <= 19) ? string.Empty.PadLeft(count2, '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text8 = ((count3 <= 19) ? string.Empty.PadLeft(count3, '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text9 = ((count4 <= 19) ? string.Empty.PadLeft(count4, '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text10 = ((num <= 1949) ? string.Empty.PadLeft(Mathf.RoundToInt((float)(num / 100)), '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text11 = ((list.Count <= 19) ? string.Empty.PadLeft(list.Count, '█').PadRight(19, '.') : string.Empty.PadLeft(19, '█')); string text12 = ((count <= 999) ? count.ToString().PadLeft(2, '0').PadRight(5) : "999+ "); string text13 = ((count2 <= 999) ? count2.ToString().PadLeft(2, '0').PadRight(5) : "999+ "); string text14 = ((count3 <= 999) ? count3.ToString().PadLeft(2, '0').PadRight(5) : "999+ "); string text15 = ((count4 <= 999) ? count4.ToString().PadLeft(2, '0').PadRight(5) : "999+ "); string text16 = ((num <= 9999) ? num.ToString().PadRight(5) : "9999+"); string text17 = ((list.Count <= 999) ? list.Count.ToString().PadLeft(2, '0').PadRight(5) : "999+ "); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("\n<line-height=100%> "); stringBuilder.AppendLine("<line-height=100%> ╔════╗_╔════╦═══════════════════════╗_╔═══════╗ "); stringBuilder.AppendLine(" ║ │‾ ║ <voffset=-0.4em>╔═╗╔═╗╔═╗╔╗╔</voffset> ┌────┐ ║‾ ║ "); stringBuilder.AppendLine(" ║ │ ║ <voffset=-0.4em>╚═╗║ ╠═╣║║║</voffset> │+--+│ ║ ╚═╗"); stringBuilder.AppendLine(" ║ │ ║ <voffset=-0.4em>╚═╝╚═╝╩ ╩╝╚╝</voffset> │+-+-│ ║ ║"); stringBuilder.AppendLine(" ║ │ ║ <voffset=-0.4em>ITEM SUMMARY</voffset> │-+-+│ ║ ║"); stringBuilder.AppendLine(" ║ │ ║ └────┘ ║ ║"); stringBuilder.AppendLine(" ║ ╰──────╚═══════════════════════╝ ║"); stringBuilder.AppendLine(" ║ ║"); stringBuilder.AppendLine(" ║ ╭─────────────────────────────────────╮ ║"); stringBuilder.AppendLine(" ║[--]│ SCANNING: " + empty + " │[--]║"); if (!ConfigManager.detailedScan) { string text18 = $"There is currently {list.Count} total scrap".PadRight(35); int num2 = (10 - num.ToString().Length) / 2; int totalWidth = 10 - num.ToString().Length - num2; string text19 = $"<size=120%>$</size><space=-3>{Mathf.RoundToInt((float)(num / 100)) * 100}<space=-2>"; stringBuilder.AppendLine(" ║[ ]│ ----------------------------------- │[ ]║"); stringBuilder.AppendLine(" ║[--]│ " + text18 + " │[--]║"); stringBuilder.AppendLine(" ║[ ]│ with an approximate total value of: │[ ]║"); stringBuilder.AppendLine(" ║[--]│ │[--]║"); stringBuilder.AppendLine(" ║[ ]│ ---------- " + string.Empty.PadLeft(num2) + text19 + string.Empty.PadRight(totalWidth) + " ---------- │[ ]║"); stringBuilder.AppendLine(" ║[---╯ ╰---]║"); } else { stringBuilder.AppendLine(" ║[---╯ ----------------------------------- ╰---]║"); stringBuilder.AppendLine(" ║] ╔═══════════════════╗ [║"); stringBuilder.AppendLine(" ║] Two-Handed [" + text + "]║" + text7 + "║" + text13 + " [║"); stringBuilder.AppendLine(" ║] Conductive [" + text2 + "]║" + text6 + "║" + text12 + " [║"); stringBuilder.AppendLine(" ║] Is Weapon [" + text3 + "]║" + text8 + "║" + text14 + " [║"); stringBuilder.AppendLine(" ║] Has Battery [" + text4 + "]║" + text9 + "║" + text15 + " [║"); stringBuilder.AppendLine(" ║] Total Scrap [∑]║" + text11 + "║" + text17 + " [║"); stringBuilder.AppendLine(" ║] Total Value [" + text5 + "]║" + text10 + "║" + text16 + " [║"); stringBuilder.AppendLine(" ║] ╠╤╤╤╤╦╤╤╤╤╦╤╤╤╤╦╤╤╤╤╣ [║"); stringBuilder.AppendLine(" ║[-╮ 0 5 10 15 20+ ╭-]║"); if (list.Count > 0) { stringBuilder.AppendLine(" ╠══╧══════════════════╦═══════╦═══════╦══════╧══╣"); stringBuilder.AppendLine(" ║ ITEM NAME ║ VALUE ║ WGT. ║ NOTES ║"); stringBuilder.AppendLine(" ╠═════════════════════╩═══════╩═══════╩═════════╣"); foreach (GrabbableObject item in list) { string itemName = item.itemProperties.itemName; string text20 = item.scrapValue.ToString(); string text21 = Mathf.RoundToInt(Mathf.Clamp(item.itemProperties.weight - 1f, 0f, 100f) * 105f).ToString(); string text22 = (item.itemProperties.twoHanded ? text : " "); string text23 = (item.itemProperties.isConductiveMetal ? text2 : " "); string text24 = (item.itemProperties.isDefensiveWeapon ? text3 : " "); string text25 = (item.itemProperties.requiresBattery ? text4 : " "); string text26 = " " + text22 + " " + text23 + " " + text24 + " " + text25 + " "; itemName = ((itemName.Length <= 19) ? itemName.PadRight(19) : (itemName.Substring(0, 16) + "...")); text20 = ((text20.Length <= 4) ? text20.PadRight(4) : "9999"); text21 = ((text21.Length <= 3) ? text21.PadLeft(3) : "999"); stringBuilder.AppendLine(" ║ " + itemName + " | <space=-1.5>$<space=-1>" + text20 + " | " + text21 + "lb |" + text26 + "║"); } } else { stringBuilder.AppendLine(" ╠══╧═════════════════════════════════════════╧══╣"); stringBuilder.AppendLine(" ║ NO SCRAP FOUND :( ║"); } } stringBuilder.AppendLine(" ╠═══════════════════════════════════════════════╣"); stringBuilder.AppendLine(" ║└──┘╰─────────────────────────────────────╯└──┘║"); stringBuilder.AppendLine(" ║ │ │ ║"); stringBuilder.AppendLine(" ╚════╧═════════════════════════════════════╧════╝"); return stringBuilder.ToString(); } public string StorePage(Terminal terminal) { List<GrabbableObject> list = GameObject.Find("/Environment/HangarShip").GetComponentsInChildren<GrabbableObject>().ToList(); storeItems = terminal.buyableItemsList.OrderBy((Item x) => x.itemName).ToList(); if (PluginMain.LethalLibExists) { LethalLibCompatibility.RemoveHiddenStoreItems(terminal); } storeDecorations = terminal.ShipDecorSelection.OrderBy((TerminalNode x) => x.creatureName).ToList(); storeShipUpgrades = StartOfRound.Instance.unlockablesList.unlockables.Where((UnlockableItem x) => x.unlockableType == 1 && x.alwaysInStock).ToList(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("\n\n ╔═══════════════════════════════════════════════╗"); stringBuilder.AppendLine(" ║ ♥- ╔╦╗╗╔╔╗ ╔╗╔╗╦╦╗╔╗╔╗╦╗╗╔ ╔╗╔╦╗╔╗╦╗╔╗ -♣ ║"); stringBuilder.AppendLine(" ║ | ║ ╠╣╠ ║ ║║║║║╠╝╠╣║║╠╝ ╚╗ ║ ║║║╣╠ | ║"); stringBuilder.AppendLine(" ║ ♠- ╩ ╝╚╚╝ ╚╝╚╝╩ ╩╩ ╩╩╩╚╚ ╚╝ ╩ ╚╝╩╚╚╝ -♦ ║"); stringBuilder.AppendLine(" ╠══════════════════════╦═══════╦═════╦══════════╣"); stringBuilder.AppendLine(" ║ <space=0.265en>ITEM/UNLOCKABLE<space=0.265en> ║ PRICE ║<space=0.265en>SALE<space=0.265en>║ STATUS ║"); stringBuilder.AppendLine(" ╠══════════════════════╩═══════╩═════╩══════════╣"); foreach (Item item in storeItems) { if (terminal.buyableItemsList.ToList().IndexOf(item) >= 0) { string text = ((item.itemName.Length > 20) ? (item.itemName.Substring(0, 17) + "...") : item.itemName.PadRight(20)); int num = terminal.itemSalesPercentages[terminal.buyableItemsList.ToList().IndexOf(item)]; string text2 = $"{100 - num}%".PadLeft(3); if (text2 == " 0%") { text2 = " "; } else if (text2 == "100%") { text2 = "X$X"; } int num2 = (int)Math.Round((float)item.creditsWorth * ((float)num / 100f)); if (num2 > 9999) { num2 = 9999; } int count = list.FindAll((GrabbableObject x) => x.itemProperties.itemName == item.itemName).Count; string text3 = count.ToString(); text3 = ((count > 99) ? "Over 100" : ((count <= 0) ? " " : ((count >= 10) ? (count.ToString().PadRight(2) + " Owned") : (count.ToString().PadLeft(2, '0') + " Owned")))); stringBuilder.AppendLine($" ║ {text} |<cspace=-2> $</cspace>{num2,-4}<cspace=-0.6> |</cspace> {text2} | {text3} ║"); } } stringBuilder.AppendLine(" ╠═══════════════════════════════════════════════╣"); storeShipUpgrades.OrderBy((UnlockableItem x) => x.unlockableName).ToList(); Dictionary<string, string> dictionary = new Dictionary<string, string> { { "teleporter", "375 " }, { "signal translator", "255 " }, { "loud horn", "100 " }, { "inverse teleporter", "425 " } }; foreach (UnlockableItem upgrade in storeShipUpgrades) { TerminalNode shopSelectionNode = upgrade.shopSelectionNode; string empty = string.Empty; string unlockableName = upgrade.unlockableName; if (dictionary.ContainsKey(upgrade.unlockableName.ToLower())) { empty = dictionary[upgrade.unlockableName.ToLower()]; } else if ((Object)(object)shopSelectionNode != (Object)null) { empty = shopSelectionNode.itemCost.ToString().PadRight(4); } else { shopSelectionNode = Object.FindObjectsOfType<TerminalNode>().ToList().Find((TerminalNode x) => x.shipUnlockableID == StartOfRound.Instance.unlockablesList.unlockables.ToList().IndexOf(upgrade)); empty = ((!((Object)(object)shopSelectionNode != (Object)null)) ? "??? " : shopSelectionNode.itemCost.ToString().PadRight(4)); } unlockableName = ((unlockableName.Length > 20) ? (unlockableName.Substring(0, 17) + "...") : unlockableName.PadRight(20)); if (upgrade.alreadyUnlocked || upgrade.hasBeenUnlockedByPlayer) { stringBuilder.AppendLine(" ║ " + unlockableName + " |<cspace=-2> $</cspace>" + empty + "<cspace=-0.6> |</cspace> | UNLOCKED ║"); } else { stringBuilder.AppendLine(" ║ " + unlockableName + " |<cspace=-2> $</cspace>" + empty + "<cspace=-0.6> |</cspace> | ║"); } } if (PluginMain.LGUExists && ConfigManager.showLGUStore) { stringBuilder.Append(LGUCompatibility.LGUString()); } stringBuilder.AppendLine(" ╠═══════════════════════════════════════════════╣"); foreach (TerminalNode storeDecoration in storeDecorations) { UnlockableItem val = StartOfRound.Instance.unlockablesList.unlockables[storeDecoration.shipUnlockableID]; storeDecoration.creatureName = ((storeDecoration.creatureName.Length > 20) ? (storeDecoration.creatureName.Substring(0, 17) + "...") : storeDecoration.creatureName.PadRight(20)); if (val != null && (val.alreadyUnlocked || val.hasBeenUnlockedByPlayer)) { stringBuilder.AppendLine($" ║ {storeDecoration.creatureName} |<cspace=-2> $</cspace>{storeDecoration.itemCost,-4}<cspace=-0.6> |</cspace> | UNLOCKED ║"); } else if (val != null) { stringBuilder.AppendLine($" ║ {storeDecoration.creatureName} |<cspace=-2> $</cspace>{storeDecoration.itemCost,-4}<cspace=-0.6> |</cspace> | ║"); } } stringBuilder.AppendLine(" ╚═══════════════════════════════════════════════╝"); return stringBuilder.ToString(); } public string MoonsPage() { StringBuilder stringBuilder = new StringBuilder(); if (ConfigManager.activeKilroy) { stringBuilder.AppendLine("<line-height=100%> _____ "); stringBuilder.AppendLine(" | . . | "); stringBuilder.AppendLine(" ╔═══════════════════════════════════ooO═| |═Ooo═╗"); stringBuilder.AppendLine(" ║ ╦╦╗╔╗╔╗╦╗ ╔╗╔╗╔╦╗╔╗╦ ╔╗╔╗╦╦╔╗ ╰—╯ ║"); } else { stringBuilder.AppendLine("<line-height=100%>\n "); stringBuilder.AppendLine(" ╔═══════════════════════════════════════════════╗"); stringBuilder.AppendLine(" ║ ╦╦╗╔╗╔╗╦╗ ╔╗╔╗╔╦╗╔╗╦ ╔╗╔╗╦╦╔╗ ║"); } stringBuilder.AppendLine(" ║ ║║║║║║║║║ ║ ╠╣ ║ ╠╣║ ║║║╦║║╠ SORTING BY: ║"); stringBuilder.AppendLine(" ║ ╩ ╩╚╝╚╝╩╚ ╚╝╩╩ ╩ ╩╩╩╝╚╝╚╝╚╝╚╝ " + catalogueSort + " ║"); stringBuilder.AppendLine(" ╠═════════════════════╦════╦═══════╦════════════╣"); stringBuilder.AppendLine(" ║ MOON REGISTRY ║ GD ║ PRICE ║<cspace=0.85> WEATHER </cspace>║"); stringBuilder.AppendLine(" ╠═════════════════════╩════╩═══════╩════════════╣"); int num = 0; bool flag = true; SelectableLevel moon = ScriptableObject.CreateInstance<SelectableLevel>(); MoonMaster moonMaster = new MoonMaster(moon); foreach (MoonMaster master in masterList) { if (!master.mVis) { continue; } if ((ConfigManager.evenSort || !catalogueSort.Contains("GRADE") || flag || master.mGrade[0] == moonMaster.mGrade[0]) && (ConfigManager.evenSort || !catalogueSort.Contains("PRICE") || flag || Math.Abs(master.mPrice - moonMaster.mPrice) <= 400) && (ConfigManager.evenSort || !catalogueSort.Contains("WEATHER") || flag || !(master.dispWeather != moonMaster.dispWeather)) && num < 3) { stringBuilder.AppendLine(" ║ " + master.dispPrefix + " " + master.dispName + " |" + master.dispGrade + "|" + $" {symDollar2}{master.mPrice,-4} | {master.dispWeather,-10} ║"); if (master.halfWeather != string.Empty) { stringBuilder.AppendLine($" ╠ | | | {master.halfWeather,-10} ╣"); } moonMaster = master; flag = false; num++; } else { stringBuilder.AppendLine(" ╠-----—---------------|----|-------|------------╣"); stringBuilder.AppendLine(" ║ " + master.dispPrefix + " " + master.dispName + " |" + master.dispGrade + "|" + $" {symDollar2}{master.mPrice,-4} | {master.dispWeather,-10} ║"); if (master.halfWeather != string.Empty) { stringBuilder.AppendLine($" ╠ | | | {master.halfWeather,-10} ╣"); } num = 1; moonMaster = master; } } stringBuilder.AppendLine(" ╠═══════════════════════════════════════════════╣"); stringBuilder.AppendLine(string.Format(" ║ The Company is currently buying at {0,-5} ║", (int)(StartOfRound.Instance.companyBuyingRate * 100f) + "%")); stringBuilder.AppendLine(" ║ ------------------------- ║"); stringBuilder.AppendLine($" ║ You have {(int)Mathf.Floor(TimeOfDay.Instance.timeUntilDeadline / TimeOfDay.Instance.totalTime)} days left to complete your quota ║"); stringBuilder.AppendLine(" ╚═══════════════════════════════════════════════╝"); return stringBuilder.ToString(); } [HarmonyPatch(typeof(Scrollbar), "Set")] [HarmonyPostfix] public static void SBSPatch(float input, bool sendCallback) { if ((Object)(object)terminal != (Object)null && terminal.terminalInUse) { StackTrace stackTrace = new StackTrace(); if (stackTrace.GetFrame(3).GetMethod().Name == "MoveNext") { loopCount++; } else if (loopCount >= 4) { loopCount = 0; } } } [HarmonyPatch(typeof(Terminal), "Update")] [HarmonyPostfix] public static void TUPatch(ref float ___timeSinceLastKeyboardPress, Terminal __instance) { if (__instance.terminalInUse) { __instance.scrollBarCanvasGroup.alpha = 1f; terminalKeyPressed = (double)___timeSinceLastKeyboardPress < 0.08; if ((double)TerminalPatches.timeSinceSubmit < 0.07) { __instance.scrollBarVertical.value = 1f; } } TerminalPatches.timeSinceSubmit += Time.deltaTime; } [HarmonyPatch(typeof(Terminal), "QuitTerminal")] [HarmonyPostfix] public static void QTPatch(Terminal __instance) { __instance.scrollBarVertical.value = (currentScrollPosition = 1f); } [HarmonyPatch(typeof(Terminal), "BeginUsingTerminal")] [HarmonyPrefix] public static void ResetSubmitPatch() { TerminalPatches.timeSinceSubmit = 0f; } [HarmonyPatch(typeof(ScrollRect), "UpdateScrollbars")] [HarmonyPostfix] public static void ScrollTest(Vector2 offset, ref Bounds ___m_ContentBounds, ref Bounds ___m_ViewBounds, ref RectTransform ___m_Content, ref Vector2 ___m_PrevPosition, ScrollRect __instance) { //IL_002d: 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_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_0119: 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) if (!((Object)(object)terminal != (Object)null) || !terminal.terminalInUse) { return; } __instance.verticalScrollbarVisibility = (ScrollbarVisibility)2; float num = ((Bounds)(ref ___m_ContentBounds)).size.y - ((Bounds)(ref ___m_ViewBounds)).size.y; int num2 = ((customSens == 0 || Mathf.RoundToInt(num / (float)Mathf.Abs(customSens)) <= 1) ? 1 : Mathf.CeilToInt(num / (float)Mathf.Abs(customSens))); if (num < 200f && num > 0f) { num2 = Mathf.CeilToInt(num / 65f); } else if (num2 <= 1 && num > 0f) { num2 = 2; } if (num2 < 1) { num2 = 1; } if (Mathf.RoundToInt(___m_PrevPosition.y) != Mathf.RoundToInt(___m_Content.anchoredPosition.y)) { if (___m_Content.anchoredPosition.y - ___m_PrevPosition.y > 0f) { currentStep++; } else if (___m_Content.anchoredPosition.y - ___m_PrevPosition.y < 0f) { currentStep--; } } Mathf.Clamp(currentStep, 0, num2); if (TerminalPatches.timeSinceSubmit <= 0.08f || loopCount > 0) { currentScrollPosition = 1f; currentStep = (loopCount = 0); ___m_Content.anchoredPosition = Vector2.zero; } else if (terminalKeyPressed) { currentScrollPosition = 0f; currentStep = num2; } else { currentScrollPosition = Mathf.Clamp01(1f - (float)currentStep / (float)num2); } __instance.verticalNormalizedPosition = currentScrollPosition; } [HarmonyPatch(typeof(TimeOfDay), "OnDayChanged")] [HarmonyPostfix] public static void TermUpdate() { //IL_00d0: Unknown result type (might be due to invalid IL or missing references) mls.LogInfo((object)"Updating Moon Catalogue..."); foreach (MoonMaster moonTU in moonMasters.Values) { mls.LogInfo((object)("current moon: " + moonTU.mName)); if (moonTU.mPriceOR) { mls.LogDebug((object)"PRICE OVERRIDE ACTIVE"); moonTU.mPrice = ((IEnumerable<CompatibleNoun>)routeNouns).FirstOrDefault((Func<CompatibleNoun, bool>)((CompatibleNoun n) => n.result.displayPlanetInfo == moonTU.mID)).result.itemCost; } UpdateMoonWeather(); } TerminalPatches.clockBG.localScale = Vector3.zero; ((TMP_Text)TerminalPatches.terminalClock).text = string.Empty; } [HarmonyPatch(typeof(StartOfRound), "StartGame")] [HarmonyPostfix] public static void ClockPatch() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: 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_00ff: Unknown result type (might be due to invalid IL or missing references) mls.LogDebug((object)"day start"); switch (ConfigManager.clockSetting) { case 0: TerminalPatches.clockBG.localScale = Vector3.zero; break; case 1: TerminalPatches.clockBG.localScale = new Vector3(1.9f, 1.1f, 1f); TerminalPatches.clockBG.localPosition = new Vector3(175f, 208f, -1f); break; case 2: TerminalPatches.clockBG.localScale = new Vector3(1.25f, 1.1f, 1f); TerminalPatches.clockBG.localPosition = new Vector3(198f, 208f, -1f); break; case 3: TerminalPatches.clockBG.localScale = new Vector3(1.28f, 1.1f, 1f); TerminalPatches.clockBG.localPosition = new Vector3(197f, 208f, -1f); break; } } [HarmonyPatch(typeof(HUDManager), "SetClock")] [HarmonyPostfix] public static void TerminalTime(float timeNormalized, float numberOfHours, bool createNewLine, HUDManager __instance) { string text = ((((TMP_Text)__instance.clockNumber).text != null) ? ((TMP_Text)__instance.clockNumber).text : string.Empty); numTime = text.Substring(0, text.IndexOf(':')); switch (ConfigManager.clockSetting) { case 0: displayTime = string.Empty; break; case 1: displayTime = text.Replace("\n", "<space=0.4en>"); break; case 2: displayTime = numTime + "<space=0.6en>" + text.Substring(text.Length - 2); break; case 3: { if (int.TryParse(numTime, out var result)) { displayTime = ((text.ToLower().Contains("pm") && result != 12) ? (result + 12) : result) + text.Substring(text.IndexOf(':'), text.Length - 4); } else { displayTime = string.Empty; } break; } } ((TMP_Text)TerminalPatches.terminalClock).text = displayTime; } public static void UpdateMoonWeather() { if (PluginMain.LLLExists) { LLLCompatibility.ModdedWeathers(); } foreach (MoonMaster value in moonMasters.Values) { string text = (PluginMain.LLLExists ? value.dispWeather : ((object)(LevelWeatherType)(ref value.mLevel.currentWeather)).ToString()); value.halfWeather = string.Empty; if ((text == "None" || text == string.Empty) && ConfigManager.showClear) { if (Chainloader.PluginInfos.ContainsKey("WeatherTweaks")) { value.dispWeather = (value.mWeather = "None"); } else { value.dispWeather = (value.mWeather = "Clear"); } } else if (text == "None" || text == string.Empty) { value.dispWeather = (value.mWeather = string.Empty); } else if (text.Length > 10 && !ConfigManager.longWeather) { value.dispWeather = "Complex"; } else if (text.Length > 10 && text.Contains("/") && text.IndexOf('/') <= 10) { mls.LogDebug((object)"splitting weather at slash"); value.dispWeather = text.Substring(0, text.IndexOf('/') + 1); value.halfWeather = text.Substring(text.IndexOf("/") + 1); value.mWeather = text; } else if (text.Length > 10 && text.Contains(" ") && text.IndexOf(' ') <= 10) { mls.LogDebug((object)"splitting weather at space"); value.dispWeather = text.Substring(0, text.IndexOf(' ') + 1); value.halfWeather = text.Substring(text.IndexOf(' ') + 1); value.mWeather = text; } else if (text.Length > 10) { mls.LogDebug((object)"splitting weather at length 10"); value.dispWeather = text.Substring(0, 9) + "-"; value.halfWeather = text.Substring(9); value.mWeather = text; } else if (text != null) { value.mWeather = (value.dispWeather = text); } else { value.mWeather = (value.dispWeather = string.Empty); } if (value.halfWeather.Length > 10) { value.halfWeather = value.halfWeather.Substring(0, 7) + "..."; } } } [HarmonyPatch(typeof(RoundManager), "Start")] [HarmonyPostfix] [HarmonyPriority(3)] private static void PatchMoonInfo() { List<int> list = new List<int>(); List<SelectableLevel> list2 = new List<SelectableLevel>(); routeNouns = terminal.terminalNodes.allKeywords[27].compatibleNouns; moonMasters.Clear(); moonsList = Resources.FindObjectsOfTypeAll<SelectableLevel>().ToList(); foreach (SelectableLevel moons in moonsList) { if (moons.levelID < 0) { mls.LogInfo((object)("Entry \"" + moons.PlanetName + "\" has an ID below zero. Removing...")); list2.Add(moons); } else if (list.Contains(moons.levelID)) { mls.LogInfo((object)("Entry \"" + moons.PlanetName + "\" has a repeat ID. Removing...")); list2.Add(moons); } else if (moons.PlanetName.ToLower().Contains("liquidation")) { mls.LogInfo((object)("Moon \"" + moons.PlanetName + "\" is unreleased. Removing...")); list2.Add(moons); } else { list.Add(moons.levelID); moonMasters.Add(moons.levelID, new MoonMaster(moons)); } } for (int num = list2.Count - 1; num >= 0; num--) { mls.LogWarning((object)("destroying dupe: " + ((Object)list2[num]).name)); moonsList.Remove(list2[num]); Object.Destroy((Object)(object)list2[num]); } list.Clear(); foreach (MoonMaster value in moonMasters.Values) { CompatibleNoun[] array = routeNouns; foreach (CompatibleNoun val in array) { if (val.result.displayPlanetInfo == value.mID) { value.mPrice = val.result.itemCost; mls.LogInfo((object)$"Found price of {value.mLevelName}: ${value.mPrice}"); } } } } [HarmonyPatch(typeof(RoundManager), "Start")] [HarmonyPostfix] [HarmonyPriority(3)] public static void NameSeparator() { foreach (MoonMaster value in moonMasters.Values) { if (!char.IsDigit(value.origName.First())) { value.mName = value.origName; continue; } value.mPrefix = value.origName.Substring(0, value.origName.IndexOf(' ')); value.mName = value.origName.Substring(value.origName.IndexOf(' ') + 1); } } [HarmonyPatch(typeof(RoundManager), "Start")] [HarmonyPostfix] [HarmonyPriority(1)] public static void MoonCatalogueSetup() { mls.LogDebug((object)"SETUP START"); UpdateMoonWeather(); foreach (MoonMaster value in moonMasters.Values) { int mID = value.mID; bool flag = moonMasters.Values.Any((MoonMaster p) => p.mPrefix.Length == 4); value.dispName = ((value.mName.Length <= 15) ? value.mName.PadRight(15) : (value.mName.Substring(0, 12) + "...")); if (flag) { value.dispPrefix = ((value.mPrefix.Length <= 4) ? value.mPrefix.PadLeft(4, ConfigManager.padChar) : value.mPrefix.Substring(0, 4)); } else { value.dispPrefix = ((value.mPrefix.Length <= 3) ? value.mPrefix.PadLeft(3, ConfigManager.padChar) : value.mPrefix.Substring(0, 3)); } if (value.mGrade.ToLower() == "unknown") { value.dispGrade = " ?? "; } else { value.dispGrade = ((value.mGrade.Length <= 2 || value.mGrade == "Safe") ? value.mGrade.PadRight(3).PadLeft(4) : value.mGrade.Substring(0, 2).PadRight(3).PadLeft(4)); } if (value.mLevelName == "CompanyBuildingLevel" && value.mName == "Company Building") { value.dispName = "Company<space=0.3en>Building<space=-0.3en>"; } } masterList = moonMasters.Values.ToList(); switch (ConfigManager.defaultSort) { case 1: masterList.Sort((MoonMaster x, MoonMaster y) => x.mName.CompareTo(y.mName)); catalogueSort = " NAME ⇩"; break; case 2: masterList.Sort(SortByPrefix); catalogueSort = " PREFIX ⇩"; break; case 3: masterList.Sort(SortByGrade); catalogueSort = " GRADE ⇩"; break; case 4: masterList.Sort((MoonMaster x, MoonMaster y) => x.mPrice.CompareTo(y.mPrice)); catalogueSort = " PRICE ⇩"; break; case 5: masterList.Sort(SortByWeather); catalogueSort = " WEATHER ⇩"; break; case 6: masterList.Sort(SortByDifficulty); catalogueSort = "DIFFICULTY ⇩"; break; case 7: masterList.Sort((MoonMaster x, MoonMaster y) => x.mID.CompareTo(y.mID)); masterList.Reverse(); catalogueSort = " DEFAULT ⇧"; break; case 8: masterList.Sort((MoonMaster x, MoonMaster y) => x.mName.CompareTo(y.mName)); masterList.Reverse(); catalogueSort = " NAME ⇧"; break; case 9: masterList.Sort(SortByPrefix); masterList.Reverse(); catalogueSort = " PREFIX ⇧"; break; case 10: masterList.Sort(SortByGrade); masterList.Reverse(); catalogueSort = " GRADE ⇧"; break; case 11: masterList.Sort((MoonMaster x, MoonMaster y) => x.mPrice.CompareTo(y.mPrice)); masterList.Reverse(); catalogueSort = " PRICE ⇧"; break; case 12: masterList.Sort(SortByWeather); masterList.Reverse(); catalogueSort = " WEATHER ⇧"; break; case 13: masterList.Sort(SortByDifficulty); masterList.Reverse(); catalogueSort = "DIFFICULTY ⇧"; break; default: masterList.Sort((MoonMaster x, MoonMaster y) => x.mID.CompareTo(y.mID)); catalogueSort = " DEFAULT ⇩"; break; } mls.LogDebug((object)"SETUP END"); } internal static TerminalNode CreateNode() { TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>(); val.displayText = string.Empty; val.maxCharactersToType = 25; val.displayPlanetInfo = -1; val.buyRerouteToMoon = -1; val.buyItemIndex = -1; val.shipUnlockableID = -1; val.creatureFileID = -1; val.storyLogFileID = -1; val.playSyncedClip = -1; val.terminalEvent = string.Empty; return val; } internal static TerminalKeyword CreateKeyword() { TerminalKeyword val = ScriptableObject.CreateInstance<TerminalKeyword>(); val.defaultVerb = null; return val; } internal static void CreateSortingNodes() { //IL_03d8: Unknown result type (might be due to invalid IL or missing references) //IL_03df: Expected O, but got Unknown mls.LogDebug((object)("Start of CREATESORTNODES: " + nounTPList.Length)); nounTPList = new string[13] { "default", "id", "name", "prefix", "grade", "price", "weather", "difficulty", "info", "help", "list", "current", "rev" }; TerminalKeyword val = CreateKeyword(); TerminalKeyword val2 = CreateKeyword(); mls.LogDebug((object)"created sort and reverse"); if ((Object)(object)((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords).FirstOrDefault((Func<TerminalKeyword, bool>)((TerminalKeyword keyword) => keyword.word == "sort" || ((Object)keyword).name == "sortKeyword")) != (Object)null) { mls.LogInfo((object)"'sort' keyword already exists, skipping"); val = ((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords).FirstOrDefault((Func<TerminalKeyword, bool>)((TerminalKeyword keyword) => keyword.word == "sort" || ((Object)keyword).name == "sortKeyword")); } else { val.word = "sort"; ((Object)val).name = "sortKeyword"; val.isVerb = true; terminal.terminalNodes.allKeywords = CollectionExtensions.AddItem<TerminalKeyword>((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords, val).ToArray(); } if ((Object)(object)((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords).FirstOrDefault((Func<TerminalKeyword, bool>)((TerminalKeyword keyword) => keyword.word == "reverse" || ((Object)keyword).name == "reverseKeyword")) != (Object)null) { mls.LogInfo((object)"'reverse' keyword already exists, skipping"); val2 = ((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords).FirstOrDefault((Func<TerminalKeyword, bool>)((TerminalKeyword keyword) => keyword.word == "reverse" || ((Object)keyword).name == "reverseKeyword")); } else { val2.word = "reverse"; ((Object)val2).name = "reverseKeyword"; val2.isVerb = true; terminal.terminalNodes.allKeywords = CollectionExtensions.AddItem<TerminalKeyword>((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords, val2).ToArray(); } val.compatibleNouns = (CompatibleNoun[])(object)new CompatibleNoun[13]; val2.compatibleNouns = (CompatibleNoun[])(object)new CompatibleNoun[13]; mls.LogDebug((object)("TOTAL NOUN COUNT (should be 13): " + nounTPList.Length)); int i; for (i = 0; i < nounTPList.Length; i++) { TerminalKeyword val3 = CreateKeyword(); TerminalNode val4 = CreateNode(); TerminalNode val5 = CreateNode(); if ((Object)(object)((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords).FirstOrDefault((Func<TerminalKeyword, bool>)((TerminalKeyword keynoun) => keynoun.word == nounTPList[i])) != (Object)null && nounTPList[i] != "help" && nounTPList[i] != "info") { val3 = ((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords).FirstOrDefault((Func<TerminalKeyword, bool>)((TerminalKeyword keynoun) => keynoun.word == nounTPList[i])); } val3.word = nounTPList[i]; ((Object)val3).name = nounTPList[i] + "TPsortKeyword"; val3.defaultVerb = val; terminal.terminalNodes.allKeywords = CollectionExtensions.AddItem<TerminalKeyword>((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords, val3).ToArray(); val4.terminalEvent = val3.word; ((Object)val4).name = nounTPList[i] + "TPsortNode"; CompatibleNoun val6 = new CompatibleNoun(); val6.noun = val3; val6.result = val4; val.compatibleNouns[i] = val6; val2.compatibleNouns[i] = val6; if (nounTPList[i] == "rev") { val2.specialKeywordResult = val4; } } } [HarmonyPatch(typeof(RoundManager), "Start")] [HarmonyPostfix] [HarmonyPriority(0)] public static void CreateNodes() { //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Expected O, but got Unknown TerminalKeyword val = CreateKeyword(); TerminalNode val2 = CreateNode(); if ((Object)(object)((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords).FirstOrDefault((Func<TerminalKeyword, bool>)((TerminalKeyword keynoun) => keynoun.word == "ship")) != (Object)null) { val = ((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords).FirstOrDefault((Func<TerminalKeyword, bool>)((TerminalKeyword keynoun) => keynoun.word == "ship")); } val.word = "ship"; ((Object)val).name = "scanShipKeyword"; val.defaultVerb = terminal.terminalNodes.allKeywords[73]; terminal.terminalNodes.allKeywords = CollectionExtensions.AddItem<TerminalKeyword>((IEnumerable<TerminalKeyword>)terminal.terminalNodes.allKeywords, val).ToArray(); val2.terminalEvent = val.word; ((Object)val2).name = "scanShipNode"; CompatibleNoun val3 = new CompatibleNoun { noun = val, result = val2 }; terminal.terminalNodes.allKeywords[73].isVerb = true; terminal.terminalNodes.allKeywords[73].compatibleNouns = CollectionExtensions.AddItem<CompatibleNoun>((IEnumerable<CompatibleNoun>)terminal.terminalNodes.allKeywords[73].compatibleNouns, val3).ToArray(); CreateSortingNodes(); } public static int SortByID(MoonMaster x, MoonMaster y) { if (x == null && y == null) { return 0; } if (x == null) { return -1; } if (y == null) { return 1; } int num = x.mID.CompareTo(y.mID); if (num != 0) { return num; } return 0; } public static int SortByPrefix(MoonMaster x, MoonMaster y) { if (x == null && y == null) { return 0; } if (x == null) { return -1; } if (y == null) { return 1; } if (int.TryParse(x.mPrefix, out var result) && int.TryParse(y.mPrefix, out var result2)) { return result.CompareTo(result2); } if (int.TryParse(x.mPrefix, out result)) { return 1; } if (int.TryParse(y.mPrefix, out result2)) { return -1; } return 0; } public static int SortByGrade(MoonMaster y, MoonMaster x) { if (x == null && y == null) { return 0; } if (x == null) { return -1; } if (y == null) { return 1; } string mGrade = x.mGrade; string mGrade2 = y.mGrade; if (mGrade == mGrade2) { return 0; } if (mGrade == "Safe" && mGrade2 != "Safe") { return 1; } if (mGrade != "Safe" && mGrade2 == "Safe") { return -1; } if (mGrade == "??" && mGrade2 != "??") { return -1; } if (mGrade != "??" && mGrade2 == "??") { return 1; } if (mGrade[0] == 'S' && mGrade2[0] != 'S') { return -1; } if (mGrade[0] != 'S' && mGrade2[0] == 'S') { return 1; } if (mGrade.Contains("SS") && !mGrade2.Contains("SS")) { return -1; } if (!mGrade.Contains("SS") && mGrade2.Contains("SS")) { return 1; } if (mGrade[0] == mGrade2[0]) { if (Enumerable.Contains(mGrade, '+') && !mGrade2.Contains("+")) { return -1; } if (!Enumerable.Contains(mGrade, '+') && mGrade2.Contains("+")) { return 1; } if (!Enumerable.Contains(mGrade, '-') && mGrade2.Contains("-")) { return -1; } if (Enumerable.Contains(mGrade, '-') && !mGrade2.Contains("-")) { return 1; } return 0; } return mGrade.CompareTo(y.mGrade); } public static int SortByWeather(MoonMaster x, MoonMaster y) { if (x == null && y == null) { return 0; } if (x == null) { return -1; } if (y == null) { return 1; } string text = x.mWeather.ToLower(); string text2 = y.mWeather.ToLower(); if (text == text2) { return 0; } if ((text == "none" || text == string.Empty) && text2 != "none" && text2 != string.Empty) { return 1; } if ((text2 == "none" || text2 == string.Empty) && text != "none" && text != string.Empty) { return -1; } if (text.Contains("?") && !text2.Contains("?")) { return -1; } if (text2.Contains("?") && !text.Contains("?")) { return 1; } if (text.Contains("/") && !text2.Contains("/")) { return -1; } if (text2.Contains("/") && !text.Contains("/")) { return 1; } if (text.Contains("/") && text2.Contains("/")) { string text3 = text.Substring(0, text.IndexOf('/')); string key = text.Substring(text.IndexOf('/') + 1); string text4 = text.Substring(0, text2.IndexOf('/')); string key2 = text.Substring(text2.IndexOf('/') + 1); if (text3 == text4 && weathersDic.ContainsKey(key) && weathersDic.ContainsKey(key2)) { return weathersDic[key].CompareTo(weathersDic[key2]); } if (weathersDic.ContainsKey(text3) && weathersDic.ContainsKey(key) && weathersDic.ContainsKey(text4) && weathersDic.ContainsKey(key2)) { return (weathersDic[text3] + weathersDic[key]).CompareTo(weathersDic[text4] + weathersDic[key2]); } return text.CompareTo(text2); } if (weathersDic.ContainsKey(text.Replace("?", string.Empty)) && weathersDic.ContainsKey(text2.Replace("?", string.Empty))) { return weathersDic[text.Replace("?", string.Empty)].CompareTo(weathersDic[text2.Replace("?", string.Empty)]); } return 0; } public static int SortByDifficulty(MoonMaster y, MoonMaster x) { if (x == null && y == null) { return 0; } if (x == null) { return -1; } if (y == null) { return 1; } int maxDaytimeEnemyPowerCount = x.mLevel.maxDaytimeEnemyPowerCount; int count = x.mLevel.DaytimeEnemies.Count; int maxOutsideEnemyPowerCount = x.mLevel.maxOutsideEnemyPowerCount; int count2 = x.mLevel.OutsideEnemies.Count; int maxEnemyPowerCount = x.mLevel.maxEnemyPowerCount; int count3 = x.mLevel.Enemies.Count; float factorySizeMultiplier = x.mLevel.factorySizeMultiplier; int minTotalScrapValue = x.mLevel.minTotalScrapValue; int maxTotalScrapValue = x.mLevel.maxTotalScrapValue; int num = (weathersDic.ContainsKey(x.mWeather.Replace("?", string.Empty)) ? weathersDic[x.mWeather.Replace("?", string.Empty)] : 0); if (x.mWeather.ToLower().Contains("/")) { string key = x.mWeather.Substring(0, x.mWeather.IndexOf('/')); num = (weathersDic.ContainsKey(key) ? weathersDic[key] : 0); } int maxDaytimeEnemyPowerCount2 = y.mLevel.maxDaytimeEnemyPowerCount; int count4 = y.mLevel.DaytimeEnemies.Count; int maxOutsideEnemyPowerCount2 = y.mLevel.maxOutsideEnemyPowerCount; int count5 = y.mLevel.OutsideEnemies.Count; int maxEnemyPowerCount2 = y.mLevel.maxEnemyPowerCount; int count6 = y.mLevel.Enemies.Count; float factorySizeMultiplier2 = y.mLevel.factorySizeMultiplier; int minTotalScrapValue2 = y.mLevel.minTotalScrapValue; int maxTotalScrapValue2 = y.mLevel.maxTotalScrapValue; int num2 = (weathersDic.ContainsKey(y.mWeather.Replace("?", string.Empty)) ? weathersDic[y.mWeather.Replace("?", string.Empty)] : 0); if (y.mWeather.ToLower().Contains("/")) { string key2 = y.mWeather.Substring(0, y.mWeather.IndexOf('/')); num2 = (weathersDic.ContainsKey(key2) ? weathersDic[key2] : 0); } if (x.mGrade == "Safe" && y.mGrade != "Safe") { return 1; } if (x.mGrade != "Safe" && y.mGrade == "Safe") { return -1; } float value = (float)(maxDaytimeEnemyPowerCount * dayPowerMult + maxOutsideEnemyPowerCount * nightPowerMult + maxEnemyPowerCount * insidePowerMult + count * dayCountMult + count2 * nightCountMult + count3 * insideCountMult) + factorySizeMultiplier * (float)sizeMult + (float)((num + 1) * weatherMult) + (float)((minTotalScrapValue + maxTotalScrapValue) / 2 * valueMult); int num3 = ((float)(maxDaytimeEnemyPowerCount2 * dayPowerMult + maxOutsideEnemyPowerCount2 * nightPowerMult + maxEnemyPowerCount2 * insidePowerMult + count4 * dayCountMult + count5 * nightCountMult + count6 * insideCountMult) + factorySizeMultiplier2 * (float)sizeMult + (float)((num2 + 1) * weatherMult) + (float)((minTotalScrapValue2 + maxTotalScrapValue2) / 2 * valueMult)).CompareTo(value); if (num3 != 0) { return num3; } return 0; } } internal class LLLCompatibility { [HarmonyPatch(typeof(TerminalManager), "RefreshExtendedLevelGroups")] [HarmonyPostfix] public static void LLLVisibleMoons(MoonsCataloguePage ___currentMoonsCataloguePage) { foreach (MoonMaster moon in Nodes.moonMasters.Values) { moon.mVis = ___currentMoonsCataloguePage.ExtendedLevels.Any((ExtendedLevel x) => (Object)(object)x.selectableLevel == (Object)(object)moon.mLevel); } } public static void ModdedWeathers() { PluginMain.mls.LogDebug((object)"LLL exists, grabbing it's weather info..."); foreach (MoonMaster value in Nodes.moonMasters.Values) { value.dispWeather = typeof(TerminalManager).GetMethod("GetWeatherConditions", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[1] { value.mLevel }).ToString() .Replace("(", string.Empty) .Replace(")", string.Empty); } } } public class ConfigManager { public enum SortingOptions { Default, Name, Prefix, Grade, Price, Weather, Difficulty, DefaultReversed, NameReversed, PrefixReversed, GradeReversed, PriceReversed, WeatherReversed, DifficultyReversed } public enum ClockDisplaySetting { Off, Full, Hour, Military } public static char padChar = ' '; public static int defaultSort; public static int clockSetting; public static bool activeKilroy = false; public static bool overrideVisibility = false; public static bool showClear = false; public static bool evenSort = false; public static bool longWeather = false; public static bool detailedScan = true; public static bool showLGUStore = false; private static readonly Dictionary<int, string> originalNames = new Dictionary<int, string>(); private static ConfigEntry<bool> enableCustom; private static ConfigEntry<bool> padPrefixes; private static ConfigEntry<SortingOptions> defaultSorting; private static ConfigEntry<bool> overrideVisibilityConfig; private static ConfigEntry<bool> showClearConfig; private static ConfigEntry<bool> longWeatherConfig; private static ConfigEntry<bool> evenSortConfig; private static ConfigEntry<bool> detailedScanConfig; private static ConfigEntry<string> customDifficultyConfig; private static ConfigEntry<bool> showLGUStoreConfig; private static ConfigEntry<bool> configKilroy; private static ConfigEntry<int> customSensConfig; private static ConfigEntry<ClockDisplaySetting> clockSettingConfig; private static ConfigEntry<string> setCustomName; private static ConfigEntry<int> setCustomPrefix; private static ConfigEntry<string> setCustomGrade; private static ConfigEntry<int> setCustomPrice; private static ConfigEntry<string> setCustomDescription; private static ConfigEntry<string> setCustomInfo; public static PropertyInfo orphanedEntriesProp = ((object)PluginMain.configFile).GetType().GetProperty("OrphanedEntries", BindingFlags.Instance | BindingFlags.NonPublic); private static ManualLogSource mls = Logger.CreateLogSource("TerminalPlus"); [HarmonyPatch(typeof(RoundManager), "Start")] [HarmonyPostfix] [HarmonyPriority(2)] public static void MakeConfig() { mls.LogDebug((object)"CONFIG START"); TerminalNode[] array = (from n in Resources.FindObjectsOfTypeAll<TerminalNode>() where ((Object)n).name.ToLower().Contains("info") && n.displayText.Contains("\n------------------") select n).ToArray(); ConfigFile configFile = PluginMain.configFile; defaultSorting = configFile.Bind<SortingOptions>("00. General", "Default Sorting", SortingOptions.Default, "The default method for sorting moons in the terminal catalogue."); padPrefixes = configFile.Bind<bool>("00. General", "Pad Prefixes", false, "Pads all prefixes with zeros to be the same length (e.g. \"7 Dine\" would become \"007 Dine\")."); showClearConfig = configFile.Bind<bool>("00. General", "Show Clear Weather", false, "Adds \"(Clear)\" to the weather column of the moon catalogue when the moon has no weather."); evenSortConfig = configFile.Bind<bool>("00. General", "Uniform Catalogue Listing", false, "Displays all moons in groups of three, regardless of current sorting."); longWeatherConfig = configFile.Bind<bool>("00. General", "Show Full Weather Name", false, "Will create multi-line entries in the moon catalogue for longer weather names (like the multiple weathers of \"WeatherTweaks\"). If set to false, longer weathers will be truncated to \"Complex\" in the catalogue."); detailedScanConfig = configFile.Bind<bool>("00. General", "Detailed Terminal Scan", true, "Displays a more detailed \"scan\" terminal page including a list of all items and their most important properties."); customDifficultyConfig = configFile.Bind<string>("00. General", "Custom Difficulty Equation", "DayPower:2,NightPower:4,InsidePower:5,Size:2,Weather:5", "Creates a custom equation on which the \"difficulty\" sorting method is calculated. Please provide variables in the \"variable:weight\" format shown in the default. POSSIBLE VARIABLES:\nDayPower (daytime enemy power), NightPower (nighttime enemy power), InsidePower (inside enemy power),\nDayEnemies (total daytime enemy types), NightEnemies (total nighttime enemy types), InsideEnemies (total inside enemy types),\nSize (facility/interior size), Weather (current weather), Value (average scrap value)"); customSensConfig = configFile.Bind<int>("00. General", "Scroll Sensitivity", 8, "Controls the terminal scrolling sensitivity. Value roughly equates to number of lines scrolled per step.\nNOTE: Values above ~24 may start skipping lines in between page scrolls."); clockSettingConfig = configFile.Bind<ClockDisplaySetting>("00. General", "Terminal Clock", ClockDisplaySetting.Hour, "Controls the clock display in the top right of the terminal. - FORMATTING: Full: \"XX:XX AM\", Hour: \"XX AM\", Military: \"XX:XX\""); showLGUStoreConfig = configFile.Bind<bool>("00. General", "Show LGU Upgrades in Store", false, "Shows the \"LateGameUpgrades\" mod's upgrades in the main store. Only applicable if LGU is installed."); originalNames.Clear(); Nodes.priceOverride = new bool[Nodes.moonMasters.Count]; foreach (MoonMaster value in Nodes.moonMasters.Values) { mls.LogInfo((object)$"CURRENT LEVEL: {value.mLevel}"); int mID = value.mID; int num = -1; string text = "PLACEHOLDER TEXT (could not find info text for config, setting may not work)"; string text2 = value.origName; string text3 = ((mID >= 9) ? $"{mID + 1}" : $"0{mID + 1}"); if (!int.TryParse(value.mPrefix, out var result)) { result = -1; } for (int i = 0; i < array.Length; i++) { if (array[i].displayText.ToLower().StartsWith(value.origName.ToLower()) || array[i].displayText.ToLower().StartsWith((value.mPrefix + "-" + value.mName).ToLower()) || array[i].displayText.ToLower().StartsWith(value.mName.ToLower()) || ((Object)array[i]).name.ToLower().Contains(value.mName.ToLower())) { text = array[i].displayText; num = i; break; } } if (value.mLevelName == "CompanyBuildingLevel") { text = ((IEnumerable<TerminalNode>)Resources.FindObjectsOfTypeAll<TerminalNode>()).FirstOrDefault((Func<TerminalNode, bool>)((TerminalNode n) => ((Object)n).name == "CompanyBuildingInfo")).displayText; text2 = "The Company Building"; value.mName = "Company Building"; value.mPrefix = "The"; enableCustom = configFile.Bind<bool>(text3 + ". " + text2 + " Settings", text2 + " - Enable Moon Config", false, "Enables the customization options below for " + text2 + "."); overrideVisibility = true; overrideVisibilityConfig = configFile.Bind<bool>(text3 + ". " + text2 + " Settings", text2 + " - Hide Moon in Terminal", true, "Hides The Company in the moon catalogue. Set to \"true\" to hide; visibility may be overridden by other mods .\nNOTE: The moon will still be active and usable, just not visible."); setCustomName = configFile.Bind<string>(text3 + ". " + text2 + " Settings", text2 + " - Set Custom Name", "Company Building", "Set a custom moon name (not including the prefix)."); setCustomPrefix = configFile.Bind<int>(text3 + ". " + text2 + " Settings", text2 + " - Set Custom Prefix", -2, "Set a custom prefix number (e.g. the \"8\" in \"8 Titan\"). Set to \"-1\" to remove prefix entirely. Set to \"-2\" to use \"The\" for \"The Company Building\"."); } else { enableCustom = configFile.Bind<bool>(text3 + ". " + text2 + " Settings", text2 + " - Enable Moon Config", false, "Enables the customization options below for " + text2 + "."); overrideVisibilityConfig = configFile.Bind<bool>(text3 + ". " + text2 + " Settings", text2 + " - Hide Moon in Terminal", false, "Hide the moon in the catalogue. If true, it will be hidden, if false, it will be whatever it would be without TerminalPlus.\nNOTE: The moon will still be active and usable, just not visible."); setCustomName = configFile.Bind<string>(text3 + ". " + text2 + " Settings", text2 + " - Set Custom Name", value.mName, "Set a custom moon name (not including the prefix)."); setCustomPrefix = configFile.Bind<int>(text3 + ". " + text2 + " Settings", text2 + " - Set Custom Prefix", result, "Set a custom prefix number (e.g. the \"8\" in \"8 Titan\"). Set to \"-1\" to remove prefix entirely."); } setCustomGrade = configFile.Bind<string>(text3 + ". " + text2 + " Settings", text2 + " - Set Custom Grade", value.mGrade, "Set a custom grade/hazard level (e.g. \"A+\", \"D\", \"SS\", etc). Will be trimmed to two characters."); setCustomPrice = configFile.Bind<int>(text3 + ". " + text2 + " Settings", text2 + " - Set Custom Price", value.mPrice, "Set a custom price. Set to \"-1\" to ignore for compatibility with other price-changing mods.\n(NOTE: may break if another mod reassigns level IDs during runtime)"); setCustomDescription = configFile.Bind<string>(text3 + ". " + text2 + " Settings", text2 + " - Set Custom Description", value.mDesc, "Set a custom description (i.e. the \"POPULATION\", \"CONDITIONS\", and \"FAUNA\" subtext)."); setCustomInfo = configFile.Bind<string>(text3 + ". " + text2 + " Settings", text2 + " - Set Custom Info Panel", text, "Set custom info display text (for when you enter \"[moon name] info\" into the terminal)\n(NOTE: may not work on modded moons depending on their default formatting)."); if (enableCustom.Value) { mls.LogInfo((object)("Config enabled for " + value.mLevelName + ". Running...")); value.mName = setCustomName.Value; if (setCustomPrefix.Value < 0) { value.mPrefix = string.Empty; } else { value.mPrefix = setCustomPrefix.Value.ToString(); } value.mLevel.PlanetName = setCustomPrefix.Value + " " + setCustomName.Value; value.mLevel.riskLevel = (value.mGrade = setCustomGrade.Value); if (setCustomPrice.Value >= 0) { value.mPriceOR = false; value.mPrice = setCustomPrice.Value; } else { value.mPriceOR = true; } value.mDesc = setCustomDescription.Value; CompatibleNoun[] routeNouns = Nodes.routeNouns; foreach (CompatibleNoun val in routeNouns) { if (val.result.displayPlanetInfo == mID) { val.noun.word = setCustomName.Value.ToLower(); if (!value.mPriceOR) { val.result.itemCost = setCustomPrice.Value; } else { value.mPrice = val.result.itemCost; } } } TerminalNode[] confirmNodes = Nodes.confirmNodes; foreach (TerminalNode val2 in confirmNodes) { if (val2.buyRerouteToMoon == mID) { val2.displayText = "Routing autopilot to " + value.mPrefix + "-" + value.mName + ".\nYour new balance is [playerCredits]."; if (!value.mPriceOR) { val2.itemCost = setCustomPrice.Value; } } } if (num >= 0) { array[num].displayText = setCustomInfo.Value; } value.mVis = !overrideVisibilityConfig.Value; } if (value.mLevelName == "CompanyBuildingLevel" && setCustomPrefix.Value == -2) { value.mPrefix = "The"; } CheckForOrphans(configFile, text2); } configKilroy = configFile.Bind<bool>($"{Nodes.moonMasters.Count + 1}. Misc.", "Kilroy", false, "Kilroy is here."); if (padPrefixes.Value) { padChar = '0'; } else { padChar = ' '; } defaultSort = (int)defaultSorting.Value; clockSetting = (int)clockSettingConfig.Value; showClear = showClearConfig.Value; evenSort = evenSortConfig.Value; longWeather = longWeatherConfig.Value; detailedScan = detailedScanConfig.Value; Nodes.customSens = customSensConfig.Value * 17; showLGUStore = showLGUStoreConfig.Value; mls.LogInfo((object)$"Default sorting method: {defaultSorting.Value}"); Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)orphanedEntriesProp.GetValue(configFile, null); if (dictionary.Where((KeyValuePair<ConfigDefinition, string> e) => e.Key.Key == "Kilroy" && e.Value == "true").Count() > 0) { mls.LogInfo((object)"Active orphaned entry for Kilroy. Replacing..."); configKilroy.Value = true; } activeKilroy = configKilroy.Value; CalculateDifficulty(); dictionary.Clear(); configFile.Save(); mls.LogDebug((object)"CONFIG END"); } public static void CheckForOrphans(ConfigFile configFile, string configName) { Dictionary<ConfigDefinition, string> source = (Dictionary<ConfigDefinition, string>)orphanedEntriesProp.GetValue(configFile, null); if (!(source.Where((KeyValuePair<ConfigDefinition, string> c) => c.Key.Key == configName + " - Enable Moon Config").FirstOrDefault().Value == "true")) { return; } mls.LogInfo((object)("Active orphaned entries for " + configName + ". Replacing...")); enableCustom.Value = true; foreach (KeyValuePair<ConfigDefinition, string> item in source.Where((KeyValuePair<ConfigDefinition, string> e) => e.Key.Key.Contains(configName))) { if (item.Key.Key.Contains(" - Set Custom Name") && item.Value != ((ConfigEntryBase)setCustomName).DefaultValue.ToString()) { setCustomName.Value = item.Value; } else if (item.Key.Key.Contains(" - Set Custom Prefix") && item.Value != ((ConfigEntryBase)setCustomPrefix).DefaultValue.ToString()) { setCustomPrefix.Value = (int.TryParse(item.Value, out var result) ? result : (-1)); } else if (item.Key.Key.Contains(" - Set Custom Grade") && item.Value != ((ConfigEntryBase)setCustomPrefix).DefaultValue.ToString()) { setCustomGrade.Value = item.Value; } else if (item.Key.Key.Contains(" - Set Custom Price") && item.Value != ((ConfigEntryBase)setCustomPrefix).DefaultValue.ToString()) { setCustomPrice.Value = (int.TryParse(item.Value, out var result2) ? result2 : (-1)); } else if (item.Key.Key.Contains(" - Set Custom Description") && item.Value != ((ConfigEntryBase)setCustomPrefix).DefaultValue.ToString()) { setCustomDescription.Value = item.Value; } else if (item.Key.Key.Contains(" - Set Custom Info Panel") && item.Value != ((ConfigEntryBase)setCustomPrefix).DefaultValue.ToString()) { setCustomInfo.Value = item.Value; } } } public static void CalculateDifficulty() { string text = customDifficultyConfig.Value + ","; if (text.ToLower().Contains("daypower:") && text.ToLower().IndexOf("daypower:") + 9 < text.Length) { string text2 = text.Substring(text.ToLower().IndexOf("daypower:") + 9).ToString(); if (text2.IndexOf(',') > 0) { int.TryParse(text2.Substring(0, text2.IndexOf(',')), out Nodes.dayPowerMult); } } if (text.ToLower().Contains("nightpower:") && text.ToLower().IndexOf("nightpower:") + 11 < text.Length) { string text3 = text.Substring(text.ToLower().IndexOf("nightpower:") + 11).ToString(); if (text3.IndexOf(',') > 0) { int.TryParse(text3.Substring(0, text3.IndexOf(',')), out Nodes.nightPowerMult); } } if (text.ToLower().Contains("insidepower:") && text.ToLower().IndexOf("insidepower:") + 12 < text.Length) { string text4 = text.Substring(text.ToLower().IndexOf("insidepower:") + 12).ToString(); if (text4.IndexOf(',') > 0) { int.TryParse(text4.Substring(0, text4.IndexOf(',')), out Nodes.insidePowerMult); } } if (text.ToLower().Contains("dayenemies:") && text.ToLower().IndexOf("dayenemies:") + 11 < text.Length) { string text5 = text.Substring(text.ToLower().IndexOf("dayenemies:") + 11).ToString(); if (text5.IndexOf(',') > 0) { int.TryParse(text5.Substring(0, text5.IndexOf(',')), out Nodes.dayCountMult); } } if (text.ToLower().Contains("nightenemies:") && text.ToLower().IndexOf("nightenemies:") + 13 < text.Length) { string text6 = text.Substring(text.ToLower().IndexOf("nightenemies:") + 13).ToString(); if (text6.IndexOf(',') > 0) { int.TryParse(text6.Substring(0, text6.IndexOf(',')), out Nodes.nightCountMult); } } if (text.ToLower().Contains("insideenemies:") && text.ToLower().IndexOf("insideenemies:") + 14 < text.Length) { string text7 = text.Substring(text.ToLower().IndexOf("insideenemies:") + 14).ToString(); if (text7.IndexOf(',') > 0) { int.TryParse(text7.Substring(0, text7.IndexOf(',')), out Nodes.insideCountMult); } } if (text.ToLower().Contains("size:") && text.ToLower().IndexOf("size:") + 5 < text.Length) { string text8 = text.Substring(text.ToLower().IndexOf("size:") + 5).ToString(); if (text8.IndexOf(',') > 0) { int.TryParse(text8.Substring(0, text8.IndexOf(',')), out Nodes.sizeMult); } } if (text.ToLower().Contains("weather:") && text.ToLower().IndexOf("weather:") + 8 < text.Length) { string text9 = text.Substring(text.ToLower().IndexOf("weather:") + 8).ToString(); if (text9.IndexOf(',') > 0) { int.TryParse(text9.Substring(0, text9.IndexOf(',')), out Nodes.weatherMult); } } if (text.ToLower().Contains("scrapvalue:") && text.ToLower().IndexOf("scrapvalue:") + 11 < text.Length) { string text10 = text.Substring(text.ToLower().IndexOf("scrapvalue:") + 11).ToString(); if (text10.IndexOf(',') > 0) { int.TryParse(text10.Substring(0, text10.IndexOf(',')), out Nodes.valueMult); } } } [HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")] [HarmonyPostfix] [HarmonyPriority(0)] private static void ResetNames() { mls.LogInfo((object)"Disconnecting and resetting names:"); foreach (MoonMaster value in Nodes.moonMasters.Values) { value.mLevel.PlanetName = value.origName; mls.LogDebug((object)("Reset: " + value.origName)); } } } public class MoonMaster { public readonly SelectableLevel mLevel; public readonly string mLevelName; public bool mPriceOR; public readonly string origName; public string mName = string.Empty; public string mPrefix = string.Empty; public int mID; public string mGrade; public bool mVis = true; public string mWeather; public int mPrice = -1; public string mDesc; public string dispName = string.Empty; public string dispPrefix = string.Empty; public string dispGrade = string.Empty; public string dispWeather; public string halfWeather = string.Empty; public MoonMaster(SelectableLevel moon) { mLevel = moon; mLevelName = ((Object)moon).name; origName = moon.PlanetName; mID = moon.levelID; mWeather = (dispWeather = ((object)(LevelWeatherType)(ref moon.currentWeather)).ToString()); mGrade = moon.riskLevel; mDesc = moon.LevelDescription; } } [HarmonyPatch(typeof(Terminal))] public class TerminalPatches { public static string playerSubmit = string.Empty; public static TextMeshProUGUI terminalClock = new TextMeshProUGUI(); public static Transform clockBG; public static float timeSinceSubmit = 0f; [HarmonyPatch("Start")] [HarmonyPostfix] [HarmonyPriority(800)] public static void PatchHelpPage(Terminal __instance) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: 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_015c: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) Nodes.terminal = __instance; ((Component)__instance.scrollBarCanvasGroup).transform.localPosition = new Vector3(246f, 196.5f, 0f); ((IEnumerable<TerminalNode>)Resources.FindObjectsOfTypeAll<TerminalNode>()).FirstOrDefault((Func<TerminalNode, bool>)((TerminalNode tn) => ((Object)tn).name == "OtherCommands")).displayText = new Nodes().OtherHelpPage(); terminalClock = Object.Instantiate<TextMeshProUGUI>(Nodes.terminal.topRightText); clockBG = Object.Instantiate<Transform>(((TMP_Text)Nodes.terminal.topRightText).transform.parent.GetChild(5)); Transform transform = ((TMP_Text)terminalClock).transform; Transform parent2 = (clockBG.parent = ((TMP_Text)__instance.topRightText).transform.parent); transform.parent = parent2; ((TMP_Text)terminalClock).text = string.Empty; ((TMP_Text)terminalClock).horizontalAlignment = (HorizontalAlignmentOptions)4; ((TMP_Text)terminalClock).alignment = (TextAlignmentOptions)260; ((TMP_Text)terminalClock).transform.localPosition = new Vector3(132f, 199f, -1f); Transform transform2 = ((TMP_Text)terminalClock).transform; Transform obj = clockBG; Quaternion localRotation = default(Quaternion); ((Quaternion)(ref localRotation))..ctor(0f, 0f, 0f, 1f); obj.localRotation = localRotation; transform2.localRotation = localRotation; ((TMP_Text)terminalClock).transform.localScale = Vector3.one; clockBG.localScale = Vector3.zero; } [HarmonyPostfix] [HarmonyPatch("ParsePlayerSentence")] public static void ParsePatch(Terminal __instance) { playerSubmit = __instance.screenText.text.Substring(__instance.screenText.text.Length - __instance.textAdded); Nodes.mls.LogDebug((object)("Player entered: " + playerSubmit)); Nodes.mls.LogWarning((object)"----------PARSEPLAYER----------"); } [HarmonyPatch("OnSubmit")] [HarmonyPostfix] [HarmonyPriority(0)] public static void NodeConsoleInfo(Terminal __instance) { timeSinceSubmit = 0f; __instance.scrollBarVertical.value = 1f; } [HarmonyPostfix] [HarmonyPriority(0)] [HarmonyPatch("RunTerminalEvents")] public static void TerminalEventPostfix(TerminalNode node, Terminal __instance) { string text = null; if ((Object)(object)node == (Object)null) { return; } if (((Object)node).name == "helpTPsortNode" || ((Object)node).name == "infoTPsortNode") { text = new Nodes().HelpInfoPage(); } else if (((Object)node).name == "MoonsCatalogue" || ((Object)node).name.Contains("TPsort")) { switch (node.terminalEvent) { case "default": Nodes.masterList.Sort((MoonMaster x, MoonMaster y) => x.mID.CompareTo(y.mID)); Nodes.catalogueSort = " DEFAULT ⇩"; break; case "id": Nodes.masterList.Sort(Nodes.SortByID); Nodes.catalogueSort = " DEFAULT ⇩"; break; case "name": Nodes.masterList.Sort((MoonMaster x, MoonMaster y) => x.mName.CompareTo(y.mName)); Nodes.catalogueSort = " NAME ⇩"; break; case "prefix": Nodes.masterList.Sort(Nodes.SortByPrefix); Nodes.catalogueSort = " PREFIX ⇩"; break; case "grade": Nodes.masterList.Sort(Nodes.SortByGrade); Nodes.catalogueSort = " GRADE ⇩"; break; case "price": Nodes.masterList.Sort((MoonMaster x, MoonMaster y) => x.mPrice.CompareTo(y.mPrice)); Nodes.catalogueSort = " PRICE ⇩"; break; case "weather": Nodes.masterList.Sort(Nodes.SortByWeather); Nodes.catalogueSort = " WEATHER ⇩"; break; case "difficulty": Nodes.masterList.Sort(Nodes.SortByDifficulty); Nodes.catalogueSort = "DIFFICULTY ⇩"; break; } if (((Object)node).name.Contains("TPsort") && (playerSubmit.Contains("rev") || node.terminalEvent == "rev")) { Nodes.masterList.Reverse(); if (Enumerable.Contains(Nodes.catalogueSort, '⇧')) { Nodes.catalogueSort = Nodes.catalogueSort.Substring(0, 11) + "⇩"; } else { Nodes.catalogueSort = Nodes.catalogueSort.Substring(0, 11) + "⇧"; } } else { PluginMain.mls.LogDebug((object)"not reverse :("); } text = new Nodes().MoonsPage(); } else if (((Object)node).name == "0_StoreHub") { text = new Nodes().StorePage(__instance); } else if (((Object)node).name == "ScanInfo") { text = new Nodes().ScanMoonPage(); } else if (((Object)node).name == "scanShipNode") { text = new Nodes().ScanShipPage(); } else if (node.displayPlanetInfo >= 0 && ((Object)node).name.ToLower().Contains("route") && Nodes.moonMasters[node.displayPlanetInfo] != null) { text = new Nodes().RoutePage(node, __instance); } else if (((Object)node).name == "CancelRoute") { text = "\n\n\nThe reroute has been cancelled.\n\n"; } if (text != null) { __instance.screenText.textComponent.enableKerning = false; __instance.screenText.textComponent.enableWordWrapping = false; StringBuilder stringBuilder = new StringBuilder(); if (Object.op_Implicit((Object)(object)__instance.displayingPersistentImage)) { stringBuilder.Append("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); } stringBuilder.Append(text + "\n"); __instance.screenText.text = stringBuilder.ToString(); __instance.currentText = stringBuilder.ToString(); __instance.textAdded = 0; } else { __instance.screenText.textComponent.enableWordWrapping = true; } } } } namespace TerminalPlus.LGU { internal class LGUCompatibility { public static StringBuilder LGUBuilder = new StringBuilder(); public static List<CustomTerminalNode> upgradeNodes = new List<CustomTerminalNode>(); [HarmonyPatch(typeof(UpgradeBus), "Reconstruct")] [HarmonyPostfix] public static void GetLGUUpgrades(ref List<CustomTerminalNode> ___terminalNodes) { if (___terminalNodes != null) { upgradeNodes = ___terminalNodes; } } public static string LGUString() { LGUBuilder.Clear(); if (upgradeNodes.Count > 0) { LGUBuilder.AppendLine(" ║----------------------|-------|-----|----------║"); foreach (CustomTerminalNode upgradeNode in upgradeNodes) { int currentUpgrade = upgradeNode.CurrentUpgrade; int maxUpgrade = upgradeNode.MaxUpgrade; string text = ((upgradeNode.Name.Length > 20) ? (upgradeNode.Name.Substring(0, 17) + "...") : upgradeNode.Name.PadRight(20)); string text2 = " "; string text3 = ((upgradeNode.salePerc < 1f) ? $"{Mathf.RoundToInt((1f - upgradeNode.salePerc) * 100f)}%".PadLeft(3) : " "); if (text3 == "100%") { text3 = "$$$"; } int num = Mathf.RoundToInt((float)upgradeNode.UnlockPrice * upgradeNode.salePerc); if (upgradeNode.Unlocked) { if (maxUpgrade <= 0) { text2 = "UNLOCKED"; } else if (currentUpgrade < maxUpgrade) { text2 = $"LEVEL: {currentUpgrade + 1}"; num = Mathf.RoundToInt((float)upgradeNode.Prices[currentUpgrade] * upgradeNode.salePerc); } else { text2 = "<space=-0.5en>MAXED<space=1en>OUT<space=-0.5en>"; num = Mathf.RoundToInt((float)upgradeNode.Prices[currentUpgrade] * upgradeNode.salePerc); } } LGUBuilder.AppendLine($" ║ {text} |<cspace=-2> $</cspace>{num,-4}<cspace=-0.6> |</cspace> {text3} | {text2} ║"); } } if (LGUBuilder != null) { return LGUBuilder.ToString(); } return string.Empty; } } } namespace TerminalPlus.Mods { internal class LethalLibCompatibility { public static List<ShopItem> modItems = new List<ShopItem>(); public static void RemoveHiddenStoreItems(Terminal terminal) { modItems.Clear(); foreach (ShopItem shopItem in Items.shopItems) { modItems.Add(shopItem); } foreach (ShopItem modItem in modItems) { Nodes.mls.LogDebug((object)("PATCHITEM: " + modItem.item.itemName)); Nodes.mls.LogDebug((object)(" ENABLED?: " + !modItem.wasRemoved)); if (Nodes.storeItems.Contains(modItem.item) && modItem.wasRemoved) { Nodes.storeItems.Remove(modItem.item); } } } } }