Decompiled source of MoonRoutePriceMod v1.1.5

MoonRoutePriceMod.dll

Decompiled 10 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using MoonRoutePriceMod.Patches;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("MoonRoutePriceMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MoonRoutePriceMod")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("7d247e85-ff55-474f-8220-b0f8f5d29692")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace MoonRoutePriceMod
{
	[BepInPlugin("ImoutoSama.MoonRoutePriceMod", "Moon Route Price Mod", "1.1.5")]
	[BepInProcess("Lethal Company.exe")]
	public class MoonRoutePricePlugin : BaseUnityPlugin
	{
		public class MoonData
		{
			public int moonCataIndex;

			public TerminalNode priceA;

			public TerminalNode priceB;

			public int basePrice;

			public int finalMultiplier;

			public bool displayMultiplier;
		}

		private const string modGUID = "ImoutoSama.MoonRoutePriceMod";

		private const string modName = "Moon Route Price Mod";

		private const string modVersion = "1.1.5";

		private readonly Harmony harmony = new Harmony("ImoutoSama.MoonRoutePriceMod");

		internal ManualLogSource logger;

		public ConfigEntry<int> configMulti;

		public ConfigEntry<int> configMinPre;

		public ConfigEntry<int> configMinPost;

		public ConfigEntry<int> configRound;

		public ConfigEntry<bool> configMultiType;

		public ConfigEntry<int> configFoggy;

		public ConfigEntry<int> configRainy;

		public ConfigEntry<int> configStormy;

		public ConfigEntry<int> configFlooded;

		public ConfigEntry<int> configEclipsed;

		public Terminal terminal;

		public MoonData[] moonData;

		public Dictionary<TerminalNode, MoonData> nodeToMoonData;

		public static MoonRoutePricePlugin Instance { get; private set; }

		private void Awake()
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			ConfigDefinition val = new ConfigDefinition("General", "Discount");
			ConfigEntry<int> val2 = default(ConfigEntry<int>);
			int defaultValue = (((BaseUnityPlugin)this).Config.TryGetEntry<int>(val, ref val2) ? (100 - val2.Value) : 50);
			((BaseUnityPlugin)this).Config.Remove(val);
			configMulti = ConfigBindClamp("General", "Multiplier", defaultValue, "The price modifier % for all moon routes. Clamped from 0% to 400%. 0% = Free. 100% = No effect", 0, 400);
			configMinPre = ConfigBindClamp("General", "Minimum Cost (Pre)", 0, "The lowest price for all moon routes (before calcuations). Clamped from 0 to 1000. 0 = No effect", 0, 1000);
			configMinPost = ConfigBindClamp("General", "Minimum Cost (Post)", 0, "The lowest price for all moon routes (after calcuations). Clamped from 0 to 1000. 0 = No effect", 0, 1000);
			configRound = ConfigBindClamp("General", "Round Figure", 10, "The modified price is rounded to a multiple of this number. Clamped from 1 to 100. 1 = No rounding", 1, 100);
			configFoggy = ConfigBindClamp("Weather", "Foggy Multiplier", 100, "The price modifier % for all moon routes with foggy weather. Clamped from 0% to 400%. 0% = Free. 100% = No effect", 0, 400);
			configRainy = ConfigBindClamp("Weather", "Rainy Multiplier", 100, "The price modifier % for all moon routes with rainy weather. Clamped from 0% to 400%. 0% = Free. 100% = No effect", 0, 400);
			configStormy = ConfigBindClamp("Weather", "Stormy Multiplier", 100, "The price modifier % for all moon routes with stormy weather. Clamped from 0% to 400%. 0% = Free. 100% = No effect", 0, 400);
			configFlooded = ConfigBindClamp("Weather", "Flooded Multiplier", 100, "The price modifier % for all moon routes with flooded weather. Clamped from 0% to 400%. 0% = Free. 100% = No effect", 0, 400);
			configEclipsed = ConfigBindClamp("Weather", "Eclipsed Multiplier", 100, "The price modifier % for all moon routes with eclipsed weather. Clamped from 0% to 400%. 0% = Free. 100% = No effect", 0, 400);
			logger = Logger.CreateLogSource("ImoutoSama.MoonRoutePriceMod");
			logger.LogInfo((object)"Plugin Moon Route Price Mod has been added!");
			harmony.PatchAll(typeof(MoonRoutePricePlugin));
			harmony.PatchAll(typeof(TerminalPatch));
			harmony.PatchAll(typeof(StartOfRoundPatch));
		}

		public ConfigEntry<int> ConfigBindClamp(string section, string key, int defaultValue, string description, int min, int max)
		{
			ConfigEntry<int> val = ((BaseUnityPlugin)this).Config.Bind<int>(section, key, defaultValue, description);
			val.Value = Mathf.Clamp(val.Value, min, max);
			return val;
		}

		public int GetWeatherMulti(LevelWeatherType weather)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected I4, but got Unknown
			return (weather - -1) switch
			{
				4 => configFoggy.Value, 
				2 => configRainy.Value, 
				3 => configStormy.Value, 
				5 => configFlooded.Value, 
				6 => configEclipsed.Value, 
				_ => 100, 
			};
		}

		public static string GetFullMultiString(int multiplier)
		{
			if (multiplier == 100)
			{
				return string.Empty;
			}
			if (multiplier < 100)
			{
				return $"{100 - multiplier}% discount";
			}
			return $"{multiplier - 100}% markup";
		}

		public static string GetShortMultiString(int multiplier)
		{
			if (multiplier == 100)
			{
				return string.Empty;
			}
			if (multiplier < 100)
			{
				return $" ({multiplier - 100}%)";
			}
			return $" (+{multiplier - 100}%)";
		}
	}
}
namespace MoonRoutePriceMod.Patches
{
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatch
	{
		[HarmonyPatch("SetPlanetsWeather")]
		[HarmonyPostfix]
		private static void SetPlanetsWeatherPatch()
		{
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			MoonRoutePricePlugin.MoonData[] moonData = MoonRoutePricePlugin.Instance.moonData;
			if (moonData == null)
			{
				MoonRoutePricePlugin.Instance.logger.LogError((object)"Start of round started before the Terminal was found. BIG BUG");
				return;
			}
			SelectableLevel[] moonsCatalogueList = MoonRoutePricePlugin.Instance.terminal.moonsCatalogueList;
			for (int i = 0; i < moonData.Length; i++)
			{
				MoonRoutePricePlugin.MoonData moonData2 = moonData[i];
				SelectableLevel val = moonsCatalogueList[i];
				int value = MoonRoutePricePlugin.Instance.configMinPre.Value;
				float num = Mathf.Max(moonData2.basePrice, value);
				float num2 = (float)MoonRoutePricePlugin.Instance.configMulti.Value * 0.01f * ((float)MoonRoutePricePlugin.Instance.GetWeatherMulti(val.currentWeather) * 0.01f);
				num *= num2;
				num = Mathf.Max(num, 0f);
				int value2 = MoonRoutePricePlugin.Instance.configRound.Value;
				int num3 = Mathf.RoundToInt(num * (1f / (float)value2)) * value2;
				int value3 = MoonRoutePricePlugin.Instance.configMinPost.Value;
				num3 = Mathf.Max(num3, value3);
				moonData2.priceA.itemCost = num3;
				moonData2.priceB.itemCost = num3;
				moonData2.finalMultiplier = Mathf.RoundToInt(num2 * 100f);
				MoonRoutePricePlugin.Instance.logger.LogInfo((object)$"{val.PlanetName}: {moonData2.finalMultiplier}%");
			}
			MoonRoutePricePlugin.Instance.logger.LogInfo((object)"New route prices have been set");
		}
	}
	[HarmonyPatch(typeof(Terminal))]
	internal class TerminalPatch
	{
		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		private static void AwakePatch(ref Terminal __instance)
		{
			MoonRoutePricePlugin.Instance.logger.LogInfo((object)"Recording newest terminal instance");
			MoonRoutePricePlugin.Instance.terminal = __instance;
			if (MoonRoutePricePlugin.Instance.moonData != null)
			{
				return;
			}
			TerminalKeyword[] allKeywords = __instance.terminalNodes.allKeywords;
			TerminalKeyword val = ((IEnumerable<TerminalKeyword>)allKeywords).FirstOrDefault((Func<TerminalKeyword, bool>)((TerminalKeyword a) => a.word == "route"));
			TerminalKeyword val2 = ((IEnumerable<TerminalKeyword>)allKeywords).FirstOrDefault((Func<TerminalKeyword, bool>)((TerminalKeyword a) => a.word == "moons"));
			if ((Object)(object)val == (Object)null)
			{
				MoonRoutePricePlugin.Instance.logger.LogError((object)"Could not find route terminal entry. New patch?");
				return;
			}
			if ((Object)(object)val2 == (Object)null)
			{
				MoonRoutePricePlugin.Instance.logger.LogError((object)"Could not find moons terminal entry. New patch?");
				return;
			}
			CompatibleNoun[] compatibleNouns = val.compatibleNouns;
			if (compatibleNouns == null)
			{
				MoonRoutePricePlugin.Instance.logger.LogError((object)"Route terminal entry has no nouns. New patch?");
				return;
			}
			bool flag = MoonRoutePricePlugin.Instance.configMinPre.Value > 0;
			SelectableLevel[] moonsCatalogueList = __instance.moonsCatalogueList;
			MoonRoutePricePlugin.MoonData[] array = new MoonRoutePricePlugin.MoonData[moonsCatalogueList.Length];
			Dictionary<TerminalNode, MoonRoutePricePlugin.MoonData> dictionary = new Dictionary<TerminalNode, MoonRoutePricePlugin.MoonData>();
			CompatibleNoun[] array2 = compatibleNouns;
			foreach (CompatibleNoun val3 in array2)
			{
				MoonRoutePricePlugin.MoonData moonData = new MoonRoutePricePlugin.MoonData();
				TerminalNode val4 = (moonData.priceA = val3.result);
				moonData.priceB = val4.terminalOptions[1].result;
				moonData.basePrice = val4.itemCost;
				moonData.finalMultiplier = 100;
				moonData.displayMultiplier = moonData.basePrice > 0 || flag;
				moonData.moonCataIndex = -1;
				string text = val3.noun.word.ToLowerInvariant();
				for (int j = 0; j < moonsCatalogueList.Length; j++)
				{
					string text2 = moonsCatalogueList[j].PlanetName.ToLowerInvariant();
					if (text2.Contains(text))
					{
						moonData.moonCataIndex = j;
						break;
					}
				}
				if (moonData.moonCataIndex == -1)
				{
					if (text == "company")
					{
						MoonRoutePricePlugin.Instance.logger.LogInfo((object)("Skipping " + text));
					}
					else
					{
						MoonRoutePricePlugin.Instance.logger.LogError((object)(text + " has no moon matching in the catalogue. New patch?"));
					}
				}
				else if (array[moonData.moonCataIndex] != null)
				{
					MoonRoutePricePlugin.Instance.logger.LogWarning((object)(text + " is a duplicate in the route keywords. This is a current bug for dine in the base game"));
				}
				else
				{
					string displayText = moonData.priceA.displayText;
					displayText = displayText.Replace("[totalCost]", "[totalCost][finalMulti]");
					moonData.priceA.displayText = displayText;
					array[moonData.moonCataIndex] = moonData;
					dictionary.Add(moonData.priceA, moonData);
				}
			}
			MoonRoutePricePlugin.Instance.moonData = array;
			MoonRoutePricePlugin.Instance.nodeToMoonData = dictionary;
			MoonRoutePricePlugin.Instance.logger.LogInfo((object)"Attempting to add text to Moons keyword text");
			TerminalNode specialKeywordResult = val2.specialKeywordResult;
			string displayText2 = specialKeywordResult.displayText;
			int startIndex = displayText2.IndexOf("_______");
			displayText2 = displayText2.Insert(startIndex, "[routeMulti]");
			displayText2 = displayText2.Replace("[planetTime]", "[planetTime][weatherMulti]");
			specialKeywordResult.displayText = displayText2;
			MoonRoutePricePlugin.Instance.logger.LogInfo((object)"Finished the Terminal patch");
		}

