using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using ConsoleTables; using Dawn; using Dawn.Internal; using DunGen.Graph; using HarmonyLib; using LethalLevelLoader; using Microsoft.CodeAnalysis; using MrovLib; using MrovLib.Definitions; using On; using TerminalUtils.Commands; using TerminalUtils.Compatibility; using TerminalUtils.Definitions; using TerminalUtils.Enums; using TerminalUtils.InfoTypes.Moons; using TerminalUtils.Nodes; using Unity.Netcode; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("com.github.teamxiaolan.dawnlib.compatibility")] [assembly: IgnoresAccessChecksTo("com.github.teamxiaolan.dawnlib")] [assembly: IgnoresAccessChecksTo("com.github.teamxiaolan.dawnlib.dusk")] [assembly: IgnoresAccessChecksTo("com.github.teamxiaolan.dawnlib.interfaces")] [assembly: IgnoresAccessChecksTo("LethalLevelLoader")] [assembly: IgnoresAccessChecksTo("LethalLevelLoader.Patcher")] [assembly: IgnoresAccessChecksTo("MrovLib")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TerminalUtils")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("A template for Lethal Company")] [assembly: AssemblyFileVersion("0.0.1.0")] [assembly: AssemblyInformationalVersion("0.0.1+33607333237e5cbb4807f53a49c2f993d6a8fb1f")] [assembly: AssemblyProduct("TerminalUtils")] [assembly: AssemblyTitle("TerminalUtils")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace TerminalUtils { public static class CommandManager { public static TerminalNode CommandNode; internal static TerminalNode RedirectToMoonsNode; internal static TerminalNode RedirectToStoreNode; public static List Commands { get; set; } = new List(); public static Dictionary CommandLookup { get { Dictionary lookup = new Dictionary(); Commands.ForEach(delegate(TerminalCommandNode command) { lookup[((CommandNode)command).Name] = command; }); return lookup; } } public static void Init() { Commands.Clear(); CommandNode = TerminalNodeManager.CreateTerminalNode("TerminalUtilsCommandNode"); CommandNode.acceptAnything = false; RedirectToMoonsNode = TerminalNodeManager.CreateTerminalNode("TerminalUtilsRedirectToMoonsNode"); RedirectToMoonsNode.acceptAnything = false; RedirectToStoreNode = TerminalNodeManager.CreateTerminalNode("TerminalUtilsRedirectToStoreNode"); RedirectToStoreNode.acceptAnything = false; } public static TerminalNode RunWeatherCommand(TerminalCommandNode command, string[] args) { string displayText = ""; if (command == null) { CommandNode.displayText = $"Command '{command}' not found."; return CommandNode; } if (command.Subcommands.Count == 0 || args.Length < 1) { ((Logger)Plugin.debugLogger).LogDebug("Running command '" + ((CommandNode)command).Name + "' with no subcommand"); displayText = command.Execute(args); } if ((Object)(object)command.RedirectToNode != (Object)null) { ((Logger)Plugin.debugLogger).LogDebug("Redirecting to node '" + ((Object)command.RedirectToNode).name + "'"); return command.RedirectToNode; } CommandNode.displayText = displayText; return CommandNode; } } public class ConfigManager { internal static ConfigFile configFile; public static ConfigManager Instance { get; private set; } public static ConfigEntry LoggingLevels { get; private set; } public static ConfigEntry PreviewInfoType { get; private set; } public static ConfigEntry FilterInfoType { get; private set; } public static ConfigEntry SortInfoType { get; private set; } public static void Init(ConfigFile config) { Instance = new ConfigManager(config); } private ConfigManager(ConfigFile config) { configFile = config; LoggingLevels = configFile.Bind("Debug", "Logging Levels", (LoggingType)0, "Set the logging level for the mod"); PreviewInfoType = configFile.Bind("General", "Preview Info Type", Defaults.defaultPreviewType, "Set the preview info type. Must be the name of an existing preview info type."); FilterInfoType = configFile.Bind("General", "Filter Info Type", Defaults.defaultFilterType, "Set the filter info type. Must be the name of an existing filter info type."); SortInfoType = configFile.Bind("General", "Sort Info Type", Defaults.defaultSortType, "Set the default sort info type. Must be the name of an existing sort info type."); } } public static class Defaults { public static readonly int terminalWidth = 48; internal static readonly int planetWeatherWidth = 18; internal static readonly int planetNameWidth = terminalWidth + 2 - planetWeatherWidth - 9; internal static readonly int itemNameWidth = terminalWidth - 9 - 10; internal static readonly int dividerLength = 17; internal static readonly string defaultPreviewType = "Name;Price;Weather"; internal static readonly string defaultFilterType = "None"; internal static readonly string defaultSortType = "None"; } public static class InfoTypeResolver { public static List> GetPreviewInfoType(string name) { if (string.IsNullOrEmpty(name)) { return (from typeName in Defaults.defaultPreviewType.Split(";") select TerminalManager.PreviewInfoTypes[typeName]).ToList(); } if (!name.Contains("Name")) { name = "Name;" + name; ((Logger)Plugin.debugLogger).LogDebug("Preview type did not contain 'Name', defaulting to 'Name;" + name + "'"); } string[] source = (from s in name.Split(';') where !string.IsNullOrWhiteSpace(s) select s.Trim()).ToArray(); return (from typeName in source select TerminalManager.PreviewInfoTypes.FirstOrDefault((KeyValuePair> info) => info.Key.ToLowerInvariant() == typeName.ToLowerInvariant()) into info where info.Value != null select info.Value).ToList(); } public static FilterInfoType GetFilterInfoType(string name) { if (string.IsNullOrEmpty(name)) { return TerminalManager.FilterInfoTypes["None"]; } return TerminalManager.FilterInfoTypes.FirstOrDefault((KeyValuePair> info) => info.Key.ToLowerInvariant() == name.ToLowerInvariant()).Value; } public static SortInfoType GetSortInfoType(string name) { if (string.IsNullOrEmpty(name)) { return TerminalManager.SortInfoTypes["None"]; } return TerminalManager.SortInfoTypes.FirstOrDefault((KeyValuePair> info) => info.Key.ToLowerInvariant() == name.ToLowerInvariant()).Value; } } public class Logger : Logger { public Logger(string SourceName, LoggingType defaultLoggingType = 1) : base(SourceName, defaultLoggingType) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) ((Logger)this).ModName = SourceName; ((Logger)this).LogSource = Logger.CreateLogSource("TerminalUtils"); ((Logger)this)._name = SourceName; } public override bool ShouldLog(LoggingType type) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) return ConfigManager.LoggingLevels.Value >= type; } } public static class NodeReplacementManager { internal static List RegisteredNodes = new List(); } [BepInPlugin("mrov.TerminalUtils", "TerminalUtils", "0.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { internal static ManualLogSource logger; internal static Logger debugLogger = new Logger("Debug", (LoggingType)2); internal static Harmony harmony = new Harmony("mrov.TerminalUtils"); internal static LethalLevelLoaderCompatibility LLLCompatibility = new LethalLevelLoaderCompatibility("imabatby.lethallevelloader"); internal static DawnLibCompatibility DawnCompatibility = new DawnLibCompatibility("com.github.teamxiaolan.dawnlib"); private void Awake() { logger = ((BaseUnityPlugin)this).Logger; harmony.PatchAll(); ConfigManager.Init(((BaseUnityPlugin)this).Config); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin mrov.TerminalUtils is loaded!"); } } public static class StartupManager { public static void Init(Terminal _instance) { TerminalManager.Init(_instance); CommandManager.Init(); PreviewCommand item = new PreviewCommand(); CommandManager.Commands.Add(item); SortCommand item2 = new SortCommand(); CommandManager.Commands.Add(item2); FilterCommand item3 = new FilterCommand(); CommandManager.Commands.Add(item3); SimulateCommand item4 = new SimulateCommand(); CommandManager.Commands.Add(item4); } } public static class TerminalManager { public static Dictionary> PreviewInfoTypes = new Dictionary>(); public static Dictionary> FilterInfoTypes = new Dictionary>(); public static Dictionary> SortInfoTypes = new Dictionary>(); public static Dictionary NodeReplacements = new Dictionary(); public static Terminal Terminal { get; private set; } public static TerminalNode MoonsPage { get; private set; } public static TerminalNode StorePage { get; private set; } public static List> CurrentPreviewInfoType { get; set; } public static FilterInfoType CurrentFilterInfoType { get; set; } public static SortInfoType CurrentSortInfoType { get; set; } public static void Init(Terminal terminal) { Terminal = terminal; MoonsPage = ContentManager.MoonsKeyword.specialKeywordResult; StorePage = ((IEnumerable)ContentManager.Nodes).FirstOrDefault((Func)((TerminalNode node) => ((Object)node).name == "0_StoreHub")); RegisterLocalInfoTypes(); CurrentPreviewInfoType = InfoTypeResolver.GetPreviewInfoType(ConfigManager.PreviewInfoType.Value); CurrentFilterInfoType = InfoTypeResolver.GetFilterInfoType(ConfigManager.FilterInfoType.Value); CurrentSortInfoType = InfoTypeResolver.GetSortInfoType(ConfigManager.SortInfoType.Value); NodeReplacements = new Dictionary { { MoonsPage, new MoonCatalogue() } }; } private static void RegisterLocalInfoTypes() { PreviewInfoTypes.Add("Name", new PreviewName()); PreviewInfoTypes.Add("Price", new PreviewPrice()); PreviewInfoTypes.Add("Weather", new PreviewWeather()); PreviewInfoTypes.Add("Difficulty", new PreviewDifficulty()); SortInfoTypes.Add("None", new SortNone()); SortInfoTypes.Add("Name", new SortName()); SortInfoTypes.Add("Price", new SortPrice()); FilterInfoTypes.Add("None", new FilterNone()); FilterInfoTypes.Add("Price", new FilterPrice()); FilterInfoTypes.Add("Weather", new FilterWeather()); } } public class TerminalNodeManager { internal static TerminalNode lastResolvedNode; public static void Init() { } public static TerminalKeyword AddVerb(string name, string word) { TerminalKeyword val = ScriptableObject.CreateInstance(); ((Object)val).name = name; val.word = word; val.isVerb = true; ContentManager.AddTerminalKeywords(new List(1) { val }); return val; } public static void AddTerminalContent(List terminalNodes = null, List terminalKeywords = null) { if (terminalNodes != null && terminalNodes.Count > 0) { ContentManager.AddTerminalNodes(terminalNodes); } if (terminalKeywords != null && terminalKeywords.Count > 0) { ContentManager.AddTerminalKeywords(terminalKeywords); } } public static TerminalNode CreateTerminalNode(string name, string terminalEvent = "") { TerminalNode val = ScriptableObject.CreateInstance(); ((Object)val).name = name; val.terminalEvent = terminalEvent; val.displayText = ""; val.clearPreviousText = true; val.acceptAnything = true; val.terminalOptions = Array.Empty(); val.maxCharactersToType = 25; val.itemCost = 0; val.buyItemIndex = -1; val.buyVehicleIndex = -1; val.buyRerouteToMoon = -1; val.displayPlanetInfo = -1; val.shipUnlockableID = -1; val.creatureFileID = -1; val.storyLogFileID = -1; val.playSyncedClip = -1; return val; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "mrov.TerminalUtils"; public const string PLUGIN_NAME = "TerminalUtils"; public const string PLUGIN_VERSION = "0.0.1"; } } namespace TerminalUtils.Patches { [HarmonyPatch(typeof(Terminal))] public static class TerminalLoadNewNodePatch { [HarmonyPrefix] [HarmonyPatch("LoadNewNode")] [HarmonyAfter(new string[] { "imabatby.lethallevelloader", "com.github.teamxiaolan.dawnlib", "mrov.TerminalFormatter" })] public static bool PatchMethod(Terminal __instance, TerminalNode node) { if (TerminalManager.NodeReplacements.ContainsKey(node)) { __instance.modifyingText = true; ((Selectable)__instance.screenText).interactable = true; TerminalNodeReplacement terminalNodeReplacement = TerminalManager.NodeReplacements[node]; Plugin.logger.LogInfo((object)("Replacing node " + ((Object)__instance.currentNode).name + " with " + terminalNodeReplacement.Name)); 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"); } stringBuilder.Append("\n\n"); stringBuilder.Append(terminalNodeReplacement.GetNodeText()); stringBuilder.Append("\n" + new string('-', 17) + "\n"); __instance.LoadTerminalImage(node); __instance.currentNode = node; __instance.screenText.text = stringBuilder.ToString(); __instance.currentText = stringBuilder.ToString(); __instance.textAdded = 0; return false; } return true; } } [HarmonyPatch(typeof(Terminal), "ParsePlayerSentence")] internal class TerminalParsePlayerSentencePatch { [HarmonyPrefix] [HarmonyBefore(new string[] { "mrov.WeatherRegistry" })] public static bool GameMethodPatch(Terminal __instance, ref TerminalNode __result) { string text = __instance.screenText.text; int textAdded = __instance.textAdded; string text2 = text.Substring(text.Length - textAdded); text2 = __instance.RemovePunctuation(text2); List list = text2.Split(' ').ToList(); if (list.Count >= 1 && CommandManager.CommandLookup.TryGetValue(list[0], out var value)) { ((Logger)Plugin.debugLogger).LogWarning("Command detected, passing to CommandManager"); if (list.Count >= 2) { string[] args = list.Skip(1).ToArray(); TerminalNode val = CommandManager.RunWeatherCommand(value, args); __result = val; return false; } return true; } return true; } } [HarmonyPatch(typeof(Terminal))] public static class TerminalStartPatch { [HarmonyPatch("Start")] [HarmonyPostfix] public static void Postfix(Terminal __instance) { StartupManager.Init(__instance); if (((CompatibilityHandler)Plugin.LLLCompatibility).IsModPresent) { Plugin.LLLCompatibility.RemoveMoonNodeEvent(); } } } } namespace TerminalUtils.Nodes { public class MoonCatalogue : TerminalNodeReplacement { public MoonCatalogue() : base("Moon Catalogue", TerminalManager.MoonsPage) { base.HelpText = " Welcome to the exomoons catalogue! \n Use ROUTE to set the autopilot. \n Use INFO to learn about a moon."; } public override string GetNodeText() { //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown List inputList = TerminalManager.CurrentFilterInfoType.Filter(LevelHelper.Levels); inputList = TerminalManager.CurrentSortInfoType.Sort(inputList); ((Logger)Plugin.debugLogger).LogDebug("Current preview types: " + string.Join(", ", TerminalManager.CurrentPreviewInfoType.Select((PreviewInfoType info) => info.Name))); StringBuilder stringBuilder = new StringBuilder(); ConsoleTable val = new ConsoleTable(TerminalManager.CurrentPreviewInfoType.Select((PreviewInfoType info) => info.Name).ToArray()); int num = 1; List> currentPreviewInfoType = TerminalManager.CurrentPreviewInfoType; foreach (SelectableLevel level in inputList) { ((Logger)Plugin.debugLogger).LogDebug("Current preview types: " + string.Join(", ", currentPreviewInfoType.Select((PreviewInfoType info) => info.Name))); string[] array = currentPreviewInfoType.Select((PreviewInfoType info) => info.Value(level)).ToArray(); object[] array2 = array; val.AddRow(array2); if (num % 3 == 0) { num = 1; array2 = currentPreviewInfoType.Select((PreviewInfoType _) => "").ToArray(); val.AddRow(array2); } else { num++; } } stringBuilder.AppendLine((base.HelpText != null) ? ("\n" + base.HelpText + "\n\n") : ""); stringBuilder.Append($" The Company // Buying at {Mathf.RoundToInt(StartOfRound.Instance.companyBuyingRate * 100f)}% \n\n"); stringBuilder.Append(val.ToStringCustomDecoration(false, false, false)); stringBuilder.AppendLine(); stringBuilder.AppendLine(); stringBuilder.AppendLine("PREVIEW: " + string.Join(", ", currentPreviewInfoType.Select((PreviewInfoType info) => info.Name)) + "\nSORT: " + TerminalManager.CurrentSortInfoType.Name + "; FILTER: " + TerminalManager.CurrentFilterInfoType.Name); return stringBuilder.ToString().TrimEnd(); } } } namespace TerminalUtils.InfoTypes.Moons { public class FilterNone : FilterInfoType { public FilterNone() : base("None") { } public override List Filter(List inputList) { return inputList; } } public class FilterPrice : FilterInfoType { public FilterPrice() : base("Price") { } public override List Filter(List inputList) { return inputList.Where((SelectableLevel lvl) => ContentManager.RouteDictionary.GetRoute(lvl).Price <= ContentManager.Terminal.groupCredits).ToList(); } } public class FilterWeather : FilterInfoType { public FilterWeather() : base("Weather") { } public override List Filter(List inputList) { return inputList.Where((SelectableLevel lvl) => ContentManager.RouteDictionary.GetRoute(lvl).Price >= ContentManager.Terminal.groupCredits).ToList(); } } public class PreviewDifficulty : PreviewInfoType { public PreviewDifficulty() : base("Difficulty") { } public override string Value(SelectableLevel inputValue) { return inputValue.riskLevel; } } public class PreviewName : PreviewInfoType { public PreviewName() : base("Name") { base.MaxLength = LevelHelper.LongestPlanetName.Length; } public override string Value(SelectableLevel inputValue) { return StringResolver.GetAlphanumericName(inputValue); } } public class PreviewPrice : PreviewInfoType { public PreviewPrice() : base("Price") { } public override string Value(SelectableLevel inputValue) { return $"${ContentManager.RouteDictionary.GetRoute(inputValue).Price}"; } } public class PreviewWeather : PreviewInfoType { public PreviewWeather() : base("Weather") { } public override string Value(SelectableLevel inputValue) { return ((object)(LevelWeatherType)(ref inputValue.currentWeather)).ToString(); } } public class SortName : SortInfoType { public SortName() : base("Name") { } public override List Sort(List inputList) { inputList.Sort((SelectableLevel a, SelectableLevel b) => StringResolver.GetAlphanumericName(a).CompareTo(StringResolver.GetAlphanumericName(b))); return inputList; } } public class SortNone : SortInfoType { public SortNone() : base("None") { } public override List Sort(List inputList) { return inputList; } } public class SortPrice : SortInfoType { public SortPrice() : base("Price") { } public override List Sort(List inputList) { inputList.Sort((SelectableLevel a, SelectableLevel b) => ContentManager.RouteDictionary.GetRoute(a).Price.CompareTo(ContentManager.RouteDictionary.GetRoute(b).Price)); return inputList; } } } namespace TerminalUtils.Enums { public enum TerminalDisplayType { Preview, Sort, Filter } } namespace TerminalUtils.Definitions { public abstract class ConfigHandler : ConfigHandler { public ConfigHandler(CT value) { ((ConfigHandler)this).DefaultValue = value; } } public class FilterInfoType : TerminalInfoType { public FilterInfoType(string Name) { base.Name = Name; base.Type = TerminalDisplayType.Filter; } public virtual List Filter(List inputList) { return inputList; } } public interface ITerminalInfoType { string Name { get; } TerminalDisplayType Type { get; } } public class TerminalInfoType : ITerminalInfoType { public string Name { get; set; } public TerminalDisplayType Type { get; set; } public override string ToString() { return $"{Name} ({Type})"; } } public class PreviewGroup { public List PreviewInfoTypes { get; set; } } public class PreviewInfoType : TerminalInfoType { public int MaxLength { get; set; } = Defaults.terminalWidth; public PreviewInfoType(string Name) { base.Name = Name; base.Type = TerminalDisplayType.Preview; } } public abstract class PreviewInfoType : PreviewInfoType { protected PreviewInfoType(string Name) : base(Name) { } public string ValueWithMaxLength(T inputValue) { string text = Value(inputValue); if (text.Length > base.MaxLength) { text = text.Substring(0, base.MaxLength - 3) + "..."; } return text; } public virtual string Value(T inputValue) { return ""; } public override string ToString() { return $"{base.Name} ({base.Type})"; } } public class SortInfoType : TerminalInfoType { public SortInfoType(string Name) { base.Name = Name; base.Type = TerminalDisplayType.Sort; } public virtual List Sort(List inputList) { return inputList; } } public abstract class TerminalCommandNode : CommandNode { public List Subcommands { get; set; } = new List(); public bool HostOnly { get; set; } public int TerminalSound { get; set; } = -1; public TerminalNode RedirectToNode { get; set; } protected TerminalCommandNode(string Name) : base(Name) { } public virtual bool ShouldRun() { if (!HostOnly || ((NetworkBehaviour)StartOfRound.Instance).IsHost) { return true; } return false; } public virtual string Execute(string[] args) { return ""; } } public abstract class TerminalNodeReplacement { public StringBuilder stringBuilder = new StringBuilder(); public string Name { get; set; } public string HelpText { get; set; } public TerminalNode NodeToMatch { get; set; } public ConfigEntry Enabled { get; set; } public virtual bool IsNodeValid(TerminalNode node, Terminal terminal) { return true; } public abstract string GetNodeText(); public TerminalNodeReplacement(string name, TerminalNode NodeToMatch) { Name = name; this.NodeToMatch = NodeToMatch; Enabled = ConfigManager.configFile.Bind("Nodes", name, true, "Enable node " + name); NodeReplacementManager.RegisteredNodes.Add(this); ((Logger)Plugin.debugLogger).LogInfo("Registered node " + name); } } } namespace TerminalUtils.Compatibility { public class DawnLibCompatibility : CompatibilityHandler { public DawnLibCompatibility(string guid, string version = null) : base(guid, version, false) { } public override void Init() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown if (((CompatibilityHandler)this).IsModPresent) { Type type = AccessTools.TypeByName("Dawn.MoonRegistrationHandler"); Plugin.harmony.Patch((MethodBase)AccessTools.Method(type, "DynamicMoonCatalogue", (Type[])null, (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(DawnLibCompatibility), "InsertMoonCatalogueSkip", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null); } } public (bool locked, bool hidden) GetLevelStatus(SelectableLevel level) { TerminalPurchaseResult val = SelectableLevelExtensions.GetDawnInfo(level).DawnPurchaseInfo.PurchasePredicate.CanPurchase(); HiddenPurchaseResult val2 = (HiddenPurchaseResult)(object)((val is HiddenPurchaseResult) ? val : null); if (val2 == null) { if (!(val is FailedPurchaseResult)) { if (val is SuccessPurchaseResult) { return (false, false); } return (false, false); } return (true, false); } return (val2.IsFailure, true); } public static IEnumerable InsertMoonCatalogueSkip(IEnumerable instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.Start().Insert((CodeInstruction[])(object)new CodeInstruction[6] { new CodeInstruction(OpCodes.Ldarg_0, (object)null), new CodeInstruction(OpCodes.Ldarg_1, (object)null), new CodeInstruction(OpCodes.Ldarg_2, (object)null), new CodeInstruction(OpCodes.Ldarg_3, (object)null), new CodeInstruction(OpCodes.Callvirt, (object)AccessTools.Method(typeof(orig_TextPostProcess), "Invoke", (Type[])null, (Type[])null)), new CodeInstruction(OpCodes.Ret, (object)null) }); return val.InstructionEnumeration(); } public static Dictionary GetDungeonRarities(SelectableLevel level) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) Dictionary dictionary = new Dictionary(); DawnMoonInfo dawnInfo = SelectableLevelExtensions.GetDawnInfo(level); List list = new List(); List list2 = new List(); foreach (DawnDungeonInfo value6 in ((Registry)(object)LethalContent.Dungeons).Values) { WeatherEffect currentWeatherEffect = TimeOfDayRefs.GetCurrentWeatherEffect(dawnInfo.Level); SpawnWeightContext val = new SpawnWeightContext(dawnInfo, (DawnDungeonInfo)null, (currentWeatherEffect != null) ? WeatherEffectExtensions.GetDawnInfo(currentWeatherEffect) : null); SpawnWeightContext val2 = ((SpawnWeightContext)(ref val)).WithExtra(SpawnWeightExtraKeys.RoutingPriceKey, dawnInfo.DawnPurchaseInfo.Cost.Provide()); int valueOrDefault = ProviderTableSpawnWeightExtensions.GetFor(value6.Weights, ref val2).GetValueOrDefault(); if (valueOrDefault > 0) { list.Add(value6); list2.Add(valueOrDefault); } } for (int i = 0; i < list.Count; i++) { for (int j = i + 1; j < list.Count; j++) { if (list2[i] < list2[j]) { List list3 = list; int index = i; int index2 = j; DawnDungeonInfo value = list[j]; DawnDungeonInfo value2 = list[i]; list3[index] = value; list[index2] = value2; List list4 = list2; index2 = i; index = j; float value3 = list2[j]; float value4 = list2[i]; list4[index2] = value3; list2[index] = value4; } } } float num = list2.Sum(); for (int k = 0; k < list.Count; k++) { string name = ((Object)list[k].DungeonFlow).name; StringBuilder stringBuilder = new StringBuilder(); int count = Mathf.Max(20 - name.Length, 0); stringBuilder.Append("* " + name + new string(' ', count)); int value5 = (int)list2[k]; dictionary[name] = value5; } return dictionary; } } public class LethalLevelLoaderCompatibility : CompatibilityHandler { public LethalLevelLoaderCompatibility(string guid, string version = null) : base(guid, version, false) { } public void RemoveMoonNodeEvent() { if (((CompatibilityHandler)this).IsModPresent) { TerminalManager.onLoadNewNodeRegisteredEventsDictionary.Clear(); } } public static bool IsLevelLocked(SelectableLevel level) { return SharedMethods.IsMoonLockedLLL(level); } public static bool IsLevelHidden(SelectableLevel level) { return SharedMethods.IsMoonHiddenLLL(level); } public static List> GetDungeonFlowsWithRarity(SelectableLevel level) { List> list = new List>(); ExtendedLevel val = default(ExtendedLevel); LevelManager.TryGetExtendedLevel(level, ref val, (ContentType)2); CollectionExtensions.Do>(from flow in DungeonManager.GetValidExtendedDungeonFlows(val, false) select new KeyValuePair(flow.extendedDungeonFlow.DungeonFlow, flow.rarity), (Action>)list.Add); return list; } public static List GetExtendedDungeonFlowsWithRarity(ExtendedLevel extendedLevel) { List list = new List(); CollectionExtensions.Do((IEnumerable)DungeonManager.GetValidExtendedDungeonFlows(extendedLevel, false), (Action)list.Add); return list; } public static Dictionary GetDungeonRarities(SelectableLevel level) { Dictionary result = new Dictionary(); ExtendedLevel extendedLevel = default(ExtendedLevel); LevelManager.TryGetExtendedLevel(level, ref extendedLevel, (ContentType)2); CollectionExtensions.Do((IEnumerable)GetExtendedDungeonFlowsWithRarity(extendedLevel), (Action)delegate(ExtendedDungeonFlowWithRarity flow) { result[((Object)flow.extendedDungeonFlow.DungeonFlow).name] = flow.rarity; }); return result; } } } namespace TerminalUtils.Commands { public class FilterCommand : TerminalCommandNode { public FilterCommand() : base("filter") { base.RedirectToNode = TerminalManager.MoonsPage; } public override string Execute(string[] args) { string filterTypeName = "none"; Dictionary> infoTypes = TerminalManager.FilterInfoTypes.Select((KeyValuePair> kv) => kv.Value).ToDictionary((FilterInfoType infoType) => infoType.Name.ToLowerInvariant(), (FilterInfoType infoType) => infoType); ((Logger)Plugin.debugLogger).LogDebug("Possible filter types: " + string.Join(", ", infoTypes.Keys)); args.ToList().ForEach(delegate(string arg) { if (infoTypes.ContainsKey(arg)) { filterTypeName = arg; } }); TerminalManager.CurrentFilterInfoType = infoTypes[filterTypeName]; ConfigManager.FilterInfoType.Value = infoTypes[filterTypeName].Name; return ""; } } public class PreviewCommand : TerminalCommandNode { public PreviewCommand() : base("preview") { base.RedirectToNode = TerminalManager.MoonsPage; } public override string Execute(string[] args) { List previewTypeNames = new List(1) { "name" }; Dictionary> infoTypes = TerminalManager.PreviewInfoTypes.Select((KeyValuePair> kv) => kv.Value).ToDictionary((PreviewInfoType infoType) => infoType.Name.ToLowerInvariant(), (PreviewInfoType infoType) => infoType); ((Logger)Plugin.debugLogger).LogDebug("Possible preview types: " + string.Join(", ", infoTypes.Keys)); args.ToList().ForEach(delegate(string arg) { if (infoTypes.ContainsKey(arg)) { previewTypeNames.Add(arg); } }); TerminalManager.CurrentPreviewInfoType = previewTypeNames.Select((string name) => infoTypes[name]).ToList(); ConfigManager.PreviewInfoType.Value = string.Join(";", TerminalManager.CurrentPreviewInfoType.Select((PreviewInfoType info) => info.Name)); return ""; } } public class SimulateCommand : TerminalCommandNode { public SimulateCommand() : base("simulate") { } public override string Execute(string[] args) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown SelectableLevel val = StringResolver.ResolveStringToLevels(args[0]).FirstOrDefault(); Dictionary source = new Dictionary(); if (((CompatibilityHandler)Plugin.DawnCompatibility).IsModPresent) { source = DawnLibCompatibility.GetDungeonRarities(StartOfRound.Instance.currentLevel); } else if (((CompatibilityHandler)Plugin.LLLCompatibility).IsModPresent) { source = LethalLevelLoaderCompatibility.GetDungeonRarities(StartOfRound.Instance.currentLevel); } ConsoleTable val2 = new ConsoleTable(new string[3] { "Interior", "Weight", "Chance" }); val2.AddRow(new object[3] { "", "", "" }); source = source.OrderBy((KeyValuePair o) => -o.Value).ToDictionary((KeyValuePair k) => k.Key, (KeyValuePair v) => v.Value); int num = source.Values.Sum(); foreach (KeyValuePair item in source) { item.Deconstruct(out var key, out var value); string text = key; int num2 = value; object[] obj = new object[3] { text.PadRight(20), num2, null }; value = num2 / num * 100; obj[2] = (value.ToString("F2") + "%").PadLeft(4); val2.AddRow(obj); } val2.AddRow(new object[3] { "", "", "" }); val2.AddRow(new object[3] { "", "", "" }); val2.AddRow(new object[3] { "", num.ToString().PadRight(6), "100%".ToString().PadLeft(4) }); ((Logger)Plugin.debugLogger).LogDebug("Flows with rarity for level " + val.PlanetName + ": " + string.Join(", ", source.Select((KeyValuePair kv) => $"{kv.Key} (rarity: {kv.Value})"))); return val2.ToStringCustomDecoration(true, false, false); } } public class SortCommand : TerminalCommandNode { public SortCommand() : base("sort") { base.RedirectToNode = TerminalManager.MoonsPage; } public override string Execute(string[] args) { string sortTypeName = "none"; Dictionary> infoTypes = TerminalManager.SortInfoTypes.Select((KeyValuePair> kv) => kv.Value).ToDictionary((SortInfoType infoType) => infoType.Name.ToLowerInvariant(), (SortInfoType infoType) => infoType); ((Logger)Plugin.debugLogger).LogDebug("Possible sort types: " + string.Join(", ", infoTypes.Keys)); args.ToList().ForEach(delegate(string arg) { if (infoTypes.ContainsKey(arg)) { sortTypeName = arg; } }); TerminalManager.CurrentSortInfoType = infoTypes[sortTypeName]; ConfigManager.SortInfoType.Value = infoTypes[sortTypeName].Name; return ""; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }