BuGS/BuGS/gameMushroom.s

183 lines
3.3 KiB
ArmAsm

;
; gameMushroom.s
; BuGS
;
; Created by Jeremy Rand on 2020-10-26.
;Copyright © 2020 Jeremy Rand. All rights reserved.
;
case on
mcopy gameMushroom.macros
keep gameMushroom
gameMushroom start
using globalData
using tileData
STARTING_NUM_MUSHROOMS equ 30
resetMushrooms entry
lda mushroomToRefresh
cmp #INVALID_TILE_NUM
beq resetMushrooms_startFromBeginning
tax
lda mushroomExplosionSprite
beq resetMushrooms_doneReset
sec
sbc #4
resetMushrooms_explode anop
sta mushroomExplosionSprite
tay
lda explosionJumpTable,y
sta resetMushrooms_jumpInst+1
lda explosionJumpTable+2,y
sta resetMushrooms_jumpInst+3
lda #TILE_STATE_DIRTY
sta tileDirty,x
lda tileScreenOffset,x
sec
sbc #3
tay
jsl resetMushrooms_jumpInst
sec
rtl
resetMushrooms_jumpInst anop
jmp >explosion1
nop
resetMushrooms_doneReset anop
lda mushroomRefreshWait
beq resetMushrooms_next
dec a
sta mushroomRefreshWait
sec
rtl
resetMushrooms_startFromBeginning anop
ldx #0
resetMushrooms_loop anop
cpx #RHS_FIRST_TILE_OFFSET
blt resetMushrooms_keepChecking
lda #INVALID_TILE_NUM
sta mushroomToRefresh
clc
rtl
resetMushrooms_keepChecking anop
lda tileType,x
beq resetMushrooms_next
cmp #TILE_MUSHROOM4
beq resetMushrooms_next
stx mushroomToRefresh
lda #TILE_MUSHROOM4
sta tileType,x
lda #TILE_STATE_DIRTY
sta tileDirty,x
jsl playBonusSound
jsl scoreAddFive
ldx mushroomToRefresh
lda #EXPLOSION_LAST_OFFSET
sta mushroomExplosionSprite
lda #2
sta mushroomRefreshWait
sec
rtl
resetMushrooms_next anop
inx
inx
bra resetMushrooms_loop
addRandomMushrooms entry
lda #INVALID_TILE_NUM
sta mushroomToRefresh
ldy #RHS_FIRST_TILE_OFFSET-2
addRandomMushrooms_clear anop
lda tileType,y
beq addRandomMushrooms_skipClear
lda #TILE_EMPTY
sta tileType,y
lda #TILE_STATE_DIRTY
sta tileDirty,y
addRandomMushrooms_skipClear anop
dey
dey
bpl addRandomMushrooms_clear
ldx playerNum
stz numInfieldMushrooms,x
ldx #STARTING_NUM_MUSHROOMS
addRandomMushrooms_loop anop
phx
addRandomMushrooms_tryAgain anop
jsl randomMushroomOffset
tay
lda tileType,y
bne addRandomMushrooms_tryAgain
lda #TILE_MUSHROOM4
sta tileType,y
lda #TILE_STATE_DIRTY
sta tileDirty,y
cpy #SPIDER_STARTING_TOP_ROW_OFFSET
blt addRandomMushrooms_notInfield
ldx playerNum
inc numInfieldMushrooms,x
addRandomMushrooms_notInfield anop
plx
dex
bne addRandomMushrooms_loop
rtl
; Call this with the tile offset of the mushroom being shot in the X register
shootMushroom entry
ldy tileType,x
beq shootMushroom_done
lda #TILE_STATE_DIRTY
sta tileDirty,x
cpy #TILE_POISON_MUSHROOM1
bge shootMushroom_poisoned
tya
sec
sbc #4
sta tileType,x
bne shootMushroom_done
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
ldx playerNum
dec numInfieldMushrooms,x
shootMushrom_notInfield anop
jmp scoreAddOne
shootMushroom_poisonedNoScore anop
tya
sec
sbc #4
sta tileType,x
shootMushroom_done anop
rtl
mushroomToRefresh dc i2'INVALID_TILE_NUM'
mushroomExplosionSprite dc i2'0'
mushroomRefreshWait dc i2'0'
end