yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
palette_constants.h
Go to the documentation of this file.
1#ifndef YAZE_ZELDA3_PALETTE_CONSTANTS_H
2#define YAZE_ZELDA3_PALETTE_CONSTANTS_H
3
4#include <cstdint>
5#include <vector>
6
7namespace yaze::zelda3 {
8
9// ============================================================================
10// Palette Group Names
11// ============================================================================
12// These constants ensure consistent naming across the entire program
13
14namespace PaletteGroupName {
15constexpr const char* kOverworldMain = "ow_main";
16constexpr const char* kOverworldAux = "ow_aux";
17constexpr const char* kOverworldAnimated = "ow_animated";
18constexpr const char* kHud = "hud";
19constexpr const char* kGlobalSprites = "global_sprites";
20constexpr const char* kArmor = "armor";
21constexpr const char* kSwords = "swords";
22constexpr const char* kShields = "shields";
23constexpr const char* kSpritesAux1 = "sprites_aux1";
24constexpr const char* kSpritesAux2 = "sprites_aux2";
25constexpr const char* kSpritesAux3 = "sprites_aux3";
26constexpr const char* kDungeonMain = "dungeon_main";
27constexpr const char* kGrass = "grass";
28constexpr const char* k3DObject = "3d_object";
29constexpr const char* kOverworldMiniMap = "ow_mini_map";
30} // namespace PaletteGroupName
31
32// ============================================================================
33// ROM Addresses
34// ============================================================================
35
36namespace PaletteAddress {
37constexpr uint32_t kOverworldMain = 0xDE6C8;
38constexpr uint32_t kOverworldAux = 0xDE86C;
39constexpr uint32_t kOverworldAnimated = 0xDE604;
40constexpr uint32_t kGlobalSpritesLW = 0xDD218;
41constexpr uint32_t kGlobalSpritesDW = 0xDD290;
42constexpr uint32_t kArmor = 0xDD308;
43constexpr uint32_t kSpritesAux1 = 0xDD39E;
44constexpr uint32_t kSpritesAux2 = 0xDD446;
45constexpr uint32_t kSpritesAux3 = 0xDD4E0;
46constexpr uint32_t kSwords = 0xDD630;
47constexpr uint32_t kShields = 0xDD648;
48constexpr uint32_t kHud = 0xDD660;
49constexpr uint32_t kDungeonMap = 0xDD70A;
50constexpr uint32_t kDungeonMain = 0xDD734;
51constexpr uint32_t kDungeonMapBg = 0xDE544;
52constexpr uint32_t kGrassLW = 0x5FEA9;
53constexpr uint32_t kGrassDW = 0x05FEB3;
54constexpr uint32_t kGrassSpecial = 0x75640;
55constexpr uint32_t kOverworldMiniMap = 0x55B27;
56constexpr uint32_t kTriforce = 0x64425;
57constexpr uint32_t kCrystal = 0xF4CD3;
58} // namespace PaletteAddress
59
60// ============================================================================
61// Palette Counts
62// ============================================================================
63
64namespace PaletteCount {
65constexpr int kHud = 2;
66constexpr int kOverworldMain = 60; // 20 LW, 20 DW, 20 Special
67constexpr int kOverworldAux = 20;
68constexpr int kOverworldAnimated = 14;
69constexpr int kGlobalSprites = 6;
70constexpr int kArmor = 5;
71constexpr int kSwords = 4;
72constexpr int kSpritesAux1 = 12;
73constexpr int kSpritesAux2 = 11;
74constexpr int kSpritesAux3 = 24;
75constexpr int kShields = 3;
76constexpr int kDungeonMain = 20;
77constexpr int kGrass = 3;
78constexpr int k3DObject = 2;
79constexpr int kOverworldMiniMap = 2;
80} // namespace PaletteCount
81
82// ============================================================================
83// Palette Metadata
84// ============================================================================
85
87 const char* group_id; // Unique identifier (e.g., "ow_main")
88 const char* display_name; // Human-readable name
89 const char* category; // Category (e.g., "Overworld", "Dungeon")
90 uint32_t base_address; // ROM address
91 int palette_count; // Number of palettes
92 int colors_per_palette; // Colors in each palette
93 int colors_per_row; // How many colors per row in UI
94 int bits_per_pixel; // Color depth (typically 4 for SNES)
95 const char* description; // Usage description
96 bool has_animations; // Whether palettes animate
97};
98
99// Predefined metadata for all palette groups
100namespace PaletteMetadata {
101
104 .display_name = "Overworld Main",
105 .category = "Overworld",
106 .base_address = PaletteAddress::kOverworldMain,
107 .palette_count = PaletteCount::kOverworldMain,
108 .colors_per_palette =
109 35, // 35 colors: 2 full rows (0-15, 16-31) + 3 colors (32-34)
110 .colors_per_row = 7, // Display in 16-color rows for proper SNES alignment
111 .bits_per_pixel = 4,
112 .description =
113 "Main overworld palettes: 35 colors per set (2 full rows + 3 colors)",
114 .has_animations = false};
115
118 .display_name = "Overworld Animated",
119 .category = "Overworld",
121 .palette_count = PaletteCount::kOverworldAnimated,
122 .colors_per_palette = 7, // 7 colors (overlay palette, no transparent)
123 .colors_per_row = 8, // Display in 8-color groups
124 .bits_per_pixel = 4,
125 .description =
126 "Animated overlay palettes: 7 colors per set (water, lava, etc.)",
127 .has_animations = true};
128
131 .display_name = "Dungeon Main",
132 .category = "Dungeon",
133 .base_address = PaletteAddress::kDungeonMain,
134 .palette_count = PaletteCount::kDungeonMain,
135 .colors_per_palette = 90, // 90 colors: 5 full rows (0-15, 16-31, 32-47,
136 // 48-63, 64-79) + 10 colors (80-89)
137 .colors_per_row = 16, // Display in 16-color rows for proper SNES alignment
138 .bits_per_pixel = 4,
139 .description =
140 "Dungeon-specific palettes: 90 colors per set (5 full rows + 10 "
141 "colors)",
142 .has_animations = false};
143
146 .display_name = "Global Sprites",
147 .category = "Sprites",
148 .base_address = PaletteAddress::kGlobalSpritesLW,
149 .palette_count = 2, // 2 sets (LW and DW), each with 60 colors
150 .colors_per_palette = 60, // 60 colors: 4 rows (0-15, 16-31, 32-47, 48-59)
151 // with transparent at 0, 16, 32, 48
152 .colors_per_row = 16, // Display in 16-color rows for proper SNES alignment
153 .bits_per_pixel = 4,
154 .description =
155 "Global sprite palettes: 60 colors per set (4 sprite sub-palettes of "
156 "15+transparent each)",
157 .has_animations = false};
158
161 .display_name = "Sprites Aux 1",
162 .category = "Sprites",
163 .base_address = PaletteAddress::kSpritesAux1,
164 .palette_count = PaletteCount::kSpritesAux1,
165 .colors_per_palette =
166 7, // 7 colors (ROM stores 7, transparent added in memory)
167 .colors_per_row = 8, // Display as 8-color sub-palettes (with transparent)
168 .bits_per_pixel = 4,
169 .description =
170 "Auxiliary sprite palettes 1: 7 colors per palette (transparent added "
171 "at runtime)",
172 .has_animations = false};
173
176 .display_name = "Sprites Aux 2",
177 .category = "Sprites",
178 .base_address = PaletteAddress::kSpritesAux2,
179 .palette_count = PaletteCount::kSpritesAux2,
180 .colors_per_palette =
181 7, // 7 colors (ROM stores 7, transparent added in memory)
182 .colors_per_row = 8, // Display as 8-color sub-palettes (with transparent)
183 .bits_per_pixel = 4,
184 .description =
185 "Auxiliary sprite palettes 2: 7 colors per palette (transparent added "
186 "at runtime)",
187 .has_animations = false};
188
191 .display_name = "Sprites Aux 3",
192 .category = "Sprites",
193 .base_address = PaletteAddress::kSpritesAux3,
194 .palette_count = PaletteCount::kSpritesAux3,
195 .colors_per_palette =
196 7, // 7 colors (ROM stores 7, transparent added in memory)
197 .colors_per_row = 8, // Display as 8-color sub-palettes (with transparent)
198 .bits_per_pixel = 4,
199 .description =
200 "Auxiliary sprite palettes 3: 7 colors per palette (transparent added "
201 "at runtime)",
202 .has_animations = false};
203
206 .display_name = "Armor / Link",
207 .category = "Equipment",
208 .base_address = PaletteAddress::kArmor,
209 .palette_count = PaletteCount::kArmor,
210 .colors_per_palette = 15, // 15 colors (ROM stores 15, transparent added in
211 // memory for full row)
212 .colors_per_row =
213 16, // Display as full 16-color rows (with transparent at index 0)
214 .bits_per_pixel = 4,
215 .description =
216 "Link's tunic colors: 15 colors per palette (Green, Blue, Red, Bunny, "
217 "Electrocuted)",
218 .has_animations = false};
219
222 .display_name = "Swords",
223 .category = "Equipment",
224 .base_address = PaletteAddress::kSwords,
225 .palette_count = PaletteCount::kSwords,
226 .colors_per_palette = 3, // 3 colors (overlay palette, no transparent)
227 .colors_per_row = 4, // Display in compact groups
228 .bits_per_pixel = 4,
229 .description =
230 "Sword blade colors: 3 colors per palette (Fighter, Master, Tempered, "
231 "Golden)",
232 .has_animations = false};
233
236 .display_name = "Shields",
237 .category = "Equipment",
238 .base_address = PaletteAddress::kShields,
239 .palette_count = PaletteCount::kShields,
240 .colors_per_palette = 4, // 4 colors (overlay palette, no transparent)
241 .colors_per_row = 4, // Display in compact groups
242 .bits_per_pixel = 4,
243 .description =
244 "Shield colors: 4 colors per palette (Fighter, Fire, Mirror)",
245 .has_animations = false};
246
249 .display_name = "HUD",
250 .category = "Interface",
251 .base_address = PaletteAddress::kHud,
252 .palette_count = PaletteCount::kHud,
253 .colors_per_palette =
254 32, // 32 colors: 2 full rows (0-15, 16-31) with transparent at 0, 16
255 .colors_per_row = 16, // Display in 16-color rows
256 .bits_per_pixel = 2, // HUD palettes are 2bpp
257 .description = "HUD/Interface palettes: 32 colors per set (2 full rows)",
258 .has_animations = false};
259
262 .display_name = "Overworld Auxiliary",
263 .category = "Overworld",
264 .base_address = PaletteAddress::kOverworldAux,
265 .palette_count = PaletteCount::kOverworldAux,
266 .colors_per_palette =
267 21, // 21 colors: 1 full row (0-15) + 5 colors (16-20)
268 .colors_per_row = 16, // Display in 16-color rows
269 .bits_per_pixel = 4,
270 .description =
271 "Overworld auxiliary palettes: 21 colors per set (1 full row + 5 "
272 "colors)",
273 .has_animations = false};
274
277 .display_name = "Grass",
278 .category = "Overworld",
279 .base_address = PaletteAddress::kGrassLW,
280 .palette_count = PaletteCount::kGrass,
281 .colors_per_palette = 1, // Single color per entry
282 .colors_per_row = 3, // Display all 3 in one row
283 .bits_per_pixel = 4,
284 .description =
285 "Hardcoded grass colors: 3 individual colors (LW, DW, Special)",
286 .has_animations = false};
287
290 .display_name = "3D Objects",
291 .category = "Special",
292 .base_address = PaletteAddress::kTriforce,
293 .palette_count = PaletteCount::k3DObject,
294 .colors_per_palette = 8, // 8 colors per palette (7 + transparent)
295 .colors_per_row = 8, // Display in 8-color groups
296 .bits_per_pixel = 4,
297 .description =
298 "3D object palettes: 8 colors per palette (Triforce, Crystal)",
299 .has_animations = false};
300
303 .display_name = "Overworld Mini Map",
304 .category = "Interface",
305 .base_address = PaletteAddress::kOverworldMiniMap,
306 .palette_count = PaletteCount::kOverworldMiniMap,
307 .colors_per_palette = 128, // 128 colors: 8 full rows (0-127) with
308 // transparent at 0, 16, 32, 48, 64, 80, 96, 112
309 .colors_per_row = 16, // Display in 16-color rows
310 .bits_per_pixel = 4,
311 .description =
312 "Overworld mini-map palettes: 128 colors per set (8 full rows)",
313 .has_animations = false};
314
315} // namespace PaletteMetadata
316
317// Helper to get metadata by group name
318const PaletteGroupMetadata* GetPaletteGroupMetadata(const char* group_id);
319
320// Get all available palette groups
321std::vector<const PaletteGroupMetadata*> GetAllPaletteGroups();
322
323} // namespace yaze::zelda3
324
325#endif // YAZE_ZELDA3_PALETTE_CONSTANTS_H
constexpr uint32_t kGlobalSpritesDW
constexpr uint32_t kOverworldAnimated
constexpr uint32_t kGlobalSpritesLW
constexpr uint32_t kOverworldMain
constexpr uint32_t kOverworldMiniMap
constexpr const char * kGlobalSprites
constexpr const char * kOverworldMain
constexpr const char * kSwords
constexpr const char * kGrass
constexpr const char * kOverworldMiniMap
constexpr const char * kDungeonMain
constexpr const char * kShields
constexpr const char * kArmor
constexpr const char * kSpritesAux2
constexpr const char * k3DObject
constexpr const char * kOverworldAux
constexpr const char * kOverworldAnimated
constexpr const char * kSpritesAux1
constexpr const char * kSpritesAux3
constexpr PaletteGroupMetadata kOverworldAnimated
constexpr PaletteGroupMetadata kSwords
constexpr PaletteGroupMetadata kDungeonMain
constexpr PaletteGroupMetadata kSpritesAux2
constexpr PaletteGroupMetadata kOverworldMiniMap
constexpr PaletteGroupMetadata kShields
constexpr PaletteGroupMetadata kGlobalSprites
constexpr PaletteGroupMetadata kOverworldMain
constexpr PaletteGroupMetadata kSpritesAux1
constexpr PaletteGroupMetadata kArmor
constexpr PaletteGroupMetadata k3DObject
constexpr PaletteGroupMetadata kHud
constexpr PaletteGroupMetadata kOverworldAux
constexpr PaletteGroupMetadata kGrass
constexpr PaletteGroupMetadata kSpritesAux3
Zelda 3 specific classes and functions.
Definition editor.h:35
const PaletteGroupMetadata * GetPaletteGroupMetadata(const char *group_id)
std::vector< const PaletteGroupMetadata * > GetAllPaletteGroups()