diff --git a/src/core/fullscreenui_achievements.cpp b/src/core/fullscreenui_achievements.cpp index 0bd87f48f..143e2f9fb 100644 --- a/src/core/fullscreenui_achievements.cpp +++ b/src/core/fullscreenui_achievements.cpp @@ -68,7 +68,7 @@ static bool IsCoreSubsetOpen(); static void SetCurrentSubsetID(u32 subset_id); static void DrawSubsetSelector(); template -static void CollectSubsetsFromList(const T* list); +static void CollectSubsetsFromList(const T* list, bool include_achievements, bool include_leaderboards); template static bool IsBucketVisibleInCurrentSubset(const T& bucket); @@ -727,12 +727,31 @@ void FullscreenUI::SetCurrentSubsetID(u32 subset_id) } template -void FullscreenUI::CollectSubsetsFromList(const T* list) +void FullscreenUI::CollectSubsetsFromList(const T* list, bool include_achievements, bool include_leaderboards) { s_achievements_locals.open_subset = nullptr; s_achievements_locals.subset_info_list.clear(); - if (std::any_of(list->buckets, list->buckets + list->num_buckets, - [&list](const auto& it) { return it.subset_id != list->buckets[0].subset_id; })) + + // Prefer rc_client grabbing subsets if possible. Old external clients won't support this. + rc_client_subset_list_t* subset_list = rc_client_create_subset_list(Achievements::GetClient()); + if (subset_list && subset_list->num_subsets > 0) + { + // If there is only a single subset, we don't want to show a selector. + if (subset_list->num_subsets > 1) + { + for (u32 i = 0; i < subset_list->num_subsets; i++) + { + const rc_client_subset_t* subset = subset_list->subsets[i]; + if ((include_achievements && subset->num_achievements > 0) || + (include_leaderboards && subset->num_leaderboards > 0)) + { + AddSubsetInfo(subset); + } + } + } + } + else if (std::any_of(list->buckets, list->buckets + list->num_buckets, + [&list](const auto& it) { return it.subset_id != list->buckets[0].subset_id; })) { for (u32 bucket_idx = 0; bucket_idx < list->num_buckets; bucket_idx++) { @@ -745,9 +764,14 @@ void FullscreenUI::CollectSubsetsFromList(const T* list) AddSubsetInfo(subset); } } + } + + if (subset_list) + rc_client_destroy_subset_list(subset_list); - // hopefully the first will be core... - Assert(s_achievements_locals.subset_info_list.size() > 1); + // hopefully the first will be core... + if (!s_achievements_locals.subset_info_list.empty()) + { const auto it = std::ranges::find_if(s_achievements_locals.subset_info_list, [](const SubsetInfo& info) { return info.subset_id == s_achievements_locals.last_open_subset_id; }); @@ -807,7 +831,7 @@ void FullscreenUI::SwitchToAchievements() } } - CollectSubsetsFromList(s_achievements_locals.achievement_list); + CollectSubsetsFromList(s_achievements_locals.achievement_list, true, false); SwitchToMainWindow(MainWindowType::Achievements); } @@ -1314,7 +1338,7 @@ void FullscreenUI::SwitchToLeaderboards() return; } - CollectSubsetsFromList(s_achievements_locals.leaderboard_list); + CollectSubsetsFromList(s_achievements_locals.leaderboard_list, false, true); SwitchToMainWindow(MainWindowType::Leaderboards); }