From 71f654cdc45ecb44e455ce35d8be910732aa6f7c Mon Sep 17 00:00:00 2001 From: Zopolis4 Date: Tue, 10 Aug 2021 07:49:34 +1000 Subject: [PATCH] Add Triforce platform and preliminary boot.id parsing --- Data/Sys/Resources/Platform_Triforce.png | Bin 0 -> 2396 bytes Data/Sys/Resources/Platform_Triforce@2x.png | Bin 0 -> 4176 bytes Data/Sys/Resources/Platform_Triforce@4x.png | Bin 0 -> 8404 bytes Source/Core/Core/Config/MainSettings.cpp | 1 + Source/Core/Core/Config/MainSettings.h | 1 + Source/Core/DiscIO/Enums.cpp | 3 ++- Source/Core/DiscIO/Enums.h | 1 + Source/Core/DiscIO/VolumeGC.cpp | 22 ++++++++++++++++-- Source/Core/DiscIO/VolumeGC.h | 2 ++ Source/Core/DiscIO/VolumeVerifier.cpp | 8 +++++++ Source/Core/DiscIO/VolumeVerifier.h | 1 + Source/Core/DolphinQt/Config/InfoWidget.cpp | 1 + .../Core/DolphinQt/GameList/GameListModel.cpp | 2 ++ Source/Core/DolphinQt/MenuBar.cpp | 1 + Source/Core/DolphinQt/Resources.cpp | 2 +- 15 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 Data/Sys/Resources/Platform_Triforce.png create mode 100644 Data/Sys/Resources/Platform_Triforce@2x.png create mode 100644 Data/Sys/Resources/Platform_Triforce@4x.png diff --git a/Data/Sys/Resources/Platform_Triforce.png b/Data/Sys/Resources/Platform_Triforce.png new file mode 100644 index 0000000000000000000000000000000000000000..e6a3b26b765709a41fe2efd8aa0d45d237d09e2b GIT binary patch literal 2396 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 SPpk^m=l68=b6Mw<&;$Td5E1ME literal 0 HcmV?d00001 diff --git a/Data/Sys/Resources/Platform_Triforce@4x.png b/Data/Sys/Resources/Platform_Triforce@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..85bf7c272d7f832d9e36ecedf941baa0fb11e93f GIT binary patch literal 8404 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

