yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
overworld_commands.cc
Go to the documentation of this file.
2
3#include "absl/strings/str_format.h"
5#include "cli/util/hex_util.h"
6#include "util/macro.h"
10
11namespace yaze {
12namespace cli {
13namespace handlers {
14
16
17namespace {
18
19absl::Status ValidateMapId(int map_id) {
20 if (map_id < 0 || map_id >= zelda3::kNumOverworldMaps) {
21 return absl::InvalidArgumentError(
22 absl::StrFormat("Map ID out of range: 0x%02X", map_id));
23 }
24 return absl::OkStatus();
25}
26
27absl::Status SetOverworldContextForMap(int map_id,
28 zelda3::Overworld* overworld) {
30 int world = 0;
31 if (map_id < 0x40) {
32 world = 0;
33 } else if (map_id < 0x80) {
34 world = 1;
35 } else {
36 world = 2;
37 }
38 overworld->set_current_world(world);
39 overworld->set_current_map(map_id);
40 return absl::OkStatus();
41}
42
43absl::Status ValidateTileCoordinates(int x, int y) {
44 if (x < 0 || x >= 64 || y < 0 || y >= 64) {
45 return absl::InvalidArgumentError(
46 absl::StrFormat("Tile coordinates out of range: (%d,%d)", x, y));
47 }
48 return absl::OkStatus();
49}
50
51} // namespace
52
54 Rom* rom, const resources::ArgumentParser& parser,
55 resources::OutputFormatter& formatter) {
56 int map_id = 0;
57 int x = 0;
58 int y = 0;
59 if (!ParseHexString(parser.GetString("map").value(), &map_id) ||
60 !ParseHexString(parser.GetString("x").value(), &x) ||
61 !ParseHexString(parser.GetString("y").value(), &y)) {
62 return absl::InvalidArgumentError("Invalid numeric argument for map/x/y.");
63 }
64 RETURN_IF_ERROR(ValidateMapId(map_id));
65 RETURN_IF_ERROR(ValidateTileCoordinates(x, y));
66
67 zelda3::Overworld overworld(rom);
68 RETURN_IF_ERROR(overworld.Load(rom));
69 RETURN_IF_ERROR(SetOverworldContextForMap(map_id, &overworld));
70
71 const uint16_t tile = overworld.GetTile(x, y);
72 formatter.BeginObject("Overworld Tile");
73 formatter.AddHexField("map_id", map_id, 2);
74 formatter.AddField("x", x);
75 formatter.AddField("y", y);
76 formatter.AddHexField("tile_id", tile, 4);
77 formatter.EndObject();
78 return absl::OkStatus();
79}
80
82 Rom* rom, const resources::ArgumentParser& parser,
83 resources::OutputFormatter& formatter) {
84 int map_id = 0;
85 int x = 0;
86 int y = 0;
87 int tile_value = 0;
88 if (!ParseHexString(parser.GetString("map").value(), &map_id) ||
89 !ParseHexString(parser.GetString("x").value(), &x) ||
90 !ParseHexString(parser.GetString("y").value(), &y) ||
91 !ParseHexString(parser.GetString("tile").value(), &tile_value)) {
92 return absl::InvalidArgumentError(
93 "Invalid numeric argument for map/x/y/tile.");
94 }
95 RETURN_IF_ERROR(ValidateMapId(map_id));
96 RETURN_IF_ERROR(ValidateTileCoordinates(x, y));
97 if (tile_value < 0 || tile_value > 0xFFFF) {
98 return absl::InvalidArgumentError(
99 absl::StrFormat("Tile ID out of range: 0x%X", tile_value));
100 }
101
102 zelda3::Overworld overworld(rom);
103 RETURN_IF_ERROR(overworld.Load(rom));
104 RETURN_IF_ERROR(SetOverworldContextForMap(map_id, &overworld));
105
106 const uint16_t before = overworld.GetTile(x, y);
107 overworld.SetTile(x, y, static_cast<uint16_t>(tile_value));
108 const uint16_t after = overworld.GetTile(x, y);
109
110 RETURN_IF_ERROR(overworld.SaveMap16Tiles());
111 RETURN_IF_ERROR(overworld.SaveMap32Tiles());
113
114 formatter.BeginObject("Overworld Tile Write");
115 formatter.AddHexField("map_id", map_id, 2);
116 formatter.AddField("x", x);
117 formatter.AddField("y", y);
118 formatter.AddHexField("tile_before", before, 4);
119 formatter.AddHexField("tile_after", after, 4);
120 if (parser.HasFlag("mock-rom")) {
121 formatter.AddField("save_status", "mock-rom-skipped");
122 } else {
123 Rom::SaveSettings save_settings;
124 save_settings.backup = true;
125 RETURN_IF_ERROR(rom->SaveToFile(save_settings));
126 formatter.AddField("save_status", "saved");
127 }
128 formatter.EndObject();
129 return absl::OkStatus();
130}
131
133 Rom* rom, const resources::ArgumentParser& parser,
134 resources::OutputFormatter& formatter) {
135 auto tile_id_str = parser.GetString("tile").value();
136
137 int tile_id;
138 if (!ParseHexString(tile_id_str, &tile_id)) {
139 return absl::InvalidArgumentError("Invalid tile ID format. Must be hex.");
140 }
141
142 // Load the Overworld from ROM
143 zelda3::Overworld overworld(rom);
144 auto ow_status = overworld.Load(rom);
145 if (!ow_status.ok()) {
146 return ow_status;
147 }
148
149 // Call the helper function to find tile matches
150 auto matches_or = overworld::FindTileMatches(overworld, tile_id);
151 if (!matches_or.ok()) {
152 return matches_or.status();
153 }
154 const auto& matches = matches_or.value();
155
156 // Format the output
157 formatter.BeginObject("Overworld Tile Search");
158 formatter.AddField("tile_id", absl::StrFormat("0x%03X", tile_id));
159 formatter.AddField("matches_found", static_cast<int>(matches.size()));
160
161 formatter.BeginArray("matches");
162 for (const auto& match : matches) {
163 formatter.BeginObject();
164 formatter.AddField("map_id", absl::StrFormat("0x%02X", match.map_id));
165 formatter.AddField("world", overworld::WorldName(match.world));
166 formatter.AddField("local_x", match.local_x);
167 formatter.AddField("local_y", match.local_y);
168 formatter.AddField("global_x", match.global_x);
169 formatter.AddField("global_y", match.global_y);
170 formatter.EndObject();
171 }
172 formatter.EndArray();
173 formatter.EndObject();
174
175 return absl::OkStatus();
176}
177
179 Rom* rom, const resources::ArgumentParser& parser,
180 resources::OutputFormatter& formatter) {
181 auto screen_id_str = parser.GetString("screen").value();
182
183 int screen_id;
184 if (!ParseHexString(screen_id_str, &screen_id)) {
185 return absl::InvalidArgumentError("Invalid screen ID format. Must be hex.");
186 }
187
188 // Load the Overworld from ROM
189 zelda3::Overworld overworld(rom);
190 auto ow_status = overworld.Load(rom);
191 if (!ow_status.ok()) {
192 return ow_status;
193 }
194
195 // Call the helper function to build the map summary
196 auto summary_or = overworld::BuildMapSummary(overworld, screen_id);
197 if (!summary_or.ok()) {
198 return summary_or.status();
199 }
200 const auto& summary = summary_or.value();
201
202 // Format the output using OutputFormatter
203 formatter.AddField("screen_id", absl::StrFormat("0x%02X", summary.map_id));
204 formatter.AddField("world", overworld::WorldName(summary.world));
205
206 formatter.BeginObject("grid");
207 formatter.AddField("x", summary.map_x);
208 formatter.AddField("y", summary.map_y);
209 formatter.AddField("local_index", summary.local_index);
210 formatter.EndObject();
211
212 formatter.BeginObject("size");
213 formatter.AddField("label", summary.area_size);
214 formatter.AddField("is_large", summary.is_large_map);
215 formatter.AddField("parent", absl::StrFormat("0x%02X", summary.parent_map));
216 formatter.AddField("quadrant", summary.large_quadrant);
217 formatter.EndObject();
218
219 formatter.AddField("message_id",
220 absl::StrFormat("0x%04X", summary.message_id));
221 formatter.AddField("area_graphics",
222 absl::StrFormat("0x%02X", summary.area_graphics));
223 formatter.AddField("area_palette",
224 absl::StrFormat("0x%02X", summary.area_palette));
225 formatter.AddField("main_palette",
226 absl::StrFormat("0x%02X", summary.main_palette));
227 formatter.AddField("animated_gfx",
228 absl::StrFormat("0x%02X", summary.animated_gfx));
229 formatter.AddField("subscreen_overlay",
230 absl::StrFormat("0x%04X", summary.subscreen_overlay));
231 formatter.AddField("area_specific_bg_color",
232 absl::StrFormat("0x%04X", summary.area_specific_bg_color));
233
234 // Entrances
235 formatter.BeginArray("entrances");
236 auto entrances_or = zelda3::LoadEntrances(rom);
237 if (entrances_or.ok()) {
238 for (const auto& entrance : entrances_or.value()) {
239 if (entrance.map_id_ == screen_id) {
240 formatter.BeginObject();
241 formatter.AddField("entrance_id", entrance.entrance_id_);
242 formatter.AddField("x", entrance.x_);
243 formatter.AddField("y", entrance.y_);
244 formatter.AddField("is_hole", false);
245 formatter.EndObject();
246 }
247 }
248 }
249 // Holes (as entrances)
250 auto holes_or = zelda3::LoadHoles(rom);
251 if (holes_or.ok()) {
252 for (const auto& hole : holes_or.value()) {
253 if (hole.map_id_ == screen_id) {
254 formatter.BeginObject();
255 formatter.AddField("entrance_id", hole.entrance_id_);
256 formatter.AddField("x", hole.x_);
257 formatter.AddField("y", hole.y_);
258 formatter.AddField("is_hole", true);
259 formatter.EndObject();
260 }
261 }
262 }
263 formatter.EndArray();
264
265 // Exits
266 formatter.BeginArray("exits");
267 auto exits_or = zelda3::LoadExits(rom);
268 if (exits_or.ok()) {
269 for (const auto& exit : exits_or.value()) {
270 if (exit.map_id_ == screen_id) {
271 formatter.BeginObject();
272 formatter.AddField("room_id", exit.room_id_);
273 formatter.AddField("x", exit.x_);
274 formatter.AddField("y", exit.y_);
275 formatter.EndObject();
276 }
277 }
278 }
279 formatter.EndArray();
280
281 formatter.BeginArray("sprite_graphics");
282 for (uint8_t gfx : summary.sprite_graphics) {
283 formatter.AddArrayItem(absl::StrFormat("0x%02X", gfx));
284 }
285 formatter.EndArray();
286
287 formatter.BeginArray("sprite_palettes");
288 for (uint8_t pal : summary.sprite_palettes) {
289 formatter.AddArrayItem(absl::StrFormat("0x%02X", pal));
290 }
291 formatter.EndArray();
292
293 formatter.BeginArray("area_music");
294 for (uint8_t music : summary.area_music) {
295 formatter.AddArrayItem(absl::StrFormat("0x%02X", music));
296 }
297 formatter.EndArray();
298
299 formatter.BeginArray("static_graphics");
300 for (uint8_t sgfx : summary.static_graphics) {
301 formatter.AddArrayItem(absl::StrFormat("0x%02X", sgfx));
302 }
303 formatter.EndArray();
304
305 formatter.BeginObject("overlay");
306 formatter.AddField("enabled", summary.has_overlay);
307 formatter.AddField("id", absl::StrFormat("0x%04X", summary.overlay_id));
308 formatter.EndObject();
309
310 formatter.EndObject();
311
312 return absl::OkStatus();
313}
314
316 Rom* rom, const resources::ArgumentParser& parser,
317 resources::OutputFormatter& formatter) {
318 auto screen_id_str = parser.GetString("screen").value_or("all");
319
320 // Load the Overworld from ROM
321 zelda3::Overworld overworld(rom);
322 auto ow_status = overworld.Load(rom);
323 if (!ow_status.ok()) {
324 return ow_status;
325 }
326
327 // Build the query
329 if (screen_id_str != "all") {
330 int map_id;
331 if (!ParseHexString(screen_id_str, &map_id)) {
332 return absl::InvalidArgumentError(
333 "Invalid screen ID format. Must be hex.");
334 }
335 query.map_id = map_id;
336 }
337
338 // Call the helper function to collect warp entries
339 auto warps_or = overworld::CollectWarpEntries(overworld, query);
340 if (!warps_or.ok()) {
341 return warps_or.status();
342 }
343 const auto& warps = warps_or.value();
344
345 // Format the output
346 formatter.BeginObject("Overworld Warps");
347 formatter.AddField("screen_filter", screen_id_str);
348 formatter.AddField("total_warps", static_cast<int>(warps.size()));
349
350 formatter.BeginArray("warps");
351 for (const auto& warp : warps) {
352 formatter.BeginObject();
353 formatter.AddField("type", overworld::WarpTypeName(warp.type));
354 formatter.AddField("map_id", absl::StrFormat("0x%02X", warp.map_id));
355 formatter.AddField("world", overworld::WorldName(warp.world));
356 formatter.AddField("position",
357 absl::StrFormat("(%d,%d)", warp.pixel_x, warp.pixel_y));
358 formatter.AddField("map_pos", absl::StrFormat("0x%04X", warp.map_pos));
359
360 if (warp.entrance_id.has_value()) {
361 formatter.AddField("entrance_id",
362 absl::StrFormat("0x%02X", warp.entrance_id.value()));
363 }
364 if (warp.entrance_name.has_value()) {
365 formatter.AddField("entrance_name", warp.entrance_name.value());
366 }
367 if (warp.room_id.has_value()) {
368 formatter.AddField("room_id",
369 absl::StrFormat("0x%04X", warp.room_id.value()));
370 }
371
372 formatter.AddField("deleted", warp.deleted);
373 formatter.AddField("is_hole", warp.is_hole);
374 formatter.EndObject();
375 }
376 formatter.EndArray();
377 formatter.EndObject();
378
379 return absl::OkStatus();
380}
381
383 Rom* rom, const resources::ArgumentParser& parser,
384 resources::OutputFormatter& formatter) {
385 auto screen_id_str = parser.GetString("screen").value_or("all");
386
387 // Load the Overworld from ROM
388 zelda3::Overworld overworld(rom);
389 auto ow_status = overworld.Load(rom);
390 if (!ow_status.ok()) {
391 return ow_status;
392 }
393
394 // Build the query
396 if (screen_id_str != "all") {
397 int map_id;
398 if (!ParseHexString(screen_id_str, &map_id)) {
399 return absl::InvalidArgumentError(
400 "Invalid screen ID format. Must be hex.");
401 }
402 query.map_id = map_id;
403 }
404
405 // Call the helper function to collect sprites
406 auto sprites_or = overworld::CollectOverworldSprites(overworld, query);
407 if (!sprites_or.ok()) {
408 return sprites_or.status();
409 }
410 const auto& sprites = sprites_or.value();
411
412 // Format the output
413 formatter.BeginObject("Overworld Sprites");
414 formatter.AddField("screen_filter", screen_id_str);
415 formatter.AddField("total_sprites", static_cast<int>(sprites.size()));
416
417 formatter.BeginArray("sprites");
418 for (const auto& sprite : sprites) {
419 formatter.BeginObject();
420 formatter.AddField("sprite_id",
421 absl::StrFormat("0x%02X", sprite.sprite_id));
422 formatter.AddField("map_id", absl::StrFormat("0x%02X", sprite.map_id));
423 formatter.AddField("world", overworld::WorldName(sprite.world));
424 formatter.AddField("position",
425 absl::StrFormat("(%d,%d)", sprite.x, sprite.y));
426
427 if (sprite.sprite_name.has_value()) {
428 formatter.AddField("name", sprite.sprite_name.value());
429 }
430
431 formatter.EndObject();
432 }
433 formatter.EndArray();
434 formatter.EndObject();
435
436 return absl::OkStatus();
437}
438
440 Rom* rom, const resources::ArgumentParser& parser,
441 resources::OutputFormatter& formatter) {
442 auto screen_id_str = parser.GetString("screen").value_or("all");
443
444 // Load the Overworld from ROM
445 zelda3::Overworld overworld(rom);
446 auto ow_status = overworld.Load(rom);
447 if (!ow_status.ok()) {
448 return ow_status;
449 }
450
451 // Optional screen filter
452 std::optional<int> map_filter;
453 if (screen_id_str != "all") {
454 int map_id;
455 if (!ParseHexString(screen_id_str, &map_id)) {
456 return absl::InvalidArgumentError(
457 "Invalid screen ID format. Must be hex.");
458 }
459 map_filter = map_id;
460 }
461
462 auto maps = overworld.overworld_maps();
463 ASSIGN_OR_RETURN(auto items, zelda3::LoadItems(rom, maps));
464
465 const auto& item_names = zelda3::Zelda3Labels::GetItemNames();
466
467 formatter.BeginObject("Overworld Items");
468 formatter.AddField("screen_filter", screen_id_str);
469
470 formatter.BeginArray("items");
471 int total_items = 0;
472 for (const auto& item : items) {
473 if (map_filter.has_value() &&
474 static_cast<int>(item.room_map_id_) != map_filter.value()) {
475 continue;
476 }
477
478 std::string world_name = "Unknown";
479 auto world_or = overworld::InferWorldFromMapId(item.room_map_id_);
480 if (world_or.ok()) {
481 world_name = overworld::WorldName(world_or.value());
482 }
483
484 formatter.BeginObject();
485 formatter.AddField("item_id", absl::StrFormat("0x%02X", item.id_));
486
487 if (item.id_ < item_names.size()) {
488 formatter.AddField("item_name", item_names[item.id_]);
489 }
490
491 formatter.AddField("map_id", absl::StrFormat("0x%02X", item.room_map_id_));
492 formatter.AddField("world", world_name);
493 formatter.AddField("tile_pos",
494 absl::StrFormat("(%d,%d)", item.game_x_, item.game_y_));
495 formatter.AddField("pixel_pos",
496 absl::StrFormat("(%d,%d)", item.x_, item.y_));
497 formatter.EndObject();
498
499 total_items++;
500 }
501 formatter.EndArray();
502 formatter.AddField("total_items", total_items);
503 formatter.EndObject();
504
505 return absl::OkStatus();
506}
507
509 Rom* rom, const resources::ArgumentParser& parser,
510 resources::OutputFormatter& formatter) {
511 auto entrance_id_str = parser.GetString("entrance").value();
512
513 int entrance_id;
514 if (!ParseHexString(entrance_id_str, &entrance_id)) {
515 return absl::InvalidArgumentError(
516 "Invalid entrance ID format. Must be hex.");
517 }
518
519 // Load the Overworld from ROM
520 zelda3::Overworld overworld(rom);
521 auto ow_status = overworld.Load(rom);
522 if (!ow_status.ok()) {
523 return ow_status;
524 }
525
526 // Call the helper function to get entrance details
527 auto details_or = overworld::GetEntranceDetails(overworld, entrance_id);
528 if (!details_or.ok()) {
529 return details_or.status();
530 }
531 const auto& details = details_or.value();
532
533 // Format the output
534 formatter.BeginObject("Overworld Entrance");
535 formatter.AddField("entrance_id",
536 absl::StrFormat("0x%02X", details.entrance_id));
537 formatter.AddField("map_id", absl::StrFormat("0x%02X", details.map_id));
538 formatter.AddField("world", overworld::WorldName(details.world));
539 formatter.AddField("position",
540 absl::StrFormat("(%d,%d)", details.x, details.y));
541 formatter.AddField("area_position", absl::StrFormat("(%d,%d)", details.area_x,
542 details.area_y));
543 formatter.AddField("map_pos", absl::StrFormat("0x%04X", details.map_pos));
544 formatter.AddField("is_hole", details.is_hole);
545
546 if (details.entrance_name.has_value()) {
547 formatter.AddField("name", details.entrance_name.value());
548 }
549
550 formatter.EndObject();
551
552 return absl::OkStatus();
553}
554
556 Rom* rom, const resources::ArgumentParser& parser,
557 resources::OutputFormatter& formatter) {
558 auto screen_id_str = parser.GetString("screen").value_or("all");
559
560 // Load the Overworld from ROM
561 zelda3::Overworld overworld(rom);
562 auto ow_status = overworld.Load(rom);
563 if (!ow_status.ok()) {
564 return ow_status;
565 }
566
567 // TODO: Implement comprehensive tile statistics
568 // The AnalyzeTileUsage helper requires a specific tile_id,
569 // so we need a different approach to gather overall tile statistics.
570 // This could involve:
571 // 1. Iterating through all tiles in the overworld maps
572 // 2. Building a frequency map of tile usage
573 // 3. Computing statistics like unique tiles, most common tiles, etc.
574
575 formatter.BeginObject("Overworld Tile Statistics");
576 formatter.AddField("screen_filter", screen_id_str);
577 formatter.AddField("status", "partial_implementation");
578 formatter.AddField("message",
579 "Comprehensive tile statistics not yet implemented. "
580 "Use overworld-find-tile for specific tile analysis.");
581 formatter.AddField("total_tiles", 0);
582 formatter.AddField("unique_tiles", 0);
583
584 formatter.BeginArray("tile_counts");
585 formatter.EndArray();
586 formatter.EndObject();
587
588 return absl::OkStatus();
589}
590
591} // namespace handlers
592} // namespace cli
593} // 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:28
absl::Status SaveToFile(const SaveSettings &settings)
Definition rom.cc:291
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.
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)
bool HasFlag(const std::string &name) const
Check if a flag is present.
Utility for consistent output formatting across commands.
void BeginArray(const std::string &key)
Begin an array.
void AddArrayItem(const std::string &item)
Add an item to current 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.
void AddHexField(const std::string &key, uint64_t value, int width=2)
Add a hex-formatted field.
Represents the full Overworld data, light and dark world.
Definition overworld.h:261
void set_current_world(int world)
Definition overworld.h:604
absl::Status Load(Rom *rom)
Load all overworld data from ROM.
Definition overworld.cc:36
absl::Status SaveMap32Tiles()
Save tile32 definitions to ROM.
absl::Status SaveMap16Tiles()
Save tile16 definitions to ROM.
const std::vector< OverworldMap > & overworld_maps() const
Definition overworld.h:528
void set_current_map(int i)
Definition overworld.h:603
uint16_t GetTile(int x, int y) const
Definition overworld.h:605
absl::Status SaveOverworldMaps()
Save compressed map tile data to ROM.
void SetTile(int x, int y, uint16_t tile_id)
Definition overworld.h:614
#define ASSIGN_OR_RETURN(type_variable_name, expression)
Definition macro.h:62
absl::Status SetOverworldContextForMap(int map_id, zelda3::Overworld *overworld)
absl::StatusOr< int > InferWorldFromMapId(int map_id)
absl::StatusOr< MapSummary > BuildMapSummary(zelda3::Overworld &overworld, int map_id)
absl::StatusOr< std::vector< WarpEntry > > CollectWarpEntries(const zelda3::Overworld &overworld, const WarpQuery &query)
absl::StatusOr< EntranceDetails > GetEntranceDetails(const zelda3::Overworld &overworld, uint8_t entrance_id)
absl::StatusOr< std::vector< OverworldSprite > > CollectOverworldSprites(const zelda3::Overworld &overworld, const SpriteQuery &query)
absl::StatusOr< std::vector< TileMatch > > FindTileMatches(zelda3::Overworld &overworld, uint16_t tile_id, const TileSearchOptions &options)
std::string WarpTypeName(WarpType type)
std::string WorldName(int world)
bool ParseHexString(absl::string_view str, int *out)
Definition hex_util.h:17
absl::StatusOr< std::vector< OverworldEntrance > > LoadEntrances(Rom *rom)
absl::StatusOr< std::vector< OverworldItem > > LoadItems(Rom *rom, std::vector< OverworldMap > &overworld_maps)
constexpr int kNumOverworldMaps
Definition common.h:85
absl::StatusOr< std::vector< OverworldExit > > LoadExits(Rom *rom)
absl::StatusOr< std::vector< OverworldEntrance > > LoadHoles(Rom *rom)
#define RETURN_IF_ERROR(expr)
Definition snes.cc:22
static const std::vector< std::string > & GetItemNames()