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
This commit is contained in:
Christopher Leggett 2022-10-17 18:44:10 -04:00 committed by GitHub
parent e96df1649f
commit f300c02b63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 5 deletions

View File

@ -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());
}
}
}

View File

@ -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;

View File

@ -12,6 +12,8 @@ void Exit();
void ThrowMissingOTR(const char* otrPath);
void ThrowInvalidOTR();
void Update();
VPADStatus *GetVPADStatus(VPADReadError *error);

View File

@ -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<uint32_t> 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<SaveStateMgr>();
gRandomizer = std::make_shared<Randomizer>();
@ -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: