BuGS/BuGS/gameShot.s

215 lines
3.8 KiB
ArmAsm

;
; gameShot.s
; BuGS
;
; Created by Jeremy Rand on 2020-11-15.
;Copyright © 2020 Jeremy Rand. All rights reserved.
;
case on
mcopy gameShot.macros
keep gameShot
gameShot start
using globalData
using tileData
using screenData
SHOT_STATE_NONE equ 0
SHOT_STATE_START_SHOOTING equ 1
SHOT_STATE_SHOOTING equ 2
shotInitLevel entry
stz shotState
rtl
maybeShoot entry
lda shotState
bne maybeShoot_alreadyShooting
lda #SHOT_STATE_START_SHOOTING
sta shotState
maybeShoot_alreadyShooting anop
rtl
updateShot entry
lda playerState
cmp #PLAYER_STATE_ONSCREEN
beq updateShot_playerOnscreen
rtl
updateShot_playerOnscreen anop
lda shotState
bne updateShot_notNone
lda mouseX
and #1
bne updateShot_shifted
lda mouseAddress
sec
sbc #$1df
tay
sec
sbc #SCREEN_ADDRESS
and #$fffc
tax
lda >screenToTileOffset,x
tax
lda #TILE_STATE_DIRTY
sta tileDirty,x
lda tileBelow,x
tax
lda #TILE_STATE_DIRTY
sta tileDirty,x
jmp >drawHalfShot
updateShot_shifted anop
lda mouseAddress
sec
sbc #$1de
tay
sec
sbc #SCREEN_ADDRESS
and #$fffc
tax
lda >screenToTileOffset,x
tax
lda #TILE_STATE_DIRTY
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
jsl playFireSound
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
cpx #SCREEN_ADDRESS
bge updateShot_onScreen
rtl
updateShot_onScreen anop
and #$cccc
beq updateShot_maybeMushroom
txy
txa
sec
sbc #SCREEN_ADDRESS
and #$fffc
tax
lda >screenToTileOffset,x
cmp #SPIDER_STARTING_TOP_ROW_OFFSET
blt updateShot_maybeScorpion
jsl isSpiderCollision
bcc updateShot_notSpiderOrScorpion
lda #SHOT_STATE_NONE
sta shotState
jmp shootSpider
updateShot_maybeScorpion anop
jsl isScorpionCollision
bcc updateShot_notSpiderOrScorpion
lda #SHOT_STATE_NONE
sta shotState
jmp shootScorpion
updateShot_notSpiderOrScorpion anop
jsl isFleaCollision
bcc updateShot_maybeSegment
lda #SHOT_STATE_NONE
sta shotState
jmp shootFlea
updateShot_maybeSegment anop
jsl isSegmentCollision
bcc updateShot_done
lda #SHOT_STATE_NONE
sta shotState
jmp shootSegment
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