From 60e31ecae3ebb34aa7920b0559ec26f4e3973616 Mon Sep 17 00:00:00 2001 From: km7dev Date: Thu, 30 Jul 2026 23:33:31 -0400 Subject: [PATCH 1/2] some safe mode changes --- mod.json | 6 ++++++ src/hooks.cpp | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/mod.json b/mod.json index b0332c2..357aa7d 100644 --- a/mod.json +++ b/mod.json @@ -87,6 +87,12 @@ "description": "Automatically toggle Safe Mode whenever you toggle any options that are marked as cheats.", "default": true }, + "safe-mode-indicator": { + "type": "bool", + "name": "Indicator", + "description": "Shows an indicator on the end screen for safe mode being enabled.", + "default": true + }, "utils": { "type": "button", "name": "Disable All Cheats", diff --git a/src/hooks.cpp b/src/hooks.cpp index de2929d..580447b 100644 --- a/src/hooks.cpp +++ b/src/hooks.cpp @@ -9,6 +9,7 @@ #include #include #include +#include using namespace horrible::prelude; @@ -57,6 +58,7 @@ namespace hooks { } $on_game(Loaded) { + if (auto om = OptionManager::get()) hooks::toggleSafeModeHooks(om->shouldBeSafeMode()); listenForSettingChanges( setting::SafeMode, [](bool value) { @@ -119,6 +121,23 @@ class $modify(HMSafePlayLayer, PlayLayer) { }; }; +class $modify(HMEndLevelLayer, EndLevelLayer) { + HORRIBLE_HOOK_INTERNAL(g_safeModeHooks, setting::SafeMode); + + void customSetup() { + EndLevelLayer::customSetup(); + + if (Mod::get()->getSettingValue("safe-mode-indicator")) { + auto isSpriteSecret = rng::fast() <= 5; + auto sprite = CCSprite::createWithSpriteFrameName(themes::getIconSprite(isSpriteSecret ? themes::icons::TheYellowOne : themes::icons::Default)); + sprite->setScale(.4f); + sprite->setID("safe-mode-indicator"_spr); + sprite->setZOrder(2); + m_mainLayer->addChildAtPosition(sprite, Anchor::Center, {165, -105}, false); + }; + }; +}; + class $modify(HMFloatBtnLevelEditorLayer, LevelEditorLayer) { HORRIBLE_HOOK_INTERNAL(g_floatingBtnHooks, setting::FloatingBtn); From 9deeceec3974de7e84ed7da2c9deaebd2523e095 Mon Sep 17 00:00:00 2001 From: km7dev Date: Sat, 1 Aug 2026 13:42:20 -0400 Subject: [PATCH 2/2] make the safe mode icon a button thanks to undefined and staz for help improving the text --- src/hooks.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/hooks.cpp b/src/hooks.cpp index 580447b..d06a94d 100644 --- a/src/hooks.cpp +++ b/src/hooks.cpp @@ -129,11 +129,18 @@ class $modify(HMEndLevelLayer, EndLevelLayer) { if (Mod::get()->getSettingValue("safe-mode-indicator")) { auto isSpriteSecret = rng::fast() <= 5; - auto sprite = CCSprite::createWithSpriteFrameName(themes::getIconSprite(isSpriteSecret ? themes::icons::TheYellowOne : themes::icons::Default)); - sprite->setScale(.4f); - sprite->setID("safe-mode-indicator"_spr); - sprite->setZOrder(2); - m_mainLayer->addChildAtPosition(sprite, Anchor::Center, {165, -105}, false); + auto btn = Button::createWithSpriteFrameName(themes::getIconSprite(isSpriteSecret ? themes::icons::TheYellowOne : themes::icons::Default), [](auto) { + createQuickPopup( + "Safe Mode", + "Safe Mode is enabled and your progress has not been saved.", + "OK", + nullptr, + nullptr); + }); + btn->setScale(.4f); + btn->setID("safe-mode-indicator"_spr); + btn->setZOrder(2); + m_mainLayer->addChildAtPosition(btn, Anchor::Center, {165, -105}, false); }; }; };