-
Notifications
You must be signed in to change notification settings - Fork 1k
/
splash.asm
239 lines (222 loc) · 4.69 KB
/
splash.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
LoadShootingStarGraphics:
ld a, $f9
ldh [rOBP0], a
ld a, $a4
ldh [rOBP1], a
ld de, MoveAnimationTiles1 tile 3 ; star tile (top left quadrant)
ld hl, vChars1 tile $20
lb bc, BANK(MoveAnimationTiles1), 1
call CopyVideoData
ld de, MoveAnimationTiles1 tile 19 ; star tile (bottom left quadrant)
ld hl, vChars1 tile $21
lb bc, BANK(MoveAnimationTiles1), 1
call CopyVideoData
ld de, FallingStar
ld hl, vChars1 tile $22
lb bc, BANK(FallingStar), (FallingStarEnd - FallingStar) / $10
call CopyVideoData
ld hl, GameFreakLogoOAMData
ld de, wShadowOAMSprite24
ld bc, GameFreakLogoOAMDataEnd - GameFreakLogoOAMData
call CopyData
ld hl, GameFreakShootingStarOAMData
ld de, wShadowOAM
ld bc, GameFreakShootingStarOAMDataEnd - GameFreakShootingStarOAMData
jp CopyData
AnimateShootingStar:
call LoadShootingStarGraphics
ld a, SFX_SHOOTING_STAR
call PlaySound
; Move the big star down and left across the screen.
ld hl, wShadowOAM
lb bc, $a0, $4
.bigStarLoop
push hl
push bc
.bigStarInnerLoop
ld a, [hl] ; Y
add 4
ld [hli], a
ld a, [hl] ; X
add -4
ld [hli], a
inc hl
inc hl
dec c
jr nz, .bigStarInnerLoop
ld c, 1
call CheckForUserInterruption
pop bc
pop hl
ret c
ld a, [hl]
cp 80
jr nz, .next
jr .bigStarLoop
.next
cp b
jr nz, .bigStarLoop
; Clear big star OAM.
ld hl, wShadowOAM
ld c, 4
ld de, 4
.clearOAMLoop
ld [hl], 160
add hl, de
dec c
jr nz, .clearOAMLoop
; Make Gamefreak logo flash.
ld b, 3
.flashLogoLoop
ld hl, rOBP0
rrc [hl]
rrc [hl]
ld c, 10
call CheckForUserInterruption
ret c
dec b
jr nz, .flashLogoLoop
; Copy 24 instances of the small stars OAM data.
; Note that their coordinates put them off-screen.
ld de, wShadowOAM
ld a, 24
.initSmallStarsOAMLoop
push af
ld hl, SmallStarsOAM
ld bc, SmallStarsOAMEnd - SmallStarsOAM
call CopyData
pop af
dec a
jr nz, .initSmallStarsOAMLoop
; Animate the small stars falling from the Gamefreak logo.
xor a
ld [wMoveDownSmallStarsOAMCount], a
ld hl, SmallStarsWaveCoordsPointerTable
ld c, 6
.smallStarsLoop
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
push bc
push hl
ld hl, wShadowOAMSprite20
ld c, 4
.smallStarsInnerLoop ; introduce new wave of 4 small stars OAM entries
ld a, [de]
cp -1
jr z, .next2
ld [hli], a ; Y
inc de
ld a, [de]
ld [hli], a ; X
inc de
inc hl
inc hl
dec c
jr nz, .smallStarsInnerLoop
ld a, [wMoveDownSmallStarsOAMCount]
cp 24
jr z, .next2
add 6 ; should be 4, but the extra 2 aren't visible on screen
ld [wMoveDownSmallStarsOAMCount], a
.next2
call MoveDownSmallStars
push af
; shift the existing OAM entries down to make room for the next wave
ld hl, wShadowOAMSprite04
ld de, wShadowOAM
ld bc, $50
call CopyData
pop af
pop hl
pop bc
ret c
dec c
jr nz, .smallStarsLoop
and a
ret
SmallStarsOAM:
dbsprite 0, 0, 0, 0, $A2, OAM_BEHIND_BG | OAM_OBP1
SmallStarsOAMEnd:
SmallStarsWaveCoordsPointerTable:
dw SmallStarsWave1Coords
dw SmallStarsWave2Coords
dw SmallStarsWave3Coords
dw SmallStarsWave4Coords
dw SmallStarsEmptyWave
dw SmallStarsEmptyWave
; The stars that fall from the Gamefreak logo come in 4 waves of 4 OAM entries.
; These arrays contain the Y and X coordinates of each OAM entry.
SmallStarsWave1Coords:
db $68, $30
db $68, $40
db $68, $58
db $68, $78
SmallStarsWave2Coords:
db $68, $38
db $68, $48
db $68, $60
db $68, $70
SmallStarsWave3Coords:
db $68, $34
db $68, $4C
db $68, $54
db $68, $64
SmallStarsWave4Coords:
db $68, $3C
db $68, $5C
db $68, $6C
db $68, $74
SmallStarsEmptyWave:
db -1 ; end
MoveDownSmallStars:
ld b, 8
.loop
ld hl, wShadowOAMSprite23
ld a, [wMoveDownSmallStarsOAMCount]
ld de, -4
ld c, a
.innerLoop
inc [hl] ; Y
add hl, de
dec c
jr nz, .innerLoop
; Toggle the palette so that the lower star in the small stars tile blinks in
; and out.
ldh a, [rOBP1]
xor %10100000
ldh [rOBP1], a
ld c, 3
call CheckForUserInterruption
ret c
dec b
jr nz, .loop
ret
GameFreakLogoOAMData:
dbsprite 10, 9, 0, 0, $8d, 0
dbsprite 11, 9, 0, 0, $8e, 0
dbsprite 10, 10, 0, 0, $8f, 0
dbsprite 11, 10, 0, 0, $90, 0
dbsprite 10, 11, 0, 0, $91, 0
dbsprite 11, 11, 0, 0, $92, 0
dbsprite 6, 12, 0, 0, $80, 0
dbsprite 7, 12, 0, 0, $81, 0
dbsprite 8, 12, 0, 0, $82, 0
dbsprite 9, 12, 0, 0, $83, 0
dbsprite 10, 12, 0, 0, $93, 0
dbsprite 11, 12, 0, 0, $84, 0
dbsprite 12, 12, 0, 0, $85, 0
dbsprite 13, 12, 0, 0, $83, 0
dbsprite 14, 12, 0, 0, $81, 0
dbsprite 15, 12, 0, 0, $86, 0
GameFreakLogoOAMDataEnd:
GameFreakShootingStarOAMData:
dbsprite 20, 0, 0, 0, $a0, OAM_OBP1
dbsprite 21, 0, 0, 0, $a0, OAM_OBP1 | OAM_HFLIP
dbsprite 20, 1, 0, 0, $a1, OAM_OBP1
dbsprite 21, 1, 0, 0, $a1, OAM_OBP1 | OAM_HFLIP
GameFreakShootingStarOAMDataEnd:
FallingStar:
INCBIN "gfx/splash/falling_star.2bpp"
FallingStarEnd: