From 3b61b6d81690a715327c4cf7329538424b0df023 Mon Sep 17 00:00:00 2001 From: LillyJadeKatrin Date: Mon, 13 May 2024 18:53:06 -0400 Subject: [PATCH] Add Default Achievement Badges The defaults get loaded in by Dolphin at emulator start, and are used if the badge that would normally be displayed has not for whatever reason been downloaded yet. Badges attached to this PR are placeholders (MayIMilae is designing permanent badges) and reside in Sys\Load\RetroAchievements. --- Data/Sys/Resources/achievements_game.png | Bin 0 -> 460 bytes Data/Sys/Resources/achievements_locked.png | Bin 0 -> 235 bytes Data/Sys/Resources/achievements_player.png | Bin 0 -> 335 bytes Data/Sys/Resources/achievements_unlocked.png | Bin 0 -> 235 bytes Source/Core/Core/AchievementManager.cpp | 89 ++++++++++++++----- Source/Core/Core/AchievementManager.h | 9 ++ 6 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 Data/Sys/Resources/achievements_game.png create mode 100644 Data/Sys/Resources/achievements_locked.png create mode 100644 Data/Sys/Resources/achievements_player.png create mode 100644 Data/Sys/Resources/achievements_unlocked.png diff --git a/Data/Sys/Resources/achievements_game.png b/Data/Sys/Resources/achievements_game.png new file mode 100644 index 0000000000000000000000000000000000000000..624c3a917d1b8bcb726ec283180320fc0bb1bf91 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0y~yU`POAMrH;Eh8tl|s~H#=*aCb)Tp1V`{{R2K^yd7# z3=E8oo-U3d7XE9mY|K4kz{B7mrFF$sSwne=&+U<>dGab;j&`2YX^(wp<| zGB7YK@N{tu(FoppaU<_x1p(Fz{TdpQje!!pZpk8U3zj&<{9y0Q(QFNV(z3L@R{e+3 z6OlUSqpLoMWT$9M@=%u&%yCHn5LsXpjwcv#+0k@4)_8!JO& zmiSF?=DGT~uXn%LvLg4uX&#v<>#ikzYZmQQTw8HHkyG~K#BFUGCckyA&{+16yP}6b zA=hI4Z>c+8_U|8Dd-1t4FWKGug-2S~E3u@BF87u{SUfwdC?v-v*OkvDQd23DJ#b6$ zBXKPqb)&6Y#Lnr2KYV&_!Rw1E#d5Vdy7OQ4vSogmwzQRv?`EThdBN{c(>wJo{hZr9 zFVAtDBKsl#^?{FePCB1oeLl3&)TMbl?>(X4b$ssET9p>OHPH{y=2*now30*2<25V$ qlQ!8`)5ZTVeDIz9#j3s|zVX+q_QP%aFETJNFnGH9xvXU<>dGas7Xi@Bjb*uE$Sy zFfcGI@N{tu(FoppaU<_x1p(Fz{TdpQje!!pZpk8U3zj&<{9y0Q(QFNV(z3L@R{e+3 z6OlUSqpLoMWT$9M@=%u&% #include +#include "Common/CommonPaths.h" +#include "Common/FileUtil.h" #include "Common/Image.h" #include "Common/Logging/Log.h" #include "Common/ScopeGuard.h" @@ -35,6 +37,7 @@ AchievementManager& AchievementManager::GetInstance() void AchievementManager::Init() { + LoadDefaultBadges(); if (!m_client && Config::Get(Config::RA_ENABLED)) { m_client = rc_client_create(MemoryPeeker, Request); @@ -499,6 +502,55 @@ void AchievementManager::FilereaderClose(void* file_handle) delete static_cast(file_handle); } +void AchievementManager::LoadDefaultBadges() +{ + std::lock_guard lg{m_lock}; + + std::string directory = File::GetSysDirectory() + DIR_SEP + RESOURCES_DIR + DIR_SEP; + + if (m_default_player_badge.data.empty()) + { + if (!LoadPNGTexture(&m_default_player_badge, + fmt::format("{}{}", directory, DEFAULT_PLAYER_BADGE_FILENAME))) + { + ERROR_LOG_FMT(ACHIEVEMENTS, "Default player badge '{}' failed to load", + DEFAULT_PLAYER_BADGE_FILENAME); + } + } + m_player_badge.badge = m_default_player_badge; + + if (m_default_game_badge.data.empty()) + { + if (!LoadPNGTexture(&m_default_game_badge, + fmt::format("{}{}", directory, DEFAULT_GAME_BADGE_FILENAME))) + { + ERROR_LOG_FMT(ACHIEVEMENTS, "Default game badge '{}' failed to load", + DEFAULT_GAME_BADGE_FILENAME); + } + } + m_game_badge.badge = m_default_game_badge; + + if (m_default_unlocked_badge.data.empty()) + { + if (!LoadPNGTexture(&m_default_unlocked_badge, + fmt::format("{}{}", directory, DEFAULT_UNLOCKED_BADGE_FILENAME))) + { + ERROR_LOG_FMT(ACHIEVEMENTS, "Default unlocked achievement badge '{}' failed to load", + DEFAULT_UNLOCKED_BADGE_FILENAME); + } + } + + if (m_default_locked_badge.data.empty()) + { + if (!LoadPNGTexture(&m_default_locked_badge, + fmt::format("{}{}", directory, DEFAULT_LOCKED_BADGE_FILENAME))) + { + ERROR_LOG_FMT(ACHIEVEMENTS, "Default locked achievement badge '{}' failed to load", + DEFAULT_LOCKED_BADGE_FILENAME); + } + } +} + void AchievementManager::LoginCallback(int result, const char* error_message, rc_client_t* client, void* userdata) { @@ -669,14 +721,13 @@ void AchievementManager::DisplayWelcomeMessage() void AchievementManager::HandleAchievementTriggeredEvent(const rc_client_event_t* client_event) { - OSD::AddMessage( - fmt::format("Unlocked: {} ({})", client_event->achievement->title, - client_event->achievement->points), - OSD::Duration::VERY_LONG, - (rc_client_get_hardcore_enabled(AchievementManager::GetInstance().m_client)) ? - OSD::Color::YELLOW : - OSD::Color::CYAN, - &AchievementManager::GetInstance().m_unlocked_badges[client_event->achievement->id].badge); + const auto& instance = AchievementManager::GetInstance(); + OSD::AddMessage(fmt::format("Unlocked: {} ({})", client_event->achievement->title, + client_event->achievement->points), + OSD::Duration::VERY_LONG, + (rc_client_get_hardcore_enabled(instance.m_client)) ? OSD::Color::YELLOW : + OSD::Color::CYAN, + &instance.GetAchievementBadge(client_event->achievement->id, false).badge); } void AchievementManager::HandleLeaderboardStartedEvent(const rc_client_event_t* client_event) @@ -733,13 +784,11 @@ void AchievementManager::HandleLeaderboardTrackerHideEvent(const rc_client_event void AchievementManager::HandleAchievementChallengeIndicatorShowEvent( const rc_client_event_t* client_event) { - auto& unlocked_badges = AchievementManager::GetInstance().m_unlocked_badges; - if (const auto unlocked_iter = unlocked_badges.find(client_event->achievement->id); - unlocked_iter != unlocked_badges.end()) - { - AchievementManager::GetInstance().m_active_challenges[client_event->achievement->badge_name] = - &unlocked_iter->second.badge; - } + auto& instance = AchievementManager::GetInstance(); + instance.m_active_challenges[client_event->achievement->badge_name] = + &AchievementManager::GetInstance() + .GetAchievementBadge(client_event->achievement->id, false) + .badge; } void AchievementManager::HandleAchievementChallengeIndicatorHideEvent( @@ -752,11 +801,11 @@ void AchievementManager::HandleAchievementChallengeIndicatorHideEvent( void AchievementManager::HandleAchievementProgressIndicatorShowEvent( const rc_client_event_t* client_event) { - OSD::AddMessage( - fmt::format("{} {}", client_event->achievement->title, - client_event->achievement->measured_progress), - OSD::Duration::SHORT, OSD::Color::GREEN, - &AchievementManager::GetInstance().m_unlocked_badges[client_event->achievement->id].badge); + const auto& instance = AchievementManager::GetInstance(); + OSD::AddMessage(fmt::format("{} {}", client_event->achievement->title, + client_event->achievement->measured_progress), + OSD::Duration::SHORT, OSD::Color::GREEN, + &instance.GetAchievementBadge(client_event->achievement->id, false).badge); } void AchievementManager::HandleGameCompletedEvent(const rc_client_event_t* client_event, diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h index e7aaa672e3..17abceeaa8 100644 --- a/Source/Core/Core/AchievementManager.h +++ b/Source/Core/Core/AchievementManager.h @@ -53,6 +53,10 @@ public: Badge badge{}; }; + static constexpr std::string_view DEFAULT_PLAYER_BADGE_FILENAME = "achievements_player.png"; + static constexpr std::string_view DEFAULT_GAME_BADGE_FILENAME = "achievements_game.png"; + static constexpr std::string_view DEFAULT_LOCKED_BADGE_FILENAME = "achievements_locked.png"; + static constexpr std::string_view DEFAULT_UNLOCKED_BADGE_FILENAME = "achievements_unlocked.png"; static constexpr std::string_view GRAY = "transparent"; static constexpr std::string_view GOLD = "#FFD700"; static constexpr std::string_view BLUE = "#0B71C1"; @@ -137,6 +141,7 @@ private: static size_t FilereaderRead(void* file_handle, void* buffer, size_t requested_bytes); static void FilereaderClose(void* file_handle); + void LoadDefaultBadges(); static void LoginCallback(int result, const char* error_message, rc_client_t* client, void* userdata); @@ -181,6 +186,10 @@ private: bool m_is_runtime_initialized = false; UpdateCallback m_update_callback = [](const UpdatedItems&) {}; std::unique_ptr m_loading_volume; + Badge m_default_player_badge; + Badge m_default_game_badge; + Badge m_default_unlocked_badge; + Badge m_default_locked_badge; BadgeStatus m_player_badge; Hash m_game_hash{}; u32 m_game_id = 0;