yaze 0.2.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
room_entrance.h
Go to the documentation of this file.
1#ifndef YAZE_APP_ZELDA3_DUNGEON_ROOM_ENTRANCE_H
2#define YAZE_APP_ZELDA3_DUNGEON_ROOM_ENTRANCE_H
3
4#include <cstdint>
5
6#include "app/rom.h"
7
8namespace yaze {
9namespace zelda3 {
10
11// 0x14577 word value for each room
12constexpr int kEntranceRoom = 0x14813;
13
14// 8 bytes per room, HU, FU, HD, FD, HL, FL, HR, FR
15constexpr int kEntranceScrollEdge = 0x1491D; // 0x14681
16constexpr int kEntranceYScroll = 0x14D45; // 0x14AA9 2 bytes each room
17constexpr int kEntranceXScroll = 0x14E4F; // 0x14BB3 2 bytes
18constexpr int kEntranceYPosition = 0x14F59; // 0x14CBD 2bytes
19constexpr int kEntranceXPosition = 0x15063; // 0x14DC7 2bytes
20constexpr int kEntranceCameraYTrigger = 0x1516D; // 0x14ED1 2bytes
21constexpr int kEntranceCameraXTrigger = 0x15277; // 0x14FDB 2bytes
22
23constexpr int kEntranceBlockset = 0x15381; // 0x150E5 1byte
24constexpr int kEntranceFloor = 0x15406; // 0x1516A 1byte
25constexpr int kEntranceDungeon = 0x1548B; // 0x151EF 1byte (dungeon id)
26constexpr int kEntranceDoor = 0x15510; // 0x15274 1byte
27
28// 1 byte, ---b ---a b = bg2, a = need to check
29constexpr int kEntranceLadderBG = 0x15595; // 0x152F9
30constexpr int kEntrancescrolling = 0x1561A; // 0x1537E 1byte --h- --v-
31constexpr int kEntranceScrollQuadrant = 0x1569F; // 0x15403 1byte
32constexpr int kEntranceExit = 0x15724; // 0x15488 2byte word
33constexpr int kEntranceMusic = 0x1582E; // 0x15592
34
35// word value for each room
36constexpr int kStartingEntranceroom = 0x15B6E; // 0x158D2
37
38// 8 bytes per room, HU, FU, HD, FD, HL, FL, HR, FR
39constexpr int kStartingEntranceScrollEdge = 0x15B7C; // 0x158E0
40constexpr int kStartingEntranceYScroll = 0x15BB4; // 0x14AA9 //2bytes each room
41constexpr int kStartingEntranceXScroll = 0x15BC2; // 0x14BB3 //2bytes
42constexpr int kStartingEntranceYPosition = 0x15BD0; // 0x14CBD 2bytes
43constexpr int kStartingEntranceXPosition = 0x15BDE; // 0x14DC7 2bytes
44constexpr int kStartingEntranceCameraYTrigger = 0x15BEC; // 0x14ED1 2bytes
45constexpr int kStartingEntranceCameraXTrigger = 0x15BFA; // 0x14FDB 2bytes
46
47constexpr int kStartingEntranceBlockset = 0x15C08; // 0x150E5 1byte
48constexpr int kStartingEntranceFloor = 0x15C0F; // 0x1516A 1byte
49constexpr int kStartingEntranceDungeon = 0x15C16; // 0x151EF 1byte (dungeon id)
50
51constexpr int kStartingEntranceDoor = 0x15C2B; // 0x15274 1byte
52
53// 1 byte, ---b ---a b = bg2, a = need to check
54constexpr int kStartingEntranceLadderBG = 0x15C1D; // 0x152F9
55// 1byte --h- --v-
56constexpr int kStartingEntrancescrolling = 0x15C24; // 0x1537E
57constexpr int kStartingEntranceScrollQuadrant = 0x15C2B; // 0x15403 1byte
58constexpr int kStartingEntranceexit = 0x15C32; // 0x15488 //2byte word
59constexpr int kStartingEntrancemusic = 0x15C4E; // 0x15592
60constexpr int kStartingEntranceentrance = 0x15C40;
61
62constexpr int items_data_start = 0xDDE9; // save purpose
63constexpr int items_data_end = 0xE6B2; // save purpose
64constexpr int initial_equipement = 0x271A6;
65
66// item id you get instead if you already have that item
67constexpr int chests_backupitems = 0x3B528;
68constexpr int chests_yoffset = 0x4836C;
69constexpr int chests_xoffset = 0x4836C + (76 * 1);
70constexpr int chests_itemsgfx = 0x4836C + (76 * 2);
71constexpr int chests_itemswide = 0x4836C + (76 * 3);
72constexpr int chests_itemsproperties = 0x4836C + (76 * 4);
73constexpr int chests_sramaddress = 0x4836C + (76 * 5);
74constexpr int chests_sramvalue = 0x4836C + (76 * 7);
75constexpr int chests_msgid = 0x442DD;
76
77constexpr int dungeons_startrooms = 0x7939;
78constexpr int dungeons_endrooms = 0x792D;
79constexpr int dungeons_bossrooms = 0x10954; // short value
80
81// Bed Related Values (Starting location)
82constexpr int bedPositionX = 0x039A37; // short value
83constexpr int bedPositionY = 0x039A32; // short value
84
85// short value (on 2 different bytes)
86constexpr int bedPositionResetXLow = 0x02DE53;
87constexpr int bedPositionResetXHigh = 0x02DE58;
88
89// short value (on 2 different bytes)
90constexpr int bedPositionResetYLow = 0x02DE5D;
91constexpr int bedPositionResetYHigh = 0x02DE62;
92
93constexpr int bedSheetPositionX = 0x0480BD; // short value
94constexpr int bedSheetPositionY = 0x0480B8; // short value
95
100 public:
101 RoomEntrance() = default;
102 RoomEntrance(Rom *rom, uint8_t entrance_id, bool is_spawn_point = false)
103 : entrance_id_(entrance_id) {
104 room_ = static_cast<short>(
105 (rom->data()[kEntranceRoom + (entrance_id * 2) + 1] << 8) +
106 rom->data()[kEntranceRoom + (entrance_id * 2)]);
107 y_position_ = static_cast<uint16_t>(
108 (rom->data()[kEntranceYPosition + (entrance_id * 2) + 1] << 8) +
109 rom->data()[kEntranceYPosition + (entrance_id * 2)]);
110 x_position_ = static_cast<uint16_t>(
111 (rom->data()[kEntranceXPosition + (entrance_id * 2) + 1] << 8) +
112 rom->data()[kEntranceXPosition + (entrance_id * 2)]);
113 camera_x_ = static_cast<uint16_t>(
114 (rom->data()[kEntranceXScroll + (entrance_id * 2) + 1] << 8) +
115 rom->data()[kEntranceXScroll + (entrance_id * 2)]);
116 camera_y_ = static_cast<uint16_t>(
117 (rom->data()[kEntranceYScroll + (entrance_id * 2) + 1] << 8) +
118 rom->data()[kEntranceYScroll + (entrance_id * 2)]);
119 camera_trigger_y_ = static_cast<uint16_t>(
120 (rom->data()[(kEntranceCameraYTrigger + (entrance_id * 2)) + 1] << 8) +
121 rom->data()[kEntranceCameraYTrigger + (entrance_id * 2)]);
122 camera_trigger_x_ = static_cast<uint16_t>(
123 (rom->data()[(kEntranceCameraXTrigger + (entrance_id * 2)) + 1] << 8) +
124 rom->data()[kEntranceCameraXTrigger + (entrance_id * 2)]);
125 blockset_ = rom->data()[kEntranceBlockset + entrance_id];
126 music_ = rom->data()[kEntranceMusic + entrance_id];
127 dungeon_id_ = rom->data()[kEntranceDungeon + entrance_id];
128 floor_ = rom->data()[kEntranceFloor + entrance_id];
129 door_ = rom->data()[kEntranceDoor + entrance_id];
130 ladder_bg_ = rom->data()[kEntranceLadderBG + entrance_id];
131 scrolling_ = rom->data()[kEntrancescrolling + entrance_id];
132 scroll_quadrant_ = rom->data()[kEntranceScrollQuadrant + entrance_id];
133 exit_ = static_cast<short>(
134 (rom->data()[kEntranceExit + (entrance_id * 2) + 1] << 8) +
135 rom->data()[kEntranceExit + (entrance_id * 2)]);
136
138 rom->data()[kEntranceScrollEdge + 0 + (entrance_id * 8)];
140 rom->data()[kEntranceScrollEdge + 1 + (entrance_id * 8)];
142 rom->data()[kEntranceScrollEdge + 2 + (entrance_id * 8)];
144 rom->data()[kEntranceScrollEdge + 3 + (entrance_id * 8)];
146 rom->data()[kEntranceScrollEdge + 4 + (entrance_id * 8)];
148 rom->data()[kEntranceScrollEdge + 5 + (entrance_id * 8)];
150 rom->data()[kEntranceScrollEdge + 6 + (entrance_id * 8)];
152 rom->data()[kEntranceScrollEdge + 7 + (entrance_id * 8)];
153
154 if (is_spawn_point) {
155 room_ = static_cast<short>(
156 (rom->data()[kStartingEntranceroom + (entrance_id * 2) + 1] << 8) +
157 rom->data()[kStartingEntranceroom + (entrance_id * 2)]);
158
159 y_position_ = static_cast<uint16_t>(
160 (rom->data()[kStartingEntranceYPosition + (entrance_id * 2) + 1]
161 << 8) +
162 rom->data()[kStartingEntranceYPosition + (entrance_id * 2)]);
163
164 x_position_ = static_cast<uint16_t>(
165 (rom->data()[kStartingEntranceXPosition + (entrance_id * 2) + 1]
166 << 8) +
167 rom->data()[kStartingEntranceXPosition + (entrance_id * 2)]);
168
169 camera_x_ = static_cast<uint16_t>(
170 (rom->data()[kStartingEntranceXScroll + (entrance_id * 2) + 1] << 8) +
171 rom->data()[kStartingEntranceXScroll + (entrance_id * 2)]);
172
173 camera_y_ = static_cast<uint16_t>(
174 (rom->data()[kStartingEntranceYScroll + (entrance_id * 2) + 1] << 8) +
175 rom->data()[kStartingEntranceYScroll + (entrance_id * 2)]);
176
177 camera_trigger_y_ = static_cast<uint16_t>(
178 (rom->data()[kStartingEntranceCameraYTrigger + (entrance_id * 2) + 1]
179 << 8) +
180 rom->data()[kStartingEntranceCameraYTrigger + (entrance_id * 2)]);
181
182 camera_trigger_x_ = static_cast<uint16_t>(
183 (rom->data()[kStartingEntranceCameraXTrigger + (entrance_id * 2) + 1]
184 << 8) +
185 rom->data()[kStartingEntranceCameraXTrigger + (entrance_id * 2)]);
186
187 blockset_ = rom->data()[kStartingEntranceBlockset + entrance_id];
188 music_ = rom->data()[kStartingEntrancemusic + entrance_id];
189 dungeon_id_ = rom->data()[kStartingEntranceDungeon + entrance_id];
190 floor_ = rom->data()[kStartingEntranceFloor + entrance_id];
191 door_ = rom->data()[kStartingEntranceDoor + entrance_id];
192
193 ladder_bg_ = rom->data()[kStartingEntranceLadderBG + entrance_id];
194 scrolling_ = rom->data()[kStartingEntrancescrolling + entrance_id];
196 rom->data()[kStartingEntranceScrollQuadrant + entrance_id];
197
198 exit_ = static_cast<short>(
199 ((rom->data()[kStartingEntranceexit + (entrance_id * 2) + 1] & 0x01)
200 << 8) +
201 rom->data()[kStartingEntranceexit + (entrance_id * 2)]);
202
204 rom->data()[kStartingEntranceScrollEdge + 0 + (entrance_id * 8)];
206 rom->data()[kStartingEntranceScrollEdge + 1 + (entrance_id * 8)];
208 rom->data()[kStartingEntranceScrollEdge + 2 + (entrance_id * 8)];
210 rom->data()[kStartingEntranceScrollEdge + 3 + (entrance_id * 8)];
212 rom->data()[kStartingEntranceScrollEdge + 4 + (entrance_id * 8)];
214 rom->data()[kStartingEntranceScrollEdge + 5 + (entrance_id * 8)];
216 rom->data()[kStartingEntranceScrollEdge + 6 + (entrance_id * 8)];
218 rom->data()[kStartingEntranceScrollEdge + 7 + (entrance_id * 8)];
219 }
220 }
221
222 absl::Status Save(Rom *rom, int entrance_id, bool is_spawn_point = false) {
223 if (!is_spawn_point) {
225 rom->WriteShort(kEntranceYPosition + (entrance_id * 2), y_position_));
227 rom->WriteShort(kEntranceXPosition + (entrance_id * 2), x_position_));
229 rom->WriteShort(kEntranceYScroll + (entrance_id * 2), camera_y_));
231 rom->WriteShort(kEntranceXScroll + (entrance_id * 2), camera_x_));
233 kEntranceCameraXTrigger + (entrance_id * 2), camera_trigger_x_));
235 kEntranceCameraYTrigger + (entrance_id * 2), camera_trigger_y_));
237 rom->WriteShort(kEntranceExit + (entrance_id * 2), exit_));
239 (uint8_t)(blockset_ & 0xFF)));
240 RETURN_IF_ERROR(rom->WriteByte(kEntranceMusic + entrance_id,
241 (uint8_t)(music_ & 0xFF)));
242 RETURN_IF_ERROR(rom->WriteByte(kEntranceDungeon + entrance_id,
243 (uint8_t)(dungeon_id_ & 0xFF)));
245 rom->WriteByte(kEntranceDoor + entrance_id, (uint8_t)(door_ & 0xFF)));
246 RETURN_IF_ERROR(rom->WriteByte(kEntranceFloor + entrance_id,
247 (uint8_t)(floor_ & 0xFF)));
249 (uint8_t)(ladder_bg_ & 0xFF)));
251 (uint8_t)(scrolling_ & 0xFF)));
253 (uint8_t)(scroll_quadrant_ & 0xFF)));
255 kEntranceScrollEdge + 0 + (entrance_id * 8), camera_boundary_qn_));
257 kEntranceScrollEdge + 1 + (entrance_id * 8), camera_boundary_fn_));
259 kEntranceScrollEdge + 2 + (entrance_id * 8), camera_boundary_qs_));
261 kEntranceScrollEdge + 3 + (entrance_id * 8), camera_boundary_fs_));
263 kEntranceScrollEdge + 4 + (entrance_id * 8), camera_boundary_qw_));
265 kEntranceScrollEdge + 5 + (entrance_id * 8), camera_boundary_fw_));
267 kEntranceScrollEdge + 6 + (entrance_id * 8), camera_boundary_qe_));
269 kEntranceScrollEdge + 7 + (entrance_id * 8), camera_boundary_fe_));
270 } else {
272 rom->WriteShort(kStartingEntranceroom + (entrance_id * 2), room_));
274 kStartingEntranceYPosition + (entrance_id * 2), y_position_));
276 kStartingEntranceXPosition + (entrance_id * 2), x_position_));
278 kStartingEntranceYScroll + (entrance_id * 2), camera_y_));
280 kStartingEntranceXScroll + (entrance_id * 2), camera_x_));
282 rom->WriteShort(kStartingEntranceCameraXTrigger + (entrance_id * 2),
285 rom->WriteShort(kStartingEntranceCameraYTrigger + (entrance_id * 2),
288 rom->WriteShort(kStartingEntranceexit + (entrance_id * 2), exit_));
290 (uint8_t)(blockset_ & 0xFF)));
292 (uint8_t)(music_ & 0xFF)));
294 (uint8_t)(dungeon_id_ & 0xFF)));
296 (uint8_t)(door_ & 0xFF)));
298 (uint8_t)(floor_ & 0xFF)));
300 (uint8_t)(ladder_bg_ & 0xFF)));
302 (uint8_t)(scrolling_ & 0xFF)));
305 (uint8_t)(scroll_quadrant_ & 0xFF)));
307 rom->WriteByte(kStartingEntranceScrollEdge + 0 + (entrance_id * 8),
310 rom->WriteByte(kStartingEntranceScrollEdge + 1 + (entrance_id * 8),
313 rom->WriteByte(kStartingEntranceScrollEdge + 2 + (entrance_id * 8),
316 rom->WriteByte(kStartingEntranceScrollEdge + 3 + (entrance_id * 8),
319 rom->WriteByte(kStartingEntranceScrollEdge + 4 + (entrance_id * 8),
322 rom->WriteByte(kStartingEntranceScrollEdge + 5 + (entrance_id * 8),
325 rom->WriteByte(kStartingEntranceScrollEdge + 6 + (entrance_id * 8),
328 rom->WriteByte(kStartingEntranceScrollEdge + 7 + (entrance_id * 8),
330 }
331 return absl::OkStatus();
332 }
333
334 uint16_t entrance_id_;
335 uint16_t x_position_;
336 uint16_t y_position_;
337 uint16_t camera_x_;
338 uint16_t camera_y_;
341
342 int16_t room_;
343 uint8_t blockset_;
344 uint8_t floor_;
345 uint8_t dungeon_id_;
346 uint8_t ladder_bg_;
347 uint8_t scrolling_;
349 int16_t exit_;
350 uint8_t music_;
351 uint8_t door_;
352
361};
362
363} // namespace zelda3
364} // namespace yaze
365
366#endif // YAZE_APP_ZELDA3_DUNGEON_ROOM_ENTRANCE_H
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:58
absl::Status WriteByte(int addr, uint8_t value)
Definition rom.cc:582
auto data() const
Definition rom.h:177
absl::Status WriteShort(int addr, uint16_t value)
Definition rom.cc:605
absl::Status Save(Rom *rom, int entrance_id, bool is_spawn_point=false)
RoomEntrance(Rom *rom, uint8_t entrance_id, bool is_spawn_point=false)
#define RETURN_IF_ERROR(expression)
Definition macro.h:51
Zelda 3 specific classes and functions.
constexpr int bedPositionResetXLow
constexpr int kStartingEntranceLadderBG
constexpr int bedSheetPositionX
constexpr int kEntranceCameraXTrigger
constexpr int kEntranceRoom
constexpr int dungeons_startrooms
constexpr int kStartingEntranceXScroll
constexpr int kEntranceDoor
constexpr int kEntranceXScroll
constexpr int bedPositionResetXHigh
constexpr int items_data_start
constexpr int bedPositionResetYHigh
constexpr int kStartingEntranceentrance
constexpr int bedPositionResetYLow
constexpr int kStartingEntranceScrollQuadrant
constexpr int bedPositionY
constexpr int kStartingEntrancescrolling
constexpr int initial_equipement
constexpr int kEntranceExit
constexpr int chests_msgid
constexpr int chests_itemsgfx
constexpr int chests_sramvalue
constexpr int chests_backupitems
constexpr int kStartingEntranceBlockset
constexpr int chests_xoffset
constexpr int kEntranceFloor
constexpr int kStartingEntrancemusic
constexpr int kStartingEntranceCameraYTrigger
constexpr int kStartingEntranceFloor
constexpr int bedPositionX
constexpr int kStartingEntranceYPosition
constexpr int kStartingEntranceXPosition
constexpr int kEntranceCameraYTrigger
constexpr int kEntranceBlockset
constexpr int kEntranceXPosition
constexpr int kEntranceLadderBG
constexpr int kStartingEntranceCameraXTrigger
constexpr int dungeons_endrooms
constexpr int kEntranceMusic
constexpr int kStartingEntranceroom
constexpr int chests_itemsproperties
constexpr int kStartingEntranceScrollEdge
constexpr int chests_sramaddress
constexpr int kEntranceScrollEdge
constexpr int kEntranceDungeon
constexpr int kStartingEntranceDoor
constexpr int dungeons_bossrooms
constexpr int kEntranceScrollQuadrant
constexpr int kEntrancescrolling
constexpr int kStartingEntranceDungeon
constexpr int chests_yoffset
constexpr int kStartingEntranceexit
constexpr int kEntranceYScroll
constexpr int chests_itemswide
constexpr int kStartingEntranceYScroll
constexpr int items_data_end
constexpr int bedSheetPositionY
constexpr int kEntranceYPosition
Main namespace for the application.
Definition controller.cc:18