yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
sprite_oam_tables.h
Go to the documentation of this file.
1#ifndef YAZE_ZELDA3_SPRITE_SPRITE_OAM_TABLES_H
2#define YAZE_ZELDA3_SPRITE_SPRITE_OAM_TABLES_H
3
4#include <array>
5#include <cstdint>
6#include <optional>
7#include <vector>
8
9namespace yaze {
10namespace zelda3 {
11
19 int8_t x_offset; // X offset relative to sprite origin
20 int8_t y_offset; // Y offset relative to sprite origin
21 uint16_t tile_id; // Tile ID in graphics buffer
22 uint8_t palette; // Palette index (0-7)
23 bool size_16x16; // false = 8x8, true = 16x16
24 bool flip_x; // Horizontal mirror
25 bool flip_y; // Vertical mirror
26};
27
35 uint8_t sprite_id; // Sprite type ID (0x00-0xF2)
36 const char* name; // Display name
37 std::vector<SpriteOamEntry> tiles;
38 std::array<uint8_t, 4> required_sheets; // Graphics sheet IDs needed
39};
40
41// ============================================================
42// Common Sprite OAM Layouts
43// ============================================================
44
45// Sprite ID: 0x01 - Vulture
47 .sprite_id = 0x01,
48 .name = "Vulture",
49 .tiles = {{0, 0, 0x20, 2, true, false, false},
50 {0, -16, 0x00, 2, true, false, false}},
51 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
52
53// Sprite ID: 0x08 - Octorok (1-way)
55 .sprite_id = 0x08,
56 .name = "Octorok",
57 .tiles = {{0, 0, 0x80, 6, true, false, false}},
58 .required_sheets = {0x56, 0x57, 0x00, 0x00}};
59
60// Sprite ID: 0x0B - Chicken
62 .sprite_id = 0x0B,
63 .name = "Chicken",
64 .tiles = {{0, 0, 0x60, 2, true, false, false}},
65 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
66
67// Sprite ID: 0x0E - Green Soldier (standing)
69 .sprite_id = 0x0E,
70 .name = "Green Soldier",
71 .tiles = {{0, 8, 0x20, 6, true, false, false}, // Body
72 {0, -8, 0x00, 6, true, false, false}}, // Head
73 .required_sheets = {0x56, 0x57, 0x00, 0x00}};
74
75// Sprite ID: 0x0F - Blue Soldier
77 .sprite_id = 0x0F,
78 .name = "Blue Soldier",
79 .tiles = {{0, 8, 0x20, 1, true, false, false}, // Body
80 {0, -8, 0x00, 1, true, false, false}}, // Head
81 .required_sheets = {0x56, 0x57, 0x00, 0x00}};
82
83// Sprite ID: 0x10 - Red Soldier
85 .sprite_id = 0x10,
86 .name = "Red Soldier",
87 .tiles = {{0, 8, 0x20, 0, true, false, false}, // Body
88 {0, -8, 0x00, 0, true, false, false}}, // Head
89 .required_sheets = {0x56, 0x57, 0x00, 0x00}};
90
91// Sprite ID: 0x29 - Blue Guard
93 .sprite_id = 0x29,
94 .name = "Blue Guard",
95 .tiles = {{0, 8, 0x20, 1, true, false, false}, // Body
96 {0, -8, 0x00, 1, true, false, false}}, // Head
97 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
98
99// Sprite ID: 0x41 - Green Soldier (patrol)
101 .sprite_id = 0x41,
102 .name = "Green Patrol",
103 .tiles = {{0, 8, 0x20, 6, true, false, false}, // Body
104 {0, -8, 0x00, 6, true, false, false}}, // Head
105 .required_sheets = {0x56, 0x57, 0x00, 0x00}};
106
107// Sprite ID: 0x44 - Armos Knight
109 .sprite_id = 0x44,
110 .name = "Armos Knight",
111 .tiles = {{0, 0, 0x82, 4, true, false, false},
112 {0, -16, 0x80, 4, true, false, false}},
113 .required_sheets = {0x58, 0x59, 0x00, 0x00}};
114
115// Sprite ID: 0x4B - Octoballoon
117 .sprite_id = 0x4B,
118 .name = "Octoballoon",
119 .tiles = {{0, 0, 0xE0, 4, true, false, false}},
120 .required_sheets = {0x54, 0x55, 0x00, 0x00}};
121
122// Sprite ID: 0x53 - Red Eyegore
124 .sprite_id = 0x53,
125 .name = "Red Eyegore",
126 .tiles = {{0, 0, 0x84, 0, true, false, false},
127 {0, -16, 0x80, 0, true, false, false}},
128 .required_sheets = {0x58, 0x59, 0x00, 0x00}};
129
130// Sprite ID: 0x54 - Green Eyegore
132 .sprite_id = 0x54,
133 .name = "Green Eyegore",
134 .tiles = {{0, 0, 0x84, 6, true, false, false},
135 {0, -16, 0x80, 6, true, false, false}},
136 .required_sheets = {0x58, 0x59, 0x00, 0x00}};
137
138// Sprite ID: 0x64 - Moblin
140 .sprite_id = 0x64,
141 .name = "Moblin",
142 .tiles = {{0, 0, 0xC6, 5, true, false, false},
143 {0, -16, 0xC4, 5, true, false, false}},
144 .required_sheets = {0x54, 0x55, 0x00, 0x00}};
145
146// Sprite ID: 0x81 - Hinox
148 .sprite_id = 0x81,
149 .name = "Hinox",
150 .tiles = {{-8, 0, 0xCC, 3, true, false, false},
151 {8, 0, 0xCC, 3, true, true, false},
152 {-8, -16, 0xC8, 3, true, false, false},
153 {8, -16, 0xC8, 3, true, true, false}},
154 .required_sheets = {0x5C, 0x5D, 0x00, 0x00}};
155
156// Sprite ID: 0x88 - Link's Uncle (dying)
158 .sprite_id = 0x88,
159 .name = "Uncle",
160 .tiles = {{0, 0, 0xAE, 7, true, false, false},
161 {0, -16, 0x8E, 7, true, false, false}},
162 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
163
164// Sprite ID: 0xD8 - Heart Container
166 .sprite_id = 0xD8,
167 .name = "Heart Container",
168 .tiles = {{0, 0, 0xEE, 0, true, false, false}},
169 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
170
171// Sprite ID: 0xDA - Green Rupee
173 .sprite_id = 0xDA,
174 .name = "Green Rupee",
175 .tiles = {{0, 0, 0xE8, 0, false, false, false}},
176 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
177
178// Sprite ID: 0xDB - Blue Rupee
180 .sprite_id = 0xDB,
181 .name = "Blue Rupee",
182 .tiles = {{0, 0, 0xE8, 1, false, false, false}},
183 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
184
185// Sprite ID: 0xDC - Red Rupee
187 .sprite_id = 0xDC,
188 .name = "Red Rupee",
189 .tiles = {{0, 0, 0xE8, 2, false, false, false}},
190 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
191
192// Sprite ID: 0xDE - Small Heart
194 .sprite_id = 0xDE,
195 .name = "Small Heart",
196 .tiles = {{0, 0, 0xEC, 0, false, false, false}},
197 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
198
199// Sprite ID: 0xDF - Key
201 .sprite_id = 0xDF,
202 .name = "Key",
203 .tiles = {{0, 0, 0xF4, 7, false, false, false}},
204 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
205
206// Sprite ID: 0xE1 - Small Magic
208 .sprite_id = 0xE1,
209 .name = "Small Magic",
210 .tiles = {{0, 0, 0xF0, 6, false, false, false}},
211 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
212
213// Sprite ID: 0xE2 - Large Magic
215 .sprite_id = 0xE2,
216 .name = "Large Magic",
217 .tiles = {{0, 0, 0xF6, 6, false, false, false}},
218 .required_sheets = {0x52, 0x53, 0x00, 0x00}};
219
226 public:
232 static const SpriteOamLayout* GetLayout(uint8_t sprite_id);
233
239 static std::optional<std::array<uint8_t, 4>> GetRequiredSheets(
240 uint8_t sprite_id);
241
247 static bool HasLayout(uint8_t sprite_id);
248
253 static std::vector<const SpriteOamLayout*> GetAllLayouts();
254};
255
256} // namespace zelda3
257} // namespace yaze
258
259#endif // YAZE_ZELDA3_SPRITE_SPRITE_OAM_TABLES_H
Registry of all known sprite OAM layouts.
static const SpriteOamLayout * GetLayout(uint8_t sprite_id)
Get the OAM layout for a sprite ID.
static std::vector< const SpriteOamLayout * > GetAllLayouts()
Get all defined layouts.
static std::optional< std::array< uint8_t, 4 > > GetRequiredSheets(uint8_t sprite_id)
Get required graphics sheets for a sprite.
static bool HasLayout(uint8_t sprite_id)
Check if a sprite has a defined layout.
const SpriteOamLayout kRedEyegoreLayout
const SpriteOamLayout kOctorokLayout
const SpriteOamLayout kBlueGuardLayout
const SpriteOamLayout kLargeMagicLayout
const SpriteOamLayout kBlueSoldierLayout
const SpriteOamLayout kBlueRupeeLayout
const SpriteOamLayout kRedSoldierLayout
const SpriteOamLayout kGreenSoldierLayout
const SpriteOamLayout kSmallMagicLayout
const SpriteOamLayout kGreenRupeeLayout
const SpriteOamLayout kArmosKnightLayout
const SpriteOamLayout kGreenPatrolLayout
const SpriteOamLayout kOctoballoonLayout
const SpriteOamLayout kHinoxLayout
const SpriteOamLayout kHeartContainerLayout
const SpriteOamLayout kMoblinLayout
const SpriteOamLayout kChickenLayout
const SpriteOamLayout kUncleLayout
const SpriteOamLayout kKeyLayout
const SpriteOamLayout kGreenEyegoreLayout
const SpriteOamLayout kSmallHeartLayout
const SpriteOamLayout kVultureLayout
const SpriteOamLayout kRedRupeeLayout
Single OAM entry for sprite rendering.
Complete OAM layout for a vanilla sprite.
std::array< uint8_t, 4 > required_sheets
std::vector< SpriteOamEntry > tiles