yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
overworld.h
Go to the documentation of this file.
1#ifndef YAZE_APP_DATA_OVERWORLD_H
2#define YAZE_APP_DATA_OVERWORLD_H
3
4#include <array>
5#include <cstddef>
6#include <cstdint>
7#include <deque>
8#include <map>
9#include <mutex>
10#include <unordered_map>
11#include <vector>
12
13#include "absl/status/status.h"
14#include "absl/status/statusor.h"
16#include "core/rom_settings.h"
17#include "imgui.h"
18#include "rom/rom.h"
19#include "zelda3/common.h"
20#include "zelda3/game_data.h"
30
31// =============================================================================
32// Overworld Data Layer
33// =============================================================================
34//
35// ARCHITECTURE OVERVIEW:
36// ----------------------
37// The Overworld class is the central data manager for A Link to the Past's
38// overworld system. It handles 160 map screens across three worlds:
39// - Light World: Maps 0x00-0x3F (64 maps)
40// - Dark World: Maps 0x40-0x7F (64 maps)
41// - Special World: Maps 0x80-0x9F (32 maps, expandable to 0xBF with patches)
42//
43// DATA ORGANIZATION:
44// ------------------
45// The overworld uses a hierarchical tile system:
46// - Tile32: 32x32 pixel blocks composed of four Tile16s
47// - Tile16: 16x16 pixel blocks composed of four Tile8s
48// - Tile8: 8x8 pixel base tiles from graphics sheets
49//
50// Map tile data is stored as arrays of Tile16 IDs in OverworldBlockset:
51// - map_tiles_.light_world: 64 maps of 32x32 tile16 IDs each
52// - map_tiles_.dark_world: 64 maps of 32x32 tile16 IDs each
53// - map_tiles_.special_world: 32+ maps of 32x32 tile16 IDs each
54//
55// SAVE SYSTEM DOCUMENTATION:
56// --------------------------
57// The save workflow is controlled by feature flags in OverworldEditor::Save().
58// Each component saves independently but some have ordering dependencies.
59//
60// SAVE ORDER AND DEPENDENCIES:
61//
62// 1. TILE DEFINITIONS (must be saved first, others depend on these IDs):
63// - CreateTile32Tilemap(): Build tile32 from current tile16 data
64// - SaveMap32Tiles(): Write tile32 definitions to ROM
65// - SaveMap16Tiles(): Write tile16 definitions to ROM
66// - SaveOverworldMaps(): Write compressed map tile data
67//
68// 2. ENTITIES (independent, can save in any order):
69// - SaveEntrances(): Entrance warps to underworld
70// - SaveExits(): Exit points returning from underworld
71// - SaveItems(): Hidden items on overworld
72//
73// 3. PROPERTIES (independent, can save in any order):
74// - SaveMapProperties(): Graphics, palettes, messages per area
75// - SaveMusic(): Music IDs per area and game state
76// - SaveAreaSizes(): Area size enum for v3+ ROMs
77//
78// 4. CUSTOM FEATURES (v2+/v3+ only):
79// - SaveCustomOverworldASM(): Custom feature enable flags
80// - SaveAreaSpecificBGColors(): Per-area background colors (v2+)
81// - SaveMapOverlays(): Interactive overlay data
82//
83// TESTING SAVE FUNCTIONALITY:
84// ---------------------------
85// To test individual save components:
86// 1. Enable only one feature flag at a time in core::FeatureFlags
87// 2. Make changes to that component in the editor
88// 3. Save ROM and verify changes in an emulator
89// 4. Check for corruption by loading saved ROM back into editor
90//
91// Round-trip testing:
92// 1. Load vanilla ROM
93// 2. Make changes to all components
94// 3. Save ROM
95// 4. Close and reopen ROM
96// 5. Verify all changes persisted correctly
97//
98// See app/editor/overworld/README.md for complete workflow documentation.
99// =============================================================================
100
101namespace yaze::zelda3 {
102
103inline constexpr int kEssentialMapsPerWorld = 1;
104
105constexpr int GravesYTilePos = 0x49968; // short (0x0F entries)
106constexpr int GravesXTilePos = 0x49986; // short (0x0F entries)
107constexpr int GravesTilemapPos = 0x499A4; // short (0x0F entries)
108constexpr int GravesGFX = 0x499C2; // short (0x0F entries)
109constexpr int GravesXPos = 0x4994A; // short (0x0F entries)
110constexpr int GravesYLine = 0x4993A; // short (0x08 entries)
111constexpr int GravesCountOnY = 0x499E0; // Byte 0x09 entries
112constexpr int GraveLinkSpecialHole = 0x46DD9; // short
113constexpr int GraveLinkSpecialStairs = 0x46DE0; // short
114
115constexpr int kOverworldMapPaletteIds = 0x7D1C;
116constexpr int kOverworldSpritePaletteIds = 0x7B41;
117constexpr int kOverworldSpritePaletteGroup = 0x75580;
118constexpr int kOverworldSpriteset = 0x7A41;
119constexpr int kOverworldSpecialGfxGroup = 0x16821;
120constexpr int kOverworldSpecialPalGroup = 0x16831;
121constexpr int kOverworldSpritesBeginning = 0x4C881;
122constexpr int kOverworldSpritesAgahnim = 0x4CA21;
123constexpr int kOverworldSpritesZelda = 0x4C901;
124
125constexpr int kAreaGfxIdPtr = 0x7C9C;
126constexpr int kOverworldMessageIds = 0x3F51D;
127
128constexpr int kOverworldMusicBeginning = 0x14303;
129constexpr int kOverworldMusicZelda = 0x14303 + 0x40;
130constexpr int kOverworldMusicMasterSword = 0x14303 + 0x80;
131constexpr int kOverworldMusicAgahnim = 0x14303 + 0xC0;
132constexpr int kOverworldMusicDarkWorld = 0x14403;
135
136// 0x00 = small maps, 0x20 = large maps
137constexpr int kOverworldMapSize = 0x12844;
138
139// 0x01 = small maps, 0x03 = large maps
140constexpr int kOverworldMapSizeHighByte = 0x12884;
141
142// relative to the WORLD + 0x200 per map
143// large map that are not == parent id = same position as their parent!
144// eg for X position small maps :
145// 0000, 0200, 0400, 0600, 0800, 0A00, 0C00, 0E00
146// all Large map would be :
147// 0000, 0000, 0400, 0400, 0800, 0800, 0C00, 0C00
148constexpr int kOverworldMapParentId = 0x125EC;
149constexpr int kOverworldTransitionPositionY = 0x128C4;
150constexpr int kOverworldTransitionPositionX = 0x12944;
151constexpr int kOverworldScreenSize = 0x1788D;
152constexpr int kOverworldScreenSizeForLoading = 0x4C635;
153
158
159constexpr int kOverworldMapDataOverflow = 0x130000;
160
161constexpr int kTransitionTargetNorth = 0x13EE2;
162constexpr int kTransitionTargetWest = 0x13F62;
163constexpr int overworldCustomMosaicASM = 0x1301D0;
164constexpr int overworldCustomMosaicArray = 0x1301F0;
165
166// Expanded tile16 and tile32
167constexpr int kMap16TilesExpanded = 0x1E8000;
168constexpr int kMap32TileTRExpanded = 0x020000;
169constexpr int kMap32TileBLExpanded = 0x1F0000;
170constexpr int kMap32TileBRExpanded = 0x1F8000;
171constexpr int kMap32TileCountExpanded = 0x0067E0;
172constexpr int kMap32ExpandedFlagPos = 0x01772E; // 0x04
173constexpr int kMap16ExpandedFlagPos = 0x02FD28; // 0x0F
174
175constexpr int overworldSpritesBeginingExpanded = 0x141438;
176constexpr int overworldSpritesZeldaExpanded = 0x141578;
177constexpr int overworldSpritesAgahnimExpanded = 0x1416B8;
178constexpr int overworldSpritesDataStartExpanded = 0x04C881;
179
182
183constexpr int ExpandedOverlaySpace = 0x120000;
184
185// Expanded pointer table markers for tail map support (maps 0xA0-0xBF)
186// Set by TailMapExpansion.asm patch after ZSCustomOverworld v3
187constexpr int kExpandedPtrTableMarker = 0x1423FF; // Location of marker byte
188constexpr uint8_t kExpandedPtrTableMagic = 0xEA; // Marker value when applied
189constexpr int kExpandedPtrTableHigh = 0x142400; // New high table location
190constexpr int kExpandedPtrTableLow = 0x142640; // New low table location
191// kExpandedMapCount is defined in zelda3/common.h
192
193constexpr int overworldTilesType = 0x071459;
194constexpr int overworldMessages = 0x03F51D;
195constexpr int overworldMessagesExpanded = 0x1417F8;
196
201
206
211
216
222
227
232
237
238constexpr int kOverworldCompressedMapPos = 0x058000;
239constexpr int kOverworldCompressedOverflowPos = 0x137FFF;
240
241constexpr int kNumTileTypes = 0x200;
242constexpr int kMap16Tiles = 0x78000;
243
244constexpr int kNumTile16Individual = 4096;
245constexpr int Map32PerScreen = 256;
246constexpr int NumberOfMap16 = 3752; // 4096
247constexpr int NumberOfMap16Ex = 4096; // 4096
248// Tile32 definitions are packed four-at-a-time into six bytes in each of the
249// four quadrant tables. Keep byte spans and definition capacities distinct:
250// the expanded table length is a byte count, not a Tile32 count.
253constexpr int kMap32TileStorageBytesVanilla = 0x33F0;
255
256constexpr int Map32DefinitionCapacityForStorageBytes(int storage_bytes) {
257 return storage_bytes <= 0 ? 0
258 : (storage_bytes / kMap32BytesPerPackedGroup) *
260}
261
266
267// Compatibility alias for callers that still use the historical name.
269constexpr int NumberOfOWSprites = 352;
271constexpr int kNumMapsPerWorld = 0x40;
272
296
301
307
308inline bool IsValidRomAddress(const Rom& rom, int address) {
309 return address >= 0 && static_cast<size_t>(address) < rom.size();
310}
311
312inline uint8_t ReadRomByteOr(const Rom& rom, int address, uint8_t fallback) {
313 if (!IsValidRomAddress(rom, address)) {
314 return fallback;
315 }
316 return rom.data()[address];
317}
318
324
326 OverworldRomProfile profile;
328 profile.lyra_layout = rom.InspectLyraLayout();
331 profile.is_vanilla = profile.version == OverworldVersion::kVanilla;
334 profile.supports_area_enum =
338
339 const uint8_t tile16_flag = ReadRomByteOr(rom, kMap16ExpandedFlagPos, 0x0F);
340 const uint8_t tile32_flag = ReadRomByteOr(rom, kMap32ExpandedFlagPos, 0x04);
341 const uint8_t entrance_flag =
343
344 profile.has_expanded_tile16 =
345 !profile.is_vanilla &&
346 (profile.supports_area_enum || tile16_flag != 0x0F);
347 profile.has_expanded_tile32 =
348 !profile.is_vanilla &&
349 (profile.supports_area_enum || tile32_flag != 0x04);
350 profile.has_expanded_entrances = !profile.is_vanilla && entrance_flag != 0xB8;
351 profile.has_tail_map_expansion =
355 // The 192-record descriptor is not the older editable $EA tail format.
356 profile.has_tail_map_expansion = false;
357 } else if (profile.has_tail_map_expansion) {
361 } else if (profile.zscream_layout == zscream::LayoutDialect::kUnknown) {
363 }
364 profile.editable_map_count =
366 return profile;
367}
368
369inline int WorldForOverworldMap(int map_index) {
370 if (map_index >= kSpecialWorldMapIdStart) {
371 return 2;
372 }
373 if (map_index >= kDarkWorldMapIdStart) {
374 return 1;
375 }
376 return 0;
377}
378
379inline bool IsSameOverworldWorld(int a, int b) {
381}
382
383inline bool CanPersistLegacyMultiAreaMap(int map_index) {
384 return map_index >= 0 && map_index < kSpecialWorldMapIdStart;
385}
386
387inline bool CanPersistLegacyScreenSize(int map_index) {
388 return map_index >= 0 && map_index < kSpecialWorldMapIdStart;
389}
390
391inline int LegacyParentTableIndexForMap(int map_index) {
392 return map_index & 0x3F;
393}
394
395inline uint8_t LegacyParentTableValueForMap(int parent_index) {
396 return static_cast<uint8_t>(parent_index & 0x3F);
397}
398
399inline int LegacyScreenSizeTableIndexForMap(int map_index) {
400 return map_index;
401}
402
419absl::StatusOr<std::vector<gfx::Tile16>> ReadMap16Tiles(
420 const Rom& rom, bool* expanded = nullptr);
421
423 public:
424 Overworld(Rom* rom, GameData* game_data = nullptr)
425 : rom_(rom), game_data_(game_data) {}
426
427 void SetGameData(GameData* game_data) { game_data_ = game_data; }
428
431 return kVersionConstantsMap.at(game_data_ ? game_data_->version
432 : zelda3_version::US);
433 }
434
435 // ===========================================================================
436 // Loading Methods
437 // ===========================================================================
438
440 absl::Status Load(Rom* rom);
441 // Explicit descriptor terrain path. The normal model loader remains
442 // legacy-only; the editor admits this path only to its read-only canvas.
443 absl::Status LoadLyraTerrainPreview(Rom* rom);
448 if (is_lyra_preview()) {
450 }
452 return kExpandedMapCount;
453 }
454 return kNumOverworldMaps;
455 }
456 bool descriptor_sprite_display_available() const { return false; }
460 const std::array<uint16_t, 256>& lyra_a0_tiles() const {
461 return lyra_a0_tiles_;
462 }
463 absl::Status SetLyraA0Tile32(int x, int y, uint16_t tile);
464
466 absl::Status LoadOverworldMaps();
467
469 void LoadTileTypes();
470 // Resolve collision metadata for the selected map. Custom per-sheet data is
471 // read-only until a matching writer has been qualified with the team editor.
472 absl::StatusOr<std::array<uint8_t, kNumTileTypes>> GetTile8CollisionTypes(
473 int map_id) const;
474
476 absl::Status LoadSprites();
477 absl::StatusOr<OverworldSpriteSavePlan> PrepareSpriteSave() const;
478 absl::Status SaveSprites();
479
481 absl::Status LoadSpritesFromMap(int sprite_start, int sprite_count,
482 int sprite_index);
483
484 // ===========================================================================
485 // Lazy Loading / Caching
486 // ===========================================================================
487
494 absl::Status EnsureMapBuilt(int map_index);
495
504 void SyncAreaProperties(int map_index);
506
509 uint16_t overlay_id = 0x00FF;
510 int overlay_screen = -1; // -1: the area has no subscreen overlay
511 bool background = false; // drawn over backdrop pixels only
512 std::vector<uint8_t> pixels; // 512x512, 0 = transparent
513 };
514
519 absl::StatusOr<SubscreenOverlayLayer> BuildSubscreenOverlayLayer(
520 int map_index);
521
522 // ---------------------------------------------------------------------------
523 // Shared tileset cache
524 //
525 // Maps whose 17 sheet ids match (OverworldMap::tileset_key(): 16 static
526 // sheets + animated sheet) share the same 64KB tileset and, for the same
527 // tile16 definitions, the same 1MB tile16 blockset. The cache keeps both so
528 // a map build only redoes the palette and its own 512x512 bitmap.
529 // ---------------------------------------------------------------------------
530
534
537 void InvalidateTilesetCacheForSheet(int sheet);
538
540 size_t tileset_cache_size() const { return tileset_cache_.size(); }
541
544 void InvalidateMapCache(int map_index);
545
548 void InvalidateSiblingMapCaches(int map_index);
549
550 // ===========================================================================
551 // Save Methods - Tile Data (Order Matters!)
552 // ===========================================================================
553 // These methods must be called in order because later saves depend on
554 // tile definitions being written first.
555 //
556 // Required order:
557 // 1. CreateTile32Tilemap() - Build tile32 from tile16 data
558 // 2. SaveMap32Tiles() - Write tile32 definitions
559 // 3. SaveMap16Tiles() - Write tile16 definitions
560 // 4. SaveOverworldMaps() - Write compressed map data
561
563 absl::Status Save(Rom* rom);
564
566 absl::Status SaveOverworldMaps();
567 absl::Status ValidatePrivateNativeTerrainSave() const;
568
569 // Map-grid identity for skipping recompression. SaveOverworldMaps stages the
570 // grids it serialized; the editor save transaction publishes that stage only
571 // after the ROM transaction and disk write both commit.
572 void StageSavedMapTiles();
573 void CommitSavedMapTiles();
575
577 absl::Status SaveLargeMaps();
578
580 absl::Status SaveLargeMapsExpanded();
581
583 absl::Status SaveSmallAreaTransitions(
584 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
585 int transition_target_west, int transition_pos_x, int transition_pos_y,
586 int screen_change_1, int screen_change_2, int screen_change_3,
587 int screen_change_4);
588
590 absl::Status SaveLargeAreaTransitions(
591 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
592 int transition_target_west, int transition_pos_x, int transition_pos_y,
593 int screen_change_1, int screen_change_2, int screen_change_3,
594 int screen_change_4);
595
597 absl::Status SaveWideAreaTransitions(
598 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
599 int transition_target_west, int transition_pos_x, int transition_pos_y,
600 int screen_change_1, int screen_change_2, int screen_change_3,
601 int screen_change_4);
602
604 absl::Status SaveTallAreaTransitions(
605 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
606 int transition_target_west, int transition_pos_x, int transition_pos_y,
607 int screen_change_1, int screen_change_2, int screen_change_3,
608 int screen_change_4);
609
610 // ===========================================================================
611 // Save Methods - Entities (Independent, any order)
612 // ===========================================================================
613
615 absl::Status SaveEntrances();
616
618 absl::Status SaveExits();
619
621 absl::Status SaveItems();
622
624 absl::Status SaveMapOverlays();
625
627 absl::Status SaveOverworldTilesType();
628
629 // ===========================================================================
630 // Save Methods - Custom Features (v2+/v3+)
631 // ===========================================================================
632
634 absl::Status SaveCustomOverworldASM(bool enable_bg_color,
635 bool enable_main_palette,
636 bool enable_mosaic,
637 bool enable_gfx_groups,
638 bool enable_subscreen_overlay,
639 bool enable_animated);
640
642 absl::Status SaveAreaSpecificBGColors();
643
645 absl::Status SaveCustomOverworldData();
646
647 // ===========================================================================
648 // Save Methods - Tile Definitions
649 // ===========================================================================
650
653 absl::Status CreateTile32Tilemap();
654
656 absl::Status SaveMap16Expanded();
657
659 absl::Status SaveMap16Tiles();
660
662 absl::Status SaveMap32Expanded();
663
665 absl::Status SaveMap32Tiles();
666
667 // ===========================================================================
668 // Save Methods - Properties
669 // ===========================================================================
670
672 absl::Status SaveMapProperties();
673
675 absl::Status SaveMusic();
676
678 absl::Status SaveAreaSizes();
679
681 void AssignMapSizes(std::vector<OverworldMap>& maps);
682
691 absl::Status ConfigureMultiAreaMap(int parent_index, AreaSizeEnum size);
692
693 auto rom() const { return rom_; }
694 auto mutable_rom() { return rom_; }
695
704 std::vector<std::pair<uint32_t, uint32_t>> GetProjectedWriteRanges() const;
705
714 const int marker_addr = GetExpandedPtrTableMarker();
716 marker_addr >= rom_->size()) {
717 return false;
718 }
719 return rom_->data()[marker_addr] == GetExpandedPtrTableMagic();
720 }
721
722 void Destroy() {
723 for (auto& map : overworld_maps_) {
724 map.Destroy();
725 }
726 overworld_maps_.clear();
727 all_entrances_.clear();
728 all_exits_.clear();
729 all_items_.clear();
730 for (auto& sprites : all_sprites_) {
731 sprites.clear();
732 }
734 built_map_lru_.clear();
735 tileset_cache_.clear();
738 tiles16_.clear();
739 tiles32_.clear();
740 tiles32_unique_.clear();
741 is_loaded_ = false;
742 }
743
744 int GetTileFromPosition(ImVec2 position) const {
745 if (current_world_ == 0) {
746 return map_tiles_.light_world[position.x][position.y];
747 } else if (current_world_ == 1) {
748 return map_tiles_.dark_world[position.x][position.y];
749 } else {
750 return map_tiles_.special_world[position.x][position.y];
751 }
752 }
753
755 switch (world_type) {
756 case 0:
757 return map_tiles_.light_world;
758 case 1:
759 return map_tiles_.dark_world;
760 case 2:
762 default:
763 return map_tiles_.light_world;
764 }
765 }
766
767 const std::vector<OverworldMap>& overworld_maps() const {
768 return overworld_maps_;
769 }
770 auto overworld_map(int i) const {
771 if (i < 0 || i >= static_cast<int>(overworld_maps_.size())) {
772 return static_cast<const OverworldMap*>(nullptr);
773 }
774 return &overworld_maps_[i];
775 }
777 if (i < 0 || i >= static_cast<int>(overworld_maps_.size())) {
778 return static_cast<OverworldMap*>(nullptr);
779 }
780 return &overworld_maps_[i];
781 }
782 auto exits() const { return &all_exits_; }
783 auto mutable_exits() { return &all_exits_; }
784 const std::vector<gfx::Tile16>& tiles16() const { return tiles16_; }
785 auto tiles32_unique() const { return tiles32_unique_; }
786 auto mutable_tiles16() { return &tiles16_; }
787 auto sprites(int state) const {
788 if (state < 0 || state >= 3)
789 return std::vector<Sprite>{};
790 return all_sprites_[state];
791 }
792 auto mutable_sprites(int state) {
793 if (state < 0 || state >= 3)
794 return static_cast<std::vector<Sprite>*>(nullptr);
795 return &all_sprites_[state];
796 }
797 const std::vector<uint8_t>& current_graphics() const {
798 static const std::vector<uint8_t> kEmpty;
800 return kEmpty;
801 return overworld_maps_[current_map_].current_graphics();
802 }
803 const std::vector<OverworldEntrance>& entrances() const {
804 return all_entrances_;
805 }
806 auto& entrances() { return all_entrances_; }
808 const std::vector<OverworldEntrance>& holes() const { return all_holes_; }
809 auto& holes() { return all_holes_; }
810 auto mutable_holes() { return &all_holes_; }
811 auto deleted_entrances() const { return deleted_entrances_; }
814 static const gfx::SnesPalette kEmpty;
816 return kEmpty;
817 return overworld_maps_[current_map_].current_palette();
818 }
819 const std::vector<uint8_t>& current_map_bitmap_data() const {
820 static const std::vector<uint8_t> kEmpty;
822 return kEmpty;
823 return overworld_maps_[current_map_].bitmap_data();
824 }
825 const std::vector<uint8_t>& tile16_blockset_data() const {
826 static const std::vector<uint8_t> kEmpty;
828 return kEmpty;
829 return overworld_maps_[current_map_].current_tile16_blockset();
830 }
831
832 bool is_current_map_valid() const {
833 return current_map_ >= 0 &&
834 current_map_ < static_cast<int>(overworld_maps_.size());
835 }
836 auto is_loaded() const { return is_loaded_; }
837 auto expanded_tile16() const { return expanded_tile16_; }
838 auto expanded_tile32() const { return expanded_tile32_; }
842 int current_map_id() const { return current_map_; }
843 int current_world() const { return current_world_; }
844 void set_current_map(int i) { current_map_ = i; }
845 void set_current_world(int world) { current_world_ = world; }
846 // Select the state for future builds; editor refresh owns bitmap invalidation.
847 void set_game_state(int state);
848 uint16_t GetTile(int x, int y) const {
849 if (current_world_ == 0) {
850 return map_tiles_.light_world[x][y];
851 } else if (current_world_ == 1) {
852 return map_tiles_.dark_world[x][y];
853 } else {
854 return map_tiles_.special_world[x][y];
855 }
856 }
857 void SetTile(int x, int y, uint16_t tile_id) {
858 if (current_world_ == 0) {
859 map_tiles_.light_world[x][y] = tile_id;
860 } else if (current_world_ == 1) {
861 map_tiles_.dark_world[x][y] = tile_id;
862 } else {
863 map_tiles_.special_world[x][y] = tile_id;
864 }
865 }
866 auto map_tiles() const { return map_tiles_; }
867 auto mutable_map_tiles() { return &map_tiles_; }
868 auto all_items() const { return all_items_; }
869 auto mutable_all_items() { return &all_items_; }
870 auto all_tiles_types() const { return all_tiles_types_; }
872 auto all_sprites() const { return all_sprites_; }
873
874 // Diggable tiles management
877 absl::Status LoadDiggableTiles();
878 absl::Status SaveDiggableTiles();
879 absl::Status AutoDetectDiggableTiles();
880
881 private:
888
889 void FetchLargeMaps();
890 absl::StatusOr<uint16_t> GetTile16ForTile32(int index, int quadrant,
891 int dimension,
892 const uint32_t* map32address);
893 absl::Status AssembleMap32Tiles();
894 absl::Status AssembleMap16Tiles();
895 void AssignWorldTiles(int x, int y, int sx, int sy, int tpos,
896 OverworldBlockset& world);
897 void FillBlankMapTiles(int map_index);
898 OverworldBlockset& SelectWorldBlockset(int world_type);
899 void OrganizeMapTiles(std::vector<uint8_t>& bytes,
900 std::vector<uint8_t>& bytes2, int i, int sx, int sy,
901 int& ttpos);
902 absl::Status DecompressAllMapTilesParallel();
903 absl::Status BuildLyraTerrainPreview(Rom* rom,
905
908
909 bool is_loaded_ = false;
910 bool expanded_tile16_ = false;
911 bool expanded_tile32_ = false;
914
915 int game_state_ = 0;
918
919 // Cached ROM version to avoid repeated detection during loading
921
924 std::array<uint16_t, 256> lyra_a0_tiles_{};
925 // Grids last published by a committed save, or captured at load. Recompressing
926 // maps rewrites pointer tables that overlap Oracle overworld ASM hooks, and
927 // resaving tile32 reorders expanded definitions. An unchanged grid leaves
928 // both on disk. The staged copy is not this identity: a failed save rolls
929 // the ROM back and must not treat the unsaved edit as already written.
930 std::vector<gfx::Tile16> private_loaded_tiles16_;
931 std::vector<uint8_t> private_loaded_overlays_;
936 bool MapTilesUnchanged() const;
937
938 // Thread safety for parallel operations
939 mutable std::mutex map_tiles_mutex_;
940
941 // LRU cache for built maps to prevent memory exhaustion.
942 // Keep this aligned with the essential preload set so the default startup
943 // world stays warm without permanently retaining dozens of maps.
944 static constexpr int kMaxBuiltMaps = 8;
945 std::deque<int> built_map_lru_;
946
947 // Shared tileset cache (see ClearGraphicsConfigCache()).
948 // GraphicsSheetStore revision of each sheet in an OverworldTilesetKey.
950 std::array<uint64_t, std::tuple_size_v<OverworldTilesetKey>>;
952
954 TilesetRevisions sheet_revisions{}; // store revisions when built
955 std::vector<uint8_t> current_gfx; // 64KB tileset
956 std::vector<uint8_t> tile16_blockset; // 1MB tile16 pixels (may be empty)
957 uint64_t tiles16_fingerprint = 0; // tile16 defs the blockset used
958 uint64_t last_use = 0;
959 };
960 std::map<OverworldTilesetKey, TilesetCacheEntry> tileset_cache_;
962#ifdef __EMSCRIPTEN__
963 static constexpr size_t kMaxCachedTilesets = 8; // ~8.5MB
964#else
965 static constexpr size_t kMaxCachedTilesets = 24; // ~26MB
966#endif
967
968 uint64_t Tiles16Fingerprint() const;
969 absl::Status BuildMapWithTilesetCache(int map_index, int world_type);
970
971 std::vector<OverworldMap> overworld_maps_;
973 std::vector<OverworldEntrance> all_entrances_;
974 std::vector<OverworldEntrance> all_holes_;
975 std::vector<OverworldExit> all_exits_;
976 std::vector<OverworldItem> all_items_;
977
978 std::vector<gfx::Tile16> tiles16_;
979 std::vector<gfx::Tile32> tiles32_;
980 std::vector<gfx::Tile32> tiles32_unique_;
981
982 std::vector<uint16_t> tiles32_list_;
983 std::vector<uint64_t> deleted_entrances_;
984
985 std::array<uint8_t, kNumOverworldMaps> map_parent_ = {0};
986 std::array<uint8_t, kNumTileTypes> all_tiles_types_ = {0};
987 std::array<std::vector<Sprite>, 3> all_sprites_;
988 std::array<std::array<bool, 160>, 3> sprite_maps_loaded_{};
990 std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p1;
991 std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p2;
992 std::array<int, kNumOverworldMaps> map_pointers1_id;
993 std::array<int, kNumOverworldMaps> map_pointers2_id;
994 std::array<int, kNumOverworldMaps> map_pointers1;
995 std::array<int, kNumOverworldMaps> map_pointers2;
996};
997
998} // namespace yaze::zelda3
999
1000#endif
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:52
rom::LyraLayoutInspection InspectLyraLayout() const
Definition rom.cc:421
auto data() const
Definition rom.h:213
auto size() const
Definition rom.h:212
static RomSettings & Get()
uint32_t GetAddressOr(const std::string &key, uint32_t default_value) const
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
Manages diggable tile state as a 512-bit bitfield.
Represents a single Overworld map screen.
static bool SupportsCustomBGColors(OverworldVersion version)
Check if ROM supports custom background colors per area (v2+)
static OverworldVersion GetVersion(const Rom &rom)
Detect ROM version from ASM marker byte.
static uint8_t GetAsmVersion(const Rom &rom)
Get raw ASM version byte from ROM.
static bool SupportsAreaEnum(OverworldVersion version)
Check if ROM supports area enum system (v3+ only)
static bool SupportsExpandedSpace(OverworldVersion version)
Check if ROM uses expanded ROM space for overworld data.
std::vector< uint64_t > deleted_entrances_
Definition overworld.h:983
absl::Status SaveMap32Expanded()
Save expanded tile32 definitions (v1+ ROMs)
absl::Status BuildMapWithTilesetCache(int map_index, int world_type)
absl::Status DecompressAllMapTilesParallel()
Definition overworld.cc:915
std::vector< uint16_t > tiles32_list_
Definition overworld.h:982
void InvalidateTilesetCacheForSheet(int sheet)
Drop cached tilesets that load sheet (graphics sheet edits). Built maps keep their pixels; mark them ...
void set_current_world(int world)
Definition overworld.h:845
int GetTileFromPosition(ImVec2 position) const
Definition overworld.h:744
rom::LyraLayoutInspection descriptor_layout_
Definition overworld.h:923
absl::Status Load(Rom *rom)
Load all overworld data from ROM.
Definition overworld.cc:158
int current_world() const
Definition overworld.h:843
std::vector< OverworldItem > all_items_
Definition overworld.h:976
void OrganizeMapTiles(std::vector< uint8_t > &bytes, std::vector< uint8_t > &bytes2, int i, int sx, int sy, int &ttpos)
Definition overworld.cc:895
auto expanded_tile32() const
Definition overworld.h:838
zelda3_version_pointers version_constants() const
Get version-specific ROM addresses.
Definition overworld.h:430
std::array< int, kNumOverworldMaps > map_pointers1
Definition overworld.h:994
void SyncAreaProperties(int map_index)
Copy the area parent's render settings (main palette, animated GFX, tile GFX groups,...
std::vector< gfx::Tile32 > tiles32_unique_
Definition overworld.h:980
absl::Status SetLyraA0Tile32(int x, int y, uint16_t tile)
Definition overworld.cc:359
const std::vector< uint8_t > & current_graphics() const
Definition overworld.h:797
auto deleted_entrances() const
Definition overworld.h:811
absl::Status SaveMapProperties()
Save per-area graphics, palettes, and messages.
std::vector< std::pair< uint32_t, uint32_t > > GetProjectedWriteRanges() const
Get the projected write ranges (PC offsets) for overworld map saves.
void ClearGraphicsConfigCache()
Drop every cached tileset/blockset. Call after graphics buffer or tile16 edits that are not tied to o...
Definition overworld.h:533
absl::Status ValidatePrivateNativeTerrainSave() const
const std::vector< OverworldEntrance > & holes() const
Definition overworld.h:808
absl::Status SaveMap32Tiles()
Save tile32 definitions to ROM.
std::map< OverworldTilesetKey, TilesetCacheEntry > tileset_cache_
Definition overworld.h:960
void set_has_tail_map_expansion(bool v)
Definition overworld.h:841
const gfx::SnesPalette & current_area_palette() const
Definition overworld.h:813
std::vector< OverworldEntrance > all_entrances_
Definition overworld.h:973
absl::Status SaveTallAreaTransitions(int i, int parent_x_pos, int parent_y_pos, int transition_target_north, int transition_target_west, int transition_pos_x, int transition_pos_y, int screen_change_1, int screen_change_2, int screen_change_3, int screen_change_4)
Save screen transition data for tall (1x2) areas (v3+ only)
OverworldMapTiles map_tiles_
Definition overworld.h:922
absl::Status SaveMap16Tiles()
Save tile16 definitions to ROM.
absl::Status SaveAreaSizes()
Save area size enum data (v3+ only)
absl::Status SaveSprites()
auto all_sprites() const
Definition overworld.h:872
DiggableTiles * mutable_diggable_tiles()
Definition overworld.h:876
auto sprites(int state) const
Definition overworld.h:787
auto map_tiles() const
Definition overworld.h:866
void InvalidateSiblingMapCaches(int map_index)
Invalidate cached tilesets for a map and all its siblings.
absl::Status SaveLargeMaps()
Save large map parent/sibling relationships.
auto all_items() const
Definition overworld.h:868
const std::vector< gfx::Tile16 > & tiles16() const
Definition overworld.h:784
std::array< uint8_t, kNumOverworldMaps > map_parent_
Definition overworld.h:985
void AssignWorldTiles(int x, int y, int sx, int sy, int tpos, OverworldBlockset &world)
Definition overworld.cc:850
absl::Status SaveDiggableTiles()
void InvalidateMapCache(int map_index)
Invalidate cached tileset for a specific map.
void SetGameData(GameData *game_data)
Definition overworld.h:427
bool lyra_a0_terrain_writable() const
Definition overworld.h:457
std::array< uint16_t, 256 > lyra_a0_tiles_
Definition overworld.h:924
Overworld(Rom *rom, GameData *game_data=nullptr)
Definition overworld.h:424
bool is_lyra_preview() const
Definition overworld.h:444
auto is_loaded() const
Definition overworld.h:836
auto expanded_tile16() const
Definition overworld.h:837
std::array< uint8_t, kNumTileTypes > all_tiles_types_
Definition overworld.h:986
int inspected_map_count() const
Definition overworld.h:447
absl::StatusOr< SubscreenOverlayLayer > BuildSubscreenOverlayLayer(int map_index)
Build the subscreen overlay layer for a screen (builds the screen if needed). The overlay comes from ...
void LoadTileTypes()
Load tile type collision data.
absl::Status CreateTile32Tilemap()
Build tile32 tilemap from current tile16 data.
const std::vector< OverworldMap > & overworld_maps() const
Definition overworld.h:767
std::array< int, kNumOverworldMaps > map_pointers1_id
Definition overworld.h:992
auto overworld_map(int i) const
Definition overworld.h:770
int current_map_id() const
Definition overworld.h:842
size_t tileset_cache_size() const
Number of cached tileset entries (for tests and diagnostics).
Definition overworld.h:540
const std::vector< uint8_t > & tile16_blockset_data() const
Definition overworld.h:825
uint64_t Tiles16Fingerprint() const
void SetGraphicsPreview(OverworldGraphicsPreview preview)
absl::Status SaveLargeAreaTransitions(int i, int parent_x_pos, int parent_y_pos, int transition_target_north, int transition_target_west, int transition_pos_x, int transition_pos_y, int screen_change_1, int screen_change_2, int screen_change_3, int screen_change_4)
Save screen transition data for large (2x2) areas.
OverworldBlockset & SelectWorldBlockset(int world_type)
Definition overworld.cc:862
bool HasExpandedPointerTables() const
Check if the ROM has expanded pointer tables for tail maps.
Definition overworld.h:713
uint64_t tileset_cache_clock_
Definition overworld.h:961
auto all_tiles_types() const
Definition overworld.h:870
absl::Status SaveCustomOverworldASM(bool enable_bg_color, bool enable_main_palette, bool enable_mosaic, bool enable_gfx_groups, bool enable_subscreen_overlay, bool enable_animated)
Save custom ASM feature enable flags.
absl::Status SaveCustomOverworldData()
Save all v2/v3 property tables using the ROM's current feature flags.
void set_current_map(int i)
Definition overworld.h:844
bool has_tail_map_expansion() const
Definition overworld.h:840
absl::StatusOr< OverworldSpriteSavePlan > PrepareSpriteSave() const
void FillBlankMapTiles(int map_index)
Definition overworld.cc:873
auto mutable_overworld_map(int i)
Definition overworld.h:776
bool MapTilesUnchanged() const
absl::Status SaveEntrances()
Save entrance warp points to ROM.
absl::Status SaveExits()
Save exit return points to ROM.
absl::Status LoadSprites()
Load sprite data for all game states.
absl::Status EnsureMapBuilt(int map_index)
Build a map on-demand if it hasn't been built yet.
std::vector< OverworldMap > overworld_maps_
Definition overworld.h:971
OverworldMapTiles loaded_map_tiles_
Definition overworld.h:932
absl::Status SaveItems()
Save hidden overworld items to ROM.
absl::Status SaveAreaSpecificBGColors()
Save per-area background colors (v2+)
absl::Status LoadDiggableTiles()
absl::Status Save(Rom *rom)
Master save method (calls sub-methods in correct order)
std::vector< gfx::Tile32 > tiles32_
Definition overworld.h:979
absl::Status SaveWideAreaTransitions(int i, int parent_x_pos, int parent_y_pos, int transition_target_north, int transition_target_west, int transition_pos_x, int transition_pos_y, int screen_change_1, int screen_change_2, int screen_change_3, int screen_change_4)
Save screen transition data for wide (2x1) areas (v3+ only)
absl::Status LoadLyraTerrainPreview(Rom *rom)
Definition overworld.cc:287
uint16_t GetTile(int x, int y) const
Definition overworld.h:848
absl::Status SaveOverworldMaps()
Save compressed map tile data to ROM.
std::array< std::vector< Sprite >, 3 > all_sprites_
Definition overworld.h:987
OverworldVersion cached_version_
Definition overworld.h:920
std::array< int, kNumOverworldMaps > map_pointers2_id
Definition overworld.h:993
auto tiles32_unique() const
Definition overworld.h:785
void SetTile(int x, int y, uint16_t tile_id)
Definition overworld.h:857
absl::Status LoadOverworldMaps()
Load overworld map tile data.
std::vector< gfx::Tile16 > tiles16_
Definition overworld.h:978
absl::Status AutoDetectDiggableTiles()
TilesetRevisions SheetRevisionsForKey(const OverworldTilesetKey &key) const
OverworldGraphicsPreview graphics_preview_
Definition overworld.h:972
auto expanded_entrances() const
Definition overworld.h:839
absl::Status AssembleMap16Tiles()
Definition overworld.cc:838
std::mutex map_tiles_mutex_
Definition overworld.h:939
const std::vector< uint8_t > & current_map_bitmap_data() const
Definition overworld.h:819
auto mutable_sprites(int state)
Definition overworld.h:792
absl::Status LoadSpritesFromMap(int sprite_start, int sprite_count, int sprite_index)
Load sprites from a specific map range.
std::vector< uint8_t > private_loaded_overlays_
Definition overworld.h:931
const DiggableTiles & diggable_tiles() const
Definition overworld.h:875
void set_game_state(int state)
Definition overworld.cc:154
const std::array< uint16_t, 256 > & lyra_a0_tiles() const
Definition overworld.h:460
const std::vector< OverworldEntrance > & entrances() const
Definition overworld.h:803
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p1
Definition overworld.h:990
absl::Status SaveLargeMapsExpanded()
Save expanded large map data (v1+ ROMs)
void AssignMapSizes(std::vector< OverworldMap > &maps)
Assign map sizes based on area size enum (v3+)
Definition overworld.cc:474
absl::Status SaveMap16Expanded()
Save expanded tile16 definitions (v1+ ROMs)
absl::Status BuildLyraTerrainPreview(Rom *rom, rom::LyraLayoutInspection layout)
Definition overworld.cc:303
std::vector< OverworldExit > all_exits_
Definition overworld.h:975
std::array< int, kNumOverworldMaps > map_pointers2
Definition overworld.h:995
absl::StatusOr< uint16_t > GetTile16ForTile32(int index, int quadrant, int dimension, const uint32_t *map32address)
Definition overworld.cc:726
std::vector< gfx::Tile16 > private_loaded_tiles16_
Definition overworld.h:930
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p2
Definition overworld.h:991
absl::Status SaveSmallAreaTransitions(int i, int parent_x_pos, int parent_y_pos, int transition_target_north, int transition_target_west, int transition_pos_x, int transition_pos_y, int screen_change_1, int screen_change_2, int screen_change_3, int screen_change_4)
Save screen transition data for small (1x1) areas.
std::deque< int > built_map_lru_
Definition overworld.h:945
absl::Status SaveMapOverlays()
Save interactive overlay data to ROM.
absl::Status AssembleMap32Tiles()
Definition overworld.cc:737
bool is_current_map_valid() const
Definition overworld.h:832
static constexpr size_t kMaxCachedTilesets
Definition overworld.h:965
absl::StatusOr< std::array< uint8_t, kNumTileTypes > > GetTile8CollisionTypes(int map_id) const
DiggableTiles diggable_tiles_
Definition overworld.h:989
static constexpr int kMaxBuiltMaps
Definition overworld.h:944
std::array< std::array< bool, 160 >, 3 > sprite_maps_loaded_
Definition overworld.h:988
OverworldBlockset & GetMapTiles(int world_type)
Definition overworld.h:754
OverworldMapTiles staged_map_tiles_
Definition overworld.h:934
absl::Status SaveOverworldTilesType()
Save tile type collision data to ROM.
absl::Status SaveMusic()
Save per-area music IDs.
absl::Status ConfigureMultiAreaMap(int parent_index, AreaSizeEnum size)
Configure a multi-area map structure (Large/Wide/Tall)
Definition overworld.cc:558
std::vector< OverworldEntrance > all_holes_
Definition overworld.h:974
std::array< uint64_t, std::tuple_size_v< OverworldTilesetKey > > TilesetRevisions
Definition overworld.h:949
bool descriptor_sprite_display_available() const
Definition overworld.h:456
constexpr char kOverworldExpandedPtrHigh[]
constexpr char kOverworldMap16Expanded[]
constexpr char kOverworldExpandedPtrMagic[]
constexpr char kOverworldMap32BlExpanded[]
constexpr char kOverworldExpandedPtrMarker[]
constexpr char kOverworldMap32TrExpanded[]
constexpr char kOverworldExpandedPtrLow[]
constexpr char kOverworldMap32BrExpanded[]
LayoutDialect DetectLayout(const Rom &rom)
bool CanUseTailExpansion(const Rom &rom)
Zelda 3 specific classes and functions.
constexpr int GravesGFX
Definition overworld.h:108
constexpr int overworldSpecialSpritePaletteExpandedTemp
Definition overworld.h:181
constexpr int kAreaGfxIdPtr
Definition overworld.h:125
constexpr int kOverworldSpritePaletteGroup
Definition overworld.h:117
constexpr int kOverworldTransitionPositionY
Definition overworld.h:149
constexpr int kNumMapsPerWorld
Definition overworld.h:271
constexpr int kOverworldSpriteset
Definition overworld.h:118
int GetMap32TileBRExpanded()
Definition overworld.h:212
bool IsValidRomAddress(const Rom &rom, int address)
Definition overworld.h:308
constexpr int kMap16ExpandedFlagPos
Definition overworld.h:173
constexpr int LimitOfMap32
Definition overworld.h:268
constexpr int NumberOfMap16Ex
Definition overworld.h:247
constexpr int kOverworldScreenTileMapChangeByScreen1
Definition overworld.h:154
constexpr int kOverworldMapDataOverflow
Definition overworld.h:159
int LegacyParentTableIndexForMap(int map_index)
Definition overworld.h:391
constexpr int kMap32BytesPerPackedGroup
Definition overworld.h:252
constexpr int kOverworldMapSizeHighByte
Definition overworld.h:140
constexpr int overworldMessagesExpanded
Definition overworld.h:195
constexpr int GravesTilemapPos
Definition overworld.h:107
constexpr int overworldSpritesBeginingExpanded
Definition overworld.h:175
constexpr int kNumTileTypes
Definition overworld.h:241
uint8_t ReadRomByteOr(const Rom &rom, int address, uint8_t fallback)
Definition overworld.h:312
constexpr int NumberOfMap32
Definition overworld.h:270
constexpr int kOverworldScreenSize
Definition overworld.h:151
constexpr int kExpandedPtrTableLow
Definition overworld.h:190
constexpr int kOverworldScreenTileMapChangeByScreen4
Definition overworld.h:157
constexpr int kNumTile16Individual
Definition overworld.h:244
int GetMap32TileTRExpanded()
Definition overworld.h:202
constexpr int kSpecialWorldMapIdStart
constexpr int ExpandedOverlaySpace
Definition overworld.h:183
constexpr int kMap32DefinitionCapacityVanilla
Definition overworld.h:262
constexpr int GravesCountOnY
Definition overworld.h:111
constexpr int kMap16Tiles
Definition overworld.h:242
constexpr int overworldSpritesAgahnimExpanded
Definition overworld.h:177
int GetMap32TileBLExpanded()
Definition overworld.h:207
constexpr int kExpandedPtrTableMarker
Definition overworld.h:187
constexpr int Map32DefinitionCapacityForStorageBytes(int storage_bytes)
Definition overworld.h:256
constexpr int GravesYLine
Definition overworld.h:110
constexpr int kNumOverworldMaps
Definition common.h:85
int GetExpandedPtrTableHigh()
Definition overworld.h:228
constexpr int GravesXTilePos
Definition overworld.h:106
bool IsSpecialTailMapExpansionEnabled(const Rom &rom)
Definition overworld.h:319
constexpr int kOverworldMusicBeginning
Definition overworld.h:128
std::vector< std::vector< uint16_t > > OverworldBlockset
Represents tile32 data for the overworld.
int GetExpandedPtrTableMarker()
Definition overworld.h:217
constexpr int kMap32TileBLExpanded
Definition overworld.h:169
AreaSizeEnum
Area size enumeration for v3+ ROMs.
constexpr int kOverworldTransitionPositionX
Definition overworld.h:150
constexpr int kOverworldMusicDarkWorld
Definition overworld.h:132
std::array< uint8_t, 17 > OverworldTilesetKey
constexpr int overworldSpecialSpriteGFXGroupExpandedTemp
Definition overworld.h:180
constexpr int kOverworldSpecialPalGroup
Definition overworld.h:120
constexpr int kOverworldScreenSizeForLoading
Definition overworld.h:152
constexpr int kOverworldSpritePaletteIds
Definition overworld.h:116
std::map< int, AreaGraphicsPreview > OverworldGraphicsPreview
constexpr int overworldTilesType
Definition overworld.h:193
constexpr int kMap32TileBRExpanded
Definition overworld.h:170
constexpr int kMap32TileCountExpanded
Definition overworld.h:171
int GetExpandedPtrTableLow()
Definition overworld.h:233
constexpr int kTransitionTargetWest
Definition overworld.h:162
constexpr int overworldMessages
Definition overworld.h:194
constexpr int kMap32TileStorageBytesVanilla
Definition overworld.h:253
constexpr int kOverworldMusicAgahnim
Definition overworld.h:131
constexpr int kMap32TileStorageBytesExpanded
Definition overworld.h:254
constexpr int kOverworldSpritesZelda
Definition overworld.h:123
constexpr int kOverworldMapParentId
Definition overworld.h:148
constexpr int GraveLinkSpecialHole
Definition overworld.h:112
constexpr int Map32PerScreen
Definition overworld.h:245
absl::StatusOr< std::vector< gfx::Tile16 > > ReadMap16Tiles(const Rom &rom, bool *expanded)
Represents the full Overworld data, light and dark world.
Definition overworld.cc:797
constexpr int GravesXPos
Definition overworld.h:109
constexpr int kMap32ExpandedFlagPos
Definition overworld.h:172
constexpr int kMap32DefinitionsPerPackedGroup
Definition overworld.h:251
OverworldVersion
ROM version detection for overworld features.
@ kVanilla
0xFF in ROM, no ZScream ASM applied
bool IsSameOverworldWorld(int a, int b)
Definition overworld.h:379
constexpr int kExpandedPtrTableHigh
Definition overworld.h:189
constexpr int overworldCustomMosaicASM
Definition overworld.h:163
constexpr int kOverworldMusicMasterSword
Definition overworld.h:130
constexpr int kOverworldMusicZelda
Definition overworld.h:129
constexpr int kOverworldMessageIds
Definition overworld.h:126
constexpr int NumberOfMap16
Definition overworld.h:246
constexpr int kOverworldMapSize
Definition overworld.h:137
constexpr int kOverworldScreenTileMapChangeByScreen2
Definition overworld.h:155
constexpr int overworldSpritesDataStartExpanded
Definition overworld.h:178
constexpr int kDarkWorldMapIdStart
OverworldRomProfile DetectOverworldRomProfile(const Rom &rom)
Definition overworld.h:325
int GetOverworldEntranceFlagExpanded()
bool CanPersistLegacyScreenSize(int map_index)
Definition overworld.h:387
constexpr int kEssentialMapsPerWorld
Definition overworld.h:103
constexpr int kOverworldCompressedMapPos
Definition overworld.h:238
constexpr int overworldCustomMosaicArray
Definition overworld.h:164
int WorldForOverworldMap(int map_index)
Definition overworld.h:369
constexpr int kOverworldSpritesBeginning
Definition overworld.h:121
constexpr int kExpandedMapCount
Definition common.h:86
constexpr int kOverworldScreenTileMapChangeByScreen3
Definition overworld.h:156
bool CanPersistLegacyMultiAreaMap(int map_index)
Definition overworld.h:383
uint8_t LegacyParentTableValueForMap(int parent_index)
Definition overworld.h:395
int Map32DefinitionCapacityForProfile(const OverworldRomProfile &profile)
Definition overworld.h:302
uint8_t GetExpandedPtrTableMagic()
Definition overworld.h:223
constexpr int kMap16TilesExpanded
Definition overworld.h:167
constexpr uint8_t kExpandedPtrTableMagic
Definition overworld.h:188
int Map32StorageBytesForProfile(const OverworldRomProfile &profile)
Definition overworld.h:297
constexpr int kMap32DefinitionCapacityExpanded
Definition overworld.h:264
constexpr int kOverworldSpritesAgahnim
Definition overworld.h:122
int LegacyScreenSizeTableIndexForMap(int map_index)
Definition overworld.h:399
constexpr int kTransitionTargetNorth
Definition overworld.h:161
constexpr int overworldSpritesZeldaExpanded
Definition overworld.h:176
constexpr int kOverworldCompressedOverflowPos
Definition overworld.h:239
constexpr int GravesYTilePos
Definition overworld.h:105
constexpr int NumberOfOWSprites
Definition overworld.h:269
constexpr int kMap32TileTRExpanded
Definition overworld.h:168
int GetMap16TilesExpanded()
Definition overworld.h:197
constexpr int kOverworldMapPaletteIds
Definition overworld.h:115
constexpr int kOverworldEntranceAllowedTilesLeft
Definition overworld.h:133
constexpr int kOverworldSpecialGfxGroup
Definition overworld.h:119
constexpr int kOverworldEntranceAllowedTilesRight
Definition overworld.h:134
constexpr int GraveLinkSpecialStairs
Definition overworld.h:113
zelda3_version version
Definition game_data.h:84
Overworld map tile32 data.
rom::LyraLayoutInspection lyra_layout
Definition overworld.h:283
zscream::LayoutDialect zscream_layout
Definition overworld.h:282
Subscreen overlay layer for one screen, in that screen's palette.
Definition overworld.h:508
ROM data pointers for different game versions.
Definition zelda.h:71