yaze 0.2.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
patch.cc
Go to the documentation of this file.
1#include "asar-dll-bindings/c/asar.h"
2#include "cli/z3ed.h"
3#include "util/bps.h"
4
5namespace yaze {
6namespace cli {
7
8absl::Status ApplyPatch::Run(const std::vector<std::string>& arg_vec) {
9 std::string rom_filename = arg_vec[1];
10 std::string patch_filename = arg_vec[2];
11 RETURN_IF_ERROR(rom_.LoadFromFile(rom_filename))
12 auto source = rom_.vector();
13 std::ifstream patch_file(patch_filename, std::ios::binary);
14 std::vector<uint8_t> patch;
15 patch.resize(rom_.size());
16 patch_file.read((char*)patch.data(), patch.size());
17
18 // Apply patch
19 std::vector<uint8_t> patched;
20 util::ApplyBpsPatch(source, patch, patched);
21
22 // Save patched file
23 std::ofstream patched_rom("patched.sfc", std::ios::binary);
24 patched_rom.write((char*)patched.data(), patched.size());
25 patched_rom.close();
26 return absl::OkStatus();
27}
28
29absl::Status AsarPatch::Run(const std::vector<std::string>& arg_vec) {
30 std::string patch_filename = arg_vec[1];
31 std::string rom_filename = arg_vec[2];
32 RETURN_IF_ERROR(rom_.LoadFromFile(rom_filename))
33 int buflen = rom_.vector().size();
34 int romlen = rom_.vector().size();
35 if (!asar_patch(patch_filename.c_str(), rom_filename.data(), buflen,
36 &romlen)) {
37 std::string error_message = "Failed to apply patch: ";
38 int num_errors = 0;
39 const errordata* errors = asar_geterrors(&num_errors);
40 for (int i = 0; i < num_errors; i++) {
41 error_message += absl::StrFormat("%s", errors[i].fullerrdata);
42 }
43 return absl::InternalError(error_message);
44 }
45 return absl::OkStatus();
46}
47
48absl::Status CreatePatch::Run(const std::vector<std::string>& arg_vec) {
49 std::vector<uint8_t> source;
50 std::vector<uint8_t> target;
51 std::vector<uint8_t> patch;
52 // Create patch
53 util::CreateBpsPatch(source, target, patch);
54
55 // Save patch to file
56 // std::ofstream patchFile("patch.bps", ios::binary);
57 // patchFile.write(reinterpret_cast<const char*>(patch.data()),
58 // patch.size()); patchFile.close();
59 return absl::OkStatus();
60}
61
62} // namespace cli
63} // namespace yaze
absl::Status Run(const std::vector< std::string > &arg_vec) override
Definition patch.cc:8
absl::Status Run(const std::vector< std::string > &arg_vec) override
Definition patch.cc:29
absl::Status Run(const std::vector< std::string > &arg_vec) override
Definition patch.cc:48
#define RETURN_IF_ERROR(expression)
Definition macro.h:51
Namespace for the command line interface.
Definition compress.cc:4
void CreateBpsPatch(const std::vector< uint8_t > &source, const std::vector< uint8_t > &target, std::vector< uint8_t > &patch)
Definition bps.cc:47
void ApplyBpsPatch(const std::vector< uint8_t > &source, const std::vector< uint8_t > &patch, std::vector< uint8_t > &target)
Definition bps.cc:136
Main namespace for the application.
Definition controller.cc:18