From f300c02b6322f28ab670c3a383cd47b0a9844a7e Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Mon, 17 Oct 2022 18:44:10 -0400 Subject: [PATCH] Re-enables OTR patches from mods folder (#1785) * Re-enables OTR patches from mods folder. * Don't error if an OTR doesn't include a version file Just info log and continue. If the patch fails to apply then we can error, and SoH can do it's own validation later. * Fixes small error on my side --- libultraship/libultraship/Archive.cpp | 7 +++---- libultraship/libultraship/WiiUImpl.cpp | 4 ++++ libultraship/libultraship/WiiUImpl.h | 2 ++ soh/soh/OTRGlobals.cpp | 24 +++++++++++++++++++++++- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/libultraship/libultraship/Archive.cpp b/libultraship/libultraship/Archive.cpp index fb4890c16..ac40ad34f 100644 --- a/libultraship/libultraship/Archive.cpp +++ b/libultraship/libultraship/Archive.cpp @@ -448,12 +448,12 @@ namespace Ship { } for (int j = i; j < OTRFiles.size(); j++) { #ifdef _WIN32 - std::wstring wfullPath = std::filesystem::absolute(OTRFiles[i]).wstring(); + std::wstring wfullPath = std::filesystem::absolute(OTRFiles[j]).wstring(); #endif #if defined(__SWITCH__) std::string fullPath = OTRFiles[i]; #else - std::string fullPath = std::filesystem::absolute(OTRFiles[i]).string(); + std::string fullPath = std::filesystem::absolute(OTRFiles[j]).string(); #endif if (LoadPatchMPQ(fullPath, true)) { @@ -493,8 +493,7 @@ namespace Ship { // i.e. Ocarina of Time along with Master Quest. if (validateVersion) { if (!PushGameVersion(patchHandle)) { - SPDLOG_WARN("({}) Invalid MQP file.", path.c_str()); - return false; + SPDLOG_INFO("({}) Missing version file. Attempting to apply patch anyway.", path.c_str()); } } } diff --git a/libultraship/libultraship/WiiUImpl.cpp b/libultraship/libultraship/WiiUImpl.cpp index 41439542a..68e3e58b2 100644 --- a/libultraship/libultraship/WiiUImpl.cpp +++ b/libultraship/libultraship/WiiUImpl.cpp @@ -77,6 +77,10 @@ void ThrowMissingOTR(const char* otrPath) { OSFatal("Main OTR file not found!"); } +void ThrowInvalidOTR() { + OSFatal("Invalid OTR files! Try regenerating them!"); +} + void Update() { bool rescan = false; diff --git a/libultraship/libultraship/WiiUImpl.h b/libultraship/libultraship/WiiUImpl.h index 8c8e64b54..fe5d42fe6 100644 --- a/libultraship/libultraship/WiiUImpl.h +++ b/libultraship/libultraship/WiiUImpl.h @@ -12,6 +12,8 @@ void Exit(); void ThrowMissingOTR(const char* otrPath); +void ThrowInvalidOTR(); + void Update(); VPADStatus *GetVPADStatus(VPADReadError *error); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 2fa52a624..7a5ba86cd 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -86,6 +86,16 @@ OTRGlobals::OTRGlobals() { if (std::filesystem::exists(ootPath)) { OTRFiles.push_back(ootPath); } + std::string patchesPath = Ship::Window::GetPathRelativeToAppDirectory("mods"); + if (patchesPath.length() > 0 && std::filesystem::exists(patchesPath)) { + if (std::filesystem::is_directory(patchesPath)) { + for (const auto& p : std::filesystem::recursive_directory_iterator(patchesPath)) { + if (StringHelper::IEquals(p.path().extension().string(), ".otr")) { + OTRFiles.push_back(p.path().generic_string()); + } + } + } + } std::unordered_set ValidHashes = { OOT_PAL_MQ, OOT_NTSC_JP_MQ, @@ -103,7 +113,7 @@ OTRGlobals::OTRGlobals() { OOT_PAL_GC_DBG1, OOT_PAL_GC_DBG2 }; - context = Ship::Window::CreateInstance("Ship of Harkinian", OTRFiles, ValidHashes); + context = Ship::Window::CreateInstance("Ship of Harkinian", OTRFiles); gSaveStateMgr = std::make_shared(); gRandomizer = std::make_shared(); @@ -112,6 +122,18 @@ OTRGlobals::OTRGlobals() { auto versions = context->GetResourceManager()->GetGameVersions(); for (uint32_t version : versions) { + if (!ValidHashes.contains(version)) { +#if defined(__SWITCH__) + printf("Invalid OTR File!\n"); +#elif defined(__WIIU__) + Ship::WiiU::ThrowInvalidOTR(); +#else + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Invalid OTR File", + "Attempted to load an invalid OTR file. Try regenerating.", nullptr); + SPDLOG_ERROR("Invalid OTR File!"); +#endif + exit(1); + } switch (version) { case OOT_PAL_MQ: case OOT_NTSC_JP_MQ: