yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
overworld_golden_data_extractor.cc
Go to the documentation of this file.
1#include <iostream>
2#include <iomanip>
3#include <fstream>
4#include <vector>
5#include <map>
6#include <string>
7#include <filesystem>
8
9#include "app/rom.h"
12
13using namespace yaze::zelda3;
14using namespace yaze;
15
24 public:
25 explicit OverworldGoldenDataExtractor(const std::string& rom_path)
26 : rom_path_(rom_path) {}
27
28 absl::Status ExtractAllData(const std::string& output_path) {
29 // Load ROM
30 Rom rom;
32
33 // Load overworld data
34 Overworld overworld(&rom);
35 RETURN_IF_ERROR(overworld.Load(&rom));
36
37 std::ofstream out_file(output_path);
38 if (!out_file.is_open()) {
39 return absl::InternalError("Failed to open output file: " + output_path);
40 }
41
42 // Write header
43 WriteHeader(out_file);
44
45 // Extract basic ROM info
46 WriteBasicROMInfo(out_file, rom);
47
48 // Extract ASM version info
49 WriteASMVersionInfo(out_file, rom);
50
51 // Extract overworld maps data
52 WriteOverworldMapsData(out_file, overworld);
53
54 // Extract tile data
55 WriteTileData(out_file, overworld);
56
57 // Extract entrance/hole/exit data
58 WriteEntranceData(out_file, overworld);
59 WriteHoleData(out_file, overworld);
60 WriteExitData(out_file, overworld);
61
62 // Extract item data
63 WriteItemData(out_file, overworld);
64
65 // Extract sprite data
66 WriteSpriteData(out_file, overworld);
67
68 // Extract map tiles (compressed data)
69 WriteMapTilesData(out_file, overworld);
70
71 // Extract palette data
72 WritePaletteData(out_file, rom);
73
74 // Extract music data
75 WriteMusicData(out_file, rom);
76
77 // Extract overlay data
78 WriteOverlayData(out_file, rom);
79
80 // Write footer
81 WriteFooter(out_file);
82
83 return absl::OkStatus();
84 }
85
86 private:
87 void WriteHeader(std::ofstream& out) {
88 out << "// =============================================================================" << std::endl;
89 out << "// YAZE Overworld Golden Data - Generated from: " << rom_path_ << std::endl;
90 out << "// Generated on: " << __DATE__ << " " << __TIME__ << std::endl;
91 out << "// =============================================================================" << std::endl;
92 out << std::endl;
93 out << "#pragma once" << std::endl;
94 out << std::endl;
95 out << "#include <cstdint>" << std::endl;
96 out << "#include <array>" << std::endl;
97 out << "#include <vector>" << std::endl;
98 out << "#include \"app/zelda3/overworld/overworld_map.h\"" << std::endl;
99 out << std::endl;
100 out << "namespace yaze {" << std::endl;
101 out << "namespace test {" << std::endl;
102 out << std::endl;
103 }
104
105 void WriteFooter(std::ofstream& out) {
106 out << std::endl;
107 out << "} // namespace test" << std::endl;
108 out << "} // namespace yaze" << std::endl;
109 }
110
111 void WriteBasicROMInfo(std::ofstream& out, Rom& rom) {
112 out << "// =============================================================================" << std::endl;
113 out << "// Basic ROM Information" << std::endl;
114 out << "// =============================================================================" << std::endl;
115 out << std::endl;
116
117 out << "constexpr std::string_view kGoldenROMTitle = \"" << rom.title() << "\";" << std::endl;
118 out << "constexpr size_t kGoldenROMSize = " << rom.size() << ";" << std::endl;
119 out << std::endl;
120
121 // ROM header validation
122 auto header_checksum = rom.ReadWord(0x7FDC);
123 auto header_checksum_complement = rom.ReadWord(0x7FDE);
124 if (header_checksum.ok() && header_checksum_complement.ok()) {
125 out << "constexpr uint16_t kGoldenHeaderChecksum = 0x"
126 << std::hex << std::setw(4) << std::setfill('0')
127 << *header_checksum << ";" << std::endl;
128 out << "constexpr uint16_t kGoldenHeaderChecksumComplement = 0x"
129 << std::hex << std::setw(4) << std::setfill('0')
130 << *header_checksum_complement << ";" << std::endl;
131 out << std::endl;
132 }
133 }
134
135 void WriteASMVersionInfo(std::ofstream& out, Rom& rom) {
136 out << "// =============================================================================" << std::endl;
137 out << "// ASM Version Information" << std::endl;
138 out << "// =============================================================================" << std::endl;
139 out << std::endl;
140
141 auto asm_version = rom.ReadByte(0x140145);
142 if (asm_version.ok()) {
143 out << "constexpr uint8_t kGoldenASMVersion = 0x"
144 << std::hex << std::setw(2) << std::setfill('0')
145 << static_cast<int>(*asm_version) << ";" << std::endl;
146
147 if (*asm_version == 0xFF) {
148 out << "constexpr bool kGoldenIsVanillaROM = true;" << std::endl;
149 out << "constexpr bool kGoldenHasZSCustomOverworld = false;" << std::endl;
150 } else {
151 out << "constexpr bool kGoldenIsVanillaROM = false;" << std::endl;
152 out << "constexpr bool kGoldenHasZSCustomOverworld = true;" << std::endl;
153 out << "constexpr uint8_t kGoldenZSCustomOverworldVersion = "
154 << static_cast<int>(*asm_version) << ";" << std::endl;
155 }
156 out << std::endl;
157 }
158
159 // Feature flags for v3
160 if (asm_version.ok() && *asm_version >= 0x03) {
161 out << "// v3 Feature Flags" << std::endl;
162
163 auto main_palettes = rom.ReadByte(0x140146);
164 auto area_bg = rom.ReadByte(0x140147);
165 auto subscreen_overlay = rom.ReadByte(0x140148);
166 auto animated_gfx = rom.ReadByte(0x140149);
167 auto custom_tiles = rom.ReadByte(0x14014A);
168 auto mosaic = rom.ReadByte(0x14014B);
169
170 if (main_palettes.ok()) {
171 out << "constexpr bool kGoldenEnableMainPalettes = "
172 << (*main_palettes != 0 ? "true" : "false") << ";" << std::endl;
173 }
174 if (area_bg.ok()) {
175 out << "constexpr bool kGoldenEnableAreaSpecificBG = "
176 << (*area_bg != 0 ? "true" : "false") << ";" << std::endl;
177 }
178 if (subscreen_overlay.ok()) {
179 out << "constexpr bool kGoldenEnableSubscreenOverlay = "
180 << (*subscreen_overlay != 0 ? "true" : "false") << ";" << std::endl;
181 }
182 if (animated_gfx.ok()) {
183 out << "constexpr bool kGoldenEnableAnimatedGFX = "
184 << (*animated_gfx != 0 ? "true" : "false") << ";" << std::endl;
185 }
186 if (custom_tiles.ok()) {
187 out << "constexpr bool kGoldenEnableCustomTiles = "
188 << (*custom_tiles != 0 ? "true" : "false") << ";" << std::endl;
189 }
190 if (mosaic.ok()) {
191 out << "constexpr bool kGoldenEnableMosaic = "
192 << (*mosaic != 0 ? "true" : "false") << ";" << std::endl;
193 }
194 out << std::endl;
195 }
196 }
197
198 void WriteOverworldMapsData(std::ofstream& out, Overworld& overworld) {
199 out << "// =============================================================================" << std::endl;
200 out << "// Overworld Maps Data" << std::endl;
201 out << "// =============================================================================" << std::endl;
202 out << std::endl;
203
204 const auto& maps = overworld.overworld_maps();
205 out << "constexpr size_t kGoldenNumOverworldMaps = " << maps.size() << ";" << std::endl;
206 out << std::endl;
207
208 // Extract map properties for first 20 maps (to keep file size manageable)
209 out << "// Map properties for first 20 maps" << std::endl;
210 out << "constexpr std::array<uint8_t, 20> kGoldenMapAreaGraphics = {{" << std::endl;
211 for (int i = 0; i < std::min(20, static_cast<int>(maps.size())); i++) {
212 out << " 0x" << std::hex << std::setw(2) << std::setfill('0')
213 << static_cast<int>(maps[i].area_graphics());
214 if (i < 19) out << ",";
215 out << " // Map " << i << std::endl;
216 }
217 out << "}};" << std::endl;
218 out << std::endl;
219
220 out << "constexpr std::array<uint8_t, 20> kGoldenMapMainPalettes = {{" << std::endl;
221 for (int i = 0; i < std::min(20, static_cast<int>(maps.size())); i++) {
222 out << " 0x" << std::hex << std::setw(2) << std::setfill('0')
223 << static_cast<int>(maps[i].main_palette());
224 if (i < 19) out << ",";
225 out << " // Map " << i << std::endl;
226 }
227 out << "}};" << std::endl;
228 out << std::endl;
229
230 out << "constexpr std::array<AreaSizeEnum, 20> kGoldenMapAreaSizes = {{" << std::endl;
231 for (int i = 0; i < std::min(20, static_cast<int>(maps.size())); i++) {
232 out << " AreaSizeEnum::";
233 switch (maps[i].area_size()) {
234 case AreaSizeEnum::SmallArea: out << "SmallArea"; break;
235 case AreaSizeEnum::LargeArea: out << "LargeArea"; break;
236 case AreaSizeEnum::WideArea: out << "WideArea"; break;
237 case AreaSizeEnum::TallArea: out << "TallArea"; break;
238 }
239 if (i < 19) out << ",";
240 out << " // Map " << i << std::endl;
241 }
242 out << "}};" << std::endl;
243 out << std::endl;
244 }
245
246 void WriteTileData(std::ofstream& out, Overworld& overworld) {
247 out << "// =============================================================================" << std::endl;
248 out << "// Tile Data Information" << std::endl;
249 out << "// =============================================================================" << std::endl;
250 out << std::endl;
251
252 out << "constexpr bool kGoldenExpandedTile16 = "
253 << (overworld.expanded_tile16() ? "true" : "false") << ";" << std::endl;
254 out << "constexpr bool kGoldenExpandedTile32 = "
255 << (overworld.expanded_tile32() ? "true" : "false") << ";" << std::endl;
256 out << std::endl;
257
258 const auto& tiles16 = overworld.tiles16();
259 const auto& tiles32 = overworld.tiles32_unique();
260
261 out << "constexpr size_t kGoldenNumTiles16 = " << tiles16.size() << ";" << std::endl;
262 out << "constexpr size_t kGoldenNumTiles32 = " << tiles32.size() << ";" << std::endl;
263 out << std::endl;
264
265 // Sample some tile data for validation
266 out << "// Sample Tile16 data (first 10 tiles)" << std::endl;
267 out << "constexpr std::array<uint32_t, 10> kGoldenTile16Sample = {{" << std::endl;
268 for (int i = 0; i < std::min(10, static_cast<int>(tiles16.size())); i++) {
269 // Extract tile data as uint32_t for sample using TileInfo values
270 const auto& tile16 = tiles16[i];
271 uint32_t sample = tile16.tile0_.id_ | (tile16.tile1_.id_ << 8) |
272 (tile16.tile2_.id_ << 16) | (tile16.tile3_.id_ << 24);
273 out << " 0x" << std::hex << std::setw(8) << std::setfill('0') << sample;
274 if (i < 9) out << ",";
275 out << " // Tile16 " << i << std::endl;
276 }
277 out << "}};" << std::endl;
278 out << std::endl;
279 }
280
281 void WriteEntranceData(std::ofstream& out, Overworld& overworld) {
282 out << "// =============================================================================" << std::endl;
283 out << "// Entrance Data" << std::endl;
284 out << "// =============================================================================" << std::endl;
285 out << std::endl;
286
287 const auto& entrances = overworld.entrances();
288 out << "constexpr size_t kGoldenNumEntrances = " << entrances.size() << ";" << std::endl;
289 out << std::endl;
290
291 // Sample entrance data for validation
292 out << "// Sample entrance data (first 10 entrances)" << std::endl;
293 out << "constexpr std::array<uint16_t, 10> kGoldenEntranceMapPos = {{" << std::endl;
294 for (int i = 0; i < std::min(10, static_cast<int>(entrances.size())); i++) {
295 out << " 0x" << std::hex << std::setw(4) << std::setfill('0')
296 << entrances[i].map_pos_;
297 if (i < 9) out << ",";
298 out << " // Entrance " << i << std::endl;
299 }
300 out << "}};" << std::endl;
301 out << std::endl;
302
303 out << "constexpr std::array<uint16_t, 10> kGoldenEntranceMapId = {{" << std::endl;
304 for (int i = 0; i < std::min(10, static_cast<int>(entrances.size())); i++) {
305 out << " 0x" << std::hex << std::setw(4) << std::setfill('0')
306 << entrances[i].map_id_;
307 if (i < 9) out << ",";
308 out << " // Entrance " << i << std::endl;
309 }
310 out << "}};" << std::endl;
311 out << std::endl;
312
313 out << "constexpr std::array<int, 10> kGoldenEntranceX = {{" << std::endl;
314 for (int i = 0; i < std::min(10, static_cast<int>(entrances.size())); i++) {
315 out << " " << std::dec << entrances[i].x_;
316 if (i < 9) out << ",";
317 out << " // Entrance " << i << std::endl;
318 }
319 out << "}};" << std::endl;
320 out << std::endl;
321
322 out << "constexpr std::array<int, 10> kGoldenEntranceY = {{" << std::endl;
323 for (int i = 0; i < std::min(10, static_cast<int>(entrances.size())); i++) {
324 out << " " << std::dec << entrances[i].y_;
325 if (i < 9) out << ",";
326 out << " // Entrance " << i << std::endl;
327 }
328 out << "}};" << std::endl;
329 out << std::endl;
330 }
331
332 void WriteHoleData(std::ofstream& out, Overworld& overworld) {
333 out << "// =============================================================================" << std::endl;
334 out << "// Hole Data" << std::endl;
335 out << "// =============================================================================" << std::endl;
336 out << std::endl;
337
338 const auto& holes = overworld.holes();
339 out << "constexpr size_t kGoldenNumHoles = " << holes.size() << ";" << std::endl;
340 out << std::endl;
341
342 // Sample hole data for validation
343 out << "// Sample hole data (first 5 holes)" << std::endl;
344 out << "constexpr std::array<uint16_t, 5> kGoldenHoleMapPos = {{" << std::endl;
345 for (int i = 0; i < std::min(5, static_cast<int>(holes.size())); i++) {
346 out << " 0x" << std::hex << std::setw(4) << std::setfill('0')
347 << holes[i].map_pos_;
348 if (i < 4) out << ",";
349 out << " // Hole " << i << std::endl;
350 }
351 out << "}};" << std::endl;
352 out << std::endl;
353 }
354
355 void WriteExitData(std::ofstream& out, Overworld& overworld) {
356 out << "// =============================================================================" << std::endl;
357 out << "// Exit Data" << std::endl;
358 out << "// =============================================================================" << std::endl;
359 out << std::endl;
360
361 const auto& exits = overworld.exits();
362 out << "constexpr size_t kGoldenNumExits = " << exits->size() << ";" << std::endl;
363 out << std::endl;
364
365 // Sample exit data for validation
366 out << "// Sample exit data (first 10 exits)" << std::endl;
367 out << "constexpr std::array<uint16_t, 10> kGoldenExitRoomId = {{" << std::endl;
368 for (int i = 0; i < std::min(10, static_cast<int>(exits->size())); i++) {
369 out << " 0x" << std::hex << std::setw(4) << std::setfill('0')
370 << (*exits)[i].room_id_;
371 if (i < 9) out << ",";
372 out << " // Exit " << i << std::endl;
373 }
374 out << "}};" << std::endl;
375 out << std::endl;
376 }
377
378 void WriteItemData(std::ofstream& out, Overworld& overworld) {
379 out << "// =============================================================================" << std::endl;
380 out << "// Item Data" << std::endl;
381 out << "// =============================================================================" << std::endl;
382 out << std::endl;
383
384 const auto& items = overworld.all_items();
385 out << "constexpr size_t kGoldenNumItems = " << items.size() << ";" << std::endl;
386 out << std::endl;
387
388 // Sample item data for validation
389 if (!items.empty()) {
390 out << "// Sample item data (first 10 items)" << std::endl;
391 out << "constexpr std::array<uint8_t, 10> kGoldenItemIds = {{" << std::endl;
392 for (int i = 0; i < std::min(10, static_cast<int>(items.size())); i++) {
393 out << " 0x" << std::hex << std::setw(2) << std::setfill('0')
394 << static_cast<int>(items[i].id_);
395 if (i < 9) out << ",";
396 out << " // Item " << i << std::endl;
397 }
398 out << "}};" << std::endl;
399 out << std::endl;
400 }
401 }
402
403 void WriteSpriteData(std::ofstream& out, Overworld& overworld) {
404 out << "// =============================================================================" << std::endl;
405 out << "// Sprite Data" << std::endl;
406 out << "// =============================================================================" << std::endl;
407 out << std::endl;
408
409 const auto& sprites = overworld.all_sprites();
410 out << "constexpr size_t kGoldenNumSpriteStates = " << sprites.size() << ";" << std::endl;
411 out << std::endl;
412
413 // Sample sprite data for validation
414 out << "// Sample sprite data (first 5 sprites from each state)" << std::endl;
415 for (int state = 0; state < std::min(3, static_cast<int>(sprites.size())); state++) {
416 out << "constexpr size_t kGoldenNumSpritesState" << state << " = "
417 << sprites[state].size() << ";" << std::endl;
418 }
419 out << std::endl;
420 }
421
422 void WriteMapTilesData(std::ofstream& out, Overworld& overworld) {
423 out << "// =============================================================================" << std::endl;
424 out << "// Map Tiles Data" << std::endl;
425 out << "// =============================================================================" << std::endl;
426 out << std::endl;
427
428 const auto& map_tiles = overworld.map_tiles();
429 out << "// Map tile dimensions" << std::endl;
430 out << "constexpr size_t kGoldenMapTileWidth = " << map_tiles.light_world[0].size() << ";" << std::endl;
431 out << "constexpr size_t kGoldenMapTileHeight = " << map_tiles.light_world.size() << ";" << std::endl;
432 out << std::endl;
433
434 // Sample map tile data for validation
435 out << "// Sample map tile data (top-left 10x10 corner of Light World)" << std::endl;
436 out << "constexpr std::array<std::array<uint16_t, 10>, 10> kGoldenMapTilesSample = {{" << std::endl;
437 for (int row = 0; row < 10; row++) {
438 out << " {{";
439 for (int col = 0; col < 10; col++) {
440 out << "0x" << std::hex << std::setw(4) << std::setfill('0')
441 << map_tiles.light_world[row][col];
442 if (col < 9) out << ", ";
443 }
444 out << "}}";
445 if (row < 9) out << ",";
446 out << " // Row " << row << std::endl;
447 }
448 out << "}};" << std::endl;
449 out << std::endl;
450 }
451
452 void WritePaletteData(std::ofstream& out, Rom& rom) {
453 out << "// =============================================================================" << std::endl;
454 out << "// Palette Data" << std::endl;
455 out << "// =============================================================================" << std::endl;
456 out << std::endl;
457
458 // Sample palette data from ROM
459 out << "// Sample palette data (first 10 bytes from overworld palette table)" << std::endl;
460 out << "constexpr std::array<uint8_t, 10> kGoldenPaletteSample = {{" << std::endl;
461 for (int i = 0; i < 10; i++) {
462 auto palette_byte = rom.ReadByte(0x7D1C + i); // overworldMapPalette
463 if (palette_byte.ok()) {
464 out << " 0x" << std::hex << std::setw(2) << std::setfill('0')
465 << static_cast<int>(*palette_byte);
466 } else {
467 out << " 0x00";
468 }
469 if (i < 9) out << ",";
470 out << " // Palette " << i << std::endl;
471 }
472 out << "}};" << std::endl;
473 out << std::endl;
474 }
475
476 void WriteMusicData(std::ofstream& out, Rom& rom) {
477 out << "// =============================================================================" << std::endl;
478 out << "// Music Data" << std::endl;
479 out << "// =============================================================================" << std::endl;
480 out << std::endl;
481
482 // Sample music data from ROM
483 out << "// Sample music data (first 10 bytes from overworld music table)" << std::endl;
484 out << "constexpr std::array<uint8_t, 10> kGoldenMusicSample = {{" << std::endl;
485 for (int i = 0; i < 10; i++) {
486 auto music_byte = rom.ReadByte(0x14303 + i); // overworldMusicBegining
487 if (music_byte.ok()) {
488 out << " 0x" << std::hex << std::setw(2) << std::setfill('0')
489 << static_cast<int>(*music_byte);
490 } else {
491 out << " 0x00";
492 }
493 if (i < 9) out << ",";
494 out << " // Music " << i << std::endl;
495 }
496 out << "}};" << std::endl;
497 out << std::endl;
498 }
499
500 void WriteOverlayData(std::ofstream& out, Rom& rom) {
501 out << "// =============================================================================" << std::endl;
502 out << "// Overlay Data" << std::endl;
503 out << "// =============================================================================" << std::endl;
504 out << std::endl;
505
506 // Sample overlay data from ROM
507 out << "// Sample overlay data (first 10 bytes from overlay pointers)" << std::endl;
508 out << "constexpr std::array<uint8_t, 10> kGoldenOverlaySample = {{" << std::endl;
509 for (int i = 0; i < 10; i++) {
510 auto overlay_byte = rom.ReadByte(0x77664 + i); // overlayPointers
511 if (overlay_byte.ok()) {
512 out << " 0x" << std::hex << std::setw(2) << std::setfill('0')
513 << static_cast<int>(*overlay_byte);
514 } else {
515 out << " 0x00";
516 }
517 if (i < 9) out << ",";
518 out << " // Overlay " << i << std::endl;
519 }
520 out << "}};" << std::endl;
521 out << std::endl;
522 }
523
524 std::string rom_path_;
525};
526
527int main(int argc, char* argv[]) {
528 if (argc != 3) {
529 std::cerr << "Usage: " << argv[0] << " <rom_path> <output_path>" << std::endl;
530 std::cerr << "Example: " << argv[0] << " zelda3.sfc golden_data.h" << std::endl;
531 return 1;
532 }
533
534 std::string rom_path = argv[1];
535 std::string output_path = argv[2];
536
537 if (!std::filesystem::exists(rom_path)) {
538 std::cerr << "Error: ROM file not found: " << rom_path << std::endl;
539 return 1;
540 }
541
542 OverworldGoldenDataExtractor extractor(rom_path);
543 auto status = extractor.ExtractAllData(output_path);
544
545 if (status.ok()) {
546 std::cout << "Successfully extracted golden data from " << rom_path
547 << " to " << output_path << std::endl;
548 return 0;
549 } else {
550 std::cerr << "Error extracting golden data: " << status.message() << std::endl;
551 return 1;
552 }
553}
Comprehensive ROM value extraction tool for golden data testing.
void WriteEntranceData(std::ofstream &out, Overworld &overworld)
void WriteTileData(std::ofstream &out, Overworld &overworld)
void WriteASMVersionInfo(std::ofstream &out, Rom &rom)
OverworldGoldenDataExtractor(const std::string &rom_path)
void WritePaletteData(std::ofstream &out, Rom &rom)
void WriteSpriteData(std::ofstream &out, Overworld &overworld)
void WriteItemData(std::ofstream &out, Overworld &overworld)
void WriteBasicROMInfo(std::ofstream &out, Rom &rom)
void WriteOverlayData(std::ofstream &out, Rom &rom)
void WriteExitData(std::ofstream &out, Overworld &overworld)
void WriteMapTilesData(std::ofstream &out, Overworld &overworld)
void WriteHoleData(std::ofstream &out, Overworld &overworld)
void WriteOverworldMapsData(std::ofstream &out, Overworld &overworld)
void WriteMusicData(std::ofstream &out, Rom &rom)
absl::Status ExtractAllData(const std::string &output_path)
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:71
absl::Status LoadFromFile(const std::string &filename, bool z3_load=true)
Definition rom.cc:289
absl::StatusOr< uint16_t > ReadWord(int offset)
Definition rom.cc:665
auto size() const
Definition rom.h:202
absl::StatusOr< uint8_t > ReadByte(int offset)
Definition rom.cc:658
auto title() const
Definition rom.h:201
Represents the full Overworld data, light and dark world.
Definition overworld.h:135
absl::Status Load(Rom *rom)
Definition overworld.cc:27
auto expanded_tile32() const
Definition overworld.h:289
const std::vector< OverworldEntrance > & holes() const
Definition overworld.h:273
std::vector< gfx::Tile16 > tiles16() const
Definition overworld.h:262
auto all_sprites() const
Definition overworld.h:317
auto map_tiles() const
Definition overworld.h:311
auto all_items() const
Definition overworld.h:313
auto expanded_tile16() const
Definition overworld.h:288
auto tiles32_unique() const
Definition overworld.h:263
const std::vector< OverworldEntrance > & entrances() const
Definition overworld.h:270
auto overworld_maps() const
Definition overworld.h:257
#define RETURN_IF_ERROR(expression)
Definition macro.h:53
Zelda 3 specific classes and functions.
Main namespace for the application.