yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
draw_routine_registry.h
Go to the documentation of this file.
1#ifndef YAZE_ZELDA3_DUNGEON_DRAW_ROUTINES_DRAW_ROUTINE_REGISTRY_H
2#define YAZE_ZELDA3_DUNGEON_DRAW_ROUTINES_DRAW_ROUTINE_REGISTRY_H
3
4#include <cstdint>
5#include <unordered_map>
6#include <vector>
7
9
10namespace yaze {
11namespace zelda3 {
12
22namespace DrawRoutineIds {
23
24// Rightwards routines (0-4, 16, 20-32)
25constexpr int kRightwards2x2_1to15or32 = 0;
26constexpr int kRightwards2x4_1to15or26 = 1;
27constexpr int kRightwards2x4_1to16 = 2;
29constexpr int kRightwards2x2_1to16 = 4;
30constexpr int kRightwards4x4_1to16 = 16;
31constexpr int kRightwards1x2_1to16_plus2 = 20;
44constexpr int kWeird2x4_1to16 = 124;
45
46// Diagonal routines (5-6, 17-18)
47constexpr int kDiagonalAcute_1to16 = 5;
48constexpr int kDiagonalGrave_1to16 = 6;
49constexpr int kDiagonalAcute_1to16_BothBG = 17;
50constexpr int kDiagonalGrave_1to16_BothBG = 18;
51
52// Downwards routines (7-15, 43-50, 65-71)
53constexpr int kDownwards2x2_1to15or32 = 7;
54constexpr int kDownwards4x2_1to15or26 = 8;
57constexpr int kDownwards2x2_1to16 = 11;
59constexpr int kDownwardsEdge1x1_1to16 = 13;
62constexpr int kDownwardsFloor4x4_1to16 = 43;
74constexpr int kDownwardsBar2x5_1to16 = 69;
75constexpr int kDownwardsPots2x2_1to16 = 70;
77
78// Long vertical rail and jump-ledge variants.
80constexpr int kWaterHopStairsA = 119;
81constexpr int kWaterHopStairsB = 120;
82constexpr int kDamFloodGate = 121;
83constexpr int kDownwardsEdge1x1_1to16plus7 = 122;
84
85// Late special routines.
86constexpr int kFloorLight = 123;
87constexpr int kBigWallDecor = 125;
88constexpr int kTableBowl = 126;
89constexpr int kSmithyFurnace = 127;
90constexpr int kBigGrayRock = 128;
91constexpr int kAgahnimsAltar = 129;
92constexpr int kFortuneTellerRoom = 131;
93constexpr int kMagicBatAltar = 132;
94constexpr int kVitreousGooDamage = 133;
95constexpr int kSanctuaryWall = 134;
96
97// Corner routines (19, 35-37, 75-78)
98constexpr int kCorner4x4 = 19;
99constexpr int kCorner4x4_BothBG = 35;
100constexpr int kWeirdCornerBottom_BothBG = 36;
101constexpr int kWeirdCornerTop_BothBG = 37;
102constexpr int kDiagonalCeilingTopLeft = 75;
103constexpr int kDiagonalCeilingBottomLeft = 76;
104constexpr int kDiagonalCeilingTopRight = 77;
106
107// Special routines (26, 33-34, 38-39)
108constexpr int kDoorSwitcherer = 26;
109constexpr int kSomariaLine = 33;
110constexpr int kWaterFace = 34;
111constexpr int kNothing = 38;
112constexpr int kChest = 39;
113
114// Additional rightwards (51-55, 72-74)
115constexpr int kRightwards4x2_1to16 = 40;
119constexpr int kRightwardsBar4x3_1to16 = 52;
120constexpr int kRightwardsShelf4x4_1to16 = 53;
124constexpr int kRightwardsPots2x2_1to16 = 73;
126
127// SuperSquare routines (56-64)
128constexpr int k4x4BlocksIn4x4SuperSquare = 56;
129constexpr int k3x3FloorIn4x4SuperSquare = 57;
130constexpr int k4x4FloorIn4x4SuperSquare = 58;
133constexpr int kBigHole4x4_1to16 = 61;
134constexpr int kSpike2x2In4x4SuperSquare = 62;
135constexpr int kTableRock4x4_1to16 = 63;
136constexpr int kWaterOverlay8x8_1to16 = 64;
137
138// Chest platform and moving wall routines (79-82)
139constexpr int kClosedChestPlatform = 79;
140constexpr int kMovingWallWest = 80;
141constexpr int kMovingWallEast = 81;
142constexpr int kOpenChestPlatform = 82;
143
144// Stair routines (83-91)
145constexpr int kInterRoomFatStairsUp = 83;
146constexpr int kInterRoomFatStairsDownA = 84;
147constexpr int kInterRoomFatStairsDownB = 85;
148constexpr int kAutoStairs = 86;
149constexpr int kStraightInterRoomStairs = 87;
150constexpr int kSpiralStairsGoingUpUpper = 88;
152constexpr int kSpiralStairsGoingUpLower = 90;
154
155// Interactive object routines (92-96)
156constexpr int kBigKeyLock = 92;
157constexpr int kBombableFloor = 93;
158constexpr int kEmptyWaterFace = 94;
159constexpr int kSpittingWaterFace = 95;
160constexpr int kDrenchingWaterFace = 96;
161
162// Additional Type 2/3 routines (97-116)
163constexpr int kPrisonCell = 97;
164constexpr int kBed4x5 = 98;
165constexpr int kRightwards3x6 = 99;
166constexpr int kUtility6x3 = 100;
167constexpr int kUtility3x5 = 101;
168constexpr int kVerticalTurtleRockPipe = 102;
169constexpr int kHorizontalTurtleRockPipe = 103;
170constexpr int kLightBeam = 104;
171constexpr int kBigLightBeam = 105;
172constexpr int kBossShell4x4 = 106;
173constexpr int kSolidWallDecor3x4 = 107;
174constexpr int kArcheryGameTargetDoor = 108;
175constexpr int kGanonTriforceFloorDecor = 109;
176constexpr int kSingle2x2 = 110;
177constexpr int kWaterfall47 = 111;
178constexpr int kWaterfall48 = 112;
179constexpr int kSingle4x4 = 113;
180constexpr int kSingle4x3 = 114;
181constexpr int kRupeeFloor = 115;
182constexpr int kActual4x4 = 116;
183
184// Custom object routine.
185constexpr int kCustomObject = 130;
186
187} // namespace DrawRoutineIds
188
197 public:
198 static DrawRoutineRegistry& Get();
199
200 // Initialize the registry - must be called once at startup
201 void Initialize();
202
203 // Rebuild object->routine mapping after runtime feature-flag changes.
205
206 // Look up routine info by ID
207 const DrawRoutineInfo* GetRoutineInfo(int routine_id) const;
208
209 // Get all registered routines
210 const std::vector<DrawRoutineInfo>& GetAllRoutines() const {
211 return routines_;
212 }
213
214 // Check if a routine draws to both BG layers
215 bool RoutineDrawsToBothBGs(int routine_id) const;
216
217 // Get routine metadata for dimension calculation
218 bool GetRoutineDimensions(int routine_id, int* base_width,
219 int* base_height) const;
220
221 // Look up draw routine ID for an object ID. Returns -1 if unmapped.
222 int GetRoutineIdForObject(int16_t object_id) const;
223
224 private:
226 void BuildRegistry();
227 void BuildObjectMapping();
228
229 std::vector<DrawRoutineInfo> routines_;
230 std::unordered_map<int, const DrawRoutineInfo*> routine_map_;
231 std::unordered_map<int16_t, int> object_to_routine_map_;
232 bool initialized_ = false;
233};
234
235} // namespace zelda3
236} // namespace yaze
237
238#endif // YAZE_ZELDA3_DUNGEON_DRAW_ROUTINES_DRAW_ROUTINE_REGISTRY_H
Unified draw routine registry.
const DrawRoutineInfo * GetRoutineInfo(int routine_id) const
const std::vector< DrawRoutineInfo > & GetAllRoutines() const
bool GetRoutineDimensions(int routine_id, int *base_width, int *base_height) const
std::unordered_map< int16_t, int > object_to_routine_map_
bool RoutineDrawsToBothBGs(int routine_id) const
std::unordered_map< int, const DrawRoutineInfo * > routine_map_
int GetRoutineIdForObject(int16_t object_id) const
std::vector< DrawRoutineInfo > routines_
static DrawRoutineRegistry & Get()
constexpr int kDownwardsLeftCorners2x1_1to16_plus12
constexpr int kRightwardsBottomCorners1x2_1to16_plus13
constexpr int kDownwardsRightCorners2x1_1to16_plus12
constexpr int kRightwardsTopCorners1x2_1to16_plus13
Metadata about a draw routine.