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"
29
30// =============================================================================
31// Overworld Data Layer
32// =============================================================================
33//
34// ARCHITECTURE OVERVIEW:
35// ----------------------
36// The Overworld class is the central data manager for A Link to the Past's
37// overworld system. It handles 160 map screens across three worlds:
38// - Light World: Maps 0x00-0x3F (64 maps)
39// - Dark World: Maps 0x40-0x7F (64 maps)
40// - Special World: Maps 0x80-0x9F (32 maps, expandable to 0xBF with patches)
41//
42// DATA ORGANIZATION:
43// ------------------
44// The overworld uses a hierarchical tile system:
45// - Tile32: 32x32 pixel blocks composed of four Tile16s
46// - Tile16: 16x16 pixel blocks composed of four Tile8s
47// - Tile8: 8x8 pixel base tiles from graphics sheets
48//
49// Map tile data is stored as arrays of Tile16 IDs in OverworldBlockset:
50// - map_tiles_.light_world: 64 maps of 32x32 tile16 IDs each
51// - map_tiles_.dark_world: 64 maps of 32x32 tile16 IDs each
52// - map_tiles_.special_world: 32+ maps of 32x32 tile16 IDs each
53//
54// SAVE SYSTEM DOCUMENTATION:
55// --------------------------
56// The save workflow is controlled by feature flags in OverworldEditor::Save().
57// Each component saves independently but some have ordering dependencies.
58//
59// SAVE ORDER AND DEPENDENCIES:
60//
61// 1. TILE DEFINITIONS (must be saved first, others depend on these IDs):
62// - CreateTile32Tilemap(): Build tile32 from current tile16 data
63// - SaveMap32Tiles(): Write tile32 definitions to ROM
64// - SaveMap16Tiles(): Write tile16 definitions to ROM
65// - SaveOverworldMaps(): Write compressed map tile data
66//
67// 2. ENTITIES (independent, can save in any order):
68// - SaveEntrances(): Entrance warps to underworld
69// - SaveExits(): Exit points returning from underworld
70// - SaveItems(): Hidden items on overworld
71//
72// 3. PROPERTIES (independent, can save in any order):
73// - SaveMapProperties(): Graphics, palettes, messages per area
74// - SaveMusic(): Music IDs per area and game state
75// - SaveAreaSizes(): Area size enum for v3+ ROMs
76//
77// 4. CUSTOM FEATURES (v2+/v3+ only):
78// - SaveCustomOverworldASM(): Custom feature enable flags
79// - SaveAreaSpecificBGColors(): Per-area background colors (v2+)
80// - SaveMapOverlays(): Interactive overlay data
81//
82// TESTING SAVE FUNCTIONALITY:
83// ---------------------------
84// To test individual save components:
85// 1. Enable only one feature flag at a time in core::FeatureFlags
86// 2. Make changes to that component in the editor
87// 3. Save ROM and verify changes in an emulator
88// 4. Check for corruption by loading saved ROM back into editor
89//
90// Round-trip testing:
91// 1. Load vanilla ROM
92// 2. Make changes to all components
93// 3. Save ROM
94// 4. Close and reopen ROM
95// 5. Verify all changes persisted correctly
96//
97// See app/editor/overworld/README.md for complete workflow documentation.
98// =============================================================================
99
100namespace yaze::zelda3 {
101
102inline constexpr int kEssentialMapsPerWorld = 1;
103
104constexpr int GravesYTilePos = 0x49968; // short (0x0F entries)
105constexpr int GravesXTilePos = 0x49986; // short (0x0F entries)
106constexpr int GravesTilemapPos = 0x499A4; // short (0x0F entries)
107constexpr int GravesGFX = 0x499C2; // short (0x0F entries)
108constexpr int GravesXPos = 0x4994A; // short (0x0F entries)
109constexpr int GravesYLine = 0x4993A; // short (0x08 entries)
110constexpr int GravesCountOnY = 0x499E0; // Byte 0x09 entries
111constexpr int GraveLinkSpecialHole = 0x46DD9; // short
112constexpr int GraveLinkSpecialStairs = 0x46DE0; // short
113
114constexpr int kOverworldMapPaletteIds = 0x7D1C;
115constexpr int kOverworldSpritePaletteIds = 0x7B41;
116constexpr int kOverworldSpritePaletteGroup = 0x75580;
117constexpr int kOverworldSpriteset = 0x7A41;
118constexpr int kOverworldSpecialGfxGroup = 0x16821;
119constexpr int kOverworldSpecialPalGroup = 0x16831;
120constexpr int kOverworldSpritesBeginning = 0x4C881;
121constexpr int kOverworldSpritesAgahnim = 0x4CA21;
122constexpr int kOverworldSpritesZelda = 0x4C901;
123
124constexpr int kAreaGfxIdPtr = 0x7C9C;
125constexpr int kOverworldMessageIds = 0x3F51D;
126
127constexpr int kOverworldMusicBeginning = 0x14303;
128constexpr int kOverworldMusicZelda = 0x14303 + 0x40;
129constexpr int kOverworldMusicMasterSword = 0x14303 + 0x80;
130constexpr int kOverworldMusicAgahnim = 0x14303 + 0xC0;
131constexpr int kOverworldMusicDarkWorld = 0x14403;
134
135// 0x00 = small maps, 0x20 = large maps
136constexpr int kOverworldMapSize = 0x12844;
137
138// 0x01 = small maps, 0x03 = large maps
139constexpr int kOverworldMapSizeHighByte = 0x12884;
140
141// relative to the WORLD + 0x200 per map
142// large map that are not == parent id = same position as their parent!
143// eg for X position small maps :
144// 0000, 0200, 0400, 0600, 0800, 0A00, 0C00, 0E00
145// all Large map would be :
146// 0000, 0000, 0400, 0400, 0800, 0800, 0C00, 0C00
147constexpr int kOverworldMapParentId = 0x125EC;
148constexpr int kOverworldTransitionPositionY = 0x128C4;
149constexpr int kOverworldTransitionPositionX = 0x12944;
150constexpr int kOverworldScreenSize = 0x1788D;
151constexpr int kOverworldScreenSizeForLoading = 0x4C635;
152
157
158constexpr int kOverworldMapDataOverflow = 0x130000;
159
160constexpr int kTransitionTargetNorth = 0x13EE2;
161constexpr int kTransitionTargetWest = 0x13F62;
162constexpr int overworldCustomMosaicASM = 0x1301D0;
163constexpr int overworldCustomMosaicArray = 0x1301F0;
164
165// Expanded tile16 and tile32
166constexpr int kMap16TilesExpanded = 0x1E8000;
167constexpr int kMap32TileTRExpanded = 0x020000;
168constexpr int kMap32TileBLExpanded = 0x1F0000;
169constexpr int kMap32TileBRExpanded = 0x1F8000;
170constexpr int kMap32TileCountExpanded = 0x0067E0;
171constexpr int kMap32ExpandedFlagPos = 0x01772E; // 0x04
172constexpr int kMap16ExpandedFlagPos = 0x02FD28; // 0x0F
173
174constexpr int overworldSpritesBeginingExpanded = 0x141438;
175constexpr int overworldSpritesZeldaExpanded = 0x141578;
176constexpr int overworldSpritesAgahnimExpanded = 0x1416B8;
177constexpr int overworldSpritesDataStartExpanded = 0x04C881;
178
181
182constexpr int ExpandedOverlaySpace = 0x120000;
183
184// Expanded pointer table markers for tail map support (maps 0xA0-0xBF)
185// Set by TailMapExpansion.asm patch after ZSCustomOverworld v3
186constexpr int kExpandedPtrTableMarker = 0x1423FF; // Location of marker byte
187constexpr uint8_t kExpandedPtrTableMagic = 0xEA; // Marker value when applied
188constexpr int kExpandedPtrTableHigh = 0x142400; // New high table location
189constexpr int kExpandedPtrTableLow = 0x142640; // New low table location
190constexpr int kExpandedMapCount = 192; // 0x00-0xBF
191
192constexpr int overworldTilesType = 0x071459;
193constexpr int overworldMessages = 0x03F51D;
194constexpr int overworldMessagesExpanded = 0x1417F8;
195
200
205
210
215
221
226
231
236
237constexpr int kOverworldCompressedMapPos = 0x058000;
238constexpr int kOverworldCompressedOverflowPos = 0x137FFF;
239
240constexpr int kNumTileTypes = 0x200;
241constexpr int kMap16Tiles = 0x78000;
242
243constexpr int kNumTile16Individual = 4096;
244constexpr int Map32PerScreen = 256;
245constexpr int NumberOfMap16 = 3752; // 4096
246constexpr int NumberOfMap16Ex = 4096; // 4096
247// Tile32 definitions are packed four-at-a-time into six bytes in each of the
248// four quadrant tables. Keep byte spans and definition capacities distinct:
249// the expanded table length is a byte count, not a Tile32 count.
252constexpr int kMap32TileStorageBytesVanilla = 0x33F0;
254
255constexpr int Map32DefinitionCapacityForStorageBytes(int storage_bytes) {
256 return storage_bytes <= 0 ? 0
257 : (storage_bytes / kMap32BytesPerPackedGroup) *
259}
260
265
266// Compatibility alias for callers that still use the historical name.
268constexpr int NumberOfOWSprites = 352;
270constexpr int kNumMapsPerWorld = 0x40;
271
288
293
299
300inline bool IsValidRomAddress(const Rom& rom, int address) {
301 return address >= 0 && static_cast<size_t>(address) < rom.size();
302}
303
304inline uint8_t ReadRomByteOr(const Rom& rom, int address, uint8_t fallback) {
305 if (!IsValidRomAddress(rom, address)) {
306 return fallback;
307 }
308 return rom.data()[address];
309}
310
311inline bool IsSpecialTailMapExpansionEnabled(const Rom& rom) {
312 return ReadRomByteOr(rom, GetExpandedPtrTableMarker(), 0x00) ==
314}
315
317 OverworldRomProfile profile;
318 profile.lyra_layout = rom.InspectLyraLayout();
321 profile.is_vanilla = profile.version == OverworldVersion::kVanilla;
324 profile.supports_area_enum =
328
329 const uint8_t tile16_flag = ReadRomByteOr(rom, kMap16ExpandedFlagPos, 0x0F);
330 const uint8_t tile32_flag = ReadRomByteOr(rom, kMap32ExpandedFlagPos, 0x04);
331 const uint8_t entrance_flag =
333
334 profile.has_expanded_tile16 =
335 !profile.is_vanilla &&
336 (profile.supports_area_enum || tile16_flag != 0x0F);
337 profile.has_expanded_tile32 =
338 !profile.is_vanilla &&
339 (profile.supports_area_enum || tile32_flag != 0x04);
340 profile.has_expanded_entrances = !profile.is_vanilla && entrance_flag != 0xB8;
341 profile.has_tail_map_expansion =
345 // The 192-record descriptor is not the older editable $EA tail format.
346 profile.has_tail_map_expansion = false;
347 } else if (profile.has_tail_map_expansion) {
349 }
350 profile.editable_map_count =
352 return profile;
353}
354
355inline int WorldForOverworldMap(int map_index) {
356 if (map_index >= kSpecialWorldMapIdStart) {
357 return 2;
358 }
359 if (map_index >= kDarkWorldMapIdStart) {
360 return 1;
361 }
362 return 0;
363}
364
365inline bool IsSameOverworldWorld(int a, int b) {
367}
368
369inline bool CanPersistLegacyMultiAreaMap(int map_index) {
370 return map_index >= 0 && map_index < kSpecialWorldMapIdStart;
371}
372
373inline bool CanPersistLegacyScreenSize(int map_index) {
374 return map_index >= 0 && map_index < kSpecialWorldMapIdStart;
375}
376
377inline int LegacyParentTableIndexForMap(int map_index) {
378 return map_index & 0x3F;
379}
380
381inline uint8_t LegacyParentTableValueForMap(int parent_index) {
382 return static_cast<uint8_t>(parent_index & 0x3F);
383}
384
385inline int LegacyScreenSizeTableIndexForMap(int map_index) {
386 return map_index;
387}
388
405absl::StatusOr<std::vector<gfx::Tile16>> ReadMap16Tiles(
406 const Rom& rom, bool* expanded = nullptr);
407
409 public:
410 Overworld(Rom* rom, GameData* game_data = nullptr)
411 : rom_(rom), game_data_(game_data) {}
412
413 void SetGameData(GameData* game_data) { game_data_ = game_data; }
414
417 return kVersionConstantsMap.at(game_data_ ? game_data_->version
418 : zelda3_version::US);
419 }
420
421 // ===========================================================================
422 // Loading Methods
423 // ===========================================================================
424
426 absl::Status Load(Rom* rom);
427 // Explicit descriptor terrain path. The normal model loader remains
428 // legacy-only; the editor admits this path only to its read-only canvas.
429 absl::Status LoadLyraTerrainPreview(Rom* rom);
436 bool descriptor_sprite_display_available() const { return false; }
437
439 absl::Status LoadOverworldMaps();
440
442 void LoadTileTypes();
443
445 absl::Status LoadSprites();
446 absl::StatusOr<OverworldSpriteSavePlan> PrepareSpriteSave() const;
447 absl::Status SaveSprites();
448
450 absl::Status LoadSpritesFromMap(int sprite_start, int sprite_count,
451 int sprite_index);
452
453 // ===========================================================================
454 // Lazy Loading / Caching
455 // ===========================================================================
456
463 absl::Status EnsureMapBuilt(int map_index);
464
473 void SyncAreaProperties(int map_index);
475
478 uint16_t overlay_id = 0x00FF;
479 int overlay_screen = -1; // -1: the area has no subscreen overlay
480 bool background = false; // drawn over backdrop pixels only
481 std::vector<uint8_t> pixels; // 512x512, 0 = transparent
482 };
483
488 absl::StatusOr<SubscreenOverlayLayer> BuildSubscreenOverlayLayer(
489 int map_index);
490
491 // ---------------------------------------------------------------------------
492 // Shared tileset cache
493 //
494 // Maps whose 17 sheet ids match (OverworldMap::tileset_key(): 16 static
495 // sheets + animated sheet) share the same 64KB tileset and, for the same
496 // tile16 definitions, the same 1MB tile16 blockset. The cache keeps both so
497 // a map build only redoes the palette and its own 512x512 bitmap.
498 // ---------------------------------------------------------------------------
499
503
506 void InvalidateTilesetCacheForSheet(int sheet);
507
509 size_t tileset_cache_size() const { return tileset_cache_.size(); }
510
513 void InvalidateMapCache(int map_index);
514
517 void InvalidateSiblingMapCaches(int map_index);
518
519 // ===========================================================================
520 // Save Methods - Tile Data (Order Matters!)
521 // ===========================================================================
522 // These methods must be called in order because later saves depend on
523 // tile definitions being written first.
524 //
525 // Required order:
526 // 1. CreateTile32Tilemap() - Build tile32 from tile16 data
527 // 2. SaveMap32Tiles() - Write tile32 definitions
528 // 3. SaveMap16Tiles() - Write tile16 definitions
529 // 4. SaveOverworldMaps() - Write compressed map data
530
532 absl::Status Save(Rom* rom);
533
535 absl::Status SaveOverworldMaps();
536
537 // Map-grid identity for skipping recompression. SaveOverworldMaps stages the
538 // grids it serialized; the editor save transaction publishes that stage only
539 // after the ROM transaction and disk write both commit.
540 void StageSavedMapTiles();
541 void CommitSavedMapTiles();
543
545 absl::Status SaveLargeMaps();
546
548 absl::Status SaveLargeMapsExpanded();
549
551 absl::Status SaveSmallAreaTransitions(
552 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
553 int transition_target_west, int transition_pos_x, int transition_pos_y,
554 int screen_change_1, int screen_change_2, int screen_change_3,
555 int screen_change_4);
556
558 absl::Status SaveLargeAreaTransitions(
559 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
560 int transition_target_west, int transition_pos_x, int transition_pos_y,
561 int screen_change_1, int screen_change_2, int screen_change_3,
562 int screen_change_4);
563
565 absl::Status SaveWideAreaTransitions(
566 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
567 int transition_target_west, int transition_pos_x, int transition_pos_y,
568 int screen_change_1, int screen_change_2, int screen_change_3,
569 int screen_change_4);
570
572 absl::Status SaveTallAreaTransitions(
573 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
574 int transition_target_west, int transition_pos_x, int transition_pos_y,
575 int screen_change_1, int screen_change_2, int screen_change_3,
576 int screen_change_4);
577
578 // ===========================================================================
579 // Save Methods - Entities (Independent, any order)
580 // ===========================================================================
581
583 absl::Status SaveEntrances();
584
586 absl::Status SaveExits();
587
589 absl::Status SaveItems();
590
592 absl::Status SaveMapOverlays();
593
595 absl::Status SaveOverworldTilesType();
596
597 // ===========================================================================
598 // Save Methods - Custom Features (v2+/v3+)
599 // ===========================================================================
600
602 absl::Status SaveCustomOverworldASM(bool enable_bg_color,
603 bool enable_main_palette,
604 bool enable_mosaic,
605 bool enable_gfx_groups,
606 bool enable_subscreen_overlay,
607 bool enable_animated);
608
610 absl::Status SaveAreaSpecificBGColors();
611
613 absl::Status SaveCustomOverworldData();
614
615 // ===========================================================================
616 // Save Methods - Tile Definitions
617 // ===========================================================================
618
621 absl::Status CreateTile32Tilemap();
622
624 absl::Status SaveMap16Expanded();
625
627 absl::Status SaveMap16Tiles();
628
630 absl::Status SaveMap32Expanded();
631
633 absl::Status SaveMap32Tiles();
634
635 // ===========================================================================
636 // Save Methods - Properties
637 // ===========================================================================
638
640 absl::Status SaveMapProperties();
641
643 absl::Status SaveMusic();
644
646 absl::Status SaveAreaSizes();
647
649 void AssignMapSizes(std::vector<OverworldMap>& maps);
650
659 absl::Status ConfigureMultiAreaMap(int parent_index, AreaSizeEnum size);
660
661 auto rom() const { return rom_; }
662 auto mutable_rom() { return rom_; }
663
672 std::vector<std::pair<uint32_t, uint32_t>> GetProjectedWriteRanges() const;
673
682 const int marker_addr = GetExpandedPtrTableMarker();
683 if (!rom_ || marker_addr >= rom_->size()) {
684 return false;
685 }
686 return rom_->data()[marker_addr] == GetExpandedPtrTableMagic();
687 }
688
689 void Destroy() {
690 for (auto& map : overworld_maps_) {
691 map.Destroy();
692 }
693 overworld_maps_.clear();
694 all_entrances_.clear();
695 all_exits_.clear();
696 all_items_.clear();
697 for (auto& sprites : all_sprites_) {
698 sprites.clear();
699 }
701 built_map_lru_.clear();
702 tileset_cache_.clear();
705 tiles16_.clear();
706 tiles32_.clear();
707 tiles32_unique_.clear();
708 is_loaded_ = false;
709 }
710
711 int GetTileFromPosition(ImVec2 position) const {
712 if (current_world_ == 0) {
713 return map_tiles_.light_world[position.x][position.y];
714 } else if (current_world_ == 1) {
715 return map_tiles_.dark_world[position.x][position.y];
716 } else {
717 return map_tiles_.special_world[position.x][position.y];
718 }
719 }
720
722 switch (world_type) {
723 case 0:
724 return map_tiles_.light_world;
725 case 1:
726 return map_tiles_.dark_world;
727 case 2:
729 default:
730 return map_tiles_.light_world;
731 }
732 }
733
734 const std::vector<OverworldMap>& overworld_maps() const {
735 return overworld_maps_;
736 }
737 auto overworld_map(int i) const {
738 if (i < 0 || i >= static_cast<int>(overworld_maps_.size())) {
739 return static_cast<const OverworldMap*>(nullptr);
740 }
741 return &overworld_maps_[i];
742 }
744 if (i < 0 || i >= static_cast<int>(overworld_maps_.size())) {
745 return static_cast<OverworldMap*>(nullptr);
746 }
747 return &overworld_maps_[i];
748 }
749 auto exits() const { return &all_exits_; }
750 auto mutable_exits() { return &all_exits_; }
751 const std::vector<gfx::Tile16>& tiles16() const { return tiles16_; }
752 auto tiles32_unique() const { return tiles32_unique_; }
753 auto mutable_tiles16() { return &tiles16_; }
754 auto sprites(int state) const {
755 if (state < 0 || state >= 3)
756 return std::vector<Sprite>{};
757 return all_sprites_[state];
758 }
759 auto mutable_sprites(int state) {
760 if (state < 0 || state >= 3)
761 return static_cast<std::vector<Sprite>*>(nullptr);
762 return &all_sprites_[state];
763 }
764 const std::vector<uint8_t>& current_graphics() const {
765 static const std::vector<uint8_t> kEmpty;
767 return kEmpty;
768 return overworld_maps_[current_map_].current_graphics();
769 }
770 const std::vector<OverworldEntrance>& entrances() const {
771 return all_entrances_;
772 }
773 auto& entrances() { return all_entrances_; }
775 const std::vector<OverworldEntrance>& holes() const { return all_holes_; }
776 auto& holes() { return all_holes_; }
777 auto mutable_holes() { return &all_holes_; }
778 auto deleted_entrances() const { return deleted_entrances_; }
781 static const gfx::SnesPalette kEmpty;
783 return kEmpty;
784 return overworld_maps_[current_map_].current_palette();
785 }
786 const std::vector<uint8_t>& current_map_bitmap_data() const {
787 static const std::vector<uint8_t> kEmpty;
789 return kEmpty;
790 return overworld_maps_[current_map_].bitmap_data();
791 }
792 const std::vector<uint8_t>& tile16_blockset_data() const {
793 static const std::vector<uint8_t> kEmpty;
795 return kEmpty;
796 return overworld_maps_[current_map_].current_tile16_blockset();
797 }
798
799 bool is_current_map_valid() const {
800 return current_map_ >= 0 &&
801 current_map_ < static_cast<int>(overworld_maps_.size());
802 }
803 auto is_loaded() const { return is_loaded_; }
804 auto expanded_tile16() const { return expanded_tile16_; }
805 auto expanded_tile32() const { return expanded_tile32_; }
807 int current_map_id() const { return current_map_; }
808 int current_world() const { return current_world_; }
809 void set_current_map(int i) { current_map_ = i; }
810 void set_current_world(int world) { current_world_ = world; }
811 // Select the state for future builds; editor refresh owns bitmap invalidation.
812 void set_game_state(int state);
813 uint16_t GetTile(int x, int y) const {
814 if (current_world_ == 0) {
815 return map_tiles_.light_world[x][y];
816 } else if (current_world_ == 1) {
817 return map_tiles_.dark_world[x][y];
818 } else {
819 return map_tiles_.special_world[x][y];
820 }
821 }
822 void SetTile(int x, int y, uint16_t tile_id) {
823 if (current_world_ == 0) {
824 map_tiles_.light_world[x][y] = tile_id;
825 } else if (current_world_ == 1) {
826 map_tiles_.dark_world[x][y] = tile_id;
827 } else {
828 map_tiles_.special_world[x][y] = tile_id;
829 }
830 }
831 auto map_tiles() const { return map_tiles_; }
832 auto mutable_map_tiles() { return &map_tiles_; }
833 auto all_items() const { return all_items_; }
834 auto mutable_all_items() { return &all_items_; }
835 auto all_tiles_types() const { return all_tiles_types_; }
837 auto all_sprites() const { return all_sprites_; }
838
839 // Diggable tiles management
842 absl::Status LoadDiggableTiles();
843 absl::Status SaveDiggableTiles();
844 absl::Status AutoDetectDiggableTiles();
845
846 private:
853
854 void FetchLargeMaps();
855 absl::StatusOr<uint16_t> GetTile16ForTile32(int index, int quadrant,
856 int dimension,
857 const uint32_t* map32address);
858 absl::Status AssembleMap32Tiles();
859 absl::Status AssembleMap16Tiles();
860 void AssignWorldTiles(int x, int y, int sx, int sy, int tpos,
861 OverworldBlockset& world);
862 void FillBlankMapTiles(int map_index);
863 OverworldBlockset& SelectWorldBlockset(int world_type);
864 void OrganizeMapTiles(std::vector<uint8_t>& bytes,
865 std::vector<uint8_t>& bytes2, int i, int sx, int sy,
866 int& ttpos);
867 absl::Status DecompressAllMapTilesParallel();
868 absl::Status BuildLyraTerrainPreview(Rom* rom,
870
873
874 bool is_loaded_ = false;
875 bool expanded_tile16_ = false;
876 bool expanded_tile32_ = false;
878
879 int game_state_ = 0;
882
883 // Cached ROM version to avoid repeated detection during loading
885
888 // Grids last published by a committed save, or captured at load. Recompressing
889 // maps rewrites pointer tables that overlap Oracle overworld ASM hooks, and
890 // resaving tile32 reorders expanded definitions. An unchanged grid leaves
891 // both on disk. The staged copy is not this identity: a failed save rolls
892 // the ROM back and must not treat the unsaved edit as already written.
897 bool MapTilesUnchanged() const;
898
899 // Thread safety for parallel operations
900 mutable std::mutex map_tiles_mutex_;
901
902 // LRU cache for built maps to prevent memory exhaustion.
903 // Keep this aligned with the essential preload set so the default startup
904 // world stays warm without permanently retaining dozens of maps.
905 static constexpr int kMaxBuiltMaps = 8;
906 std::deque<int> built_map_lru_;
907
908 // Shared tileset cache (see ClearGraphicsConfigCache()).
909 // GraphicsSheetStore revision of each sheet in an OverworldTilesetKey.
911 std::array<uint64_t, std::tuple_size_v<OverworldTilesetKey>>;
913
915 TilesetRevisions sheet_revisions{}; // store revisions when built
916 std::vector<uint8_t> current_gfx; // 64KB tileset
917 std::vector<uint8_t> tile16_blockset; // 1MB tile16 pixels (may be empty)
918 uint64_t tiles16_fingerprint = 0; // tile16 defs the blockset used
919 uint64_t last_use = 0;
920 };
921 std::map<OverworldTilesetKey, TilesetCacheEntry> tileset_cache_;
923#ifdef __EMSCRIPTEN__
924 static constexpr size_t kMaxCachedTilesets = 8; // ~8.5MB
925#else
926 static constexpr size_t kMaxCachedTilesets = 24; // ~26MB
927#endif
928
929 uint64_t Tiles16Fingerprint() const;
930 absl::Status BuildMapWithTilesetCache(int map_index, int world_type);
931
932 std::vector<OverworldMap> overworld_maps_;
934 std::vector<OverworldEntrance> all_entrances_;
935 std::vector<OverworldEntrance> all_holes_;
936 std::vector<OverworldExit> all_exits_;
937 std::vector<OverworldItem> all_items_;
938
939 std::vector<gfx::Tile16> tiles16_;
940 std::vector<gfx::Tile32> tiles32_;
941 std::vector<gfx::Tile32> tiles32_unique_;
942
943 std::vector<uint16_t> tiles32_list_;
944 std::vector<uint64_t> deleted_entrances_;
945
946 std::array<uint8_t, kNumOverworldMaps> map_parent_ = {0};
947 std::array<uint8_t, kNumTileTypes> all_tiles_types_ = {0};
948 std::array<std::vector<Sprite>, 3> all_sprites_;
949 std::array<std::array<bool, 160>, 3> sprite_maps_loaded_{};
951 std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p1;
952 std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p2;
953 std::array<int, kNumOverworldMaps> map_pointers1_id;
954 std::array<int, kNumOverworldMaps> map_pointers2_id;
955 std::array<int, kNumOverworldMaps> map_pointers1;
956 std::array<int, kNumOverworldMaps> map_pointers2;
957};
958
959} // namespace yaze::zelda3
960
961#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:49
rom::LyraLayoutInspection InspectLyraLayout() const
Definition rom.cc:418
auto data() const
Definition rom.h:201
auto size() const
Definition rom.h:200
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:944
absl::Status SaveMap32Expanded()
Save expanded tile32 definitions (v1+ ROMs)
absl::Status BuildMapWithTilesetCache(int map_index, int world_type)
absl::Status DecompressAllMapTilesParallel()
Definition overworld.cc:852
std::vector< uint16_t > tiles32_list_
Definition overworld.h:943
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:810
int GetTileFromPosition(ImVec2 position) const
Definition overworld.h:711
rom::LyraLayoutInspection descriptor_layout_
Definition overworld.h:887
absl::Status Load(Rom *rom)
Load all overworld data from ROM.
Definition overworld.cc:136
int current_world() const
Definition overworld.h:808
std::vector< OverworldItem > all_items_
Definition overworld.h:937
void OrganizeMapTiles(std::vector< uint8_t > &bytes, std::vector< uint8_t > &bytes2, int i, int sx, int sy, int &ttpos)
Definition overworld.cc:832
auto expanded_tile32() const
Definition overworld.h:805
zelda3_version_pointers version_constants() const
Get version-specific ROM addresses.
Definition overworld.h:416
std::array< int, kNumOverworldMaps > map_pointers1
Definition overworld.h:955
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:941
const std::vector< uint8_t > & current_graphics() const
Definition overworld.h:764
auto deleted_entrances() const
Definition overworld.h:778
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:502
const std::vector< OverworldEntrance > & holes() const
Definition overworld.h:775
absl::Status SaveMap32Tiles()
Save tile32 definitions to ROM.
std::map< OverworldTilesetKey, TilesetCacheEntry > tileset_cache_
Definition overworld.h:921
const gfx::SnesPalette & current_area_palette() const
Definition overworld.h:780
std::vector< OverworldEntrance > all_entrances_
Definition overworld.h:934
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:886
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:837
DiggableTiles * mutable_diggable_tiles()
Definition overworld.h:841
auto sprites(int state) const
Definition overworld.h:754
auto map_tiles() const
Definition overworld.h:831
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:833
const std::vector< gfx::Tile16 > & tiles16() const
Definition overworld.h:751
std::array< uint8_t, kNumOverworldMaps > map_parent_
Definition overworld.h:946
void AssignWorldTiles(int x, int y, int sx, int sy, int tpos, OverworldBlockset &world)
Definition overworld.cc:787
absl::Status SaveDiggableTiles()
void InvalidateMapCache(int map_index)
Invalidate cached tileset for a specific map.
void SetGameData(GameData *game_data)
Definition overworld.h:413
Overworld(Rom *rom, GameData *game_data=nullptr)
Definition overworld.h:410
bool is_lyra_preview() const
Definition overworld.h:430
auto is_loaded() const
Definition overworld.h:803
auto expanded_tile16() const
Definition overworld.h:804
std::array< uint8_t, kNumTileTypes > all_tiles_types_
Definition overworld.h:947
int inspected_map_count() const
Definition overworld.h:433
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:734
std::array< int, kNumOverworldMaps > map_pointers1_id
Definition overworld.h:953
auto overworld_map(int i) const
Definition overworld.h:737
int current_map_id() const
Definition overworld.h:807
size_t tileset_cache_size() const
Number of cached tileset entries (for tests and diagnostics).
Definition overworld.h:509
const std::vector< uint8_t > & tile16_blockset_data() const
Definition overworld.h:792
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:799
bool HasExpandedPointerTables() const
Check if the ROM has expanded pointer tables for tail maps.
Definition overworld.h:681
uint64_t tileset_cache_clock_
Definition overworld.h:922
auto all_tiles_types() const
Definition overworld.h:835
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:809
absl::StatusOr< OverworldSpriteSavePlan > PrepareSpriteSave() const
void FillBlankMapTiles(int map_index)
Definition overworld.cc:810
auto mutable_overworld_map(int i)
Definition overworld.h:743
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:932
OverworldMapTiles loaded_map_tiles_
Definition overworld.h:893
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:940
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:242
uint16_t GetTile(int x, int y) const
Definition overworld.h:813
absl::Status SaveOverworldMaps()
Save compressed map tile data to ROM.
std::array< std::vector< Sprite >, 3 > all_sprites_
Definition overworld.h:948
OverworldVersion cached_version_
Definition overworld.h:884
std::array< int, kNumOverworldMaps > map_pointers2_id
Definition overworld.h:954
auto tiles32_unique() const
Definition overworld.h:752
void SetTile(int x, int y, uint16_t tile_id)
Definition overworld.h:822
absl::Status LoadOverworldMaps()
Load overworld map tile data.
Definition overworld.cc:962
std::vector< gfx::Tile16 > tiles16_
Definition overworld.h:939
absl::Status AutoDetectDiggableTiles()
TilesetRevisions SheetRevisionsForKey(const OverworldTilesetKey &key) const
OverworldGraphicsPreview graphics_preview_
Definition overworld.h:933
auto expanded_entrances() const
Definition overworld.h:806
absl::Status AssembleMap16Tiles()
Definition overworld.cc:775
std::mutex map_tiles_mutex_
Definition overworld.h:900
const std::vector< uint8_t > & current_map_bitmap_data() const
Definition overworld.h:786
auto mutable_sprites(int state)
Definition overworld.h:759
absl::Status LoadSpritesFromMap(int sprite_start, int sprite_count, int sprite_index)
Load sprites from a specific map range.
const DiggableTiles & diggable_tiles() const
Definition overworld.h:840
void set_game_state(int state)
Definition overworld.cc:132
const std::vector< OverworldEntrance > & entrances() const
Definition overworld.h:770
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p1
Definition overworld.h:951
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:403
absl::Status SaveMap16Expanded()
Save expanded tile16 definitions (v1+ ROMs)
absl::Status BuildLyraTerrainPreview(Rom *rom, rom::LyraLayoutInspection layout)
Definition overworld.cc:258
std::vector< OverworldExit > all_exits_
Definition overworld.h:936
std::array< int, kNumOverworldMaps > map_pointers2
Definition overworld.h:956
absl::StatusOr< uint16_t > GetTile16ForTile32(int index, int quadrant, int dimension, const uint32_t *map32address)
Definition overworld.cc:663
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p2
Definition overworld.h:952
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:906
absl::Status SaveMapOverlays()
Save interactive overlay data to ROM.
absl::Status AssembleMap32Tiles()
Definition overworld.cc:674
bool is_current_map_valid() const
Definition overworld.h:799
static constexpr size_t kMaxCachedTilesets
Definition overworld.h:926
DiggableTiles diggable_tiles_
Definition overworld.h:950
static constexpr int kMaxBuiltMaps
Definition overworld.h:905
std::array< std::array< bool, 160 >, 3 > sprite_maps_loaded_
Definition overworld.h:949
OverworldBlockset & GetMapTiles(int world_type)
Definition overworld.h:721
OverworldMapTiles staged_map_tiles_
Definition overworld.h:895
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:491
std::vector< OverworldEntrance > all_holes_
Definition overworld.h:935
std::array< uint64_t, std::tuple_size_v< OverworldTilesetKey > > TilesetRevisions
Definition overworld.h:910
bool descriptor_sprite_display_available() const
Definition overworld.h:436
constexpr char kOverworldExpandedPtrHigh[]
constexpr char kOverworldMap16Expanded[]
constexpr char kOverworldExpandedPtrMagic[]
constexpr char kOverworldMap32BlExpanded[]
constexpr char kOverworldExpandedPtrMarker[]
constexpr char kOverworldMap32TrExpanded[]
constexpr char kOverworldExpandedPtrLow[]
constexpr char kOverworldMap32BrExpanded[]
Zelda 3 specific classes and functions.
constexpr int GravesGFX
Definition overworld.h:107
constexpr int overworldSpecialSpritePaletteExpandedTemp
Definition overworld.h:180
constexpr int kAreaGfxIdPtr
Definition overworld.h:124
constexpr int kOverworldSpritePaletteGroup
Definition overworld.h:116
constexpr int kOverworldTransitionPositionY
Definition overworld.h:148
constexpr int kNumMapsPerWorld
Definition overworld.h:270
constexpr int kOverworldSpriteset
Definition overworld.h:117
int GetMap32TileBRExpanded()
Definition overworld.h:211
bool IsValidRomAddress(const Rom &rom, int address)
Definition overworld.h:300
constexpr int kMap16ExpandedFlagPos
Definition overworld.h:172
constexpr int LimitOfMap32
Definition overworld.h:267
constexpr int NumberOfMap16Ex
Definition overworld.h:246
constexpr int kOverworldScreenTileMapChangeByScreen1
Definition overworld.h:153
constexpr int kOverworldMapDataOverflow
Definition overworld.h:158
int LegacyParentTableIndexForMap(int map_index)
Definition overworld.h:377
constexpr int kMap32BytesPerPackedGroup
Definition overworld.h:251
constexpr int kOverworldMapSizeHighByte
Definition overworld.h:139
constexpr int overworldMessagesExpanded
Definition overworld.h:194
constexpr int GravesTilemapPos
Definition overworld.h:106
constexpr int overworldSpritesBeginingExpanded
Definition overworld.h:174
constexpr int kNumTileTypes
Definition overworld.h:240
uint8_t ReadRomByteOr(const Rom &rom, int address, uint8_t fallback)
Definition overworld.h:304
constexpr int NumberOfMap32
Definition overworld.h:269
constexpr int kOverworldScreenSize
Definition overworld.h:150
constexpr int kExpandedPtrTableLow
Definition overworld.h:189
constexpr int kOverworldScreenTileMapChangeByScreen4
Definition overworld.h:156
constexpr int kNumTile16Individual
Definition overworld.h:243
int GetMap32TileTRExpanded()
Definition overworld.h:201
constexpr int kSpecialWorldMapIdStart
constexpr int ExpandedOverlaySpace
Definition overworld.h:182
constexpr int kMap32DefinitionCapacityVanilla
Definition overworld.h:261
constexpr int GravesCountOnY
Definition overworld.h:110
constexpr int kMap16Tiles
Definition overworld.h:241
constexpr int overworldSpritesAgahnimExpanded
Definition overworld.h:176
int GetMap32TileBLExpanded()
Definition overworld.h:206
constexpr int kExpandedPtrTableMarker
Definition overworld.h:186
constexpr int Map32DefinitionCapacityForStorageBytes(int storage_bytes)
Definition overworld.h:255
constexpr int GravesYLine
Definition overworld.h:109
constexpr int kNumOverworldMaps
Definition common.h:85
int GetExpandedPtrTableHigh()
Definition overworld.h:227
constexpr int GravesXTilePos
Definition overworld.h:105
bool IsSpecialTailMapExpansionEnabled(const Rom &rom)
Definition overworld.h:311
constexpr int kOverworldMusicBeginning
Definition overworld.h:127
std::vector< std::vector< uint16_t > > OverworldBlockset
Represents tile32 data for the overworld.
int GetExpandedPtrTableMarker()
Definition overworld.h:216
constexpr int kMap32TileBLExpanded
Definition overworld.h:168
AreaSizeEnum
Area size enumeration for v3+ ROMs.
constexpr int kOverworldTransitionPositionX
Definition overworld.h:149
constexpr int kOverworldMusicDarkWorld
Definition overworld.h:131
std::array< uint8_t, 17 > OverworldTilesetKey
constexpr int overworldSpecialSpriteGFXGroupExpandedTemp
Definition overworld.h:179
constexpr int kOverworldSpecialPalGroup
Definition overworld.h:119
constexpr int kOverworldScreenSizeForLoading
Definition overworld.h:151
constexpr int kOverworldSpritePaletteIds
Definition overworld.h:115
std::map< int, AreaGraphicsPreview > OverworldGraphicsPreview
constexpr int overworldTilesType
Definition overworld.h:192
constexpr int kMap32TileBRExpanded
Definition overworld.h:169
constexpr int kMap32TileCountExpanded
Definition overworld.h:170
int GetExpandedPtrTableLow()
Definition overworld.h:232
constexpr int kTransitionTargetWest
Definition overworld.h:161
constexpr int overworldMessages
Definition overworld.h:193
constexpr int kMap32TileStorageBytesVanilla
Definition overworld.h:252
constexpr int kOverworldMusicAgahnim
Definition overworld.h:130
constexpr int kMap32TileStorageBytesExpanded
Definition overworld.h:253
constexpr int kOverworldSpritesZelda
Definition overworld.h:122
constexpr int kOverworldMapParentId
Definition overworld.h:147
constexpr int GraveLinkSpecialHole
Definition overworld.h:111
constexpr int Map32PerScreen
Definition overworld.h:244
absl::StatusOr< std::vector< gfx::Tile16 > > ReadMap16Tiles(const Rom &rom, bool *expanded)
Represents the full Overworld data, light and dark world.
Definition overworld.cc:734
constexpr int GravesXPos
Definition overworld.h:108
constexpr int kMap32ExpandedFlagPos
Definition overworld.h:171
constexpr int kMap32DefinitionsPerPackedGroup
Definition overworld.h:250
OverworldVersion
ROM version detection for overworld features.
@ kVanilla
0xFF in ROM, no ZScream ASM applied
bool IsSameOverworldWorld(int a, int b)
Definition overworld.h:365
constexpr int kExpandedPtrTableHigh
Definition overworld.h:188
constexpr int overworldCustomMosaicASM
Definition overworld.h:162
constexpr int kOverworldMusicMasterSword
Definition overworld.h:129
constexpr int kOverworldMusicZelda
Definition overworld.h:128
constexpr int kOverworldMessageIds
Definition overworld.h:125
constexpr int NumberOfMap16
Definition overworld.h:245
constexpr int kOverworldMapSize
Definition overworld.h:136
constexpr int kOverworldScreenTileMapChangeByScreen2
Definition overworld.h:154
constexpr int overworldSpritesDataStartExpanded
Definition overworld.h:177
constexpr int kDarkWorldMapIdStart
OverworldRomProfile DetectOverworldRomProfile(const Rom &rom)
Definition overworld.h:316
int GetOverworldEntranceFlagExpanded()
bool CanPersistLegacyScreenSize(int map_index)
Definition overworld.h:373
constexpr int kEssentialMapsPerWorld
Definition overworld.h:102
constexpr int kOverworldCompressedMapPos
Definition overworld.h:237
constexpr int overworldCustomMosaicArray
Definition overworld.h:163
int WorldForOverworldMap(int map_index)
Definition overworld.h:355
constexpr int kOverworldSpritesBeginning
Definition overworld.h:120
constexpr int kExpandedMapCount
Definition overworld.h:190
constexpr int kOverworldScreenTileMapChangeByScreen3
Definition overworld.h:155
bool CanPersistLegacyMultiAreaMap(int map_index)
Definition overworld.h:369
uint8_t LegacyParentTableValueForMap(int parent_index)
Definition overworld.h:381
int Map32DefinitionCapacityForProfile(const OverworldRomProfile &profile)
Definition overworld.h:294
uint8_t GetExpandedPtrTableMagic()
Definition overworld.h:222
constexpr int kMap16TilesExpanded
Definition overworld.h:166
constexpr uint8_t kExpandedPtrTableMagic
Definition overworld.h:187
int Map32StorageBytesForProfile(const OverworldRomProfile &profile)
Definition overworld.h:289
constexpr int kMap32DefinitionCapacityExpanded
Definition overworld.h:263
constexpr int kOverworldSpritesAgahnim
Definition overworld.h:121
int LegacyScreenSizeTableIndexForMap(int map_index)
Definition overworld.h:385
constexpr int kTransitionTargetNorth
Definition overworld.h:160
constexpr int overworldSpritesZeldaExpanded
Definition overworld.h:175
constexpr int kOverworldCompressedOverflowPos
Definition overworld.h:238
constexpr int GravesYTilePos
Definition overworld.h:104
constexpr int NumberOfOWSprites
Definition overworld.h:268
constexpr int kMap32TileTRExpanded
Definition overworld.h:167
int GetMap16TilesExpanded()
Definition overworld.h:196
constexpr int kOverworldMapPaletteIds
Definition overworld.h:114
constexpr int kOverworldEntranceAllowedTilesLeft
Definition overworld.h:132
constexpr int kOverworldSpecialGfxGroup
Definition overworld.h:118
constexpr int kOverworldEntranceAllowedTilesRight
Definition overworld.h:133
constexpr int GraveLinkSpecialStairs
Definition overworld.h:112
zelda3_version version
Definition game_data.h:84
Overworld map tile32 data.
rom::LyraLayoutInspection lyra_layout
Definition overworld.h:275
Subscreen overlay layer for one screen, in that screen's palette.
Definition overworld.h:477
ROM data pointers for different game versions.
Definition zelda.h:71