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.1.0")]
[assembly: AssemblyInformationalVersion("1.1.1")]
[assembly: AssemblyProduct("Custom Biome Intros")]
[assembly: AssemblyTitle("CustomBiomeIntros")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.1.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[] rootsTitles;
public string[] alpineTitles;
public string[] mesaTitles;
public string[] calderaTitles;
public string[] kilnTitles;
public string[] peakTitles;
public string[] tombTitles;
public Dictionary<int, string[]> dayCountCaptions;
public static string[] biomes => new string[9] { "SHORE", "TROPICS", "ROOTS", "ALPINE", "MESA", "CALDERA", "THE KILN", "PEAK", "TOMB" };
public string[] this[string key] => key switch
{
"SHORE" => shoreTitles,
"TROPICS" => tropicsTitles,
"ROOTS" => rootsTitles,
"ALPINE" => alpineTitles,
"MESA" => mesaTitles,
"CALDERA" => calderaTitles,
"THE KILN" => kilnTitles,
"PEAK" => peakTitles,
"TOMB" => tombTitles,
_ => null,
};
}
public class DefaultStorage : TitleStorage
{
public static TitleStorage defaultTitles
{
get
{
TitleStorage titleStorage = new TitleStorage();
titleStorage.shoreTitles = new string[1] { "SHORE" };
titleStorage.tropicsTitles = new string[1] { "TROPICS" };
titleStorage.rootsTitles = new string[1] { "ROOTS" };
titleStorage.alpineTitles = new string[1] { "ALPINE" };
titleStorage.mesaTitles = new string[1] { "MESA" };
titleStorage.calderaTitles = new string[1] { "CALDERA" };
titleStorage.kilnTitles = new string[1] { "THE KILN" };
titleStorage.peakTitles = new string[1] { "PEAK" };
titleStorage.tombTitles = new string[1] { "TOMB" };
titleStorage.dayCountCaptions = new Dictionary<int, string[]> {
{
1,
new string[1] { "DAY #" }
} };
return titleStorage;
}
}
}
}
namespace CustomBiomeIntros
{
[BepInPlugin("net.catcraze777.plugins.custombiomeintros", "Custom Biome Intros", "1.1.1")]
public class CustomBiomeIntrosPlugin : BaseUnityPlugin
{
[HarmonyPatch(/*Could not decode attribute arguments.*/)]
private class ProgressPointPatcher
{
private static void Postfix(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 + "!"));
}
else
{
Logger.LogError((object)("Unknown title \"" + __instance.title + "\" received!"));
}
}
catch (Exception ex)
{
Logger.LogError((object)("Error in ProgressPoint localizedTitle patch: " + ex.Message));
}
}
}
[HarmonyPatch(typeof(DayNightManager), "DayCountString")]
private class DayNightManagerPatcher
{
private static void Postfix(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}!");
}
}
catch (Exception ex)
{
Logger.LogError((object)("Error in DayNightManager DayCountString patch: " + ex.Message));
}
}
}
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> rootsTitlesConfig;
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 (,)");
rootsTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Roots Titles", SerializeArray(customTitles.rootsTitles), "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);
rootsTitlesConfig.Value = SerializeArray(customTitles.rootsTitles);
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.rootsTitles = DeserializeArray(rootsTitlesConfig.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.rootsTitles);
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.rootsTitles == null)
{
changesMade = true;
customTitles.rootsTitles = tempStorage.rootsTitles;
Logger.LogError((object)"Roots 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.1";
}
}