33#include < menu/OptionMenuButton.hpp>
44#include < menu/SettingV3.hpp>
55
6- #include < Geode/modify/MenuLayer.hpp>
6+ #include < ranges>
7+
78#include < Geode/modify/PlayLayer.hpp>
89#include < Geode/modify/PauseLayer.hpp>
910#include < Geode/modify/GJGameLevel.hpp>
1011
1112using namespace horrible ::prelude;
1213
14+ inline static std::vector<Hook*> safeModeHooks;
15+ inline static std::vector<Hook*> floatingBtnHooks;
16+
17+ #define HORRIBLE_HOOK_SAFEMODE (hookName ) \
18+ static void onModify (auto & self) { \
19+ Result<Hook*> hookRes = self.getHook (hookName); \
20+ \
21+ if (auto hook = hookRes.unwrap ()) { \
22+ auto safe = horribleMod->getSettingValue <bool >(setting::SafeMode); \
23+ \
24+ hook->setAutoEnable (safe); \
25+ (void )hook->toggle (safe); \
26+ \
27+ safeModeHooks.push_back (hook); \
28+ }; \
29+ }
30+
31+ #define HORRIBLE_HOOK_FLOATINGBTN \
32+ static void onModify (auto & self) { \
33+ utils::StringMap<std::shared_ptr<Hook>>& hooks = self.m_hooks ; \
34+ auto enable = horribleMod->getSettingValue <bool >(setting::FloatingBtn); \
35+ \
36+ for (auto & hook : hooks | std::views::values) { \
37+ (void )hook->toggle (enable); \
38+ hook->setAutoEnable (enable); \
39+ \
40+ floatingBtnHooks.push_back (hook.get ()); \
41+ }; \
42+ }
43+
1344$on_game(Loaded) {
45+ listenForSettingChanges<bool >(
46+ setting::SafeMode,
47+ [](bool value) {
48+ for (auto & hook : safeModeHooks) {
49+ log::trace (" Toggling safe mode hook '{}' {}..." , hook->getDisplayName (), value ? " ON" : " OFF" );
50+ (void )hook->toggle (value);
51+ };
52+ });
53+
1454 listenForKeybindSettingPresses (
1555 " key-popup" ,
1656 [](Keybind const &, bool down, bool repeat, double ) {
1757 if (down && !repeat) menu::open ();
1858 });
1959
2060 listenForSettingChanges<bool >(
21- " floating-button " ,
61+ setting::FloatingBtn ,
2262 [](bool value) {
2363 if (auto fb = OptionMenuButton::get ()) fb->setVisible (value);
64+
65+ for (auto & hook : floatingBtnHooks) {
66+ log::trace (" Toggling floating button hook '{}' {}..." , hook->getDisplayName (), value ? " ON" : " OFF" );
67+ (void )hook->toggle (value);
68+ };
2469 });
2570
2671 listenForSettingChanges<bool >(
@@ -52,84 +97,69 @@ using namespace horrible::prelude;
5297 if (auto fb = OptionMenuButton::get ()) OverlayManager::get ()->addChild (fb);
5398};
5499
55- class $modify(HIMenuLayer, MenuLayer) {
56- bool init () {
57- if (!MenuLayer::init ()) return false ;
100+ // safe mode
101+ class $modify(HISafeGJGameLevel, GJGameLevel) {
102+ HORRIBLE_HOOK_SAFEMODE (" GJGameLevel::savePercentage" );
103+
104+ void savePercentage (int , bool , int , int , bool ) {
105+ log::warn (" Safe mode is enabled, your progress will not be saved!" );
106+ };
107+ };
108+
109+ // safe mode
110+ class $modify(HISafePlayLayer, PlayLayer) {
111+ HORRIBLE_HOOK_SAFEMODE (" PlayLayer::levelComplete" );
58112
59- if (auto gm = GameManager::get ()) {
60- // get and store user current fps
61- float currentFPS = gm->m_customFPSTarget ;
62- (void )horribleMod->setSavedValue <float >(" fps" , currentFPS);
113+ // safe mode prevents level completion
114+ void levelComplete () {
115+ log::info (" Safe mode is enabled" );
63116
64- log::debug (" Stored current FPS: {}" , currentFPS);
65- };
117+ bool testMode = m_isTestMode;
66118
67- return true ;
119+ m_isTestMode = true ;
120+ PlayLayer::levelComplete ();
121+ m_isTestMode = testMode;
68122 };
69123};
70124
71- class $modify(HIPlayLayer, PlayLayer) {
72- struct Fields {
73- bool safeMode = horribleMod->getSettingValue<bool >(" safe-mode" );
125+ class $modify(HIFloatBtnPauseLayer, PauseLayer) {
126+ HORRIBLE_HOOK_FLOATINGBTN;
127+
128+ void customSetup () {
129+ if (auto fb = OptionMenuButton::get ()) fb->setVisible (horribleMod->getSettingValue <bool >(setting::FloatingBtn));
130+ PauseLayer::customSetup ();
74131 };
132+ };
133+
134+ class $modify(HIFloatBtnPlayLayer, PlayLayer) {
135+ HORRIBLE_HOOK_FLOATINGBTN;
75136
76137 void setupHasCompleted () {
77- PlayLayer::setupHasCompleted ();
78138 toggleButton ();
139+ PlayLayer::setupHasCompleted ();
79140 };
80141
81142 void resume () {
82- PlayLayer::resume ();
83143 toggleButton ();
144+ PlayLayer::resume ();
84145 };
85146
86147 void resumeAndRestart (bool fromStart) {
148+ toggleButton ();
87149 PlayLayer::resumeAndRestart (fromStart);
150+ };
151+
152+ void onQuit () {
88153 toggleButton ();
154+ PlayLayer::onQuit ();
89155 };
90156
91157 void showEndLayer () {
92158 PlayLayer::showEndLayer ();
93159 toggleButton (true );
94160 };
95161
96- // safe mode prevents level completion
97- void levelComplete () {
98- auto f = m_fields.self ();
99-
100- if (f->safeMode ) {
101- log::info (" Safe mode is enabled" );
102-
103- bool testMode = m_isTestMode;
104-
105- m_isTestMode = f->safeMode ;
106- PlayLayer::levelComplete ();
107- m_isTestMode = testMode;
108- } else {
109- log::warn (" Safe mode is disabled" );
110- PlayLayer::levelComplete ();
111- };
112- };
113-
114162 void toggleButton (bool toggle = false ) {
115- if (auto fb = OptionMenuButton::get ()) fb->setVisible (horribleMod->getSettingValue <bool >(" floating-button" ) && (fb->showInLevel () || toggle));
116- };
117- };
118-
119- class $modify(HIPauseLayer, PauseLayer) {
120- void customSetup () {
121- PauseLayer::customSetup ();
122- if (auto fb = OptionMenuButton::get ()) fb->setVisible (horribleMod->getSettingValue <bool >(" floating-button" ));
123- };
124- };
125-
126- // safe mode
127- class $modify(HIGJGameLevel, GJGameLevel) {
128- void savePercentage (int percent, bool isPracticeMode, int clicks, int attempts, bool isChkValid) {
129- if (horribleMod->getSettingValue <bool >(" safe-mode" )) {
130- log::warn (" Safe mode is enabled, your progress will not be saved!" );
131- } else {
132- GJGameLevel::savePercentage (percent, isPracticeMode, clicks, attempts, isChkValid);
133- };
163+ if (auto fb = OptionMenuButton::get ()) fb->setVisible (horribleMod->getSettingValue <bool >(setting::FloatingBtn) && (fb->showInLevel () || toggle));
134164 };
135165};
0 commit comments