Decompiled source of TerminalPlus v1.1.2

TerminalPlus.dll

Decompiled 6 months ago
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.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);
				}
			}
		}
	}
}