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"
11#include "app/gfx/snes_tile.h"
12#include "app/rom.h"
13
14namespace yaze {
15namespace zelda3 {
16
17static constexpr int kTileOffsets[] = {0, 8, 4096, 4104};
18
19// 1 byte, not 0 if enabled
20// vanilla, v2, v3
21constexpr int OverworldCustomASMHasBeenApplied = 0x140145;
22
23// 2 bytes for each overworld area (0x140)
24constexpr int OverworldCustomAreaSpecificBGPalette = 0x140000;
25
26// 1 byte, not 0 if enabled
27constexpr int OverworldCustomAreaSpecificBGEnabled = 0x140140;
28
29// Additional v3 constants
30constexpr int OverworldCustomSubscreenOverlayArray = 0x140340; // 2 bytes for each overworld area (0x140)
31constexpr int OverworldCustomSubscreenOverlayEnabled = 0x140144; // 1 byte, not 0 if enabled
32constexpr int OverworldCustomAnimatedGFXArray = 0x1402A0; // 1 byte for each overworld area (0xA0)
33constexpr int OverworldCustomAnimatedGFXEnabled = 0x140143; // 1 byte, not 0 if enabled
34constexpr int OverworldCustomTileGFXGroupArray = 0x140480; // 8 bytes for each overworld area (0x500)
35constexpr int OverworldCustomTileGFXGroupEnabled = 0x140148; // 1 byte, not 0 if enabled
36constexpr int OverworldCustomMosaicArray = 0x140200; // 1 byte for each overworld area (0xA0)
37constexpr int OverworldCustomMosaicEnabled = 0x140142; // 1 byte, not 0 if enabled
38
39// Vanilla overlay constants
40constexpr int kOverlayPointers = 0x77664; // 2 bytes for each overworld area (0x100)
41constexpr int kOverlayPointersBank = 0x0E; // Bank for overlay pointers
42constexpr int kOverlayData1 = 0x77676; // Check for custom overlay code
43constexpr int kOverlayData2 = 0x77677; // Custom overlay data pointer
44constexpr int kOverlayCodeStart = 0x77657; // Start of overlay code
45
46// 1 byte for each overworld area (0xA0)
47constexpr int OverworldCustomMainPaletteArray = 0x140160;
48// 1 byte, not 0 if enabled
49constexpr int OverworldCustomMainPaletteEnabled = 0x140141;
50
51
52// v3 expanded constants
53constexpr int kOverworldMessagesExpanded = 0x1417F8;
54constexpr int kOverworldMapParentIdExpanded = 0x140998;
61
62constexpr int kOverworldSpecialSpriteGFXGroup = 0x016811;
63constexpr int kOverworldSpecialGFXGroup = 0x016821;
64constexpr int kOverworldSpecialPALGroup = 0x016831;
65constexpr int kOverworldSpecialSpritePalette = 0x016841;
66constexpr int kOverworldPalettesScreenToSetNew = 0x4C635;
69
70constexpr int transition_target_northExpanded = 0x1411B8;
71constexpr int transition_target_westExpanded = 0x1412F8;
72
73constexpr int kDarkWorldMapIdStart = 0x40;
74constexpr int kSpecialWorldMapIdStart = 0x80;
75
79using OverworldBlockset = std::vector<std::vector<uint16_t>>;
80
84typedef struct OverworldMapTiles {
88} OverworldMapTiles;
89
90enum class AreaSizeEnum {
91 SmallArea = 0,
92 LargeArea = 1,
93 WideArea = 2,
94 TallArea = 3,
95};
96
101 public:
102 OverworldMap() = default;
103 OverworldMap(int index, Rom* rom);
104
105 absl::Status BuildMap(int count, int game_state, int world,
106 std::vector<gfx::Tile16>& tiles16,
107 OverworldBlockset& world_blockset);
108
109 void LoadAreaGraphics();
110 absl::Status LoadPalette();
111 absl::Status LoadOverlay();
112 absl::Status LoadVanillaOverlayData();
113 absl::Status BuildTileset();
114 absl::Status BuildTiles16Gfx(std::vector<gfx::Tile16>& tiles16, int count);
115 absl::Status BuildBitmap(OverworldBlockset& world_blockset);
116
117 void DrawAnimatedTiles();
118
120 auto current_graphics() const { return current_gfx_; }
121 auto current_palette() const { return current_palette_; }
122 auto bitmap_data() const { return bitmap_data_; }
123 auto is_large_map() const { return large_map_; }
124 auto is_initialized() const { return initialized_; }
125 auto is_built() const { return built_; }
126 auto parent() const { return parent_; }
127 auto mutable_mosaic() { return &mosaic_; }
129
130 void SetNotBuilt() { built_ = false; }
131
132 auto area_graphics() const { return area_graphics_; }
133 auto area_palette() const { return area_palette_; }
134 auto sprite_graphics(int i) const { return sprite_graphics_[i]; }
135 auto sprite_palette(int i) const { return sprite_palette_[i]; }
136 auto message_id() const { return message_id_; }
137 auto area_music(int i) const { return area_music_[i]; }
138 auto static_graphics(int i) const { return static_graphics_[i]; }
139 auto large_index() const { return large_index_; }
140 auto area_size() const { return area_size_; }
141
142 auto main_palette() const { return main_palette_; }
143 void set_main_palette(uint8_t palette) { main_palette_ = palette; }
144
146 void set_area_specific_bg_color(uint16_t color) {
148 }
149
150 auto subscreen_overlay() const { return subscreen_overlay_; }
151 void set_subscreen_overlay(uint16_t overlay) { subscreen_overlay_ = overlay; }
152
153 auto animated_gfx() const { return animated_gfx_; }
154 void set_animated_gfx(uint8_t gfx) { animated_gfx_ = gfx; }
155
156 auto custom_tileset(int index) const { return custom_gfx_ids_[index]; }
157
158 // Overlay accessors (interactive overlays)
159 auto overlay_id() const { return overlay_id_; }
160 auto has_overlay() const { return has_overlay_; }
161 const auto& overlay_data() const { return overlay_data_; }
162
163 // Mosaic expanded accessors
164 const std::array<bool, 4>& mosaic_expanded() const { return mosaic_expanded_; }
165 void set_mosaic_expanded(int index, bool value) { mosaic_expanded_[index] = value; }
166 void set_custom_tileset(int index, uint8_t value) { custom_gfx_ids_[index] = value; }
167
171 auto mutable_sprite_graphics(int i) { return &sprite_graphics_[i]; }
172 auto mutable_sprite_palette(int i) { return &sprite_palette_[i]; }
173 auto mutable_message_id() { return &message_id_; }
177 auto mutable_area_music(int i) { return &area_music_[i]; }
178 auto mutable_static_graphics(int i) { return &static_graphics_[i]; }
179
180 auto set_area_graphics(uint8_t value) { area_graphics_ = value; }
181 auto set_area_palette(uint8_t value) { area_palette_ = value; }
182 auto set_sprite_graphics(int i, uint8_t value) {
183 sprite_graphics_[i] = value;
184 }
185 auto set_sprite_palette(int i, uint8_t value) { sprite_palette_[i] = value; }
186 auto set_message_id(uint16_t value) { message_id_ = value; }
187
188 uint8_t* mutable_custom_tileset(int index) { return &custom_gfx_ids_[index]; }
189
190 void SetAsLargeMap(int parent_index, int quadrant) {
191 parent_ = parent_index;
192 large_index_ = quadrant;
193 large_map_ = true;
195 }
196
197 void SetAsSmallMap(int index = -1) {
198 if (index != -1)
199 parent_ = index;
200 else
201 parent_ = index_;
202 large_index_ = 0;
203 large_map_ = false;
205 }
206
208 area_size_ = size;
210 }
211
212 void SetParent(int parent_index) {
213 parent_ = parent_index;
214 }
215
216 void Destroy() {
217 current_blockset_.clear();
218 current_gfx_.clear();
219 bitmap_data_.clear();
220 map_tiles_.light_world.clear();
221 map_tiles_.dark_world.clear();
223 built_ = false;
224 initialized_ = false;
225 large_map_ = false;
226 mosaic_ = false;
227 index_ = 0;
228 parent_ = 0;
229 large_index_ = 0;
230 world_ = 0;
231 game_state_ = 0;
232 main_gfx_id_ = 0;
233 message_id_ = 0;
234 area_graphics_ = 0;
235 area_palette_ = 0;
236 main_palette_ = 0;
237 animated_gfx_ = 0;
240 custom_gfx_ids_.fill(0);
241 sprite_graphics_.fill(0);
242 sprite_palette_.fill(0);
243 area_music_.fill(0);
244 static_graphics_.fill(0);
245 mosaic_expanded_.fill(false);
247 overlay_id_ = 0;
248 has_overlay_ = false;
249 overlay_data_.clear();
250 }
251
252 private:
253 void LoadAreaInfo();
255 void SetupCustomTileset(uint8_t asm_version);
256
257 void LoadMainBlocksetId();
259 void LoadMainBlocksets();
262
263 void ProcessGraphicsBuffer(int index, int static_graphics_offset, int size,
264 uint8_t* all_gfx);
265 absl::StatusOr<gfx::SnesPalette> GetPalette(const gfx::PaletteGroup& group,
266 int index, int previous_index,
267 int limit);
268
270
271 bool built_ = false;
272 bool large_map_ = false;
273 bool initialized_ = false;
274 bool mosaic_ = false;
275
276 int index_ = 0; // Map index
277 int parent_ = 0; // Parent map index
278 int large_index_ = 0; // Quadrant ID [0-3]
279 int world_ = 0; // World ID [0-2]
280 int game_state_ = 0; // Game state [0-2]
281 int main_gfx_id_ = 0; // Main Gfx ID
283
284 uint16_t message_id_ = 0;
285 uint8_t area_graphics_ = 0;
286 uint8_t area_palette_ = 0;
287 uint8_t main_palette_ = 0; // Custom Overworld Main Palette ID
288 uint8_t animated_gfx_ = 0; // Custom Overworld Animated ID
289 uint16_t subscreen_overlay_ = 0; // Custom Overworld Subscreen Overlay ID
291 0; // Custom Overworld Area-Specific Background Color
292
293 std::array<uint8_t, 8> custom_gfx_ids_;
294 std::array<uint8_t, 3> sprite_graphics_;
295 std::array<uint8_t, 3> sprite_palette_;
296 std::array<uint8_t, 4> area_music_;
297 std::array<uint8_t, 16> static_graphics_;
298
299 std::array<bool, 4> mosaic_expanded_;
300
301 // Overlay support (interactive overlays that reveal holes/change elements)
302 uint16_t overlay_id_ = 0;
303 bool has_overlay_ = false;
304 std::vector<uint8_t> overlay_data_;
305
306 std::vector<uint8_t> current_blockset_;
307 std::vector<uint8_t> current_gfx_;
308 std::vector<uint8_t> bitmap_data_;
309
312};
313
314} // namespace zelda3
315} // namespace yaze
316
317#endif
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:71
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 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_
const std::array< bool, 4 > & mosaic_expanded() const
void SetAsSmallMap(int index=-1)
auto set_message_id(uint16_t value)
auto set_sprite_palette(int i, uint8_t value)
void set_custom_tileset(int index, uint8_t value)
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
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_subscreen_overlay(uint16_t overlay)
std::vector< uint8_t > overlay_data_
auto area_specific_bg_color() const
auto sprite_palette(int i) const
gfx::SnesPalette current_palette_
void ProcessGraphicsBuffer(int index, int static_graphics_offset, int size, uint8_t *all_gfx)
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
constexpr int kOverlayPointersBank
constexpr int transition_target_westExpanded
constexpr int OverworldCustomASMHasBeenApplied
constexpr int kOverworldSpecialPALGroup
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
std::vector< std::vector< uint16_t > > OverworldBlockset
Represents tile32 data for the overworld.
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
Main namespace for the application.
Represents a group of palettes.
Overworld map tile32 data.