yaze 0.2.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 <vector>
6
7#include "absl/container/flat_hash_map.h"
8#include "absl/status/status.h"
9#include "app/gfx/snes_tile.h"
10#include "app/rom.h"
16
17namespace yaze {
18namespace zelda3 {
19
20constexpr int GravesYTilePos = 0x49968; // short (0x0F entries)
21constexpr int GravesXTilePos = 0x49986; // short (0x0F entries)
22constexpr int GravesTilemapPos = 0x499A4; // short (0x0F entries)
23constexpr int GravesGFX = 0x499C2; // short (0x0F entries)
24constexpr int GravesXPos = 0x4994A; // short (0x0F entries)
25constexpr int GravesYLine = 0x4993A; // short (0x08 entries)
26constexpr int GravesCountOnY = 0x499E0; // Byte 0x09 entries
27constexpr int GraveLinkSpecialHole = 0x46DD9; // short
28constexpr int GraveLinkSpecialStairs = 0x46DE0; // short
29
30constexpr int kOverworldMapPaletteIds = 0x7D1C;
31constexpr int kOverworldSpritePaletteIds = 0x7B41;
32constexpr int kOverworldSpritePaletteGroup = 0x75580;
33constexpr int kOverworldSpriteset = 0x7A41;
34constexpr int kOverworldSpecialGfxGroup = 0x16821;
35constexpr int kOverworldSpecialPalGroup = 0x16831;
36constexpr int kOverworldSpritesBeginning = 0x4C881;
37constexpr int kOverworldSpritesAgahnim = 0x4CA21;
38constexpr int kOverworldSpritesZelda = 0x4C901;
39
40constexpr int kAreaGfxIdPtr = 0x7C9C;
41constexpr int kOverworldMessageIds = 0x3F51D;
42
43constexpr int kOverworldMusicBeginning = 0x14303;
44constexpr int kOverworldMusicZelda = 0x14303 + 0x40;
45constexpr int kOverworldMusicMasterSword = 0x14303 + 0x80;
46constexpr int kOverworldMusicAgahnim = 0x14303 + 0xC0;
47constexpr int kOverworldMusicDarkWorld = 0x14403;
48constexpr int kOverworldEntranceAllowedTilesLeft = 0xDB8C1;
50
51// 0x00 = small maps, 0x20 = large maps
52constexpr int kOverworldMapSize = 0x12844;
53
54// 0x01 = small maps, 0x03 = large maps
55constexpr int kOverworldMapSizeHighByte = 0x12884;
56
57// relative to the WORLD + 0x200 per map
58// large map that are not == parent id = same position as their parent!
59// eg for X position small maps :
60// 0000, 0200, 0400, 0600, 0800, 0A00, 0C00, 0E00
61// all Large map would be :
62// 0000, 0000, 0400, 0400, 0800, 0800, 0C00, 0C00
63constexpr int kOverworldMapParentId = 0x125EC;
64constexpr int kOverworldTransitionPositionY = 0x128C4;
65constexpr int kOverworldTransitionPositionX = 0x12944;
66constexpr int kOverworldScreenSize = 0x1788D;
67constexpr int kOverworldScreenSizeForLoading = 0x4C635;
68
73
74constexpr int kOverworldMapDataOverflow = 0x130000;
75
76constexpr int kTransitionTargetNorth = 0x13EE2;
77constexpr int kTransitionTargetWest = 0x13F62;
78constexpr int overworldCustomMosaicASM = 0x1301D0;
79constexpr int overworldCustomMosaicArray = 0x1301F0;
80
81// Expanded tile16 and tile32
82constexpr int kMap16TilesExpanded = 0x1E8000;
83constexpr int kMap32TileTRExpanded = 0x020000;
84constexpr int kMap32TileBLExpanded = 0x1F0000;
85constexpr int kMap32TileBRExpanded = 0x1F8000;
86constexpr int kMap32TileCountExpanded = 0x0067E0;
87constexpr int kMap32ExpandedFlagPos = 0x01772E; // 0x04
88constexpr int kMap16ExpandedFlagPos = 0x02FD28; // 0x0F
89constexpr int kOverworldEntranceExpandedFlagPos = 0x0DB895; // 0xB8
90
91constexpr int kOverworldCompressedMapPos = 0x058000;
92constexpr int kOverworldCompressedOverflowPos = 0x137FFF;
93
94constexpr int kNumTileTypes = 0x200;
95constexpr int kMap16Tiles = 0x78000;
96constexpr int kNumOverworldMaps = 160;
97constexpr int kNumTile16Individual = 4096;
98constexpr int Map32PerScreen = 256;
99constexpr int NumberOfMap16 = 3752; // 4096
100constexpr int NumberOfMap16Ex = 4096; // 4096
101constexpr int LimitOfMap32 = 8864;
102constexpr int NumberOfOWSprites = 352;
104
111class Overworld : public SharedRom {
112 public:
114
115 absl::Status Load(Rom &rom);
116 absl::Status LoadOverworldMaps();
117 void LoadTileTypes();
118 absl::Status LoadEntrances();
119 absl::Status LoadHoles();
120
121 absl::Status LoadExits();
122 absl::Status LoadItems();
123 absl::Status LoadSprites();
124 absl::Status LoadSpritesFromMap(int sprite_start, int sprite_count,
125 int sprite_index);
126
127 absl::Status Save(Rom &rom);
128 absl::Status SaveOverworldMaps();
129 absl::Status SaveLargeMaps();
130 absl::Status SaveEntrances();
131 absl::Status SaveExits();
132 absl::Status SaveItems();
133
134 absl::Status CreateTile32Tilemap();
135 absl::Status SaveMap16Expanded();
136 absl::Status SaveMap16Tiles();
137 absl::Status SaveMap32Expanded();
138 absl::Status SaveMap32Tiles();
139
140 absl::Status SaveMapProperties();
141
142 void Destroy() {
143 for (auto &map : overworld_maps_) {
144 map.Destroy();
145 }
146 overworld_maps_.clear();
147 all_entrances_.clear();
148 all_exits_.clear();
149 all_items_.clear();
150 for (auto &sprites : all_sprites_) {
151 sprites.clear();
152 }
153 is_loaded_ = false;
154 }
155
156 int GetTileFromPosition(ImVec2 position) const {
157 if (current_world_ == 0) {
158 return map_tiles_.light_world[position.x][position.y];
159 } else if (current_world_ == 1) {
160 return map_tiles_.dark_world[position.x][position.y];
161 } else {
162 return map_tiles_.special_world[position.x][position.y];
163 }
164 }
165
167 switch (world_type) {
168 case 0:
169 return map_tiles_.light_world;
170 case 1:
171 return map_tiles_.dark_world;
172 case 2:
173 return map_tiles_.special_world;
174 default:
175 return map_tiles_.light_world;
176 }
177 }
178
179 auto overworld_maps() const { return overworld_maps_; }
180 auto overworld_map(int i) const { return &overworld_maps_[i]; }
181 auto mutable_overworld_map(int i) { return &overworld_maps_[i]; }
182 auto exits() const { return &all_exits_; }
183 auto mutable_exits() { return &all_exits_; }
184 std::vector<gfx::Tile16> tiles16() const { return tiles16_; }
185 auto mutable_tiles16() { return &tiles16_; }
186 auto sprites(int state) const { return all_sprites_[state]; }
187 auto mutable_sprites(int state) { return &all_sprites_[state]; }
188 auto current_graphics() const {
189 return overworld_maps_[current_map_].current_graphics();
190 }
191 auto &entrances() { return all_entrances_; }
193 auto &holes() { return all_holes_; }
194 auto mutable_holes() { return &all_holes_; }
195 auto deleted_entrances() const { return deleted_entrances_; }
197 auto current_area_palette() const {
198 return overworld_maps_[current_map_].current_palette();
199 }
201 return overworld_maps_[current_map_].bitmap_data();
202 }
203 auto tile16_blockset_data() const {
204 return overworld_maps_[current_map_].current_tile16_blockset();
205 }
206 auto is_loaded() const { return is_loaded_; }
207 void set_current_map(int i) { current_map_ = i; }
208 auto map_tiles() const { return map_tiles_; }
209 auto mutable_map_tiles() { return &map_tiles_; }
210 auto all_items() const { return all_items_; }
211 auto mutable_all_items() { return &all_items_; }
212 auto all_tiles_types() const { return all_tiles_types_; }
214
215 private:
222
223 void FetchLargeMaps();
224 absl::StatusOr<uint16_t> GetTile16ForTile32(int index, int quadrant,
225 int dimension,
226 const uint32_t *map32address);
227 absl::Status AssembleMap32Tiles();
228 absl::Status AssembleMap16Tiles();
229 void AssignWorldTiles(int x, int y, int sx, int sy, int tpos,
230 OverworldBlockset &world);
231 void OrganizeMapTiles(std::vector<uint8_t> &bytes,
232 std::vector<uint8_t> &bytes2, int i, int sx, int sy,
233 int &ttpos);
235
237
238 bool is_loaded_ = false;
239 bool expanded_tile16_ = false;
240 bool expanded_tile32_ = false;
242
243 int game_state_ = 0;
246
248
249 std::vector<OverworldMap> overworld_maps_;
250 std::vector<OverworldEntrance> all_entrances_;
251 std::vector<OverworldEntrance> all_holes_;
252 std::vector<OverworldExit> all_exits_;
253 std::vector<OverworldItem> all_items_;
254
255 std::vector<gfx::Tile16> tiles16_;
256 std::vector<gfx::Tile32> tiles32_;
257 std::vector<gfx::Tile32> tiles32_unique_;
258
259 std::vector<uint16_t> tiles32_list_;
260 std::vector<uint64_t> deleted_entrances_;
261
262 std::array<uint8_t, kNumOverworldMaps> map_parent_ = {0};
263 std::array<uint8_t, kNumTileTypes> all_tiles_types_ = {0};
264 std::array<std::vector<Sprite>, 3> all_sprites_;
265 std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p1;
266 std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p2;
267 std::array<int, kNumOverworldMaps> map_pointers1_id;
268 std::array<int, kNumOverworldMaps> map_pointers2_id;
269 std::array<int, kNumOverworldMaps> map_pointers1;
270 std::array<int, kNumOverworldMaps> map_pointers2;
271
272 std::vector<absl::flat_hash_map<uint16_t, int>> usage_stats_;
273};
274
275} // namespace zelda3
276} // namespace yaze
277
278#endif
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:59
auto rom()
Definition rom.h:383
SharedRom()=default
std::vector< uint64_t > deleted_entrances_
Definition overworld.h:260
absl::Status SaveMap32Expanded()
auto tile16_blockset_data() const
Definition overworld.h:203
absl::Status LoadExits()
Definition overworld.cc:359
auto current_area_palette() const
Definition overworld.h:197
std::vector< uint16_t > tiles32_list_
Definition overworld.h:259
int GetTileFromPosition(ImVec2 position) const
Definition overworld.h:156
absl::Status Load(Rom &rom)
Definition overworld.cc:20
std::vector< OverworldItem > all_items_
Definition overworld.h:253
void OrganizeMapTiles(std::vector< uint8_t > &bytes, std::vector< uint8_t > &bytes2, int i, int sx, int sy, int &ttpos)
Definition overworld.cc:202
std::array< int, kNumOverworldMaps > map_pointers1
Definition overworld.h:269
std::vector< gfx::Tile32 > tiles32_unique_
Definition overworld.h:257
auto deleted_entrances() const
Definition overworld.h:195
absl::Status SaveMapProperties()
absl::Status SaveMap32Tiles()
std::vector< OverworldEntrance > all_entrances_
Definition overworld.h:250
OverworldMapTiles map_tiles_
Definition overworld.h:247
absl::Status SaveMap16Tiles()
std::vector< gfx::Tile16 > tiles16() const
Definition overworld.h:184
auto sprites(int state) const
Definition overworld.h:186
auto map_tiles() const
Definition overworld.h:208
absl::Status SaveLargeMaps()
Definition overworld.cc:674
auto all_items() const
Definition overworld.h:210
std::array< uint8_t, kNumOverworldMaps > map_parent_
Definition overworld.h:262
void AssignWorldTiles(int x, int y, int sx, int sy, int tpos, OverworldBlockset &world)
Definition overworld.cc:190
auto is_loaded() const
Definition overworld.h:206
std::array< uint8_t, kNumTileTypes > all_tiles_types_
Definition overworld.h:263
auto current_graphics() const
Definition overworld.h:188
absl::Status CreateTile32Tilemap()
std::array< int, kNumOverworldMaps > map_pointers1_id
Definition overworld.h:267
auto overworld_map(int i) const
Definition overworld.h:180
absl::Status Save(Rom &rom)
Definition overworld.cc:524
auto all_tiles_types() const
Definition overworld.h:212
void set_current_map(int i)
Definition overworld.h:207
absl::Status LoadItems()
Definition overworld.cc:416
auto mutable_overworld_map(int i)
Definition overworld.h:181
absl::Status SaveEntrances()
absl::Status SaveExits()
absl::Status LoadSprites()
Definition overworld.cc:466
absl::Status LoadHoles()
Definition overworld.cc:339
std::vector< OverworldMap > overworld_maps_
Definition overworld.h:249
absl::Status SaveItems()
absl::Status LoadEntrances()
Definition overworld.cc:304
std::vector< gfx::Tile32 > tiles32_
Definition overworld.h:256
absl::Status SaveOverworldMaps()
Definition overworld.cc:536
std::array< std::vector< Sprite >, 3 > all_sprites_
Definition overworld.h:264
std::array< int, kNumOverworldMaps > map_pointers2_id
Definition overworld.h:268
absl::Status LoadOverworldMaps()
Definition overworld.cc:272
std::vector< gfx::Tile16 > tiles16_
Definition overworld.h:255
absl::Status AssembleMap16Tiles()
Definition overworld.cc:162
std::vector< absl::flat_hash_map< uint16_t, int > > usage_stats_
Definition overworld.h:272
auto mutable_sprites(int state)
Definition overworld.h:187
absl::Status LoadSpritesFromMap(int sprite_start, int sprite_count, int sprite_index)
Definition overworld.cc:485
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p1
Definition overworld.h:265
absl::Status SaveMap16Expanded()
std::vector< OverworldExit > all_exits_
Definition overworld.h:252
std::array< int, kNumOverworldMaps > map_pointers2
Definition overworld.h:270
absl::StatusOr< uint16_t > GetTile16ForTile32(int index, int quadrant, int dimension, const uint32_t *map32address)
Definition overworld.cc:98
auto current_map_bitmap_data() const
Definition overworld.h:200
std::array< std::vector< uint8_t >, kNumOverworldMaps > map_data_p2
Definition overworld.h:266
absl::Status AssembleMap32Tiles()
Definition overworld.cc:110
OverworldBlockset & GetMapTiles(int world_type)
Definition overworld.h:166
auto overworld_maps() const
Definition overworld.h:179
std::vector< OverworldEntrance > all_holes_
Definition overworld.h:251
Zelda 3 specific classes and functions.
constexpr int GravesGFX
Definition overworld.h:23
constexpr int kAreaGfxIdPtr
Definition overworld.h:40
constexpr int kOverworldSpritePaletteGroup
Definition overworld.h:32
constexpr int kOverworldTransitionPositionY
Definition overworld.h:64
constexpr int kOverworldSpriteset
Definition overworld.h:33
constexpr int kMap16ExpandedFlagPos
Definition overworld.h:88
constexpr int LimitOfMap32
Definition overworld.h:101
constexpr int NumberOfMap16Ex
Definition overworld.h:100
constexpr int kOverworldScreenTileMapChangeByScreen1
Definition overworld.h:69
constexpr int kOverworldMapDataOverflow
Definition overworld.h:74
constexpr int kOverworldMapSizeHighByte
Definition overworld.h:55
constexpr int GravesTilemapPos
Definition overworld.h:22
constexpr int kNumTileTypes
Definition overworld.h:94
constexpr int NumberOfMap32
Definition overworld.h:103
constexpr int kOverworldScreenSize
Definition overworld.h:66
constexpr int kOverworldScreenTileMapChangeByScreen4
Definition overworld.h:72
constexpr int kNumTile16Individual
Definition overworld.h:97
constexpr int GravesCountOnY
Definition overworld.h:26
constexpr int kMap16Tiles
Definition overworld.h:95
constexpr int GravesYLine
Definition overworld.h:25
constexpr int kNumOverworldMaps
Definition overworld.h:96
constexpr int GravesXTilePos
Definition overworld.h:21
constexpr int kOverworldMusicBeginning
Definition overworld.h:43
std::vector< std::vector< uint16_t > > OverworldBlockset
Represents tile32 data for the overworld.
constexpr int kMap32TileBLExpanded
Definition overworld.h:84
constexpr int kOverworldTransitionPositionX
Definition overworld.h:65
constexpr int kOverworldMusicDarkWorld
Definition overworld.h:47
constexpr int kOverworldSpecialPalGroup
Definition overworld.h:35
constexpr int kOverworldScreenSizeForLoading
Definition overworld.h:67
constexpr int kOverworldSpritePaletteIds
Definition overworld.h:31
constexpr int kMap32TileBRExpanded
Definition overworld.h:85
constexpr int kMap32TileCountExpanded
Definition overworld.h:86
constexpr int kTransitionTargetWest
Definition overworld.h:77
constexpr int kOverworldMusicAgahnim
Definition overworld.h:46
constexpr int kOverworldSpritesZelda
Definition overworld.h:38
constexpr int kOverworldMapParentId
Definition overworld.h:63
constexpr int GraveLinkSpecialHole
Definition overworld.h:27
constexpr int Map32PerScreen
Definition overworld.h:98
constexpr int GravesXPos
Definition overworld.h:24
constexpr int kMap32ExpandedFlagPos
Definition overworld.h:87
constexpr int overworldCustomMosaicASM
Definition overworld.h:78
constexpr int kOverworldMusicMasterSword
Definition overworld.h:45
constexpr int kOverworldMusicZelda
Definition overworld.h:44
constexpr int kOverworldMessageIds
Definition overworld.h:41
constexpr int NumberOfMap16
Definition overworld.h:99
constexpr int kOverworldMapSize
Definition overworld.h:52
constexpr int kOverworldScreenTileMapChangeByScreen2
Definition overworld.h:70
constexpr int kOverworldCompressedMapPos
Definition overworld.h:91
constexpr int overworldCustomMosaicArray
Definition overworld.h:79
constexpr int kOverworldSpritesBeginning
Definition overworld.h:36
constexpr int kOverworldScreenTileMapChangeByScreen3
Definition overworld.h:71
constexpr int kMap16TilesExpanded
Definition overworld.h:82
constexpr int kOverworldEntranceExpandedFlagPos
Definition overworld.h:89
constexpr int kOverworldSpritesAgahnim
Definition overworld.h:37
constexpr int kTransitionTargetNorth
Definition overworld.h:76
constexpr int kOverworldCompressedOverflowPos
Definition overworld.h:92
constexpr int GravesYTilePos
Definition overworld.h:20
constexpr int NumberOfOWSprites
Definition overworld.h:102
constexpr int kMap32TileTRExpanded
Definition overworld.h:83
constexpr int kOverworldMapPaletteIds
Definition overworld.h:30
constexpr int kOverworldEntranceAllowedTilesLeft
Definition overworld.h:48
constexpr int kOverworldSpecialGfxGroup
Definition overworld.h:34
constexpr int kOverworldEntranceAllowedTilesRight
Definition overworld.h:49
constexpr int GraveLinkSpecialStairs
Definition overworld.h:28
Main namespace for the application.
Definition controller.cc:18
Overworld map tile32 data.