mirror of
https://github.com/jeremysrand/BuGS.git
synced 2024-05-29 08:41:26 +00:00
464 lines
11 KiB
ArmAsm
464 lines
11 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
|
|
|
|
SPIDER_STATE_NONE equ 0
|
|
SPIDER_STATE_EXPLODING equ 1
|
|
SPIDER_STATE_LEFT_DIAG_DOWN equ 2
|
|
SPIDER_STATE_LEFT_DIAG_UP equ 3
|
|
SPIDER_STATE_LEFT_DOWN equ 4
|
|
SPIDER_STATE_LEFT_UP equ 5
|
|
SPIDER_STATE_RIGHT_DIAG_DOWN equ 6
|
|
SPIDER_STATE_RIGHT_DIAG_UP equ 7
|
|
SPIDER_STATE_RIGHT_DOWN equ 8
|
|
SPIDER_STATE_RIGHT_UP equ 9
|
|
|
|
|
|
; A spider only travels in the bottom N rows. This defines that number.
|
|
SPIDER_NUM_POSSIBLE_ROWS equ 10
|
|
SPIDER_TOP_ROW equ GAME_NUM_TILES_TALL-SPIDER_NUM_POSSIBLE_ROWS
|
|
SPIDER_TOP_ROW_OFFSET equ SPIDER_TOP_ROW*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO
|
|
SPIDER_LHS_TILE_OFFSET equ SPIDER_TOP_ROW_OFFSET
|
|
SPIDER_RHS_TILE_OFFSET equ SPIDER_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 equ 2
|
|
SPIDER_LHS_STARTING_SCREEN_OFFSET equ SCREEN_BYTES_PER_ROW*SPIDER_STARTING_SHIFT+6
|
|
|
|
|
|
drawSpider entry
|
|
lda spiderState
|
|
bne drawSpider_cont
|
|
rtl
|
|
|
|
drawSpider_cont anop
|
|
ldy spiderScreenOffset
|
|
ldx spiderSprite
|
|
jsl spiderJump
|
|
|
|
ldx spiderTileOffsets
|
|
lda tiles+TILE_DIRTY_OFFSET,x
|
|
bne drawSpider_skipTile1
|
|
lda #TILE_STATE_DIRTY
|
|
sta tiles+TILE_DIRTY_OFFSET,x
|
|
txa
|
|
cmp #RHS_FIRST_TILE_OFFSET
|
|
bge drawSpider_nonGame1
|
|
|
|
ldy numDirtyGameTiles
|
|
sta dirtyGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyGameTiles
|
|
bra drawSpider_skipTile1
|
|
|
|
drawSpider_nonGame1 anop
|
|
ldy numDirtyNonGameTiles
|
|
sta dirtyNonGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyNonGameTiles
|
|
|
|
drawSpider_skipTile1 anop
|
|
ldx spiderTileOffsets+2
|
|
lda tiles+TILE_DIRTY_OFFSET,x
|
|
bne drawSpider_skipTile2
|
|
lda #TILE_STATE_DIRTY
|
|
sta tiles+TILE_DIRTY_OFFSET,x
|
|
txa
|
|
cmp #RHS_FIRST_TILE_OFFSET
|
|
bge drawSpider_nonGame2
|
|
|
|
ldy numDirtyGameTiles
|
|
sta dirtyGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyGameTiles
|
|
bra drawSpider_skipTile2
|
|
|
|
drawSpider_nonGame2 anop
|
|
ldy numDirtyNonGameTiles
|
|
sta dirtyNonGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyNonGameTiles
|
|
|
|
drawSpider_skipTile2 anop
|
|
ldx spiderTileOffsets+4
|
|
lda tiles+TILE_DIRTY_OFFSET,x
|
|
bne drawSpider_skipTile3
|
|
lda #TILE_STATE_DIRTY
|
|
sta tiles+TILE_DIRTY_OFFSET,x
|
|
txa
|
|
cmp #RHS_FIRST_TILE_OFFSET
|
|
bge drawSpider_nonGame3
|
|
|
|
ldy numDirtyGameTiles
|
|
sta dirtyGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyGameTiles
|
|
bra drawSpider_skipTile3
|
|
|
|
drawSpider_nonGame3 anop
|
|
ldy numDirtyNonGameTiles
|
|
sta dirtyNonGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyNonGameTiles
|
|
|
|
drawSpider_skipTile3 anop
|
|
ldx spiderTileOffsets+6
|
|
lda tiles+TILE_DIRTY_OFFSET,x
|
|
bne drawSpider_skipTile4
|
|
lda #TILE_STATE_DIRTY
|
|
sta tiles+TILE_DIRTY_OFFSET,x
|
|
txa
|
|
cmp #RHS_FIRST_TILE_OFFSET
|
|
bge drawSpider_nonGame4
|
|
|
|
ldy numDirtyGameTiles
|
|
sta dirtyGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyGameTiles
|
|
bra drawSpider_skipTile4
|
|
|
|
drawSpider_nonGame4 anop
|
|
ldy numDirtyNonGameTiles
|
|
sta dirtyNonGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyNonGameTiles
|
|
|
|
drawSpider_skipTile4 anop
|
|
ldx spiderTileOffsets+8
|
|
lda tiles+TILE_DIRTY_OFFSET,x
|
|
bne drawSpider_skipTile5
|
|
lda #TILE_STATE_DIRTY
|
|
sta tiles+TILE_DIRTY_OFFSET,x
|
|
txa
|
|
cmp #RHS_FIRST_TILE_OFFSET
|
|
bge drawSpider_nonGame5
|
|
|
|
ldy numDirtyGameTiles
|
|
sta dirtyGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyGameTiles
|
|
bra drawSpider_skipTile5
|
|
|
|
drawSpider_nonGame5 anop
|
|
ldy numDirtyNonGameTiles
|
|
sta dirtyNonGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyNonGameTiles
|
|
|
|
drawSpider_skipTile5 anop
|
|
ldx spiderTileOffsets+10
|
|
lda tiles+TILE_DIRTY_OFFSET,x
|
|
bne drawSpider_done
|
|
lda #TILE_STATE_DIRTY
|
|
sta tiles+TILE_DIRTY_OFFSET,x
|
|
txa
|
|
cmp #RHS_FIRST_TILE_OFFSET
|
|
bge drawSpider_nonGame6
|
|
|
|
ldy numDirtyGameTiles
|
|
sta dirtyGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyGameTiles
|
|
rtl
|
|
|
|
drawSpider_nonGame6 anop
|
|
ldy numDirtyNonGameTiles
|
|
sta dirtyNonGameTiles,y
|
|
iny
|
|
iny
|
|
sty numDirtyNonGameTiles
|
|
|
|
drawSpider_done anop
|
|
rtl
|
|
|
|
spiderJump entry
|
|
cmp #SPIDER_STATE_EXPLODING
|
|
beq spiderJump_exploding
|
|
|
|
lda spiderScreenShift
|
|
beq 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_exploding anop
|
|
tya
|
|
clc
|
|
adc #TILE_BYTE_WIDTH
|
|
tay
|
|
|
|
lda explosionJumpTable,x
|
|
sta jumpInst+1
|
|
|
|
lda explosionJumpTable+2,x
|
|
sta jumpInst+3
|
|
|
|
jumpInst jmp >spider1
|
|
nop
|
|
|
|
|
|
updateSpider entry
|
|
lda spiderState
|
|
bne updateSpider_cont
|
|
rtl
|
|
|
|
updateSpider_cont anop
|
|
|
|
dec a
|
|
beq updateSpider_exploding
|
|
|
|
tay
|
|
|
|
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
|
|
tya
|
|
dec a
|
|
beq updateSpider_leftDiagDown
|
|
|
|
dec a
|
|
beq updateSpider_leftDiagUp
|
|
|
|
dec a
|
|
beq updateSpider_leftDown
|
|
|
|
dec a
|
|
beq updateSpider_leftUp
|
|
|
|
dec a
|
|
beq updateSpider_rightDiagDown
|
|
|
|
dec a
|
|
beq updateSpider_rightDiagUp
|
|
|
|
dec a
|
|
beq updateSpider_rightDown
|
|
|
|
bra updateSpider_rightUp
|
|
|
|
updateSpider_exploding anop
|
|
lda spiderSprite
|
|
beq updateSpider_explosionDone
|
|
sec
|
|
sbc #$4
|
|
sta spiderSprite
|
|
rtl
|
|
|
|
updateSpider_explosionDone anop
|
|
stz spiderState
|
|
rtl
|
|
|
|
|
|
updateSpider_leftDiagDown anop
|
|
updateSpider_leftDiagUp anop
|
|
updateSpider_leftDown anop
|
|
updateSpider_leftUp anop
|
|
updateSpider_rightDiagUp anop
|
|
updateSpider_rightDown anop
|
|
updateSpider_rightUp anop
|
|
; Write this code
|
|
rtl
|
|
|
|
updateSpider_rightDiagDown anop
|
|
jsl waitForKey
|
|
lda spiderScreenOffset
|
|
clc
|
|
adc #SCREEN_BYTES_PER_ROW
|
|
sta spiderScreenOffset
|
|
|
|
lda spiderScreenShift
|
|
eor #1
|
|
sta spiderScreenShift
|
|
bne updateSpider_rightDiagDown_skipInc
|
|
inc spiderScreenOffset
|
|
|
|
updateSpider_rightDiagDown_skipInc anop
|
|
|
|
lda spiderShiftInTile
|
|
dec a
|
|
sta spiderShiftInTile
|
|
beq updateSpider_tilesDown
|
|
|
|
cmp #5
|
|
beq updateSpider_tilesRight
|
|
rtl
|
|
|
|
updateSpider_tilesRight anop
|
|
ldx spiderTileOffsets+4
|
|
cmp #RHS_FIRST_TILE_OFFSET
|
|
bge updateSpider_offScreen
|
|
stx spiderTileOffsets+8
|
|
|
|
ldx spiderTileOffsets+6
|
|
stx spiderTileOffsets+10
|
|
|
|
ldx spiderTileOffsets+2
|
|
stx spiderTileOffsets+6
|
|
lda tiles+TILE_RIGHT_OFFSET,x
|
|
sta spiderTileOffsets+2
|
|
|
|
ldx spiderTileOffsets
|
|
stx spiderTileOffsets+4
|
|
lda tiles+TILE_RIGHT_OFFSET,x
|
|
sta spiderTileOffsets
|
|
|
|
rtl
|
|
|
|
updateSpider_tilesDown anop
|
|
ldx spiderTileOffsets
|
|
stx spiderTileOffsets+2
|
|
lda tiles+TILE_BELOW_OFFSET,x
|
|
cmp #INVALID_TILE_NUM
|
|
beq updateSpider_offScreen
|
|
sta spiderTileOffsets
|
|
|
|
ldx spiderTileOffsets+4
|
|
stx spiderTileOffsets+6
|
|
lda tiles+TILE_BELOW_OFFSET,x
|
|
sta spiderTileOffsets+4
|
|
|
|
ldx spiderTileOffsets+8
|
|
stx spiderTileOffsets+10
|
|
lda tiles+TILE_BELOW_OFFSET,x
|
|
sta spiderTileOffsets+8
|
|
|
|
rtl
|
|
|
|
updateSpider_offScreen anop
|
|
stz spiderState
|
|
rtl
|
|
|
|
|
|
addSpider entry
|
|
lda spiderState
|
|
bne addSpider_done
|
|
|
|
lda #SPIDER_STATE_RIGHT_DIAG_DOWN
|
|
sta spiderState
|
|
|
|
stz spiderScreenShift
|
|
|
|
ldx #SPIDER_LHS_TILE_OFFSET
|
|
stx spiderTileOffsets
|
|
|
|
lda tiles+TILE_ABOVE_OFFSET,x
|
|
sta spiderTileOffsets+2
|
|
|
|
lda tiles+TILE_LEFT_OFFSET,x
|
|
sta spiderTileOffsets+4
|
|
|
|
tax
|
|
lda tiles+TILE_SCREEN_OFFSET_OFFSET,x
|
|
sec
|
|
sbc #SPIDER_LHS_STARTING_SCREEN_OFFSET
|
|
sta spiderScreenOffset
|
|
|
|
lda tiles+TILE_ABOVE_OFFSET,x
|
|
sta spiderTileOffsets+6
|
|
|
|
lda tiles+TILE_LEFT_OFFSET,x
|
|
sta spiderTileOffsets+8
|
|
|
|
tax
|
|
lda tiles+TILE_ABOVE_OFFSET,x
|
|
sta spiderTileOffsets+10
|
|
|
|
lda #7
|
|
sta spiderShiftInTile
|
|
|
|
lda #SPIDER_SPRITE_LAST_OFFSET
|
|
sta spiderSprite
|
|
|
|
; Write this code
|
|
|
|
addSpider_done anop
|
|
rtl
|
|
|
|
|
|
shootSpider entry
|
|
; Write this code
|
|
rtl
|
|
|
|
|
|
spiderState dc i2'SPIDER_STATE_NONE'
|
|
spiderSprite dc i2'0'
|
|
spiderScreenOffset dc i2'0'
|
|
spiderScreenShift dc i2'0'
|
|
spiderShiftInTile dc i2'0'
|
|
|
|
|
|
; 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'
|
|
|
|
end
|