yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
overworld_map.h
Go to the documentation of this file.
1#ifndef YAZE_APP_ZELDA3_OVERWORLD_MAP_H
2#define YAZE_APP_ZELDA3_OVERWORLD_MAP_H
3
4#include <array>
5#include <cstddef>
6#include <cstdint>
7#include <vector>
8
9#include "absl/status/status.h"
12#include "rom/rom.h"
13#include "zelda3/game_data.h"
15
16namespace yaze {
17namespace zelda3 {
18
19static constexpr int kTileOffsets[] = {0, 8, 4096, 4104};
20
21// 2 bytes for each overworld area (0x140)
22constexpr int OverworldCustomAreaSpecificBGPalette = 0x140000;
23
24// 1 byte, not 0 if enabled
25constexpr int OverworldCustomAreaSpecificBGEnabled = 0x140140;
26
27// Additional v3 constants
29 0x140340; // 2 bytes for each overworld area (0x140)
31 0x140144; // 1 byte, not 0 if enabled
33 0x1402A0; // 1 byte for each overworld area (0xA0)
35 0x140143; // 1 byte, not 0 if enabled
37 0x140480; // 8 bytes for each overworld area (0x500)
39 0x140148; // 1 byte, not 0 if enabled
41 0x140200; // 1 byte for each overworld area (0xA0)
43 0x140142; // 1 byte, not 0 if enabled
44
45// Vanilla overlay constants
46constexpr int kOverlayPointers =
47 0x77664; // 2 bytes for each overworld area (0x100)
48constexpr int kOverlayPointersBank = 0x0E; // Bank for overlay pointers
49constexpr int kOverlayData1 = 0x77676; // Check for custom overlay code
50constexpr int kOverlayData2 = 0x77677; // Custom overlay data pointer
51constexpr int kOverlayCodeStart = 0x77657; // Start of overlay code
52
53// 1 byte for each overworld area (0xA0)
54constexpr int OverworldCustomMainPaletteArray = 0x140160;
55// 1 byte, not 0 if enabled
56constexpr int OverworldCustomMainPaletteEnabled = 0x140141;
57
58// v3 expanded constants
59constexpr int kOverworldMessagesExpanded = 0x1417F8;
60constexpr int kOverworldMapParentIdExpanded = 0x140998;
67
68constexpr int kOverworldSpecialSpriteGFXGroup = 0x016811;
69constexpr int kOverworldSpecialGFXGroup = 0x016821;
70constexpr int kOverworldSpecialPALGroup = 0x016831;
71constexpr int kOverworldSpecialSpritePalette = 0x016841;
72constexpr int kOverworldPalettesScreenToSetNew = 0x4C635;
75
76constexpr int transition_target_northExpanded = 0x1411B8;
77constexpr int transition_target_westExpanded = 0x1412F8;
78
79constexpr int kDarkWorldMapIdStart = 0x40;
80constexpr int kSpecialWorldMapIdStart = 0x80;
81
85using OverworldBlockset = std::vector<std::vector<uint16_t>>;
86
95
100 public:
101 OverworldMap() = default;
102 OverworldMap(int index, Rom* rom, GameData* game_data = nullptr);
103
104 void SetGameData(GameData* game_data) { game_data_ = game_data; }
105
106 absl::Status BuildMap(int count, int game_state, int world,
107 std::vector<gfx::Tile16>& tiles16,
108 OverworldBlockset& world_blockset);
109
114 absl::Status BuildMapWithCache(int count, int game_state, int world,
115 std::vector<gfx::Tile16>& tiles16,
116 OverworldBlockset& world_blockset,
117 const std::vector<uint8_t>* cached_tileset);
118
119 void LoadAreaGraphics();
120 absl::Status LoadPalette();
121 absl::Status LoadOverlay();
122 absl::Status LoadVanillaOverlayData();
123 absl::Status BuildTileset();
124 absl::Status BuildTiles16Gfx(std::vector<gfx::Tile16>& tiles16, int count);
125 absl::Status BuildBitmap(OverworldBlockset& world_blockset);
126
131 void UseCachedTileset(const std::vector<uint8_t>& cached_gfx) {
132 current_gfx_ = cached_gfx;
133 }
134
135 void DrawAnimatedTiles();
136
138 auto current_graphics() const { return current_gfx_; }
139 auto current_palette() const { return current_palette_; }
140 auto bitmap_data() const { return bitmap_data_; }
141 auto is_large_map() const { return large_map_; }
142 auto is_initialized() const { return initialized_; }
143 auto is_built() const { return built_; }
144 auto parent() const { return parent_; }
145 auto mutable_mosaic() { return &mosaic_; }
147
148 void SetNotBuilt() { built_ = false; }
149
150 auto area_graphics() const { return area_graphics_; }
151 auto area_palette() const { return area_palette_; }
152 auto sprite_graphics(int i) const { return sprite_graphics_[i]; }
153 auto sprite_palette(int i) const { return sprite_palette_[i]; }
154 auto message_id() const { return message_id_; }
155 auto area_music(int i) const { return area_music_[i]; }
156 auto static_graphics(int i) const { return static_graphics_[i]; }
157 auto large_index() const { return large_index_; }
158 auto area_size() const { return area_size_; }
159 auto main_gfx_id() const { return main_gfx_id_; }
160
161 auto main_palette() const { return main_palette_; }
162 void set_main_palette(uint8_t palette) { main_palette_ = palette; }
163
165 void set_area_specific_bg_color(uint16_t color) {
167 }
168
169 auto subscreen_overlay() const { return subscreen_overlay_; }
170 void set_subscreen_overlay(uint16_t overlay) { subscreen_overlay_ = overlay; }
171
172 auto animated_gfx() const { return animated_gfx_; }
173 void set_animated_gfx(uint8_t gfx) { animated_gfx_ = gfx; }
174
175 auto game_state() const { return game_state_; }
176 void set_game_state(int state) { game_state_ = state; }
177
178 auto custom_tileset(int index) const { return custom_gfx_ids_[index]; }
179
180 // Overlay accessors (interactive overlays)
181 auto overlay_id() const { return overlay_id_; }
182 auto has_overlay() const { return has_overlay_; }
183 const auto& overlay_data() const { return overlay_data_; }
184
185 // Mosaic expanded accessors
186 const std::array<bool, 4>& mosaic_expanded() const {
187 return mosaic_expanded_;
188 }
189 void set_mosaic_expanded(int index, bool value) {
190 mosaic_expanded_[index] = value;
191 }
192 void set_custom_tileset(int index, uint8_t value) {
193 custom_gfx_ids_[index] = value;
194 }
195
199 auto mutable_sprite_graphics(int i) { return &sprite_graphics_[i]; }
200 auto mutable_sprite_palette(int i) { return &sprite_palette_[i]; }
201 auto mutable_message_id() { return &message_id_; }
205 auto mutable_area_music(int i) { return &area_music_[i]; }
206 auto mutable_static_graphics(int i) { return &static_graphics_[i]; }
207
208 auto set_area_graphics(uint8_t value) { area_graphics_ = value; }
209 auto set_area_palette(uint8_t value) { area_palette_ = value; }
210 auto set_sprite_graphics(int i, uint8_t value) {
211 sprite_graphics_[i] = value;
212 }
213 auto set_sprite_palette(int i, uint8_t value) { sprite_palette_[i] = value; }
214 auto set_message_id(uint16_t value) { message_id_ = value; }
215
216 uint8_t* mutable_custom_tileset(int index) { return &custom_gfx_ids_[index]; }
217
218 void SetAsLargeMap(int parent_index, int quadrant) {
219 parent_ = parent_index;
220 large_index_ = quadrant;
221 large_map_ = true;
223 }
224
225 void SetAsSmallMap(int index = -1) {
226 if (index != -1)
227 parent_ = index;
228 else
229 parent_ = index_;
230 large_index_ = 0;
231 large_map_ = false;
233 }
234
236 area_size_ = size;
238 }
239
240 void SetParent(int parent_index) { parent_ = parent_index; }
241
249 void Destroy() {
250 // Free memory-heavy data
251 current_blockset_.clear();
252 current_gfx_.clear();
253 bitmap_data_.clear();
254 map_tiles_.light_world.clear();
255 map_tiles_.dark_world.clear();
257
258 // Reset build state (allows rebuild)
259 built_ = false;
260 initialized_ = false;
261
262 // Reset runtime state (will be recomputed on rebuild)
263 world_ = 0;
264 game_state_ = 0;
265 main_gfx_id_ = 0;
266
267 // NOTE: Do NOT reset these identity fields - they are needed for rebuild:
268 // - index_: Map's position in overworld array (used for ROM lookups)
269 // - parent_: Map's parent relationship (for large maps)
270 // - rom_: ROM pointer (needed for data access)
271 // - large_map_, large_index_, area_size_: Map structure info
272 // - message_id_, area_graphics_, area_palette_, etc: Loaded from ROM on rebuild
273 }
274
275 private:
276 void LoadAreaInfo();
278 void SetupCustomTileset(uint8_t asm_version);
279
280 void LoadMainBlocksetId();
282 void LoadMainBlocksets();
285 uint8_t ComputeWorldBasedMainPalette() const;
286
287 void ProcessGraphicsBuffer(int index, int static_graphics_offset, int size,
288 const uint8_t* all_gfx);
289 absl::StatusOr<gfx::SnesPalette> GetPalette(const gfx::PaletteGroup& group,
290 int index, int previous_index,
291 int limit);
292
293 // Helper to get version constants from game_data or default to US
295 return kVersionConstantsMap.at(game_data_ ? game_data_->version : zelda3_version::US);
296 }
297
300
301 bool built_ = false;
302 bool large_map_ = false;
303 bool initialized_ = false;
304 bool mosaic_ = false;
305
306 int index_ = 0; // Map index
307 int parent_ = 0; // Parent map index
308 int large_index_ = 0; // Quadrant ID [0-3]
309 int world_ = 0; // World ID [0-2]
310 int game_state_ = 0; // Game state [0-2]
311 int main_gfx_id_ = 0; // Main Gfx ID
313
314 uint16_t message_id_ = 0;
315 uint8_t area_graphics_ = 0;
316 uint8_t area_palette_ = 0;
317 uint8_t main_palette_ = 0; // Custom Overworld Main Palette ID
318 uint8_t animated_gfx_ = 0; // Custom Overworld Animated ID
319 uint16_t subscreen_overlay_ = 0; // Custom Overworld Subscreen Overlay ID
321 0; // Custom Overworld Area-Specific Background Color
322
323 std::array<uint8_t, 8> custom_gfx_ids_;
324 std::array<uint8_t, 3> sprite_graphics_;
325 std::array<uint8_t, 3> sprite_palette_;
326 std::array<uint8_t, 4> area_music_;
327 std::array<uint8_t, 16> static_graphics_;
328
329 std::array<bool, 4> mosaic_expanded_;
330
331 // Overlay support (interactive overlays that reveal holes/change elements)
332 uint16_t overlay_id_ = 0;
333 bool has_overlay_ = false;
334 std::vector<uint8_t> overlay_data_;
335
336 std::vector<uint8_t> current_blockset_;
337 std::vector<uint8_t> current_gfx_;
338 std::vector<uint8_t> bitmap_data_;
339
342};
343
344} // namespace zelda3
345} // namespace yaze
346
347#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
Shared graphical context across editors.
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
Represents a single Overworld map screen.
auto set_area_palette(uint8_t value)
void SetAsLargeMap(int parent_index, int quadrant)
void ProcessGraphicsBuffer(int index, int static_graphics_offset, int size, const uint8_t *all_gfx)
zelda3_version_pointers version_constants() const
void set_main_palette(uint8_t palette)
std::vector< uint8_t > current_gfx_
std::vector< uint8_t > current_blockset_
std::array< bool, 4 > mosaic_expanded_
absl::Status LoadVanillaOverlayData()
std::vector< uint8_t > bitmap_data_
void Destroy()
Free memory-heavy data while preserving map identity.
const std::array< bool, 4 > & mosaic_expanded() const
void SetAsSmallMap(int index=-1)
auto set_message_id(uint16_t value)
void SetGameData(GameData *game_data)
auto set_sprite_palette(int i, uint8_t value)
void set_custom_tileset(int index, uint8_t value)
absl::Status BuildMapWithCache(int count, int game_state, int world, std::vector< gfx::Tile16 > &tiles16, OverworldBlockset &world_blockset, const std::vector< uint8_t > *cached_tileset)
Build map with optional cached tileset for performance.
void set_area_specific_bg_color(uint16_t color)
const auto & overlay_data() const
void SetupCustomTileset(uint8_t asm_version)
auto sprite_graphics(int i) const
absl::StatusOr< gfx::SnesPalette > GetPalette(const gfx::PaletteGroup &group, int index, int previous_index, int limit)
absl::Status BuildTiles16Gfx(std::vector< gfx::Tile16 > &tiles16, int count)
OverworldMapTiles map_tiles_
absl::Status BuildMap(int count, int game_state, int world, std::vector< gfx::Tile16 > &tiles16, OverworldBlockset &world_blockset)
std::array< uint8_t, 3 > sprite_graphics_
void SetParent(int parent_index)
auto current_tile16_blockset() const
auto static_graphics(int i) const
void SetAreaSize(AreaSizeEnum size)
auto custom_tileset(int index) const
auto area_music(int i) const
uint8_t ComputeWorldBasedMainPalette() const
absl::Status BuildBitmap(OverworldBlockset &world_blockset)
std::array< uint8_t, 3 > sprite_palette_
std::array< uint8_t, 4 > area_music_
std::array< uint8_t, 16 > static_graphics_
std::array< uint8_t, 8 > custom_gfx_ids_
void set_animated_gfx(uint8_t gfx)
auto set_area_graphics(uint8_t value)
void set_game_state(int state)
void set_subscreen_overlay(uint16_t overlay)
std::vector< uint8_t > overlay_data_
void UseCachedTileset(const std::vector< uint8_t > &cached_gfx)
Use a pre-computed tileset from cache instead of rebuilding.
auto area_specific_bg_color() const
auto sprite_palette(int i) const
gfx::SnesPalette current_palette_
void set_mosaic_expanded(int index, bool value)
uint8_t * mutable_custom_tileset(int index)
auto set_sprite_graphics(int i, uint8_t value)
constexpr int OverworldCustomTileGFXGroupEnabled
constexpr int OverworldCustomAreaSpecificBGEnabled
constexpr int kOverworldScreenTileMapChangeByScreen2Expanded
constexpr int kOverlayData1
constexpr int kSpecialWorldMapIdStart
constexpr int OverworldCustomMosaicArray
constexpr int kOverworldTransitionPositionXExpanded
constexpr int OverworldCustomAnimatedGFXEnabled
constexpr int OverworldCustomMainPaletteEnabled
constexpr int OverworldCustomMainPaletteArray
constexpr int kOverworldTransitionPositionYExpanded
constexpr int kOverworldSpecialSpritePaletteExpandedTemp
constexpr int kOverworldMapParentIdExpanded
constexpr int kOverworldSpecialSpriteGfxGroupExpandedTemp
std::vector< std::vector< uint16_t > > OverworldBlockset
Represents tile32 data for the overworld.
AreaSizeEnum
Area size enumeration for v3+ ROMs.
constexpr int kOverlayPointersBank
constexpr int transition_target_westExpanded
constexpr int kOverworldSpecialPALGroup
struct yaze::zelda3::OverworldMapTiles OverworldMapTiles
Overworld map tile32 data.
constexpr int kOverworldPalettesScreenToSetNew
constexpr int kOverworldMessagesExpanded
constexpr int kOverworldScreenTileMapChangeByScreen3Expanded
constexpr int kOverlayData2
constexpr int transition_target_northExpanded
constexpr int kOverworldSpecialSpritePalette
constexpr int OverworldCustomAnimatedGFXArray
constexpr int kDarkWorldMapIdStart
constexpr int OverworldCustomMosaicEnabled
constexpr int kOverworldScreenTileMapChangeByScreen4Expanded
constexpr int kOverworldSpecialSpriteGFXGroup
constexpr int kOverworldScreenTileMapChangeByScreen1Expanded
constexpr int OverworldCustomTileGFXGroupArray
constexpr int OverworldCustomSubscreenOverlayEnabled
constexpr int OverworldCustomAreaSpecificBGPalette
constexpr int kOverlayPointers
constexpr int kOverlayCodeStart
constexpr int kOverworldSpecialGFXGroup
constexpr int OverworldCustomSubscreenOverlayArray
Represents a group of palettes.
zelda3_version version
Definition game_data.h:78
Overworld map tile32 data.
ROM data pointers for different game versions.
Definition zelda.h:71