add AsarPatch CommandHandler to z3ed

This commit is contained in:
scawful
2024-08-07 14:48:42 -04:00
parent c462d97106
commit 7432eeb630

View File

@@ -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<std::string>& 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<std::string>& arg_vec) override {
@@ -328,6 +367,7 @@ struct Commands {
std::unordered_map<std::string, std::shared_ptr<CommandHandler>> handlers = {
{"-emu", std::make_shared<Emulator>()},
{"-a", std::make_shared<ApplyPatch>()},
{"-asar", std::make_shared<AsarPatch>()},
{"-c", std::make_shared<CreatePatch>()},
{"-o", std::make_shared<Open>()},
{"-b", std::make_shared<Backup>()},