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 zcmbVO2~-nj9v=<`AtK^8hD^s zSYfT!qgFtuLIo=x53Q?3wyV?@q_njtRvxxMkrt`aQee@Ya6P-v-M;Od-+bTi`~C0# zo82){;SP37>;M38h>TFivTx9Q+sL{?p%9!oxU4w6It7kZzC0t0 z{Zeq#7>0r&$Y3z=4Prj2PlbeXxf~LRAd!g2B6xHb!5~H+K`)|Q$RI3hods|nknIG6v8x^79$v%#R})J zR2s>UbQ<|zsOOe{BY^d-N;N0rxw>ezb0TOaER!{3#v#u|({Wi82E}4DnW0CquuN9X zk zhmYfGSSm&(LMf8MlVg4vkBy zwm3c8%M{y|ECK+l!ANCrTteZGZ$}rsz3GK(<^6Yax<@Da=xYt;H^=RD57`J;?GZn29li4KazEZv zZX18LD8H|1+Y$QW%`qK6U^LeGN$cqy=O;u>=5vRIsr2soi4O`)S9=bDg>|+?r#nL& z-E!PA(XzIouM>^6kH=l&$7MOzJ{zv#EnZoA%ZBudv4ujH&!AHUdEeI`EIeS_m;c4z zIl9`9Gd!;{mOvF=1U|CBcA~p3tYCi4Z>4j6kvL76N@ctC!xaZAFXnx_z!lvS-#~;U9I`OJV zI^FhXtmh|Pn`vH7>%S%oKA&`QH-Q#l@T2^eunx<#Bn;~x29eyfZy*kU=y;c^oF)g zTwd7IOpx7hT2>uU!+Zd++)A{zW$C zTNBM0+xL$v`*bHQj&%hB>0q6;-(QoU*VZh3d2n2GrSxMfpEn9nt50seTjxV0YsoS$ zXJX&Tnu^BNbw0w@>dPCxdF`rmvQycm@kYl-V7;@f!iKL-_X zkCS#(E+G>pe_ zx)Xk>T&wZ@Zd6-)XZPs~H8DE|w&YfQL^KWD*JXc)LSG>xF6!VDS)JO248U_PJbn1U<>ddCLZw|S5G|0gmm KN_i?IDgWP+yN^Hs literal 0 HcmV?d00001 diff --git a/Data/Sys/Resources/Platform_Triforce@2x.png b/Data/Sys/Resources/Platform_Triforce@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3efae35bd5741a0924ef40687cf3437212174fa4 GIT binary patch literal 4176 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 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)); }