[Kernel] Added support for writing/reading GPD files

This breaks settings in games that are using them and savefiles in games that use settings to store progress
This commit is contained in:
Gliniak
2024-12-15 13:58:08 +01:00
committed by Radosław Gliński
parent ccf7adf015
commit 1110cdd372
58 changed files with 4642 additions and 2122 deletions

View File

@@ -13,6 +13,7 @@
#include "xenia/kernel/kernel_state.h"
#include "xenia/kernel/util/shim_utils.h"
#include "xenia/kernel/xam/achievement_backends/gpd_achievement_backend.h"
#include "xenia/kernel/xam/xdbf/gpd_info.h"
#include "xenia/ui/imgui_guest_notification.h"
DEFINE_bool(show_achievement_notification, false,
@@ -81,27 +82,32 @@ void AchievementManager::EarnAchievement(const uint64_t xuid,
// Something went really wrong!
return;
}
ShowAchievementEarnedNotification(achievement);
ShowAchievementEarnedNotification(&achievement.value());
}
void AchievementManager::LoadTitleAchievements(
const uint64_t xuid, const util::XdbfGameData title_data) const {
default_achievements_backend_->LoadAchievementsData(xuid, title_data);
void AchievementManager::LoadTitleAchievements(const uint64_t xuid) const {
default_achievements_backend_->LoadAchievementsData(xuid);
}
const AchievementGpdStructure* AchievementManager::GetAchievementInfo(
const std::optional<Achievement> AchievementManager::GetAchievementInfo(
const uint64_t xuid, const uint32_t title_id,
const uint32_t achievement_id) const {
return default_achievements_backend_->GetAchievementInfo(xuid, title_id,
achievement_id);
}
const std::vector<AchievementGpdStructure>*
AchievementManager::GetTitleAchievements(const uint64_t xuid,
const uint32_t title_id) const {
const std::vector<Achievement> AchievementManager::GetTitleAchievements(
const uint64_t xuid, const uint32_t title_id) const {
return default_achievements_backend_->GetTitleAchievements(xuid, title_id);
}
const std::span<const uint8_t> AchievementManager::GetAchievementIcon(
const uint64_t xuid, const uint32_t title_id,
const uint32_t achievement_id) const {
return default_achievements_backend_->GetAchievementIcon(xuid, title_id,
achievement_id);
}
const std::optional<TitleAchievementsProfileInfo>
AchievementManager::GetTitleAchievementsInfo(const uint64_t xuid,
const uint32_t title_id) const {
@@ -109,13 +115,13 @@ AchievementManager::GetTitleAchievementsInfo(const uint64_t xuid,
const auto achievements = GetTitleAchievements(xuid, title_id);
if (!achievements) {
if (achievements.empty()) {
return std::nullopt;
}
info.achievements_count = static_cast<uint32_t>(achievements->size());
info.achievements_count = static_cast<uint32_t>(achievements.size());
for (const auto& entry : *achievements) {
for (const auto& entry : achievements) {
if (!entry.IsUnlocked()) {
continue;
}
@@ -129,22 +135,15 @@ AchievementManager::GetTitleAchievementsInfo(const uint64_t xuid,
bool AchievementManager::DoesAchievementExist(
const uint32_t achievement_id) const {
const util::XdbfGameData title_xdbf = kernel_state()->title_xdbf();
const util::XdbfAchievementTableEntry achievement =
title_xdbf.GetAchievement(achievement_id);
if (!achievement.id) {
return false;
}
return true;
return kernel_state()->xam_state()->spa_info()->GetAchievement(
achievement_id);
}
void AchievementManager::ShowAchievementEarnedNotification(
const AchievementGpdStructure* achievement) const {
const Achievement* achievement) const {
const std::string description =
fmt::format("{}G - {}", achievement->gamerscore.get(),
xe::to_utf8(xe::load_and_swap<std::u16string>(
achievement->achievement_name.c_str())));
fmt::format("{}G - {}", achievement->gamerscore,
xe::to_utf8(achievement->achievement_name));
const Emulator* emulator = kernel_state()->emulator();
ui::WindowedAppContext& app_context =