Achievements: Show unconfirmed unlocks in pause menu

This commit is contained in:
Stenzek 2025-03-29 19:47:22 +10:00
parent 37230107f4
commit b4ae19411b
No known key found for this signature in database
4 changed files with 71 additions and 17 deletions

View File

@ -141,6 +141,11 @@ RC_EXPORT void RC_CCONV rc_client_abort_async(rc_client_t* client, rc_client_asy
*/ */
RC_EXPORT size_t RC_CCONV rc_client_get_user_agent_clause(rc_client_t* client, char buffer[], size_t buffer_size); RC_EXPORT size_t RC_CCONV rc_client_get_user_agent_clause(rc_client_t* client, char buffer[], size_t buffer_size);
/**
* Returns true if any achievement submissions have failed and are currently pending.
*/
RC_EXPORT int RC_CCONV rc_client_is_disconnected(rc_client_t* client);
/*****************************************************************************\ /*****************************************************************************\
| Logging | | Logging |
\*****************************************************************************/ \*****************************************************************************/
@ -503,6 +508,11 @@ RC_EXPORT void RC_CCONV rc_client_destroy_achievement_list(rc_client_achievement
*/ */
RC_EXPORT int RC_CCONV rc_client_has_achievements(rc_client_t* client); RC_EXPORT int RC_CCONV rc_client_has_achievements(rc_client_t* client);
/**
* Returns the number of outstanding achievement unlocks.
*/
RC_EXPORT int RC_CCONV rc_client_get_award_achievement_pending_count(rc_client_t* client);
/*****************************************************************************\ /*****************************************************************************\
| Leaderboards | | Leaderboards |
\*****************************************************************************/ \*****************************************************************************/

View File

@ -3941,6 +3941,20 @@ static int rc_client_is_award_achievement_pending(const rc_client_t* client, uin
return 0; return 0;
} }
int rc_client_get_award_achievement_pending_count(rc_client_t* client)
{
/* assume lock already held */
int count = 0;
rc_client_scheduled_callback_data_t* scheduled_callback = client->state.scheduled_callbacks;
for (; scheduled_callback; scheduled_callback = scheduled_callback->next)
{
if (scheduled_callback->callback == rc_client_award_achievement_retry)
count++;
}
return count;
}
static void rc_client_award_achievement_server_call(rc_client_award_achievement_callback_data_t* ach_data); static void rc_client_award_achievement_server_call(rc_client_award_achievement_callback_data_t* ach_data);
static void rc_client_award_achievement_retry(rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now) static void rc_client_award_achievement_retry(rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now)
@ -6411,3 +6425,8 @@ size_t rc_client_get_user_agent_clause(rc_client_t* client, char buffer[], size_
buffer[buffer_size - 1] = '\0'; buffer[buffer_size - 1] = '\0';
return result; return result;
} }
int rc_client_is_disconnected(rc_client_t* client)
{
return (client && (client->state.disconnect & (RC_CLIENT_DISCONNECT_VISIBLE | RC_CLIENT_DISCONNECT_SHOW_PENDING) != 0));
}

View File

