mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-27 01:02:48 +01:00
game_list: Use friendly game versions
Mainly, from control.nacp metadata instead of cnmt metadata
This commit is contained in:
parent
a6e75cd45b
commit
2814ca3624
1 changed files with 32 additions and 13 deletions
|
@ -456,8 +456,9 @@ static QString FormatGameName(const std::string& physical_name) {
|
||||||
return physical_name_as_qstring;
|
return physical_name_as_qstring;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString FormatPatchNameVersions(u64 title_id, bool updatable = true) {
|
static QString FormatPatchNameVersions(const FileSys::PatchManager& patch_manager,
|
||||||
const FileSys::PatchManager patch_manager(title_id);
|
std::string update_version_override = "",
|
||||||
|
bool updatable = true) {
|
||||||
QString out;
|
QString out;
|
||||||
for (const auto& kv : patch_manager.GetPatchVersionNames()) {
|
for (const auto& kv : patch_manager.GetPatchVersionNames()) {
|
||||||
if (!updatable && kv.first == FileSys::PatchType::Update)
|
if (!updatable && kv.first == FileSys::PatchType::Update)
|
||||||
|
@ -466,8 +467,12 @@ static QString FormatPatchNameVersions(u64 title_id, bool updatable = true) {
|
||||||
if (kv.second == 0) {
|
if (kv.second == 0) {
|
||||||
out.append(fmt::format("{}\n", FileSys::FormatPatchTypeName(kv.first)).c_str());
|
out.append(fmt::format("{}\n", FileSys::FormatPatchTypeName(kv.first)).c_str());
|
||||||
} else {
|
} else {
|
||||||
out.append(fmt::format("{} ({})\n", FileSys::FormatPatchTypeName(kv.first),
|
auto version_data = FileSys::FormatTitleVersion(kv.second);
|
||||||
FileSys::FormatTitleVersion(kv.second))
|
if (kv.first == FileSys::PatchType::Update && !update_version_override.empty())
|
||||||
|
version_data = update_version_override;
|
||||||
|
|
||||||
|
out.append(
|
||||||
|
fmt::format("{} ({})\n", FileSys::FormatPatchTypeName(kv.first), version_data)
|
||||||
.c_str());
|
.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -484,9 +489,16 @@ void GameList::RefreshGameDirectory() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GetMetadataFromControlNCA(const std::shared_ptr<FileSys::NCA>& nca,
|
static void GetMetadataFromControlNCA(const FileSys::PatchManager& patch_manager,
|
||||||
std::vector<u8>& icon, std::string& name) {
|
const std::shared_ptr<FileSys::NCA>& nca,
|
||||||
const auto control_dir = FileSys::ExtractRomFS(nca->GetRomFS());
|
std::vector<u8>& icon, std::string& name,
|
||||||
|
std::string& version) {
|
||||||
|
const auto romfs = patch_manager.PatchRomFS(nca->GetRomFS(), nca->GetBaseIVFCOffset(),
|
||||||
|
FileSys::ContentRecordType::Control);
|
||||||
|
if (romfs == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const auto control_dir = FileSys::ExtractRomFS(romfs);
|
||||||
if (control_dir == nullptr)
|
if (control_dir == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -495,6 +507,7 @@ static void GetMetadataFromControlNCA(const std::shared_ptr<FileSys::NCA>& nca,
|
||||||
return;
|
return;
|
||||||
FileSys::NACP nacp(nacp_file);
|
FileSys::NACP nacp(nacp_file);
|
||||||
name = nacp.GetApplicationName();
|
name = nacp.GetApplicationName();
|
||||||
|
version = nacp.GetVersionString();
|
||||||
|
|
||||||
FileSys::VirtualFile icon_file = nullptr;
|
FileSys::VirtualFile icon_file = nullptr;
|
||||||
for (const auto& language : FileSys::LANGUAGE_NAMES) {
|
for (const auto& language : FileSys::LANGUAGE_NAMES) {
|
||||||
|
@ -526,18 +539,20 @@ void GameListWorker::AddInstalledTitlesToGameList(std::shared_ptr<FileSys::Regis
|
||||||
|
|
||||||
std::vector<u8> icon;
|
std::vector<u8> icon;
|
||||||
std::string name;
|
std::string name;
|
||||||
|
std::string version = "";
|
||||||
u64 program_id = 0;
|
u64 program_id = 0;
|
||||||
loader->ReadProgramId(program_id);
|
loader->ReadProgramId(program_id);
|
||||||
|
|
||||||
|
const FileSys::PatchManager patch{program_id};
|
||||||
const auto& control = cache->GetEntry(game.title_id, FileSys::ContentRecordType::Control);
|
const auto& control = cache->GetEntry(game.title_id, FileSys::ContentRecordType::Control);
|
||||||
if (control != nullptr)
|
if (control != nullptr)
|
||||||
GetMetadataFromControlNCA(control, icon, name);
|
GetMetadataFromControlNCA(patch, control, icon, name, version);
|
||||||
emit EntryReady({
|
emit EntryReady({
|
||||||
new GameListItemPath(
|
new GameListItemPath(
|
||||||
FormatGameName(file->GetFullPath()), icon, QString::fromStdString(name),
|
FormatGameName(file->GetFullPath()), icon, QString::fromStdString(name),
|
||||||
QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType())),
|
QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType())),
|
||||||
program_id),
|
program_id),
|
||||||
new GameListItem(FormatPatchNameVersions(program_id)),
|
new GameListItem(FormatPatchNameVersions(patch, version)),
|
||||||
new GameListItem(
|
new GameListItem(
|
||||||
QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType()))),
|
QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType()))),
|
||||||
new GameListItemSize(file->GetSize()),
|
new GameListItemSize(file->GetSize()),
|
||||||
|
@ -603,12 +618,16 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign
|
||||||
std::string name = " ";
|
std::string name = " ";
|
||||||
const auto res3 = loader->ReadTitle(name);
|
const auto res3 = loader->ReadTitle(name);
|
||||||
|
|
||||||
|
const FileSys::PatchManager patch{program_id};
|
||||||
|
|
||||||
|
std::string version = "";
|
||||||
|
|
||||||
if (res1 != Loader::ResultStatus::Success && res3 != Loader::ResultStatus::Success &&
|
if (res1 != Loader::ResultStatus::Success && res3 != Loader::ResultStatus::Success &&
|
||||||
res2 == Loader::ResultStatus::Success) {
|
res2 == Loader::ResultStatus::Success) {
|
||||||
// Use from metadata pool.
|
// Use from metadata pool.
|
||||||
if (nca_control_map.find(program_id) != nca_control_map.end()) {
|
if (nca_control_map.find(program_id) != nca_control_map.end()) {
|
||||||
const auto nca = nca_control_map[program_id];
|
const auto nca = nca_control_map[program_id];
|
||||||
GetMetadataFromControlNCA(nca, icon, name);
|
GetMetadataFromControlNCA(patch, nca, icon, name, version);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -619,8 +638,6 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign
|
||||||
if (it != compatibility_list.end())
|
if (it != compatibility_list.end())
|
||||||
compatibility = it->second.first;
|
compatibility = it->second.first;
|
||||||
|
|
||||||
FileSys::PatchManager patch{program_id};
|
|
||||||
|
|
||||||
emit EntryReady({
|
emit EntryReady({
|
||||||
new GameListItemPath(
|
new GameListItemPath(
|
||||||
FormatGameName(physical_name), icon, QString::fromStdString(name),
|
FormatGameName(physical_name), icon, QString::fromStdString(name),
|
||||||
|
@ -628,6 +645,8 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign
|
||||||
program_id),
|
program_id),
|
||||||
new GameListItemCompat(compatibility),
|
new GameListItemCompat(compatibility),
|
||||||
new GameListItem(FormatPatchNameVersions(program_id, loader->IsRomFSUpdatable())),
|
new GameListItem(FormatPatchNameVersions(program_id, loader->IsRomFSUpdatable())),
|
||||||
|
new GameListItem(
|
||||||
|
FormatPatchNameVersions(patch, version, loader->IsRomFSUpdatable())),
|
||||||
new GameListItem(
|
new GameListItem(
|
||||||
QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType()))),
|
QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType()))),
|
||||||
new GameListItemSize(FileUtil::GetSize(physical_name)),
|
new GameListItemSize(FileUtil::GetSize(physical_name)),
|
||||||
|
|
Loading…
Reference in a new issue