yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
dungeon_commands.cc
Go to the documentation of this file.
2
3#include "absl/strings/str_format.h"
4#include "cli/util/hex_util.h"
6
7namespace yaze {
8namespace cli {
9namespace handlers {
10
12
14 Rom* rom, const resources::ArgumentParser& parser,
15 resources::OutputFormatter& formatter) {
16 auto room_id_str = parser.GetString("room").value();
17
18 int room_id;
19 if (!ParseHexString(room_id_str, &room_id)) {
20 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
21 }
22
23 formatter.BeginObject("Dungeon Room Sprites");
24 formatter.AddField("room_id", room_id);
25
26 // Use existing dungeon system
27 zelda3::DungeonEditorSystem dungeon_editor(rom);
28 auto room_or = dungeon_editor.GetRoom(room_id);
29 if (!room_or.ok()) {
30 formatter.AddField("status", "error");
31 formatter.AddField("error", room_or.status().ToString());
32 formatter.EndObject();
33 return room_or.status();
34 }
35
36 auto& room = room_or.value();
37
38 // TODO: Implement sprite listing from room data
39 formatter.AddField("total_sprites", 0);
40 formatter.AddField("status", "not_implemented");
41 formatter.AddField("message", "Sprite listing requires room sprite parsing");
42
43 formatter.BeginArray("sprites");
44 formatter.EndArray();
45 formatter.EndObject();
46
47 return absl::OkStatus();
48}
49
51 Rom* rom, const resources::ArgumentParser& parser,
52 resources::OutputFormatter& formatter) {
53 auto room_id_str = parser.GetString("room").value();
54
55 int room_id;
56 if (!ParseHexString(room_id_str, &room_id)) {
57 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
58 }
59
60 formatter.BeginObject("Dungeon Room Description");
61 formatter.AddField("room_id", room_id);
62
63 // Use existing dungeon system
64 zelda3::DungeonEditorSystem dungeon_editor(rom);
65 auto room_or = dungeon_editor.GetRoom(room_id);
66 if (!room_or.ok()) {
67 formatter.AddField("status", "error");
68 formatter.AddField("error", room_or.status().ToString());
69 formatter.EndObject();
70 return room_or.status();
71 }
72
73 auto& room = room_or.value();
74
75 formatter.AddField("status", "success");
76 formatter.AddField("name", absl::StrFormat("Room %d", room.id()));
77 formatter.AddField("room_id", room.id());
78 formatter.AddField("room_type", "Dungeon Room");
79
80 // Room properties from Room data
81 formatter.BeginObject("properties");
82 formatter.AddField("blockset", room.blockset);
83 formatter.AddField("spriteset", room.spriteset);
84 formatter.AddField("palette", room.palette);
85 formatter.AddField("layout", room.layout);
86 formatter.AddField("floor1", room.floor1());
87 formatter.AddField("floor2", room.floor2());
88 formatter.AddField("effect", static_cast<int>(room.effect()));
89 formatter.AddField("tag1", static_cast<int>(room.tag1()));
90 formatter.AddField("tag2", static_cast<int>(room.tag2()));
91
92 // Check object counts for simple heuristics
93 room.LoadObjects();
94 formatter.AddField("object_count",
95 static_cast<int>(room.GetTileObjects().size()));
96
97 formatter.EndObject();
98
99 formatter.EndObject();
100
101 return absl::OkStatus();
102}
103
105 Rom* rom, const resources::ArgumentParser& parser,
106 resources::OutputFormatter& formatter) {
107 auto room_id_str = parser.GetString("room").value();
108
109 int room_id;
110 if (!ParseHexString(room_id_str, &room_id)) {
111 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
112 }
113
114 formatter.BeginObject("Dungeon Export");
115 formatter.AddField("room_id", room_id);
116
117 // Use existing dungeon system
118 zelda3::DungeonEditorSystem dungeon_editor(rom);
119 auto room_or = dungeon_editor.GetRoom(room_id);
120 if (!room_or.ok()) {
121 formatter.AddField("status", "error");
122 formatter.AddField("error", room_or.status().ToString());
123 formatter.EndObject();
124 return room_or.status();
125 }
126
127 auto& room = room_or.value();
128
129 // Export room data
130 formatter.AddField("status", "success");
131 formatter.AddField("room_width", "Unknown");
132 formatter.AddField("room_height", "Unknown");
133 formatter.AddField("room_name", absl::StrFormat("Room %d", room.id()));
134
135 // Add room data as JSON
136 formatter.BeginObject("room_data");
137 formatter.AddField("tiles", "Room tile data would be exported here");
138 formatter.AddField("sprites", "Room sprite data would be exported here");
139 formatter.AddField("doors", "Room door data would be exported here");
140 formatter.EndObject();
141
142 formatter.EndObject();
143
144 return absl::OkStatus();
145}
146
148 Rom* rom, const resources::ArgumentParser& parser,
149 resources::OutputFormatter& formatter) {
150 auto room_id_str = parser.GetString("room").value();
151
152 int room_id;
153 if (!ParseHexString(room_id_str, &room_id)) {
154 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
155 }
156
157 formatter.BeginObject("Dungeon Room Objects");
158 formatter.AddField("room_id", room_id);
159
160 // Use existing dungeon system
161 zelda3::DungeonEditorSystem dungeon_editor(rom);
162 auto room_or = dungeon_editor.GetRoom(room_id);
163 if (!room_or.ok()) {
164 formatter.AddField("status", "error");
165 formatter.AddField("error", room_or.status().ToString());
166 formatter.EndObject();
167 return room_or.status();
168 }
169
170 auto& room = room_or.value();
171
172 // Load objects if not already loaded (GetTileObjects might be empty otherwise)
173 room.LoadObjects();
174
175 const auto& objects = room.GetTileObjects();
176 formatter.AddField("total_objects", static_cast<int>(objects.size()));
177 formatter.AddField("status", "success");
178
179 formatter.BeginArray("objects");
180 for (const auto& obj : objects) {
181 formatter.BeginObject("");
182 formatter.AddField("id", obj.id_);
183 formatter.AddField("id_hex", absl::StrFormat("0x%04X", obj.id_));
184 formatter.AddField("x", obj.x_);
185 formatter.AddField("y", obj.y_);
186 formatter.AddField("size", obj.size_);
187 formatter.AddField("layer", static_cast<int>(obj.layer_));
188 // Add decoded type info if available
189 int type = zelda3::RoomObject::DetermineObjectType((obj.id_ & 0xFF),
190 (obj.id_ >> 8));
191 formatter.AddField("type", type);
192 formatter.EndObject();
193 }
194 formatter.EndArray();
195 formatter.EndObject();
196
197 return absl::OkStatus();
198}
199
201 Rom* rom, const resources::ArgumentParser& parser,
202 resources::OutputFormatter& formatter) {
203 auto room_id_str = parser.GetString("room").value();
204
205 int room_id;
206 if (!ParseHexString(room_id_str, &room_id)) {
207 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
208 }
209
210 formatter.BeginObject("Dungeon Room Tiles");
211 formatter.AddField("room_id", room_id);
212
213 // Use existing dungeon system
214 zelda3::DungeonEditorSystem dungeon_editor(rom);
215 auto room_or = dungeon_editor.GetRoom(room_id);
216 if (!room_or.ok()) {
217 formatter.AddField("status", "error");
218 formatter.AddField("error", room_or.status().ToString());
219 formatter.EndObject();
220 return room_or.status();
221 }
222
223 auto& room = room_or.value();
224
225 // TODO: Implement tile data retrieval from room
226 formatter.AddField("room_width", "Unknown");
227 formatter.AddField("room_height", "Unknown");
228 formatter.AddField("total_tiles", "Unknown");
229 formatter.AddField("status", "not_implemented");
230 formatter.AddField("message",
231 "Tile data retrieval requires room tile parsing");
232
233 formatter.BeginArray("tiles");
234 formatter.EndArray();
235 formatter.EndObject();
236
237 return absl::OkStatus();
238}
239
241 Rom* rom, const resources::ArgumentParser& parser,
242 resources::OutputFormatter& formatter) {
243 auto room_id_str = parser.GetString("room").value();
244 auto property = parser.GetString("property").value();
245 auto value = parser.GetString("value").value();
246
247 int room_id;
248 if (!ParseHexString(room_id_str, &room_id)) {
249 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
250 }
251
252 formatter.BeginObject("Dungeon Room Property Set");
253 formatter.AddField("room_id", room_id);
254 formatter.AddField("property", property);
255 formatter.AddField("value", value);
256
257 // Use existing dungeon system
258 zelda3::DungeonEditorSystem dungeon_editor(rom);
259 auto room_or = dungeon_editor.GetRoom(room_id);
260 if (!room_or.ok()) {
261 formatter.AddField("status", "error");
262 formatter.AddField("error", room_or.status().ToString());
263 formatter.EndObject();
264 return room_or.status();
265 }
266
267 // TODO: Implement property setting
268 formatter.AddField("status", "not_implemented");
269 formatter.AddField("message",
270 "Property setting requires room property system");
271 formatter.EndObject();
272
273 return absl::OkStatus();
274}
275
276} // namespace handlers
277} // namespace cli
278} // namespace yaze
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:24
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
Utility for parsing common CLI argument patterns.
std::optional< std::string > GetString(const std::string &name) const
Parse a named argument (e.g., –format=json or –format json)
Utility for consistent output formatting across commands.
void BeginArray(const std::string &key)
Begin an array.
void BeginObject(const std::string &title="")
Start a JSON object or text section.
void EndObject()
End a JSON object or text section.
void AddField(const std::string &key, const std::string &value)
Add a key-value pair.
absl::StatusOr< Room > GetRoom(int room_id)
static int DetermineObjectType(uint8_t b1, uint8_t b3)
bool ParseHexString(absl::string_view str, int *out)
Definition hex_util.h:17