diff options
| author | lizzie <lizzie@eden-emu.dev> | 2025-10-22 00:57:42 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2025-10-22 00:57:42 +0200 |
| commit | 6ff043c4fbd5dae5e0b1ec73a3bb4003e8cef20b (patch) | |
| tree | cd64c8fff5e1e1381d054f4e3b083ae0b5faec84 /src/core | |
| parent | 86432f95520bac02fad724b58c0cb6c76ffadc93 (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/core')
| -rw-r--r-- | src/core/file_sys/patch_manager.cpp | 41 |
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; } |
