Decompiled source of Custom Biome Intros v1.1.0

CustomBiomeIntros.dll

Decompiled 4 days 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.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using TitlesStorage;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("CustomBiomeIntros")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.1.0.0")]
[assembly: AssemblyInformationalVersion("1.1.0")]
[assembly: AssemblyProduct("Custom Biome Intros")]
[assembly: AssemblyTitle("CustomBiomeIntros")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.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 TitlesStorage
{
	[Serializable]
	public class TitleStorage
	{
		public string[] shoreTitles;

		public string[] tropicsTitles;

		public string[] alpineTitles;

		public string[] mesaTitles;

		public string[] calderaTitles;

		public string[] kilnTitles;

		public string[] peakTitles;

		public string[] tombTitles;

		public Dictionary<int, string[]> dayCountCaptions;

		public string[] this[string key] => key switch
		{
			"SHORE" => shoreTitles, 
			"TROPICS" => tropicsTitles, 
			"ALPINE" => alpineTitles, 
			"MESA" => mesaTitles, 
			"CALDERA" => calderaTitles, 
			"THE KILN" => kilnTitles, 
			"PEAK" => peakTitles, 
			"TOMB" => tombTitles, 
			_ => null, 
		};
	}
	public class DefaultStorage : TitleStorage
	{
		public static TitleStorage defaultTitles = new TitleStorage
		{
			shoreTitles = new string[1] { "SHORE" },
			tropicsTitles = new string[1] { "TROPICS" },
			alpineTitles = new string[1] { "ALPINE" },
			mesaTitles = new string[1] { "MESA" },
			calderaTitles = new string[1] { "CALDERA" },
			kilnTitles = new string[1] { "THE KILN" },
			peakTitles = new string[1] { "PEAK" },
			tombTitles = new string[1] { "TOMB" },
			dayCountCaptions = new Dictionary<int, string[]> { 
			{
				1,
				new string[1] { "DAY #" }
			} }
		};
	}
}
namespace CustomBiomeIntros
{
	[BepInPlugin("net.catcraze777.plugins.custombiomeintros", "Custom Biome Intros", "1.1.0")]
	public class CustomBiomeIntrosPlugin : BaseUnityPlugin
	{
		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		private class ProgressPointPatcher
		{
			private static bool Prefix(ProgressPoint __instance, ref string __result)
			{
				try
				{
					string[] stringArray;
					if (customTitles != null && (stringArray = customTitles[__instance.title]) != null)
					{
						__result = PickRandomString(stringArray).Trim();
						Logger.LogInfo((object)("Selected biome text \"" + __result + "\" for biome " + __instance.title + "!"));
						return false;
					}
					Logger.LogError((object)("Unknown title \"" + __instance.title + "\" received!"));
				}
				catch (Exception ex)
				{
					Logger.LogError((object)("Error in ProgressPoint localizedTitle patch: " + ex.Message));
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(DayNightManager), "DayCountString")]
		private class DayNightManagerPatcher
		{
			private static bool Prefix(DayNightManager __instance, ref string __result)
			{
				try
				{
					string text = PickRandomDayString(__instance.dayCount).Trim();
					if (text.Length > 0)
					{
						__result = text;
						__result = __result.Replace("#", ((string)typeof(DayNightManager).GetMethod("IntToNumberWord", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[1] { __instance.dayCount })) ?? "");
						Logger.LogInfo((object)$"Selected day count text \"{__result}\" for Day {__instance.dayCount}!");
						return false;
					}
				}
				catch (Exception ex)
				{
					Logger.LogError((object)("Error in DayNightManager DayCountString patch: " + ex.Message));
				}
				return true;
			}
		}

		internal static ManualLogSource Logger;

		private static Harmony _harmony;

		public static TitleStorage customTitles = DefaultStorage.defaultTitles;

		public const string PLUGIN_GUID = "net.catcraze777.plugins.custombiomeintros";

		private static Random random = new Random();

		private static ConfigEntry<string> shoreTitlesConfig;

		private static ConfigEntry<string> tropicsTitlesConfig;

		private static ConfigEntry<string> alpineTitlesConfig;

		private static ConfigEntry<string> mesaTitlesConfig;

		private static ConfigEntry<string> calderaTitlesConfig;

		private static ConfigEntry<string> kilnTitlesConfig;

		private static ConfigEntry<string> peakTitlesConfig;

		private static ConfigEntry<string> tombTitlesConfig;

		private static Dictionary<int, ConfigEntry<string>> dayCountCaptionsConfig = new Dictionary<int, ConfigEntry<string>>();

		private static string PickRandomString(string[] stringArray)
		{
			return stringArray[random.Next(stringArray.Length)];
		}

		private static string PickRandomDayString(int dayNumber)
		{
			string[] stringArray = new string[1] { "WHAT DAY IS IT" };
			int num = -1;
			foreach (int key in customTitles.dayCountCaptions.Keys)
			{
				if (key <= dayNumber && key > num)
				{
					stringArray = customTitles.dayCountCaptions[key];
					num = key;
				}
			}
			if (num <= 0)
			{
				Logger.LogError((object)$"No day caption found for day #{dayNumber}, ensure theres an entry with a day less than or equal to this one!");
				return "";
			}
			Logger.LogInfo((object)$"Using day {num} captions for day {dayNumber}...");
			return PickRandomString(stringArray);
		}

		private static string SerializeArray(string[] strArray)
		{
			return string.Join(",", strArray);
		}

		private static string[] DeserializeArray(string str)
		{
			return str.Split(',');
		}

		private void InitConfigEntries()
		{
			customTitles = DefaultStorage.defaultTitles;
			Logger.LogInfo((object)"Binding biome titles...");
			shoreTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Shore Titles", SerializeArray(customTitles.shoreTitles), "A list of phrases separated by commas (,)");
			tropicsTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Tropics Titles", SerializeArray(customTitles.tropicsTitles), "A list of phrases separated by commas (,)");
			alpineTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Alpine Titles", SerializeArray(customTitles.alpineTitles), "A list of phrases separated by commas (,)");
			mesaTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Mesa Titles", SerializeArray(customTitles.mesaTitles), "A list of phrases separated by commas (,)");
			calderaTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Caldera Titles", SerializeArray(customTitles.calderaTitles), "A list of phrases separated by commas (,)");
			kilnTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Kiln Titles", SerializeArray(customTitles.kilnTitles), "A list of phrases separated by commas (,)");
			peakTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Peak Titles", SerializeArray(customTitles.peakTitles), "A list of phrases separated by commas (,)");
			tombTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Tomb Titles", SerializeArray(customTitles.tombTitles), "A list of phrases separated by commas (,)");
			List<int> list = new List<int>();
			list.Add(1);
			if (File.Exists(((BaseUnityPlugin)this).Config.ConfigFilePath))
			{
				try
				{
					string text = null;
					foreach (string item in File.ReadLines(((BaseUnityPlugin)this).Config.ConfigFilePath))
					{
						string text2 = item.Trim();
						int num = text2.IndexOf('[') + 1;
						int num2 = text2.LastIndexOf(']');
						if (num != -1 && num2 != -1 && num < num2)
						{
							text = text2.Substring(num, num2 - num);
						}
						else
						{
							if (!(text == "Day Subtitles") || text2.Length <= 0 || text2[0] == '#')
							{
								continue;
							}
							int num3 = text2.IndexOf("=");
							if (num3 != -1)
							{
								string text3 = text2.Substring(0, num3);
								text3 = text3.Trim();
								if (text3.IndexOf("Day ") == 0 && text3 != "Day 1" && int.TryParse(text3.Substring(4), out var result))
								{
									list.Add(result);
								}
							}
						}
					}
				}
				catch (Exception ex)
				{
					Logger.LogError((object)$"An error occured trying to initialize the config entries. ${ex.GetType()} {ex.Message}\n{ex.Source}\n{ex.TargetSite}\n{ex.StackTrace}");
				}
			}
			string text4 = SerializeArray(customTitles.dayCountCaptions[1]);
			string text5 = "Binding configs for day subtitle keys ";
			foreach (int item2 in list)
			{
				text5 += $"Day {item2}, ";
				dayCountCaptionsConfig[item2] = ((BaseUnityPlugin)this).Config.Bind<string>("Day Subtitles", $"Day {item2}", text4, $"A list of phrases separated by commas (,) to show at or past day {item2}. Use '#' and it will automatically be replaced with the current day number. Copy this config entry to add phrases to different days!");
			}
			text5 = text5.Substring(0, text5.Length - 2) + "...";
			if (list.Count > 1)
			{
				text5 = text5.Substring(0, text5.LastIndexOf(",") + 1) + " and" + text5.Substring(text5.LastIndexOf(",") + 1);
			}
			Logger.LogInfo((object)text5);
		}

		private void TrySaveTitles()
		{
			shoreTitlesConfig.Value = SerializeArray(customTitles.shoreTitles);
			tropicsTitlesConfig.Value = SerializeArray(customTitles.tropicsTitles);
			alpineTitlesConfig.Value = SerializeArray(customTitles.alpineTitles);
			mesaTitlesConfig.Value = SerializeArray(customTitles.mesaTitles);
			calderaTitlesConfig.Value = SerializeArray(customTitles.calderaTitles);
			kilnTitlesConfig.Value = SerializeArray(customTitles.kilnTitles);
			peakTitlesConfig.Value = SerializeArray(customTitles.peakTitles);
			tombTitlesConfig.Value = SerializeArray(customTitles.tombTitles);
			foreach (KeyValuePair<int, string[]> dayCountCaption in customTitles.dayCountCaptions)
			{
				if (!dayCountCaptionsConfig.ContainsKey(dayCountCaption.Key))
				{
					dayCountCaptionsConfig[dayCountCaption.Key] = ((BaseUnityPlugin)this).Config.Bind<string>("Day Subtitles", $"Day {dayCountCaption.Key}", SerializeArray(DefaultStorage.defaultTitles.dayCountCaptions[1]), $"A list of phrases separated by commas (,) to show at or past day {dayCountCaption.Key}. Use '#' and it will automatically be replaced with the current day number.");
				}
				dayCountCaptionsConfig[dayCountCaption.Key].Value = SerializeArray(dayCountCaption.Value);
			}
		}

		private void TryReadTitles()
		{
			customTitles.shoreTitles = DeserializeArray(shoreTitlesConfig.Value);
			customTitles.tropicsTitles = DeserializeArray(tropicsTitlesConfig.Value);
			customTitles.alpineTitles = DeserializeArray(alpineTitlesConfig.Value);
			customTitles.mesaTitles = DeserializeArray(mesaTitlesConfig.Value);
			customTitles.calderaTitles = DeserializeArray(calderaTitlesConfig.Value);
			customTitles.kilnTitles = DeserializeArray(kilnTitlesConfig.Value);
			customTitles.peakTitles = DeserializeArray(peakTitlesConfig.Value);
			customTitles.tombTitles = DeserializeArray(tombTitlesConfig.Value);
			foreach (KeyValuePair<int, ConfigEntry<string>> item in dayCountCaptionsConfig)
			{
				customTitles.dayCountCaptions[item.Key] = DeserializeArray(item.Value.Value);
			}
		}

		private void Awake()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected O, but got Unknown
			Logger = ((BaseUnityPlugin)this).Logger;
			Logger.LogInfo((object)"Plugin net.catcraze777.plugins.custombiomeintros is reading titles...");
			_harmony = new Harmony("net.catcraze777.plugins.custombiomeintros");
			_harmony.PatchAll();
			try
			{
				InitConfigEntries();
				TryReadTitles();
				TitleStorage tempStorage = DefaultStorage.defaultTitles;
				bool changesMade = false;
				if (customTitles == null)
				{
					Logger.LogError((object)"Custom titles is null after reading, setting it to the defaults.");
					changesMade = true;
					customTitles = DefaultStorage.defaultTitles;
				}
				else
				{
					removeEmptyStrings(ref customTitles.shoreTitles);
					removeEmptyStrings(ref customTitles.tropicsTitles);
					removeEmptyStrings(ref customTitles.alpineTitles);
					removeEmptyStrings(ref customTitles.mesaTitles);
					removeEmptyStrings(ref customTitles.calderaTitles);
					removeEmptyStrings(ref customTitles.kilnTitles);
					removeEmptyStrings(ref customTitles.peakTitles);
					removeEmptyStrings(ref customTitles.tombTitles);
					if (customTitles.shoreTitles == null)
					{
						changesMade = true;
						customTitles.shoreTitles = tempStorage.shoreTitles;
						Logger.LogError((object)"Shore titles missing after reading, setting it to the defaults.");
					}
					if (customTitles.tropicsTitles == null)
					{
						changesMade = true;
						customTitles.tropicsTitles = tempStorage.tropicsTitles;
						Logger.LogError((object)"Tropics titles missing after reading, setting it to the defaults.");
					}
					if (customTitles.alpineTitles == null)
					{
						changesMade = true;
						customTitles.alpineTitles = tempStorage.alpineTitles;
						Logger.LogError((object)"Alpine titles missing after reading, setting it to the defaults.");
					}
					if (customTitles.mesaTitles == null)
					{
						changesMade = true;
						customTitles.mesaTitles = tempStorage.mesaTitles;
						Logger.LogError((object)"Mesa titles missing after reading, setting it to the defaults.");
					}
					if (customTitles.calderaTitles == null)
					{
						changesMade = true;
						customTitles.calderaTitles = tempStorage.calderaTitles;
						Logger.LogError((object)"Caldera titles missing after reading, setting it to the defaults.");
					}
					if (customTitles.kilnTitles == null)
					{
						changesMade = true;
						customTitles.kilnTitles = tempStorage.kilnTitles;
						Logger.LogError((object)"Kiln titles missing after reading, setting it to the defaults.");
					}
					if (customTitles.peakTitles == null)
					{
						changesMade = true;
						customTitles.peakTitles = tempStorage.peakTitles;
						Logger.LogError((object)"Peak titles missing after reading, setting it to the defaults.");
					}
					if (customTitles.tombTitles == null)
					{
						changesMade = true;
						customTitles.tombTitles = tempStorage.tombTitles;
						Logger.LogError((object)"Tomb titles missing after reading, setting it to the defaults.");
					}
					if (customTitles.dayCountCaptions == null)
					{
						loadDefaultDayCountCaptions();
					}
					else
					{
						Dictionary<int, List<int>> dictionary = new Dictionary<int, List<int>>();
						foreach (int key in customTitles.dayCountCaptions.Keys)
						{
							for (int i = 0; i < customTitles.dayCountCaptions[key].Length; i++)
							{
								if (customTitles.dayCountCaptions[key][i].Trim().Length <= 0)
								{
									if (!dictionary.ContainsKey(key))
									{
										dictionary[key] = new List<int>();
									}
									dictionary[key].Add(i);
								}
							}
						}
						foreach (int key2 in dictionary.Keys)
						{
							List<string> list = customTitles.dayCountCaptions[key2].ToList();
							for (int num = list.Count - 1; num >= 0; num--)
							{
								if (dictionary[key2].Contains(num))
								{
									list.RemoveAt(num);
								}
							}
							customTitles.dayCountCaptions[key2] = list.ToArray();
						}
						List<int> list2 = new List<int>();
						foreach (int key3 in customTitles.dayCountCaptions.Keys)
						{
							if (customTitles.dayCountCaptions[key3].Length == 0)
							{
								list2.Add(key3);
								changesMade = true;
								Logger.LogError((object)$"Day count captions for day {key3} is empty, getting rid of this entry.");
							}
						}
						foreach (int item in list2)
						{
							customTitles.dayCountCaptions.Remove(item);
						}
						if (customTitles.dayCountCaptions.Count <= 0)
						{
							loadDefaultDayCountCaptions();
						}
					}
				}
				if (changesMade)
				{
					TrySaveTitles();
					Logger.LogInfo((object)"Saving changes to file...");
				}
				Logger.LogInfo((object)"Plugin net.catcraze777.plugins.custombiomeintros is loaded!");
				void loadDefaultDayCountCaptions()
				{
					changesMade = true;
					customTitles.dayCountCaptions = tempStorage.dayCountCaptions;
					Logger.LogError((object)"Day Count subtitles missing after reading, setting it to the defaults.");
				}
			}
			catch (Exception ex)
			{
				Logger.LogError((object)$"An error occured trying to load the title config. ${ex.GetType()} {ex.Message}\n{ex.Source}\n{ex.TargetSite}\n{ex.StackTrace}");
			}
			static void removeEmptyStrings(ref string[] array)
			{
				if (array != null)
				{
					List<string> list3 = array.ToList();
					for (int num2 = list3.Count - 1; num2 >= 0; num2--)
					{
						list3[num2] = list3[num2].Trim();
						if (list3[num2].Length <= 0)
						{
							list3.RemoveAt(num2);
						}
					}
					array = list3.ToArray();
					if (array.Length == 0)
					{
						array = null;
					}
				}
			}
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "CustomBiomeIntros";

		public const string PLUGIN_NAME = "Custom Biome Intros";

		public const string PLUGIN_VERSION = "1.1.0";
	}
}