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