yRFE6FK?lD(@iA= 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 kLk|xRwwWW)?A4!oCI&{W+kNbpK@~ literal 0 HcmV?d00001 diff --git a/Source/Core/Core/Config/MainSettings.cpp b/Source/Core/Core/Config/MainSettings.cpp index 37f2a6054e..7af0fd2766 100644 --- a/Source/Core/Core/Config/MainSettings.cpp +++ b/Source/Core/Core/Config/MainSettings.cpp @@ -437,6 +437,7 @@ const Info MAIN_GAMELIST_LIST_WAD{{System::Main, "GameList", "ListWad"}, t const Info MAIN_GAMELIST_LIST_ELF_DOL{{System::Main, "GameList", "ListElfDol"}, true}; const Info MAIN_GAMELIST_LIST_WII{{System::Main, "GameList", "ListWii"}, true}; const Info MAIN_GAMELIST_LIST_GC{{System::Main, "GameList", "ListGC"}, true}; +const Info MAIN_GAMELIST_LIST_TRI{{System::Main, "GameList", "ListTriforce"}, true}; const Info MAIN_GAMELIST_LIST_JPN{{System::Main, "GameList", "ListJap"}, true}; const Info MAIN_GAMELIST_LIST_PAL{{System::Main, "GameList", "ListPal"}, true}; const Info MAIN_GAMELIST_LIST_USA{{System::Main, "GameList", "ListUsa"}, true}; diff --git a/Source/Core/Core/Config/MainSettings.h b/Source/Core/Core/Config/MainSettings.h index 51aa7ec8aa..344263ba10 100644 --- a/Source/Core/Core/Config/MainSettings.h +++ b/Source/Core/Core/Config/MainSettings.h @@ -269,6 +269,7 @@ extern const Info MAIN_GAMELIST_LIST_WAD; extern const Info MAIN_GAMELIST_LIST_ELF_DOL; extern const Info MAIN_GAMELIST_LIST_WII; extern const Info MAIN_GAMELIST_LIST_GC; +extern const Info MAIN_GAMELIST_LIST_TRI; extern const Info MAIN_GAMELIST_LIST_JPN; extern const Info MAIN_GAMELIST_LIST_PAL; extern const Info MAIN_GAMELIST_LIST_USA; diff --git a/Source/Core/DiscIO/Enums.cpp b/Source/Core/DiscIO/Enums.cpp index 2d6f22d164..28487d346e 100644 --- a/Source/Core/DiscIO/Enums.cpp +++ b/Source/Core/DiscIO/Enums.cpp @@ -139,7 +139,8 @@ std::string GetName(Region region, bool translate) bool IsDisc(Platform volume_type) { - return volume_type == Platform::GameCubeDisc || volume_type == Platform::WiiDisc; + return volume_type == Platform::GameCubeDisc || volume_type == Platform::Triforce || + volume_type == Platform::WiiDisc; } bool IsWii(Platform volume_type) diff --git a/Source/Core/DiscIO/Enums.h b/Source/Core/DiscIO/Enums.h index 4881a8d980..9b5e274de9 100644 --- a/Source/Core/DiscIO/Enums.h +++ b/Source/Core/DiscIO/Enums.h @@ -15,6 +15,7 @@ namespace DiscIO enum class Platform { GameCubeDisc = 0, + Triforce, WiiDisc, WiiWAD, ELFOrDOL, diff --git a/Source/Core/DiscIO/VolumeGC.cpp b/Source/Core/DiscIO/VolumeGC.cpp index 8a95e0bb31..ebd005f158 100644 --- a/Source/Core/DiscIO/VolumeGC.cpp +++ b/Source/Core/DiscIO/VolumeGC.cpp @@ -29,7 +29,8 @@ namespace DiscIO { -VolumeGC::VolumeGC(std::unique_ptr reader) : m_reader(std::move(reader)) +VolumeGC::VolumeGC(std::unique_ptr reader) + : m_reader(std::move(reader)), m_is_triforce(false) { ASSERT(m_reader); @@ -39,6 +40,20 @@ VolumeGC::VolumeGC(std::unique_ptr reader) : m_reader(std::move(read }; m_converted_banner = [this] { return LoadBannerFile(); }; + + constexpr u32 BTID_MAGIC = 0x44495442; + auto tmp_fs = GetFileSystem(PARTITION_NONE); + if (tmp_fs) + { + std::unique_ptr file_info = tmp_fs->FindFileInfo("boot.id"); + if (!file_info) + return; + u32 triforce_magic; // "BTID" + const u64 file_size = ReadFile(*this, PARTITION_NONE, file_info.get(), + reinterpret_cast(&triforce_magic), sizeof(triforce_magic)); + if (file_size >= 4 && triforce_magic == BTID_MAGIC) + m_is_triforce = true; + } } VolumeGC::~VolumeGC() = default; @@ -139,7 +154,10 @@ const BlobReader& VolumeGC::GetBlobReader() const Platform VolumeGC::GetVolumeType() const { - return Platform::GameCubeDisc; + if (m_is_triforce) + return Platform::Triforce; + else + return Platform::GameCubeDisc; } bool VolumeGC::IsDatelDisc() const diff --git a/Source/Core/DiscIO/VolumeGC.h b/Source/Core/DiscIO/VolumeGC.h index d877bc7719..1c8297defb 100644 --- a/Source/Core/DiscIO/VolumeGC.h +++ b/Source/Core/DiscIO/VolumeGC.h @@ -103,6 +103,8 @@ private: Common::Lazy> m_file_system; std::unique_ptr m_reader; + + bool m_is_triforce; }; } // namespace DiscIO diff --git a/Source/Core/DiscIO/VolumeVerifier.cpp b/Source/Core/DiscIO/VolumeVerifier.cpp index 414e4ae3a1..bbe02e7d22 100644 --- a/Source/Core/DiscIO/VolumeVerifier.cpp +++ b/Source/Core/DiscIO/VolumeVerifier.cpp @@ -402,6 +402,7 @@ void VolumeVerifier::Start() m_is_tgc = m_volume.GetBlobType() == BlobType::TGC; m_is_datel = m_volume.IsDatelDisc(); + m_is_triforce = m_volume.GetVolumeType() == Platform::Triforce; m_is_not_retail = (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.HasWiiHashes()) || IsDebugSigned(); @@ -1373,6 +1374,13 @@ void VolumeVerifier::Finish() return; } + if (m_is_triforce) + { + m_result.summary_text = + Common::GetStringT("Dolphin is currently unable to verify Triforce games."); + return; + } + if (m_result.redump.status == RedumpVerifier::Status::BadDump && highest_severity <= Severity::Low) { diff --git a/Source/Core/DiscIO/VolumeVerifier.h b/Source/Core/DiscIO/VolumeVerifier.h index 934e60b7b1..7a5c342e1b 100644 --- a/Source/Core/DiscIO/VolumeVerifier.h +++ b/Source/Core/DiscIO/VolumeVerifier.h @@ -165,6 +165,7 @@ private: Result m_result; bool m_is_tgc = false; bool m_is_datel = false; + bool m_is_triforce = false; bool m_is_not_retail = false; bool m_redump_verification; diff --git a/Source/Core/DolphinQt/Config/InfoWidget.cpp b/Source/Core/DolphinQt/Config/InfoWidget.cpp index a13b31ea34..1cddafcd0c 100644 --- a/Source/Core/DolphinQt/Config/InfoWidget.cpp +++ b/Source/Core/DolphinQt/Config/InfoWidget.cpp @@ -93,6 +93,7 @@ QGroupBox* InfoWidget::CreateGameDetails() const QString game_name = QString::fromStdString(m_game.GetInternalName()); bool is_disc_based = m_game.GetPlatform() == DiscIO::Platform::GameCubeDisc || + m_game.GetPlatform() == DiscIO::Platform::Triforce || m_game.GetPlatform() == DiscIO::Platform::WiiDisc; QLineEdit* internal_name = diff --git a/Source/Core/DolphinQt/GameList/GameListModel.cpp b/Source/Core/DolphinQt/GameList/GameListModel.cpp index c8c1d8b165..42a911ce49 100644 --- a/Source/Core/DolphinQt/GameList/GameListModel.cpp +++ b/Source/Core/DolphinQt/GameList/GameListModel.cpp @@ -303,6 +303,8 @@ bool GameListModel::ShouldDisplayGameListItem(int index) const { case DiscIO::Platform::GameCubeDisc: return Config::Get(Config::MAIN_GAMELIST_LIST_GC); + case DiscIO::Platform::Triforce: + return Config::Get(Config::MAIN_GAMELIST_LIST_TRI); case DiscIO::Platform::WiiDisc: return Config::Get(Config::MAIN_GAMELIST_LIST_WII); case DiscIO::Platform::WiiWAD: diff --git a/Source/Core/DolphinQt/MenuBar.cpp b/Source/Core/DolphinQt/MenuBar.cpp index 24c6cc2d04..a4e2b17c0d 100644 --- a/Source/Core/DolphinQt/MenuBar.cpp +++ b/Source/Core/DolphinQt/MenuBar.cpp @@ -726,6 +726,7 @@ void MenuBar::AddShowPlatformsMenu(QMenu* view_menu) static const QMap*> platform_map{ {tr("Show Wii"), &Config::MAIN_GAMELIST_LIST_WII}, {tr("Show GameCube"), &Config::MAIN_GAMELIST_LIST_GC}, + {tr("Show Triforce"), &Config::MAIN_GAMELIST_LIST_TRI}, {tr("Show WAD"), &Config::MAIN_GAMELIST_LIST_WAD}, {tr("Show ELF/DOL"), &Config::MAIN_GAMELIST_LIST_ELF_DOL}}; diff --git a/Source/Core/DolphinQt/Resources.cpp b/Source/Core/DolphinQt/Resources.cpp index 84fbcc8df8..015074142d 100644 --- a/Source/Core/DolphinQt/Resources.cpp +++ b/Source/Core/DolphinQt/Resources.cpp @@ -80,7 +80,7 @@ void Resources::Init() m_svg_supported = QImageReader::supportedImageFormats().contains("svg"); for (std::string_view platform : - {"Platform_Gamecube", "Platform_Wii", "Platform_Wad", "Platform_File"}) + {"Platform_Gamecube", "Platform_Triforce", "Platform_Wii", "Platform_Wad", "Platform_File"}) { m_platforms.append(GetResourceIcon(platform)); }