@ -2576,6 +2576,8 @@ void Achievements::DrawPauseMenuOverlays(float start_pos_y)
const float progress_rounding = LayoutScale(5.0f); const float progress_rounding = LayoutScale(5.0f);
const float badge_size = LayoutScale(40.0f); const float badge_size = LayoutScale(40.0f);
const float badge_text_width = box_content_width - badge_size - text_spacing - text_spacing; const float badge_text_width = box_content_width - badge_size - text_spacing - text_spacing;
const bool disconnected = rc_client_is_disconnected(s_state.client);
const int pending_count = disconnected ? rc_client_get_award_achievement_pending_count(s_state.client) : 0;
ImDrawList* dl = ImGui::GetBackgroundDrawList(); ImDrawList* dl = ImGui::GetBackgroundDrawList();
@ -2589,6 +2591,10 @@ void Achievements::DrawPauseMenuOverlays(float start_pos_y)
float box_height = float box_height =
box_padding + box_padding + UIStyle.MediumFont->FontSize + paragraph_spacing + progress_height + paragraph_spacing; box_padding + box_padding + UIStyle.MediumFont->FontSize + paragraph_spacing + progress_height + paragraph_spacing;
if (pending_count > 0)
{
box_height += UIStyle.MediumFont->FontSize + paragraph_spacing;
}
if (s_state.most_recent_unlock) if (s_state.most_recent_unlock)
{ {
box_height += UIStyle.MediumFont->FontSize + paragraph_spacing + box_height += UIStyle.MediumFont->FontSize + paragraph_spacing +
@ -2664,6 +2670,16 @@ void Achievements::DrawPauseMenuOverlays(float start_pos_y)
progress_bb.Min.y + ((progress_bb.Max.y - progress_bb.Min.y) / 2.0f) - (text_size.y / 2.0f)), progress_bb.Min.y + ((progress_bb.Max.y - progress_bb.Min.y) / 2.0f) - (text_size.y / 2.0f)),
text_color, buffer.c_str(), buffer.end_ptr()); text_color, buffer.c_str(), buffer.end_ptr());
text_pos.y += progress_height + paragraph_spacing; text_pos.y += progress_height + paragraph_spacing;
if (pending_count > 0)
{
buffer.format(ICON_EMOJI_WARNING " {}",
TRANSLATE_PLURAL_SSTR("Achievements", "%n unlocks have not been confirmed by the server.",
"Pause Menu", pending_count));
dl->AddText(UIStyle.MediumFont, UIStyle.MediumFont->FontSize, text_pos, title_text_color, buffer.c_str(),
buffer.end_ptr());
text_pos.y += UIStyle.MediumFont->FontSize + paragraph_spacing;
}
} }
if (s_state.most_recent_unlock) if (s_state.most_recent_unlock)

View File

