BuGS/BuGS/gameFlea.s

353 lines
7.7 KiB
ArmAsm

;
; gameFlea.s
; BuGS
;
; Created by Jeremy Rand on 2020-07-18.
;Copyright © 2020 Jeremy Rand. All rights reserved.
;
case on
mcopy gameFlea.macros
keep gameFlea
gameFlea start
using globalData
using tileData
FLEA_STATE_NONE equ 0
FLEA_STATE_FALLING equ 1
FLEA_STATE_EXPLODING equ 2
FLEA_SCREEN_SPEED_SLOW equ 2*SCREEN_BYTES_PER_ROW
FLEA_SCREEN_SPEED_FAST equ 4*SCREEN_BYTES_PER_ROW
FLEA_SLOW_UPDATES_PER_TILE equ TILE_PIXEL_HEIGHT/2-1
FLEA_FAST_UPDATES_PER_TILE equ TILE_PIXEL_HEIGHT/4-1
fleaInitLevel entry
stz fleaState
rtl
drawFlea entry
lda fleaState
bne drawFlea_cont
rtl
drawFlea_cont anop
ldy fleaScreenOffset
ldx fleaSprite
jsl fleaJump
_dirtyGameOrNonGameTile fleaTileOffsets
_dirtyGameOrNonGameTile fleaTileOffsets+2
_dirtyGameOrNonGameTile fleaTileOffsets+4
_dirtyGameOrNonGameTile fleaTileOffsets+6
rtl
fleaJump entry
cmp #FLEA_STATE_FALLING
bne fleaJump_explosion
lda fleaJumpTable,x
sta jumpInst+1
lda fleaJumpTable+2,x
sta jumpInst+3
bra jumpInst
fleaJump_explosion anop
lda explosionJumpTable,x
sta jumpInst+1
lda explosionJumpTable+2,x
sta jumpInst+3
jumpInst jmp >flea1
nop
updateFlea entry
lda playerState
cmp #PLAYER_STATE_ONSCREEN
beq updateFlea_playerOnscreen
lda fleaState
cmp #FLEA_STATE_EXPLODING
beq updateFlea_playerOnscreen
rtl
updateFlea_playerOnscreen anop
lda fleaState
beq updateFlea_maybeAdd
cmp #FLEA_STATE_FALLING
beq updateFlea_cont
; Handle explosion
lda fleaSprite
beq updateFlea_explosionDone
sec
sbc #$4
sta fleaSprite
rtl
updateFlea_explosionDone anop
jsl stopFleaSound
stz fleaState
rtl
updateFlea_maybeAdd anop
lda gameState
beq updateFlea_doNotAdd
ldx playerNum
lda gameLevel,x
beq updateFlea_doNotAdd
lda scoreNum20000,x
bne updateFlea_moreThan20000
; Below 20000 points, 5 or more mushrooms do not result in a flea
lda #4
bra updateFlea_checkNumMushrooms
updateFlea_moreThan20000 anop
cmp #6
bge updateFlea_moreThan120000
; Between 20000 and 120000, 9 or more mushrooms do not result in a flea
lda #8
bra updateFlea_checkNumMushrooms
updateFlea_moreThan120000 anop
; Above 120000, 15 or more mushrooms do not result in a flea and for every
; 20000 more points, this goes up by 1 more mushroom. So, the accumulator
; has 6 in it for scores from 120000 to 139999. Add 8 to that to get 14
; which is the threshold at which fleas appear.
clc
adc #8
updateFlea_checkNumMushrooms anop
cmp numInfieldMushrooms,x
blt updateFlea_doNotAdd
jmp addFlea
updateFlea_doNotAdd anop
rtl
updateFlea_cont anop
lda fleaHeightInTile
beq updateFlea_nextTile
dec a
sta fleaHeightInTile
beq updateFlea_bottomOfTile
bra updateFlea_nextAction
updateFlea_bottomOfTile anop
lda fleaSpriteCounter
eor #$1
sta fleaSpriteCounter
bne updateFlea_nextAction
lda fleaSprite
beq updateFlea_resetSprite
sec
sbc #$4
sta fleaSprite
bra updateFlea_nextAction
updateFlea_resetSprite anop
lda #FLEA_SPRITE_LAST_OFFSET
sta fleaSprite
bra updateFlea_nextAction
updateFlea_nextTile anop
lda fleaUpdatePerTile
sta fleaHeightInTile
ldx fleaTileOffsets
stx fleaTileOffsets+4
lda tileBelow,x
cmp #INVALID_TILE_NUM
beq updateFlea_bottom
sta fleaTileOffsets
ldx fleaTileOffsets+2
stx fleaTileOffsets+6
lda tileBelow,x
sta fleaTileOffsets+2
ldx fleaTileOffsets+4
lda tileType,x
bne updateFlea_nextAction
jsl rand0_to_65534
and #$3
bne updateFlea_nextAction
lda #TILE_MUSHROOM4
sta tileType,x
lda #TILE_STATE_DIRTY
sta tileDirty,x
cpx #SPIDER_STARTING_TOP_ROW_OFFSET
blt updateFlea_nextAction
ldx playerNum
inc numInfieldMushrooms,x
bra updateFlea_nextAction
updateFlea_bottom anop
jsl stopFleaSound
stz fleaState
rtl
updateFlea_nextAction anop
lda fleaScreenOffset
clc
adc fleaSpeed
sta fleaScreenOffset
updateFlea_done anop
rtl
addFlea entry
lda fleaState
bne addFlea_done
ldx playerNum
lda scoreNum20000,x
cmp #3
bge addFlea_fast
lda #SPRITE_SPEED_SLOW
bra addFlea_setSpeed
addFlea_fast anop
lda #SPRITE_SPEED_FAST
addFlea_setSpeed anop
jsl setFleaSpeed
lda #FLEA_STATE_FALLING
sta fleaState
lda fleaUpdatePerTile
sta fleaHeightInTile
stz fleaSpriteCounter
lda #FLEA_SPRITE_LAST_OFFSET
sta fleaSprite
jsl rand25
asl a
sta fleaTileOffsets
sta fleaTileOffsets+4
tax
lda tileLeft,x
sta fleaTileOffsets+2
sta fleaTileOffsets+6
lda tileScreenOffset,x
sec
sbc #6*SCREEN_BYTES_PER_ROW+3
sta fleaScreenOffset
ldx fleaTileOffsets
jsl startFleaSound
addFlea_done anop
rtl
setFleaSpeed entry
sta fleaSpriteSpeed
cmp #SPRITE_SPEED_FAST
beq setFleaSpeed_fast
lda #FLEA_SCREEN_SPEED_SLOW
sta fleaSpeed
lda #FLEA_SLOW_UPDATES_PER_TILE
sta fleaUpdatePerTile
rtl
setFleaSpeed_fast anop
lda #FLEA_SCREEN_SPEED_FAST
sta fleaSpeed
lda #FLEA_FAST_UPDATES_PER_TILE
sta fleaUpdatePerTile
rtl
; See the isSpiderCollision for info about the requirements and limitations of this routine
isFleaCollision entry
ldx fleaState
cpx #FLEA_STATE_FALLING
bne isFleaCollision_returnFalse
cmp fleaTileOffsets
beq isFleaCollision_returnTrue
cmp fleaTileOffsets+2
beq isFleaCollision_returnTrue
cmp fleaTileOffsets+4
beq isFleaCollision_returnTrue
cmp fleaTileOffsets+6
bne isFleaCollision_returnFalse
isFleaCollision_returnTrue anop
sec
rtl
isFleaCollision_returnFalse anop
clc
rtl
shootFlea entry
lda fleaState
cmp #FLEA_STATE_FALLING
bne shootFlea_done
lda fleaSpeed
cmp #FLEA_SCREEN_SPEED_SLOW
beq shootFlea_faster
jsl explodeFlea
ldx fleaTileOffsets
jsl playKillSound
jmp scoreAddTwoHundred
shootFlea_faster anop
jsl setFleaSpeed_fast
lda fleaHeightInTile
lsr a
sta fleaHeightInTile
bcc shootFlea_done
lda fleaScreenOffset
sec
sbc #SCREEN_BYTES_PER_ROW
sta fleaScreenOffset
shootFlea_done anop
rtl
explodeFlea entry
lda #FLEA_STATE_EXPLODING
sta fleaState
lda #EXPLOSION_LAST_OFFSET
sta fleaSprite
jsl stopFleaSound
rtl
fleaState dc i2'FLEA_STATE_NONE'
fleaScreenOffset dc i2'0'
fleaTileOffsets dc i2'0'
dc i2'0'
dc i2'0'
dc i2'0'
fleaHeightInTile dc i2'0'
fleaSpriteCounter dc i2'0'
fleaSprite dc i2'0'
FLEA_SPRITE_LAST_OFFSET gequ 3*4
fleaJumpTable dc i4'flea4'
dc i4'flea3'
dc i4'flea2'
dc i4'flea1'
fleaSpriteSpeed dc i2'SPRITE_SPEED_SLOW'
fleaSpeed dc i2'FLEA_SCREEN_SPEED_SLOW'
fleaUpdatePerTile dc i2'FLEA_SLOW_UPDATES_PER_TILE'
end