From 21caf514c28deec6dfc04a2b0fe4d81b0b391e53 Mon Sep 17 00:00:00 2001
From: ConfiG <cgytrus@cgyt.ru>
Date: Sat, 13 Jan 2024 03:30:07 +0300
Subject: [PATCH] move forward compat hook toggling to macros

---
 loader/include/Geode/DefaultInclude.hpp | 27 +++++++++++++++++++++++++
 loader/src/hooks/FixClippingRect.cpp    | 10 +--------
 loader/src/hooks/LoadingLayer.cpp       | 18 ++---------------
 loader/src/hooks/MenuLayer.cpp          |  8 +-------
 loader/src/hooks/persist.cpp            | 10 +--------
 loader/src/hooks/save.cpp               | 19 ++---------------
 loader/src/utils/cocos.cpp              | 10 +--------
 7 files changed, 35 insertions(+), 67 deletions(-)

diff --git a/loader/include/Geode/DefaultInclude.hpp b/loader/include/Geode/DefaultInclude.hpp
index 87d7b1a6..0190d9e2 100644
--- a/loader/include/Geode/DefaultInclude.hpp
+++ b/loader/include/Geode/DefaultInclude.hpp
@@ -200,6 +200,33 @@ namespace geode {
     template <class>                                                                              \
     void GEODE_CONCAT(geodeExecFunction, __LINE__)()
 
+#define GEODE_FORWARD_COMPAT_DISABLE_HOOKS_INNER(message) \
+    if (Loader::get()->isForwardCompatMode()) {           \
+        if (strlen(message)) {                            \
+            log::warn("[Forward Compat] " message);       \
+        }                                                 \
+        for (const auto& [_, hook] : self.m_hooks) {      \
+            hook->setAutoEnable(false);                   \
+        }                                                 \
+    }
+#define GEODE_FORWARD_COMPAT_ENABLE_HOOKS_INNER(message)  \
+    if (!Loader::get()->isForwardCompatMode()) {          \
+        if (strlen(message)) {                            \
+            log::warn("[Forward Compat] " message);       \
+        }                                                 \
+        for (const auto& [_, hook] : self.m_hooks) {      \
+            hook->setAutoEnable(false);                   \
+        }                                                 \
+    }
+#define GEODE_FORWARD_COMPAT_DISABLE_HOOKS(message)       \
+    static void onModify(const auto& self) {              \
+        GEODE_FORWARD_COMPAT_DISABLE_HOOKS_INNER(message) \
+    }
+#define GEODE_FORWARD_COMPAT_ENABLE_HOOKS(message)        \
+    static void onModify(const auto& self) {              \
+        GEODE_FORWARD_COMPAT_ENABLE_HOOKS_INNER(message)  \
+    }
+
 // #define GEODE_NEST1(macro, begin)           \
 // macro(GEODE_CONCAT(begin, 0)),                        \
 // macro(GEODE_CONCAT(begin, 1)),                        \
diff --git a/loader/src/hooks/FixClippingRect.cpp b/loader/src/hooks/FixClippingRect.cpp
index 80533bbe..d976bb64 100644
--- a/loader/src/hooks/FixClippingRect.cpp
+++ b/loader/src/hooks/FixClippingRect.cpp
@@ -3,15 +3,7 @@
 using namespace geode::prelude;
 
 struct MyGameToolbox : Modify<MyGameToolbox, GameToolbox> {
-    static void onModify(const auto& self) {
-        if (!Loader::get()->isForwardCompatMode())
-            return;
-        log::warn("FixClippingRect disabled in forward compat");
-        for (const auto& [_, hook] : self.m_hooks) {
-            hook->setAutoEnable(false);
-        }
-    }
-
+    GEODE_FORWARD_COMPAT_DISABLE_HOOKS("FixClippingRect disabled")
     static void preVisitWithClippingRect(CCNode* node, CCRect rect) {
         if (node->isVisible()) {
             glEnable(0xc11);
diff --git a/loader/src/hooks/LoadingLayer.cpp b/loader/src/hooks/LoadingLayer.cpp
index 34a88ab1..76bca4de 100644
--- a/loader/src/hooks/LoadingLayer.cpp
+++ b/loader/src/hooks/LoadingLayer.cpp
@@ -14,14 +14,7 @@ struct CustomLoadingLayer : Modify<CustomLoadingLayer, LoadingLayer> {
     int m_geodeLoadStep = 0;
     int m_totalMods = 0;
 
-    static void onModify(const auto& self) {
-        if (!Loader::get()->isForwardCompatMode())
-            return;
-        log::warn("Switching to fallback custom loading layer in forward compat");
-        for (const auto& [_, hook] : self.m_hooks) {
-            hook->setAutoEnable(false);
-        }
-    }
+    GEODE_FORWARD_COMPAT_DISABLE_HOOKS("Switching to fallback custom loading layer")
 
     void updateLoadedModsLabel() {
         auto allMods = Loader::get()->getAllMods();
@@ -192,14 +185,7 @@ struct CustomLoadingLayer : Modify<CustomLoadingLayer, LoadingLayer> {
 };
 
 struct FallbackCustomLoadingLayer : Modify<FallbackCustomLoadingLayer, CCLayer> {
-    static void onModify(const auto& self) {
-        if (Loader::get()->isForwardCompatMode())
-            return;
-        for (const auto& [_, hook] : self.m_hooks) {
-            hook->setAutoEnable(false);
-        }
-    }
-
+    GEODE_FORWARD_COMPAT_ENABLE_HOOKS("")
     bool init() {
         if (!CCLayer::init())
             return false;
diff --git a/loader/src/hooks/MenuLayer.cpp b/loader/src/hooks/MenuLayer.cpp
index 1ff521f7..78f594ce 100644
--- a/loader/src/hooks/MenuLayer.cpp
+++ b/loader/src/hooks/MenuLayer.cpp
@@ -49,13 +49,7 @@ struct CustomMenuLayer : Modify<CustomMenuLayer, MenuLayer> {
         if (!self.setHookPriority("MenuLayer::init", geode::node_ids::GEODE_ID_PRIORITY)) {
             log::warn("Failed to set MenuLayer::init hook priority, node IDs may not work properly");
         }
-
-        if (!Loader::get()->isForwardCompatMode())
-            return;
-        log::warn("MenuLayer stuff disabled in forward compat");
-        for (const auto& [_, hook] : self.m_hooks) {
-            hook->setAutoEnable(false);
-        }
+        GEODE_FORWARD_COMPAT_DISABLE_HOOKS_INNER("MenuLayer stuff disabled")
     }
 
     CCSprite* m_geodeButton;
diff --git a/loader/src/hooks/persist.cpp b/loader/src/hooks/persist.cpp
index 850a4709..84bc3575 100644
--- a/loader/src/hooks/persist.cpp
+++ b/loader/src/hooks/persist.cpp
@@ -5,15 +5,7 @@ using namespace geode::prelude;
 #include <Geode/modify/AchievementNotifier.hpp>
 
 struct SceneSwitch : Modify<SceneSwitch, AchievementNotifier> {
-    static void onModify(const auto& self) {
-        if (!Loader::get()->isForwardCompatMode())
-            return;
-        log::warn("persist disabled in forward compat");
-        for (const auto& [_, hook] : self.m_hooks) {
-            hook->setAutoEnable(false);
-        }
-    }
-
+    GEODE_FORWARD_COMPAT_DISABLE_HOOKS("persist disabled")
     void willSwitchToScene(CCScene* scene) {
         AchievementNotifier::willSwitchToScene(scene);
         SceneManager::get()->willSwitchToScene(scene);
diff --git a/loader/src/hooks/save.cpp b/loader/src/hooks/save.cpp
index 00142570..acfb08c8 100644
--- a/loader/src/hooks/save.cpp
+++ b/loader/src/hooks/save.cpp
@@ -23,15 +23,7 @@ namespace {
 }
 
 struct SaveLoader : Modify<SaveLoader, AppDelegate> {
-    static void onModify(const auto& self) {
-        if (!Loader::get()->isForwardCompatMode())
-            return;
-        log::warn("save moved in forward compat");
-        for (const auto& [_, hook] : self.m_hooks) {
-            hook->setAutoEnable(false);
-        }
-    }
-
+    GEODE_FORWARD_COMPAT_DISABLE_HOOKS("save moved to CCApplication::gameDidSave()")
     void trySaveGame(bool p0) {
         saveModData();
         return AppDelegate::trySaveGame(p0);
@@ -39,14 +31,7 @@ struct SaveLoader : Modify<SaveLoader, AppDelegate> {
 };
 
 struct FallbackSaveLoader : Modify<FallbackSaveLoader, CCApplication> {
-    static void onModify(const auto& self) {
-        if (Loader::get()->isForwardCompatMode())
-            return;
-        for (const auto& [_, hook] : self.m_hooks) {
-            hook->setAutoEnable(false);
-        }
-    }
-
+    GEODE_FORWARD_COMPAT_ENABLE_HOOKS("")
     void gameDidSave() {
         saveModData();
         return CCApplication::gameDidSave();
diff --git a/loader/src/utils/cocos.cpp b/loader/src/utils/cocos.cpp
index a7fa3a20..4b55ad24 100644
--- a/loader/src/utils/cocos.cpp
+++ b/loader/src/utils/cocos.cpp
@@ -388,15 +388,7 @@ void geode::cocos::reloadTextures(CreateLayerFunc returnTo) {
 }
 
 struct LoadingFinished : Modify<LoadingFinished, LoadingLayer> {
-    static void onModify(const auto& self) {
-        if (!Loader::get()->isForwardCompatMode())
-            return;
-        log::warn("geode::cocos::reloadTextures disabled in forward compat");
-        for (const auto& [_, hook] : self.m_hooks) {
-            hook->setAutoEnable(false);
-        }
-    }
-
+    GEODE_FORWARD_COMPAT_DISABLE_HOOKS("geode::cocos::reloadTextures disabled")
     void loadAssets() {
         // loadFinished is inlined on Macchew OS :sob: