From 138e68ef9f7a7cb2bc8640c876ffc800a4d05baf Mon Sep 17 00:00:00 2001 From: LillyJadeKatrin Date: Wed, 15 Nov 2023 10:46:42 -0500 Subject: [PATCH] Added Hardcore flag to Achievement Settings Hardcore Mode is a RetroAchievements feature for enabling as close to original hardware as possible, to keep a fair, challenging, and competitive playing field for achievements (which get tallied differently and emphasized more in hardcore) and leaderboards (where it is mandatory) at the cost of several common emulator features that provide advantages, such as state loading and slower emulation speeds. This commit just adds the flag to the AchievementSettings, with more to come. --- Source/Core/Core/AchievementManager.cpp | 12 ++++++++++++ Source/Core/Core/AchievementManager.h | 3 ++- Source/Core/Core/Config/AchievementSettings.cpp | 5 +++++ Source/Core/Core/Config/AchievementSettings.h | 4 ++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp index 54671a1388..6fab056c79 100644 --- a/Source/Core/Core/AchievementManager.cpp +++ b/Source/Core/Core/AchievementManager.cpp @@ -633,6 +633,18 @@ std::recursive_mutex* AchievementManager::GetLock() return &m_lock; } +bool AchievementManager::IsHardcoreModeActive() const +{ + std::lock_guard lg{m_lock}; + if (!Config::Get(Config::RA_HARDCORE_ENABLED)) + return false; + if (!Core::IsRunning()) + return true; + if (!IsGameLoaded()) + return false; + return (m_runtime.trigger_count + m_runtime.lboard_count > 0); +} + std::string AchievementManager::GetPlayerDisplayName() const { return IsLoggedIn() ? m_display_name : ""; diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h index be2469dc9e..e790e0bc1c 100644 --- a/Source/Core/Core/AchievementManager.h +++ b/Source/Core/Core/AchievementManager.h @@ -119,6 +119,7 @@ public: void AchievementEventHandler(const rc_runtime_event_t* runtime_event); std::recursive_mutex* GetLock(); + bool IsHardcoreModeActive() const; std::string GetPlayerDisplayName() const; u32 GetPlayerScore() const; const BadgeStatus& GetPlayerBadge() const; @@ -190,7 +191,7 @@ private: Common::WorkQueueThread> m_queue; Common::WorkQueueThread> m_image_queue; - std::recursive_mutex m_lock; + mutable std::recursive_mutex m_lock; }; // class AchievementManager #endif // USE_RETRO_ACHIEVEMENTS diff --git a/Source/Core/Core/Config/AchievementSettings.cpp b/Source/Core/Core/Config/AchievementSettings.cpp index a425605f8c..5edaa6a54c 100644 --- a/Source/Core/Core/Config/AchievementSettings.cpp +++ b/Source/Core/Core/Config/AchievementSettings.cpp @@ -1,6 +1,7 @@ // Copyright 2023 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#ifdef USE_RETRO_ACHIEVEMENTS #include "Core/Config/AchievementSettings.h" #include @@ -19,6 +20,8 @@ const Info RA_LEADERBOARDS_ENABLED{ {System::Achievements, "Achievements", "LeaderboardsEnabled"}, false}; const Info RA_RICH_PRESENCE_ENABLED{ {System::Achievements, "Achievements", "RichPresenceEnabled"}, false}; +const Info RA_HARDCORE_ENABLED{{System::Achievements, "Achievements", "HardcoreEnabled"}, + false}; const Info RA_PROGRESS_ENABLED{{System::Achievements, "Achievements", "ProgressEnabled"}, false}; const Info RA_BADGES_ENABLED{{System::Achievements, "Achievements", "BadgesEnabled"}, false}; @@ -26,3 +29,5 @@ const Info RA_UNOFFICIAL_ENABLED{{System::Achievements, "Achievements", "U false}; const Info RA_ENCORE_ENABLED{{System::Achievements, "Achievements", "EncoreEnabled"}, false}; } // namespace Config + +#endif // USE_RETRO_ACHIEVEMENTS diff --git a/Source/Core/Core/Config/AchievementSettings.h b/Source/Core/Core/Config/AchievementSettings.h index b17d00c65f..15277ca043 100644 --- a/Source/Core/Core/Config/AchievementSettings.h +++ b/Source/Core/Core/Config/AchievementSettings.h @@ -1,6 +1,7 @@ // Copyright 2023 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#ifdef USE_RETRO_ACHIEVEMENTS #pragma once #include "Common/Config/Config.h" @@ -14,8 +15,11 @@ extern const Info RA_API_TOKEN; extern const Info RA_ACHIEVEMENTS_ENABLED; extern const Info RA_LEADERBOARDS_ENABLED; extern const Info RA_RICH_PRESENCE_ENABLED; +extern const Info RA_HARDCORE_ENABLED; extern const Info RA_PROGRESS_ENABLED; extern const Info RA_BADGES_ENABLED; extern const Info RA_UNOFFICIAL_ENABLED; extern const Info RA_ENCORE_ENABLED; } // namespace Config + +#endif // USE_RETRO_ACHIEVEMENTS