Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of AlwaysMist v0.1.29
AlwaysMist.dll
Decompiled 9 months agousing System; using System.Collections; 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 AlwaysMist.Behaviour; using AlwaysMist.Datas; using AlwaysMist.Extensions; using AlwaysMist.Proxy; using BepInEx; using BepInEx.Configuration; using BepInExUtils.Attributes; using BepInExUtils.Extensions; using BepInExUtils.Interfaces; using BepInExUtils.Logging; using BepInExUtils.Proxy; using HarmonyLib; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using TeamCherry.SharedUtils; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyCompany("AlwaysMist")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+d69756569b627b2d0e211a9ca559bf464726f86c")] [assembly: AssemblyProduct("AlwaysMist")] [assembly: AssemblyTitle("AlwaysMist")] [assembly: AssemblyVersion("1.0.0.0")] [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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 AlwaysMist { [BepInUtils("io.github.ykysnk.AlwaysMist", "Always Mist", "0.1.29")] [BepInDependency("io.github.ykysnk.BepinExUtils", "1.0.0")] [BepInProcess("Hollow Knight Silksong.exe")] [ConfigBind<bool>("ResetMazeSaveData", "Options", false, "Always reset maze save data when enter even if you're not dead.")] [ConfigBind<bool>("RandomNeededCorrectDoors", "Options", false, "Random the correct doors are needed when enter every single time.")] [ConfigBind<int>("MaxRandomNeededCorrectDoors", "Options", 10, "The max value of random the correct doors needed.", 2, 100)] [ConfigBind<int>("MinRandomNeededCorrectDoors", "Options", 2, "The min value of random the correct doors needed.", 2, 100)] [ConfigBind<bool>("TrueAlwaysMist", "Options", false, "Always enter the mist maze first when entering any rooms or any doors.")] [ConfigBind<bool>("RestBenchInMist", "Options", false, "Turn on the rest bench in the mist maze.")] [BepInPlugin("io.github.ykysnk.AlwaysMist", "Always Mist", "0.1.29")] public class Main : BaseUnityPlugin, IBepInUtils { private const string SectionOptions = "Options"; private const string Version = "0.1.29"; private static Main? _instance; private readonly Harmony _harmony = new Harmony("io.github.ykysnk.AlwaysMist"); private void Awake() { //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) //IL_0016: Expected O, but got Unknown GameObject val = new GameObject("AlwaysMistController"); val.AddComponent<AlwaysMistController>(); Object.DontDestroyOnLoad((Object)val); } public void Init() { } public Main() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_0047: Expected O, but got Unknown //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_0077: Expected O, but got Unknown //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Expected O, but got Unknown //IL_00af: Expected O, but got Unknown //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Expected O, but got Unknown //IL_00e6: Expected O, but got Unknown //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Expected O, but got Unknown //IL_0116: Expected O, but got Unknown //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Expected O, but got Unknown //IL_0146: Expected O, but got Unknown _instance = this; Configs._ResetMazeSaveData = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("Options", "ResetMazeSaveData"), false, new ConfigDescription("Always reset maze save data when enter even if you're not dead.", (AcceptableValueBase)null, Array.Empty<object>())); Configs._RandomNeededCorrectDoors = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("Options", "RandomNeededCorrectDoors"), false, new ConfigDescription("Random the correct doors are needed when enter every single time.", (AcceptableValueBase)null, Array.Empty<object>())); Configs._MaxRandomNeededCorrectDoors = ((BaseUnityPlugin)this).Config.Bind<int>(new ConfigDefinition("Options", "MaxRandomNeededCorrectDoors"), 10, new ConfigDescription("The max value of random the correct doors needed.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(2, 100), Array.Empty<object>())); Configs._MinRandomNeededCorrectDoors = ((BaseUnityPlugin)this).Config.Bind<int>(new ConfigDefinition("Options", "MinRandomNeededCorrectDoors"), 2, new ConfigDescription("The min value of random the correct doors needed.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(2, 100), Array.Empty<object>())); Configs._TrueAlwaysMist = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("Options", "TrueAlwaysMist"), false, new ConfigDescription("Always enter the mist maze first when entering any rooms or any doors.", (AcceptableValueBase)null, Array.Empty<object>())); Configs._RestBenchInMist = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("Options", "RestBenchInMist"), false, new ConfigDescription("Turn on the rest bench in the mist maze.", (AcceptableValueBase)null, Array.Empty<object>())); Configs.Init(); Utils.Logger.Info((object)"Plugin Always Mist is loaded, version 0.1.29"); _harmony.PatchAll(Assembly.GetExecutingAssembly()); Init(); } } public static class Utils { internal const string FolderName = "AlwaysMist"; internal const string GameName = "Hollow Knight Silksong.exe"; internal const string Guid = "io.github.ykysnk.AlwaysMist"; internal const string Name = "Always Mist"; internal const string Version = "0.1.29"; private static Logger? _logger; public static Logger Logger { get { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown object obj = _logger; if (obj == null) { Logger val = new Logger("Always Mist"); _logger = val; obj = (object)val; } return (Logger)obj; } } public static string? GetDoorDir(string doorName) { if (doorName.StartsWith("left")) { return "left"; } if (doorName.StartsWith("right")) { return "right"; } if (doorName.StartsWith("top")) { return "top"; } if (!doorName.StartsWith("bot")) { return null; } return "bot"; } public static string? GetDoorDirMatch(string doorName) { string doorDir = GetDoorDir(doorName); if (doorDir == null) { return null; } return doorDir switch { "left" => "right", "right" => "left", "top" => "bot", "bot" => "top", _ => null, }; } public static string? GetEntryDoorDir(string doorName) { string doorDir = GetDoorDir(doorName); if (doorDir == null) { return null; } return doorDir switch { "left" => "left", "right" => "right", "top" => "left", "bot" => "right", _ => null, }; } } public static class Configs { public delegate void OnResetMazeSaveDataValueChangedEvent(bool oldValue, bool newValue); public delegate void OnRandomNeededCorrectDoorsValueChangedEvent(bool oldValue, bool newValue); public delegate void OnMaxRandomNeededCorrectDoorsValueChangedEvent(int oldValue, int newValue); public delegate void OnMinRandomNeededCorrectDoorsValueChangedEvent(int oldValue, int newValue); public delegate void OnTrueAlwaysMistValueChangedEvent(bool oldValue, bool newValue); public delegate void OnRestBenchInMistValueChangedEvent(bool oldValue, bool newValue); internal static ConfigEntry<bool>? _ResetMazeSaveData; internal static ConfigEntry<bool>? _RandomNeededCorrectDoors; internal static ConfigEntry<int>? _MaxRandomNeededCorrectDoors; internal static ConfigEntry<int>? _MinRandomNeededCorrectDoors; internal static ConfigEntry<bool>? _TrueAlwaysMist; internal static ConfigEntry<bool>? _RestBenchInMist; private static bool? _oldResetMazeSaveData; private static bool? _oldRandomNeededCorrectDoors; private static int? _oldMaxRandomNeededCorrectDoors; private static int? _oldMinRandomNeededCorrectDoors; private static bool? _oldTrueAlwaysMist; private static bool? _oldRestBenchInMist; public static bool ResetMazeSaveData { get { return _ResetMazeSaveData?.Value ?? false; } set { if (_ResetMazeSaveData != null) { _ResetMazeSaveData.Value = value; } } } public static bool RandomNeededCorrectDoors { get { return _RandomNeededCorrectDoors?.Value ?? false; } set { if (_RandomNeededCorrectDoors != null) { _RandomNeededCorrectDoors.Value = value; } } } public static int MaxRandomNeededCorrectDoors { get { return _MaxRandomNeededCorrectDoors?.Value ?? 0; } set { if (_MaxRandomNeededCorrectDoors != null) { _MaxRandomNeededCorrectDoors.Value = value; } } } public static int MinRandomNeededCorrectDoors { get { return _MinRandomNeededCorrectDoors?.Value ?? 0; } set { if (_MinRandomNeededCorrectDoors != null) { _MinRandomNeededCorrectDoors.Value = value; } } } public static bool TrueAlwaysMist { get { return _TrueAlwaysMist?.Value ?? false; } set { if (_TrueAlwaysMist != null) { _TrueAlwaysMist.Value = value; } } } public static bool RestBenchInMist { get { return _RestBenchInMist?.Value ?? false; } set { if (_RestBenchInMist != null) { _RestBenchInMist.Value = value; } } } public static event OnResetMazeSaveDataValueChangedEvent? OnResetMazeSaveDataValueChanged; public static event OnRandomNeededCorrectDoorsValueChangedEvent? OnRandomNeededCorrectDoorsValueChanged; public static event OnMaxRandomNeededCorrectDoorsValueChangedEvent? OnMaxRandomNeededCorrectDoorsValueChanged; public static event OnMinRandomNeededCorrectDoorsValueChangedEvent? OnMinRandomNeededCorrectDoorsValueChanged; public static event OnTrueAlwaysMistValueChangedEvent? OnTrueAlwaysMistValueChanged; public static event OnRestBenchInMistValueChangedEvent? OnRestBenchInMistValueChanged; internal static void Init() { _oldResetMazeSaveData = _ResetMazeSaveData?.Value; ConfigEntry<bool>? resetMazeSaveData = _ResetMazeSaveData; if (resetMazeSaveData != null) { resetMazeSaveData.SettingChanged += delegate { Configs.OnResetMazeSaveDataValueChanged?.Invoke(_oldResetMazeSaveData.GetValueOrDefault(), _ResetMazeSaveData.Value); _oldResetMazeSaveData = _ResetMazeSaveData.Value; }; } _oldRandomNeededCorrectDoors = _RandomNeededCorrectDoors?.Value; ConfigEntry<bool>? randomNeededCorrectDoors = _RandomNeededCorrectDoors; if (randomNeededCorrectDoors != null) { randomNeededCorrectDoors.SettingChanged += delegate { Configs.OnRandomNeededCorrectDoorsValueChanged?.Invoke(_oldRandomNeededCorrectDoors.GetValueOrDefault(), _RandomNeededCorrectDoors.Value); _oldRandomNeededCorrectDoors = _RandomNeededCorrectDoors.Value; }; } _oldMaxRandomNeededCorrectDoors = _MaxRandomNeededCorrectDoors?.Value; ConfigEntry<int>? maxRandomNeededCorrectDoors = _MaxRandomNeededCorrectDoors; if (maxRandomNeededCorrectDoors != null) { maxRandomNeededCorrectDoors.SettingChanged += delegate { Configs.OnMaxRandomNeededCorrectDoorsValueChanged?.Invoke(_oldMaxRandomNeededCorrectDoors.GetValueOrDefault(), _MaxRandomNeededCorrectDoors.Value); _oldMaxRandomNeededCorrectDoors = _MaxRandomNeededCorrectDoors.Value; }; } _oldMinRandomNeededCorrectDoors = _MinRandomNeededCorrectDoors?.Value; ConfigEntry<int>? minRandomNeededCorrectDoors = _MinRandomNeededCorrectDoors; if (minRandomNeededCorrectDoors != null) { minRandomNeededCorrectDoors.SettingChanged += delegate { Configs.OnMinRandomNeededCorrectDoorsValueChanged?.Invoke(_oldMinRandomNeededCorrectDoors.GetValueOrDefault(), _MinRandomNeededCorrectDoors.Value); _oldMinRandomNeededCorrectDoors = _MinRandomNeededCorrectDoors.Value; }; } _oldTrueAlwaysMist = _TrueAlwaysMist?.Value; ConfigEntry<bool>? trueAlwaysMist = _TrueAlwaysMist; if (trueAlwaysMist != null) { trueAlwaysMist.SettingChanged += delegate { Configs.OnTrueAlwaysMistValueChanged?.Invoke(_oldTrueAlwaysMist.GetValueOrDefault(), _TrueAlwaysMist.Value); _oldTrueAlwaysMist = _TrueAlwaysMist.Value; }; } _oldRestBenchInMist = _RestBenchInMist?.Value; ConfigEntry<bool>? restBenchInMist = _RestBenchInMist; if (restBenchInMist != null) { restBenchInMist.SettingChanged += delegate { Configs.OnRestBenchInMistValueChanged?.Invoke(_oldRestBenchInMist.GetValueOrDefault(), _RestBenchInMist.Value); _oldRestBenchInMist = _RestBenchInMist.Value; }; } } } } namespace AlwaysMist.Proxy { [PublicAPI] public class MazeControllerEntryMatchProxy : ClassProxy { private const string ClassName = "MazeController+EntryMatch"; public string EntryScene { get { return ObjectExtensions.GetFieldValue<string>(((ClassProxy)this).Native, "EntryScene"); } set { ObjectExtensions.SetFieldValue<string>(((ClassProxy)this).Native, "EntryScene", value); } } public string EntryDoorDir { get { return ObjectExtensions.GetFieldValue<string>(((ClassProxy)this).Native, "EntryDoorDir"); } set { ObjectExtensions.SetFieldValue<string>(((ClassProxy)this).Native, "EntryDoorDir", value); } } public string ExitDoorDir { get { return ObjectExtensions.GetFieldValue<string>(((ClassProxy)this).Native, "ExitDoorDir"); } set { ObjectExtensions.SetFieldValue<string>(((ClassProxy)this).Native, "ExitDoorDir", value); } } public MinMaxFloat FogRotationRange { get { //IL_000b: Unknown result type (might be due to invalid IL or missing references) return ObjectExtensions.GetFieldValue<MinMaxFloat>(((ClassProxy)this).Native, "FogRotationRange"); } set { //IL_000b: Unknown result type (might be due to invalid IL or missing references) ObjectExtensions.SetFieldValue<MinMaxFloat>(((ClassProxy)this).Native, "FogRotationRange", value); } } public MazeControllerEntryMatchProxy() : base("MazeController+EntryMatch") { } public MazeControllerEntryMatchProxy(object obj) : base(obj, "MazeController+EntryMatch") { } } } namespace AlwaysMist.Patches { [HarmonyPatch(typeof(DesktopPlatform))] internal class DesktopPlatformPatches { private const string SaveFileName = "saveData{0}.json"; private const string SaveFileBackupName = "saveData{0}.json.bak"; private const string SaveFileNewName = "saveData{0}.json.new"; [HarmonyPatch("WriteSaveSlot")] [HarmonyPostfix] private static void WriteSaveSlot(DesktopPlatform __instance, int slotIndex, byte[] bytes, Action<bool> callback) { Utils.Logger.Debug((object)$"DesktopPlatform.WriteSaveSlot: {slotIndex}"); AlwaysMistController instance = AlwaysMistController.Instance; if (!Object.op_Implicit((Object)(object)instance) || !instance.SaveDatas.TryGetValue(slotIndex, out AlwaysMistData data)) { return; } string savePath = __instance.GetSavePath(); string filePath = Path.Combine(savePath, $"saveData{slotIndex}.json"); string newFilePath = Path.Combine(savePath, $"saveData{slotIndex}.json.new"); string backupFilePath = Path.Combine(savePath, $"saveData{slotIndex}.json.bak"); CoreLoop.InvokeNext((Action)delegate { SaveDataUtility.SerializeToJsonAsync<AlwaysMistData>(data, (Action<bool, string>)delegate(bool success, string result) { if (!success) { return; } try { File.WriteAllText(newFilePath, result); } catch (Exception ex) { Utils.Logger.Error((object)ex); } try { if (File.Exists(filePath)) { File.Replace(newFilePath, filePath, backupFilePath); } else { File.Move(newFilePath, filePath); } } catch (Exception ex2) { Utils.Logger.Error((object)ex2); } }); }); } [HarmonyPatch("ReadSaveSlot")] [HarmonyPostfix] private static void ReadSaveSlot(DesktopPlatform __instance, int slotIndex, Action<byte[]> callback) { Utils.Logger.Debug((object)$"DesktopPlatform.ReadSaveSlot: {slotIndex}"); AlwaysMistController controller = AlwaysMistController.Instance; if (!Object.op_Implicit((Object)(object)controller)) { return; } string path = Path.Combine(__instance.GetSavePath(), $"saveData{slotIndex}.json"); string saveJson = ""; try { if (File.Exists(path)) { saveJson = File.ReadAllText(path); } } catch (Exception ex) { Utils.Logger.Error((object)ex); } if (!string.IsNullOrEmpty(saveJson)) { CoreLoop.InvokeSafe((Action)delegate { controller.SaveDatas[slotIndex] = SaveDataUtility.DeserializeSaveData<AlwaysMistData>(saveJson); }); } } } [HarmonyPatch(typeof(MazeController))] internal class MazeControllerPatches { [HarmonyPatch("Activate")] [HarmonyPrefix] private static void Activate(MazeController __instance) { MazeController __instance2 = __instance; if (MazeControllerExtensions.get_isActive(__instance2)) { return; } AlwaysMistController instance = AlwaysMistController.Instance; if (!Object.op_Implicit((Object)(object)instance)) { return; } if (Configs.RandomNeededCorrectDoors || Configs.TrueAlwaysMist) { if (instance.LastRandomValue < 0) { instance.LastRandomValue = Random.Range(Configs.MinRandomNeededCorrectDoors, Configs.MaxRandomNeededCorrectDoors); } MazeControllerExtensions.set_neededCorrectDoors(__instance2, instance.LastRandomValue); MazeControllerExtensions.set_restScenePoint(__instance2, (int)Math.Round((float)instance.LastRandomValue / 2f)); } if (instance.CurrentSceneName == "Dust_Maze_Last_Hall" && !string.IsNullOrEmpty(instance.TargetSceneName)) { MazeControllerExtensions.set_exitSceneName(__instance2, instance.TargetSceneName); } if (!(instance.CurrentSceneName != "Dust_Maze_09_entrance") && Configs.TrueAlwaysMist && !string.IsNullOrEmpty(instance.TargetEntryDoorDir) && !(instance.TargetEntryDoorDir == "left")) { TransitionPoint val = ((IEnumerable<TransitionPoint>)TransitionPoint.TransitionPoints).FirstOrDefault((Func<TransitionPoint, bool>)((TransitionPoint door) => ((Component)door).gameObject.scene == ((Component)__instance2).gameObject.scene && ((Object)((Component)door).gameObject).name == "right1")); if (Object.op_Implicit((Object)(object)val)) { PlayerData instance2 = PlayerData.instance; Utils.Logger.Debug((object)("playerData.PreviousMazeTargetDoor: " + instance2.PreviousMazeTargetDoor)); MazeControllerExtensions.get_entryDoors(__instance2).Clear(); MazeControllerExtensions.get_entryDoors(__instance2).Add(val); } } } [HarmonyPatch("GetExitMatch")] [HarmonyPrefix] private static bool GetExitMatch(MazeController __instance, ref object __result) { //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: 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_00e5: Unknown result type (might be due to invalid IL or missing references) AlwaysMistController instance = AlwaysMistController.Instance; if (!Object.op_Implicit((Object)(object)instance)) { return true; } if (!Configs.TrueAlwaysMist) { return true; } if (string.IsNullOrEmpty(instance.TargetSceneName)) { return true; } if (!instance.IsEnteredMaze) { return true; } Utils.Logger.Debug((object)"Create Entry Match"); MazeControllerEntryMatchProxy mazeControllerEntryMatchProxy = new MazeControllerEntryMatchProxy(); mazeControllerEntryMatchProxy.EntryScene = instance.EnterSceneName; mazeControllerEntryMatchProxy.EntryDoorDir = instance.TargetEntryDoorDir; mazeControllerEntryMatchProxy.ExitDoorDir = ((instance.CurrentSceneName == "Dust_Maze_Last_Hall") ? instance.TargetExitDoorName : instance.TargetExitDoorDir); MazeControllerEntryMatchProxy mazeControllerEntryMatchProxy2 = mazeControllerEntryMatchProxy; string targetEntryDoorDir = instance.TargetEntryDoorDir; MinMaxFloat fogRotationRange = ((targetEntryDoorDir == "left") ? new MinMaxFloat(0f, 0f) : ((!(targetEntryDoorDir == "right")) ? new MinMaxFloat(0f, 0f) : new MinMaxFloat(0f, 3.1416f))); mazeControllerEntryMatchProxy2.FogRotationRange = fogRotationRange; object native = ((ClassProxy)mazeControllerEntryMatchProxy).Native; Utils.Logger.Debug((object)$"Create Entry Match is {native}"); __result = native; return false; } [HarmonyPatch("SubscribeDoorEntered")] [HarmonyPrefix] private static bool SubscribeDoorEntered(MazeController __instance, TransitionPoint door) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown TransitionPoint door2 = door; MazeController __instance2 = __instance; AlwaysMistController controller = AlwaysMistController.Instance; if (!Object.op_Implicit((Object)(object)controller)) { return true; } if (!Configs.TrueAlwaysMist) { return true; } door2.OnBeforeTransition += (BeforeTransitionEvent)delegate { //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) PlayerData instance = PlayerData.instance; string name = ((Object)door2).name; if (!MazeControllerExtensions.get_isCapScene(__instance2)) { if (door2.targetScene == MazeControllerExtensions.get_restSceneName(__instance2)) { instance.EnteredMazeRestScene = true; instance.CorrectMazeDoorsEntered = MazeControllerExtensions.get_neededCorrectDoors(__instance2) - MazeControllerExtensions.get_restScenePoint(__instance2); instance.IncorrectMazeDoorsEntered = 0; } else if (instance.PreviousMazeTargetDoor != name) { if (MazeControllerExtensions.get_correctDoors(__instance2).Contains(door2)) { instance.CorrectMazeDoorsEntered++; instance.IncorrectMazeDoorsEntered = 0; } else { instance.CorrectMazeDoorsEntered = 0; instance.IncorrectMazeDoorsEntered++; instance.EnteredMazeRestScene = false; bool flag = string.IsNullOrEmpty(controller.TargetEntryDoorDir) || controller.TargetEntryDoorDir == "left"; if (instance.IncorrectMazeDoorsEntered >= MazeControllerExtensions.get_allowedIncorrectDoors(__instance2) && name.StartsWith(flag ? "right" : "left")) { door2.SetTargetScene("Dust_Maze_09_entrance"); door2.entryPoint = (flag ? "left1" : "right1"); } } } } instance.PreviousMazeTargetDoor = door2.entryPoint; Scene scene = ((Component)door2).gameObject.scene; instance.PreviousMazeScene = ((Scene)(ref scene)).name; instance.PreviousMazeDoor = name; }; return false; } } [HarmonyPatch(typeof(TransitionPoint))] internal static class TransitionPointPatches { [HarmonyPatch("DoSceneTransition")] [HarmonyPrefix] private static void DoSceneTransition(TransitionPoint __instance, bool doFade) { if (Configs.TrueAlwaysMist) { AlwaysMistController instance = AlwaysMistController.Instance; if (Object.op_Implicit((Object)(object)instance) && instance.IsOutsideMaze && instance.ChangedTransitionPoint.TryGetValue(__instance, out string value)) { instance.TargetSceneName = value; instance.TargetEntryDoorDir = Utils.GetEntryDoorDir(((Object)__instance).name) ?? Utils.GetDoorDirMatch(__instance.entryPoint) ?? "left"; instance.TargetExitDoorDir = Utils.GetDoorDir(__instance.entryPoint) ?? "right"; instance.TargetExitDoorName = __instance.entryPoint; instance.EnterDoorName = ((Object)__instance).name; Utils.Logger.Debug((object)("controller.TargetSceneName: " + instance.TargetSceneName)); Utils.Logger.Debug((object)("controller.TargetEntryDoorDir: " + instance.TargetEntryDoorDir)); Utils.Logger.Debug((object)("controller.TargetExitDoorDir: " + instance.TargetExitDoorDir)); Utils.Logger.Debug((object)("controller.TargetExitDoorName: " + instance.TargetExitDoorName)); Utils.Logger.Debug((object)("controller.EnterDoorName: " + instance.EnterDoorName)); string targetEntryDoorDir = instance.TargetEntryDoorDir; string targetDoor = ((targetEntryDoorDir == "left") ? "right1" : ((!(targetEntryDoorDir == "right")) ? "right1" : "left1")); __instance.SetTargetDoor(targetDoor); } } } } } namespace AlwaysMist.Extensions { [AccessExtensions] [AccessInstance<DesktopPlatform>] [AccessField<string>("saveDirPath")] public static class DesktopPlatformExtensions { public sealed class <>E__0 { public string GetSavePath() { throw null; } } public sealed class <>E__1 { public string saveDirPath { get { throw null; } set { throw null; } } } [SpecialName] public static string GetSavePath(this DesktopPlatform instance) { string text = Path.Combine(get_saveDirPath(instance), "AlwaysMist"); if (!Directory.Exists(text)) { Directory.CreateDirectory(text); } return text; } [SpecialName] public static string get_saveDirPath(DesktopPlatform instance) { return ObjectExtensions.GetFieldValue<string>((object)instance, "saveDirPath"); } [SpecialName] public static void set_saveDirPath(DesktopPlatform instance, string value) { ObjectExtensions.SetFieldValue<string>((object)instance, "saveDirPath", value); } } [AccessExtensions] [AccessInstance<MazeController>] [AccessField<bool>("isCapScene")] [AccessField<List<TransitionPoint>>("entryDoors")] [AccessField<string[]>("sceneNames")] [AccessField<int>("neededCorrectDoors")] [AccessField<int>("allowedIncorrectDoors")] [AccessField<int>("restScenePoint")] [AccessField<string>("restSceneName")] [AccessField<string>("exitSceneName")] [AccessField<object[]>("entryMatchExit")] [AccessField<bool>("isActive")] [AccessField<List<TransitionPoint>>("correctDoors")] [PublicAPI] public static class MazeControllerExtensions { public sealed class <>E__0 { public bool isCapScene { get { throw null; } set { throw null; } } public List<TransitionPoint> entryDoors { get { throw null; } set { throw null; } } public string[] sceneNames { get { throw null; } set { throw null; } } public int neededCorrectDoors { get { throw null; } set { throw null; } } public int allowedIncorrectDoors { get { throw null; } set { throw null; } } public int restScenePoint { get { throw null; } set { throw null; } } public string restSceneName { get { throw null; } set { throw null; } } public string exitSceneName { get { throw null; } set { throw null; } } public object[] entryMatchExit { get { throw null; } set { throw null; } } public bool isActive { get { throw null; } set { throw null; } } public List<TransitionPoint> correctDoors { get { throw null; } set { throw null; } } } [SpecialName] public static bool get_isCapScene(MazeController instance) { return ObjectExtensions.GetFieldValue<bool>((object)instance, "isCapScene"); } [SpecialName] public static void set_isCapScene(MazeController instance, bool value) { ObjectExtensions.SetFieldValue<bool>((object)instance, "isCapScene", value); } [SpecialName] public static List<TransitionPoint> get_entryDoors(MazeController instance) { return ObjectExtensions.GetFieldValue<List<TransitionPoint>>((object)instance, "entryDoors"); } [SpecialName] public static void set_entryDoors(MazeController instance, List<TransitionPoint> value) { ObjectExtensions.SetFieldValue<List<TransitionPoint>>((object)instance, "entryDoors", value); } [SpecialName] public static string[] get_sceneNames(MazeController instance) { return ObjectExtensions.GetFieldValue<string[]>((object)instance, "sceneNames"); } [SpecialName] public static void set_sceneNames(MazeController instance, string[] value) { ObjectExtensions.SetFieldValue<string[]>((object)instance, "sceneNames", value); } [SpecialName] public static int get_neededCorrectDoors(MazeController instance) { return ObjectExtensions.GetFieldValue<int>((object)instance, "neededCorrectDoors"); } [SpecialName] public static void set_neededCorrectDoors(MazeController instance, int value) { ObjectExtensions.SetFieldValue<int>((object)instance, "neededCorrectDoors", value); } [SpecialName] public static int get_allowedIncorrectDoors(MazeController instance) { return ObjectExtensions.GetFieldValue<int>((object)instance, "allowedIncorrectDoors"); } [SpecialName] public static void set_allowedIncorrectDoors(MazeController instance, int value) { ObjectExtensions.SetFieldValue<int>((object)instance, "allowedIncorrectDoors", value); } [SpecialName] public static int get_restScenePoint(MazeController instance) { return ObjectExtensions.GetFieldValue<int>((object)instance, "restScenePoint"); } [SpecialName] public static void set_restScenePoint(MazeController instance, int value) { ObjectExtensions.SetFieldValue<int>((object)instance, "restScenePoint", value); } [SpecialName] public static string get_restSceneName(MazeController instance) { return ObjectExtensions.GetFieldValue<string>((object)instance, "restSceneName"); } [SpecialName] public static void set_restSceneName(MazeController instance, string value) { ObjectExtensions.SetFieldValue<string>((object)instance, "restSceneName", value); } [SpecialName] public static string get_exitSceneName(MazeController instance) { return ObjectExtensions.GetFieldValue<string>((object)instance, "exitSceneName"); } [SpecialName] public static void set_exitSceneName(MazeController instance, string value) { ObjectExtensions.SetFieldValue<string>((object)instance, "exitSceneName", value); } [SpecialName] public static object[] get_entryMatchExit(MazeController instance) { return ObjectExtensions.GetFieldValue<object[]>((object)instance, "entryMatchExit"); } [SpecialName] public static void set_entryMatchExit(MazeController instance, object[] value) { ObjectExtensions.SetFieldValue<object[]>((object)instance, "entryMatchExit", value); } [SpecialName] public static bool get_isActive(MazeController instance) { return ObjectExtensions.GetFieldValue<bool>((object)instance, "isActive"); } [SpecialName] public static void set_isActive(MazeController instance, bool value) { ObjectExtensions.SetFieldValue<bool>((object)instance, "isActive", value); } [SpecialName] public static List<TransitionPoint> get_correctDoors(MazeController instance) { return ObjectExtensions.GetFieldValue<List<TransitionPoint>>((object)instance, "correctDoors"); } [SpecialName] public static void set_correctDoors(MazeController instance, List<TransitionPoint> value) { ObjectExtensions.SetFieldValue<List<TransitionPoint>>((object)instance, "correctDoors", value); } } } namespace AlwaysMist.Datas { [Serializable] [JsonObject] public class AlwaysMistData { public string TargetSceneName = ""; public string TargetEntryDoorDir = ""; public string TargetExitDoorDir = ""; public string TargetExitDoorName = ""; public string EnterSceneName = ""; public string EnterDoorName = ""; public bool IsEnteredMaze; public int LastRandomValue = -1; } } namespace AlwaysMist.Behaviour { public class AlwaysMistController : MonoBehaviour { [CompilerGenerated] private sealed class <OnSceneLoadedDelay>d__49 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public AlwaysMistController <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <OnSceneLoadedDelay>d__49(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown int num = <>1__state; AlwaysMistController alwaysMistController = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(0.1f); <>1__state = 1; return true; case 1: <>1__state = -1; alwaysMistController.EnterMazeHandle(); if (Configs.TrueAlwaysMist) { if (alwaysMistController.IsOutsideMaze) { alwaysMistController.EnterSceneName = alwaysMistController.CurrentSceneName; alwaysMistController.ChangeAllTransitionScene(); } else { string currentSceneName = alwaysMistController.CurrentSceneName; if (!(currentSceneName == "Dust_Maze_09_entrance")) { if (currentSceneName == "Dust_Maze_Last_Hall") { Utils.Logger.Debug((object)("TargetSceneName: " + alwaysMistController.TargetSceneName)); Utils.Logger.Debug((object)("TargetExitDoorDir: " + alwaysMistController.TargetExitDoorDir)); if (!string.IsNullOrEmpty(alwaysMistController.TargetSceneName)) { alwaysMistController.FixExitTransition(); } } } else { Utils.Logger.Debug((object)("EnterSceneName: " + alwaysMistController.EnterSceneName)); Utils.Logger.Debug((object)("EnterDoorName: " + alwaysMistController.EnterDoorName)); string targetEntryDoorDir = alwaysMistController.TargetEntryDoorDir; if (!(targetEntryDoorDir == "left")) { if (targetEntryDoorDir == "right") { alwaysMistController.ChangeTransitionScene("left1", alwaysMistController.EnterSceneName, alwaysMistController.EnterDoorName); } } else { alwaysMistController.ChangeTransitionScene("right1", alwaysMistController.EnterSceneName, alwaysMistController.EnterDoorName); } } } } else { string currentSceneName = alwaysMistController.CurrentSceneName; if ((currentSceneName == "Shadow_04" || currentSceneName == "Dust_05") ? true : false) { alwaysMistController.EnterSceneName = alwaysMistController.CurrentSceneName; alwaysMistController.ChangeTransitionScene("left1"); } } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private const string ChangeScene = "Shadow_04"; private const string ChangeScene2 = "Dust_05"; public const string LeftTransitionPoint = "left1"; public const string RightTransitionPoint = "right1"; internal const string MazeEntranceSceneName = "Dust_Maze_09_entrance"; internal const string MazeExitSceneName = "Dust_Maze_Last_Hall"; private const string MazeRestSceneName = "Dust_Maze_crossing"; private static readonly string[] SceneNames = new string[8] { "Dust_Maze_01", "Dust_Maze_02", "Dust_Maze_03", "Dust_Maze_04", "Dust_Maze_05", "Dust_Maze_06", "Dust_Maze_07", "Dust_Maze_08" }; public readonly Dictionary<TransitionPoint, string> ChangedTransitionPoint = new Dictionary<TransitionPoint, string>(); public readonly Dictionary<int, AlwaysMistData> SaveDatas = new Dictionary<int, AlwaysMistData>(); private Scene _currentScene; public static AlwaysMistController? Instance { get; private set; } public string CurrentSceneName { get; private set; } = ""; public string TargetSceneName { get { GetSaveData(out AlwaysMistData data); return data.TargetSceneName; } set { GetSaveData(out AlwaysMistData data); data.TargetSceneName = value; } } public string TargetEntryDoorDir { get { GetSaveData(out AlwaysMistData data); return data.TargetEntryDoorDir; } set { GetSaveData(out AlwaysMistData data); data.TargetEntryDoorDir = value; } } public string TargetExitDoorDir { get { GetSaveData(out AlwaysMistData data); return data.TargetExitDoorDir; } set { GetSaveData(out AlwaysMistData data); data.TargetExitDoorDir = value; } } public string TargetExitDoorName { get { GetSaveData(out AlwaysMistData data); return data.TargetExitDoorName; } set { GetSaveData(out AlwaysMistData data); data.TargetExitDoorName = value; } } public string EnterSceneName { get { GetSaveData(out AlwaysMistData data); return data.EnterSceneName; } set { GetSaveData(out AlwaysMistData data); data.EnterSceneName = value; } } public string EnterDoorName { get { GetSaveData(out AlwaysMistData data); return data.EnterDoorName; } set { GetSaveData(out AlwaysMistData data); data.EnterDoorName = value; } } public bool IsEnteredMaze { get { GetSaveData(out AlwaysMistData data); return data.IsEnteredMaze; } set { GetSaveData(out AlwaysMistData data); data.IsEnteredMaze = value; } } public bool IsOutsideMaze { get { if (!IsEnteredMaze && CurrentSceneName != "Dust_Maze_Last_Hall" && CurrentSceneName != "Dust_Maze_crossing") { return !SceneNames.Contains(CurrentSceneName); } return false; } } public int LastRandomValue { get { GetSaveData(out AlwaysMistData data); return data.LastRandomValue; } set { GetSaveData(out AlwaysMistData data); data.LastRandomValue = value; } } private void Awake() { Instance = this; SceneManager.sceneLoaded += OnSceneLoaded; } private void OnDestroy() { SceneManager.sceneLoaded -= OnSceneLoaded; } public void GetSaveData(out AlwaysMistData data) { GameManager instance = GameManager.instance; if (!Object.op_Implicit((Object)(object)instance)) { data = new AlwaysMistData(); return; } if (!SaveDatas.ContainsKey(instance.profileID)) { SaveDatas.Add(instance.profileID, new AlwaysMistData()); } data = SaveDatas[instance.profileID]; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) Utils.Logger.Debug((object)("OnSceneLoaded: " + ((Scene)(ref scene)).name)); CurrentSceneName = ((Scene)(ref scene)).name; _currentScene = scene; TurnOnRestBench(); ((MonoBehaviour)this).StartCoroutine(OnSceneLoadedDelay()); } [IteratorStateMachine(typeof(<OnSceneLoadedDelay>d__49))] private IEnumerator OnSceneLoadedDelay() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <OnSceneLoadedDelay>d__49(0) { <>4__this = this }; } private void TurnOnRestBench() { if (CurrentSceneName != "Dust_Maze_09_entrance" || (!Configs.RestBenchInMist && !Configs.TrueAlwaysMist)) { return; } RestBench[] array = Object.FindObjectsByType<RestBench>((FindObjectsInactive)1, (FindObjectsSortMode)0); Utils.Logger.Debug((object)$"Find RestBenchs: {array}"); RestBench[] array2 = array; for (int i = 0; i < array2.Length; i++) { GameObject gameObject = ((Component)array2[i]).gameObject; if (!(gameObject.tag != "RespawnPoint")) { Utils.Logger.Debug((object)$"Got RestBench: {gameObject}"); if (Object.op_Implicit((Object)(object)gameObject) && !gameObject.activeSelf) { gameObject.SetActive(true); } } } } private void EnterMazeHandle() { if (CurrentSceneName == "Dust_Maze_09_entrance") { IsEnteredMaze = true; } else if (IsEnteredMaze && !SceneNames.Contains(CurrentSceneName) && !(CurrentSceneName == "Dust_Maze_09_entrance") && !(CurrentSceneName == "Dust_Maze_Last_Hall") && !(CurrentSceneName == "Dust_Maze_crossing")) { IsEnteredMaze = false; LastRandomValue = -1; TargetSceneName = ""; TargetEntryDoorDir = ""; TargetExitDoorDir = ""; } } private void ChangeTransitionScene(string doorName, string changeScene = "Dust_Maze_09_entrance", string? exitDoorName = null) { string doorName2 = doorName; TransitionPoint val = ((IEnumerable<TransitionPoint>)TransitionPoint.TransitionPoints).FirstOrDefault((Func<TransitionPoint, bool>)((TransitionPoint door) => ((Component)door).gameObject.scene == _currentScene && ((Object)((Component)door).gameObject).name == doorName2)); if (Object.op_Implicit((Object)(object)val)) { string targetScene = val.targetScene; Utils.Logger.Info((object)("Target Scene: " + targetScene)); if (targetScene != changeScene) { Utils.Logger.Info((object)("Change target scene to: " + changeScene)); val.SetTargetScene(changeScene); } if (!string.IsNullOrEmpty(exitDoorName) && val.entryPoint != exitDoorName) { val.SetTargetDoor(exitDoorName); } if (Configs.ResetMazeSaveData || Configs.TrueAlwaysMist) { MazeController.ResetSaveData(); } } } private void FixExitTransition() { TransitionPoint val = ((IEnumerable<TransitionPoint>)TransitionPoint.TransitionPoints).FirstOrDefault((Func<TransitionPoint, bool>)((TransitionPoint door) => ((Component)door).gameObject.scene == _currentScene && door.targetScene == TargetSceneName)); if (Object.op_Implicit((Object)(object)val)) { val.SetTargetDoor(TargetExitDoorName); } } private void ChangeAllTransitionScene() { List<TransitionPoint> list = TransitionPoint.TransitionPoints.Where((TransitionPoint door) => ((Component)door).gameObject.scene == _currentScene).ToList(); if (list.Count < 1) { return; } foreach (TransitionPoint item in list) { string targetScene = item.targetScene; Utils.Logger.Info((object)("Target Scene: " + targetScene)); if ((!(targetScene == "Dust_Maze_09_entrance") && !(targetScene == "Dust_Maze_Last_Hall")) || 1 == 0) { Utils.Logger.Info((object)"Change target scene to: Dust_Maze_09_entrance"); item.SetTargetScene("Dust_Maze_09_entrance"); if (!ChangedTransitionPoint.ContainsKey(item)) { ChangedTransitionPoint.Add(item, targetScene); } } } if (Configs.ResetMazeSaveData || Configs.TrueAlwaysMist) { MazeController.ResetSaveData(); } } } }