diff --git a/CheatEnabler/Patches/Factory/BeltSignalPatch.cs b/CheatEnabler/Patches/Factory/BeltSignalPatch.cs index d4f804a..a5a6b9e 100644 --- a/CheatEnabler/Patches/Factory/BeltSignalPatch.cs +++ b/CheatEnabler/Patches/Factory/BeltSignalPatch.cs @@ -4,11 +4,13 @@ using System.Linq; using HarmonyLib; using UnityEngine; using UXAssist.Common; +using UXAssist.Common.ModFeatures; using GameLogicProc = UXAssist.Common.GameLogic; using UXAssist.Common.GameConstants; namespace CheatEnabler.Patches.Factory; +[ModFeature("BeltSignalGenerator")] internal class BeltSignalGenerator : PatchImpl { private static Dictionary[] _signalBelts; @@ -17,6 +19,25 @@ internal class BeltSignalGenerator : PatchImpl private static int _signalBeltsCapacity; private static bool _initialized; + public static void Init() + { + GameLogicProc.OnGameEnd += ResetState; + } + + public static void Uninit() + { + GameLogicProc.OnGameEnd -= ResetState; + } + + private static void ResetState() + { + _initialized = false; + _signalBelts = null; + _portalFrom = null; + _portalTo = null; + _signalBeltsCapacity = 0; + } + private class BeltSignal { public int SignalId; diff --git a/CheatEnabler/Patches/GamePatch.cs b/CheatEnabler/Patches/GamePatch.cs index 9ab8f0c..65b9452 100644 --- a/CheatEnabler/Patches/GamePatch.cs +++ b/CheatEnabler/Patches/GamePatch.cs @@ -6,6 +6,7 @@ using HarmonyLib; using UnityEngine.Bindings; using UXAssist.Common; using UXAssist.Common.ModFeatures; +using GameLogicProc = UXAssist.Common.GameLogic; namespace CheatEnabler.Patches; @@ -21,6 +22,7 @@ public static class GamePatch DevShortcutsEnabled.SettingChanged += (_, _) => DevShortcuts.Enable(DevShortcutsEnabled.Value); AbnormalDisablerEnabled.SettingChanged += (_, _) => AbnormalDisabler.Enable(AbnormalDisablerEnabled.Value); UnlockTechEnabled.SettingChanged += (_, _) => UnlockTech.Enable(UnlockTechEnabled.Value); + GameLogicProc.OnGameEnd += ResetState; } public static void Start() @@ -32,11 +34,18 @@ public static class GamePatch public static void Uninit() { + GameLogicProc.OnGameEnd -= ResetState; UnlockTech.Enable(false); AbnormalDisabler.Enable(false); DevShortcuts.Enable(false); } + private static void ResetState() + { + AbnormalDisabler.ResetState(); + DevShortcuts.ResetState(); + } + public class AbnormalDisabler : PatchImpl { private static Dictionary _savedDeterminators; @@ -66,6 +75,11 @@ public static class GamePatch } } + internal static void ResetState() + { + _savedDeterminators = null; + } + [HarmonyPrefix] [HarmonyPatch(typeof(AbnormalityLogic), nameof(AbnormalityLogic.NotifyBeforeGameSave))] [HarmonyPatch(typeof(AbnormalityLogic), nameof(AbnormalityLogic.NotifyOnAssemblerRecipePick))] @@ -106,6 +120,11 @@ public static class GamePatch if (_test != null) _test.active = false; } + internal static void ResetState() + { + _test = null; + } + [HarmonyPostfix] [HarmonyPatch(typeof(PlayerController), nameof(PlayerController.Init))] private static void PlayerController_Init_Postfix(PlayerController __instance) diff --git a/UXAssist/Functions/UI/MilkyWayUI.cs b/UXAssist/Functions/UI/MilkyWayUI.cs index 9c4e309..c183e2b 100644 --- a/UXAssist/Functions/UI/MilkyWayUI.cs +++ b/UXAssist/Functions/UI/MilkyWayUI.cs @@ -5,6 +5,7 @@ using UnityEngine; using UnityEngine.UI; using UXAssist.Common; using UXAssist.UI; +using GameLogicProc = UXAssist.Common.GameLogic; namespace UXAssist.Functions.UI; @@ -31,7 +32,8 @@ internal static class MilkyWayUI public static void Init() { - } + GameLogicProc.OnGameEnd += ResetState; + } public static void Start() { @@ -39,6 +41,13 @@ internal static class MilkyWayUI public static void Uninit() { + GameLogicProc.OnGameEnd -= ResetState; + } + + private static void ResetState() + { + ClearClusterUploadResults(); + _topTenPlayerData = null; } public static void OnInputUpdate() diff --git a/UXAssist/Patches/DysonSpherePatch.cs b/UXAssist/Patches/DysonSpherePatch.cs index d7d3179..58ea54f 100644 --- a/UXAssist/Patches/DysonSpherePatch.cs +++ b/UXAssist/Patches/DysonSpherePatch.cs @@ -25,6 +25,7 @@ public class DysonSpherePatch : PatchImpl _totalNodeSpInfo = AccessTools.Field(typeof(DysonSphereLayer), "totalNodeSP"); _totalFrameSpInfo = AccessTools.Field(typeof(DysonSphereLayer), "totalFrameSP"); _totalCpInfo = AccessTools.Field(typeof(DysonSphereLayer), "totalCP"); + GameLogicProc.OnGameEnd += StopEjectOnNodeComplete.ResetState; } public static void Start() @@ -35,6 +36,7 @@ public class DysonSpherePatch : PatchImpl public static void Uninit() { + GameLogicProc.OnGameEnd -= StopEjectOnNodeComplete.ResetState; StopEjectOnNodeComplete.Enable(false); OnlyConstructNodes.Enable(false); Enable(false); @@ -346,6 +348,12 @@ public class DysonSpherePatch : PatchImpl return comp is { Count: > 0 }; } + internal static void ResetState() + { + _initialized = false; + _nodeForAbsorb = null; + } + private static void OnGameBegin() { InitNodeForAbsorb(); diff --git a/UXAssist/Patches/Factory/BeltSignalPatch.cs b/UXAssist/Patches/Factory/BeltSignalPatch.cs index 5c5ead9..7ec7072 100644 --- a/UXAssist/Patches/Factory/BeltSignalPatch.cs +++ b/UXAssist/Patches/Factory/BeltSignalPatch.cs @@ -6,10 +6,12 @@ using System.Reflection; using HarmonyLib; using UXAssist.Common; using UXAssist.Common.GameConstants; +using UXAssist.Common.ModFeatures; using GameLogicProc = UXAssist.Common.GameLogic; namespace UXAssist.Patches.Factory; +[ModFeature("BeltSignalsForBuyOut")] internal static class BeltSignalPatch { public static void Enable(bool enable) @@ -41,6 +43,16 @@ internal static class BeltSignalPatch storage[i] = r.ReadInt32(); } + public static void Init() + { + GameLogicProc.OnGameEnd += BeltSignalsForBuyOut.ResetState; + } + + public static void Uninit() + { + GameLogicProc.OnGameEnd -= BeltSignalsForBuyOut.ResetState; + } + internal class BeltSignalsForBuyOut : PatchImpl { private static bool _initialized; @@ -52,6 +64,15 @@ internal static class BeltSignalPatch private static Dictionary[] _signalBelts = new Dictionary[64]; private static readonly HashSet SignalBeltFactoryIndices = []; + internal static void ResetState() + { + _clusterSeedKey = 0L; + _signalBelts = null; + SignalBeltFactoryIndices.Clear(); + for (var i = 0; i < DarkFogItemsInVoid.Length; i++) + DarkFogItemsInVoid[i] = 0; + } + public static void InitPersist() { Persist.Enable(true); diff --git a/UXAssist/Patches/Factory/VeinProtectionPatch.cs b/UXAssist/Patches/Factory/VeinProtectionPatch.cs index b2ab98f..ca66ac6 100644 --- a/UXAssist/Patches/Factory/VeinProtectionPatch.cs +++ b/UXAssist/Patches/Factory/VeinProtectionPatch.cs @@ -2,9 +2,12 @@ using System; using System.Collections.Generic; using HarmonyLib; using UXAssist.Common; +using UXAssist.Common.ModFeatures; +using GameLogicProc = UXAssist.Common.GameLogic; namespace UXAssist.Patches.Factory; +[ModFeature("VeinProtection")] internal static class VeinProtectionPatch { public static void Enable(bool enable) @@ -17,6 +20,16 @@ internal static class VeinProtectionPatch ProtectVeinsFromExhaustion.InitConfig(); } + public static void Init() + { + GameLogicProc.OnGameEnd += ProtectVeinsFromExhaustion.ResetState; + } + + public static void Uninit() + { + GameLogicProc.OnGameEnd -= ProtectVeinsFromExhaustion.ResetState; + } + internal class ProtectVeinsFromExhaustion : PatchImpl { public static int KeepVeinAmount = 100; @@ -28,6 +41,11 @@ internal static class VeinProtectionPatch _keepOilAmount = Math.Max((int)(KeepOilSpeed / 0.00004f + 0.5f), 2500); } + internal static void ResetState() + { + InitConfig(); + } + [HarmonyPrefix] [HarmonyPatch(typeof(MinerComponent), nameof(MinerComponent.InternalUpdate))] private static bool MinerComponent_InternalUpdate_Prefix(PlanetFactory factory, VeinData[] veinPool, float power, float miningRate, float miningSpeed, int[] productRegister, diff --git a/UniverseGenTweaks/Patches/GalaxySelectUIPatch.cs b/UniverseGenTweaks/Patches/GalaxySelectUIPatch.cs index 98d7bc4..5b41bda 100644 --- a/UniverseGenTweaks/Patches/GalaxySelectUIPatch.cs +++ b/UniverseGenTweaks/Patches/GalaxySelectUIPatch.cs @@ -4,6 +4,7 @@ using UnityEngine.UI; using UXAssist.Common; using UXAssist.Common.GameConstants; using UXAssist.Common.ModFeatures; +using GameLogicProc = UXAssist.Common.GameLogic; using Object = UnityEngine.Object; namespace UniverseGenTweaks; @@ -29,14 +30,21 @@ public static class GalaxySelectUIPatch { MoreSettings.Enabled.SettingChanged += OnEnabledChanged; Enable(MoreSettings.Enabled.Value); + GameLogicProc.OnGameEnd += ResetState; } public static void Uninit() { + GameLogicProc.OnGameEnd -= ResetState; MoreSettings.Enabled.SettingChanged -= OnEnabledChanged; Enable(false); } + private static void ResetState() + { + // No per-game mutable fields in this file; UI references are lifecycle-safe. + } + private static void OnEnabledChanged(object sender, System.EventArgs e) { Enable(MoreSettings.Enabled.Value);