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/numbers.h"
4#include "absl/strings/str_format.h"
6
7namespace yaze {
8namespace cli {
9namespace handlers {
10
12 Rom* rom, const resources::ArgumentParser& parser,
13 resources::OutputFormatter& formatter) {
14 auto room_id_str = parser.GetString("room").value();
15
16 int room_id;
17 if (!absl::SimpleHexAtoi(room_id_str, &room_id)) {
18 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
19 }
20
21 formatter.BeginObject("Dungeon Room Sprites");
22 formatter.AddField("room_id", room_id);
23
24 // Use existing dungeon system
25 zelda3::DungeonEditorSystem dungeon_editor(rom);
26 auto room_or = dungeon_editor.GetRoom(room_id);
27 if (!room_or.ok()) {
28 formatter.AddField("status", "error");
29 formatter.AddField("error", room_or.status().ToString());
30 formatter.EndObject();
31 return room_or.status();
32 }
33
34 auto& room = room_or.value();
35
36 // TODO: Implement sprite listing from room data
37 formatter.AddField("total_sprites", 0);
38 formatter.AddField("status", "not_implemented");
39 formatter.AddField("message", "Sprite listing requires room sprite parsing");
40
41 formatter.BeginArray("sprites");
42 formatter.EndArray();
43 formatter.EndObject();
44
45 return absl::OkStatus();
46}
47
49 Rom* rom, const resources::ArgumentParser& parser,
50 resources::OutputFormatter& formatter) {
51 auto room_id_str = parser.GetString("room").value();
52
53 int room_id;
54 if (!absl::SimpleHexAtoi(room_id_str, &room_id)) {
55 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
56 }
57
58 formatter.BeginObject("Dungeon Room Description");
59 formatter.AddField("room_id", room_id);
60
61 // Use existing dungeon system
62 zelda3::DungeonEditorSystem dungeon_editor(rom);
63 auto room_or = dungeon_editor.GetRoom(room_id);
64 if (!room_or.ok()) {
65 formatter.AddField("status", "error");
66 formatter.AddField("error", room_or.status().ToString());
67 formatter.EndObject();
68 return room_or.status();
69 }
70
71 auto& room = room_or.value();
72
73 formatter.AddField("status", "success");
74 formatter.AddField("name", absl::StrFormat("Room %d", room.id()));
75 formatter.AddField("room_id", room.id());
76 formatter.AddField("room_type", "Dungeon Room");
77
78 // Get room header/properties via DungeonEditorSystem
79 auto props_result = dungeon_editor.GetRoomProperties(room_id);
80 bool has_props = props_result.ok();
81
82 formatter.BeginObject("properties");
83 if (has_props) {
84 auto props = props_result.value();
85 formatter.AddField("dungeon_id", props.dungeon_id);
86 formatter.AddField("floor_level", props.floor_level);
87 formatter.AddField("music_id", props.music_id);
88 formatter.AddField("is_boss_room", props.is_boss_room ? "true" : "false");
89 formatter.AddField("is_save_room", props.is_save_room ? "true" : "false");
90 }
91
92 formatter.AddField("blockset", room.blockset);
93 formatter.AddField("palette", room.palette);
94 formatter.AddField("floor1", room.floor1());
95 formatter.AddField("floor2", room.floor2());
96
97 // Check object counts for simple heuristics
98 room.LoadObjects();
99 formatter.AddField("object_count", static_cast<int>(room.GetTileObjects().size()));
100
101 formatter.EndObject();
102
103 formatter.EndObject();
104
105 return absl::OkStatus();
106}
107
109 Rom* rom, const resources::ArgumentParser& parser,
110 resources::OutputFormatter& formatter) {
111 auto room_id_str = parser.GetString("room").value();
112
113 int room_id;
114 if (!absl::SimpleHexAtoi(room_id_str, &room_id)) {
115 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
116 }
117
118 formatter.BeginObject("Dungeon Export");
119 formatter.AddField("room_id", room_id);
120
121 // Use existing dungeon system
122 zelda3::DungeonEditorSystem dungeon_editor(rom);
123 auto room_or = dungeon_editor.GetRoom(room_id);
124 if (!room_or.ok()) {
125 formatter.AddField("status", "error");
126 formatter.AddField("error", room_or.status().ToString());
127 formatter.EndObject();
128 return room_or.status();
129 }
130
131 auto& room = room_or.value();
132
133 // Export room data
134 formatter.AddField("status", "success");
135 formatter.AddField("room_width", "Unknown");
136 formatter.AddField("room_height", "Unknown");
137 formatter.AddField("room_name", absl::StrFormat("Room %d", room.id()));
138
139 // Add room data as JSON
140 formatter.BeginObject("room_data");
141 formatter.AddField("tiles", "Room tile data would be exported here");
142 formatter.AddField("sprites", "Room sprite data would be exported here");
143 formatter.AddField("doors", "Room door data would be exported here");
144 formatter.EndObject();
145
146 formatter.EndObject();
147
148 return absl::OkStatus();
149}
150
152 Rom* rom, const resources::ArgumentParser& parser,
153 resources::OutputFormatter& formatter) {
154 auto room_id_str = parser.GetString("room").value();
155
156 int room_id;
157 if (!absl::SimpleHexAtoi(room_id_str, &room_id)) {
158 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
159 }
160
161 formatter.BeginObject("Dungeon Room Objects");
162 formatter.AddField("room_id", room_id);
163
164 // Use existing dungeon system
165 zelda3::DungeonEditorSystem dungeon_editor(rom);
166 auto room_or = dungeon_editor.GetRoom(room_id);
167 if (!room_or.ok()) {
168 formatter.AddField("status", "error");
169 formatter.AddField("error", room_or.status().ToString());
170 formatter.EndObject();
171 return room_or.status();
172 }
173
174 auto& room = room_or.value();
175
176 // Load objects if not already loaded (GetTileObjects might be empty otherwise)
177 room.LoadObjects();
178
179 const auto& objects = room.GetTileObjects();
180 formatter.AddField("total_objects", static_cast<int>(objects.size()));
181 formatter.AddField("status", "success");
182
183 formatter.BeginArray("objects");
184 for (const auto& obj : objects) {
185 formatter.BeginObject("");
186 formatter.AddField("id", obj.id_);
187 formatter.AddField("id_hex", absl::StrFormat("0x%04X", obj.id_));
188 formatter.AddField("x", obj.x_);
189 formatter.AddField("y", obj.y_);
190 formatter.AddField("size", obj.size_);
191 formatter.AddField("layer", static_cast<int>(obj.layer_));
192 // Add decoded type info if available
194 (obj.id_ & 0xFF), (obj.id_ >> 8));
195 formatter.AddField("type", type);
196 formatter.EndObject();
197 }
198 formatter.EndArray();
199 formatter.EndObject();
200
201 return absl::OkStatus();
202}
203
205 Rom* rom, const resources::ArgumentParser& parser,
206 resources::OutputFormatter& formatter) {
207 auto room_id_str = parser.GetString("room").value();
208
209 int room_id;
210 if (!absl::SimpleHexAtoi(room_id_str, &room_id)) {
211 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
212 }
213
214 formatter.BeginObject("Dungeon Room Tiles");
215 formatter.AddField("room_id", room_id);
216
217 // Use existing dungeon system
218 zelda3::DungeonEditorSystem dungeon_editor(rom);
219 auto room_or = dungeon_editor.GetRoom(room_id);
220 if (!room_or.ok()) {
221 formatter.AddField("status", "error");
222 formatter.AddField("error", room_or.status().ToString());
223 formatter.EndObject();
224 return room_or.status();
225 }
226
227 auto& room = room_or.value();
228
229 // TODO: Implement tile data retrieval from room
230 formatter.AddField("room_width", "Unknown");
231 formatter.AddField("room_height", "Unknown");
232 formatter.AddField("total_tiles", "Unknown");
233 formatter.AddField("status", "not_implemented");
234 formatter.AddField("message",
235 "Tile data retrieval requires room tile parsing");
236
237 formatter.BeginArray("tiles");
238 formatter.EndArray();
239 formatter.EndObject();
240
241 return absl::OkStatus();
242}
243
245 Rom* rom, const resources::ArgumentParser& parser,
246 resources::OutputFormatter& formatter) {
247 auto room_id_str = parser.GetString("room").value();
248 auto property = parser.GetString("property").value();
249 auto value = parser.GetString("value").value();
250
251 int room_id;
252 if (!absl::SimpleHexAtoi(room_id_str, &room_id)) {
253 return absl::InvalidArgumentError("Invalid room ID format. Must be hex.");
254 }
255
256 formatter.BeginObject("Dungeon Room Property Set");
257 formatter.AddField("room_id", room_id);
258 formatter.AddField("property", property);
259 formatter.AddField("value", value);
260
261 // Use existing dungeon system
262 zelda3::DungeonEditorSystem dungeon_editor(rom);
263 auto room_or = dungeon_editor.GetRoom(room_id);
264 if (!room_or.ok()) {
265 formatter.AddField("status", "error");
266 formatter.AddField("error", room_or.status().ToString());
267 formatter.EndObject();
268 return room_or.status();
269 }
270
271 // TODO: Implement property setting
272 formatter.AddField("status", "not_implemented");
273 formatter.AddField("message",
274 "Property setting requires room property system");
275 formatter.EndObject();
276
277 return absl::OkStatus();
278}
279
280} // namespace handlers
281} // namespace cli
282} // 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.
Comprehensive dungeon editing system.
absl::StatusOr< RoomProperties > GetRoomProperties(int room_id)
absl::StatusOr< Room > GetRoom(int room_id)
static int DetermineObjectType(uint8_t b1, uint8_t b3)