@@ -102,7 +102,9 @@ static rcheevos_locals_t rcheevos_locals =
102102 true, /* hardcore_allowed */
103103 false,/* hardcore_requires_reload */
104104 false,/* hardcore_being_enabled */
105- true /* core_supports */
105+ true, /* core_supports */
106+ false,/* badges_loaded */
107+ false /* badges_loading */
106108};
107109
108110rcheevos_locals_t * get_rcheevos_locals (void )
@@ -227,25 +229,24 @@ bool rcheevos_is_pause_allowed(void)
227229 return rc_client_can_pause (rcheevos_locals .client , NULL );
228230}
229231
230- static void rcheevos_show_mastery_placard ( void )
232+ static void rcheevos_show_completion_placard ( const char * title , const char * badge_name )
231233{
232234 const settings_t * settings = config_get_ptr ();
233235 if (settings -> bools .cheevos_visibility_mastery )
234236 {
235- const rc_client_game_t * game = rc_client_get_game_info (rcheevos_locals .client );
236- char title [256 ];
237- size_t _len = snprintf (title , sizeof (title ),
237+ char message [256 ];
238+ size_t _len = snprintf (message , sizeof (message ),
238239 msg_hash_to_str (rc_client_get_hardcore_enabled (rcheevos_locals .client )
239240 ? MSG_CHEEVOS_MASTERED_GAME
240241 : MSG_CHEEVOS_COMPLETED_GAME ),
241- game -> title );
242- title [sizeof (title ) - 1 ] = '\0' ;
242+ title );
243+ message [sizeof (message ) - 1 ] = '\0' ;
243244
244245#if defined (HAVE_GFX_WIDGETS )
245246 if (gfx_widgets_ready ())
246247 {
247248 char msg [128 ];
248- char badge_name [32 ];
249+ char badge [32 ];
249250 const char * displayname = rc_client_get_user_info (rcheevos_locals .client )-> display_name ;
250251 const bool content_runtime_log = settings -> bools .content_runtime_log ;
251252 const bool content_runtime_log_aggr = settings -> bools .content_runtime_log_aggregate ;
@@ -276,9 +277,10 @@ static void rcheevos_show_mastery_placard(void)
276277 }
277278 }
278279
279- __len = strlcpy (badge_name , "i" , sizeof (badge_name ));
280- strlcpy (badge_name + __len , game -> badge_name , sizeof (badge_name ) - __len );
281- gfx_widgets_push_achievement (title , msg , badge_name );
280+ /* badge image = "iBADGENAME" */
281+ badge [0 ] = 'i' ;
282+ strlcpy (& badge [1 ], badge_name , sizeof (badge ) - 1 );
283+ gfx_widgets_push_achievement (title , msg , badge );
282284 }
283285 else
284286#endif
@@ -287,6 +289,22 @@ static void rcheevos_show_mastery_placard(void)
287289 }
288290}
289291
292+ static void rcheevos_show_mastery_placard (void )
293+ {
294+ const rc_client_game_t * game = rc_client_get_game_info (rcheevos_locals .client );
295+ rcheevos_show_completion_placard (game -> title , game -> badge_name );
296+ }
297+
298+ static void rcheevos_show_subset_completion_placard (const rc_client_subset_t * subset )
299+ {
300+ char badge [32 ];
301+ badge [0 ] = 'i' ;
302+ strlcpy (& badge [1 ], subset -> badge_name , sizeof (badge ) - 1 );
303+ rcheevos_client_download_badge_from_url (subset -> badge_url , badge );
304+
305+ rcheevos_show_completion_placard (subset -> title , subset -> badge_name );
306+ }
307+
290308static void rcheevos_award_achievement (const rc_client_achievement_t * cheevo )
291309{
292310 const settings_t * settings = config_get_ptr ();
@@ -588,6 +606,9 @@ static void rcheevos_client_event_handler(const rc_client_event_t* event, rc_cli
588606 case RC_CLIENT_EVENT_GAME_COMPLETED :
589607 rcheevos_show_mastery_placard ();
590608 break ;
609+ case RC_CLIENT_EVENT_SUBSET_COMPLETED :
610+ rcheevos_show_subset_completion_placard (event -> subset );
611+ break ;
591612 case RC_CLIENT_EVENT_SERVER_ERROR :
592613 rcheevos_server_error (event -> server_error -> api , event -> server_error -> error_message );
593614 break ;
@@ -703,6 +724,8 @@ bool rcheevos_unload(void)
703724
704725 if (was_loaded )
705726 {
727+ rcheevos_locals .badges_loaded = rcheevos_locals .badges_loading = false;
728+
706729#ifdef HAVE_MENU
707730 rcheevos_menu_reset_badges ();
708731
@@ -1268,9 +1291,8 @@ static void rcheevos_show_game_placard(void)
12681291 if (gfx_widgets_ready ())
12691292 {
12701293 char badge_name [32 ];
1271- size_t __len = strlcpy (badge_name , "i" , sizeof (badge_name ));
1272- strlcpy (badge_name + __len , game -> badge_name ,
1273- sizeof (badge_name ) - __len );
1294+ badge_name [0 ] = 'i' ;
1295+ strlcpy (& badge_name [1 ], game -> badge_name , sizeof (badge_name ) - 1 );
12741296 gfx_widgets_push_achievement (game -> title , msg , badge_name );
12751297 }
12761298 else
@@ -1406,13 +1428,21 @@ static void rcheevos_finalize_game_load(rc_client_t* client)
14061428 settings_t * settings = config_get_ptr ();
14071429 bool want_badges = settings -> bools .cheevos_badges_enable ;
14081430#if !defined(HAVE_GFX_WIDGETS )
1409- /* Then badges are only needed for xmb and ozone menus */
1431+ /* Then badges are only needed for xmb, ozone, and rgui menus */
14101432 want_badges = want_badges &&
14111433 ( string_is_equal (settings -> arrays .menu_driver , "xmb" )
1412- || string_is_equal (settings -> arrays .menu_driver , "ozone" ));
1434+ || string_is_equal (settings -> arrays .menu_driver , "ozone" )
1435+ || string_is_equal (settings -> arrays .menu_driver , "rgui" ));
14131436#endif
1414- if (want_badges )
1415- rcheevos_client_download_achievement_badges (client );
1437+ if (want_badges ) /* prefetch the game badge */
1438+ {
1439+ const rc_client_game_t * game = rc_client_get_game_info (client );
1440+ char badge [32 ];
1441+
1442+ badge [0 ] = 'i' ;
1443+ strlcpy (& badge [1 ], game -> badge_name , sizeof (badge ) - 1 );
1444+ rcheevos_client_download_badge_from_url (game -> badge_url , badge );
1445+ }
14161446
14171447 if (!rc_client_is_processing_required (client ))
14181448 {
0 commit comments