mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-31 07:59:02 -05:00 
			
		
		
		
	patch_manager: Add support for loading cheats lists
Uses load/<title_id>/<mod_name>/cheats as root dir, file name is all upper or lower hex first 8 bytes build ID.
This commit is contained in:
		| @@ -7,6 +7,7 @@ | ||||
| #include <cstddef> | ||||
| #include <cstring> | ||||
|  | ||||
| #include "common/file_util.h" | ||||
| #include "common/hex_util.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/file_sys/content_archive.h" | ||||
| @@ -232,6 +233,57 @@ bool PatchManager::HasNSOPatch(const std::array<u8, 32>& build_id_) const { | ||||
|     return !CollectPatches(patch_dirs, build_id).empty(); | ||||
| } | ||||
|  | ||||
| static std::optional<CheatList> ReadCheatFileFromFolder(u64 title_id, | ||||
|                                                         const std::array<u8, 0x20>& build_id_, | ||||
|                                                         const VirtualDir& base_path, bool upper) { | ||||
|     const auto build_id_raw = Common::HexArrayToString(build_id_, upper); | ||||
|     const auto build_id = build_id_raw.substr(0, sizeof(u64) * 2); | ||||
|     const auto file = base_path->GetFile(fmt::format("{}.txt", build_id)); | ||||
|  | ||||
|     if (file == nullptr) { | ||||
|         LOG_INFO(Common_Filesystem, "No cheats file found for title_id={:016X}, build_id={}", | ||||
|                  title_id, build_id); | ||||
|         return std::nullopt; | ||||
|     } | ||||
|  | ||||
|     std::vector<u8> data(file->GetSize()); | ||||
|     if (file->Read(data.data(), data.size()) != data.size()) { | ||||
|         LOG_INFO(Common_Filesystem, "Failed to read cheats file for title_id={:016X}, build_id={}", | ||||
|                  title_id, build_id); | ||||
|         return std::nullopt; | ||||
|     } | ||||
|  | ||||
|     TextCheatParser parser; | ||||
|     return parser.Parse(data); | ||||
| } | ||||
|  | ||||
| std::vector<CheatList> PatchManager::CreateCheatList(const std::array<u8, 32>& build_id_) const { | ||||
|     std::vector<CheatList> out; | ||||
|  | ||||
|     const auto load_dir = Service::FileSystem::GetModificationLoadRoot(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(); }); | ||||
|  | ||||
|     out.reserve(patch_dirs.size()); | ||||
|     for (const auto& subdir : patch_dirs) { | ||||
|         auto cheats_dir = subdir->GetSubdirectory("cheats"); | ||||
|         if (cheats_dir != nullptr) { | ||||
|             auto res = ReadCheatFileFromFolder(title_id, build_id_, cheats_dir, true); | ||||
|             if (res.has_value()) { | ||||
|                 out.push_back(std::move(*res)); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             res = ReadCheatFileFromFolder(title_id, build_id_, cheats_dir, false); | ||||
|             if (res.has_value()) | ||||
|                 out.push_back(std::move(*res)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return out; | ||||
| } | ||||
|  | ||||
| static void ApplyLayeredFS(VirtualFile& romfs, u64 title_id, ContentRecordType type) { | ||||
|     const auto load_dir = Service::FileSystem::GetModificationLoadRoot(title_id); | ||||
|     if ((type != ContentRecordType::Program && type != ContentRecordType::Data) || | ||||
|   | ||||
| @@ -8,6 +8,7 @@ | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include "common/common_types.h" | ||||
| #include "core/file_sys/cheat_engine.h" | ||||
| #include "core/file_sys/nca_metadata.h" | ||||
| #include "core/file_sys/vfs.h" | ||||
|  | ||||
| @@ -45,6 +46,9 @@ public: | ||||
|     // Used to prevent expensive copies in NSO loader. | ||||
|     bool HasNSOPatch(const std::array<u8, 0x20>& build_id) const; | ||||
|  | ||||
|     // Creates a CheatList object with all | ||||
|     std::vector<CheatList> CreateCheatList(const std::array<u8, 0x20>& build_id) const; | ||||
|  | ||||
|     // Currently tracked RomFS patches: | ||||
|     // - Game Updates | ||||
|     // - LayeredFS | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zach Hilman
					Zach Hilman