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
|
FieldVerticalTransition: ; 0xe674
push af
ld a, [wd548]
push af
xor a
ld [wd548], a
ld [wd803], a
callba DrawSpritesForStage
call CleanOAMBuffer
pop af
ld [wd548], a
pop af
ld [wCurrentStage], a
xor a
ld [hBGP], a
ld [hOBP0], a
ld [hOBP1], a
rst AdvanceFrame
call Func_e5d
call Func_576
call ClearOAMBuffer
call Func_1129
call LoadStageCollisionAttributes
call LoadStageData
call Func_e5d
call Func_588
ld a, $e4
ld [hBGP], a
ld a, $e1
ld [hOBP0], a
ld a, $e4
ld [hOBP1], a
ret
LoadStageData: ; 0xe6c2
; Loads all stage data, such as graphics, collision attributes, etc.
ld a, [wCurrentStage]
bit 0, a
ld a, $86
jr z, .asm_e6d5
ld a, [wd5ca]
and a
ld a, $86
jr nz, .asm_e6d5
ld a, $90
.asm_e6d5
ld [hWY], a
ld hl, StageGfxPointers_GameBoy
ld a, [hGameBoyColorFlag]
and a
jr z, .loadData
ld hl, StageGfxPointers_GameBoyColor
.loadData
ld a, [wCurrentStage]
call LoadVideoData
xor a
ld [wd7f2], a
callba _LoadStageData
ret
INCLUDE "data/stage_base_gfx.asm"
CheckStageTransition: ; 0xece9
call Func_ed5e
ld a, [wBallYPos + 1]
add $10
cp $18
jr c, .moving_up
cp $b8
ret c
ld a, [wCurrentStage]
ld c, a
ld b, $0
ld hl, BallMovingDownStageTransitions
add hl, bc
ld a, [hl]
cp $ff
jr z, .youLose
call FieldVerticalTransition
ld a, [wBallYPos + 1]
sub $88
ld [wBallYPos + 1], a
ret
.moving_up
ld a, [wCurrentStage]
ld c, a
ld b, $0
ld hl, BallMovingUpStageTransitions
add hl, bc
ld a, [hl]
cp $ff
jr z, .youLose
call FieldVerticalTransition
ld a, [wBallYPos + 1]
add $88
ld [wBallYPos + 1], a
ret
.youLose
ld a, $1
ld [wd4ae], a
callba HandleBallLoss
ret
BallMovingUpStageTransitions: ; 0xed3e
; Maps the relationship between stages when
; the ball moves out of the screen upward.
db $FF ; STAGE_RED_FIELD_TOP
db STAGE_RED_FIELD_TOP ; STAGE_RED_FIELD_BOTTOM
db $FF
db $02
db $FF ; STAGE_BLUE_FIELD_TOP
db STAGE_BLUE_FIELD_TOP ; STAGE_BLUE_FIELD_BOTTOM
db $FF ; STAGE_GENGAR_BONUS
db $FF ; STAGE_GENGAR_BONUS
db $FF ; STAGE_MEWTWO_BONUS
db $FF ; STAGE_MEWTWO_BONUS
db $FF ; STAGE_MEOWTH_BONUS
db $FF ; STAGE_MEOWTH_BONUS
db $FF ; STAGE_DIGLETT_BONUS
db $FF ; STAGE_DIGLETT_BONUS
db $FF ; STAGE_SEEL_BONUS
db $FF ; STAGE_SEEL_BONUS
BallMovingDownStageTransitions: ; 0xed4e
; Maps the relationship between stages when
; the ball moves out of the screen downward.
db STAGE_RED_FIELD_BOTTOM ; STAGE_RED_FIELD_TOP
db $FF ; STAGE_RED_FIELD_BOTTOM
db $03
db $FF
db STAGE_BLUE_FIELD_BOTTOM ; STAGE_BLUE_FIELD_TOP
db $FF ; STAGE_BLUE_FIELD_BOTTOM
db $FF ; STAGE_GENGAR_BONUS
db $FF ; STAGE_GENGAR_BONUS
db $FF ; STAGE_MEWTWO_BONUS
db $FF ; STAGE_MEWTWO_BONUS
db $FF ; STAGE_MEOWTH_BONUS
db $FF ; STAGE_MEOWTH_BONUS
db $FF ; STAGE_DIGLETT_BONUS
db $FF ; STAGE_DIGLETT_BONUS
db $FF ; STAGE_SEEL_BONUS
db $FF ; STAGE_SEEL_BONUS
Func_ed5e: ; 0xed5e
ld hl, wSCX
ld a, [wd7ac]
and a
jr nz, .modify_scx_and_scy
ld a, [wBallXPos + 1]
cp $9a
ld a, 2
jr nc, .okay1
ld a, -2
.okay1
ld [wd7aa], a
add [hl]
cp $22
jr z, .modify_scx_and_scy
bit 7, a
jr nz, .modify_scx_and_scy
ld [hl], a
.modify_scx_and_scy
ld a, [hl]
ld hl, wd79f
sub [hl]
ld [hSCX], a
xor a
ld hl, wd7a0
sub [hl]
ld [hSCY], a
ret
|