summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2023-10-19 19:29:56 +0200
committerGitHub <noreply@github.com>2023-10-19 19:29:56 +0200
commit60e3b4c0932ca963c67922cd7deb5d7e90732b92 (patch)
treec081f14f909f6451d3d29e3ff1479ee21028831b /Source/Core
parentc87b2e46b4e51b9aeeebceb8638f0c14b8c1e8ce (diff)
parentdb784374989e07ce0aaef932443e9a58545fa756 (diff)
Merge pull request #12196 from LillyJadeKatrin/retroachievements-on-screen-images
RetroAchievements - On Screen Images
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/AchievementManager.cpp90
-rw-r--r--Source/Core/Core/AchievementManager.h3
2 files changed, 72 insertions, 21 deletions
diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp
index d5acdc84e9..54671a1388 100644
--- a/Source/Core/Core/AchievementManager.cpp
+++ b/Source/Core/Core/AchievementManager.cpp
@@ -5,12 +5,15 @@
#include "Core/AchievementManager.h"
+#include <memory>
+
#include <fmt/format.h>
#include <rcheevos/include/rc_api_info.h>
#include <rcheevos/include/rc_hash.h>
#include "Common/HttpRequest.h"
+#include "Common/Image.h"
#include "Common/Logging/Log.h"
#include "Common/WorkQueueThread.h"
#include "Core/Config/AchievementSettings.h"
@@ -23,6 +26,8 @@
static constexpr bool hardcore_mode_enabled = false;
+static std::unique_ptr<OSD::Icon> DecodeBadgeToOSDIcon(const AchievementManager::Badge& badge);
+
AchievementManager* AchievementManager::GetInstance()
{
static AchievementManager s_instance;
@@ -190,27 +195,11 @@ void AchievementManager::LoadGameByFilenameAsync(const std::string& iso_path,
{
std::lock_guard lg{m_lock};
m_is_game_loaded = true;
+ m_framecount = 0;
LoadUnlockData([](ResponseType r_type) {});
ActivateDeactivateAchievements();
ActivateDeactivateLeaderboards();
ActivateDeactivateRichPresence();
- PointSpread spread = TallyScore();
- if (hardcore_mode_enabled)
- {
- OSD::AddMessage(fmt::format("You have {}/{} achievements worth {}/{} points",
- spread.hard_unlocks, spread.total_count, spread.hard_points,
- spread.total_points),
- OSD::Duration::VERY_LONG, OSD::Color::YELLOW);
- OSD::AddMessage("Hardcore mode is ON", OSD::Duration::VERY_LONG, OSD::Color::YELLOW);
- }
- else
- {
- OSD::AddMessage(fmt::format("You have {}/{} achievements worth {}/{} points",
- spread.hard_unlocks + spread.soft_unlocks, spread.total_count,
- spread.hard_points + spread.soft_points, spread.total_points),
- OSD::Duration::VERY_LONG, OSD::Color::CYAN);
- OSD::AddMessage("Hardcore mode is OFF", OSD::Duration::VERY_LONG, OSD::Color::CYAN);
- }
}
FetchBadges();
// Reset this to zero so that RP immediately triggers on the first frame
@@ -552,6 +541,14 @@ void AchievementManager::DoFrame()
{
if (!m_is_game_loaded)
return;
+ if (m_framecount == 0x200)
+ {
+ DisplayWelcomeMessage();
+ }
+ if (m_framecount <= 0x200)
+ {
+ m_framecount++;
+ }
Core::RunAsCPUThread([&] {
rc_runtime_do_frame(
&m_runtime,
@@ -1184,6 +1181,33 @@ AchievementManager::PingRichPresence(const RichPresence& rich_presence)
return r_type;
}
+void AchievementManager::DisplayWelcomeMessage()
+{
+ std::lock_guard lg{m_lock};
+ PointSpread spread = TallyScore();
+ if (hardcore_mode_enabled)
+ {
+ OSD::AddMessage(
+ fmt::format("You have {}/{} achievements worth {}/{} points", spread.hard_unlocks,
+ spread.total_count, spread.hard_points, spread.total_points),
+ OSD::Duration::VERY_LONG, OSD::Color::YELLOW,
+ (Config::Get(Config::RA_BADGES_ENABLED)) ? DecodeBadgeToOSDIcon(m_game_badge.badge) :
+ nullptr);
+ OSD::AddMessage("Hardcore mode is ON", OSD::Duration::VERY_LONG, OSD::Color::YELLOW);
+ }
+ else
+ {
+ OSD::AddMessage(fmt::format("You have {}/{} achievements worth {}/{} points",
+ spread.hard_unlocks + spread.soft_unlocks, spread.total_count,
+ spread.hard_points + spread.soft_points, spread.total_points),
+ OSD::Duration::VERY_LONG, OSD::Color::CYAN,
+ (Config::Get(Config::RA_BADGES_ENABLED)) ?
+ DecodeBadgeToOSDIcon(m_game_badge.badge) :
+ nullptr);
+ OSD::AddMessage("Hardcore mode is OFF", OSD::Duration::VERY_LONG, OSD::Color::CYAN);
+ }
+}
+
void AchievementManager::HandleAchievementTriggeredEvent(const rc_runtime_event_t* runtime_event)
{
const auto event_id = runtime_event->id;
@@ -1199,19 +1223,26 @@ void AchievementManager::HandleAchievementTriggeredEvent(const rc_runtime_event_
OSD::AddMessage(fmt::format("Unlocked: {} ({})", m_game_data.achievements[game_data_index].title,
m_game_data.achievements[game_data_index].points),
OSD::Duration::VERY_LONG,
- (hardcore_mode_enabled) ? OSD::Color::YELLOW : OSD::Color::CYAN);
+ (hardcore_mode_enabled) ? OSD::Color::YELLOW : OSD::Color::CYAN,
+ (Config::Get(Config::RA_BADGES_ENABLED)) ?
+ DecodeBadgeToOSDIcon(it->second.unlocked_badge.badge) :
+ nullptr);
PointSpread spread = TallyScore();
if (spread.hard_points == spread.total_points)
{
OSD::AddMessage(
fmt::format("Congratulations! {} has mastered {}", m_display_name, m_game_data.title),
- OSD::Duration::VERY_LONG, OSD::Color::YELLOW);
+ OSD::Duration::VERY_LONG, OSD::Color::YELLOW,
+ (Config::Get(Config::RA_BADGES_ENABLED)) ? DecodeBadgeToOSDIcon(m_game_badge.badge) :
+ nullptr);
}
else if (spread.hard_points + spread.soft_points == spread.total_points)
{
OSD::AddMessage(
fmt::format("Congratulations! {} has completed {}", m_display_name, m_game_data.title),
- OSD::Duration::VERY_LONG, OSD::Color::CYAN);
+ OSD::Duration::VERY_LONG, OSD::Color::CYAN,
+ (Config::Get(Config::RA_BADGES_ENABLED)) ? DecodeBadgeToOSDIcon(m_game_badge.badge) :
+ nullptr);
}
ActivateDeactivateAchievement(event_id, Config::Get(Config::RA_ACHIEVEMENTS_ENABLED),
Config::Get(Config::RA_UNOFFICIAL_ENABLED),
@@ -1240,7 +1271,10 @@ void AchievementManager::HandleAchievementProgressUpdatedEvent(
}
OSD::AddMessage(
fmt::format("{} {}", m_game_data.achievements[game_data_index].title, value.data()),
- OSD::Duration::VERY_LONG, OSD::Color::GREEN);
+ OSD::Duration::VERY_LONG, OSD::Color::GREEN,
+ (Config::Get(Config::RA_BADGES_ENABLED)) ?
+ DecodeBadgeToOSDIcon(it->second.unlocked_badge.badge) :
+ nullptr);
}
void AchievementManager::HandleLeaderboardStartedEvent(const rc_runtime_event_t* runtime_event)
@@ -1388,4 +1422,18 @@ AchievementManager::RequestImage(rc_api_fetch_image_request_t rc_request, Badge*
}
}
+static std::unique_ptr<OSD::Icon> DecodeBadgeToOSDIcon(const AchievementManager::Badge& badge)
+{
+ if (badge.empty())
+ return nullptr;
+
+ auto icon = std::make_unique<OSD::Icon>();
+ if (!Common::LoadPNG(badge, &icon->rgba_data, &icon->width, &icon->height))
+ {
+ ERROR_LOG_FMT(ACHIEVEMENTS, "Error decoding badge.");
+ return nullptr;
+ }
+ return icon;
+}
+
#endif // USE_RETRO_ACHIEVEMENTS
diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h
index b5c1eee200..be2469dc9e 100644
--- a/Source/Core/Core/AchievementManager.h
+++ b/Source/Core/Core/AchievementManager.h
@@ -155,6 +155,8 @@ private:
ResponseType SubmitLeaderboard(AchievementId leaderboard_id, int value);
ResponseType PingRichPresence(const RichPresence& rich_presence);
+ void DisplayWelcomeMessage();
+
void HandleAchievementTriggeredEvent(const rc_runtime_event_t* runtime_event);
void HandleAchievementProgressUpdatedEvent(const rc_runtime_event_t* runtime_event);
void HandleLeaderboardStartedEvent(const rc_runtime_event_t* runtime_event);
@@ -178,6 +180,7 @@ private:
u32 m_game_id = 0;
rc_api_fetch_game_data_response_t m_game_data{};
bool m_is_game_loaded = false;
+ u32 m_framecount = 0;
BadgeStatus m_game_badge;
RichPresence m_rich_presence;
time_t m_last_ping_time = 0;