yaze 0.2.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
room_object.h
Go to the documentation of this file.
1#ifndef YAZE_APP_ZELDA3_DUNGEON_ROOM_OBJECT_H
2#define YAZE_APP_ZELDA3_DUNGEON_ROOM_OBJECT_H
3
4#include <cstdint>
5#include <string>
6#include <vector>
7
8#include "app/gfx/snes_tile.h"
9#include "app/rom.h"
11
12namespace yaze {
13namespace zelda3 {
14
16 uint32_t subtype_ptr;
17 uint32_t routine_ptr;
18};
19
20SubtypeInfo FetchSubtypeInfo(uint16_t object_id);
21
23
24enum Sorting {
25 All = 0,
26 Wall = 1,
31 Floors = 32,
33};
34
35enum class ObjectOption {
37 Door = 1,
38 Chest = 2,
39 Block = 4,
40 Torch = 8,
41 Bgr = 16,
42 Stairs = 32
43};
44
49
50constexpr int kRoomObjectSubtype1 = 0x8000; // JP = Same
51constexpr int kRoomObjectSubtype2 = 0x83F0; // JP = Same
52constexpr int kRoomObjectSubtype3 = 0x84F0; // JP = Same
53constexpr int kRoomObjectTileAddress = 0x1B52; // JP = Same
54constexpr int kRoomObjectTileAddressFloor = 0x1B5A; // JP = Same
55
56class RoomObject : public SharedRom {
57 public:
58 enum LayerType { BG1 = 0, BG2 = 1, BG3 = 2 };
59
60 RoomObject(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer = 0)
61 : id_(id),
62 x_(x),
63 y_(y),
64 size_(size),
65 layer_(static_cast<LayerType>(layer)),
66 nx_(x),
67 ny_(y),
68 ox_(x),
69 oy_(y),
70 width_(16),
71 height_(16) {}
72
73 void AddTiles(int nbr, int pos) {
74 for (int i = 0; i < nbr; i++) {
75 ASSIGN_OR_LOG_ERROR(auto tile, rom()->ReadTile16(pos + (i * 2)));
76 tiles_.push_back(tile);
77 }
78 }
79
80 void DrawTile(gfx::Tile16 t, int xx, int yy,
81 std::vector<uint8_t>& current_gfx16,
82 std::vector<uint8_t>& tiles_bg1_buffer,
83 std::vector<uint8_t>& tiles_bg2_buffer,
84 uint16_t tile_under = 0xFFFF);
85
86 auto options() const { return options_; }
88
89 protected:
90 bool all_bgs_ = false;
91 bool lit_ = false;
92
93 int16_t id_;
94 uint8_t x_;
95 uint8_t y_;
96 uint8_t size_;
97 uint8_t nx_;
98 uint8_t ny_;
99 uint8_t ox_;
100 uint8_t oy_;
101 uint8_t z_ = 0;
102 uint8_t previous_size_ = 0;
103
106 int offset_x_ = 0;
107 int offset_y_ = 0;
108
109 std::string name_;
110
111 std::vector<uint8_t> preview_object_data_;
112 std::vector<gfx::Tile16> tiles_;
113
116};
117
118class Subtype1 : public RoomObject {
119 public:
122 std::string name;
124
125 Subtype1(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer,
126 int tile_count)
127 : RoomObject(id, x, y, size, layer), tile_count_(tile_count) {
128 auto rom_data = rom()->data();
129 int pos = kRoomObjectTileAddress +
130 static_cast<int16_t>(
131 (rom_data[kRoomObjectSubtype1 + ((id & 0xFF) * 2) + 1] << 8) +
132 rom_data[kRoomObjectSubtype1 + ((id & 0xFF) * 2)]);
133 AddTiles(tile_count_, pos);
135 }
136
137 void Draw(std::vector<uint8_t>& current_gfx16,
138 std::vector<uint8_t>& tiles_bg1_buffer,
139 std::vector<uint8_t>& tiles_bg2_buffer) {
140 for (int s = 0; s < size_ + (tile_count_ == 8 ? 1 : 0); s++) {
141 for (int i = 0; i < tile_count_; i++) {
142 DrawTile(tiles_[i], ((s * 2)) * 8, (i / 2) * 8, current_gfx16,
143 tiles_bg1_buffer, tiles_bg2_buffer);
144 }
145 }
146 }
147};
148
149class Subtype2 : public RoomObject {
150 public:
151 std::string name;
154
155 Subtype2(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer)
156 : RoomObject(id, x, y, size, layer) {
157 auto rom_data = rom()->data();
158 int pos = kRoomObjectTileAddress +
159 static_cast<int16_t>(
160 (rom_data[kRoomObjectSubtype2 + ((id & 0x7F) * 2) + 1] << 8) +
161 rom_data[kRoomObjectSubtype2 + ((id & 0x7F) * 2)]);
162 AddTiles(8, pos);
164 }
165
166 void Draw(std::vector<uint8_t>& current_gfx16,
167 std::vector<uint8_t>& tiles_bg1_buffer,
168 std::vector<uint8_t>& tiles_bg2_buffer) {
169 for (int i = 0; i < 8; i++) {
170 DrawTile(tiles_[i], x_ * 8, (y_ + i) * 8, current_gfx16, tiles_bg1_buffer,
171 tiles_bg2_buffer);
172 }
173 }
174};
175
176class Subtype3 : public RoomObject {
177 public:
179 std::string name;
181
182 Subtype3(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer)
183 : RoomObject(id, x, y, size, layer) {
184 auto rom_data = rom()->data();
185 int pos = kRoomObjectTileAddress +
186 static_cast<int16_t>(
187 (rom_data[kRoomObjectSubtype3 + ((id & 0xFF) * 2) + 1] << 8) +
188 rom_data[kRoomObjectSubtype3 + ((id & 0xFF) * 2)]);
189 AddTiles(8, pos);
191 }
192
193 void Draw(std::vector<uint8_t>& current_gfx16,
194 std::vector<uint8_t>& tiles_bg1_buffer,
195 std::vector<uint8_t>& tiles_bg2_buffer) {
196 for (int i = 0; i < 8; i++) {
197 DrawTile(tiles_[i], x_ * 8, (y_ + i) * 8, current_gfx16, tiles_bg1_buffer,
198 tiles_bg2_buffer);
199 }
200 }
201};
202
203} // namespace zelda3
204} // namespace yaze
205
206#endif // YAZE_APP_ZELDA3_DUNGEON_ROOM_OBJECT_H
auto rom()
Definition rom.h:382
SharedRom()=default
Tile composition of four 8x8 tiles.
Definition snes_tile.h:129
std::vector< uint8_t > preview_object_data_
void AddTiles(int nbr, int pos)
Definition room_object.h:73
std::vector< gfx::Tile16 > tiles_
void DrawTile(gfx::Tile16 t, int xx, int yy, std::vector< uint8_t > &current_gfx16, std::vector< uint8_t > &tiles_bg1_buffer, std::vector< uint8_t > &tiles_bg2_buffer, uint16_t tile_under=0xFFFF)
RoomObject(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer=0)
Definition room_object.h:60
void set_options(ObjectOption options)
Definition room_object.h:87
Subtype1(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer, int tile_count)
void Draw(std::vector< uint8_t > &current_gfx16, std::vector< uint8_t > &tiles_bg1_buffer, std::vector< uint8_t > &tiles_bg2_buffer)
void Draw(std::vector< uint8_t > &current_gfx16, std::vector< uint8_t > &tiles_bg1_buffer, std::vector< uint8_t > &tiles_bg2_buffer)
Subtype2(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer)
void Draw(std::vector< uint8_t > &current_gfx16, std::vector< uint8_t > &tiles_bg1_buffer, std::vector< uint8_t > &tiles_bg2_buffer)
Subtype3(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer)
#define ASSIGN_OR_LOG_ERROR(type_variable_name, expression)
Definition macro.h:81
Zelda 3 specific classes and functions.
constexpr int kRoomObjectSubtype3
Definition room_object.h:52
ObjectOption operator|(ObjectOption lhs, ObjectOption rhs)
Definition room_object.cc:6
ObjectOption operator^(ObjectOption lhs, ObjectOption rhs)
constexpr int kRoomObjectSubtype1
Definition room_object.h:50
constexpr int kRoomObjectSubtype2
Definition room_object.h:51
constexpr int kRoomObjectTileAddress
Definition room_object.h:53
ObjectOption operator~(ObjectOption option)
SubtypeInfo FetchSubtypeInfo(uint16_t object_id)
ObjectOption operator&(ObjectOption lhs, ObjectOption rhs)
constexpr int kRoomObjectTileAddressFloor
Definition room_object.h:54
Main namespace for the application.
Definition controller.cc:18