From 8842a0f402ffe60a80ce7894bfd36afd039009fc Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sat, 23 Feb 2019 17:49:06 +0100 Subject: [PATCH] Keep track of GameTDB ID separately from game ID The difference between Dolphin's game IDs and GameTDB's game IDs is that GameTDB uses four characters for non-disc titles, whereas Dolphin uses six characters for all titles. This fixes: - TitleDatabase considering Datel discs to be NHL Hitz 2002 - Gecko code downloading not working for discs with IDs starting with P - Cover downloading mixing up discs with channels (e.g. Mario Kart Wii and Mario Kart Channel) and making extra HTTP requests. (Android was actually doing a better job at this than DolphinQt!) --- .../dolphinemu/dolphinemu/model/GameFile.java | 4 ++- .../dolphinemu/utils/CoverHelper.java | 7 ++-- Source/Android/jni/GameList/GameFile.cpp | 6 ++++ Source/Core/Core/ConfigManager.cpp | 26 ++++++++------- Source/Core/Core/ConfigManager.h | 5 +-- Source/Core/Core/GeckoCodeConfig.cpp | 16 ++-------- Source/Core/Core/GeckoCodeConfig.h | 2 +- Source/Core/Core/IOS/ES/Formats.cpp | 14 ++++++++ Source/Core/Core/IOS/ES/Formats.h | 8 ++++- Source/Core/Core/TitleDatabase.cpp | 18 +++++------ Source/Core/Core/TitleDatabase.h | 16 +++------- Source/Core/DiscIO/Volume.h | 1 + Source/Core/DiscIO/VolumeGC.cpp | 11 +++++++ Source/Core/DiscIO/VolumeGC.h | 1 + Source/Core/DiscIO/VolumeWad.cpp | 5 +++ Source/Core/DiscIO/VolumeWad.h | 1 + Source/Core/DiscIO/VolumeWii.cpp | 5 +++ Source/Core/DiscIO/VolumeWii.h | 1 + .../Core/DolphinQt/Config/GeckoCodeWidget.cpp | 6 ++-- .../Core/DolphinQt/Config/GeckoCodeWidget.h | 1 + Source/Core/UICommon/GameFile.cpp | 32 ++++++------------- Source/Core/UICommon/GameFile.h | 2 ++ Source/Core/UICommon/GameFileCache.cpp | 2 +- 23 files changed, 106 insertions(+), 84 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.java index 45d0eb9060..5a247137ab 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameFile.java @@ -30,6 +30,8 @@ public class GameFile public native String getGameId(); + public native String getGameTdbId(); + public native int getDiscNumber(); public native int getRevision(); @@ -43,7 +45,7 @@ public class GameFile public String getCoverPath() { return Environment.getExternalStorageDirectory().getPath() + - "/dolphin-emu/Cache/GameCovers/" + getGameId() + ".png"; + "/dolphin-emu/Cache/GameCovers/" + getGameTdbId() + ".png"; } public String getCustomCoverPath() diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CoverHelper.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CoverHelper.java index a6184e8681..2c0cd393a0 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CoverHelper.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CoverHelper.java @@ -12,10 +12,7 @@ public final class CoverHelper public static String buildGameTDBUrl(GameFile game, String region) { - String gameId = game.getGameId(); - if (game.getPlatform() == 2) // WiiWare - gameId = gameId.substring(0, 4); - return String.format(baseUrl, region, gameId); + return String.format(baseUrl, region, game.getGameTdbId()); } public static String getRegion(GameFile game) @@ -77,4 +74,4 @@ public final class CoverHelper // Do nothing } } -} \ No newline at end of file +} diff --git a/Source/Android/jni/GameList/GameFile.cpp b/Source/Android/jni/GameList/GameFile.cpp index b84426a1ca..ee889709fd 100644 --- a/Source/Android/jni/GameList/GameFile.cpp +++ b/Source/Android/jni/GameList/GameFile.cpp @@ -123,6 +123,12 @@ JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getGameI return ToJString(env, GetRef(env, obj)->GetGameID()); } +JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getGameTdbId(JNIEnv* env, + jobject obj) +{ + return ToJString(env, GetRef(env, obj)->GetGameTDBID()); +} + JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getDiscNumber(JNIEnv* env, jobject obj) { diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp index 95b1222c17..cd6f21e19a 100644 --- a/Source/Core/Core/ConfigManager.cpp +++ b/Source/Core/Core/ConfigManager.cpp @@ -680,7 +680,7 @@ void SConfig::LoadJitDebugSettings(IniFile& ini) void SConfig::ResetRunningGameMetadata() { - SetRunningGameMetadata("00000000", 0, 0, Core::TitleDatabase::TitleType::Other); + SetRunningGameMetadata("00000000", "", 0, 0); } void SConfig::SetRunningGameMetadata(const DiscIO::Volume& volume, @@ -688,14 +688,14 @@ void SConfig::SetRunningGameMetadata(const DiscIO::Volume& volume, { if (partition == volume.GetGamePartition()) { - SetRunningGameMetadata(volume.GetGameID(), volume.GetTitleID().value_or(0), - volume.GetRevision().value_or(0), Core::TitleDatabase::TitleType::Other); + SetRunningGameMetadata(volume.GetGameID(), volume.GetGameTDBID(), + volume.GetTitleID().value_or(0), volume.GetRevision().value_or(0)); } else { - SetRunningGameMetadata(volume.GetGameID(partition), volume.GetTitleID(partition).value_or(0), - volume.GetRevision(partition).value_or(0), - Core::TitleDatabase::TitleType::Other); + SetRunningGameMetadata(volume.GetGameID(partition), volume.GetGameTDBID(), + volume.GetTitleID(partition).value_or(0), + volume.GetRevision(partition).value_or(0)); } } @@ -710,16 +710,18 @@ void SConfig::SetRunningGameMetadata(const IOS::ES::TMDReader& tmd) if (!DVDInterface::UpdateRunningGameMetadata(tmd_title_id)) { // If not launching a disc game, just read everything from the TMD. - SetRunningGameMetadata(tmd.GetGameID(), tmd_title_id, tmd.GetTitleVersion(), - Core::TitleDatabase::TitleType::Channel); + const std::string game_id = tmd.GetGameID(); + SetRunningGameMetadata(game_id, game_id, tmd_title_id, tmd.GetTitleVersion()); } } -void SConfig::SetRunningGameMetadata(const std::string& game_id, u64 title_id, u16 revision, - Core::TitleDatabase::TitleType type) +void SConfig::SetRunningGameMetadata(const std::string& game_id, const std::string& gametdb_id, + u64 title_id, u16 revision) { - const bool was_changed = m_game_id != game_id || m_title_id != title_id || m_revision != revision; + const bool was_changed = m_game_id != game_id || m_gametdb_id != gametdb_id || + m_title_id != title_id || m_revision != revision; m_game_id = game_id; + m_gametdb_id = gametdb_id; m_title_id = title_id; m_revision = revision; @@ -747,7 +749,7 @@ void SConfig::SetRunningGameMetadata(const std::string& game_id, u64 title_id, u } const Core::TitleDatabase title_database; - m_title_description = title_database.Describe(m_game_id, type); + m_title_description = title_database.Describe(m_gametdb_id); NOTICE_LOG(CORE, "Active title: %s", m_title_description.c_str()); Config::AddLayer(ConfigLoaders::GenerateGlobalGameConfigLoader(game_id, revision)); diff --git a/Source/Core/Core/ConfigManager.h b/Source/Core/Core/ConfigManager.h index 8b95fde543..50d79ea82c 100644 --- a/Source/Core/Core/ConfigManager.h +++ b/Source/Core/Core/ConfigManager.h @@ -367,12 +367,13 @@ private: void LoadAutoUpdateSettings(IniFile& ini); void LoadJitDebugSettings(IniFile& ini); - void SetRunningGameMetadata(const std::string& game_id, u64 title_id, u16 revision, - Core::TitleDatabase::TitleType type); + void SetRunningGameMetadata(const std::string& game_id, const std::string& gametdb_id, + u64 title_id, u16 revision); static SConfig* m_Instance; std::string m_game_id; + std::string m_gametdb_id; std::string m_title_description; u64 m_title_id; u16 m_revision; diff --git a/Source/Core/Core/GeckoCodeConfig.cpp b/Source/Core/Core/GeckoCodeConfig.cpp index 2365794b8f..e1d522ba1b 100644 --- a/Source/Core/Core/GeckoCodeConfig.cpp +++ b/Source/Core/Core/GeckoCodeConfig.cpp @@ -16,21 +16,9 @@ namespace Gecko { -std::vector DownloadCodes(std::string gameid, bool* succeeded) +std::vector DownloadCodes(std::string gametdb_id, bool* succeeded) { - switch (gameid[0]) - { - case 'R': - case 'S': - case 'G': - break; - default: - // All channels (WiiWare, VirtualConsole, etc) are identified by their first four characters - gameid = gameid.substr(0, 4); - break; - } - - std::string endpoint{"https://www.geckocodes.org/txt.php?txt=" + gameid}; + std::string endpoint{"https://www.geckocodes.org/txt.php?txt=" + gametdb_id}; Common::HttpRequest http; // Circumvent high-tech DDOS protection diff --git a/Source/Core/Core/GeckoCodeConfig.h b/Source/Core/Core/GeckoCodeConfig.h index 88e5b92df5..66781fc224 100644 --- a/Source/Core/Core/GeckoCodeConfig.h +++ b/Source/Core/Core/GeckoCodeConfig.h @@ -13,6 +13,6 @@ class IniFile; namespace Gecko { std::vector LoadCodes(const IniFile& globalIni, const IniFile& localIni); -std::vector DownloadCodes(std::string gameid, bool* succeeded); +std::vector DownloadCodes(std::string gametdb_id, bool* succeeded); void SaveCodes(IniFile& inifile, const std::vector& gcodes); } diff --git a/Source/Core/Core/IOS/ES/Formats.cpp b/Source/Core/Core/IOS/ES/Formats.cpp index 41cfda2605..c4100a2fc6 100644 --- a/Source/Core/Core/IOS/ES/Formats.cpp +++ b/Source/Core/Core/IOS/ES/Formats.cpp @@ -323,6 +323,20 @@ std::string TMDReader::GetGameID() const return StringFromFormat("%016" PRIx64, GetTitleId()); } +std::string TMDReader::GetGameTDBID() const +{ + const u8* begin = m_bytes.data() + offsetof(TMDHeader, title_id) + 4; + const u8* end = begin + 4; + + const bool all_printable = + std::all_of(begin, end, [](char c) { return std::isprint(c, std::locale::classic()); }); + + if (all_printable) + return std::string(begin, end); + + return StringFromFormat("%016" PRIx64, GetTitleId()); +} + u16 TMDReader::GetNumContents() const { return Common::swap16(m_bytes.data() + offsetof(TMDHeader, num_contents)); diff --git a/Source/Core/Core/IOS/ES/Formats.h b/Source/Core/Core/IOS/ES/Formats.h index d525b79fa2..21950c072b 100644 --- a/Source/Core/Core/IOS/ES/Formats.h +++ b/Source/Core/Core/IOS/ES/Formats.h @@ -205,9 +205,15 @@ public: // Constructs a 6-character game ID in the format typically used by Dolphin. // If the 6-character game ID would contain unprintable characters, - // the title ID converted to hexadecimal is returned instead. + // the title ID converted to 16 hexadecimal digits is returned instead. std::string GetGameID() const; + // Constructs a 4-character game ID in the format typically used by GameTDB. + // If the 4-character game ID would contain unprintable characters, + // the title ID converted to 16 hexadecimal digits is returned instead + // (a format which GameTDB does not actually use). + std::string GetGameTDBID() const; + u16 GetNumContents() const; bool GetContent(u16 index, Content* content) const; std::vector GetContents() const; diff --git a/Source/Core/Core/TitleDatabase.cpp b/Source/Core/Core/TitleDatabase.cpp index 7000fe723d..9a2a48f8d3 100644 --- a/Source/Core/Core/TitleDatabase.cpp +++ b/Source/Core/Core/TitleDatabase.cpp @@ -167,12 +167,10 @@ TitleDatabase::TitleDatabase() TitleDatabase::~TitleDatabase() = default; -const std::string& TitleDatabase::GetTitleName(const std::string& game_id, TitleType type) const +const std::string& TitleDatabase::GetTitleName(const std::string& gametdb_id) const { - const auto& map = IsWiiTitle(game_id) ? m_wii_title_map : m_gc_title_map; - const std::string key = - type == TitleType::Channel && game_id.length() == 6 ? game_id.substr(0, 4) : game_id; - const auto iterator = map.find(key); + const auto& map = IsWiiTitle(gametdb_id) ? m_wii_title_map : m_gc_title_map; + const auto iterator = map.find(gametdb_id); return iterator != map.end() ? iterator->second : EMPTY_STRING; } @@ -181,14 +179,14 @@ const std::string& TitleDatabase::GetChannelName(u64 title_id) const const std::string id{ {static_cast((title_id >> 24) & 0xff), static_cast((title_id >> 16) & 0xff), static_cast((title_id >> 8) & 0xff), static_cast(title_id & 0xff)}}; - return GetTitleName(id, TitleType::Channel); + return GetTitleName(id); } -std::string TitleDatabase::Describe(const std::string& game_id, TitleType type) const +std::string TitleDatabase::Describe(const std::string& gametdb_id) const { - const std::string& title_name = GetTitleName(game_id, type); + const std::string& title_name = GetTitleName(gametdb_id); if (title_name.empty()) - return game_id; - return StringFromFormat("%s (%s)", title_name.c_str(), game_id.c_str()); + return gametdb_id; + return StringFromFormat("%s (%s)", title_name.c_str(), gametdb_id.c_str()); } } // namespace Core diff --git a/Source/Core/Core/TitleDatabase.h b/Source/Core/Core/TitleDatabase.h index 0eb6cd1d9e..528c16d325 100644 --- a/Source/Core/Core/TitleDatabase.h +++ b/Source/Core/Core/TitleDatabase.h @@ -18,21 +18,15 @@ public: TitleDatabase(); ~TitleDatabase(); - enum class TitleType - { - Channel, - Other, - }; - - // Get a user friendly title name for a game ID. + // Get a user friendly title name for a GameTDB ID. // This falls back to returning an empty string if none could be found. - const std::string& GetTitleName(const std::string& game_id, TitleType = TitleType::Other) const; + const std::string& GetTitleName(const std::string& gametdb_id) const; - // Same as above, but takes a title ID instead of a game ID, and can only find names of channels. + // Same as above, but takes a title ID instead of a GameTDB ID, and only works for channels. const std::string& GetChannelName(u64 title_id) const; - // Get a description for a game ID (title name if available + game ID). - std::string Describe(const std::string& game_id, TitleType = TitleType::Other) const; + // Get a description for a GameTDB ID (title name if available + GameTDB ID). + std::string Describe(const std::string& gametdb_id) const; private: std::unordered_map m_wii_title_map; diff --git a/Source/Core/DiscIO/Volume.h b/Source/Core/DiscIO/Volume.h index 4620234313..3b70f765b7 100644 --- a/Source/Core/DiscIO/Volume.h +++ b/Source/Core/DiscIO/Volume.h @@ -76,6 +76,7 @@ public: return offset; } virtual std::string GetGameID(const Partition& partition = PARTITION_NONE) const = 0; + virtual std::string GetGameTDBID(const Partition& partition = PARTITION_NONE) const = 0; virtual std::string GetMakerID(const Partition& partition = PARTITION_NONE) const = 0; virtual std::optional GetRevision(const Partition& partition = PARTITION_NONE) const = 0; virtual std::string GetInternalName(const Partition& partition = PARTITION_NONE) const = 0; diff --git a/Source/Core/DiscIO/VolumeGC.cpp b/Source/Core/DiscIO/VolumeGC.cpp index 1275fcfb78..e3db29c1f5 100644 --- a/Source/Core/DiscIO/VolumeGC.cpp +++ b/Source/Core/DiscIO/VolumeGC.cpp @@ -72,6 +72,17 @@ std::string VolumeGC::GetGameID(const Partition& partition) const return DecodeString(id); } +std::string VolumeGC::GetGameTDBID(const Partition& partition) const +{ + const std::string game_id = GetGameID(partition); + + // Don't return an ID for Datel discs that are using the game ID of NHL Hitz 2002 + if (game_id == "GNHE5d" && !GetBootDOLOffset(*this, partition).has_value()) + return ""; + + return game_id; +} + Region VolumeGC::GetRegion() const { const std::optional region_code = ReadSwapped(0x458, PARTITION_NONE); diff --git a/Source/Core/DiscIO/VolumeGC.h b/Source/Core/DiscIO/VolumeGC.h index d7fcc82b48..1bf6139768 100644 --- a/Source/Core/DiscIO/VolumeGC.h +++ b/Source/Core/DiscIO/VolumeGC.h @@ -34,6 +34,7 @@ public: const Partition& partition = PARTITION_NONE) const override; const FileSystem* GetFileSystem(const Partition& partition = PARTITION_NONE) const override; std::string GetGameID(const Partition& partition = PARTITION_NONE) const override; + std::string GetGameTDBID(const Partition& partition = PARTITION_NONE) const override; std::string GetMakerID(const Partition& partition = PARTITION_NONE) const override; std::optional GetRevision(const Partition& partition = PARTITION_NONE) const override; std::string GetInternalName(const Partition& partition = PARTITION_NONE) const override; diff --git a/Source/Core/DiscIO/VolumeWad.cpp b/Source/Core/DiscIO/VolumeWad.cpp index 7d927ae73d..a49488506b 100644 --- a/Source/Core/DiscIO/VolumeWad.cpp +++ b/Source/Core/DiscIO/VolumeWad.cpp @@ -105,6 +105,11 @@ std::string VolumeWAD::GetGameID(const Partition& partition) const return m_tmd.GetGameID(); } +std::string VolumeWAD::GetGameTDBID(const Partition& partition) const +{ + return m_tmd.GetGameTDBID(); +} + std::string VolumeWAD::GetMakerID(const Partition& partition) const { char temp[2]; diff --git a/Source/Core/DiscIO/VolumeWad.h b/Source/Core/DiscIO/VolumeWad.h index e89c684975..32d8bfe3a6 100644 --- a/Source/Core/DiscIO/VolumeWad.h +++ b/Source/Core/DiscIO/VolumeWad.h @@ -35,6 +35,7 @@ public: std::optional GetTitleID(const Partition& partition = PARTITION_NONE) const override; const IOS::ES::TMDReader& GetTMD(const Partition& partition = PARTITION_NONE) const override; std::string GetGameID(const Partition& partition = PARTITION_NONE) const override; + std::string GetGameTDBID(const Partition& partition = PARTITION_NONE) const override; std::string GetMakerID(const Partition& partition = PARTITION_NONE) const override; std::optional GetRevision(const Partition& partition = PARTITION_NONE) const override; std::string GetInternalName(const Partition& partition = PARTITION_NONE) const override diff --git a/Source/Core/DiscIO/VolumeWii.cpp b/Source/Core/DiscIO/VolumeWii.cpp index 29d822fca9..777d774d82 100644 --- a/Source/Core/DiscIO/VolumeWii.cpp +++ b/Source/Core/DiscIO/VolumeWii.cpp @@ -278,6 +278,11 @@ std::string VolumeWii::GetGameID(const Partition& partition) const return DecodeString(id); } +std::string VolumeWii::GetGameTDBID(const Partition& partition) const +{ + return GetGameID(partition); +} + Region VolumeWii::GetRegion() const { const std::optional region_code = m_reader->ReadSwapped(0x4E000); diff --git a/Source/Core/DiscIO/VolumeWii.h b/Source/Core/DiscIO/VolumeWii.h index 7ad657c26d..48010d5b37 100644 --- a/Source/Core/DiscIO/VolumeWii.h +++ b/Source/Core/DiscIO/VolumeWii.h @@ -45,6 +45,7 @@ public: u64 partition_data_offset); u64 PartitionOffsetToRawOffset(u64 offset, const Partition& partition) const override; std::string GetGameID(const Partition& partition) const override; + std::string GetGameTDBID(const Partition& partition) const override; std::string GetMakerID(const Partition& partition) const override; std::optional GetRevision(const Partition& partition) const override; std::string GetInternalName(const Partition& partition) const override; diff --git a/Source/Core/DolphinQt/Config/GeckoCodeWidget.cpp b/Source/Core/DolphinQt/Config/GeckoCodeWidget.cpp index d60c374702..e320b32347 100755 --- a/Source/Core/DolphinQt/Config/GeckoCodeWidget.cpp +++ b/Source/Core/DolphinQt/Config/GeckoCodeWidget.cpp @@ -26,8 +26,8 @@ #include "UICommon/GameFile.h" GeckoCodeWidget::GeckoCodeWidget(const UICommon::GameFile& game, bool restart_required) - : m_game(game), m_game_id(game.GetGameID()), m_game_revision(game.GetRevision()), - m_restart_required(restart_required) + : m_game(game), m_game_id(game.GetGameID()), m_gametdb_id(game.GetGameTDBID()), + m_game_revision(game.GetRevision()), m_restart_required(restart_required) { CreateWidgets(); ConnectWidgets(); @@ -251,7 +251,7 @@ void GeckoCodeWidget::DownloadCodes() { bool success; - std::vector codes = Gecko::DownloadCodes(m_game_id, &success); + std::vector codes = Gecko::DownloadCodes(m_gametdb_id, &success); if (!success) { diff --git a/Source/Core/DolphinQt/Config/GeckoCodeWidget.h b/Source/Core/DolphinQt/Config/GeckoCodeWidget.h index 6bfdfc744f..430cc0d15a 100644 --- a/Source/Core/DolphinQt/Config/GeckoCodeWidget.h +++ b/Source/Core/DolphinQt/Config/GeckoCodeWidget.h @@ -48,6 +48,7 @@ private: const UICommon::GameFile& m_game; std::string m_game_id; + std::string m_gametdb_id; u16 m_game_revision; CheatWarningWidget* m_warning; diff --git a/Source/Core/UICommon/GameFile.cpp b/Source/Core/UICommon/GameFile.cpp index d7cc55e2b7..ed62d69ce4 100644 --- a/Source/Core/UICommon/GameFile.cpp +++ b/Source/Core/UICommon/GameFile.cpp @@ -132,6 +132,7 @@ GameFile::GameFile(const std::string& path) m_internal_name = volume->GetInternalName(); m_game_id = volume->GetGameID(); + m_gametdb_id = volume->GetGameTDBID(); m_title_id = volume->GetTitleID().value_or(0); m_maker_id = volume->GetMakerID(); m_revision = volume->GetRevision().value_or(0); @@ -198,9 +199,8 @@ void GameFile::DownloadDefaultCover() const auto cover_path = File::GetUserPath(D_COVERCACHE_IDX) + DIR_SEP; - // If covers have already been downloaded, abort - if (File::Exists(cover_path + m_game_id + ".png") || - File::Exists(cover_path + m_game_id.substr(0, 4) + ".png")) + // If the cover has already been downloaded, abort + if (File::Exists(cover_path + m_gametdb_id + ".png")) return; Common::HttpRequest request; @@ -249,22 +249,13 @@ void GameFile::DownloadDefaultCover() break; } - auto response = request.Get(StringFromFormat(COVER_URL, region_code.c_str(), m_game_id.c_str())); + auto response = + request.Get(StringFromFormat(COVER_URL, region_code.c_str(), m_gametdb_id.c_str())); if (response) { File::WriteStringToFile(std::string(response.value().begin(), response.value().end()), - cover_path + m_game_id + ".png"); - return; - } - - response = - request.Get(StringFromFormat(COVER_URL, region_code.c_str(), m_game_id.substr(0, 4).c_str())); - - if (response) - { - File::WriteStringToFile(std::string(response.value().begin(), response.value().end()), - cover_path + m_game_id.substr(0, 4) + ".png"); + cover_path + m_gametdb_id + ".png"); } } @@ -277,10 +268,7 @@ bool GameFile::DefaultCoverChanged() std::string contents; - File::ReadFileToString(cover_path + m_game_id + ".png", contents); - - if (contents.empty()) - File::ReadFileToString(cover_path + m_game_id.substr(0, 4).c_str() + ".png", contents); + File::ReadFileToString(cover_path + m_gametdb_id + ".png", contents); if (contents.empty()) return false; @@ -328,6 +316,7 @@ void GameFile::DoState(PointerWrap& p) p.Do(m_descriptions); p.Do(m_internal_name); p.Do(m_game_id); + p.Do(m_gametdb_id); p.Do(m_title_id); p.Do(m_maker_id); @@ -433,10 +422,7 @@ void GameFile::CustomBannerCommit() const std::string& GameFile::GetName(const Core::TitleDatabase& title_database) const { - const auto type = m_platform == DiscIO::Platform::WiiWAD ? - Core::TitleDatabase::TitleType::Channel : - Core::TitleDatabase::TitleType::Other; - const std::string& custom_name = title_database.GetTitleName(m_game_id, type); + const std::string& custom_name = title_database.GetTitleName(m_gametdb_id); return custom_name.empty() ? GetName() : custom_name; } diff --git a/Source/Core/UICommon/GameFile.h b/Source/Core/UICommon/GameFile.h index e5b4257db6..1790050ea9 100644 --- a/Source/Core/UICommon/GameFile.h +++ b/Source/Core/UICommon/GameFile.h @@ -67,6 +67,7 @@ public: std::vector GetLanguages() const; const std::string& GetInternalName() const { return m_internal_name; } const std::string& GetGameID() const { return m_game_id; } + const std::string& GetGameTDBID() const { return m_gametdb_id; } u64 GetTitleID() const { return m_title_id; } const std::string& GetMakerID() const { return m_maker_id; } u16 GetRevision() const { return m_revision; } @@ -120,6 +121,7 @@ private: std::map m_descriptions{}; std::string m_internal_name{}; std::string m_game_id{}; + std::string m_gametdb_id{}; u64 m_title_id{}; std::string m_maker_id{}; diff --git a/Source/Core/UICommon/GameFileCache.cpp b/Source/Core/UICommon/GameFileCache.cpp index aad527e612..2782ec2751 100644 --- a/Source/Core/UICommon/GameFileCache.cpp +++ b/Source/Core/UICommon/GameFileCache.cpp @@ -27,7 +27,7 @@ namespace UICommon { -static constexpr u32 CACHE_REVISION = 14; // Last changed in PR 7441 +static constexpr u32 CACHE_REVISION = 15; // Last changed in PR 7816 std::vector FindAllGamePaths(const std::vector& directories_to_scan, bool recursive_scan)