BuGS/BuGS/gameSpider.s

971 lines
24 KiB
ArmAsm

;
; gameSpider.s
; BuGS
;
; Created by Jeremy Rand on 2020-07-23.
;Copyright © 2020 Jeremy Rand. All rights reserved.
;
case on
mcopy gameSpider.macros
keep gameSpider
gameSpider start
using globalData
using tileData
SPIDER_STATE_NONE equ 0
SPIDER_STATE_EXPLODING equ 1
SPIDER_STATE_SCORE equ 2
SPIDER_STATE_LEFT_DIAG_DOWN equ 3
SPIDER_STATE_LEFT_DIAG_UP equ 4
SPIDER_STATE_LEFT_DOWN equ 5
SPIDER_STATE_LEFT_UP equ 6
SPIDER_STATE_RIGHT_DIAG_DOWN equ 7
SPIDER_STATE_RIGHT_DIAG_UP equ 8
SPIDER_STATE_RIGHT_DOWN equ 9
SPIDER_STATE_RIGHT_UP equ 10
SPIDER_LHS_TILE_OFFSET equ SPIDER_STARTING_TOP_ROW_OFFSET
SPIDER_RHS_TILE_OFFSET equ SPIDER_STARTING_TOP_ROW_OFFSET+(GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO
; The spider starts 2 pixel rows above the top row offset so it can slide in on the edge of
; the screen on a diagonal and hit the centre of the tiles with the middle of its body.
SPIDER_STARTING_SHIFT_SLOW equ 2
SPIDER_STARTING_SHIFT_FAST equ 1
SPIDER_LHS_STARTING_SCREEN_OFFSET equ SCREEN_BYTES_PER_ROW*SPIDER_STARTING_SHIFT_SLOW+6
SPIDER_RHS_STARTING_SCREEN_OFFSET equ SCREEN_BYTES_PER_ROW*SPIDER_STARTING_SHIFT_SLOW+4
; Every four frames, change the spider sprite
SPIDER_SPRITE_REFRESH_COUNT equ 4
SPIDER_SCORE_NUM_FRAMES equ 120
SPIDER_SCORE_300 equ 0
SPIDER_SCORE_600 equ 4
SPIDER_SCORE_900 equ 8
SPIDER_SCORE_NONE equ $ffff
SPIDER_VERT_SPEED_SLOW equ SCREEN_BYTES_PER_ROW
SPIDER_VERT_SPEED_FAST equ SCREEN_BYTES_PER_ROW*2
SPIDER_MAX_SHIFT_IN_TILE_SLOW equ TILE_PIXEL_HEIGHT
SPIDER_MAX_SHIFT_IN_TILE_FAST equ TILE_PIXEL_HEIGHT/2
SPIDER_LEFT_SCREEN_SHIFT_SLOW equ 1
SPIDER_LEFT_SCREEN_SHIFT_FAST equ 0
SPIDER_RIGHT_SCREEN_SHIFT_SLOW equ 0
SPIDER_RIGHT_SCREEN_SHIFT_FAST equ 1
; Two seconds or 120 frames after a spider disappears, a spider is added.
SPIDER_ADD_TIME equ 120
spiderInitGame entry
lda #SPIDER_STARTING_TOP_ROW
sta spiderTopRow
lda #SPRITE_SPEED_SLOW
jmp setSpiderSpeed
spiderInitLevel entry
stz spiderAddTime
stz spiderState
rtl
drawSpider entry
lda spiderState
bne drawSpider_cont
rtl
drawSpider_cont anop
ldy spiderScreenOffset
ldx spiderSprite
jsl spiderJump
_dirtyGameOrNonGameTile spiderTileOffsets
_dirtyGameOrNonGameTile spiderTileOffsets+2
_dirtyGameOrNonGameTile spiderTileOffsets+4
_dirtyGameOrNonGameTile spiderTileOffsets+6
_dirtyGameOrNonGameTile spiderTileOffsets+8
_dirtyGameOrNonGameTile spiderTileOffsets+10
rtl
spiderJump entry
cmp #SPIDER_STATE_EXPLODING
beq spiderJump_exploding
cmp #SPIDER_STATE_SCORE
beq spiderJump_score
lda spiderScreenShift
bne spiderJump_shift
lda spiderJumpTable,x
sta jumpInst+1
lda spiderJumpTable+2,x
sta jumpInst+3
bra jumpInst
spiderJump_shift anop
lda spiderShiftJumpTable,x
sta jumpInst+1
lda spiderShiftJumpTable+2,x
sta jumpInst+3
bra jumpInst
spiderJump_score anop
lda spiderScoreJumpTable,x
sta jumpInst+1
lda spiderScoreJumpTable+2,x
sta jumpInst+3
bra jumpInst
spiderJump_exploding anop
iny
lda explosionJumpTable,x
sta jumpInst+1
lda explosionJumpTable+2,x
sta jumpInst+3
jumpInst jmp >spider1
nop
updateSpider entry
lda playerState
cmp #PLAYER_STATE_ONSCREEN
beq updateSpider_cont
ldx spiderState
cpx #SPIDER_STATE_EXPLODING
beq updateSpider_testState
rtl
updateSpider_cont anop
ldx spiderState
cpx #SPIDER_STATE_LEFT_DIAG_DOWN
blt updateSpider_testState
lda spiderSpriteRefresh
beq updateSpider_spriteRefresh
dec a
sta spiderSpriteRefresh
bra updateSpider_testState
updateSpider_spriteRefresh anop
lda #SPIDER_SPRITE_REFRESH_COUNT
sta spiderSpriteRefresh
lda spiderSprite
beq updateSpider_resetSprite
sec
sbc #$4
sta spiderSprite
bra updateSpider_testState
updateSpider_resetSprite anop
lda #SPIDER_SPRITE_LAST_OFFSET
sta spiderSprite
updateSpider_testState anop
txa
asl a
tax
jmp (spiderUpdateJumpTable,x)
updateSpider_exploding anop
lda spiderSprite
beq updateSpider_explosionDone
sec
sbc #$4
sta spiderSprite
rtl
updateSpider_explosionDone anop
lda spiderScoreType
bmi updateSpider_scoreDone
updateSpider_explosionShowScore anop
lda #SPIDER_STATE_SCORE
sta spiderState
lda #SPIDER_SCORE_NUM_FRAMES
sta spiderScoreFrames
lda spiderScoreType
sta spiderSprite
rtl
updateSpider_score anop
lda spiderScoreFrames
beq updateSpider_scoreDone
dec a
sta spiderScoreFrames
rtl
updateSpider_scoreDone anop
stz spiderState
rtl
updateSpider_leftDown anop
updateSpider_rightDown anop
lda spiderScreenOffset
clc
adc spiderVertSpeed
sta spiderScreenOffset
lda spiderShiftInTile
dec a
sta spiderShiftInTile
bne updateSpider_done
jmp updateSpider_tilesDown
updateSpider_leftUp anop
updateSpider_rightUp anop
lda spiderScreenOffset
sec
sbc spiderVertSpeed
sta spiderScreenOffset
lda spiderShiftInTile
dec a
sta spiderShiftInTile
bne updateSpider_done
jmp updateSpider_tilesUp
updateSpider_rightDiagDown anop
lda spiderScreenOffset
clc
adc spiderVertSpeed
sta spiderScreenOffset
lda spiderScreenShift
updateSpider_rightDiagDown_eor anop
eor #1
sta spiderScreenShift
cmp spiderRightStartingScreenShift
bne updateSpider_rightDiagDown_skipInc
inc spiderScreenOffset
updateSpider_rightDiagDown_skipInc anop
lda spiderShiftInTile
dec a
sta spiderShiftInTile
bne updateSpider_rightDiagDown_cont
jmp updateSpider_tilesDown
updateSpider_rightDiagDown_cont anop
cmp spiderStartingShift
bne updateSpider_done
jmp updateSpider_tilesRight
updateSpider_leftDiagDown anop
lda spiderScreenOffset
clc
adc spiderVertSpeed
sta spiderScreenOffset
lda spiderScreenShift
updateSpider_leftDiagDown_eor anop
eor #1
sta spiderScreenShift
cmp spiderLeftStartingScreenShift
bne updateSpider_leftDiagDown_skipInc
dec spiderScreenOffset
updateSpider_leftDiagDown_skipInc anop
lda spiderShiftInTile
dec a
sta spiderShiftInTile
bne updateSpider_leftDiagDown_cont
jmp updateSpider_tilesDown
updateSpider_leftDiagDown_cont anop
cmp spiderStartingShift
bne updateSpider_done
jmp updateSpider_tilesLeft
updateSpider_done anop
rtl
updateSpider_maybeAdd anop
lda gameState
beq updateSpider_done
lda spiderAddTime
bne updateSpider_waitForAdd
lda #SPIDER_ADD_TIME
sta spiderAddTime
rtl
updateSpider_waitForAdd anop
dec a
sta spiderAddTime
bne updateSpider_done
jmp addSpider
updateSpider_leftDiagUp anop
lda spiderScreenOffset
sec
sbc spiderVertSpeed
sta spiderScreenOffset
lda spiderScreenShift
updateSpider_leftDiagUp_eor anop
eor #1
sta spiderScreenShift
cmp spiderLeftStartingScreenShift
bne updateSpider_lefttDiagUp_skipInc
dec spiderScreenOffset
updateSpider_lefttDiagUp_skipInc anop
lda spiderShiftInTile
dec a
sta spiderShiftInTile
bne updateSpider_lefttDiagUp_cont
jmp updateSpider_tilesUp
updateSpider_lefttDiagUp_cont anop
cmp spiderStartingShift
bne updateSpider_done
jmp updateSpider_tilesLeft
rtl
updateSpider_rightDiagUp anop
lda spiderScreenOffset
sec
sbc spiderVertSpeed
sta spiderScreenOffset
lda spiderScreenShift
updateSpider_rightDiagUp_eor anop
eor #1
sta spiderScreenShift
cmp spiderRightStartingScreenShift
bne updateSpider_rightDiagUp_skipInc
inc spiderScreenOffset
updateSpider_rightDiagUp_skipInc anop
lda spiderShiftInTile
dec a
sta spiderShiftInTile
bne updateSpider_rightDiagUp_cont
jmp updateSpider_tilesUp
updateSpider_rightDiagUp_cont anop
cmp spiderStartingShift
bne updateSpider_done
jmp updateSpider_tilesRight
rtl
updateSpider_tilesRight anop
ldx spiderTileOffsets+4
cpx #RHS_FIRST_TILE_OFFSET
blt updateSpider_tilesRight_cont
cpx #LHS_FIRST_TILE_OFFSET
bge updateSpider_tilesRight_cont
jmp updateSpider_offScreen
updateSpider_tilesRight_cont anop
stx spiderTileOffsets+8
ldx spiderTileOffsets+6
stx spiderTileOffsets+10
ldx spiderTileOffsets+2
stx spiderTileOffsets+6
lda tileRight,x
sta spiderTileOffsets+2
ldx spiderTileOffsets
stx spiderTileOffsets+4
lda tileRight,x
sta spiderTileOffsets
ldx spiderTileOffsets+6
jmp updateSpiderSound
updateSpider_tilesLeft anop
ldx spiderTileOffsets+4
cpx #LHS_FIRST_TILE_OFFSET
blt updateSpider_tilesLeft_cont
jmp updateSpider_offScreen
updateSpider_tilesLeft_cont anop
stx spiderTileOffsets
ldx spiderTileOffsets+6
stx spiderTileOffsets+2
ldx spiderTileOffsets+10
stx spiderTileOffsets+6
lda tileLeft,x
sta spiderTileOffsets+10
ldx spiderTileOffsets+8
stx spiderTileOffsets+4
lda tileLeft,x
sta spiderTileOffsets+8
ldx spiderTileOffsets+6
jmp updateSpiderSound
updateSpider_tilesUp anop
lda spiderMaxShiftInTile
sta spiderShiftInTile
lda spiderCurrentRow
dec a
sta spiderCurrentRow
cmp spiderTargetRow
beq updateSpider_upChangeDir
ldx spiderTileOffsets+2
stx spiderTileOffsets
lda tileAbove,x
sta spiderTileOffsets+2
ldx spiderTileOffsets+6
stx spiderTileOffsets+4
lda tileAbove,x
sta spiderTileOffsets+6
; As per the below, clear any mushroom if present
cpx #RHS_FIRST_TILE_OFFSET
bge updateSpider_tilesUpCont
lda tileType,x
beq updateSpider_tilesUpCont
lda #TILE_EMPTY
sta tileType,x
lda #TILE_STATE_DIRTY
sta tileDirty,x
cpx #SPIDER_STARTING_TOP_ROW_OFFSET
blt updateSpider_tilesUpCont
ldy playerNum
lda numInfieldMushrooms,y
dec a
sta numInfieldMushrooms,y
updateSpider_tilesUpCont anop
ldx spiderTileOffsets+10
stx spiderTileOffsets+8
lda tileAbove,x
sta spiderTileOffsets+10
ldx spiderTileOffsets+6
jmp updateSpiderSound
updateSpider_upChangeDir anop
lda #GAME_NUM_TILES_TALL-1
sec
sbc spiderTargetRow
jsl randN
inc a
clc
adc spiderTargetRow
sta spiderTargetRow
jsl rand0_to_65534
and #1
beq updateSpider_upChangeDirDiag
lda spiderState
cmp #SPIDER_STATE_RIGHT_DIAG_DOWN
bge updateSpider_upChangeDirDownRight
lda #SPIDER_STATE_LEFT_DOWN
sta spiderState
rtl
updateSpider_upChangeDirDownRight anop
lda #SPIDER_STATE_RIGHT_DOWN
sta spiderState
rtl
updateSpider_upChangeDirDiag anop
lda spiderState
cmp #SPIDER_STATE_RIGHT_DIAG_DOWN
bge updateSpider_upChangeDirDiagRight
lda #SPIDER_STATE_LEFT_DIAG_DOWN
sta spiderState
rtl
updateSpider_upChangeDirDiagRight anop
lda #SPIDER_STATE_RIGHT_DIAG_DOWN
sta spiderState
rtl
updateSpider_tilesDown anop
lda spiderMaxShiftInTile
sta spiderShiftInTile
lda spiderCurrentRow
inc a
sta spiderCurrentRow
cmp spiderTargetRow
beq updateSpider_downChangeDir
ldx spiderTileOffsets
stx spiderTileOffsets+2
lda tileBelow,x
sta spiderTileOffsets
ldx spiderTileOffsets+4
stx spiderTileOffsets+6
lda tileBelow,x
sta spiderTileOffsets+4
; If the middle tile is a game time and it isn't empty, then
; empty it. Spiders "consume" mushrooms as they pass over them.
cpx #RHS_FIRST_TILE_OFFSET
bge updateSpider_tilesDownCont
lda tileType,x
beq updateSpider_tilesDownCont
lda #TILE_EMPTY
sta tileType,x
lda #TILE_STATE_DIRTY
sta tileDirty,x
cpx #SPIDER_STARTING_TOP_ROW_OFFSET
blt updateSpider_tilesDownCont
ldy playerNum
lda numInfieldMushrooms,y
dec a
sta numInfieldMushrooms,y
updateSpider_tilesDownCont anop
ldx spiderTileOffsets+8
stx spiderTileOffsets+10
lda tileBelow,x
sta spiderTileOffsets+8
ldx spiderTileOffsets+6
jmp updateSpiderSound
updateSpider_downChangeDir anop
lda spiderTargetRow
sec
sbc spiderTopRow
jsl randN
clc
adc spiderTopRow
sta spiderTargetRow
jsl rand0_to_65534
and #1
beq updateSpider_downChangeDirDiag
lda spiderState
cmp #SPIDER_STATE_RIGHT_DIAG_DOWN
bge updateSpider_downChangeDirUpRight
lda #SPIDER_STATE_LEFT_UP
sta spiderState
rtl
updateSpider_downChangeDirUpRight anop
lda #SPIDER_STATE_RIGHT_UP
sta spiderState
rtl
updateSpider_downChangeDirDiag anop
lda spiderState
cmp #SPIDER_STATE_RIGHT_DIAG_DOWN
bge updateSpider_downChangeDirDiagRight
lda #SPIDER_STATE_LEFT_DIAG_UP
sta spiderState
rtl
updateSpider_downChangeDirDiagRight anop
lda #SPIDER_STATE_RIGHT_DIAG_UP
sta spiderState
rtl
updateSpider_offScreen anop
jsl stopSpiderSound
stz spiderState
rtl
addSpider entry
lda spiderState
beq addSpider_checkSpeed
rtl
addSpider_checkSpeed anop
lda playerNum
asl a
tax
lda gameScore+2,x
bne addSpider_fast
lda gameScore,x
cmp #5000
bge addSpider_fast
lda #SPRITE_SPEED_SLOW
bra addSpider_setSpeed
addSpider_fast anop
lda #SPRITE_SPEED_FAST
addSpider_setSpeed anop
cmp spiderSpeed
beq addSpider_setHeight
jsl setSpiderSpeed
addSpider_setHeight anop
; The actual top row of the spider changes as the score goes up.
; The top row of the spider based on the score is:
; 0 to 119,000 - 10th row from bottom
; 120,000 to 139,999 - 9th row from bottom
; 140,000 to 159,999 - 8th row from bottom
; 160,000 to ... - 7th row from bottom
ldx playerNum
lda scoreNum20000,x
cmp #6
blt addSpider_height10
beq addSpider_height9
cmp #7
beq addSpider_height8
lda #SPIDER_STARTING_TOP_ROW+3
bra addSpider_doneHeight
addSpider_height10 anop
lda #SPIDER_STARTING_TOP_ROW
bra addSpider_doneHeight
addSpider_height9 anop
lda #SPIDER_STARTING_TOP_ROW+1
bra addSpider_doneHeight
addSpider_height8 anop
lda #SPIDER_STARTING_TOP_ROW+2
addSpider_doneHeight anop
sta spiderTopRow
lda spiderStartingShift
sta spiderShiftInTile
lda #SPIDER_SPRITE_LAST_OFFSET
sta spiderSprite
lda #SPIDER_SPRITE_REFRESH_COUNT
sta spiderSpriteRefresh
lda #SPIDER_STARTING_TOP_ROW-1
sta spiderCurrentRow
lda #GAME_NUM_TILES_TALL-1
sec
sbc spiderTopRow
jsl randN
; We intentionally set carry before adding here. I want to add (spiderTopRow + 1) to the
; random number we already got. That way, the target row is (spiderTopRow + 1) to
; (GAME_NUM_TILES_TALL - 1)
sec
adc spiderTopRow
sta spiderTargetRow
jsl rand0_to_65534
and #1
beq addSpider_right
addSpider_left anop
lda #SPIDER_STATE_LEFT_DIAG_DOWN
sta spiderState
lda spiderLeftStartingScreenShift
sta spiderScreenShift
ldx #SPIDER_RHS_TILE_OFFSET
stx spiderTileOffsets+8
lda tileAbove,x
sta spiderTileOffsets+10
lda tileRight,x
sta spiderTileOffsets+4
tax
lda tileScreenOffset,x
sec
sbc #SPIDER_RHS_STARTING_SCREEN_OFFSET
sta spiderScreenOffset
lda tileAbove,x
sta spiderTileOffsets+6
lda tileRight,x
sta spiderTileOffsets
tax
lda tileAbove,x
sta spiderTileOffsets+2
ldx spiderTileOffsets+6
jsl startSpiderSound
rtl
addSpider_right anop
lda #SPIDER_STATE_RIGHT_DIAG_DOWN
sta spiderState
lda spiderRightStartingScreenShift
sta spiderScreenShift
ldx #SPIDER_LHS_TILE_OFFSET
stx spiderTileOffsets
lda tileAbove,x
sta spiderTileOffsets+2
lda tileLeft,x
sta spiderTileOffsets+4
tax
lda tileScreenOffset,x
sec
sbc #SPIDER_LHS_STARTING_SCREEN_OFFSET
sta spiderScreenOffset
lda tileAbove,x
sta spiderTileOffsets+6
lda tileLeft,x
sta spiderTileOffsets+8
tax
lda tileAbove,x
sta spiderTileOffsets+10
ldx spiderTileOffsets+6
jsl startSpiderSound
rtl
setSpiderSpeed entry
sta spiderSpeed
cmp #SPRITE_SPEED_FAST
beq setSpiderSpeed_fast
lda #SPIDER_VERT_SPEED_SLOW
sta spiderVertSpeed
lda #SPIDER_MAX_SHIFT_IN_TILE_SLOW
sta spiderMaxShiftInTile
lda #SPIDER_STARTING_SHIFT_SLOW
sta spiderStartingShift
lda #SPIDER_LEFT_SCREEN_SHIFT_SLOW
sta spiderLeftStartingScreenShift
lda #SPIDER_RIGHT_SCREEN_SHIFT_SLOW
sta spiderRightStartingScreenShift
; This is funky. This sets the instruction at these location to be an immediate eor
; instruction. That causes us to only move to the next byte every other frame.
short i,m
lda #$49
sta updateSpider_rightDiagDown_eor
sta updateSpider_rightDiagUp_eor
sta updateSpider_leftDiagDown_eor
sta updateSpider_leftDiagUp_eor
long i,m
rtl
setSpiderSpeed_fast anop
lda #SPIDER_VERT_SPEED_FAST
sta spiderVertSpeed
lda #SPIDER_MAX_SHIFT_IN_TILE_FAST
sta spiderMaxShiftInTile
lda #SPIDER_STARTING_SHIFT_FAST
sta spiderStartingShift
lda #SPIDER_LEFT_SCREEN_SHIFT_FAST
sta spiderLeftStartingScreenShift
lda #SPIDER_RIGHT_SCREEN_SHIFT_FAST
sta spiderRightStartingScreenShift
; This is funky. This sets the instruction at these location to be an immediate or
; instruction for the right and and immediate and instruction for the left. That causes
; us to only move to the next byte on every frame.
short i,m
lda #$09
sta updateSpider_rightDiagDown_eor
sta updateSpider_rightDiagUp_eor
lda #$29
sta updateSpider_leftDiagDown_eor
sta updateSpider_leftDiagUp_eor
long i,m
rtl
; The accumulator has the tile where the collision occurred.
; The y register has the address where the collision occurred.
; This routine is expected to preserve the y register and the
; accummulator. It can change the x register.
;
; For now, the implementation is very rough and just looks to see if
; collision is in a tile overlapping with the spider. It would be
; better to look closely at the address and try to figure out if it
; really collided.
;
; The result here is returned in the C bit of the processor status
; register
isSpiderCollision entry
ldx spiderState
cpx #SPIDER_STATE_LEFT_DIAG_DOWN
bge isSpiderCollision_test
isSpiderCollision_returnFalse anop
clc
rtl
isSpiderCollision_test anop
cmp spiderTileOffsets
beq isSpiderCollision_returnTrue
cmp spiderTileOffsets+2
beq isSpiderCollision_returnTrue
cmp spiderTileOffsets+4
beq isSpiderCollision_returnTrue
cmp spiderTileOffsets+6
beq isSpiderCollision_returnTrue
cmp spiderTileOffsets+8
beq isSpiderCollision_returnTrue
cmp spiderTileOffsets+10
bne isSpiderCollision_returnFalse
isSpiderCollision_returnTrue anop
sec
rtl
shootSpider entry
lda spiderState
cmp #SPIDER_STATE_LEFT_DIAG_DOWN
blt shootSpider_done
ldx spiderTileOffsets+6
jsl playKillSound
jsl explodeSpider
cmp mouseAddress
blt shootSpider_playerBelow
sec
sbc mouseAddress
bra shootSpider_testDistance
shootSpider_playerBelow anop
lda mouseAddress
sec
sbc spiderScreenOffset
shootSpider_testDistance anop
cmp #SPIDER_DISTANCE_900
blt shootSpider_900
cmp #SPIDER_DISTANCE_600
blt shootSpider_600
lda #SPIDER_SCORE_300
sta spiderScoreType
jmp scoreAddThreeHundred
shootSpider_600 anop
lda #SPIDER_SCORE_600
sta spiderScoreType
jmp scoreAddSixHundred
shootSpider_900 anop
lda #SPIDER_SCORE_900
sta spiderScoreType
jmp scoreAddNineHundred
shootSpider_done anop
rtl
explodeSpider entry
lda #SPIDER_SCORE_NONE
sta spiderScoreType
lda spiderState
cmp #SPIDER_STATE_LEFT_DIAG_DOWN
blt explodeSpider_done
lda #SPIDER_STATE_EXPLODING
sta spiderState
lda #EXPLOSION_LAST_OFFSET
sta spiderSprite
lda spiderScreenOffset
inc a
sta spiderScreenOffset
jsl stopSpiderSound
explodeSpider_done anop
rtl
spiderState dc i2'SPIDER_STATE_NONE'
spiderSpeed dc i2'SPRITE_SPEED_SLOW'
spiderSprite dc i2'0'
spiderSpriteRefresh dc i2'0'
spiderScreenOffset dc i2'0'
spiderScreenShift dc i2'0'
spiderShiftInTile dc i2'0'
spiderAddTime dc i2'0'
spiderTopRow dc i2'SPIDER_STARTING_TOP_ROW'
spiderCurrentRow dc i2'0'
spiderTargetRow dc i2'0'
spiderScoreType dc i2'0'
spiderScoreFrames dc i2'0'
spiderVertSpeed dc i2'SPIDER_VERT_SPEED_SLOW'
spiderMaxShiftInTile dc i2'SPIDER_MAX_SHIFT_IN_TILE_SLOW'
spiderStartingShift dc i2'SPIDER_STARTING_SHIFT_SLOW'
spiderLeftStartingScreenShift dc i2'SPIDER_LEFT_SCREEN_SHIFT_SLOW'
spiderRightStartingScreenShift dc i2'SPIDER_RIGHT_SCREEN_SHIFT_SLOW'
; 10 6 2
; 8 4 0
spiderTileOffsets dc i2'0'
dc i2'0'
dc i2'0'
dc i2'0'
dc i2'0'
dc i2'0'
SPIDER_SPRITE_LAST_OFFSET gequ 7*4
spiderJumpTable dc i4'spider7'
dc i4'spider6'
dc i4'spider2'
dc i4'spider3'
dc i4'spider4'
dc i4'spider3'
dc i4'spider2'
dc i4'spider1'
spiderShiftJumpTable dc i4'spider7s'
dc i4'spider6s'
dc i4'spider2s'
dc i4'spider3s'
dc i4'spider4s'
dc i4'spider3s'
dc i4'spider2s'
dc i4'spider1s'
spiderUpdateJumpTable dc i2'updateSpider_maybeAdd'
dc i2'updateSpider_exploding'
dc i2'updateSpider_score'
dc i2'updateSpider_leftDiagDown'
dc i2'updateSpider_leftDiagUp'
dc i2'updateSpider_leftDown'
dc i2'updateSpider_leftUp'
dc i2'updateSpider_rightDiagDown'
dc i2'updateSpider_rightDiagUp'
dc i2'updateSpider_rightDown'
dc i2'updateSpider_rightUp'
spiderScoreJumpTable dc i4'score300'
dc i4'score600'
dc i4'score900'
end