From a9311142dc8c4bf17a9adacc1eae07ed1658e011 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Thu, 18 Apr 2024 00:25:19 +1000 Subject: [PATCH] Achievements: Fix HC mode activating on reset of non-cheevo game --- pcsx2/Achievements.cpp | 15 +++++++++------ pcsx2/Achievements.h | 2 +- pcsx2/VMManager.cpp | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/pcsx2/Achievements.cpp b/pcsx2/Achievements.cpp index 9cd2a5cb86..9ad31a6489 100644 --- a/pcsx2/Achievements.cpp +++ b/pcsx2/Achievements.cpp @@ -125,7 +125,7 @@ namespace Achievements static std::string GetGameHash(const std::string& elf_path); static void SetHardcoreMode(bool enabled, bool force_display_message); static bool IsLoggedInOrLoggingIn(); - static bool IsUnknownGame(); + static bool CanEnableHardcoreMode(); static void ShowLoginSuccess(const rc_client_t* client); static void IdentifyGame(u32 disc_crc, u32 crc); static void BeginLoadGame(); @@ -510,7 +510,7 @@ void Achievements::UpdateSettings(const Pcsx2Config::AchievementsOptions& old_co // Hardcore mode can only be enabled through reset (ResetChallengeMode()). if (s_hardcore_mode && !EmuConfig.Achievements.HardcoreMode) { - ResetHardcoreMode(); + ResetHardcoreMode(false); } else if (!s_hardcore_mode && EmuConfig.Achievements.HardcoreMode) { @@ -1393,7 +1393,7 @@ void Achievements::DisableHardcoreMode() SetHardcoreMode(false, true); } -bool Achievements::ResetHardcoreMode() +bool Achievements::ResetHardcoreMode(bool is_booting) { if (!IsActive()) return false; @@ -1407,7 +1407,10 @@ bool Achievements::ResetHardcoreMode() // which gets called before ResetHardcoreMode(). const bool wanted_hardcore_mode = (IsLoggedInOrLoggingIn() || s_load_game_request) && EmuConfig.Achievements.HardcoreMode; - if (s_hardcore_mode == wanted_hardcore_mode || (wanted_hardcore_mode && IsUnknownGame())) + if (s_hardcore_mode == wanted_hardcore_mode) + return false; + + if (!is_booting && wanted_hardcore_mode && !CanEnableHardcoreMode()) return false; SetHardcoreMode(wanted_hardcore_mode, false); @@ -1608,9 +1611,9 @@ bool Achievements::IsLoggedInOrLoggingIn() return (rc_client_get_user_info(s_client) != nullptr || s_login_request); } -bool Achievements::IsUnknownGame() +bool Achievements::CanEnableHardcoreMode() { - return (s_game_id == 0 && !s_load_game_request); + return (s_load_game_request || s_has_achievements || s_has_leaderboards); } bool Achievements::Login(const char* username, const char* password, Error* error) diff --git a/pcsx2/Achievements.h b/pcsx2/Achievements.h index 3507d40194..2c1701778a 100644 --- a/pcsx2/Achievements.h +++ b/pcsx2/Achievements.h @@ -65,7 +65,7 @@ namespace Achievements void GameChanged(u32 disc_crc, u32 crc); /// Re-enables hardcode mode if it is enabled in the settings. - bool ResetHardcoreMode(); + bool ResetHardcoreMode(bool is_booting); /// Forces hardcore mode off until next reset. void DisableHardcoreMode(); diff --git a/pcsx2/VMManager.cpp b/pcsx2/VMManager.cpp index 25dab3b0f7..776a479e7a 100644 --- a/pcsx2/VMManager.cpp +++ b/pcsx2/VMManager.cpp @@ -1328,7 +1328,7 @@ bool VMManager::Initialize(VMBootParameters boot_params) if (boot_params.disable_achievements_hardcore_mode) Achievements::DisableHardcoreMode(); else - Achievements::ResetHardcoreMode(); + Achievements::ResetHardcoreMode(true); if (Achievements::IsHardcoreModeActive()) { auto confirmHardcoreModeDisable = [&boot_params, &state_to_load](const char* trigger) mutable { @@ -1604,7 +1604,7 @@ void VMManager::Reset() return; // Re-enforce hardcode mode constraints if we're now enabling it. - if (Achievements::ResetHardcoreMode()) + if (Achievements::ResetHardcoreMode(false)) ApplySettings(); vu1Thread.WaitVU();