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
3
#include "
zelda3/dungeon/draw_routines/draw_routine_registry.h
"
4
#include "
zelda3/dungeon/room_object.h
"
5
6
namespace
yaze
{
7
namespace
zelda3 {
8
namespace
draw_routines {
9
10
void
DrawDiagonalAcute_1to16
(
const
DrawContext
& ctx) {
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
43
void
DrawDiagonalGrave_1to16
(
const
DrawContext
& ctx) {
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
76
void
DrawDiagonalAcute_1to16_BothBG
(
const
DrawContext
& ctx) {
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
106
void
DrawDiagonalGrave_1to16_BothBG
(
const
DrawContext
& ctx) {
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
136
void
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,
147
.category =
DrawRoutineInfo::Category::Diagonal
,
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,
157
.category =
DrawRoutineInfo::Category::Diagonal
,
158
});
159
160
registry.push_back(
DrawRoutineInfo
{
161
.
id
= 17,
// RoomDraw_DiagonalAcute_1to16_BothBG
162
.name =
"DiagonalAcute_1to16_BothBG"
,
163
.function =
DrawDiagonalAcute_1to16_BothBG
,
164
.draws_to_both_bgs =
true
,
165
.base_width = 0,
// Variable based on size parameter
166
.base_height = 5,
167
.category =
DrawRoutineInfo::Category::Diagonal
,
168
});
169
170
registry.push_back(
DrawRoutineInfo
{
171
.
id
= 18,
// RoomDraw_DiagonalGrave_1to16_BothBG
172
.name =
"DiagonalGrave_1to16_BothBG"
,
173
.function =
DrawDiagonalGrave_1to16_BothBG
,
174
.draws_to_both_bgs =
true
,
175
.base_width = 0,
// Variable based on size parameter
176
.base_height = 5,
177
.category =
DrawRoutineInfo::Category::Diagonal
,
178
});
179
}
180
181
}
// namespace draw_routines
182
}
// namespace zelda3
183
}
// namespace yaze
yaze::zelda3::RoomObject::x_
uint8_t x_
Definition
room_object.h:140
yaze::zelda3::RoomObject::size_
uint8_t size_
Definition
room_object.h:142
yaze::zelda3::RoomObject::y_
uint8_t y_
Definition
room_object.h:141
diagonal_routines.h
draw_routine_registry.h
yaze::zelda3::DrawRoutineUtils::WriteTile8
void WriteTile8(gfx::BackgroundBuffer &bg, int tile_x, int tile_y, const gfx::TileInfo &tile_info)
Write an 8x8 tile to the background buffer.
Definition
draw_routine_types.cc:10
yaze::zelda3::draw_routines::RegisterDiagonalRoutines
void RegisterDiagonalRoutines(std::vector< DrawRoutineInfo > ®istry)
Register all diagonal draw routines to the registry.
Definition
diagonal_routines.cc:136
yaze::zelda3::draw_routines::DrawDiagonalGrave_1to16_BothBG
void DrawDiagonalGrave_1to16_BothBG(const DrawContext &ctx)
Draw diagonal grave () pattern for both BG layers.
Definition
diagonal_routines.cc:106
yaze::zelda3::draw_routines::DrawDiagonalAcute_1to16_BothBG
void DrawDiagonalAcute_1to16_BothBG(const DrawContext &ctx)
Draw diagonal acute (/) pattern for both BG layers.
Definition
diagonal_routines.cc:76
yaze::zelda3::draw_routines::DrawDiagonalAcute_1to16
void DrawDiagonalAcute_1to16(const DrawContext &ctx)
Draw diagonal acute (/) pattern - draws 5 tiles vertically, moves up-right.
Definition
diagonal_routines.cc:10
yaze::zelda3::draw_routines::DrawDiagonalGrave_1to16
void DrawDiagonalGrave_1to16(const DrawContext &ctx)
Draw diagonal grave () pattern - draws 5 tiles vertically, moves down-right.
Definition
diagonal_routines.cc:43
yaze
Definition
application.cc:18
room_object.h
yaze::zelda3::DrawContext
Context passed to draw routines containing all necessary state.
Definition
draw_routine_types.h:26
yaze::zelda3::DrawContext::tiles
std::span< const gfx::TileInfo > tiles
Definition
draw_routine_types.h:29
yaze::zelda3::DrawContext::target_bg
gfx::BackgroundBuffer & target_bg
Definition
draw_routine_types.h:27
yaze::zelda3::DrawContext::object
const RoomObject & object
Definition
draw_routine_types.h:28
yaze::zelda3::DrawRoutineInfo
Metadata about a draw routine.
Definition
draw_routine_types.h:55
yaze::zelda3::DrawRoutineInfo::id
int id
Definition
draw_routine_types.h:56
yaze::zelda3::DrawRoutineInfo::Category::Diagonal
@ Diagonal
src
zelda3
dungeon
draw_routines
diagonal_routines.cc
Generated by
1.10.0