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 = 35, // 35 colors: 2 full rows (0-15, 16-31) + 3 colors (32-34)
109 .colors_per_row = 7, // Display in 16-color rows for proper SNES alignment
110 .bits_per_pixel = 4,
111 .description = "Main overworld palettes: 35 colors per set (2 full rows + 3 colors)",
112 .has_animations = false
113};
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 = 8, // Display in 8-color groups
123 .bits_per_pixel = 4,
124 .description = "Animated overlay palettes: 7 colors per set (water, lava, etc.)",
125 .has_animations = true
126};
127
130 .display_name = "Dungeon Main",
131 .category = "Dungeon",
132 .base_address = PaletteAddress::kDungeonMain,
133 .palette_count = PaletteCount::kDungeonMain,
134 .colors_per_palette = 90, // 90 colors: 5 full rows (0-15, 16-31, 32-47, 48-63, 64-79) + 10 colors (80-89)
135 .colors_per_row = 16, // Display in 16-color rows for proper SNES alignment
136 .bits_per_pixel = 4,
137 .description = "Dungeon-specific palettes: 90 colors per set (5 full rows + 10 colors)",
138 .has_animations = false
139};
140
143 .display_name = "Global Sprites",
144 .category = "Sprites",
145 .base_address = PaletteAddress::kGlobalSpritesLW,
146 .palette_count = 2, // 2 sets (LW and DW), each with 60 colors
147 .colors_per_palette = 60, // 60 colors: 4 rows (0-15, 16-31, 32-47, 48-59) with transparent at 0, 16, 32, 48
148 .colors_per_row = 16, // Display in 16-color rows for proper SNES alignment
149 .bits_per_pixel = 4,
150 .description = "Global sprite palettes: 60 colors per set (4 sprite sub-palettes of 15+transparent each)",
151 .has_animations = false
152};
153
156 .display_name = "Sprites Aux 1",
157 .category = "Sprites",
158 .base_address = PaletteAddress::kSpritesAux1,
159 .palette_count = PaletteCount::kSpritesAux1,
160 .colors_per_palette = 7, // 7 colors (ROM stores 7, transparent added in memory)
161 .colors_per_row = 8, // Display as 8-color sub-palettes (with transparent)
162 .bits_per_pixel = 4,
163 .description = "Auxiliary sprite palettes 1: 7 colors per palette (transparent added at runtime)",
164 .has_animations = false
165};
166
169 .display_name = "Sprites Aux 2",
170 .category = "Sprites",
171 .base_address = PaletteAddress::kSpritesAux2,
172 .palette_count = PaletteCount::kSpritesAux2,
173 .colors_per_palette = 7, // 7 colors (ROM stores 7, transparent added in memory)
174 .colors_per_row = 8, // Display as 8-color sub-palettes (with transparent)
175 .bits_per_pixel = 4,
176 .description = "Auxiliary sprite palettes 2: 7 colors per palette (transparent added at runtime)",
177 .has_animations = false
178};
179
182 .display_name = "Sprites Aux 3",
183 .category = "Sprites",
184 .base_address = PaletteAddress::kSpritesAux3,
185 .palette_count = PaletteCount::kSpritesAux3,
186 .colors_per_palette = 7, // 7 colors (ROM stores 7, transparent added in memory)
187 .colors_per_row = 8, // Display as 8-color sub-palettes (with transparent)
188 .bits_per_pixel = 4,
189 .description = "Auxiliary sprite palettes 3: 7 colors per palette (transparent added at runtime)",
190 .has_animations = false
191};
192
195 .display_name = "Armor / Link",
196 .category = "Equipment",
197 .base_address = PaletteAddress::kArmor,
198 .palette_count = PaletteCount::kArmor,
199 .colors_per_palette = 15, // 15 colors (ROM stores 15, transparent added in memory for full row)
200 .colors_per_row = 16, // Display as full 16-color rows (with transparent at index 0)
201 .bits_per_pixel = 4,
202 .description = "Link's tunic colors: 15 colors per palette (Green, Blue, Red, Bunny, Electrocuted)",
203 .has_animations = false
204};
205
208 .display_name = "Swords",
209 .category = "Equipment",
210 .base_address = PaletteAddress::kSwords,
211 .palette_count = PaletteCount::kSwords,
212 .colors_per_palette = 3, // 3 colors (overlay palette, no transparent)
213 .colors_per_row = 4, // Display in compact groups
214 .bits_per_pixel = 4,
215 .description = "Sword blade colors: 3 colors per palette (Fighter, Master, Tempered, Golden)",
216 .has_animations = false
217};
218
221 .display_name = "Shields",
222 .category = "Equipment",
223 .base_address = PaletteAddress::kShields,
224 .palette_count = PaletteCount::kShields,
225 .colors_per_palette = 4, // 4 colors (overlay palette, no transparent)
226 .colors_per_row = 4, // Display in compact groups
227 .bits_per_pixel = 4,
228 .description = "Shield colors: 4 colors per palette (Fighter, Fire, Mirror)",
229 .has_animations = false
230};
231
234 .display_name = "HUD",
235 .category = "Interface",
236 .base_address = PaletteAddress::kHud,
237 .palette_count = PaletteCount::kHud,
238 .colors_per_palette = 32, // 32 colors: 2 full rows (0-15, 16-31) with transparent at 0, 16
239 .colors_per_row = 16, // Display in 16-color rows
240 .bits_per_pixel = 2, // HUD palettes are 2bpp
241 .description = "HUD/Interface palettes: 32 colors per set (2 full rows)",
242 .has_animations = false
243};
244
247 .display_name = "Overworld Auxiliary",
248 .category = "Overworld",
249 .base_address = PaletteAddress::kOverworldAux,
250 .palette_count = PaletteCount::kOverworldAux,
251 .colors_per_palette = 21, // 21 colors: 1 full row (0-15) + 5 colors (16-20)
252 .colors_per_row = 16, // Display in 16-color rows
253 .bits_per_pixel = 4,
254 .description = "Overworld auxiliary palettes: 21 colors per set (1 full row + 5 colors)",
255 .has_animations = false
256};
257
260 .display_name = "Grass",
261 .category = "Overworld",
262 .base_address = PaletteAddress::kGrassLW,
263 .palette_count = PaletteCount::kGrass,
264 .colors_per_palette = 1, // Single color per entry
265 .colors_per_row = 3, // Display all 3 in one row
266 .bits_per_pixel = 4,
267 .description = "Hardcoded grass colors: 3 individual colors (LW, DW, Special)",
268 .has_animations = false
269};
270
273 .display_name = "3D Objects",
274 .category = "Special",
275 .base_address = PaletteAddress::kTriforce,
276 .palette_count = PaletteCount::k3DObject,
277 .colors_per_palette = 8, // 8 colors per palette (7 + transparent)
278 .colors_per_row = 8, // Display in 8-color groups
279 .bits_per_pixel = 4,
280 .description = "3D object palettes: 8 colors per palette (Triforce, Crystal)",
281 .has_animations = false
282};
283
286 .display_name = "Overworld Mini Map",
287 .category = "Interface",
288 .base_address = PaletteAddress::kOverworldMiniMap,
289 .palette_count = PaletteCount::kOverworldMiniMap,
290 .colors_per_palette = 128, // 128 colors: 8 full rows (0-127) with transparent at 0, 16, 32, 48, 64, 80, 96, 112
291 .colors_per_row = 16, // Display in 16-color rows
292 .bits_per_pixel = 4,
293 .description = "Overworld mini-map palettes: 128 colors per set (8 full rows)",
294 .has_animations = false
295};
296
297} // namespace PaletteMetadata
298
299// Helper to get metadata by group name
300const PaletteGroupMetadata* GetPaletteGroupMetadata(const char* group_id);
301
302// Get all available palette groups
303std::vector<const PaletteGroupMetadata*> GetAllPaletteGroups();
304
305} // namespace yaze::zelda3
306
307#endif // YAZE_ZELDA3_PALETTE_CONSTANTS_H
308
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()