|
@@ -17,6 +17,7 @@
|
|
|
#include "core/hle/service/sm/sm.h"
|
|
#include "core/hle/service/sm/sm.h"
|
|
|
#include "core/loader/loader.h"
|
|
#include "core/loader/loader.h"
|
|
|
#include "core/settings.h"
|
|
#include "core/settings.h"
|
|
|
|
|
+#include "file_sys/vfs_concat.h"
|
|
|
#include "file_sys/vfs_real.h"
|
|
#include "file_sys/vfs_real.h"
|
|
|
#include "video_core/renderer_base.h"
|
|
#include "video_core/renderer_base.h"
|
|
|
#include "video_core/video_core.h"
|
|
#include "video_core/video_core.h"
|
|
@@ -88,8 +89,39 @@ System::ResultStatus System::SingleStep() {
|
|
|
return RunLoop(false);
|
|
return RunLoop(false);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
|
|
|
|
|
+ const std::string& path) {
|
|
|
|
|
+ // To account for split 00+01+etc files.
|
|
|
|
|
+ std::string dir_name;
|
|
|
|
|
+ std::string filename;
|
|
|
|
|
+ Common::SplitPath(path, &dir_name, &filename, nullptr);
|
|
|
|
|
+ if (filename == "00") {
|
|
|
|
|
+ const auto dir = vfs->OpenDirectory(dir_name, FileSys::Mode::Read);
|
|
|
|
|
+ std::vector<FileSys::VirtualFile> concat;
|
|
|
|
|
+ for (u8 i = 0; i < 0x10; ++i) {
|
|
|
|
|
+ auto next = dir->GetFile(fmt::format("{:02X}", i));
|
|
|
|
|
+ if (next != nullptr)
|
|
|
|
|
+ concat.push_back(std::move(next));
|
|
|
|
|
+ else {
|
|
|
|
|
+ next = dir->GetFile(fmt::format("{:02x}", i));
|
|
|
|
|
+ if (next != nullptr)
|
|
|
|
|
+ concat.push_back(std::move(next));
|
|
|
|
|
+ else
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (concat.empty())
|
|
|
|
|
+ return nullptr;
|
|
|
|
|
+
|
|
|
|
|
+ return FileSys::ConcatenateFiles(concat, dir->GetName());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return vfs->OpenFile(path, FileSys::Mode::Read);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
System::ResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::string& filepath) {
|
|
System::ResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::string& filepath) {
|
|
|
- app_loader = Loader::GetLoader(virtual_filesystem->OpenFile(filepath, FileSys::Mode::Read));
|
|
|
|
|
|
|
+ app_loader = Loader::GetLoader(GetGameFileFromPath(virtual_filesystem, filepath));
|
|
|
|
|
|
|
|
if (!app_loader) {
|
|
if (!app_loader) {
|
|
|
LOG_CRITICAL(Core, "Failed to obtain loader for {}!", filepath);
|
|
LOG_CRITICAL(Core, "Failed to obtain loader for {}!", filepath);
|