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..d06a94d 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,30 @@ 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 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); + }; + }; +}; + class $modify(HMFloatBtnLevelEditorLayer, LevelEditorLayer) { HORRIBLE_HOOK_INTERNAL(g_floatingBtnHooks, setting::FloatingBtn);