-
Notifications
You must be signed in to change notification settings - Fork 2
/
powerups.s
279 lines (258 loc) · 4.65 KB
/
powerups.s
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
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
; Double Action Blaster Guys
;
; Copyright 2012-2014 NovaSquirrel
;
; This software is provided 'as-is', without any express or implied
; warranty. In no event will the authors be held liable for any damages
; arising from the use of this software.
;
; Permission is granted to anyone to use this software for any purpose,
; including commercial applications, and to alter it and redistribute it
; freely, subject to the following restrictions:
;
; 1. The origin of this software must not be misrepresented; you must not
; claim that you wrote the original software. If you use this software
; in a product, an acknowledgment in the product documentation would be
; appreciated but is not required.
; 2. Altered source versions must be plainly marked as such, and must not be
; misrepresented as being the original software.
; 3. This notice may not be removed or altered from any source distribution.
;
.if 0 ; old powerups list
.enum
POWERUP_STUN_ALL ; stuns all enemies
POWERUP_STUNNED ; placeholder for a stunned enemy
POWERUP_MONEY ; for money-collecting levels
POWERUP_HEALTH ; health recovering
POWERUP_POINTS ; add points
POWERUP_BOMBS ; player can throw bombs for awhile
.endenum
.endif
.enum
POWERUP_UNUSED
POWERUP_STUNNED
POWERUP_MONEY
POWERUP_HEALTH
POWERUP_DIAGSHOOT
POWERUP_BOMBS
POWERUP_JUMP
POWERUP_BILLBLOCK
.endenum
.proc CreatePowerup ; A = powerup type; output is in Y
sta 0
ldy #0
: lda PowerupF,y
beq Success
iny
cpy #PowerupLen
bne :-
clc
rts
Success:
lda #0
sta PowerupVX,y
lda 0
ora #128 ; enabled
sta PowerupF,y
sty 0
jsr rand_8_safe
ldy 0
pha
and #$f0
add #4
sta PowerupPX,y
stx 1
pla
and #1
tax
lda VertSpeeds,x
sta PowerupVY,y
lda VertPositions,x
sta PowerupPY,y
ldx 1
sec
rts
VertSpeeds:
.byt 1, <-1
VertPositions:
.byt 0, 240-16
.endproc
.proc RunPowerups
lda #0
sta 0 ; current powerup counter
Loop:
ldx 0
lda PowerupF,x
bpl SkipPowerup
ldy OamPtr
and #15
ora #$40
sta OAM_TILE+(4*0),y
ora #$50
sta OAM_TILE+(4*1),y
lda PowerupPX,x
add PowerupVX,x
sta PowerupPX,x
lda PowerupPY,x
add PowerupVY,x
sta PowerupPY,x
lda PowerupPY,x
sta OAM_YPOS+(4*0),y
add #8
sta OAM_YPOS+(4*1),y
lda #3
sta OAM_ATTR+(4*0),y
sta OAM_ATTR+(4*1),y
lda PowerupPX,x
sub ScrollX+1
sta OAM_XPOS+(4*0),y
sta OAM_XPOS+(4*1),y
lda PowerupPY,x
cmp #241
bcc :+
lda #0
sta PowerupF,x
beq SkipTouch
: jsr PowerupPlayerTouch
SkipTouch:
lda OamPtr
add #8
sta OamPtr
tay
SkipPowerup:
inc 0
lda 0
cmp #PowerupLen
bne Loop
sty OamPtr
rts
.endproc
.proc PowerupPlayerTouch
ldy #0
PlayerLoop:
lda PlayerPX,y
sta TouchLeftA
lda PlayerPYH,y
sta TouchTopA
lda PowerupPX,x
sta TouchLeftB
lda PowerupPY,x
sta TouchTopB
lda #8
sta TouchWidthA
sta TouchWidthB
asl
sta TouchHeightA
sta TouchHeightB
jsr ChkTouchGeneric
bcs Touched
iny
cpy #MaxNumPlayers
bne PlayerLoop
rts
Touched:
stx TempVal+2
; for some bizarre reason I can't just go and play a sound effect here
; because then it would corrupt memory in addition to playing the sound
lda #1
sta NeedPowerupSound
lda PowerupF,x ; get type, push address from table
pha
lda #0 ; destroy powerup after we read it
sta PowerupF,x
pla
and #7
asl
tax
lda Effects+1,x
pha
lda Effects+0,x
pha
ldx TempVal+2
rts
Effects:
.raddr PowerupJump
.raddr PowerupJump
.raddr PowerupMoney
.raddr PowerupHealth
.raddr PowerupDiagShoot
.raddr PowerupBombs
.raddr PowerupJump
.raddr PowerupBillBlock
.endproc
.proc PowerupJump
lda #APOWERUP_JUMP
sta PlayerPowerType,y
lda #50
sta PlayerPowerTime,y
rts
.endproc
.proc PowerupDiagShoot
lda #APOWERUP_DIAGSHOOT
sta PlayerPowerType,y
lda #50
sta PlayerPowerTime,y
rts
.endproc
.proc PowerupBombs
lda #APOWERUP_BOMBS
sta PlayerPowerType,y
lda #50
sta PlayerPowerTime,y
rts
.endproc
.proc PowerupBillBlock
lda #APOWERUP_BILLBLOCK
sta PlayerPowerType,y
lda #50
sta PlayerPowerTime,y
rts
.endproc
.if 0
.proc PowerupStunAll
stx 0
sty 1
ldx #0
Loop:
lda ObjectF1,x
beq Skip
alr #%111110
tay
lda ObjectIsEnemy,y
beq Skip
lda #ENEMY_STATE_STUNNED
sta ObjectF2,x
lda #250
sta ObjectTimer,x
Skip:
inx
cpx #ObjectLen
bne Loop
ldx 0
ldy 1
rts
.endproc
.endif
.proc PowerupMoney
lda LevelGoalType
cmp #1
bne :+
lda LevelGoalParam
beq :+
dec LevelGoalParam
: ; now add points
stx TempVal
tya
tax
lda #1
jsr PlayerAddScore
ldx TempVal
rts
.endproc
.proc PowerupHealth
lda PlayerHealth,y
cmp #MaxHealthNormal
bcs :+
isc PlayerHealth,y
: rts
.endproc