		[HarmonyPatch("TextPostProcess")]
		[HarmonyPostfix]
		private static void TextPostProgressPostPatch(ref Terminal __instance, ref string __result, TerminalNode node)
		{
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			int value = MoonRoutePricePlugin.Instance.configMulti.Value;
			__result = __result.Replace("[routeMulti]", (value != 100) ? ("All moon routes at " + MoonRoutePricePlugin.GetFullMultiString(value) + "!\n") : string.Empty);
			int num = __result.Split(new string[1] { "[weatherMulti]" }, StringSplitOptions.None).Length - 1;
			if (num > 0)
			{
				Regex regex = new Regex(Regex.Escape("[weatherMulti]"));
				MoonRoutePricePlugin.MoonData[] moonData = MoonRoutePricePlugin.Instance.moonData;
				SelectableLevel[] moonsCatalogueList = __instance.moonsCatalogueList;
				for (int i = 0; i < num && moonsCatalogueList.Length > i; i++)
				{
					MoonRoutePricePlugin.MoonData moonData2 = moonData[i];
					string replacement;
					if (moonData2.displayMultiplier)
					{
						LevelWeatherType currentWeather = moonsCatalogueList[i].currentWeather;
						int weatherMulti = MoonRoutePricePlugin.Instance.GetWeatherMulti(currentWeather);
						replacement = MoonRoutePricePlugin.GetShortMultiString(weatherMulti);
					}
					else
					{
						replacement = string.Empty;
					}
					__result = regex.Replace(__result, replacement, 1);
				}
			}
			if (MoonRoutePricePlugin.Instance.nodeToMoonData.TryGetValue(node, out var value2))
			{
				int finalMultiplier = value2.finalMultiplier;
				string newValue = ((finalMultiplier == 100 || !value2.displayMultiplier) ? string.Empty : (" (" + MoonRoutePricePlugin.GetFullMultiString(finalMultiplier) + ")"));
				__result = __result.Replace("[finalMulti]", newValue);
			}
		}
	}
}