|
@ -5,6 +5,10 @@ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; TODO(mcmillen): define screen / ship / shot dimensions as constants. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; Sets A to 8-bit (& enables 8-bit "B" register). |
|
|
; Sets A to 8-bit (& enables 8-bit "B" register). |
|
|
.MACRO SetA8Bit |
|
|
.MACRO SetA8Bit |
|
|
sep #%00100000 ; 8-bit A/B. |
|
|
sep #%00100000 ; 8-bit A/B. |
|
@ -471,10 +475,10 @@ MaybeShootDone: |
|
|
|
|
|
|
|
|
UpdateWorld: |
|
|
UpdateWorld: |
|
|
jsr UpdateShotCooldown |
|
|
jsr UpdateShotCooldown |
|
|
|
|
|
jsr UpdateShotPositions |
|
|
jsr SpawnEnemyShips |
|
|
jsr SpawnEnemyShips |
|
|
jsr SpawnEnemyShots |
|
|
|
|
|
jsr UpdateEnemyShips |
|
|
jsr UpdateEnemyShips |
|
|
jsr UpdateShotPositions |
|
|
|
|
|
|
|
|
|
|
|
jsr CheckCollisionsWithPlayer |
|
|
jsr CheckCollisionsWithPlayer |
|
|
jsr UpdateBackgroundScroll |
|
|
jsr UpdateBackgroundScroll |
|
|
rts |
|
|
rts |
|
@ -529,7 +533,7 @@ SpawnEnemyShips: |
|
|
sta enemyShipArray + 3, Y ; move AI type. |
|
|
sta enemyShipArray + 3, Y ; move AI type. |
|
|
sta enemyShipArray + 4, Y ; shoot AI type. |
|
|
sta enemyShipArray + 4, Y ; shoot AI type. |
|
|
|
|
|
|
|
|
lda #8 |
|
|
|
|
|
|
|
|
lda #12 |
|
|
sta enemyShipArray + 5, Y ; shot cooldown. |
|
|
sta enemyShipArray + 5, Y ; shot cooldown. |
|
|
|
|
|
|
|
|
rts |
|
|
rts |
|
@ -539,14 +543,17 @@ SpawnEnemyShips: |
|
|
; TODO(mcmillen): reap ships if they move off the top, bottom, or right too. |
|
|
; TODO(mcmillen): reap ships if they move off the top, bottom, or right too. |
|
|
UpdateEnemyShips: |
|
|
UpdateEnemyShips: |
|
|
ldy #0 |
|
|
ldy #0 |
|
|
|
|
|
sty $00 ; Index into enemyShotArray. |
|
|
-- |
|
|
-- |
|
|
lda enemyShipArray, Y |
|
|
lda enemyShipArray, Y |
|
|
cmp #0 |
|
|
|
|
|
|
|
|
cmp #0 ; If it's not enabled, skip it. |
|
|
beq ++ |
|
|
beq ++ |
|
|
|
|
|
|
|
|
|
|
|
; Move the ship. |
|
|
|
|
|
; TODO(mcmillen): implement different movement based on AI-type. |
|
|
lda enemyShipArray + 1, Y ; x |
|
|
lda enemyShipArray + 1, Y ; x |
|
|
clc |
|
|
clc |
|
|
adc #-2 |
|
|
|
|
|
|
|
|
adc #-2 ; x-velocity. |
|
|
bcs + |
|
|
bcs + |
|
|
lda #0 |
|
|
lda #0 |
|
|
sta enemyShipArray, Y ; reap it. |
|
|
sta enemyShipArray, Y ; reap it. |
|
@ -554,8 +561,26 @@ UpdateEnemyShips: |
|
|
+ |
|
|
+ |
|
|
sta enemyShipArray + 1, Y ; move it. |
|
|
sta enemyShipArray + 1, Y ; move it. |
|
|
|
|
|
|
|
|
|
|
|
lda enemyShipArray + 5, Y ; shot cooldown |
|
|
|
|
|
cmp #0 |
|
|
|
|
|
beq + |
|
|
|
|
|
dec A |
|
|
|
|
|
sta enemyShipArray + 5, Y ; new shot cooldown |
|
|
|
|
|
bra ++ |
|
|
|
|
|
|
|
|
++ |
|
|
|
|
|
|
|
|
+ ; Add a shot. |
|
|
|
|
|
; TODO(mcmillen): implement different shooting based on shoot-type. |
|
|
|
|
|
lda enemyShipArray + 1, Y |
|
|
|
|
|
sta $02 ; Enemy ship X. |
|
|
|
|
|
lda enemyShipArray + 2, Y |
|
|
|
|
|
sta $03 ; Enemy ship Y. |
|
|
|
|
|
lda #12 |
|
|
|
|
|
sta enemyShipArray + 5, Y ; new shot cooldown |
|
|
|
|
|
phy |
|
|
|
|
|
jsr SpawnEnemyShot |
|
|
|
|
|
ply |
|
|
|
|
|
|
|
|
|
|
|
++ ; Done processing this ship. |
|
|
.rept enemyShipSize |
|
|
.rept enemyShipSize |
|
|
iny |
|
|
iny |
|
|
.endr |
|
|
.endr |
|
@ -566,48 +591,52 @@ UpdateEnemyShips: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SpawnEnemyShots: |
|
|
|
|
|
lda vBlankCounter |
|
|
|
|
|
bit #%00011111 ; Spawn shots every this-many frames. |
|
|
|
|
|
beq + |
|
|
|
|
|
|
|
|
; Expects: |
|
|
|
|
|
; $00: index into enemyShotArray (bytes). |
|
|
|
|
|
; $02: enemy ship x-position. |
|
|
|
|
|
; $03: enemy ship y-position. |
|
|
|
|
|
; |
|
|
|
|
|
; Modifies: A & Y. |
|
|
|
|
|
; $00: new index into enemyShotArray (bytes). |
|
|
|
|
|
SpawnEnemyShot: |
|
|
|
|
|
ldy $00 |
|
|
|
|
|
- |
|
|
|
|
|
; Bail if at end of array. |
|
|
|
|
|
cpy #(enemyShotArrayLength * shotSize) |
|
|
|
|
|
bne + |
|
|
|
|
|
sty $00 |
|
|
rts |
|
|
rts |
|
|
+ |
|
|
+ |
|
|
; Find an empty spot in the array. |
|
|
|
|
|
ldy #0 |
|
|
|
|
|
- |
|
|
|
|
|
|
|
|
|
|
|
lda enemyShotArray, Y |
|
|
lda enemyShotArray, Y |
|
|
cmp #0 |
|
|
cmp #0 |
|
|
beq + |
|
|
beq + |
|
|
.rept 6 |
|
|
|
|
|
|
|
|
; Try next slot. |
|
|
|
|
|
.rept shotSize |
|
|
iny |
|
|
iny |
|
|
.endr |
|
|
.endr |
|
|
cpy #(enemyShotArrayLength * shotSize) |
|
|
|
|
|
bne - |
|
|
|
|
|
rts ; Too many shots; bail. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bra - |
|
|
+ |
|
|
+ |
|
|
|
|
|
|
|
|
|
|
|
; OK, found a spot. |
|
|
lda #9 ; Sprite number. |
|
|
lda #9 ; Sprite number. |
|
|
sta enemyShotArray, Y |
|
|
sta enemyShotArray, Y |
|
|
|
|
|
|
|
|
lda #254 |
|
|
|
|
|
sta enemyShotArray + 1, Y ; x. |
|
|
|
|
|
|
|
|
lda $02 ; Get enemy x. |
|
|
|
|
|
sta enemyShotArray + 1, Y ; Save as shot x. |
|
|
|
|
|
|
|
|
lda #((224 - 32) / 2) |
|
|
|
|
|
and #%01111111 |
|
|
|
|
|
sta enemyShotArray + 2, Y ; y. |
|
|
|
|
|
|
|
|
lda $03 ; Get enemy y. |
|
|
|
|
|
clc |
|
|
|
|
|
adc #((32 - 4) / 2) ; Center it with enemy ship. |
|
|
|
|
|
sta enemyShotArray + 2, Y ; Save as shot y. |
|
|
|
|
|
|
|
|
lda #-4 |
|
|
|
|
|
|
|
|
lda #-6 |
|
|
sta enemyShotArray + 3, Y ; x-velocity. |
|
|
sta enemyShotArray + 3, Y ; x-velocity. |
|
|
|
|
|
|
|
|
GetRandomByte |
|
|
|
|
|
and #%00000111 ; [0, 7] |
|
|
|
|
|
clc |
|
|
|
|
|
adc #-3 ; [-3, 4] |
|
|
|
|
|
cmp #4 |
|
|
|
|
|
bne + |
|
|
|
|
|
lda #0 ; [-3, 3] with 2x chance of zero. |
|
|
|
|
|
+ |
|
|
|
|
|
|
|
|
lda #0 |
|
|
sta enemyShotArray + 4, Y ; y-velocity. |
|
|
sta enemyShotArray + 4, Y ; y-velocity. |
|
|
|
|
|
|
|
|
|
|
|
sty $00 |
|
|
rts |
|
|
rts |
|
|
|
|
|
|
|
|
|
|
|
|
|
|