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 <cstdint>
6#include <deque>
7#include <mutex>
8#include <unordered_map>
9#include <vector>
10
11#include "absl/status/status.h"
12#include "absl/status/statusor.h"
14#include "core/rom_settings.h"
15#include "imgui.h"
16#include "rom/rom.h"
17#include "zelda3/common.h"
18#include "zelda3/game_data.h"
25
26// =============================================================================
27// Overworld Data Layer
28// =============================================================================
29//
30// ARCHITECTURE OVERVIEW:
31// ----------------------
32// The Overworld class is the central data manager for A Link to the Past's
33// overworld system. It handles 160 map screens across three worlds:
34// - Light World: Maps 0x00-0x3F (64 maps)
35// - Dark World: Maps 0x40-0x7F (64 maps)
36// - Special World: Maps 0x80-0x9F (32 maps, expandable to 0xBF with patches)
37//
38// DATA ORGANIZATION:
39// ------------------
40// The overworld uses a hierarchical tile system:
41// - Tile32: 32x32 pixel blocks composed of four Tile16s
42// - Tile16: 16x16 pixel blocks composed of four Tile8s
43// - Tile8: 8x8 pixel base tiles from graphics sheets
44//
45// Map tile data is stored as arrays of Tile16 IDs in OverworldBlockset:
46// - map_tiles_.light_world: 64 maps of 32x32 tile16 IDs each
47// - map_tiles_.dark_world: 64 maps of 32x32 tile16 IDs each
48// - map_tiles_.special_world: 32+ maps of 32x32 tile16 IDs each
49//
50// SAVE SYSTEM DOCUMENTATION:
51// --------------------------
52// The save workflow is controlled by feature flags in OverworldEditor::Save().
53// Each component saves independently but some have ordering dependencies.
54//
55// SAVE ORDER AND DEPENDENCIES:
56//
57// 1. TILE DEFINITIONS (must be saved first, others depend on these IDs):
58// - CreateTile32Tilemap(): Build tile32 from current tile16 data
59// - SaveMap32Tiles(): Write tile32 definitions to ROM
60// - SaveMap16Tiles(): Write tile16 definitions to ROM
61// - SaveOverworldMaps(): Write compressed map tile data
62//
63// 2. ENTITIES (independent, can save in any order):
64// - SaveEntrances(): Entrance warps to underworld
65// - SaveExits(): Exit points returning from underworld
66// - SaveItems(): Hidden items on overworld
67//
68// 3. PROPERTIES (independent, can save in any order):
69// - SaveMapProperties(): Graphics, palettes, messages per area
70// - SaveMusic(): Music IDs per area and game state
71// - SaveAreaSizes(): Area size enum for v3+ ROMs
72//
73// 4. CUSTOM FEATURES (v2+/v3+ only):
74// - SaveCustomOverworldASM(): Custom feature enable flags
75// - SaveAreaSpecificBGColors(): Per-area background colors (v2+)
76// - SaveMapOverlays(): Interactive overlay data
77//
78// TESTING SAVE FUNCTIONALITY:
79// ---------------------------
80// To test individual save components:
81// 1. Enable only one feature flag at a time in core::FeatureFlags
82// 2. Make changes to that component in the editor
83// 3. Save ROM and verify changes in an emulator
84// 4. Check for corruption by loading saved ROM back into editor
85//
86// Round-trip testing:
87// 1. Load vanilla ROM
88// 2. Make changes to all components
89// 3. Save ROM
90// 4. Close and reopen ROM
91// 5. Verify all changes persisted correctly
92//
93// See app/editor/overworld/README.md for complete workflow documentation.
94// =============================================================================
95
96namespace yaze::zelda3 {
97
98constexpr int GravesYTilePos = 0x49968; // short (0x0F entries)
99constexpr int GravesXTilePos = 0x49986; // short (0x0F entries)
100constexpr int GravesTilemapPos = 0x499A4; // short (0x0F entries)
101constexpr int GravesGFX = 0x499C2; // short (0x0F entries)
102constexpr int GravesXPos = 0x4994A; // short (0x0F entries)
103constexpr int GravesYLine = 0x4993A; // short (0x08 entries)
104constexpr int GravesCountOnY = 0x499E0; // Byte 0x09 entries
105constexpr int GraveLinkSpecialHole = 0x46DD9; // short
106constexpr int GraveLinkSpecialStairs = 0x46DE0; // short
107
108constexpr int kOverworldMapPaletteIds = 0x7D1C;
109constexpr int kOverworldSpritePaletteIds = 0x7B41;
110constexpr int kOverworldSpritePaletteGroup = 0x75580;
111constexpr int kOverworldSpriteset = 0x7A41;
112constexpr int kOverworldSpecialGfxGroup = 0x16821;
113constexpr int kOverworldSpecialPalGroup = 0x16831;
114constexpr int kOverworldSpritesBeginning = 0x4C881;
115constexpr int kOverworldSpritesAgahnim = 0x4CA21;
116constexpr int kOverworldSpritesZelda = 0x4C901;
117
118constexpr int kAreaGfxIdPtr = 0x7C9C;
119constexpr int kOverworldMessageIds = 0x3F51D;
120
121constexpr int kOverworldMusicBeginning = 0x14303;
122constexpr int kOverworldMusicZelda = 0x14303 + 0x40;
123constexpr int kOverworldMusicMasterSword = 0x14303 + 0x80;
124constexpr int kOverworldMusicAgahnim = 0x14303 + 0xC0;
125constexpr int kOverworldMusicDarkWorld = 0x14403;
128
129// 0x00 = small maps, 0x20 = large maps
130constexpr int kOverworldMapSize = 0x12844;
131
132// 0x01 = small maps, 0x03 = large maps
133constexpr int kOverworldMapSizeHighByte = 0x12884;
134
135// relative to the WORLD + 0x200 per map
136// large map that are not == parent id = same position as their parent!
137// eg for X position small maps :
138// 0000, 0200, 0400, 0600, 0800, 0A00, 0C00, 0E00
139// all Large map would be :
140// 0000, 0000, 0400, 0400, 0800, 0800, 0C00, 0C00
141constexpr int kOverworldMapParentId = 0x125EC;
142constexpr int kOverworldTransitionPositionY = 0x128C4;
143constexpr int kOverworldTransitionPositionX = 0x12944;
144constexpr int kOverworldScreenSize = 0x1788D;
145constexpr int kOverworldScreenSizeForLoading = 0x4C635;
146
151
152constexpr int kOverworldMapDataOverflow = 0x130000;
153
154constexpr int kTransitionTargetNorth = 0x13EE2;
155constexpr int kTransitionTargetWest = 0x13F62;
156constexpr int overworldCustomMosaicASM = 0x1301D0;
157constexpr int overworldCustomMosaicArray = 0x1301F0;
158
159// Expanded tile16 and tile32
160constexpr int kMap16TilesExpanded = 0x1E8000;
161constexpr int kMap32TileTRExpanded = 0x020000;
162constexpr int kMap32TileBLExpanded = 0x1F0000;
163constexpr int kMap32TileBRExpanded = 0x1F8000;
164constexpr int kMap32TileCountExpanded = 0x0067E0;
165constexpr int kMap32ExpandedFlagPos = 0x01772E; // 0x04
166constexpr int kMap16ExpandedFlagPos = 0x02FD28; // 0x0F
167
168constexpr int overworldSpritesBeginingExpanded = 0x141438;
169constexpr int overworldSpritesZeldaExpanded = 0x141578;
170constexpr int overworldSpritesAgahnimExpanded = 0x1416B8;
171constexpr int overworldSpritesDataStartExpanded = 0x04C881;
172
175
176constexpr int ExpandedOverlaySpace = 0x120000;
177
178// Expanded pointer table markers for tail map support (maps 0xA0-0xBF)
179// Set by TailMapExpansion.asm patch after ZSCustomOverworld v3
180constexpr int kExpandedPtrTableMarker = 0x1423FF; // Location of marker byte
181constexpr uint8_t kExpandedPtrTableMagic = 0xEA; // Marker value when applied
182constexpr int kExpandedPtrTableHigh = 0x142400; // New high table location
183constexpr int kExpandedPtrTableLow = 0x142640; // New low table location
184constexpr int kExpandedMapCount = 192; // 0x00-0xBF
185
186constexpr int overworldTilesType = 0x071459;
187constexpr int overworldMessages = 0x03F51D;
188constexpr int overworldMessagesExpanded = 0x1417F8;
189
194
199
204
209
215
221
226
231
232
233constexpr int kOverworldCompressedMapPos = 0x058000;
234constexpr int kOverworldCompressedOverflowPos = 0x137FFF;
235
236constexpr int kNumTileTypes = 0x200;
237constexpr int kMap16Tiles = 0x78000;
238
239constexpr int kNumTile16Individual = 4096;
240constexpr int Map32PerScreen = 256;
241constexpr int NumberOfMap16 = 3752; // 4096
242constexpr int NumberOfMap16Ex = 4096; // 4096
243constexpr int LimitOfMap32 = 8864;
244constexpr int NumberOfOWSprites = 352;
246constexpr int kNumMapsPerWorld = 0x40;
247
262 public:
263 Overworld(Rom* rom, GameData* game_data = nullptr)
264 : rom_(rom), game_data_(game_data) {}
265
266 void SetGameData(GameData* game_data) { game_data_ = game_data; }
267
270 return kVersionConstantsMap.at(game_data_ ? game_data_->version : zelda3_version::US);
271 }
272
273 // ===========================================================================
274 // Loading Methods
275 // ===========================================================================
276
278 absl::Status Load(Rom* rom);
279
281 absl::Status LoadOverworldMaps();
282
284 void LoadTileTypes();
285
287 absl::Status LoadSprites();
288
290 absl::Status LoadSpritesFromMap(int sprite_start, int sprite_count,
291 int sprite_index);
292
293 // ===========================================================================
294 // Lazy Loading / Caching
295 // ===========================================================================
296
303 absl::Status EnsureMapBuilt(int map_index);
304
306 uint64_t ComputeGraphicsConfigHash(int map_index);
307
310 const std::vector<uint8_t>* GetCachedTileset(uint64_t config_hash);
311
313 void CacheTileset(uint64_t config_hash, const std::vector<uint8_t>& tileset);
314
318
321 void InvalidateMapCache(int map_index);
322
325 void InvalidateSiblingMapCaches(int map_index);
326
327 // ===========================================================================
328 // Save Methods - Tile Data (Order Matters!)
329 // ===========================================================================
330 // These methods must be called in order because later saves depend on
331 // tile definitions being written first.
332 //
333 // Required order:
334 // 1. CreateTile32Tilemap() - Build tile32 from tile16 data
335 // 2. SaveMap32Tiles() - Write tile32 definitions
336 // 3. SaveMap16Tiles() - Write tile16 definitions
337 // 4. SaveOverworldMaps() - Write compressed map data
338
340 absl::Status Save(Rom* rom);
341
343 absl::Status SaveOverworldMaps();
344
346 absl::Status SaveLargeMaps();
347
349 absl::Status SaveLargeMapsExpanded();
350
352 absl::Status SaveSmallAreaTransitions(
353 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
354 int transition_target_west, int transition_pos_x, int transition_pos_y,
355 int screen_change_1, int screen_change_2, int screen_change_3,
356 int screen_change_4);
357
359 absl::Status SaveLargeAreaTransitions(
360 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
361 int transition_target_west, int transition_pos_x, int transition_pos_y,
362 int screen_change_1, int screen_change_2, int screen_change_3,
363 int screen_change_4);
364
366 absl::Status SaveWideAreaTransitions(
367 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
368 int transition_target_west, int transition_pos_x, int transition_pos_y,
369 int screen_change_1, int screen_change_2, int screen_change_3,
370 int screen_change_4);
371
373 absl::Status SaveTallAreaTransitions(
374 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
375 int transition_target_west, int transition_pos_x, int transition_pos_y,
376 int screen_change_1, int screen_change_2, int screen_change_3,
377 int screen_change_4);
378
379 // ===========================================================================
380 // Save Methods - Entities (Independent, any order)
381 // ===========================================================================
382
384 absl::Status SaveEntrances();
385
387 absl::Status SaveExits();
388
390 absl::Status SaveItems();
391
393 absl::Status SaveMapOverlays();
394
396 absl::Status SaveOverworldTilesType();
397
398 // ===========================================================================
399 // Save Methods - Custom Features (v2+/v3+)
400 // ===========================================================================
401
403 absl::Status SaveCustomOverworldASM(bool enable_bg_color,
404 bool enable_main_palette,
405 bool enable_mosaic,
406 bool enable_gfx_groups,
407 bool enable_subscreen_overlay,
408 bool enable_animated);
409
411 absl::Status SaveAreaSpecificBGColors();
412
413 // ===========================================================================
414 // Save Methods - Tile Definitions
415 // ===========================================================================
416
419 absl::Status CreateTile32Tilemap();
420
422 absl::Status SaveMap16Expanded();
423
425 absl::Status SaveMap16Tiles();
426
428 absl::Status SaveMap32Expanded();
429
431 absl::Status SaveMap32Tiles();
432
433 // ===========================================================================
434 // Save Methods - Properties
435 // ===========================================================================
436
438 absl::Status SaveMapProperties();
439
441 absl::Status SaveMusic();
442
444 absl::Status SaveAreaSizes();
445
447 void AssignMapSizes(std::vector<OverworldMap>& maps);
448
457 absl::Status ConfigureMultiAreaMap(int parent_index, AreaSizeEnum size);
458
459 auto rom() const { return rom_; }
460 auto mutable_rom() { return rom_; }
461
470 std::vector<std::pair<uint32_t, uint32_t>> GetProjectedWriteRanges() const;
471
480 const int marker_addr = GetExpandedPtrTableMarker();
481 if (!rom_ || marker_addr >= rom_->size()) {
482 return false;
483 }
484 return rom_->data()[marker_addr] == GetExpandedPtrTableMagic();
485 }
486
487 void Destroy() {
488 for (auto& map : overworld_maps_) {
489 map.Destroy();
490 }
491 overworld_maps_.clear();
492 all_entrances_.clear();
493 all_exits_.clear();
494 all_items_.clear();
495 for (auto& sprites : all_sprites_) {
496 sprites.clear();
497 }
498 tiles16_.clear();
499 tiles32_.clear();
500 tiles32_unique_.clear();
501 is_loaded_ = false;
502 }
503
504 int GetTileFromPosition(ImVec2 position) const {
505 if (current_world_ == 0) {
506 return map_tiles_.light_world[position.x][position.y];
507 } else if (current_world_ == 1) {
508 return map_tiles_.dark_world[position.x][position.y];
509 } else {
510 return map_tiles_.special_world[position.x][position.y];
511 }
512 }
513
515 switch (world_type) {
516 case 0:
517 return map_tiles_.light_world;
518 case 1:
519 return map_tiles_.dark_world;
520 case 2:
522 default:
523 return map_tiles_.light_world;
524 }
525 }
526
527 auto overworld_maps() const { return overworld_maps_; }
528 auto overworld_map(int i) const {
529 if (i < 0 || i >= static_cast<int>(overworld_maps_.size())) {
530 return static_cast<const OverworldMap*>(nullptr);
531 }
532 return &overworld_maps_[i];
533 }
535 if (i < 0 || i >= static_cast<int>(overworld_maps_.size())) {
536 return static_cast<OverworldMap*>(nullptr);
537 }
538 return &overworld_maps_[i];
539 }
540 auto exits() const { return &all_exits_; }
541 auto mutable_exits() { return &all_exits_; }
542 std::vector<gfx::Tile16> tiles16() const { return tiles16_; }
543 auto tiles32_unique() const { return tiles32_unique_; }
544 auto mutable_tiles16() { return &tiles16_; }
545 auto sprites(int state) const {
546 if (state < 0 || state >= 3) return std::vector<Sprite>{};
547 return all_sprites_[state];
548 }
549 auto mutable_sprites(int state) {
550 if (state < 0 || state >= 3) return static_cast<std::vector<Sprite>*>(nullptr);
551 return &all_sprites_[state];
552 }
553 auto current_graphics() const {
554 if (!is_current_map_valid()) return std::vector<uint8_t>{};
555 return overworld_maps_[current_map_].current_graphics();
556 }
557 const std::vector<OverworldEntrance>& entrances() const {
558 return all_entrances_;
559 }
560 auto& entrances() { return all_entrances_; }
562 const std::vector<OverworldEntrance>& holes() const { return all_holes_; }
563 auto& holes() { return all_holes_; }
564 auto mutable_holes() { return &all_holes_; }
565 auto deleted_entrances() const { return deleted_entrances_; }
567 auto current_area_palette() const {
568 if (!is_current_map_valid()) return gfx::SnesPalette{};
569 return overworld_maps_[current_map_].current_palette();
570 }
572 if (!is_current_map_valid()) return std::vector<uint8_t>{};
573 return overworld_maps_[current_map_].bitmap_data();
574 }
575 auto tile16_blockset_data() const {
576 if (!is_current_map_valid()) return std::vector<uint8_t>{};
577 return overworld_maps_[current_map_].current_tile16_blockset();
578 }
579
580 bool is_current_map_valid() const {
581 return current_map_ >= 0 && current_map_ < static_cast<int>(overworld_maps_.size());
582 }
583 auto is_loaded() const { return is_loaded_; }
584 auto expanded_tile16() const { return expanded_tile16_; }
585 auto expanded_tile32() const { return expanded_tile32_; }
587 int current_map_id() const { return current_map_; }
588 int current_world() const { return current_world_; }
589 void set_current_map(int i) { current_map_ = i; }
590 void set_current_world(int world) { current_world_ = world; }
591 uint16_t GetTile(int x, int y) const {
592 if (current_world_ == 0) {
593 return map_tiles_.light_world[x][y];
594 } else if (current_world_ == 1) {
595 return map_tiles_.dark_world[x][y];
596 } else {
597 return map_tiles_.special_world[x][y];
598 }
599 }
600 void SetTile(int x, int y, uint16_t tile_id) {
601 if (current_world_ == 0) {
602 map_tiles_.light_world[x][y] = tile_id;
603 } else if (current_world_ == 1) {
604 map_tiles_.dark_world[x][y] = tile_id;
605 } else {
606 map_tiles_.special_world[x][y] = tile_id;
607 }
608 }
609 auto map_tiles() const { return map_tiles_; }
610 auto mutable_map_tiles() { return &map_tiles_; }
611 auto all_items() const { return all_items_; }
612 auto mutable_all_items() { return &all_items_; }
613 auto all_tiles_types() const { return all_tiles_types_; }
615 auto all_sprites() const { return all_sprites_; }
616
617 // Diggable tiles management
620 absl::Status LoadDiggableTiles();
621 absl::Status SaveDiggableTiles();
622 absl::Status AutoDetectDiggableTiles();
623
624 private:
631
632 void FetchLargeMaps();
633 absl::StatusOr<uint16_t> GetTile16ForTile32(int index, int quadrant,
634 int dimension,
635 const uint32_t* map32address);
636 absl::Status AssembleMap32Tiles();
637 absl::Status AssembleMap16Tiles();
638 void AssignWorldTiles(int x, int y, int sx, int sy, int tpos,
639 OverworldBlockset& world);
640 void FillBlankMapTiles(int map_index);
641 OverworldBlockset& SelectWorldBlockset(int world_type);
642 void OrganizeMapTiles(std::vector<uint8_t>& bytes,
643 std::vector<uint8_t>& bytes2, int i, int sx, int sy,
644 int& ttpos);
645 absl::Status DecompressAllMapTilesParallel();
646
649
650 bool is_loaded_ = false;
651 bool expanded_tile16_ = false;
652 bool expanded_tile32_ = false;
654
655 int game_state_ = 0;
658
659 // Cached ROM version to avoid repeated detection during loading
661
663
664 // Thread safety for parallel operations
665 mutable std::mutex map_tiles_mutex_;
666
667 // LRU cache for built maps to prevent memory exhaustion
668 // Max ~20 maps = ~25MB of memory (1.25MB per map)
669 static constexpr int kMaxBuiltMaps = 20;
670 std::deque<int> built_map_lru_;
671
672 // Graphics config cache for blockset reuse
673 // Key: Hash of static_graphics array, Value: Precomputed current_gfx data
674 // This avoids rebuilding the same tileset for maps with identical graphics
676 std::vector<uint8_t> current_gfx; // 64KB tileset
678 };
679 std::unordered_map<uint64_t, GraphicsConfigCache> gfx_config_cache_;
680#ifdef __EMSCRIPTEN__
681 // WASM: Increased cache for Special World maps (8 × 64KB = 512KB)
682 // Special World alone needs 6+ unique graphics configs
683 static constexpr int kMaxCachedConfigs = 8;
684#else
685 // Native: Larger cache for better performance (12 × 64KB = 768KB)
686 static constexpr int kMaxCachedConfigs = 12;
687#endif
688
689 std::vector<OverworldMap> overworld_maps_;
690 std::vector<OverworldEntrance> all_entrances_;
691 std::vector<OverworldEntrance> all_holes_;
692 std::vector<OverworldExit> all_exits_;
693 std::vector<OverworldItem> all_items_;
694
695 std::vector<gfx::Tile16> tiles16_;
696 std::vector<gfx::Tile32> tiles32_;
697 std::vector<gfx::Tile32> tiles32_unique_;
698
699 std::vector<uint16_t> tiles32_list_;
700 std::vector<uint64_t> deleted_entrances_;
701
702 std::array<uint8_t, kNumOverworldMaps> map_parent_ = {0};
703 std::array<uint8_t, kNumTileTypes> all_tiles_types_ = {0};
704 std::array<std::vector<Sprite>, 3> all_sprites_;
706 std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p1;
707 std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p2;
708 std::array<int, kNumOverworldMaps> map_pointers1_id;
709 std::array<int, kNumOverworldMaps> map_pointers2_id;
710 std::array<int, kNumOverworldMaps> map_pointers1;
711 std::array<int, kNumOverworldMaps> map_pointers2;
712};
713
714} // namespace yaze::zelda3
715
716#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:28
auto data() const
Definition rom.h:139
auto size() const
Definition rom.h:138
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.
Represents the full Overworld data, light and dark world.
Definition overworld.h:261
std::vector< uint64_t > deleted_entrances_
Definition overworld.h:700
absl::Status SaveMap32Expanded()
Save expanded tile32 definitions (v1+ ROMs)
auto tile16_blockset_data() const
Definition overworld.h:575
auto current_area_palette() const
Definition overworld.h:567
absl::Status DecompressAllMapTilesParallel()
Definition overworld.cc:637
std::vector< uint16_t > tiles32_list_
Definition overworld.h:699
void set_current_world(int world)
Definition overworld.h:590
int GetTileFromPosition(ImVec2 position) const
Definition overworld.h:504
absl::Status Load(Rom *rom)
Load all overworld data from ROM.
Definition overworld.cc:36
int current_world() const
Definition overworld.h:588
std::vector< OverworldItem > all_items_
Definition overworld.h:693
void OrganizeMapTiles(std::vector< uint8_t > &bytes, std::vector< uint8_t > &bytes2, int i, int sx, int sy, int &ttpos)
Definition overworld.cc:617
auto expanded_tile32() const
Definition overworld.h:585
zelda3_version_pointers version_constants() const
Get version-specific ROM addresses.
Definition overworld.h:269
std::array< int, kNumOverworldMaps > map_pointers1
Definition overworld.h:710
std::vector< gfx::Tile32 > tiles32_unique_
Definition overworld.h:697
auto deleted_entrances() const
Definition overworld.h:565
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()
Clear entire graphics config cache Call when palette or graphics settings change globally.
Definition overworld.h:317
const std::vector< OverworldEntrance > & holes() const
Definition overworld.h:562
absl::Status SaveMap32Tiles()
Save tile32 definitions to ROM.
std::vector< OverworldEntrance > all_entrances_
Definition overworld.h:690
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:662
absl::Status SaveMap16Tiles()
Save tile16 definitions to ROM.
absl::Status SaveAreaSizes()
Save area size enum data (v3+ only)
std::vector< gfx::Tile16 > tiles16() const
Definition overworld.h:542
auto all_sprites() const
Definition overworld.h:615
DiggableTiles * mutable_diggable_tiles()
Definition overworld.h:619
auto sprites(int state) const
Definition overworld.h:545
auto map_tiles() const
Definition overworld.h:609
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:611
std::array< uint8_t, kNumOverworldMaps > map_parent_
Definition overworld.h:702
void AssignWorldTiles(int x, int y, int sx, int sy, int tpos, OverworldBlockset &world)
Definition overworld.cc:572
absl::Status SaveDiggableTiles()
void InvalidateMapCache(int map_index)
Invalidate cached tileset for a specific map.
void SetGameData(GameData *game_data)
Definition overworld.h:266
Overworld(Rom *rom, GameData *game_data=nullptr)
Definition overworld.h:263
auto is_loaded() const
Definition overworld.h:583
auto expanded_tile16() const
Definition overworld.h:584
std::array< uint8_t, kNumTileTypes > all_tiles_types_
Definition overworld.h:703
auto current_graphics() const
Definition overworld.h:553
std::unordered_map< uint64_t, GraphicsConfigCache > gfx_config_cache_
Definition overworld.h:679
void LoadTileTypes()
Load tile type collision data.
Definition overworld.cc:996
absl::Status CreateTile32Tilemap()
Build tile32 tilemap from current tile16 data.
std::array< int, kNumOverworldMaps > map_pointers1_id
Definition overworld.h:708
auto overworld_map(int i) const
Definition overworld.h:528
int current_map_id() const
Definition overworld.h:587
const std::vector< uint8_t > * GetCachedTileset(uint64_t config_hash)
Try to get cached tileset data for a graphics configuration.
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:584
bool HasExpandedPointerTables() const
Check if the ROM has expanded pointer tables for tail maps.
Definition overworld.h:479
static constexpr int kMaxCachedConfigs
Definition overworld.h:686
auto all_tiles_types() const
Definition overworld.h:613
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.
void set_current_map(int i)
Definition overworld.h:589
void FillBlankMapTiles(int map_index)
Definition overworld.cc:595
auto mutable_overworld_map(int i)
Definition overworld.h:534
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.
Definition overworld.cc:888
uint64_t ComputeGraphicsConfigHash(int map_index)
Compute hash of graphics configuration for cache lookup.
std::vector< OverworldMap > overworld_maps_
Definition overworld.h:689
void CacheTileset(uint64_t config_hash, const std::vector< uint8_t > &tileset)
Cache tileset data for future reuse.
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:696
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)
uint16_t GetTile(int x, int y) const
Definition overworld.h:591
absl::Status SaveOverworldMaps()
Save compressed map tile data to ROM.
std::array< std::vector< Sprite >, 3 > all_sprites_
Definition overworld.h:704
OverworldVersion cached_version_
Definition overworld.h:660
std::array< int, kNumOverworldMaps > map_pointers2_id
Definition overworld.h:709
auto tiles32_unique() const
Definition overworld.h:543
void SetTile(int x, int y, uint16_t tile_id)
Definition overworld.h:600
absl::Status LoadOverworldMaps()
Load overworld map tile data.
Definition overworld.cc:747
std::vector< gfx::Tile16 > tiles16_
Definition overworld.h:695
absl::Status AutoDetectDiggableTiles()
auto expanded_entrances() const
Definition overworld.h:586
absl::Status AssembleMap16Tiles()
Definition overworld.cc:536
std::mutex map_tiles_mutex_
Definition overworld.h:665
auto mutable_sprites(int state)
Definition overworld.h:549
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:618
const std::vector< OverworldEntrance > & entrances() const
Definition overworld.h:557
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p1
Definition overworld.h:706
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:221
absl::Status SaveMap16Expanded()
Save expanded tile16 definitions (v1+ ROMs)
std::vector< OverworldExit > all_exits_
Definition overworld.h:692
std::array< int, kNumOverworldMaps > map_pointers2
Definition overworld.h:711
absl::StatusOr< uint16_t > GetTile16ForTile32(int index, int quadrant, int dimension, const uint32_t *map32address)
Definition overworld.cc:465
auto current_map_bitmap_data() const
Definition overworld.h:571
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p2
Definition overworld.h:707
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:670
absl::Status SaveMapOverlays()
Save interactive overlay data to ROM.
absl::Status AssembleMap32Tiles()
Definition overworld.cc:476
bool is_current_map_valid() const
Definition overworld.h:580
DiggableTiles diggable_tiles_
Definition overworld.h:705
static constexpr int kMaxBuiltMaps
Definition overworld.h:669
OverworldBlockset & GetMapTiles(int world_type)
Definition overworld.h:514
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:309
auto overworld_maps() const
Definition overworld.h:527
std::vector< OverworldEntrance > all_holes_
Definition overworld.h:691
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:101
constexpr int overworldSpecialSpritePaletteExpandedTemp
Definition overworld.h:174
constexpr int kAreaGfxIdPtr
Definition overworld.h:118
constexpr int kOverworldSpritePaletteGroup
Definition overworld.h:110
constexpr int kOverworldTransitionPositionY
Definition overworld.h:142
constexpr int kNumMapsPerWorld
Definition overworld.h:246
constexpr int kOverworldSpriteset
Definition overworld.h:111
int GetMap32TileBRExpanded()
Definition overworld.h:205
constexpr int kMap16ExpandedFlagPos
Definition overworld.h:166
constexpr int LimitOfMap32
Definition overworld.h:243
constexpr int NumberOfMap16Ex
Definition overworld.h:242
constexpr int kOverworldScreenTileMapChangeByScreen1
Definition overworld.h:147
constexpr int kOverworldMapDataOverflow
Definition overworld.h:152
constexpr int kOverworldMapSizeHighByte
Definition overworld.h:133
constexpr int overworldMessagesExpanded
Definition overworld.h:188
constexpr int GravesTilemapPos
Definition overworld.h:100
constexpr int overworldSpritesBeginingExpanded
Definition overworld.h:168
constexpr int kNumTileTypes
Definition overworld.h:236
constexpr int NumberOfMap32
Definition overworld.h:245
constexpr int kOverworldScreenSize
Definition overworld.h:144
constexpr int kExpandedPtrTableLow
Definition overworld.h:183
constexpr int kOverworldScreenTileMapChangeByScreen4
Definition overworld.h:150
constexpr int kNumTile16Individual
Definition overworld.h:239
int GetMap32TileTRExpanded()
Definition overworld.h:195
constexpr int ExpandedOverlaySpace
Definition overworld.h:176
constexpr int GravesCountOnY
Definition overworld.h:104
constexpr int kMap16Tiles
Definition overworld.h:237
constexpr int overworldSpritesAgahnimExpanded
Definition overworld.h:170
int GetMap32TileBLExpanded()
Definition overworld.h:200
constexpr int kExpandedPtrTableMarker
Definition overworld.h:180
constexpr int GravesYLine
Definition overworld.h:103
constexpr int kNumOverworldMaps
Definition common.h:85
int GetExpandedPtrTableHigh()
Definition overworld.h:222
constexpr int GravesXTilePos
Definition overworld.h:99
constexpr int kOverworldMusicBeginning
Definition overworld.h:121
std::vector< std::vector< uint16_t > > OverworldBlockset
Represents tile32 data for the overworld.
int GetExpandedPtrTableMarker()
Definition overworld.h:210
constexpr int kMap32TileBLExpanded
Definition overworld.h:162
AreaSizeEnum
Area size enumeration for v3+ ROMs.
constexpr int kOverworldTransitionPositionX
Definition overworld.h:143
constexpr int kOverworldMusicDarkWorld
Definition overworld.h:125
constexpr int overworldSpecialSpriteGFXGroupExpandedTemp
Definition overworld.h:173
constexpr int kOverworldSpecialPalGroup
Definition overworld.h:113
constexpr int kOverworldScreenSizeForLoading
Definition overworld.h:145
constexpr int kOverworldSpritePaletteIds
Definition overworld.h:109
constexpr int overworldTilesType
Definition overworld.h:186
constexpr int kMap32TileBRExpanded
Definition overworld.h:163
constexpr int kMap32TileCountExpanded
Definition overworld.h:164
int GetExpandedPtrTableLow()
Definition overworld.h:227
constexpr int kTransitionTargetWest
Definition overworld.h:155
constexpr int overworldMessages
Definition overworld.h:187
constexpr int kOverworldMusicAgahnim
Definition overworld.h:124
constexpr int kOverworldSpritesZelda
Definition overworld.h:116
constexpr int kOverworldMapParentId
Definition overworld.h:141
constexpr int GraveLinkSpecialHole
Definition overworld.h:105
constexpr int Map32PerScreen
Definition overworld.h:240
constexpr int GravesXPos
Definition overworld.h:102
constexpr int kMap32ExpandedFlagPos
Definition overworld.h:165
OverworldVersion
ROM version detection for overworld features.
@ kVanilla
0xFF in ROM, no ZScream ASM applied
constexpr int kExpandedPtrTableHigh
Definition overworld.h:182
constexpr int overworldCustomMosaicASM
Definition overworld.h:156
constexpr int kOverworldMusicMasterSword
Definition overworld.h:123
constexpr int kOverworldMusicZelda
Definition overworld.h:122
constexpr int kOverworldMessageIds
Definition overworld.h:119
constexpr int NumberOfMap16
Definition overworld.h:241
constexpr int kOverworldMapSize
Definition overworld.h:130
constexpr int kOverworldScreenTileMapChangeByScreen2
Definition overworld.h:148
constexpr int overworldSpritesDataStartExpanded
Definition overworld.h:171
constexpr int kOverworldCompressedMapPos
Definition overworld.h:233
constexpr int overworldCustomMosaicArray
Definition overworld.h:157
constexpr int kOverworldSpritesBeginning
Definition overworld.h:114
constexpr int kExpandedMapCount
Definition overworld.h:184
constexpr int kOverworldScreenTileMapChangeByScreen3
Definition overworld.h:149
uint8_t GetExpandedPtrTableMagic()
Definition overworld.h:216
constexpr int kMap16TilesExpanded
Definition overworld.h:160
constexpr uint8_t kExpandedPtrTableMagic
Definition overworld.h:181
constexpr int kOverworldSpritesAgahnim
Definition overworld.h:115
constexpr int kTransitionTargetNorth
Definition overworld.h:154
constexpr int overworldSpritesZeldaExpanded
Definition overworld.h:169
constexpr int kOverworldCompressedOverflowPos
Definition overworld.h:234
constexpr int GravesYTilePos
Definition overworld.h:98
constexpr int NumberOfOWSprites
Definition overworld.h:244
constexpr int kMap32TileTRExpanded
Definition overworld.h:161
int GetMap16TilesExpanded()
Definition overworld.h:190
constexpr int kOverworldMapPaletteIds
Definition overworld.h:108
constexpr int kOverworldEntranceAllowedTilesLeft
Definition overworld.h:126
constexpr int kOverworldSpecialGfxGroup
Definition overworld.h:112
constexpr int kOverworldEntranceAllowedTilesRight
Definition overworld.h:127
constexpr int GraveLinkSpecialStairs
Definition overworld.h:106
zelda3_version version
Definition game_data.h:78
Overworld map tile32 data.
ROM data pointers for different game versions.
Definition zelda.h:71