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