Add the ability to shoot. Detect shot collisions with mushrooms and shoot the mushrooms. Remove the ability to randomly shoot the mushrooms because that debug is no longer needed. Fix a bug where the number of infield mushrooms was not being updated for mushrooms which were shot until gone.

This commit is contained in:
Jeremy Rand 2020-11-16 23:48:36 -05:00
parent 4e6bad0ae7
commit 64f96896f7
4 changed files with 107 additions and 32 deletions

View File

@ -279,11 +279,6 @@ checkKey_loop2 anop
beq checkKey_shootSpider
cmp #'P'
beq checkKey_shootSpider
cmp #'m'
beq checkKey_shootMushroom
cmp #'M'
beq checkKey_shootMushroom
cmp #'g'
beq checkKey_game
@ -307,9 +302,6 @@ checkKey_shootSpider anop
checkKey_shootCentipede anop
jmp shootRandomSegment
checkKey_shootMushroom anop
jmp shootRandomMushroom
checkKey_quit anop
stz shouldQuit

View File

@ -56,12 +56,17 @@ shootMushroom entry
sbc #4
sta tileType,x
bne shootMushroom_done
jmp scoreAddOne
bra shootMushroom_empty
shootMushroom_poisoned anop
bne shootMushroom_poisonedNoScore
lda #TILE_EMPTY
sta tileType,x
shootMushroom_empty anop
cpx #SPIDER_STARTING_TOP_ROW_OFFSET
blt shootMushrom_notInfield
dec numInfieldMushrooms
shootMushrom_notInfield anop
jmp scoreAddOne
shootMushroom_poisonedNoScore anop
@ -72,25 +77,5 @@ shootMushroom_poisonedNoScore anop
shootMushroom_done anop
rtl
shootRandomMushroom entry
lda prevRandomMushroom
cmp #RHS_FIRST_TILE_OFFSET
bge shootRandomMushroom_doRandom
tax
bra shootRandomMushroom_testTile
shootRandomMushroom_doRandom anop
jsl randomMushroomOffset
tax
shootRandomMushroom_testTile anop
lda tileType,x
beq shootRandomMushroom_doRandom
stx prevRandomMushroom
jmp shootMushroom
prevRandomMushroom dc i2'RHS_FIRST_TILE_OFFSET'
end

View File

@ -43,6 +43,8 @@ playerLevelStart entry
sta mouseX
lda #STARTING_MOUSE_Y
sta mouseY
lda #1
sta mouseDown
dec numLives
lda #P1_LIVES_OFFSET
sec
@ -223,16 +225,24 @@ updatePlayer_doneY anop
; The X and Y register also has a bit in each which indicates whether a
; mouse button is down or not.
txa
and #$0080
beq updatePlayer_mouseDown
tya
and #$0080
bne updatePlayer_skipDeltas
beq updatePlayer_mouseDown
lda #1
sta mouseDown
bra updatePlayer_skipDeltas
updatePlayer_mouseDown anop
jsl maybeShoot
stz mouseDown
updatePlayer_skipDeltas anop
lda mouseDown
bne updatePlayer_notShooting
jsl maybeShoot
updatePlayer_notShooting anop
lda mouseY
asl a
tay
@ -326,6 +336,7 @@ updatePlayer_done anop
playerFrameCount dc i2'0'
playerExplosionOffset dc i2'0'
mouseDown dc i2'0'
SHIP_EXPLOSION_LAST_OFFSET equ 7*4

View File

@ -72,13 +72,100 @@ updateShot_shifted anop
sta tileDirty,x
jmp >drawHalfShotShift
updateShot_notNone anop
cmp #SHOT_STATE_START_SHOOTING
bne updateShot_shooting
lda SHOT_STATE_SHOOTING
sta shotState
lda #1
and mouseX
sta shotShifted
bne updateShot_startShootingShifted
lda mouseAddress
sec
sbc #TILE_PIXEL_HEIGHT*SCREEN_BYTES_PER_ROW-1
sta shotAddress
bra updateShot_findDirty
updateShot_startShootingShifted anop
lda mouseAddress
sec
sbc #TILE_PIXEL_HEIGHT*SCREEN_BYTES_PER_ROW-2
sta shotAddress
updateShot_findDirty anop
sec
sbc #SCREEN_ADDRESS
and #$fffc
tax
lda >screenToTileOffset,x
sta shotTileOffsetAbove
tax
lda tileBelow,x
sta shotTileOffsetBelow
bra updateShot_drawShot
updateShot_shooting anop
lda shotAddress
sec
sbc #TILE_PIXEL_HEIGHT*SCREEN_BYTES_PER_ROW
sta shotAddress
cmp #SCREEN_ADDRESS-6*SCREEN_BYTES_PER_ROW
bge updateShot_updateDirty
lda #SHOT_STATE_NONE
sta shotState
rtl
updateShot_updateDirty anop
ldx shotTileOffsetAbove
stx shotTileOffsetBelow
lda tileAbove,x
cmp #INVALID_TILE_NUM
beq updateShot_drawShot
sta shotTileOffsetAbove
updateShot_drawShot anop
lda #TILE_STATE_DIRTY
ldx shotTileOffsetAbove
sta tileDirty,x
ldx shotTileOffsetBelow
sta tileDirty,x
ldy shotAddress
lda shotShifted
bne updateShot_drawShifted
jsl drawShot
bra updateShot_checkCollision
updateShot_drawShifted anop
jsl drawShotShift
updateShot_checkCollision anop
bne updateShot_collision
rtl
updateShot_collision anop
and #$3333
bne updateShot_maybeMushroom
; TODO - Write the code to test for a collision with fleas, spiders, scorpions or centipede segments
bra updateShot_done
updateShot_maybeMushroom anop
txa
sec
sbc #SCREEN_ADDRESS
and #$fffc
tax
lda >screenToTileOffset,x
tax
lda tileType,x
beq updateShot_done
lda #SHOT_STATE_NONE
sta shotState
jsl shootMushroom
updateShot_done anop
rtl
shotState dc i2'SHOT_STATE_NONE'
shotShifted dc i2'0'
shotAddress dc i2'0'
shotTileOffsetAbove dc i2'0'
shotTileOffsetBelow dc i2'0'
end