From 7432eeb63009925b83353a82baaba39b36a9fb84 Mon Sep 17 00:00:00 2001 From: scawful Date: Wed, 7 Aug 2024 14:48:42 -0400 Subject: [PATCH] add AsarPatch CommandHandler to z3ed --- src/cli/command_handler.h | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/cli/command_handler.h b/src/cli/command_handler.h index f50bb3db..883c7375 100644 --- a/src/cli/command_handler.h +++ b/src/cli/command_handler.h @@ -24,6 +24,23 @@ #include "app/zelda3/overworld/overworld.h" #include "asar.h" +extern "C" bool asar_patch(const char* patchloc, char* romdata, int buflen, + int* romlen); + +// These structures are returned from various functions. +struct errordata { + const char* fullerrdata; + const char* rawerrdata; + const char* block; + const char* filename; + int line; + const char* callerfilename; + int callerline; + int errid; +}; + +extern "C" const struct errordata* asar_geterrors(int* count); + namespace yaze { namespace cli { @@ -86,6 +103,28 @@ class ApplyPatch : public CommandHandler { } }; +class AsarPatch : public CommandHandler { + public: + absl::Status handle(const std::vector& arg_vec) override { + std::string patch_filename = arg_vec[1]; + std::string rom_filename = arg_vec[2]; + RETURN_IF_ERROR(rom_.LoadFromFile(rom_filename)) + int buflen = rom_.vector().size(); + int romlen = rom_.vector().size(); + if (!asar_patch(patch_filename.c_str(), rom_filename.data(), buflen, + &romlen)) { + std::string error_message = "Failed to apply patch: "; + int num_errors = 0; + const errordata* errors = asar_geterrors(&num_errors); + for (int i = 0; i < num_errors; i++) { + error_message += absl::StrFormat("%s", errors[i].fullerrdata); + } + return absl::InternalError(error_message); + } + return absl::OkStatus(); + } +}; + class CreatePatch : public CommandHandler { public: absl::Status handle(const std::vector& arg_vec) override { @@ -328,6 +367,7 @@ struct Commands { std::unordered_map> handlers = { {"-emu", std::make_shared()}, {"-a", std::make_shared()}, + {"-asar", std::make_shared()}, {"-c", std::make_shared()}, {"-o", std::make_shared()}, {"-b", std::make_shared()},