From 9a08edae093698b95aadcdfdea80cacb85382729 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Thu, 12 Mar 2026 07:15:08 -0700 Subject: [PATCH] feat: add Low Health Vignette toggle in Settings > Interface The persistent red-edge vignette (below 20% HP) now has an on/off checkbox under Settings > Interface > Screen Effects, alongside the existing Damage Flash toggle. The preference is persisted to settings.cfg. --- include/ui/game_screen.hpp | 1 + src/ui/game_screen.cpp | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/ui/game_screen.hpp b/include/ui/game_screen.hpp index ba1602d1..4b166783 100644 --- a/include/ui/game_screen.hpp +++ b/include/ui/game_screen.hpp @@ -83,6 +83,7 @@ private: uint32_t lastPlayerHp_ = 0; // Previous frame HP for damage flash detection float damageFlashAlpha_ = 0.0f; // Screen edge flash intensity (fades to 0) bool damageFlashEnabled_ = true; + bool lowHealthVignetteEnabled_ = true; // Persistent pulsing red vignette below 20% HP float levelUpFlashAlpha_ = 0.0f; // Golden level-up burst effect (fades to 0) uint32_t levelUpDisplayLevel_ = 0; // Level shown in level-up text diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index 0d5ce1eb..379ed039 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -787,7 +787,7 @@ void GameScreen::render(game::GameHandler& gameHandler) { } // Only show when alive and below 20% HP; intensity increases as HP drops - if (!isDead && hpPct < 0.20f && hpPct > 0.0f) { + if (lowHealthVignetteEnabled_ && !isDead && hpPct < 0.20f && hpPct > 0.0f) { // Base intensity from HP deficit (0 at 20%, 1 at 0%); pulse at ~1.5 Hz float danger = (0.20f - hpPct) / 0.20f; float pulse = 0.55f + 0.45f * std::sin(static_cast(ImGui::GetTime()) * 9.4f); @@ -12021,6 +12021,12 @@ void GameScreen::renderSettingsWindow() { ImGui::SameLine(); ImGui::TextDisabled("(red vignette on taking damage)"); + if (ImGui::Checkbox("Low Health Vignette", &lowHealthVignetteEnabled_)) { + saveSettings(); + } + ImGui::SameLine(); + ImGui::TextDisabled("(pulsing red edges below 20%% HP)"); + ImGui::EndChild(); ImGui::EndTabItem(); } @@ -13841,6 +13847,7 @@ void GameScreen::saveSettings() { out << "right_bar_offset_y=" << pendingRightBarOffsetY << "\n"; out << "left_bar_offset_y=" << pendingLeftBarOffsetY << "\n"; out << "damage_flash=" << (damageFlashEnabled_ ? 1 : 0) << "\n"; + out << "low_health_vignette=" << (lowHealthVignetteEnabled_ ? 1 : 0) << "\n"; // Audio out << "sound_muted=" << (soundMuted_ ? 1 : 0) << "\n"; @@ -13962,6 +13969,8 @@ void GameScreen::loadSettings() { pendingLeftBarOffsetY = std::clamp(std::stof(val), -400.0f, 400.0f); } else if (key == "damage_flash") { damageFlashEnabled_ = (std::stoi(val) != 0); + } else if (key == "low_health_vignette") { + lowHealthVignetteEnabled_ = (std::stoi(val) != 0); } // Audio else if (key == "sound_muted") {