From e58b122fb00a337748df2de2451679f53b092d42 Mon Sep 17 00:00:00 2001
From: Star Rauchenberger <fefferburbia@gmail.com>
Date: Sat, 22 Feb 2025 10:43:41 -0500
Subject: Mapped out most of the game

---
 GameplayPatches.cs | 237 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 237 insertions(+)
 create mode 100644 GameplayPatches.cs

(limited to 'GameplayPatches.cs')

diff --git a/GameplayPatches.cs b/GameplayPatches.cs
new file mode 100644
index 0000000..e0767c4
--- /dev/null
+++ b/GameplayPatches.cs
@@ -0,0 +1,237 @@
+using HarmonyLib;
+using System.Reflection;
+
+namespace ManifoldGardenArchipelago
+{
+    [HarmonyPatch(typeof(LineDoorController), "SetDoorOpenCloseStateAnimated")]
+    static class LineDoorControllerSetDoorOpenCloseStateAnimatedPatch
+    {
+        static bool Prefix(LineDoorController __instance, bool open)
+        {
+            SceneItemReference sir = GameState.GetChainListenerSceneReference(__instance);
+
+            if (GameData.scenes.TryGetValue(sir.scene, out var sceneDescription))
+            {
+                if (sceneDescription.doors.TryGetValue(sir.index, out var requirement))
+                {
+                    if (open != requirement.Check())
+                    {
+                        return false;
+                    }
+                }
+            }
+
+            return true;
+        }
+    }
+
+    [HarmonyPatch(typeof(ButtonLineActivator), "ToggleButtonPress")]
+    static class ButtonLineActivatorToggleButtonPressPatch
+    {
+        static void Prefix(ButtonLineActivator __instance, bool setPressed)
+        {
+            SceneItemReference sir = GameState.GetButtonSceneReference(__instance);
+            Plugin.Logger.LogInfo($"Button {sir} state {setPressed}");
+
+            if (!GameData.listenersByButton.TryGetValue(sir, out GameStateListeners listeners))
+            {
+                return;
+            }
+
+            if (setPressed)
+            {
+                Plugin.slotSave.ActivatedButtons.Add(sir);
+            }
+            else
+            {
+                Plugin.slotSave.ActivatedButtons.Remove(sir);
+            }
+
+            GameState.EvaluateGameStateListeners(listeners);
+        }
+    }
+
+    [HarmonyPatch(typeof(CubeReceiverController), "SetActivatorActive")]
+    static class CubeReceiverControllerSetActivatorActivePatch
+    {
+        static void Prefix(CubeReceiverController __instance, bool active)
+        {
+            SceneItemReference sir = GameState.GetSocketSceneReference(__instance);
+            Plugin.Logger.LogInfo($"Socket {sir} state {active}");
+
+            if (!GameData.listenersBySocket.TryGetValue(sir, out GameStateListeners listeners))
+            {
+                return;
+            }
+
+            if (active)
+            {
+                Plugin.slotSave.ActivatedSockets.Add(sir);
+            }
+            else
+            {
+                Plugin.slotSave.ActivatedSockets.Remove(sir);
+            }
+
+            GameState.EvaluateGameStateListeners(listeners);
+        }
+    }
+
+    [HarmonyPatch(typeof(CubeLineActivator), "SetActivatorActive")]
+    static class CubeLineActivatorSetActivatorActivePatch
+    {
+        static void Prefix(CubeLineActivator __instance, bool setActive)
+        {
+            SceneItemReference sir = GameState.GetPadSceneReference(__instance);
+            Plugin.Logger.LogInfo($"Pad {sir} state {setActive}");
+
+            if (!GameData.listenersByPad.TryGetValue(sir, out GameStateListeners listeners))
+            {
+                return;
+            }
+
+            if (setActive)
+            {
+                Plugin.slotSave.ActivatedPads.Add(sir);
+            }
+            else
+            {
+                Plugin.slotSave.ActivatedPads.Remove(sir);
+            }
+
+            GameState.EvaluateGameStateListeners(listeners);
+        }
+    }
+
+    [HarmonyPatch(typeof(WaterDetector), "SetActivatorActive")]
+    static class WaterDetectorSetActivatorActivePatch
+    {
+        static void Prefix(WaterDetector __instance, bool setActive)
+        {
+            SceneItemReference sir = GameState.GetWaterwheelSceneReference(__instance);
+            Plugin.Logger.LogInfo($"Waterwheel {sir} state {setActive}");
+
+            if (!GameData.listenersByWaterwheel.TryGetValue(sir, out GameStateListeners listeners))
+            {
+                return;
+            }
+
+            if (setActive)
+            {
+                Plugin.slotSave.ActivatedWaterwheels.Add(sir);
+            }
+            else
+            {
+                Plugin.slotSave.ActivatedWaterwheels.Remove(sir);
+            }
+
+            GameState.EvaluateGameStateListeners(listeners);
+        }
+    }
+
+    [HarmonyPatch(typeof(SphereController), nameof(SphereController.SetState))]
+    static class SphereControllerSetStatePatch
+    {
+        static void Prefix(SphereController __instance, SphereController.State newState)
+        {
+            SceneItemReference sir = GameState.GetSphereSceneReference(__instance);
+            Plugin.Logger.LogInfo($"Sphere {sir} state {newState}");
+
+            if (!GameData.listenersBySphere.TryGetValue(sir, out GameStateListeners listeners))
+            {
+                return;
+            }
+
+            if (newState == SphereController.State.AtDestination)
+            {
+                Plugin.slotSave.ActivatedSpheres.Add(sir);
+            }
+            else
+            {
+                Plugin.slotSave.ActivatedSpheres.Remove(sir);
+            }
+
+            GameState.EvaluateGameStateListeners(listeners);
+        }
+    }
+
+    [HarmonyPatch(typeof(LineDoorController), nameof(LineDoorController.OnLevelEnable))]
+    static class LineDoorControllerOnLevelEnablePatch
+    {
+        static void Prefix(LineDoorController __instance)
+        {
+            SceneItemReference sir = GameState.GetChainListenerSceneReference(__instance);
+
+            if (GameData.scenes.TryGetValue(sir.scene, out var sceneDescription))
+            {
+                if (sceneDescription.doors.TryGetValue(sir.index, out var requirement))
+                {
+                    FieldInfo fieldInfo = typeof(LineDoorController).GetField("doorShouldOpenImmediatelyOnEnable", BindingFlags.Instance | BindingFlags.NonPublic);
+                    fieldInfo.SetValue(__instance, requirement.Check());
+
+                    __instance.chains.Clear();
+                }
+            }
+        }
+    }
+
+    [HarmonyPatch(typeof(LineDoorController), nameof(LineDoorController.OnLoad))]
+    static class LineDoorControllerOnLoadPatch
+    {
+        static void Prefix(LineDoorController __instance)
+        {
+            SceneItemReference sir = GameState.GetChainListenerSceneReference(__instance);
+
+            if (GameData.scenes.TryGetValue(sir.scene, out var sceneDescription))
+            {
+                if (sceneDescription.doors.TryGetValue(sir.index, out var requirement))
+                {
+                    FieldInfo fieldInfo = typeof(LineDoorController).GetField("doorShouldOpenImmediatelyOnEnable", BindingFlags.Instance | BindingFlags.NonPublic);
+                    fieldInfo.SetValue(__instance, requirement.Check());
+
+                    __instance.chains.Clear();
+                }
+            }
+        }
+    }
+
+    [HarmonyPatch(typeof(LevelLoader), nameof(LevelLoader.MovePlayerIntoNewScene))]
+    static class LevelLoaderMovePlayerIntoNewScenePatch
+    {
+        static void Postfix(LevelSystems newLevel)
+        {
+            Plugin.slotSave.VisitedScenes.Add(newLevel.levelName);
+
+            if (GameData.listenersByScene.TryGetValue(newLevel.levelName, out var listeners))
+            {
+                GameState.EvaluateGameStateListeners(listeners);
+            }
+        }
+    }
+
+    [HarmonyPatch(typeof(DarkModeCollapsedCubeWorldGrow), nameof(DarkModeCollapsedCubeWorldGrow.OnChainFillComplete))]
+    static class DarkModeCollapsedCubeWorldGrowOnChainFillCompletePatch
+    {
+        static bool Prefix()
+        {
+            return false;
+        }
+    }
+
+    [HarmonyPatch(typeof(DarkModeCollapsedCubeWorldGrow), nameof(DarkModeCollapsedCubeWorldGrow.OnLevelEnable))]
+    static class DarkModeCollapsedCubeWorldGrowOnLevelEnablePatch
+    {
+        static void Prefix(DarkModeCollapsedCubeWorldGrow __instance)
+        {
+            SceneItemReference sir = GameState.GetChainListenerSceneReference(__instance);
+
+            if (GameData.scenes.TryGetValue(sir.scene, out var sceneDescription) &&
+                sceneDescription.worldGrows.TryGetValue(sir.index, out var requirement) &&
+                requirement.Check())
+            {
+                FieldInfo fieldInfo = typeof(DarkModeCollapsedCubeWorldGrow).GetField("m_grown", BindingFlags.Instance | BindingFlags.NonPublic);
+                fieldInfo.SetValue(__instance, true);
+            }
+        }
+    }
+}
-- 
cgit 1.4.1