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 = "armors";
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 = 6;
67constexpr int kOverworldAux = 20;
68constexpr int kOverworldAnimated = 14;
69constexpr int kGlobalSprites = 2;
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 = 35, // 5 sub-palettes x 7 colors (transparent slots are implicit)
109 .colors_per_row = 7,
110 .bits_per_pixel = 4,
111 .description =
112 "Main overworld BG palettes: 35 colors per set (5 sub-palettes x 7 colors)",
113 .has_animations = false};
114
117 .display_name = "Overworld Animated",
118 .category = "Overworld",
120 .palette_count = PaletteCount::kOverworldAnimated,
121 .colors_per_palette = 7, // 7 colors (overlay palette, no transparent)
122 .colors_per_row = 7,
123 .bits_per_pixel = 4,
124 .description =
125 "Animated overlay palettes: 7 colors per set (water, lava, etc.)",
126 .has_animations = true};
127
130 .display_name = "Dungeon Main",
131 .category = "Dungeon",
132 .base_address = PaletteAddress::kDungeonMain,
133 .palette_count = PaletteCount::kDungeonMain,
134 .colors_per_palette = 90, // 6 banks x 15 colors (transparent slots are implicit)
135 .colors_per_row = 15,
136 .bits_per_pixel = 4,
137 .description =
138 "Dungeon-specific palettes: 90 colors per set (6 banks x 15 colors)",
139 .has_animations = false};
140
143 .display_name = "Global Sprites",
144 .category = "Sprites",
145 .base_address = PaletteAddress::kGlobalSpritesLW,
146 .palette_count = 2, // LW and DW
147 .colors_per_palette = 60, // 4 banks x 15 colors (transparent slots are implicit)
148 .colors_per_row = 15,
149 .bits_per_pixel = 4,
150 .description =
151 "Global sprite palettes: 60 colors per set (4 banks x 15 colors)",
152 .has_animations = false};
153
156 .display_name = "Sprites Aux 1",
157 .category = "Sprites",
158 .base_address = PaletteAddress::kSpritesAux1,
159 .palette_count = PaletteCount::kSpritesAux1,
160 .colors_per_palette =
161 7, // 7 colors (ROM stores 7, transparent added in memory)
162 .colors_per_row = 7,
163 .bits_per_pixel = 4,
164 .description =
165 "Auxiliary sprite palettes 1: 7 colors per palette (transparent added "
166 "at runtime)",
167 .has_animations = false};
168
171 .display_name = "Sprites Aux 2",
172 .category = "Sprites",
173 .base_address = PaletteAddress::kSpritesAux2,
174 .palette_count = PaletteCount::kSpritesAux2,
175 .colors_per_palette =
176 7, // 7 colors (ROM stores 7, transparent added in memory)
177 .colors_per_row = 7,
178 .bits_per_pixel = 4,
179 .description =
180 "Auxiliary sprite palettes 2: 7 colors per palette (transparent added "
181 "at runtime)",
182 .has_animations = false};
183
186 .display_name = "Sprites Aux 3",
187 .category = "Sprites",
188 .base_address = PaletteAddress::kSpritesAux3,
189 .palette_count = PaletteCount::kSpritesAux3,
190 .colors_per_palette =
191 7, // 7 colors (ROM stores 7, transparent added in memory)
192 .colors_per_row = 7,
193 .bits_per_pixel = 4,
194 .description =
195 "Auxiliary sprite palettes 3: 7 colors per palette (transparent added "
196 "at runtime)",
197 .has_animations = false};
198
201 .display_name = "Armor / Link",
202 .category = "Equipment",
203 .base_address = PaletteAddress::kArmor,
204 .palette_count = PaletteCount::kArmor,
205 .colors_per_palette = 15, // 15 colors (ROM stores 15, transparent added in
206 // memory for full row)
207 .colors_per_row = 15,
208 .bits_per_pixel = 4,
209 .description =
210 "Link's tunic colors: 15 colors per palette (Green, Blue, Red, Bunny, "
211 "Electrocuted)",
212 .has_animations = false};
213
216 .display_name = "Swords",
217 .category = "Equipment",
218 .base_address = PaletteAddress::kSwords,
219 .palette_count = PaletteCount::kSwords,
220 .colors_per_palette = 3, // 3 colors (overlay palette, no transparent)
221 .colors_per_row = 4, // Display in compact groups
222 .bits_per_pixel = 4,
223 .description =
224 "Sword blade colors: 3 colors per palette (Fighter, Master, Tempered, "
225 "Golden)",
226 .has_animations = false};
227
230 .display_name = "Shields",
231 .category = "Equipment",
232 .base_address = PaletteAddress::kShields,
233 .palette_count = PaletteCount::kShields,
234 .colors_per_palette = 4, // 4 colors (overlay palette, no transparent)
235 .colors_per_row = 4, // Display in compact groups
236 .bits_per_pixel = 4,
237 .description =
238 "Shield colors: 4 colors per palette (Fighter, Fire, Mirror)",
239 .has_animations = false};
240
243 .display_name = "HUD",
244 .category = "Interface",
245 .base_address = PaletteAddress::kHud,
246 .palette_count = PaletteCount::kHud,
247 .colors_per_palette =
248 32, // 32 colors: 2 full rows (0-15, 16-31) with transparent at 0, 16
249 .colors_per_row = 16, // Display in 16-color rows
250 .bits_per_pixel = 2, // HUD palettes are 2bpp
251 .description = "HUD/Interface palettes: 32 colors per set (2 full rows)",
252 .has_animations = false};
253
256 .display_name = "Overworld Auxiliary",
257 .category = "Overworld",
258 .base_address = PaletteAddress::kOverworldAux,
259 .palette_count = PaletteCount::kOverworldAux,
260 .colors_per_palette = 21, // 3 sub-palettes x 7 colors
261 .colors_per_row = 7,
262 .bits_per_pixel = 4,
263 .description =
264 "Overworld auxiliary palettes: 21 colors per set (3 sub-palettes x 7 colors)",
265 .has_animations = false};
266
269 .display_name = "Grass",
270 .category = "Overworld",
271 .base_address = PaletteAddress::kGrassLW,
272 .palette_count = PaletteCount::kGrass,
273 .colors_per_palette = 1, // Single color per entry
274 .colors_per_row = 3, // Display all 3 in one row
275 .bits_per_pixel = 4,
276 .description =
277 "Hardcoded grass colors: 3 individual colors (LW, DW, Special)",
278 .has_animations = false};
279
282 .display_name = "3D Objects",
283 .category = "Special",
284 .base_address = PaletteAddress::kTriforce,
285 .palette_count = PaletteCount::k3DObject,
286 .colors_per_palette = 8, // 8 colors per palette (7 + transparent)
287 .colors_per_row = 8, // Display in 8-color groups
288 .bits_per_pixel = 4,
289 .description =
290 "3D object palettes: 8 colors per palette (Triforce, Crystal)",
291 .has_animations = false};
292
295 .display_name = "Overworld Mini Map",
296 .category = "Interface",
297 .base_address = PaletteAddress::kOverworldMiniMap,
298 .palette_count = PaletteCount::kOverworldMiniMap,
299 .colors_per_palette = 128, // 128 colors: 8 full rows (0-127) with
300 // transparent at 0, 16, 32, 48, 64, 80, 96, 112
301 .colors_per_row = 16, // Display in 16-color rows
302 .bits_per_pixel = 4,
303 .description =
304 "Overworld mini-map palettes: 128 colors per set (8 full rows)",
305 .has_animations = false};
306
307} // namespace PaletteMetadata
308
309// Helper to get metadata by group name
310const PaletteGroupMetadata* GetPaletteGroupMetadata(const char* group_id);
311
312// Get all available palette groups
313std::vector<const PaletteGroupMetadata*> GetAllPaletteGroups();
314
315} // namespace yaze::zelda3
316
317#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.
const PaletteGroupMetadata * GetPaletteGroupMetadata(const char *group_id)
std::vector< const PaletteGroupMetadata * > GetAllPaletteGroups()