aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2025-10-22 00:57:42 +0200
committercrueter <crueter@eden-emu.dev>2025-10-22 00:57:42 +0200
commit6ff043c4fbd5dae5e0b1ec73a3bb4003e8cef20b (patch)
treecd64c8fff5e1e1381d054f4e3b083ae0b5faec84 /src
parent86432f95520bac02fad724b58c0cb6c76ffadc93 (diff)
[core/filesystem] "easier" cheats folder structure like Ryujinx (#2795)
Less annoying way to make cheats Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2795 Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src')
-rw-r--r--src/core/file_sys/patch_manager.cpp41
1 files changed, 24 insertions, 17 deletions
diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp
index 11984ca7ca..a28fdf9056 100644
--- a/src/core/file_sys/patch_manager.cpp
+++ b/src/core/file_sys/patch_manager.cpp
@@ -316,8 +316,7 @@ bool PatchManager::HasNSOPatch(const BuildID& build_id_, std::string_view name)
return !CollectPatches(patch_dirs, build_id).empty();
}
-std::vector<Core::Memory::CheatEntry> PatchManager::CreateCheatList(
- const BuildID& build_id_) const {
+std::vector<Core::Memory::CheatEntry> PatchManager::CreateCheatList(const BuildID& build_id_) const {
const auto load_dir = fs_controller.GetModificationLoadRoot(title_id);
if (load_dir == nullptr) {
LOG_ERROR(Loader, "Cannot load mods for invalid title_id={:016X}", title_id);
@@ -326,28 +325,36 @@ std::vector<Core::Memory::CheatEntry> PatchManager::CreateCheatList(
const auto& disabled = Settings::values.disabled_addons[title_id];
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::sort(patch_dirs.begin(), patch_dirs.end(), [](auto const& l, auto const& r) { return l->GetName() < r->GetName(); });
+ // <mod dir> / <folder> / cheats / <build id>.txt
std::vector<Core::Memory::CheatEntry> out;
for (const auto& subdir : patch_dirs) {
- if (std::find(disabled.cbegin(), disabled.cend(), subdir->GetName()) != disabled.cend()) {
- continue;
- }
-
- auto cheats_dir = FindSubdirectoryCaseless(subdir, "cheats");
- if (cheats_dir != nullptr) {
- if (const auto res = ReadCheatFileFromFolder(title_id, build_id_, cheats_dir, true)) {
- std::copy(res->begin(), res->end(), std::back_inserter(out));
- continue;
+ if (std::find(disabled.cbegin(), disabled.cend(), subdir->GetName()) == disabled.cend()) {
+ if (auto cheats_dir = FindSubdirectoryCaseless(subdir, "cheats"); cheats_dir != nullptr) {
+ if (auto const res = ReadCheatFileFromFolder(title_id, build_id_, cheats_dir, true))
+ std::copy(res->begin(), res->end(), std::back_inserter(out));
+ if (auto const res = ReadCheatFileFromFolder(title_id, build_id_, cheats_dir, false))
+ std::copy(res->begin(), res->end(), std::back_inserter(out));
}
-
- if (const auto res = ReadCheatFileFromFolder(title_id, build_id_, cheats_dir, false)) {
- std::copy(res->begin(), res->end(), std::back_inserter(out));
+ }
+ }
+ // Uncareless user-friendly loading of patches (must start with 'cheat_')
+ // <mod dir> / <cheat file>.txt
+ auto const patch_files = load_dir->GetFiles();
+ for (auto const& f : patch_files) {
+ auto const name = f->GetName();
+ if (name.starts_with("cheat_") && std::find(disabled.cbegin(), disabled.cend(), name) == disabled.cend()) {
+ std::vector<u8> data(f->GetSize());
+ if (f->Read(data.data(), data.size()) == data.size()) {
+ const Core::Memory::TextCheatParser parser;
+ auto const res = parser.Parse(std::string_view(reinterpret_cast<const char*>(data.data()), data.size()));
+ std::copy(res.begin(), res.end(), std::back_inserter(out));
+ } else {
+ LOG_INFO(Common_Filesystem, "Failed to read cheats file for title_id={:016X}", title_id);
}
}
}
-
return out;
}