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 zcmV;-0W2G`Ja7*`Nz~k$(%p{e;@%EMFTov9IF`g?@Ff)n8vj|o z2)J?BJqW60WGBdyoqr;vz(6C|IeBl}K$o)%M)}`~(Ii;6ITBFNYzc(wM&#ldlBT%I zD3T_7bPP$8LSy7OvV2)Wn)$6!ph3ZHM6ULxD6TlhT@aFg5Two$_m~J$TIC!H>I!~L zR7c@nBQ!2Lo8t1@MB0i^3V_eZpNaPdB?5XX)8v4r1_9DN7ptIq&VHhL^m|ayJwrV4 zvh@qh748D(`x(vke#vu!yUyT3xi;>DR=pse*k!l~R(il+adZczD@WfZj3Q~{`8@QI zJmIE~k&pR}@#uMaj-gP50U4L-2dY0tjEZKUBAjE{Wh}K)8Q8uJ?9W5KjQ_G2<+?J< zGPSXz@p%E))s&^R6U#a;i@v-9_&R@Jd2Q(VU;F@Bos3MQ{Y%^c0000@jRu?6^qxB}__|Nk$&IsYz@wZPNG zF+?MH>&1<{hZO`^FZ63@NHzva@VX_7xGh-X5c7k*Ge@&E_({vs_FDBHMo&cQoR6;h zAd;P;G08(+N-)3U5c{2vx;IWRp7@~Tx^70;kr%Z+Rg9TAPXgvH`c$xpG0?DK$qWN^ zzpv~z-_B>`UnvOq<5*U-|Hg(JFZ7nrJv4oV#>Ss>O-i?KK7G!P_qx;eKf4Z`GcEfm i-ufZ_<4eo0Ec&9_UAYAgp)-JPW$<+Mb6Mw<&;$U4bYYVK literal 0 HcmV?d00001 diff --git a/Data/Sys/Resources/achievements_player.png b/Data/Sys/Resources/achievements_player.png new file mode 100644 index 0000000000000000000000000000000000000000..d99412b839e7c00a51d8fa97ae88ad1dfdac2eec GIT binary patch literal 335 zcmV-V0kHmwP)^d;cJilmOLqP-!lc-LVG9nq1thOm?ELwG2r;R|?- z4`6LLulpL@NK0;=MBb<1qnlQ8RBS|TMGiz+DI#eHQM7a7 z7b+|#GPSf8&Ma5q<<6k%(Ij&oeQYhC>Wv0z^p>TC1`gSQC^vBXRW;mygpUcgNz%j3oLM-#@^TM$;M1!{t-V*zM4oB97BB1RwFHkE8q5*=b2o^}|1qbAY9qN}C h`~dJxoAf$=h+l#F>W9OIztI2y002ovPDHLkV1lzal9&Jh literal 0 HcmV?d00001 diff --git a/Data/Sys/Resources/achievements_unlocked.png b/Data/Sys/Resources/achievements_unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..e95e60558a1c7f8de88eeac45c61a3abf8700b06 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxc)!M_y7NY*W)KUfFcV# zT^vI+g127W$a`2pfb~MZhK6Kgpaid5vWVM)B@Qt^*gJDHTZ5mpEN!n<|6%k*q|W*1 zst+RBDH@YJ)TIRTI}Wkm`KWv21mlShO0Mf>gdKTN+f&7une!xI?xIfxix>k98bfIoG6g`{vWh jpW>|_;y=E${K}#)s@;`a;1D_k=vD?#S3j3^P6 #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;