From aa1e59c9f1d2681e87b0f26da8a74b1e0ee2ca80 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 23 Sep 2023 12:55:05 +1000 Subject: [PATCH] Achievements: Don't disable HC while login pending --- src/core/achievements.cpp | 40 +++++++++++++++++++++++---------------- src/core/system.cpp | 7 +------ 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/core/achievements.cpp b/src/core/achievements.cpp index b7b95ccc6..0703faaef 100644 --- a/src/core/achievements.cpp +++ b/src/core/achievements.cpp @@ -121,8 +121,8 @@ static void ClearGameInfo(); static void ClearGameHash(); static std::string GetUserAgent(); static std::string GetGameHash(CDImage* image); -static void SetHardcoreMode(bool enabled); -static bool IsLoggedIn(); +static void SetHardcoreMode(bool enabled, bool force_display_message); +static bool IsLoggedInOrLoggingIn(); static void ShowLoginSuccess(const rc_client_t* client); static void ShowLoginNotification(); static void IdentifyGame(const std::string& path, CDImage* image); @@ -286,11 +286,13 @@ std::string Achievements::GetGameHash(CDImage* image) u8 hash[16]; digest.Final(hash); - const std::string hash_str = fmt::format( - "{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}", hash[0], hash[1], hash[2], hash[3], hash[4], - hash[5], hash[6], hash[7], hash[8], hash[9], hash[10], hash[11], hash[12], hash[13], hash[14], hash[15]); + const std::string hash_str = + fmt::format("{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}", + hash[0], hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7], hash[8], hash[9], hash[10], + hash[11], hash[12], hash[13], hash[14], hash[15]); - Log_InfoFmt("Hash for '{}' ({} bytes, {} bytes hashed): {}", executable_name, executable_data.size(), hash_size, hash_str); + Log_InfoFmt("Hash for '{}' ({} bytes, {} bytes hashed): {}", executable_name, executable_data.size(), hash_size, + hash_str); return hash_str; } @@ -825,10 +827,10 @@ void Achievements::IdentifyGame(const std::string& path, CDImage* image) #endif // shouldn't have a load game request when we're not logged in. - Assert(IsLoggedIn() || !s_load_game_request); + Assert(IsLoggedInOrLoggingIn() || !s_load_game_request); // bail out if we're not logged in, just save the hash - if (!IsLoggedIn()) + if (!IsLoggedInOrLoggingIn()) { Log_InfoPrintf("Skipping load game because we're not logged in."); DisableHardcoreMode(); @@ -1323,8 +1325,10 @@ void Achievements::DisableHardcoreMode() } #endif - if (s_hardcore_mode) - SetHardcoreMode(false); + if (!s_hardcore_mode) + return; + + SetHardcoreMode(false, true); } bool Achievements::ResetHardcoreMode() @@ -1336,15 +1340,16 @@ bool Achievements::ResetHardcoreMode() // 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 = (IsLoggedIn() || s_load_game_request) && g_settings.achievements_hardcore_mode; + const bool wanted_hardcore_mode = + (IsLoggedInOrLoggingIn() || s_load_game_request) && g_settings.achievements_hardcore_mode; if (s_hardcore_mode == wanted_hardcore_mode) return false; - SetHardcoreMode(wanted_hardcore_mode); + SetHardcoreMode(wanted_hardcore_mode, false); return true; } -void Achievements::SetHardcoreMode(bool enabled) +void Achievements::SetHardcoreMode(bool enabled, bool force_display_message) { if (enabled == s_hardcore_mode) return; @@ -1352,7 +1357,7 @@ void Achievements::SetHardcoreMode(bool enabled) // new mode s_hardcore_mode = enabled; - if (HasActiveGame() && FullscreenUI::Initialize()) + if (System::IsValid() && (HasActiveGame() || force_display_message) && FullscreenUI::Initialize()) { ImGuiFullscreen::ShowToast(std::string(), enabled ? TRANSLATE_STR("Achievements", "Hardcore mode is now enabled.") : @@ -1363,7 +1368,10 @@ void Achievements::SetHardcoreMode(bool enabled) rc_client_set_hardcore_enabled(s_client, enabled); DebugAssert((rc_client_get_hardcore_enabled(s_client) != 0) == enabled); if (HasActiveGame()) + { UpdateGameSummary(); + DisplayAchievementSummary(); + } // Toss away UI state, because it's invalid now ClearUIState(); @@ -1537,9 +1545,9 @@ std::string Achievements::GetLeaderboardUserBadgePath(const rc_client_leaderboar return path; } -bool Achievements::IsLoggedIn() +bool Achievements::IsLoggedInOrLoggingIn() { - return (rc_client_get_user_info(s_client) != nullptr); + return (rc_client_get_user_info(s_client) != nullptr || s_login_request); } bool Achievements::Login(const char* username, const char* password, Error* error) diff --git a/src/core/system.cpp b/src/core/system.cpp index 916322f58..d2c959ce1 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -2322,12 +2322,7 @@ bool System::LoadStateFromStream(ByteStream* state, bool update_display, bool ig ClearMemorySaveStates(); // Updating game/loading settings can turn on hardcore mode. Catch this. - if (Achievements::IsHardcoreModeActive()) - { - Host::AddKeyedOSDMessage("challenge_mode_reset", - TRANSLATE_STR("Achievements", "Hardcore mode disabled by state switch."), 10.0f); - Achievements::DisableHardcoreMode(); - } + Achievements::DisableHardcoreMode(); if (!state->SeekAbsolute(header.offset_to_data)) return false;