[XAM] Added achievement types to log table
This commit is contained in:
@@ -1525,14 +1525,18 @@ X_STATUS Emulator::CompleteLaunch(const std::filesystem::path& path,
|
|||||||
// Show achievments data
|
// Show achievments data
|
||||||
tabulate::Table table;
|
tabulate::Table table;
|
||||||
table.format().multi_byte_characters(true);
|
table.format().multi_byte_characters(true);
|
||||||
table.add_row({"ID", "Title", "Description", "Gamerscore"});
|
table.add_row({"ID", "Title", "Description", "Type", "Gamerscore"});
|
||||||
|
|
||||||
const std::vector<kernel::util::GameInfoDatabase::Achievement>
|
const std::vector<kernel::util::GameInfoDatabase::Achievement>
|
||||||
achievement_list = game_info_database_->GetAchievements();
|
achievement_list = game_info_database_->GetAchievements();
|
||||||
for (const kernel::util::GameInfoDatabase::Achievement& entry :
|
for (const kernel::util::GameInfoDatabase::Achievement& entry :
|
||||||
achievement_list) {
|
achievement_list) {
|
||||||
|
const std::string type = GetAchievementTypeName(
|
||||||
|
kernel::xam::GetAchievementType(entry.flags));
|
||||||
|
|
||||||
table.add_row({fmt::format("{}", entry.id), entry.label,
|
table.add_row({fmt::format("{}", entry.id), entry.label,
|
||||||
entry.description, fmt::format("{}", entry.gamerscore)});
|
entry.description, type,
|
||||||
|
fmt::format("{}", entry.gamerscore)});
|
||||||
}
|
}
|
||||||
XELOGI("-------------------- ACHIEVEMENTS --------------------\n{}",
|
XELOGI("-------------------- ACHIEVEMENTS --------------------\n{}",
|
||||||
table.str());
|
table.str());
|
||||||
|
|||||||
@@ -34,6 +34,16 @@ enum class GpdSection : uint16_t {
|
|||||||
kProtectedAchievement = 0x6, // GFWL only
|
kProtectedAchievement = 0x6, // GFWL only
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class AchievementTypeFlags : uint32_t {
|
||||||
|
kCompletion = 0x1,
|
||||||
|
kLeveling = 0x2,
|
||||||
|
kUnlock = 0x3,
|
||||||
|
kEvent = 0x4,
|
||||||
|
kTournament = 0x5,
|
||||||
|
kCheckpoint = 0x6,
|
||||||
|
kOther = 0x7,
|
||||||
|
};
|
||||||
|
|
||||||
enum class AchievementFlags : uint32_t {
|
enum class AchievementFlags : uint32_t {
|
||||||
kTypeMask = 0x7,
|
kTypeMask = 0x7,
|
||||||
kShowUnachieved = 0x8,
|
kShowUnachieved = 0x8,
|
||||||
@@ -105,6 +115,39 @@ struct X_XDBF_GPD_SETTING_HEADER {
|
|||||||
static_assert_size(X_XDBF_GPD_SETTING_HEADER, 0x18);
|
static_assert_size(X_XDBF_GPD_SETTING_HEADER, 0x18);
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
inline AchievementTypeFlags constexpr GetAchievementType(const uint32_t flags) {
|
||||||
|
return static_cast<AchievementTypeFlags>(
|
||||||
|
flags & static_cast<uint32_t>(AchievementFlags::kTypeMask));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::string constexpr GetAchievementTypeName(
|
||||||
|
const AchievementTypeFlags type) {
|
||||||
|
switch (type) {
|
||||||
|
case AchievementTypeFlags::kCompletion:
|
||||||
|
return "Completion";
|
||||||
|
break;
|
||||||
|
case AchievementTypeFlags::kLeveling:
|
||||||
|
return "Leveling";
|
||||||
|
break;
|
||||||
|
case AchievementTypeFlags::kUnlock:
|
||||||
|
return "Unlock";
|
||||||
|
break;
|
||||||
|
case AchievementTypeFlags::kEvent:
|
||||||
|
return "Event";
|
||||||
|
break;
|
||||||
|
case AchievementTypeFlags::kTournament:
|
||||||
|
return "Tournament";
|
||||||
|
break;
|
||||||
|
case AchievementTypeFlags::kCheckpoint:
|
||||||
|
return "Checkpoint";
|
||||||
|
break;
|
||||||
|
case AchievementTypeFlags::kOther:
|
||||||
|
default:
|
||||||
|
return "Other";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class GpdInfo : public XdbfFile {
|
class GpdInfo : public XdbfFile {
|
||||||
public:
|
public:
|
||||||
GpdInfo();
|
GpdInfo();
|
||||||
|
|||||||
Reference in New Issue
Block a user