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 <atomic>
5#include <cstdint>
6#include <unordered_map>
7#include <vector>
8
10
11namespace yaze {
12namespace zelda3 {
13
23namespace DrawRoutineIds {
24
25// Rightwards routines (0-4, 16, 20-32)
26constexpr int kRightwards2x2_1to15or32 = 0;
27constexpr int kRightwards2x4_1to15or26 = 1;
28constexpr int kRightwards2x4_1to16 = 2;
30constexpr int kRightwards2x2_1to16 = 4;
31constexpr int kRightwards4x4_1to16 = 16;
32constexpr int kRightwards1x2_1to16_plus2 = 20;
45constexpr int kWeird2x4_1to16 = 124;
46
47// Diagonal routines (5-6, 17-18)
48constexpr int kDiagonalAcute_1to16 = 5;
49constexpr int kDiagonalGrave_1to16 = 6;
50constexpr int kDiagonalAcute_1to16_BothBG = 17;
51constexpr int kDiagonalGrave_1to16_BothBG = 18;
52
53// Downwards routines (7-15, 43-50, 65-71)
54constexpr int kDownwards2x2_1to15or32 = 7;
55constexpr int kDownwards4x2_1to15or26 = 8;
58constexpr int kDownwards2x2_1to16 = 11;
60constexpr int kDownwardsEdge1x1_1to16 = 13;
63constexpr int kDownwardsFloor4x4_1to16 = 43;
75constexpr int kDownwardsBar2x5_1to16 = 69;
76constexpr int kDownwardsPots2x2_1to16 = 70;
78
79// Long vertical rail and jump-ledge variants.
81constexpr int kWaterHopStairsA = 119;
82constexpr int kWaterHopStairsB = 120;
83constexpr int kDamFloodGate = 121;
84constexpr int kDownwardsEdge1x1_1to16plus7 = 122;
85
86// Late special routines.
87constexpr int kFloorLight = 123;
88constexpr int kBigWallDecor = 125;
89constexpr int kTableBowl = 126;
90constexpr int kSmithyFurnace = 127;
91constexpr int kBigGrayRock = 128;
92constexpr int kAgahnimsAltar = 129;
93constexpr int kFortuneTellerRoom = 131;
94constexpr int kMagicBatAltar = 132;
95constexpr int kVitreousGooDamage = 133;
96constexpr int kSanctuaryWall = 134;
97
98// Corner routines (19, 35-37, 75-78)
99constexpr int kCorner4x4 = 19;
100constexpr int kCorner4x4_BothBG = 35;
101constexpr int kWeirdCornerBottom_BothBG = 36;
102constexpr int kWeirdCornerTop_BothBG = 37;
103constexpr int kDiagonalCeilingTopLeft = 75;
104constexpr int kDiagonalCeilingBottomLeft = 76;
105constexpr int kDiagonalCeilingTopRight = 77;
107
108// Special routines (26, 33-34, 38-39)
109constexpr int kDoorSwitcherer = 26;
110constexpr int kSomariaLine = 33;
111constexpr int kWaterFace = 34;
112constexpr int kNothing = 38;
113constexpr int kChest = 39;
114
115// Additional rightwards (51-55, 72-74)
116constexpr int kRightwards4x2_1to16 = 40;
120constexpr int kRightwardsBar4x3_1to16 = 52;
121constexpr int kRightwardsShelf4x4_1to16 = 53;
125constexpr int kRightwardsPots2x2_1to16 = 73;
127
128// SuperSquare routines (56-64)
129constexpr int k4x4BlocksIn4x4SuperSquare = 56;
130constexpr int k3x3FloorIn4x4SuperSquare = 57;
131constexpr int k4x4FloorIn4x4SuperSquare = 58;
134constexpr int kBigHole4x4_1to16 = 61;
135constexpr int kSpike2x2In4x4SuperSquare = 62;
136constexpr int kTableRock4x4_1to16 = 63;
137constexpr int kWaterOverlay8x8_1to16 = 64;
138
139// Chest platform and moving wall routines (79-82)
140constexpr int kClosedChestPlatform = 79;
141constexpr int kMovingWallWest = 80;
142constexpr int kMovingWallEast = 81;
143constexpr int kOpenChestPlatform = 82;
144
145// Stair routines (83-91)
146constexpr int kInterRoomFatStairsUp = 83;
147constexpr int kInterRoomFatStairsDownA = 84;
148constexpr int kInterRoomFatStairsDownB = 85;
149constexpr int kAutoStairs = 86;
150constexpr int kStraightInterRoomStairs = 87;
151constexpr int kSpiralStairsGoingUpUpper = 88;
153constexpr int kSpiralStairsGoingUpLower = 90;
155
156// Interactive object routines (92-96)
157constexpr int kBigKeyLock = 92;
158constexpr int kBombableFloor = 93;
159constexpr int kEmptyWaterFace = 94;
160constexpr int kSpittingWaterFace = 95;
161constexpr int kDrenchingWaterFace = 96;
162
163// Additional Type 2/3 routines (97-116)
164constexpr int kPrisonCell = 97;
165constexpr int kBed4x5 = 98;
166constexpr int kRightwards3x6 = 99;
167constexpr int kUtility6x3 = 100;
168constexpr int kUtility3x5 = 101;
169constexpr int kVerticalTurtleRockPipe = 102;
170constexpr int kHorizontalTurtleRockPipe = 103;
171constexpr int kLightBeam = 104;
172constexpr int kBigLightBeam = 105;
173constexpr int kBossShell4x4 = 106;
174constexpr int kSolidWallDecor3x4 = 107;
175constexpr int kArcheryGameTargetDoor = 108;
176constexpr int kGanonTriforceFloorDecor = 109;
177constexpr int kSingle2x2 = 110;
178constexpr int kWaterfall47 = 111;
179constexpr int kWaterfall48 = 112;
180constexpr int kSingle4x4 = 113;
181constexpr int kSingle4x3 = 114;
182constexpr int kRupeeFloor = 115;
183constexpr int kActual4x4 = 116;
184
185// Custom object routine.
186constexpr int kCustomObject = 130;
187
188} // namespace DrawRoutineIds
189
198 public:
199 static DrawRoutineRegistry& Get();
200
201 // Compatibility entry point. Get() constructs the immutable tables once.
202 [[deprecated(
203 "Get() initializes the registry; use RefreshFeatureFlagMappings() "
204 "only after settings change")]]
205 void Initialize();
206
207 // Publish the current custom-object routing flag without rebuilding maps.
209
210 bool CustomObjectsEnabled() const {
211 return custom_objects_enabled_.load(std::memory_order_acquire);
212 }
213
214 // Look up routine info by ID
215 const DrawRoutineInfo* GetRoutineInfo(int routine_id) const;
216
217 // Get all registered routines
218 const std::vector<DrawRoutineInfo>& GetAllRoutines() const {
219 return routines_;
220 }
221
222 // Check if a routine draws to both BG layers
223 bool RoutineDrawsToBothBGs(int routine_id) const;
224
225 // Get routine metadata for dimension calculation
226 bool GetRoutineDimensions(int routine_id, int* base_width,
227 int* base_height) const;
228
229 // Look up draw routine ID for an object ID. Returns -1 if unmapped.
230 int GetRoutineIdForObject(int16_t object_id) const;
231 // Explicit routing for a frozen background job; does not read global mode.
232 int GetRoutineIdForObject(int16_t object_id,
233 bool custom_objects_enabled) const;
234
235 // Every object ID with a routine mapping, ascending. This is the supported
236 // object inventory; callers should use it instead of hard-coding the
237 // 0x00-0xF7 / 0x100-0x13F / 0xF80-0xFFF ranges. The inventory remains stable
238 // across custom-object flag changes; IDs 0x31, 0x32 and 0x54 switch between
239 // Nothing and CustomObject.
240 std::vector<int16_t> GetMappedObjectIds() const;
241
242 private:
244 void BuildRegistry();
245 void BuildObjectMapping();
246
247 std::vector<DrawRoutineInfo> routines_;
248 std::unordered_map<int, const DrawRoutineInfo*> routine_map_;
249 std::unordered_map<int16_t, int> object_to_routine_map_;
250 std::atomic<bool> custom_objects_enabled_{false};
251};
252
253} // namespace zelda3
254} // namespace yaze
255
256#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::vector< int16_t > GetMappedObjectIds() 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.