yaze 0.2.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
z3ed.h
Go to the documentation of this file.
1#ifndef YAZE_CLI_Z3ED_H
2#define YAZE_CLI_Z3ED_H
3
4#include <cstdint>
5#include <iostream>
6#include <memory>
7#include <sstream>
8#include <string>
9#include <unordered_map>
10#include <vector>
11
12#include "absl/status/status.h"
13#include "app/rom.h"
14#include "util/macro.h"
15
16namespace yaze {
17namespace cli {
18
35
36 public:
37 explicit ColorModifier(ColorCode pCode) : code(pCode) {}
38 friend std::ostream& operator<<(std::ostream& os, const ColorModifier& mod) {
39 return os << "\033[" << mod.code << "m";
40 }
41};
42
44 public:
45 CommandHandler() = default;
46 virtual ~CommandHandler() = default;
47 virtual absl::Status handle(const std::vector<std::string>& arg_vec) = 0;
48
50};
51
52class ApplyPatch : public CommandHandler {
53 public:
54 absl::Status handle(const std::vector<std::string>& arg_vec) override;
55};
56
57class AsarPatch : public CommandHandler {
58 public:
59 absl::Status handle(const std::vector<std::string>& arg_vec) override;
60};
61
63 public:
64 absl::Status handle(const std::vector<std::string>& arg_vec) override;
65};
66
68 public:
69 absl::Status handle(const std::vector<std::string>& arg_vec) override;
70};
71
72class Open : public CommandHandler {
73 public:
74 absl::Status handle(const std::vector<std::string>& arg_vec) override {
78 auto const& arg = arg_vec[0];
79 RETURN_IF_ERROR(rom_.LoadFromFile(arg))
80 std::cout << "Title: " << green << rom_.title() << std::endl;
81 std::cout << reset << "Size: " << blue << "0x" << std::hex << rom_.size()
82 << reset << std::endl;
83 return absl::OkStatus();
84 }
85};
86
87class Backup : public CommandHandler {
88 public:
89 absl::Status handle(const std::vector<std::string>& arg_vec) override {
90 RETURN_IF_ERROR(rom_.LoadFromFile(arg_vec[0]))
91 if (arg_vec.size() == 2) {
92 // Optional filename added
93 RETURN_IF_ERROR(rom_.SaveToFile(/*backup=*/true, false, arg_vec[1]))
94 } else {
95 RETURN_IF_ERROR(rom_.SaveToFile(/*backup=*/true))
96 }
97 return absl::OkStatus();
98 }
99};
100
101class Compress : public CommandHandler {
102 public:
103 absl::Status handle(const std::vector<std::string>& arg_vec) override;
104};
105
107 public:
108 absl::Status handle(const std::vector<std::string>& arg_vec) override;
109};
110
118 public:
119 absl::Status handle(const std::vector<std::string>& arg_vec) override {
120 auto arg = arg_vec[0];
121 std::stringstream ss(arg.data());
122 uint32_t snes_address;
123 ss >> std::hex >> snes_address;
124 uint32_t pc_address = SnesToPc(snes_address);
125 std::cout << std::hex << pc_address << std::endl;
126 return absl::OkStatus();
127 }
128};
129
137 public:
138 absl::Status handle(const std::vector<std::string>& arg_vec) override {
139 auto arg = arg_vec[0];
140 std::stringstream ss(arg.data());
141 uint32_t pc_address;
142 ss >> std::hex >> pc_address;
143 uint32_t snes_address = PcToSnes(pc_address);
145 std::cout << "SNES LoROM Address: ";
146 std::cout << blue << "$" << std::uppercase << std::hex << snes_address
147 << "\n";
148 return absl::OkStatus();
149 }
150};
151
159 public:
160 absl::Status handle(const std::vector<std::string>& arg_vec) override {
161 RETURN_IF_ERROR(rom_.LoadFromFile(arg_vec[0]))
162
163 std::stringstream ss(arg_vec[1].data());
164 uint32_t offset;
165 ss >> std::hex >> offset;
166 uint32_t length = 0x01;
167 if (!arg_vec[2].empty()) {
168 length = std::stoi(arg_vec[2]);
169 }
170
171 if (length > 1) {
172 auto returned_bytes_status = rom_.ReadByteVector(offset, length);
173 if (!returned_bytes_status.ok()) {
174 return returned_bytes_status.status();
175 }
176 auto returned_bytes = returned_bytes_status.value();
177 for (const auto& each : returned_bytes) {
178 std::cout << each;
179 }
180 std::cout << std::endl;
181 } else {
182 auto byte = rom_.ReadByte(offset);
183 std::cout << std::hex << byte.value() << std::endl;
184 }
185
186 return absl::OkStatus();
187 }
188};
189
196class Expand : public CommandHandler {
197 public:
198 absl::Status handle(const std::vector<std::string>& arg_vec) override {
199 RETURN_IF_ERROR(rom_.LoadFromFile(arg_vec[0]))
200
201 std::stringstream ss(arg_vec[1].data());
202 uint32_t size;
203 ss >> std::hex >> size;
204
205 rom_.Expand(size);
206
207 std::cout << "Successfully expanded ROM to " << std::hex << size
208 << std::endl;
209
210 return absl::OkStatus();
211 }
212};
213
217struct Commands {
218 std::unordered_map<std::string, std::shared_ptr<CommandHandler>> handlers = {
219 {"-a", std::make_shared<ApplyPatch>()},
220 {"-asar", std::make_shared<AsarPatch>()},
221 {"-c", std::make_shared<CreatePatch>()},
222 {"-o", std::make_shared<Open>()},
223 {"-b", std::make_shared<Backup>()},
224 {"-x", std::make_shared<Expand>()},
225 {"-i", std::make_shared<Compress>()}, // Import
226 {"-e", std::make_shared<Decompress>()}, // Export
227 {"-s", std::make_shared<SnesToPcCommand>()},
228 {"-p", std::make_shared<PcToSnesCommand>()},
229 {"-t", std::make_shared<Tile16Transfer>()},
230 {"-r", std::make_shared<ReadFromRom>()} // Read from Rom
231 };
232};
233
234} // namespace cli
235} // namespace yaze
236
237#endif
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:59
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition patch.cc:10
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition patch.cc:31
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition z3ed.h:89
friend std::ostream & operator<<(std::ostream &os, const ColorModifier &mod)
Definition z3ed.h:38
ColorModifier(ColorCode pCode)
Definition z3ed.h:37
virtual ~CommandHandler()=default
virtual absl::Status handle(const std::vector< std::string > &arg_vec)=0
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition compress.cc:6
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition patch.cc:50
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition compress.cc:11
Expand a Rom file.
Definition z3ed.h:196
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition z3ed.h:198
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition z3ed.h:74
Convert a PC address to a SNES address.
Definition z3ed.h:136
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition z3ed.h:138
Read from a Rom file.
Definition z3ed.h:158
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition z3ed.h:160
Convert a SNES address to a PC address.
Definition z3ed.h:117
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition z3ed.h:119
absl::Status handle(const std::vector< std::string > &arg_vec) override
#define RETURN_IF_ERROR(expression)
Definition macro.h:62
Namespace for the command line interface.
Definition compress.cc:4
ColorCode
Definition z3ed.h:19
@ BG_GREEN
Definition z3ed.h:29
@ FG_RESET
Definition z3ed.h:26
@ BG_BLUE
Definition z3ed.h:30
@ BG_RED
Definition z3ed.h:28
@ FG_RED
Definition z3ed.h:20
@ FG_MAGENTA
Definition z3ed.h:24
@ BG_DEFAULT
Definition z3ed.h:31
@ FG_DEFAULT
Definition z3ed.h:25
@ FG_UNDERLINE
Definition z3ed.h:27
@ FG_YELLOW
Definition z3ed.h:22
@ FG_GREEN
Definition z3ed.h:21
@ FG_BLUE
Definition z3ed.h:23
Main namespace for the application.
Definition controller.cc:18
uint32_t PcToSnes(uint32_t addr)
Definition rom.h:336
uint32_t SnesToPc(uint32_t addr) noexcept
Definition rom.h:328
Command handler for the CLI.
Definition z3ed.h:217
std::unordered_map< std::string, std::shared_ptr< CommandHandler > > handlers
Definition z3ed.h:218