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
98inline constexpr int kEssentialMapsPerWorld = 1;
99
100constexpr int GravesYTilePos = 0x49968; // short (0x0F entries)
101constexpr int GravesXTilePos = 0x49986; // short (0x0F entries)
102constexpr int GravesTilemapPos = 0x499A4; // short (0x0F entries)
103constexpr int GravesGFX = 0x499C2; // short (0x0F entries)
104constexpr int GravesXPos = 0x4994A; // short (0x0F entries)
105constexpr int GravesYLine = 0x4993A; // short (0x08 entries)
106constexpr int GravesCountOnY = 0x499E0; // Byte 0x09 entries
107constexpr int GraveLinkSpecialHole = 0x46DD9; // short
108constexpr int GraveLinkSpecialStairs = 0x46DE0; // short
109
110constexpr int kOverworldMapPaletteIds = 0x7D1C;
111constexpr int kOverworldSpritePaletteIds = 0x7B41;
112constexpr int kOverworldSpritePaletteGroup = 0x75580;
113constexpr int kOverworldSpriteset = 0x7A41;
114constexpr int kOverworldSpecialGfxGroup = 0x16821;
115constexpr int kOverworldSpecialPalGroup = 0x16831;
116constexpr int kOverworldSpritesBeginning = 0x4C881;
117constexpr int kOverworldSpritesAgahnim = 0x4CA21;
118constexpr int kOverworldSpritesZelda = 0x4C901;
119
120constexpr int kAreaGfxIdPtr = 0x7C9C;
121constexpr int kOverworldMessageIds = 0x3F51D;
122
123constexpr int kOverworldMusicBeginning = 0x14303;
124constexpr int kOverworldMusicZelda = 0x14303 + 0x40;
125constexpr int kOverworldMusicMasterSword = 0x14303 + 0x80;
126constexpr int kOverworldMusicAgahnim = 0x14303 + 0xC0;
127constexpr int kOverworldMusicDarkWorld = 0x14403;
130
131// 0x00 = small maps, 0x20 = large maps
132constexpr int kOverworldMapSize = 0x12844;
133
134// 0x01 = small maps, 0x03 = large maps
135constexpr int kOverworldMapSizeHighByte = 0x12884;
136
137// relative to the WORLD + 0x200 per map
138// large map that are not == parent id = same position as their parent!
139// eg for X position small maps :
140// 0000, 0200, 0400, 0600, 0800, 0A00, 0C00, 0E00
141// all Large map would be :
142// 0000, 0000, 0400, 0400, 0800, 0800, 0C00, 0C00
143constexpr int kOverworldMapParentId = 0x125EC;
144constexpr int kOverworldTransitionPositionY = 0x128C4;
145constexpr int kOverworldTransitionPositionX = 0x12944;
146constexpr int kOverworldScreenSize = 0x1788D;
147constexpr int kOverworldScreenSizeForLoading = 0x4C635;
148
153
154constexpr int kOverworldMapDataOverflow = 0x130000;
155
156constexpr int kTransitionTargetNorth = 0x13EE2;
157constexpr int kTransitionTargetWest = 0x13F62;
158constexpr int overworldCustomMosaicASM = 0x1301D0;
159constexpr int overworldCustomMosaicArray = 0x1301F0;
160
161// Expanded tile16 and tile32
162constexpr int kMap16TilesExpanded = 0x1E8000;
163constexpr int kMap32TileTRExpanded = 0x020000;
164constexpr int kMap32TileBLExpanded = 0x1F0000;
165constexpr int kMap32TileBRExpanded = 0x1F8000;
166constexpr int kMap32TileCountExpanded = 0x0067E0;
167constexpr int kMap32ExpandedFlagPos = 0x01772E; // 0x04
168constexpr int kMap16ExpandedFlagPos = 0x02FD28; // 0x0F
169
170constexpr int overworldSpritesBeginingExpanded = 0x141438;
171constexpr int overworldSpritesZeldaExpanded = 0x141578;
172constexpr int overworldSpritesAgahnimExpanded = 0x1416B8;
173constexpr int overworldSpritesDataStartExpanded = 0x04C881;
174
177
178constexpr int ExpandedOverlaySpace = 0x120000;
179
180// Expanded pointer table markers for tail map support (maps 0xA0-0xBF)
181// Set by TailMapExpansion.asm patch after ZSCustomOverworld v3
182constexpr int kExpandedPtrTableMarker = 0x1423FF; // Location of marker byte
183constexpr uint8_t kExpandedPtrTableMagic = 0xEA; // Marker value when applied
184constexpr int kExpandedPtrTableHigh = 0x142400; // New high table location
185constexpr int kExpandedPtrTableLow = 0x142640; // New low table location
186constexpr int kExpandedMapCount = 192; // 0x00-0xBF
187
188constexpr int overworldTilesType = 0x071459;
189constexpr int overworldMessages = 0x03F51D;
190constexpr int overworldMessagesExpanded = 0x1417F8;
191
196
201
206
211
217
222
227
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
271 : zelda3_version::US);
272 }
273
274 // ===========================================================================
275 // Loading Methods
276 // ===========================================================================
277
279 absl::Status Load(Rom* rom);
280
282 absl::Status LoadOverworldMaps();
283
285 void LoadTileTypes();
286
288 absl::Status LoadSprites();
289
291 absl::Status LoadSpritesFromMap(int sprite_start, int sprite_count,
292 int sprite_index);
293
294 // ===========================================================================
295 // Lazy Loading / Caching
296 // ===========================================================================
297
304 absl::Status EnsureMapBuilt(int map_index);
305
307 uint64_t ComputeGraphicsConfigHash(int map_index);
308
311 const std::vector<uint8_t>* GetCachedTileset(uint64_t config_hash);
312
314 void CacheTileset(uint64_t config_hash, const std::vector<uint8_t>& tileset);
315
319
322 void InvalidateMapCache(int map_index);
323
326 void InvalidateSiblingMapCaches(int map_index);
327
328 // ===========================================================================
329 // Save Methods - Tile Data (Order Matters!)
330 // ===========================================================================
331 // These methods must be called in order because later saves depend on
332 // tile definitions being written first.
333 //
334 // Required order:
335 // 1. CreateTile32Tilemap() - Build tile32 from tile16 data
336 // 2. SaveMap32Tiles() - Write tile32 definitions
337 // 3. SaveMap16Tiles() - Write tile16 definitions
338 // 4. SaveOverworldMaps() - Write compressed map data
339
341 absl::Status Save(Rom* rom);
342
344 absl::Status SaveOverworldMaps();
345
347 absl::Status SaveLargeMaps();
348
350 absl::Status SaveLargeMapsExpanded();
351
353 absl::Status SaveSmallAreaTransitions(
354 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
355 int transition_target_west, int transition_pos_x, int transition_pos_y,
356 int screen_change_1, int screen_change_2, int screen_change_3,
357 int screen_change_4);
358
360 absl::Status SaveLargeAreaTransitions(
361 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
362 int transition_target_west, int transition_pos_x, int transition_pos_y,
363 int screen_change_1, int screen_change_2, int screen_change_3,
364 int screen_change_4);
365
367 absl::Status SaveWideAreaTransitions(
368 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
369 int transition_target_west, int transition_pos_x, int transition_pos_y,
370 int screen_change_1, int screen_change_2, int screen_change_3,
371 int screen_change_4);
372
374 absl::Status SaveTallAreaTransitions(
375 int i, int parent_x_pos, int parent_y_pos, int transition_target_north,
376 int transition_target_west, int transition_pos_x, int transition_pos_y,
377 int screen_change_1, int screen_change_2, int screen_change_3,
378 int screen_change_4);
379
380 // ===========================================================================
381 // Save Methods - Entities (Independent, any order)
382 // ===========================================================================
383
385 absl::Status SaveEntrances();
386
388 absl::Status SaveExits();
389
391 absl::Status SaveItems();
392
394 absl::Status SaveMapOverlays();
395
397 absl::Status SaveOverworldTilesType();
398
399 // ===========================================================================
400 // Save Methods - Custom Features (v2+/v3+)
401 // ===========================================================================
402
404 absl::Status SaveCustomOverworldASM(bool enable_bg_color,
405 bool enable_main_palette,
406 bool enable_mosaic,
407 bool enable_gfx_groups,
408 bool enable_subscreen_overlay,
409 bool enable_animated);
410
412 absl::Status SaveAreaSpecificBGColors();
413
414 // ===========================================================================
415 // Save Methods - Tile Definitions
416 // ===========================================================================
417
420 absl::Status CreateTile32Tilemap();
421
423 absl::Status SaveMap16Expanded();
424
426 absl::Status SaveMap16Tiles();
427
429 absl::Status SaveMap32Expanded();
430
432 absl::Status SaveMap32Tiles();
433
434 // ===========================================================================
435 // Save Methods - Properties
436 // ===========================================================================
437
439 absl::Status SaveMapProperties();
440
442 absl::Status SaveMusic();
443
445 absl::Status SaveAreaSizes();
446
448 void AssignMapSizes(std::vector<OverworldMap>& maps);
449
458 absl::Status ConfigureMultiAreaMap(int parent_index, AreaSizeEnum size);
459
460 auto rom() const { return rom_; }
461 auto mutable_rom() { return rom_; }
462
471 std::vector<std::pair<uint32_t, uint32_t>> GetProjectedWriteRanges() const;
472
481 const int marker_addr = GetExpandedPtrTableMarker();
482 if (!rom_ || marker_addr >= rom_->size()) {
483 return false;
484 }
485 return rom_->data()[marker_addr] == GetExpandedPtrTableMagic();
486 }
487
488 void Destroy() {
489 for (auto& map : overworld_maps_) {
490 map.Destroy();
491 }
492 overworld_maps_.clear();
493 all_entrances_.clear();
494 all_exits_.clear();
495 all_items_.clear();
496 for (auto& sprites : all_sprites_) {
497 sprites.clear();
498 }
499 tiles16_.clear();
500 tiles32_.clear();
501 tiles32_unique_.clear();
502 is_loaded_ = false;
503 }
504
505 int GetTileFromPosition(ImVec2 position) const {
506 if (current_world_ == 0) {
507 return map_tiles_.light_world[position.x][position.y];
508 } else if (current_world_ == 1) {
509 return map_tiles_.dark_world[position.x][position.y];
510 } else {
511 return map_tiles_.special_world[position.x][position.y];
512 }
513 }
514
516 switch (world_type) {
517 case 0:
518 return map_tiles_.light_world;
519 case 1:
520 return map_tiles_.dark_world;
521 case 2:
523 default:
524 return map_tiles_.light_world;
525 }
526 }
527
528 const std::vector<OverworldMap>& overworld_maps() const {
529 return overworld_maps_;
530 }
531 auto overworld_map(int i) const {
532 if (i < 0 || i >= static_cast<int>(overworld_maps_.size())) {
533 return static_cast<const OverworldMap*>(nullptr);
534 }
535 return &overworld_maps_[i];
536 }
538 if (i < 0 || i >= static_cast<int>(overworld_maps_.size())) {
539 return static_cast<OverworldMap*>(nullptr);
540 }
541 return &overworld_maps_[i];
542 }
543 auto exits() const { return &all_exits_; }
544 auto mutable_exits() { return &all_exits_; }
545 const std::vector<gfx::Tile16>& tiles16() const { return tiles16_; }
546 auto tiles32_unique() const { return tiles32_unique_; }
547 auto mutable_tiles16() { return &tiles16_; }
548 auto sprites(int state) const {
549 if (state < 0 || state >= 3)
550 return std::vector<Sprite>{};
551 return all_sprites_[state];
552 }
553 auto mutable_sprites(int state) {
554 if (state < 0 || state >= 3)
555 return static_cast<std::vector<Sprite>*>(nullptr);
556 return &all_sprites_[state];
557 }
558 const std::vector<uint8_t>& current_graphics() const {
559 static const std::vector<uint8_t> kEmpty;
561 return kEmpty;
562 return overworld_maps_[current_map_].current_graphics();
563 }
564 const std::vector<OverworldEntrance>& entrances() const {
565 return all_entrances_;
566 }
567 auto& entrances() { return all_entrances_; }
569 const std::vector<OverworldEntrance>& holes() const { return all_holes_; }
570 auto& holes() { return all_holes_; }
571 auto mutable_holes() { return &all_holes_; }
572 auto deleted_entrances() const { return deleted_entrances_; }
575 static const gfx::SnesPalette kEmpty;
577 return kEmpty;
578 return overworld_maps_[current_map_].current_palette();
579 }
580 const std::vector<uint8_t>& current_map_bitmap_data() const {
581 static const std::vector<uint8_t> kEmpty;
583 return kEmpty;
584 return overworld_maps_[current_map_].bitmap_data();
585 }
586 const std::vector<uint8_t>& tile16_blockset_data() const {
587 static const std::vector<uint8_t> kEmpty;
589 return kEmpty;
590 return overworld_maps_[current_map_].current_tile16_blockset();
591 }
592
593 bool is_current_map_valid() const {
594 return current_map_ >= 0 &&
595 current_map_ < static_cast<int>(overworld_maps_.size());
596 }
597 auto is_loaded() const { return is_loaded_; }
598 auto expanded_tile16() const { return expanded_tile16_; }
599 auto expanded_tile32() const { return expanded_tile32_; }
601 int current_map_id() const { return current_map_; }
602 int current_world() const { return current_world_; }
603 void set_current_map(int i) { current_map_ = i; }
604 void set_current_world(int world) { current_world_ = world; }
605 uint16_t GetTile(int x, int y) const {
606 if (current_world_ == 0) {
607 return map_tiles_.light_world[x][y];
608 } else if (current_world_ == 1) {
609 return map_tiles_.dark_world[x][y];
610 } else {
611 return map_tiles_.special_world[x][y];
612 }
613 }
614 void SetTile(int x, int y, uint16_t tile_id) {
615 if (current_world_ == 0) {
616 map_tiles_.light_world[x][y] = tile_id;
617 } else if (current_world_ == 1) {
618 map_tiles_.dark_world[x][y] = tile_id;
619 } else {
620 map_tiles_.special_world[x][y] = tile_id;
621 }
622 }
623 auto map_tiles() const { return map_tiles_; }
624 auto mutable_map_tiles() { return &map_tiles_; }
625 auto all_items() const { return all_items_; }
626 auto mutable_all_items() { return &all_items_; }
627 auto all_tiles_types() const { return all_tiles_types_; }
629 auto all_sprites() const { return all_sprites_; }
630
631 // Diggable tiles management
634 absl::Status LoadDiggableTiles();
635 absl::Status SaveDiggableTiles();
636 absl::Status AutoDetectDiggableTiles();
637
638 private:
645
646 void FetchLargeMaps();
647 absl::StatusOr<uint16_t> GetTile16ForTile32(int index, int quadrant,
648 int dimension,
649 const uint32_t* map32address);
650 absl::Status AssembleMap32Tiles();
651 absl::Status AssembleMap16Tiles();
652 void AssignWorldTiles(int x, int y, int sx, int sy, int tpos,
653 OverworldBlockset& world);
654 void FillBlankMapTiles(int map_index);
655 OverworldBlockset& SelectWorldBlockset(int world_type);
656 void OrganizeMapTiles(std::vector<uint8_t>& bytes,
657 std::vector<uint8_t>& bytes2, int i, int sx, int sy,
658 int& ttpos);
659 absl::Status DecompressAllMapTilesParallel();
660
663
664 bool is_loaded_ = false;
665 bool expanded_tile16_ = false;
666 bool expanded_tile32_ = false;
668
669 int game_state_ = 0;
672
673 // Cached ROM version to avoid repeated detection during loading
675
677
678 // Thread safety for parallel operations
679 mutable std::mutex map_tiles_mutex_;
680
681 // LRU cache for built maps to prevent memory exhaustion.
682 // Keep this aligned with the essential preload set so the default startup
683 // world stays warm without permanently retaining dozens of maps.
684 static constexpr int kMaxBuiltMaps = 8;
685 std::deque<int> built_map_lru_;
686
687 // Graphics config cache for blockset reuse
688 // Key: Hash of static_graphics array, Value: Precomputed current_gfx data
689 // This avoids rebuilding the same tileset for maps with identical graphics
691 std::vector<uint8_t> current_gfx; // 64KB tileset
693 };
694 std::unordered_map<uint64_t, GraphicsConfigCache> gfx_config_cache_;
695#ifdef __EMSCRIPTEN__
696 // WASM: Increased cache for Special World maps (8 × 64KB = 512KB)
697 // Special World alone needs 6+ unique graphics configs
698 static constexpr int kMaxCachedConfigs = 8;
699#else
700 // Native: Larger cache for better performance (12 × 64KB = 768KB)
701 static constexpr int kMaxCachedConfigs = 12;
702#endif
703
704 std::vector<OverworldMap> overworld_maps_;
705 std::vector<OverworldEntrance> all_entrances_;
706 std::vector<OverworldEntrance> all_holes_;
707 std::vector<OverworldExit> all_exits_;
708 std::vector<OverworldItem> all_items_;
709
710 std::vector<gfx::Tile16> tiles16_;
711 std::vector<gfx::Tile32> tiles32_;
712 std::vector<gfx::Tile32> tiles32_unique_;
713
714 std::vector<uint16_t> tiles32_list_;
715 std::vector<uint64_t> deleted_entrances_;
716
717 std::array<uint8_t, kNumOverworldMaps> map_parent_ = {0};
718 std::array<uint8_t, kNumTileTypes> all_tiles_types_ = {0};
719 std::array<std::vector<Sprite>, 3> all_sprites_;
721 std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p1;
722 std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p2;
723 std::array<int, kNumOverworldMaps> map_pointers1_id;
724 std::array<int, kNumOverworldMaps> map_pointers2_id;
725 std::array<int, kNumOverworldMaps> map_pointers1;
726 std::array<int, kNumOverworldMaps> map_pointers2;
727};
728
729} // namespace yaze::zelda3
730
731#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:715
absl::Status SaveMap32Expanded()
Save expanded tile32 definitions (v1+ ROMs)
absl::Status DecompressAllMapTilesParallel()
Definition overworld.cc:638
std::vector< uint16_t > tiles32_list_
Definition overworld.h:714
void set_current_world(int world)
Definition overworld.h:604
int GetTileFromPosition(ImVec2 position) const
Definition overworld.h:505
absl::Status Load(Rom *rom)
Load all overworld data from ROM.
Definition overworld.cc:36
int current_world() const
Definition overworld.h:602
std::vector< OverworldItem > all_items_
Definition overworld.h:708
void OrganizeMapTiles(std::vector< uint8_t > &bytes, std::vector< uint8_t > &bytes2, int i, int sx, int sy, int &ttpos)
Definition overworld.cc:618
auto expanded_tile32() const
Definition overworld.h:599
zelda3_version_pointers version_constants() const
Get version-specific ROM addresses.
Definition overworld.h:269
std::array< int, kNumOverworldMaps > map_pointers1
Definition overworld.h:725
std::vector< gfx::Tile32 > tiles32_unique_
Definition overworld.h:712
const std::vector< uint8_t > & current_graphics() const
Definition overworld.h:558
auto deleted_entrances() const
Definition overworld.h:572
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:318
const std::vector< OverworldEntrance > & holes() const
Definition overworld.h:569
absl::Status SaveMap32Tiles()
Save tile32 definitions to ROM.
const gfx::SnesPalette & current_area_palette() const
Definition overworld.h:574
std::vector< OverworldEntrance > all_entrances_
Definition overworld.h:705
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:676
absl::Status SaveMap16Tiles()
Save tile16 definitions to ROM.
absl::Status SaveAreaSizes()
Save area size enum data (v3+ only)
auto all_sprites() const
Definition overworld.h:629
DiggableTiles * mutable_diggable_tiles()
Definition overworld.h:633
auto sprites(int state) const
Definition overworld.h:548
auto map_tiles() const
Definition overworld.h:623
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:625
const std::vector< gfx::Tile16 > & tiles16() const
Definition overworld.h:545
std::array< uint8_t, kNumOverworldMaps > map_parent_
Definition overworld.h:717
void AssignWorldTiles(int x, int y, int sx, int sy, int tpos, OverworldBlockset &world)
Definition overworld.cc:573
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:597
auto expanded_tile16() const
Definition overworld.h:598
std::array< uint8_t, kNumTileTypes > all_tiles_types_
Definition overworld.h:718
std::unordered_map< uint64_t, GraphicsConfigCache > gfx_config_cache_
Definition overworld.h:694
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:528
std::array< int, kNumOverworldMaps > map_pointers1_id
Definition overworld.h:723
auto overworld_map(int i) const
Definition overworld.h:531
int current_map_id() const
Definition overworld.h:601
const std::vector< uint8_t > * GetCachedTileset(uint64_t config_hash)
Try to get cached tileset data for a graphics configuration.
const std::vector< uint8_t > & tile16_blockset_data() const
Definition overworld.h:586
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:585
bool HasExpandedPointerTables() const
Check if the ROM has expanded pointer tables for tail maps.
Definition overworld.h:480
static constexpr int kMaxCachedConfigs
Definition overworld.h:701
auto all_tiles_types() const
Definition overworld.h:627
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:603
void FillBlankMapTiles(int map_index)
Definition overworld.cc:596
auto mutable_overworld_map(int i)
Definition overworld.h:537
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:892
uint64_t ComputeGraphicsConfigHash(int map_index)
Compute hash of graphics configuration for cache lookup.
std::vector< OverworldMap > overworld_maps_
Definition overworld.h:704
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:711
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:605
absl::Status SaveOverworldMaps()
Save compressed map tile data to ROM.
std::array< std::vector< Sprite >, 3 > all_sprites_
Definition overworld.h:719
OverworldVersion cached_version_
Definition overworld.h:674
std::array< int, kNumOverworldMaps > map_pointers2_id
Definition overworld.h:724
auto tiles32_unique() const
Definition overworld.h:546
void SetTile(int x, int y, uint16_t tile_id)
Definition overworld.h:614
absl::Status LoadOverworldMaps()
Load overworld map tile data.
Definition overworld.cc:748
std::vector< gfx::Tile16 > tiles16_
Definition overworld.h:710
absl::Status AutoDetectDiggableTiles()
auto expanded_entrances() const
Definition overworld.h:600
absl::Status AssembleMap16Tiles()
Definition overworld.cc:537
std::mutex map_tiles_mutex_
Definition overworld.h:679
const std::vector< uint8_t > & current_map_bitmap_data() const
Definition overworld.h:580
auto mutable_sprites(int state)
Definition overworld.h:553
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:632
const std::vector< OverworldEntrance > & entrances() const
Definition overworld.h:564
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p1
Definition overworld.h:721
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:707
std::array< int, kNumOverworldMaps > map_pointers2
Definition overworld.h:726
absl::StatusOr< uint16_t > GetTile16ForTile32(int index, int quadrant, int dimension, const uint32_t *map32address)
Definition overworld.cc:466
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p2
Definition overworld.h:722
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:685
absl::Status SaveMapOverlays()
Save interactive overlay data to ROM.
absl::Status AssembleMap32Tiles()
Definition overworld.cc:477
bool is_current_map_valid() const
Definition overworld.h:593
DiggableTiles diggable_tiles_
Definition overworld.h:720
static constexpr int kMaxBuiltMaps
Definition overworld.h:684
OverworldBlockset & GetMapTiles(int world_type)
Definition overworld.h:515
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
std::vector< OverworldEntrance > all_holes_
Definition overworld.h:706
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:103
constexpr int overworldSpecialSpritePaletteExpandedTemp
Definition overworld.h:176
constexpr int kAreaGfxIdPtr
Definition overworld.h:120
constexpr int kOverworldSpritePaletteGroup
Definition overworld.h:112
constexpr int kOverworldTransitionPositionY
Definition overworld.h:144
constexpr int kNumMapsPerWorld
Definition overworld.h:246
constexpr int kOverworldSpriteset
Definition overworld.h:113
int GetMap32TileBRExpanded()
Definition overworld.h:207
constexpr int kMap16ExpandedFlagPos
Definition overworld.h:168
constexpr int LimitOfMap32
Definition overworld.h:243
constexpr int NumberOfMap16Ex
Definition overworld.h:242
constexpr int kOverworldScreenTileMapChangeByScreen1
Definition overworld.h:149
constexpr int kOverworldMapDataOverflow
Definition overworld.h:154
constexpr int kOverworldMapSizeHighByte
Definition overworld.h:135
constexpr int overworldMessagesExpanded
Definition overworld.h:190
constexpr int GravesTilemapPos
Definition overworld.h:102
constexpr int overworldSpritesBeginingExpanded
Definition overworld.h:170
constexpr int kNumTileTypes
Definition overworld.h:236
constexpr int NumberOfMap32
Definition overworld.h:245
constexpr int kOverworldScreenSize
Definition overworld.h:146
constexpr int kExpandedPtrTableLow
Definition overworld.h:185
constexpr int kOverworldScreenTileMapChangeByScreen4
Definition overworld.h:152
constexpr int kNumTile16Individual
Definition overworld.h:239
int GetMap32TileTRExpanded()
Definition overworld.h:197
constexpr int ExpandedOverlaySpace
Definition overworld.h:178
constexpr int GravesCountOnY
Definition overworld.h:106
constexpr int kMap16Tiles
Definition overworld.h:237
constexpr int overworldSpritesAgahnimExpanded
Definition overworld.h:172
int GetMap32TileBLExpanded()
Definition overworld.h:202
constexpr int kExpandedPtrTableMarker
Definition overworld.h:182
constexpr int GravesYLine
Definition overworld.h:105
constexpr int kNumOverworldMaps
Definition common.h:85
int GetExpandedPtrTableHigh()
Definition overworld.h:223
constexpr int GravesXTilePos
Definition overworld.h:101
constexpr int kOverworldMusicBeginning
Definition overworld.h:123
std::vector< std::vector< uint16_t > > OverworldBlockset
Represents tile32 data for the overworld.
int GetExpandedPtrTableMarker()
Definition overworld.h:212
constexpr int kMap32TileBLExpanded
Definition overworld.h:164
AreaSizeEnum
Area size enumeration for v3+ ROMs.
constexpr int kOverworldTransitionPositionX
Definition overworld.h:145
constexpr int kOverworldMusicDarkWorld
Definition overworld.h:127
constexpr int overworldSpecialSpriteGFXGroupExpandedTemp
Definition overworld.h:175
constexpr int kOverworldSpecialPalGroup
Definition overworld.h:115
constexpr int kOverworldScreenSizeForLoading
Definition overworld.h:147
constexpr int kOverworldSpritePaletteIds
Definition overworld.h:111
constexpr int overworldTilesType
Definition overworld.h:188
constexpr int kMap32TileBRExpanded
Definition overworld.h:165
constexpr int kMap32TileCountExpanded
Definition overworld.h:166
int GetExpandedPtrTableLow()
Definition overworld.h:228
constexpr int kTransitionTargetWest
Definition overworld.h:157
constexpr int overworldMessages
Definition overworld.h:189
constexpr int kOverworldMusicAgahnim
Definition overworld.h:126
constexpr int kOverworldSpritesZelda
Definition overworld.h:118
constexpr int kOverworldMapParentId
Definition overworld.h:143
constexpr int GraveLinkSpecialHole
Definition overworld.h:107
constexpr int Map32PerScreen
Definition overworld.h:240
constexpr int GravesXPos
Definition overworld.h:104
constexpr int kMap32ExpandedFlagPos
Definition overworld.h:167
OverworldVersion
ROM version detection for overworld features.
@ kVanilla
0xFF in ROM, no ZScream ASM applied
constexpr int kExpandedPtrTableHigh
Definition overworld.h:184
constexpr int overworldCustomMosaicASM
Definition overworld.h:158
constexpr int kOverworldMusicMasterSword
Definition overworld.h:125
constexpr int kOverworldMusicZelda
Definition overworld.h:124
constexpr int kOverworldMessageIds
Definition overworld.h:121
constexpr int NumberOfMap16
Definition overworld.h:241
constexpr int kOverworldMapSize
Definition overworld.h:132
constexpr int kOverworldScreenTileMapChangeByScreen2
Definition overworld.h:150
constexpr int overworldSpritesDataStartExpanded
Definition overworld.h:173
constexpr int kEssentialMapsPerWorld
Definition overworld.h:98
constexpr int kOverworldCompressedMapPos
Definition overworld.h:233
constexpr int overworldCustomMosaicArray
Definition overworld.h:159
constexpr int kOverworldSpritesBeginning
Definition overworld.h:116
constexpr int kExpandedMapCount
Definition overworld.h:186
constexpr int kOverworldScreenTileMapChangeByScreen3
Definition overworld.h:151
uint8_t GetExpandedPtrTableMagic()
Definition overworld.h:218
constexpr int kMap16TilesExpanded
Definition overworld.h:162
constexpr uint8_t kExpandedPtrTableMagic
Definition overworld.h:183
constexpr int kOverworldSpritesAgahnim
Definition overworld.h:117
constexpr int kTransitionTargetNorth
Definition overworld.h:156
constexpr int overworldSpritesZeldaExpanded
Definition overworld.h:171
constexpr int kOverworldCompressedOverflowPos
Definition overworld.h:234
constexpr int GravesYTilePos
Definition overworld.h:100
constexpr int NumberOfOWSprites
Definition overworld.h:244
constexpr int kMap32TileTRExpanded
Definition overworld.h:163
int GetMap16TilesExpanded()
Definition overworld.h:192
constexpr int kOverworldMapPaletteIds
Definition overworld.h:110
constexpr int kOverworldEntranceAllowedTilesLeft
Definition overworld.h:128
constexpr int kOverworldSpecialGfxGroup
Definition overworld.h:114
constexpr int kOverworldEntranceAllowedTilesRight
Definition overworld.h:129
constexpr int GraveLinkSpecialStairs
Definition overworld.h:108
zelda3_version version
Definition game_data.h:79
Overworld map tile32 data.
ROM data pointers for different game versions.
Definition zelda.h:71