From 049a7764b845caff15a087199a2ec60e1a3b8b50 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Wed, 23 Feb 2022 02:04:31 -0500 Subject: [PATCH] Add CDvdFile::SetRootDirectory; load proper DOL for Wii versions --- Runtime/CDvdFile.cpp | 10 ++++++++++ Runtime/CDvdFile.hpp | 2 ++ Runtime/IMain.hpp | 5 +++++ Runtime/MP1/MP1.cpp | 39 ++++++++++++++++++++++++++++++--------- 4 files changed, 47 insertions(+), 9 deletions(-) diff --git a/Runtime/CDvdFile.cpp b/Runtime/CDvdFile.cpp index 5cba6cd05..b9fd777fa 100644 --- a/Runtime/CDvdFile.cpp +++ b/Runtime/CDvdFile.cpp @@ -94,6 +94,7 @@ std::condition_variable CDvdFile::m_WorkerCV; std::mutex CDvdFile::m_WaitMutex; std::atomic_bool CDvdFile::m_WorkerRun = {false}; std::vector> CDvdFile::m_RequestQueue; +std::string CDvdFile::m_rootDirectory; CDvdFile::CDvdFile(std::string_view path) : x18_path(path) { auto* node = ResolvePath(path); @@ -169,6 +170,13 @@ nod::Node* CDvdFile::ResolvePath(std::string_view path) { if (path.starts_with('/')) { path.remove_prefix(1); } + std::string prefixedPath; + if (!m_rootDirectory.empty()) { + prefixedPath = m_rootDirectory; + prefixedPath += '/'; + prefixedPath += path; + path = prefixedPath; + } auto* node = &m_DvdRoot->getDataPartition()->getFSTRoot(); while (node != nullptr && !path.empty()) { std::string component; @@ -232,4 +240,6 @@ SDiscInfo CDvdFile::DiscInfo() { return out; } +void CDvdFile::SetRootDirectory(const std::string_view& rootDir) { m_rootDirectory = rootDir; } + } // namespace metaforce diff --git a/Runtime/CDvdFile.hpp b/Runtime/CDvdFile.hpp index b828eb6e5..831137dd1 100644 --- a/Runtime/CDvdFile.hpp +++ b/Runtime/CDvdFile.hpp @@ -39,6 +39,7 @@ class CDvdFile { static std::mutex m_WaitMutex; static std::atomic_bool m_WorkerRun; static std::vector> m_RequestQueue; + static std::string m_rootDirectory; static void WorkerProc(); std::string x18_path; @@ -52,6 +53,7 @@ class CDvdFile { public: static bool Initialize(const std::string_view& path); static SDiscInfo DiscInfo(); + static void SetRootDirectory(const std::string_view& rootDir); static void Shutdown(); CDvdFile(std::string_view path); diff --git a/Runtime/IMain.hpp b/Runtime/IMain.hpp index a1dd2ab93..0a7a24449 100644 --- a/Runtime/IMain.hpp +++ b/Runtime/IMain.hpp @@ -18,11 +18,16 @@ enum class EGame { MetroidPrime3, MetroidPrimeTrilogy, }; +enum class EPlatform { + GameCube, + Wii, +}; struct MetaforceVersionInfo { std::string version; ERegion region; EGame game; + EPlatform platform; std::string gameTitle; }; diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index dfb1f77a9..8123fa73b 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -589,14 +589,24 @@ void CMain::Init(const FileStoreManager& storeMgr, CVarManager* cvarMgr, boo::IA if (discInfo.gameId[4] != '0' || discInfo.gameId[5] != '1') { Log.report(logvisor::Fatal, FMT_STRING("Unknown game ID {}"), std::string_view{discInfo.gameId.data(), 6}); } - if (strncmp(discInfo.gameId.data(), "GM8", 3) == 0 || strncmp(discInfo.gameId.data(), "R3I", 3) == 0) { + if (strncmp(discInfo.gameId.data(), "GM8", 3) == 0) { m_version.game = EGame::MetroidPrime1; - } else if (strncmp(discInfo.gameId.data(), "G2M", 3) == 0 || strncmp(discInfo.gameId.data(), "R32", 3) == 0) { + m_version.platform = EPlatform::GameCube; + } else if (strncmp(discInfo.gameId.data(), "R3I", 3) == 0) { + m_version.game = EGame::MetroidPrime1; + m_version.platform = EPlatform::Wii; + } else if (strncmp(discInfo.gameId.data(), "G2M", 3) == 0) { m_version.game = EGame::MetroidPrime2; - } else if (strncmp(discInfo.gameId.data(), "R3M", 3) == 0) { - m_version.game = EGame::MetroidPrime3; + m_version.platform = EPlatform::GameCube; + } else if (strncmp(discInfo.gameId.data(), "R32", 3) == 0) { + m_version.game = EGame::MetroidPrime2; + m_version.platform = EPlatform::Wii; } else if (strncmp(discInfo.gameId.data(), "RM3", 3) == 0) { + m_version.game = EGame::MetroidPrime3; + m_version.platform = EPlatform::Wii; + } else if (strncmp(discInfo.gameId.data(), "R3M", 3) == 0) { m_version.game = EGame::MetroidPrimeTrilogy; + m_version.platform = EPlatform::Wii; } else { Log.report(logvisor::Fatal, FMT_STRING("Unknown game ID {}"), std::string_view{discInfo.gameId.data(), 6}); } @@ -625,9 +635,15 @@ void CMain::Init(const FileStoreManager& storeMgr, CVarManager* cvarMgr, boo::IA } { - CDvdFile file("default.dol"); + std::string_view dolFile = "default.dol"sv; + if (m_version.game == EGame::MetroidPrimeTrilogy) { + dolFile = "rs5mp1_p.dol"; + } else if (m_version.platform == EPlatform::Wii) { + dolFile = "rs5mp1jpn_p.dol"; + } + CDvdFile file(dolFile); if (!file) { - Log.report(logvisor::Fatal, FMT_STRING("Failed to open default.dol")); + Log.report(logvisor::Fatal, FMT_STRING("Failed to open {}"), dolFile); } std::unique_ptr buf = std::make_unique(file.Length()); u32 readLen = file.SyncRead(buf.get(), file.Length()); @@ -638,6 +654,14 @@ void CMain::Init(const FileStoreManager& storeMgr, CVarManager* cvarMgr, boo::IA m_version.version = buildInfo; } + MainLog.report(logvisor::Level::Info, FMT_STRING("Loading data from {} {} ({})"), GetGameTitle(), + magic_enum::enum_name(GetRegion()), GetVersionString()); + + if (m_version.game == EGame::MetroidPrimeTrilogy) { + CDvdFile::SetRootDirectory("MP1"); + } else if (m_version.platform == EPlatform::Wii) { + CDvdFile::SetRootDirectory("MP1JPN"); + } InitializeSubsystems(); AddOverridePaks(); x128_globalObjects->PostInitialize(); @@ -645,9 +669,6 @@ void CMain::Init(const FileStoreManager& storeMgr, CVarManager* cvarMgr, boo::IA x70_tweaks.RegisterResourceTweaks(m_cvarMgr); AddWorldPaks(); - MainLog.report(logvisor::Level::Info, FMT_STRING("Loading data from {} {} ({})"), - GetGameTitle(), magic_enum::enum_name(GetRegion()), GetVersionString()); - auto args = aurora::get_args(); for (auto it = args.begin(); it != args.end(); ++it) { if (*it == "--warp" && args.end() - it >= 3) {