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_ =
105 static_cast<short>((rom[kEntranceRoom + (entrance_id * 2) + 1] << 8) +
106 rom[kEntranceRoom + (entrance_id * 2)]);
107 y_position_ = static_cast<uint16_t>(
108 (rom[kEntranceYPosition + (entrance_id * 2) + 1] << 8) +
109 rom[kEntranceYPosition + (entrance_id * 2)]);
110 x_position_ = static_cast<uint16_t>(
111 (rom[kEntranceXPosition + (entrance_id * 2) + 1] << 8) +
112 rom[kEntranceXPosition + (entrance_id * 2)]);
113 camera_x_ = static_cast<uint16_t>(
114 (rom[kEntranceXScroll + (entrance_id * 2) + 1] << 8) +
115 rom[kEntranceXScroll + (entrance_id * 2)]);
116 camera_y_ = static_cast<uint16_t>(
117 (rom[kEntranceYScroll + (entrance_id * 2) + 1] << 8) +
118 rom[kEntranceYScroll + (entrance_id * 2)]);
119 camera_trigger_y_ = static_cast<uint16_t>(
120 (rom[(kEntranceCameraYTrigger + (entrance_id * 2)) + 1] << 8) +
121 rom[kEntranceCameraYTrigger + (entrance_id * 2)]);
122 camera_trigger_x_ = static_cast<uint16_t>(
123 (rom[(kEntranceCameraXTrigger + (entrance_id * 2)) + 1] << 8) +
124 rom[kEntranceCameraXTrigger + (entrance_id * 2)]);
125 blockset_ = rom[kEntranceBlockset + entrance_id];
126 music_ = rom[kEntranceMusic + entrance_id];
127 dungeon_id_ = rom[kEntranceDungeon + entrance_id];
128 floor_ = rom[kEntranceFloor + entrance_id];
129 door_ = rom[kEntranceDoor + entrance_id];
130 ladder_bg_ = rom[kEntranceLadderBG + entrance_id];
131 scrolling_ = rom[kEntrancescrolling + entrance_id];
132 scroll_quadrant_ = rom[kEntranceScrollQuadrant + entrance_id];
133 exit_ =
134 static_cast<short>((rom[kEntranceExit + (entrance_id * 2) + 1] << 8) +
135 rom[kEntranceExit + (entrance_id * 2)]);
136
137 camera_boundary_qn_ = rom[kEntranceScrollEdge + 0 + (entrance_id * 8)];
138 camera_boundary_fn_ = rom[kEntranceScrollEdge + 1 + (entrance_id * 8)];
139 camera_boundary_qs_ = rom[kEntranceScrollEdge + 2 + (entrance_id * 8)];
140 camera_boundary_fs_ = rom[kEntranceScrollEdge + 3 + (entrance_id * 8)];
141 camera_boundary_qw_ = rom[kEntranceScrollEdge + 4 + (entrance_id * 8)];
142 camera_boundary_fw_ = rom[kEntranceScrollEdge + 5 + (entrance_id * 8)];
143 camera_boundary_qe_ = rom[kEntranceScrollEdge + 6 + (entrance_id * 8)];
144 camera_boundary_fe_ = rom[kEntranceScrollEdge + 7 + (entrance_id * 8)];
145
146 if (is_spawn_point) {
147 room_ = static_cast<short>(
148 (rom[kStartingEntranceroom + (entrance_id * 2) + 1] << 8) +
149 rom[kStartingEntranceroom + (entrance_id * 2)]);
150
151 y_position_ = static_cast<uint16_t>(
152 (rom[kStartingEntranceYPosition + (entrance_id * 2) + 1] << 8) +
153 rom[kStartingEntranceYPosition + (entrance_id * 2)]);
154
155 x_position_ = static_cast<uint16_t>(
156 (rom[kStartingEntranceXPosition + (entrance_id * 2) + 1] << 8) +
157 rom[kStartingEntranceXPosition + (entrance_id * 2)]);
158
159 camera_x_ = static_cast<uint16_t>(
160 (rom[kStartingEntranceXScroll + (entrance_id * 2) + 1] << 8) +
161 rom[kStartingEntranceXScroll + (entrance_id * 2)]);
162
163 camera_y_ = static_cast<uint16_t>(
164 (rom[kStartingEntranceYScroll + (entrance_id * 2) + 1] << 8) +
165 rom[kStartingEntranceYScroll + (entrance_id * 2)]);
166
167 camera_trigger_y_ = static_cast<uint16_t>(
168 (rom[kStartingEntranceCameraYTrigger + (entrance_id * 2) + 1] << 8) +
169 rom[kStartingEntranceCameraYTrigger + (entrance_id * 2)]);
170
171 camera_trigger_x_ = static_cast<uint16_t>(
172 (rom[kStartingEntranceCameraXTrigger + (entrance_id * 2) + 1] << 8) +
173 rom[kStartingEntranceCameraXTrigger + (entrance_id * 2)]);
174
175 blockset_ = rom[kStartingEntranceBlockset + entrance_id];
176 music_ = rom[kStartingEntrancemusic + entrance_id];
177 dungeon_id_ = rom[kStartingEntranceDungeon + entrance_id];
178 floor_ = rom[kStartingEntranceFloor + entrance_id];
179 door_ = rom[kStartingEntranceDoor + entrance_id];
180
181 ladder_bg_ = rom[kStartingEntranceLadderBG + entrance_id];
182 scrolling_ = rom[kStartingEntrancescrolling + entrance_id];
184
185 exit_ = static_cast<short>(
186 ((rom[kStartingEntranceexit + (entrance_id * 2) + 1] & 0x01) << 8) +
187 rom[kStartingEntranceexit + (entrance_id * 2)]);
188
190 rom[kStartingEntranceScrollEdge + 0 + (entrance_id * 8)];
192 rom[kStartingEntranceScrollEdge + 1 + (entrance_id * 8)];
194 rom[kStartingEntranceScrollEdge + 2 + (entrance_id * 8)];
196 rom[kStartingEntranceScrollEdge + 3 + (entrance_id * 8)];
198 rom[kStartingEntranceScrollEdge + 4 + (entrance_id * 8)];
200 rom[kStartingEntranceScrollEdge + 5 + (entrance_id * 8)];
202 rom[kStartingEntranceScrollEdge + 6 + (entrance_id * 8)];
204 rom[kStartingEntranceScrollEdge + 7 + (entrance_id * 8)];
205 }
206 }
207
208 absl::Status Save(Rom &rom, int entrance_id, bool is_spawn_point = false) {
209 if (!is_spawn_point) {
211 rom.WriteShort(kEntranceYPosition + (entrance_id * 2), y_position_));
213 rom.WriteShort(kEntranceXPosition + (entrance_id * 2), x_position_));
215 rom.WriteShort(kEntranceYScroll + (entrance_id * 2), camera_y_));
217 rom.WriteShort(kEntranceXScroll + (entrance_id * 2), camera_x_));
219 kEntranceCameraXTrigger + (entrance_id * 2), camera_trigger_x_));
221 kEntranceCameraYTrigger + (entrance_id * 2), camera_trigger_y_));
222 RETURN_IF_ERROR(rom.WriteShort(kEntranceExit + (entrance_id * 2), exit_));
224 (uint8_t)(blockset_ & 0xFF)));
226 rom.WriteByte(kEntranceMusic + entrance_id, (uint8_t)(music_ & 0xFF)));
228 (uint8_t)(dungeon_id_ & 0xFF)));
230 rom.WriteByte(kEntranceDoor + entrance_id, (uint8_t)(door_ & 0xFF)));
232 rom.WriteByte(kEntranceFloor + entrance_id, (uint8_t)(floor_ & 0xFF)));
234 (uint8_t)(ladder_bg_ & 0xFF)));
236 (uint8_t)(scrolling_ & 0xFF)));
238 (uint8_t)(scroll_quadrant_ & 0xFF)));
239 RETURN_IF_ERROR(rom.WriteByte(kEntranceScrollEdge + 0 + (entrance_id * 8),
241 RETURN_IF_ERROR(rom.WriteByte(kEntranceScrollEdge + 1 + (entrance_id * 8),
243 RETURN_IF_ERROR(rom.WriteByte(kEntranceScrollEdge + 2 + (entrance_id * 8),
245 RETURN_IF_ERROR(rom.WriteByte(kEntranceScrollEdge + 3 + (entrance_id * 8),
247 RETURN_IF_ERROR(rom.WriteByte(kEntranceScrollEdge + 4 + (entrance_id * 8),
249 RETURN_IF_ERROR(rom.WriteByte(kEntranceScrollEdge + 5 + (entrance_id * 8),
251 RETURN_IF_ERROR(rom.WriteByte(kEntranceScrollEdge + 6 + (entrance_id * 8),
253 RETURN_IF_ERROR(rom.WriteByte(kEntranceScrollEdge + 7 + (entrance_id * 8),
255 } else {
257 rom.WriteShort(kStartingEntranceroom + (entrance_id * 2), room_));
259 kStartingEntranceYPosition + (entrance_id * 2), y_position_));
261 kStartingEntranceXPosition + (entrance_id * 2), x_position_));
263 kStartingEntranceYScroll + (entrance_id * 2), camera_y_));
265 kStartingEntranceXScroll + (entrance_id * 2), camera_x_));
267 rom.WriteShort(kStartingEntranceCameraXTrigger + (entrance_id * 2),
270 rom.WriteShort(kStartingEntranceCameraYTrigger + (entrance_id * 2),
273 rom.WriteShort(kStartingEntranceexit + (entrance_id * 2), exit_));
275 (uint8_t)(blockset_ & 0xFF)));
277 (uint8_t)(music_ & 0xFF)));
279 (uint8_t)(dungeon_id_ & 0xFF)));
281 (uint8_t)(door_ & 0xFF)));
283 (uint8_t)(floor_ & 0xFF)));
285 (uint8_t)(ladder_bg_ & 0xFF)));
287 (uint8_t)(scrolling_ & 0xFF)));
289 (uint8_t)(scroll_quadrant_ & 0xFF)));
291 rom.WriteByte(kStartingEntranceScrollEdge + 0 + (entrance_id * 8),
294 rom.WriteByte(kStartingEntranceScrollEdge + 1 + (entrance_id * 8),
297 rom.WriteByte(kStartingEntranceScrollEdge + 2 + (entrance_id * 8),
300 rom.WriteByte(kStartingEntranceScrollEdge + 3 + (entrance_id * 8),
303 rom.WriteByte(kStartingEntranceScrollEdge + 4 + (entrance_id * 8),
306 rom.WriteByte(kStartingEntranceScrollEdge + 5 + (entrance_id * 8),
309 rom.WriteByte(kStartingEntranceScrollEdge + 6 + (entrance_id * 8),
312 rom.WriteByte(kStartingEntranceScrollEdge + 7 + (entrance_id * 8),
314 }
315 return absl::OkStatus();
316 }
317
318 uint16_t entrance_id_;
319 uint16_t x_position_;
320 uint16_t y_position_;
321 uint16_t camera_x_;
322 uint16_t camera_y_;
325
326 int16_t room_;
327 uint8_t blockset_;
328 uint8_t floor_;
329 uint8_t dungeon_id_;
330 uint8_t ladder_bg_;
331 uint8_t scrolling_;
333 int16_t exit_;
334 uint8_t music_;
335 uint8_t door_;
336
345};
346
347} // namespace zelda3
348} // namespace yaze
349
350#endif // YAZE_APP_ZELDA3_DUNGEON_ROOM_ENTRANCE_H
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:59
absl::Status WriteByte(int addr, uint8_t value)
Definition rom.cc:302
absl::Status WriteShort(int addr, uint16_t value)
Definition rom.cc:325
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:62
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