patch_manager: Apply LayeredExeFS patches
This will scan the <mod>/exefs dir for all files and then layer those on top of the game's exefs and use this as the new exefs. This allows for overriding of the compressed NSOs or adding new files. This does use the same dir as IPS/IPSwitch patch, but since the loader will not look for those they are ignored.
This commit is contained in:
parent
17d8e25cbf
commit
da6d4cde56
@ -79,6 +79,31 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const {
|
|||||||
exefs = update->GetExeFS();
|
exefs = update->GetExeFS();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LayeredExeFS
|
||||||
|
const auto load_dir = Service::FileSystem::GetModificationLoadRoot(title_id);
|
||||||
|
if (load_dir != nullptr && load_dir->GetSize() > 0) {
|
||||||
|
|
||||||
|
auto patch_dirs = load_dir->GetSubdirectories();
|
||||||
|
std::sort(
|
||||||
|
patch_dirs.begin(), patch_dirs.end(),
|
||||||
|
[](const VirtualDir& l, const VirtualDir& r) { return l->GetName() < r->GetName(); });
|
||||||
|
|
||||||
|
std::vector<VirtualDir> layers;
|
||||||
|
layers.reserve(patch_dirs.size() + 1);
|
||||||
|
for (const auto& subdir : patch_dirs) {
|
||||||
|
auto exefs_dir = subdir->GetSubdirectory("exefs");
|
||||||
|
if (exefs_dir != nullptr)
|
||||||
|
layers.push_back(std::move(exefs_dir));
|
||||||
|
}
|
||||||
|
layers.push_back(exefs);
|
||||||
|
|
||||||
|
auto layered = LayeredVfsDirectory::MakeLayeredDirectory(std::move(layers));
|
||||||
|
if (layered != nullptr) {
|
||||||
|
LOG_INFO(Loader, " ExeFS: LayeredExeFS patches applied successfully");
|
||||||
|
exefs = std::move(layered);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return exefs;
|
return exefs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user