yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
diagonal_routines.cc
Go to the documentation of this file.
1#include "diagonal_routines.h"
2
5
6namespace yaze {
7namespace zelda3 {
8namespace draw_routines {
9
11 // Pattern: Diagonal acute (/) - draws 5 tiles vertically, moves up-right
12 // Based on bank_01.asm RoomDraw_DiagonalAcute_1to16 at $018C58
13 // Uses RoomDraw_2x2and1 to draw 5 tiles at rows 0-4, then moves Y -= $7E
14 int size = ctx.object.size_ & 0x0F;
15
16 // Assembly: LDA #$0007; JSR RoomDraw_GetSize_1to16_timesA
17 // GetSize_1to16_timesA formula: ((B2 << 2) | B4) + A
18 // Since size_ already contains ((B2 << 2) | B4), count = size + 7
19 int count = size + 7;
20
21 if (ctx.tiles.size() < 5) return;
22
23 for (int s = 0; s < count; s++) {
24 // Draw 5 tiles in a vertical column (RoomDraw_2x2and1 pattern)
25 // Assembly stores to [$BF],Y, [$CB],Y, [$D7],Y, [$DA],Y, [$DD],Y
26 // These are rows 0, 1, 2, 3, 4 at the same X position
27 int tile_x = ctx.object.x_ + s; // Move right each iteration
28 int tile_y = ctx.object.y_ - s; // Move up each iteration (acute = /)
29
30 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 0,
31 ctx.tiles[0]);
32 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 1,
33 ctx.tiles[1]);
34 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 2,
35 ctx.tiles[2]);
36 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 3,
37 ctx.tiles[3]);
38 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 4,
39 ctx.tiles[4]);
40 }
41}
42
44 // Pattern: Diagonal grave (\‍) - draws 5 tiles vertically, moves down-right
45 // Based on bank_01.asm RoomDraw_DiagonalGrave_1to16 at $018C61
46 // Uses RoomDraw_2x2and1 to draw 5 tiles at rows 0-4, then moves Y += $82
47 int size = ctx.object.size_ & 0x0F;
48
49 // Assembly: LDA #$0007; JSR RoomDraw_GetSize_1to16_timesA
50 // GetSize_1to16_timesA formula: ((B2 << 2) | B4) + A
51 // Since size_ already contains ((B2 << 2) | B4), count = size + 7
52 int count = size + 7;
53
54 if (ctx.tiles.size() < 5) return;
55
56 for (int s = 0; s < count; s++) {
57 // Draw 5 tiles in a vertical column (RoomDraw_2x2and1 pattern)
58 // Assembly stores to [$BF],Y, [$CB],Y, [$D7],Y, [$DA],Y, [$DD],Y
59 // These are rows 0, 1, 2, 3, 4 at the same X position
60 int tile_x = ctx.object.x_ + s; // Move right each iteration
61 int tile_y = ctx.object.y_ + s; // Move down each iteration (grave = \‍)
62
63 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 0,
64 ctx.tiles[0]);
65 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 1,
66 ctx.tiles[1]);
67 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 2,
68 ctx.tiles[2]);
69 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 3,
70 ctx.tiles[3]);
71 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 4,
72 ctx.tiles[4]);
73 }
74}
75
77 // Pattern: Diagonal acute (/) for both BG layers (objects 0x15, 0x18-0x1D,
78 // 0x20) Based on bank_01.asm RoomDraw_DiagonalAcute_1to16_BothBG at $018C6A
79 // Assembly: LDA #$0006; JSR RoomDraw_GetSize_1to16_timesA
80 // GetSize_1to16_timesA formula: ((B2 << 2) | B4) + A
81 // Since size_ already contains ((B2 << 2) | B4), count = size + 6
82 int size = ctx.object.size_ & 0x0F;
83 int count = size + 6;
84
85 if (ctx.tiles.size() < 5) return;
86
87 for (int s = 0; s < count; s++) {
88 int tile_x = ctx.object.x_ + s;
89 int tile_y = ctx.object.y_ - s;
90
91 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 0,
92 ctx.tiles[0]);
93 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 1,
94 ctx.tiles[1]);
95 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 2,
96 ctx.tiles[2]);
97 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 3,
98 ctx.tiles[3]);
99 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 4,
100 ctx.tiles[4]);
101 }
102 // Note: BothBG should write to both BG1 and BG2 - handled by DrawObject
103 // caller
104}
105
107 // Pattern: Diagonal grave (\‍) for both BG layers (objects 0x16-0x17,
108 // 0x1A-0x1B, 0x1E-0x1F) Based on bank_01.asm RoomDraw_DiagonalGrave_1to16_BothBG
109 // at $018CB9 Assembly: LDA #$0006; JSR RoomDraw_GetSize_1to16_timesA
110 // GetSize_1to16_timesA formula: ((B2 << 2) | B4) + A
111 // Since size_ already contains ((B2 << 2) | B4), count = size + 6
112 int size = ctx.object.size_ & 0x0F;
113 int count = size + 6;
114
115 if (ctx.tiles.size() < 5) return;
116
117 for (int s = 0; s < count; s++) {
118 int tile_x = ctx.object.x_ + s;
119 int tile_y = ctx.object.y_ + s;
120
121 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 0,
122 ctx.tiles[0]);
123 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 1,
124 ctx.tiles[1]);
125 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 2,
126 ctx.tiles[2]);
127 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 3,
128 ctx.tiles[3]);
129 DrawRoutineUtils::WriteTile8(ctx.target_bg, tile_x, tile_y + 4,
130 ctx.tiles[4]);
131 }
132 // Note: BothBG should write to both BG1 and BG2 - handled by DrawObject
133 // caller
134}
135
136void RegisterDiagonalRoutines(std::vector<DrawRoutineInfo>& registry) {
137 // Note: Routine IDs are assigned based on the assembly routine table
138 // These diagonal routines are part of the core 40 draw routines
139
140 registry.push_back(DrawRoutineInfo{
141 .id = 5, // RoomDraw_DiagonalAcute_1to16
142 .name = "DiagonalAcute_1to16",
143 .function = DrawDiagonalAcute_1to16,
144 .draws_to_both_bgs = false,
145 .base_width = 0, // Variable based on size parameter
146 .base_height = 5,
148 });
149
150 registry.push_back(DrawRoutineInfo{
151 .id = 6, // RoomDraw_DiagonalGrave_1to16
152 .name = "DiagonalGrave_1to16",
153 .function = DrawDiagonalGrave_1to16,
154 .draws_to_both_bgs = false,
155 .base_width = 0, // Variable based on size parameter
156 .base_height = 5,
158 });
159
160 registry.push_back(DrawRoutineInfo{
161 .id = 17, // RoomDraw_DiagonalAcute_1to16_BothBG
162 .name = "DiagonalAcute_1to16_BothBG",
164 .draws_to_both_bgs = true,
165 .base_width = 0, // Variable based on size parameter
166 .base_height = 5,
168 });
169
170 registry.push_back(DrawRoutineInfo{
171 .id = 18, // RoomDraw_DiagonalGrave_1to16_BothBG
172 .name = "DiagonalGrave_1to16_BothBG",
174 .draws_to_both_bgs = true,
175 .base_width = 0, // Variable based on size parameter
176 .base_height = 5,
178 });
179}
180
181} // namespace draw_routines
182} // namespace zelda3
183} // namespace yaze
void WriteTile8(gfx::BackgroundBuffer &bg, int tile_x, int tile_y, const gfx::TileInfo &tile_info)
Write an 8x8 tile to the background buffer.
void RegisterDiagonalRoutines(std::vector< DrawRoutineInfo > &registry)
Register all diagonal draw routines to the registry.
void DrawDiagonalGrave_1to16_BothBG(const DrawContext &ctx)
Draw diagonal grave () pattern for both BG layers.
void DrawDiagonalAcute_1to16_BothBG(const DrawContext &ctx)
Draw diagonal acute (/) pattern for both BG layers.
void DrawDiagonalAcute_1to16(const DrawContext &ctx)
Draw diagonal acute (/) pattern - draws 5 tiles vertically, moves up-right.
void DrawDiagonalGrave_1to16(const DrawContext &ctx)
Draw diagonal grave () pattern - draws 5 tiles vertically, moves down-right.
Context passed to draw routines containing all necessary state.
std::span< const gfx::TileInfo > tiles
gfx::BackgroundBuffer & target_bg
Metadata about a draw routine.