From b794e841a9a4e6ebd045b87c02d54e63ef8ee541 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 6 Apr 2025 21:25:52 +1000 Subject: [PATCH] Achievements: Improve HC self-disable --- src/core/achievements.cpp | 7 ++++--- src/core/system.cpp | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/core/achievements.cpp b/src/core/achievements.cpp index 1d31ed6ea..6205c2bcd 100644 --- a/src/core/achievements.cpp +++ b/src/core/achievements.cpp @@ -1822,8 +1822,9 @@ bool Achievements::ResetHardcoreMode(bool is_booting) // If we're not logged in, don't apply hardcore mode restrictions. // If we later log in, we'll start with it off anyway. - const bool wanted_hardcore_mode = - (IsLoggedInOrLoggingIn() || s_state.load_game_request) && g_settings.achievements_hardcore_mode; + const bool wanted_hardcore_mode = (IsLoggedInOrLoggingIn() || s_state.load_game_request) && + (HasActiveGame() || s_state.load_game_request) && + g_settings.achievements_hardcore_mode; if (s_state.hardcore_mode == wanted_hardcore_mode) return false; @@ -1864,7 +1865,7 @@ void Achievements::SetHardcoreMode(bool enabled, bool force_display_message) } // Reload setting to permit cheating-like things if we were just disabled. - if (!enabled) + if (!enabled && System::IsValid()) Host::RunOnCPUThread([]() { System::ApplySettings(false); }); // Toss away UI state, because it's invalid now diff --git a/src/core/system.cpp b/src/core/system.cpp index 262fbfcc9..1dac1c651 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -1756,6 +1756,7 @@ bool System::BootSystem(SystemBootParameters parameters, Error* error) if (disc) { // Check for resuming with hardcore mode. + const bool hc_mode_was_enabled = Achievements::IsHardcoreModeActive(); if (parameters.disable_achievements_hardcore_mode) Achievements::DisableHardcoreMode(); else @@ -1793,6 +1794,10 @@ bool System::BootSystem(SystemBootParameters parameters, Error* error) return true; } } + + // Need to reinit things like emulation speed, cpu overclock, etc. + if (Achievements::IsHardcoreModeActive() != hc_mode_was_enabled) + ApplySettings(false); } // Are we fast booting? Must be checked after updating game settings.