BuGS/BuGS/gameScorpion.s

406 lines
12 KiB
ArmAsm

;
; gameScorpion.s
; BuGS
;
; Created by Jeremy Rand on 2020-07-20.
;Copyright © 2020 Jeremy Rand. All rights reserved.
;
case on
mcopy gameScorpion.macros
keep gameScorpion
gameScorpion start
using globalData
SCORPION_STATE_NONE equ 0
SCORPION_STATE_LEFT equ 1
SCORPION_STATE_RIGHT equ 2
SCORPION_STATE_EXPLODING equ 3
SCORPION_SLOW_UPDATES_PER_TILE equ TILE_PIXEL_WIDTH-1
SCORPION_FAST_UPDATES_PER_TILE equ TILE_PIXEL_WIDTH/2-1
; A scorpion will only be generated in the top N rows. This defines that number.
SCORPION_NUM_POSSIBLE_ROWS equ 15
drawScorpion entry
lda scorpionState
bne drawScorpion_cont
rtl
drawScorpion_cont anop
ldy scorpionScreenOffset
ldx scorpionSprite
jsl scorpionJump
ldx scorpionTileOffsets
lda tiles+TILE_DIRTY_OFFSET,x
bne drawScorpion_skipTile1
lda #TILE_STATE_DIRTY
sta tiles+TILE_DIRTY_OFFSET,x
txa
cmp #RHS_FIRST_TILE_OFFSET
bge drawScorpion_nonGame1
ldy numDirtyGameTiles
sta dirtyGameTiles,y
iny
iny
sty numDirtyGameTiles
bra drawScorpion_skipTile1
drawScorpion_nonGame1 anop
ldy numDirtyNonGameTiles
sta dirtyNonGameTiles,y
iny
iny
sty numDirtyNonGameTiles
drawScorpion_skipTile1 anop
ldx scorpionTileOffsets+2
lda tiles+TILE_DIRTY_OFFSET,x
bne drawScorpion_skipTile2
lda #TILE_STATE_DIRTY
sta tiles+TILE_DIRTY_OFFSET,x
txa
cmp #RHS_FIRST_TILE_OFFSET
bge drawScorpion_nonGame2
ldy numDirtyGameTiles
sta dirtyGameTiles,y
iny
iny
sty numDirtyGameTiles
bra drawScorpion_skipTile2
drawScorpion_nonGame2 anop
ldy numDirtyNonGameTiles
sta dirtyNonGameTiles,y
iny
iny
sty numDirtyNonGameTiles
drawScorpion_skipTile2 anop
ldx scorpionTileOffsets+4
lda tiles+TILE_DIRTY_OFFSET,x
bne drawScorpion_done
lda #TILE_STATE_DIRTY
sta tiles+TILE_DIRTY_OFFSET,x
txa
cmp #RHS_FIRST_TILE_OFFSET
bge drawScorpion_nonGame3
ldy numDirtyGameTiles
sta dirtyGameTiles,y
iny
iny
sty numDirtyGameTiles
rtl
drawScorpion_nonGame3 anop
ldy numDirtyNonGameTiles
sta dirtyNonGameTiles,y
iny
iny
sty numDirtyNonGameTiles
drawScorpion_done anop
rtl
scorpionJump entry
cmp #SCORPION_STATE_LEFT
bne scorpionJump_next
lda scorpionLeftJumpTable,x
sta jumpInst+1
lda scorpionLeftJumpTable+2,x
sta jumpInst+3
bra jumpInst
scorpionJump_next anop
cmp #SCORPION_STATE_RIGHT
bne scorpionJump_explosion
lda scorpionRightJumpTable,x
sta jumpInst+1
lda scorpionRightJumpTable+2,x
sta jumpInst+3
bra jumpInst
scorpionJump_explosion anop
tya
clc
adc #TILE_BYTE_WIDTH
tay
lda explosionJumpTable,x
sta jumpInst+1
lda explosionJumpTable+2,x
sta jumpInst+3
jumpInst jmp >leftScorpion1
nop
updateScorpion entry
lda scorpionState
bne updateScorpion_cont
rtl
updateScorpion_cont anop
cmp #SCORPION_STATE_EXPLODING
bra updateScorpion_notExploding
jmp updateScorpion_exploding
updateScorpion_notExploding anop
; Common code for left or right moving scorpions
lda scorpionSprite
beq updateScorpion_resetSprite
sec
sbc #$4
sta scorpionSprite
bra updateScorpion_nextAction
updateScorpion_resetSprite anop
lda #SCORPION_SPRITE_LAST_OFFSET
sta scorpionSprite
updateScorpion_nextAction anop
lda scorpionShiftInTile
beq updateScorpion_nextTile
dec a
sta scorpionShiftInTile
and #$1
beq updateScorpion_done
lda scorpionState
cmp #SCORPION_STATE_LEFT
beq updateScorpion_screenLeft
inc scorpionScreenOffset
rtl
updateScorpion_screenLeft anop
dec scorpionScreenOffset
rtl
updateScorpion_nextTile anop
lda scorpionState
cmp #SCORPION_STATE_LEFT
beq updateScorpionLeft_nextTile
updateScorpionRight_nextTile anop
inc scorpionScreenOffset
lda #SCORPION_SLOW_UPDATES_PER_TILE
sta scorpionShiftInTile
ldx scorpionTileOffsets+2
cpx #RHS_FIRST_TILE_OFFSET
blt updateScorpionRight_notOffScreen
cpx #LHS_FIRST_TILE_OFFSET
bge updateScorpionRight_notOffScreen
bra updateScorpion_offScreen
updateScorpionLeft_nextTile anop
dec scorpionScreenOffset
lda #SCORPION_SLOW_UPDATES_PER_TILE
sta scorpionShiftInTile
ldx scorpionTileOffsets+2
cpx #LHS_FIRST_TILE_OFFSET
bge updateScorpion_offScreen
stx scorpionTileOffsets+4
ldx scorpionTileOffsets
stx scorpionTileOffsets+2
lda tiles+TILE_LEFT_OFFSET,x
sta scorpionTileOffsets
bra updateScorpion_maybePoison
updateScorpionRight_notOffScreen anop
stx scorpionTileOffsets+4
ldx scorpionTileOffsets
stx scorpionTileOffsets+2
lda tiles+TILE_RIGHT_OFFSET,x
sta scorpionTileOffsets
updateScorpion_maybePoison anop
lda tiles+TILE_TYPE_OFFSET,x
beq updateScorpion_done
cmp #TILE_MUSHROOM4+1
bge updateScorpion_done
ora #32
sta tiles+TILE_TYPE_OFFSET,x
rtl
updateScorpion_offScreen anop
stz scorpionState
rtl
updateScorpion_exploding anop
; Write this code
updateScorpion_done anop
rtl
addScorpion entry
lda scorpionState
bne addScorpion_done
jsl rand0_to_14
asl a
tay
jsl rand0_to_65534
and #1
beq addScorpion_right
lda #SCORPION_STATE_LEFT
sta scorpionState
ldx scorpionLeftTileOffset,y
stx scorpionTileOffsets
lda tiles+TILE_SCREEN_OFFSET_OFFSET,x
dec a
sta scorpionScreenOffset
lda tiles+TILE_RIGHT_OFFSET,x
sta scorpionTileOffsets+2
tax
lda tiles+TILE_RIGHT_OFFSET,x
sta scorpionTileOffsets+4
bra addScorpion_common
addScorpion_right anop
lda #SCORPION_STATE_RIGHT
sta scorpionState
ldx scorpionRightTileOffset,y
stx scorpionTileOffsets
lda tiles+TILE_LEFT_OFFSET,x
sta scorpionTileOffsets+2
tax
lda tiles+TILE_LEFT_OFFSET,x
sta scorpionTileOffsets+4
tax
lda tiles+TILE_SCREEN_OFFSET_OFFSET,x
dec a
dec a
sta scorpionScreenOffset
addScorpion_common anop
lda #SCORPION_SLOW_UPDATES_PER_TILE
sta scorpionShiftInTile
lda #SCORPION_SPRITE_LAST_OFFSET
sta scorpionSprite
addScorpion_done anop
rtl
shootScorpion entry
rtl
scorpionState dc i2'SCORPION_STATE_NONE'
scorpionScreenOffset dc i2'0'
scorpionTileOffsets dc i2'0'
dc i2'0'
dc i2'0'
scorpionShiftInTile dc i2'0'
scorpionSprite dc i2'0'
SCORPION_SPRITE_LAST_OFFSET gequ 15*4
scorpionLeftJumpTable dc i4'leftScorpion4'
dc i4'leftScorpion4s'
dc i4'leftScorpion4'
dc i4'leftScorpion4s'
dc i4'leftScorpion3'
dc i4'leftScorpion3s'
dc i4'leftScorpion3'
dc i4'leftScorpion3s'
dc i4'leftScorpion2'
dc i4'leftScorpion2s'
dc i4'leftScorpion2'
dc i4'leftScorpion2s'
dc i4'leftScorpion1'
dc i4'leftScorpion1s'
dc i4'leftScorpion1'
dc i4'leftScorpion1s'
scorpionRightJumpTable dc i4'rightScorpion4'
dc i4'rightScorpion4s'
dc i4'rightScorpion4'
dc i4'rightScorpion4s'
dc i4'rightScorpion3'
dc i4'rightScorpion3s'
dc i4'rightScorpion3'
dc i4'rightScorpion3s'
dc i4'rightScorpion2'
dc i4'rightScorpion2s'
dc i4'rightScorpion2'
dc i4'rightScorpion2s'
dc i4'rightScorpion1'
dc i4'rightScorpion1s'
dc i4'rightScorpion1'
dc i4'rightScorpion1s'
scorpionLeftTileOffset dc i2'((0*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((1*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((2*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((3*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((4*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((5*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((6*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((7*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((8*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((9*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((10*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((11*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((12*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((13*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
dc i2'((14*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO'
scorpionRightTileOffset dc i2'0*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'1*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'2*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'3*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'4*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'5*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'6*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'7*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'8*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'9*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'10*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'11*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'12*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'13*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
dc i2'14*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO'
end