Achievements: Display notification on subset complete

This commit is contained in:
Stenzek 2025-04-10 21:32:26 +10:00
parent 6165b504b8
commit 8e73b1db7e
No known key found for this signature in database
1 changed files with 41 additions and 3 deletions

View File

@ -167,6 +167,7 @@ static void ClientEventHandler(const rc_client_event_t* event, rc_client_t* clie
static void HandleResetEvent(const rc_client_event_t* event);
static void HandleUnlockEvent(const rc_client_event_t* event);
static void HandleGameCompleteEvent(const rc_client_event_t* event);
static void HandleSubsetCompleteEvent(const rc_client_event_t* event);
static void HandleLeaderboardStartedEvent(const rc_client_event_t* event);
static void HandleLeaderboardFailedEvent(const rc_client_event_t* event);
static void HandleLeaderboardSubmittedEvent(const rc_client_event_t* event);
@ -959,6 +960,10 @@ void Achievements::ClientEventHandler(const rc_client_event_t* event, rc_client_
HandleGameCompleteEvent(event);
break;
case RC_CLIENT_EVENT_SUBSET_COMPLETED:
HandleSubsetCompleteEvent(event);
break;
case RC_CLIENT_EVENT_LEADERBOARD_STARTED:
HandleLeaderboardStartedEvent(event);
break;
@ -1530,15 +1535,14 @@ void Achievements::HandleGameCompleteEvent(const rc_client_event_t* event)
if (g_settings.achievements_notifications)
{
std::string title = fmt::format(TRANSLATE_FS("Achievements", "Mastered {}"), s_state.game_title);
std::string message = fmt::format(
TRANSLATE_FS("Achievements", "{0}, {1}"),
TRANSLATE_FS("Achievements", "Game complete.\n{0}, {1}."),
TRANSLATE_PLURAL_STR("Achievements", "%n achievements", "Mastery popup",
s_state.game_summary.num_unlocked_achievements),
TRANSLATE_PLURAL_STR("Achievements", "%n points", "Achievement points", s_state.game_summary.points_unlocked));
GPUThread::RunOnThread(
[title = std::move(title), message = std::move(message), icon = s_state.game_icon]() mutable {
[title = s_state.game_title, message = std::move(message), icon = s_state.game_icon]() mutable {
if (!FullscreenUI::Initialize())
return;
@ -1548,6 +1552,40 @@ void Achievements::HandleGameCompleteEvent(const rc_client_event_t* event)
}
}
void Achievements::HandleSubsetCompleteEvent(const rc_client_event_t* event)
{
INFO_LOG("Subset {} ({}) complete", event->subset->title, event->subset->id);
UpdateGameSummary(false, false);
if (g_settings.achievements_notifications)
{
// Need to grab the icon for the subset.
std::string badge_path;
if (const std::string_view badge_url = event->subset->badge_url; !badge_url.empty())
{
badge_path = GetLocalImagePath(event->subset->badge_name, RC_IMAGE_TYPE_GAME);
if (!badge_path.empty() && !FileSystem::FileExists(badge_path.c_str()))
DownloadImage(std::string(badge_url), badge_path);
}
std::string title = event->subset->title;
std::string message = fmt::format(
TRANSLATE_FS("Achievements", "Subset complete.\n{0}, {1}."),
TRANSLATE_PLURAL_STR("Achievements", "%n achievements", "Mastery popup",
s_state.game_summary.num_unlocked_achievements),
TRANSLATE_PLURAL_STR("Achievements", "%n points", "Achievement points", s_state.game_summary.points_unlocked));
GPUThread::RunOnThread(
[title = std::move(title), message = std::move(message), badge_path = std::move(badge_path)]() mutable {
if (!FullscreenUI::Initialize())
return;
ImGuiFullscreen::AddNotification("achievement_mastery", GAME_COMPLETE_NOTIFICATION_TIME, std::move(title),
std::move(message), std::move(badge_path));
});
}
}
void Achievements::HandleLeaderboardStartedEvent(const rc_client_event_t* event)
{
DEV_LOG("Leaderboard {} ({}) started", event->leaderboard->id, event->leaderboard->title);