mirror of
https://github.com/stenzek/duckstation.git
synced 2026-02-04 05:04:33 +00:00
Achievements: Use rc_client_create_subset_list()
This commit is contained in:
@@ -68,7 +68,7 @@ static bool IsCoreSubsetOpen();
|
||||
static void SetCurrentSubsetID(u32 subset_id);
|
||||
static void DrawSubsetSelector();
|
||||
template<typename T>
|
||||
static void CollectSubsetsFromList(const T* list);
|
||||
static void CollectSubsetsFromList(const T* list, bool include_achievements, bool include_leaderboards);
|
||||
template<typename T>
|
||||
static bool IsBucketVisibleInCurrentSubset(const T& bucket);
|
||||
|
||||
@@ -727,12 +727,31 @@ void FullscreenUI::SetCurrentSubsetID(u32 subset_id)
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// hopefully the first will be core...
|
||||
Assert(s_achievements_locals.subset_info_list.size() > 1);
|
||||
if (subset_list)
|
||||
rc_client_destroy_subset_list(subset_list);
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user