@ -16,7 +16,7 @@
<context> <context>
<name>Achievements</name> <name>Achievements</name>
<message numerus="yes"> <message numerus="yes">
<location filename="../../core/achievements.cpp" line="1348"/> <location filename="../../core/achievements.cpp" line="1401"/>
<source>You have unlocked {} of %n achievements</source> <source>You have unlocked {} of %n achievements</source>
<comment>Achievement popup</comment> <comment>Achievement popup</comment>
<translation> <translation>
@ -25,7 +25,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../core/achievements.cpp" line="1351"/> <location filename="../../core/achievements.cpp" line="1404"/>
<source>and earned {} of %n points</source> <source>and earned {} of %n points</source>
<comment>Achievement popup</comment> <comment>Achievement popup</comment>
<translation> <translation>
@ -34,7 +34,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../core/achievements.cpp" line="1443"/> <location filename="../../core/achievements.cpp" line="1504"/>
<source>%n achievements</source> <source>%n achievements</source>
<comment>Mastery popup</comment> <comment>Mastery popup</comment>
<translation> <translation>
@ -43,8 +43,8 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../core/achievements.cpp" line="1445"/> <location filename="../../core/achievements.cpp" line="1506"/>
<location filename="../../core/achievements.cpp" line="2843"/> <location filename="../../core/achievements.cpp" line="3067"/>
<source>%n points</source> <source>%n points</source>
<comment>Achievement points</comment> <comment>Achievement points</comment>
<translation> <translation>
@ -53,7 +53,16 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../core/achievements.cpp" line="2661"/> <location filename="../../core/achievements.cpp" line="2711"/>
<source>%n unlocks have not been confirmed by the server.</source>
<comment>Pause Menu</comment>
<translation>
<numerusform>%n unlock has not been confirmed by the server.</numerusform>
<numerusform>%n unlocks have not been confirmed by the server.</numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../../core/achievements.cpp" line="2876"/>
<source>You have unlocked all achievements and earned %n points!</source> <source>You have unlocked all achievements and earned %n points!</source>
<comment>Point count</comment> <comment>Point count</comment>
<translation> <translation>
@ -62,7 +71,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../core/achievements.cpp" line="3086"/> <location filename="../../core/achievements.cpp" line="3321"/>
<source>This game has %n leaderboards.</source> <source>This game has %n leaderboards.</source>
<comment>Leaderboard count</comment> <comment>Leaderboard count</comment>
<translation> <translation>
@ -74,7 +83,7 @@
<context> <context>
<name>Cheats</name> <name>Cheats</name>
<message numerus="yes"> <message numerus="yes">
<location filename="../../core/cheats.cpp" line="1005"/> <location filename="../../core/cheats.cpp" line="1014"/>
<source>%n game patches are active.</source> <source>%n game patches are active.</source>
<comment>OSD Message</comment> <comment>OSD Message</comment>
<translation> <translation>
@ -83,7 +92,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../core/cheats.cpp" line="1012"/> <location filename="../../core/cheats.cpp" line="1021"/>
<source>%n cheats are enabled. This may crash games.</source> <source>%n cheats are enabled. This may crash games.</source>
<comment>OSD Message</comment> <comment>OSD Message</comment>
<translation> <translation>
@ -92,7 +101,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../core/cheats.cpp" line="1039"/> <location filename="../../core/cheats.cpp" line="1048"/>
<source>%n cheats</source> <source>%n cheats</source>
<comment>Cheats blocked by hardcore mode</comment> <comment>Cheats blocked by hardcore mode</comment>
<translation> <translation>
@ -101,7 +110,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../../core/cheats.cpp" line="1041"/> <location filename="../../core/cheats.cpp" line="1050"/>
<source>%n patches</source> <source>%n patches</source>
<comment>Patches blocked by hardcore mode</comment> <comment>Patches blocked by hardcore mode</comment>
<translation> <translation>
@ -124,7 +133,7 @@
<context> <context>
<name>GPU_HW</name> <name>GPU_HW</name>
<message numerus="yes"> <message numerus="yes">
<location filename="../../core/gpu_hw_texture_cache.cpp" line="3615"/> <location filename="../../core/gpu_hw_texture_cache.cpp" line="3636"/>
<source>%n replacement textures found.</source> <source>%n replacement textures found.</source>
<comment>Replacement texture count</comment> <comment>Replacement texture count</comment>
<translation> <translation>
@ -136,8 +145,8 @@
<context> <context>
<name>GameList</name> <name>GameList</name>
<message numerus="yes"> <message numerus="yes">
<location filename="../gamelistmodel.cpp" line="343"/> <location filename="../gamelistwidget.cpp" line="345"/>
<location filename="../../core/game_list.cpp" line="1521"/> <location filename="../../core/game_list.cpp" line="1551"/>
<source>%n hours</source> <source>%n hours</source>
<translation> <translation>
<numerusform>%n hour</numerusform> <numerusform>%n hour</numerusform>
@ -145,8 +154,8 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../gamelistmodel.cpp" line="345"/> <location filename="../gamelistwidget.cpp" line="347"/>
<location filename="../../core/game_list.cpp" line="1523"/> <location filename="../../core/game_list.cpp" line="1553"/>
<source>%n minutes</source> <source>%n minutes</source>
<translation> <translation>
<numerusform>%n minute</numerusform> <numerusform>%n minute</numerusform>
@ -168,7 +177,7 @@
<context> <context>
<name>MemoryCardEditorWindow</name> <name>MemoryCardEditorWindow</name>
<message numerus="yes"> <message numerus="yes">
<location filename="../memorycardeditorwindow.cpp" line="316"/> <location filename="../memorycardeditorwindow.cpp" line="317"/>
<source>%n block(s) free%1</source> <source>%n block(s) free%1</source>
<translation> <translation>
<numerusform>%n block free%1</numerusform> <numerusform>%n block free%1</numerusform>