@@ -1506,6 +1506,60 @@ static void rcheevos_client_login_callback(int result,
15061506 }
15071507}
15081508
1509+ #ifdef HAVE_THREADS
1510+
1511+ void rcheevos_download_next_badge (retro_task_t * task )
1512+ {
1513+ /* progress: 0 = unlocked images for achievements player hasn't earned
1514+ * 1 = locked images for achievements player hasn't earned
1515+ * 2 = unlocked images for achievements player has earned
1516+ */
1517+ const int bucket = (task -> progress == 2 ) ? RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED : RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED ;
1518+ const rc_client_achievement_t * first_locked_achievement =
1519+ rc_client_get_next_achievement_info (rcheevos_locals .client , task -> user_data , bucket );
1520+
1521+ while (first_locked_achievement )
1522+ {
1523+ bool result ;
1524+
1525+ if (task -> progress == 1 )
1526+ {
1527+ char locked_name [24 ];
1528+ snprintf (locked_name , sizeof (locked_name ), "%s_lock" , first_locked_achievement -> badge_name );
1529+ result = rcheevos_client_download_badge_from_url (first_locked_achievement -> badge_locked_url , locked_name );
1530+ }
1531+ else
1532+ {
1533+ result = rcheevos_client_download_badge_from_url (first_locked_achievement -> badge_url , first_locked_achievement -> badge_name );
1534+ }
1535+
1536+ if (result )
1537+ break ;
1538+
1539+ first_locked_achievement =
1540+ rc_client_get_next_achievement_info (rcheevos_locals .client , first_locked_achievement , bucket );
1541+ }
1542+
1543+ if (!first_locked_achievement )
1544+ {
1545+ if (task -> progress == 2 || !rcheevos_is_game_loaded ())
1546+ {
1547+ /* mark task as complete so it will get cleaned up */
1548+ task_set_flags (task , RETRO_TASK_FLG_FINISHED , true);
1549+ return ;
1550+ }
1551+
1552+ task -> user_data = NULL ; /* restart list */
1553+ task -> progress ++ ;
1554+ }
1555+
1556+ /* wait 10 seconds, then download the next badge */
1557+ task -> user_data = (void * )first_locked_achievement ;
1558+ task -> when = cpu_features_get_time_usec () + 10 * 1000000 ;
1559+ }
1560+
1561+ #endif
1562+
15091563static void rcheevos_finalize_game_load (rc_client_t * client )
15101564{
15111565 settings_t * settings = config_get_ptr ();
@@ -1522,6 +1576,9 @@ static void rcheevos_finalize_game_load(rc_client_t* client)
15221576 const rc_client_achievement_t * first_locked_achievement = NULL ;
15231577 const rc_client_game_t * game = rc_client_get_game_info (client );
15241578 char badge [32 ];
1579+ #ifdef HAVE_THREADS
1580+ retro_task_t * task ;
1581+ #endif
15251582
15261583 badge [0 ] = 'i' ;
15271584 strlcpy (& badge [1 ], game -> badge_name , sizeof (badge ) - 1 );
@@ -1531,6 +1588,17 @@ static void rcheevos_finalize_game_load(rc_client_t* client)
15311588 first_locked_achievement = rc_client_get_next_achievement_info (client , NULL , RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED );
15321589 if (first_locked_achievement )
15331590 rcheevos_client_download_badge_from_url (first_locked_achievement -> badge_url , first_locked_achievement -> badge_name );
1591+
1592+ #ifdef HAVE_THREADS
1593+ task = task_init ();
1594+ if (task )
1595+ {
1596+ task -> handler = rcheevos_download_next_badge ;
1597+ task -> user_data = (void * )first_locked_achievement ;
1598+ task -> when = cpu_features_get_time_usec () + 5 * 60 * 1000000 ; /* five minutes */
1599+ task_queue_push (task );
1600+ }
1601+ #endif
15341602 }
15351603
15361604 if (!rc_client_is_processing_required (client ))
0 commit comments