[Kernel] Store earned achievements in-memory to prevent achievements spam

This doesn't store them externally so after restarting they will unlock again
This commit is contained in:
Gliniak
2023-10-25 09:17:38 +02:00
parent 2509b03b81
commit ebdea6b02a
3 changed files with 36 additions and 3 deletions

View File

@@ -22,10 +22,14 @@ DECLARE_int32(user_language);
namespace xe {
namespace kernel {
AchievementManager::AchievementManager(){};
AchievementManager::AchievementManager() { unlocked_achievements.clear(); };
void AchievementManager::EarnAchievement(uint64_t xuid, uint32_t title_id,
uint32_t achievement_id) {
if (IsAchievementUnlocked(achievement_id)) {
return;
}
const Emulator* emulator = kernel_state()->emulator();
ui::WindowedAppContext& app_context =
kernel_state()->emulator()->display_window()->app_context();
@@ -48,6 +52,7 @@ void AchievementManager::EarnAchievement(uint64_t xuid, uint32_t title_id,
const std::string description =
fmt::format("{}G - {}", entry.gamerscore, label);
unlocked_achievements[achievement_id] = Clock::QueryHostSystemTime();
// Even if we disable popup we still should store info that this
// achievement was earned.
if (!cvars::show_achievement_notification) {
@@ -63,5 +68,20 @@ void AchievementManager::EarnAchievement(uint64_t xuid, uint32_t title_id,
}
}
bool AchievementManager::IsAchievementUnlocked(uint32_t achievement_id) {
auto itr = unlocked_achievements.find(achievement_id);
return itr != unlocked_achievements.cend();
}
uint64_t AchievementManager::GetAchievementUnlockTime(uint32_t achievement_id) {
auto itr = unlocked_achievements.find(achievement_id);
if (itr == unlocked_achievements.cend()) {
return 0;
}
return itr->second;
}
} // namespace kernel
} // namespace xe