mirror of
https://github.com/jeremysrand/BuGS.git
synced 2024-06-04 00:29:28 +00:00
Add the code for detecting player collisions, exploding the player, decrementing the number of lives and maybe ending the game.
This commit is contained in:
parent
6e49c4c483
commit
2abb57b1a5
28
BuGS/game.s
28
BuGS/game.s
|
@ -208,7 +208,6 @@ nextWord anop
|
||||||
|
|
||||||
startGame entry
|
startGame entry
|
||||||
stz gameRunning
|
stz gameRunning
|
||||||
stz numSegments
|
|
||||||
jsl addRandomMushrooms
|
jsl addRandomMushrooms
|
||||||
jsl scoreStartGame
|
jsl scoreStartGame
|
||||||
jsl initPlayer
|
jsl initPlayer
|
||||||
|
@ -216,10 +215,37 @@ startGame entry
|
||||||
jsl levelInit
|
jsl levelInit
|
||||||
; Fall through intentionally here...
|
; Fall through intentionally here...
|
||||||
startLevel entry
|
startLevel entry
|
||||||
|
jsl segmentsInitLevel
|
||||||
|
jsl scorpionInitLevel
|
||||||
|
jsl spiderInitLevel
|
||||||
|
jsl fleaInitLevel
|
||||||
jsl playerLevelStart
|
jsl playerLevelStart
|
||||||
jmp levelStart
|
jmp levelStart
|
||||||
|
|
||||||
|
|
||||||
|
gameOver entry
|
||||||
|
lda #1
|
||||||
|
sta gameRunning
|
||||||
|
jsl segmentsInitLevel
|
||||||
|
jsl scorpionInitLevel
|
||||||
|
jsl spiderInitLevel
|
||||||
|
jsl fleaInitLevel
|
||||||
|
|
||||||
|
ldx #0
|
||||||
|
gameOver_loop anop
|
||||||
|
lda tileType,x
|
||||||
|
beq gameOver_tileEmpty
|
||||||
|
stz tileType,x
|
||||||
|
lda #TILE_STATE_DIRTY
|
||||||
|
sta tileDirty,x
|
||||||
|
gameOver_tileEmpty anop
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
cpx #RHS_FIRST_TILE_OFFSET
|
||||||
|
blt gameOver_loop
|
||||||
|
|
||||||
|
jmp checkHighScore
|
||||||
|
|
||||||
|
|
||||||
checkKeyboard entry
|
checkKeyboard entry
|
||||||
checkKey_loop2 anop
|
checkKey_loop2 anop
|
||||||
|
|
|
@ -23,6 +23,9 @@ FLEA_SCREEN_SPEED_FAST equ 4*SCREEN_BYTES_PER_ROW
|
||||||
FLEA_SLOW_UPDATES_PER_TILE equ TILE_PIXEL_HEIGHT/2-1
|
FLEA_SLOW_UPDATES_PER_TILE equ TILE_PIXEL_HEIGHT/2-1
|
||||||
FLEA_FAST_UPDATES_PER_TILE equ TILE_PIXEL_HEIGHT/4-1
|
FLEA_FAST_UPDATES_PER_TILE equ TILE_PIXEL_HEIGHT/4-1
|
||||||
|
|
||||||
|
fleaInitLevel entry
|
||||||
|
stz fleaState
|
||||||
|
rtl
|
||||||
|
|
||||||
drawFlea entry
|
drawFlea entry
|
||||||
lda fleaState
|
lda fleaState
|
||||||
|
@ -64,6 +67,12 @@ jumpInst jmp >flea1
|
||||||
|
|
||||||
|
|
||||||
updateFlea entry
|
updateFlea entry
|
||||||
|
lda playerState
|
||||||
|
cmp #PLAYER_STATE_ONSCREEN
|
||||||
|
beq updateFlea_playerOnscreen
|
||||||
|
rtl
|
||||||
|
|
||||||
|
updateFlea_playerOnscreen anop
|
||||||
lda fleaState
|
lda fleaState
|
||||||
beq updateFlea_maybeAdd
|
beq updateFlea_maybeAdd
|
||||||
|
|
||||||
|
@ -171,8 +180,6 @@ updateFlea_nextTile anop
|
||||||
|
|
||||||
updateFlea_bottom anop
|
updateFlea_bottom anop
|
||||||
stz fleaState
|
stz fleaState
|
||||||
; Uncomment the next line to continuously display fleas.
|
|
||||||
; jsl addFlea
|
|
||||||
rtl
|
rtl
|
||||||
|
|
||||||
updateFlea_nextAction anop
|
updateFlea_nextAction anop
|
||||||
|
|
|
@ -15,6 +15,10 @@ gamePlayer start
|
||||||
using tileData
|
using tileData
|
||||||
using screenData
|
using screenData
|
||||||
|
|
||||||
|
PLAYER_EXPLOSION_FRAME_COUNT equ 4
|
||||||
|
PLAYER_RESTART_LEVEL_FRAME_COUNT equ 20
|
||||||
|
|
||||||
|
|
||||||
initPlayer entry
|
initPlayer entry
|
||||||
ldy #STARTING_NUM_LIVES
|
ldy #STARTING_NUM_LIVES
|
||||||
sty numLives
|
sty numLives
|
||||||
|
@ -33,6 +37,8 @@ initPlayer_loop anop
|
||||||
|
|
||||||
|
|
||||||
playerLevelStart entry
|
playerLevelStart entry
|
||||||
|
lda #PLAYER_STATE_ONSCREEN
|
||||||
|
sta playerState
|
||||||
lda #STARTING_MOUSE_X
|
lda #STARTING_MOUSE_X
|
||||||
sta mouseX
|
sta mouseX
|
||||||
lda #STARTING_MOUSE_Y
|
lda #STARTING_MOUSE_Y
|
||||||
|
@ -69,6 +75,84 @@ updatePlayer entry
|
||||||
beq updatePlayer_gameRunning
|
beq updatePlayer_gameRunning
|
||||||
rtl
|
rtl
|
||||||
updatePlayer_gameRunning anop
|
updatePlayer_gameRunning anop
|
||||||
|
lda playerState
|
||||||
|
cmp #PLAYER_STATE_NONE
|
||||||
|
bne updatePlayer_notNone
|
||||||
|
lda playerFrameCount
|
||||||
|
bne updatePlayer_wait
|
||||||
|
lda numLives
|
||||||
|
beq updatePlayer_gameOver
|
||||||
|
jmp startLevel
|
||||||
|
updatePlayer_gameOver anop
|
||||||
|
jmp gameOver
|
||||||
|
updatePlayer_wait anop
|
||||||
|
dec a
|
||||||
|
sta playerFrameCount
|
||||||
|
rtl
|
||||||
|
updatePlayer_notNone anop
|
||||||
|
cmp #PLAYER_STATE_EXPLODING
|
||||||
|
beq updatePlayer_exploding
|
||||||
|
jmp updatePlayer_notExploding
|
||||||
|
updatePlayer_exploding anop
|
||||||
|
lda playerFrameCount
|
||||||
|
beq updatePlayer_nextExplosion
|
||||||
|
dec a
|
||||||
|
sta playerFrameCount
|
||||||
|
bra updatePlayer_drawExplosion
|
||||||
|
updatePlayer_nextExplosion anop
|
||||||
|
lda playerExplosionOffset
|
||||||
|
beq updatePlayer_doneExplosion
|
||||||
|
sec
|
||||||
|
sbc #4
|
||||||
|
sta playerExplosionOffset
|
||||||
|
bra updatePlayer_drawExplosion
|
||||||
|
updatePlayer_doneExplosion anop
|
||||||
|
lda #PLAYER_RESTART_LEVEL_FRAME_COUNT
|
||||||
|
sta playerFrameCount
|
||||||
|
lda #PLAYER_STATE_NONE
|
||||||
|
sta playerState
|
||||||
|
rtl
|
||||||
|
|
||||||
|
updatePlayer_drawExplosion anop
|
||||||
|
lda mouseAddress
|
||||||
|
sec
|
||||||
|
sbc #SCREEN_ADDRESS
|
||||||
|
and #$fffc
|
||||||
|
tax
|
||||||
|
lda >screenToTileOffset,x
|
||||||
|
tax
|
||||||
|
lda #TILE_STATE_DIRTY
|
||||||
|
sta tileDirty,x
|
||||||
|
ldy tileBelow,x
|
||||||
|
cpy #INVALID_TILE_NUM
|
||||||
|
beq updatePlayer_drawExplosionSkipBelow1
|
||||||
|
sta tileDirty,y
|
||||||
|
updatePlayer_drawExplosionSkipBelow1 anop
|
||||||
|
ldy tileRight,x
|
||||||
|
sta tileDirty,y
|
||||||
|
ldx tileBelow,y
|
||||||
|
cpx #INVALID_TILE_NUM
|
||||||
|
beq updatePlayer_drawExplosionSkipBelow2
|
||||||
|
sta tileDirty,x
|
||||||
|
updatePlayer_drawExplosionSkipBelow2 anop
|
||||||
|
ldx tileRight,y
|
||||||
|
sta tileDirty,x
|
||||||
|
ldy tileBelow,x
|
||||||
|
cpy #INVALID_TILE_NUM
|
||||||
|
beq updatePlayer_drawExplosionSkipBelow3
|
||||||
|
sta tileDirty,y
|
||||||
|
updatePlayer_drawExplosionSkipBelow3 anop
|
||||||
|
ldy mouseAddress
|
||||||
|
ldx playerExplosionOffset
|
||||||
|
lda shipExplosionJumpTable,x
|
||||||
|
sta jumpInst+1
|
||||||
|
lda shipExplosionJumpTable+2,x
|
||||||
|
sta jumpInst+3
|
||||||
|
jumpInst anop
|
||||||
|
jmp >shipExplosion1
|
||||||
|
nop
|
||||||
|
|
||||||
|
updatePlayer_notExploding anop
|
||||||
ldx #0
|
ldx #0
|
||||||
ldy #0
|
ldy #0
|
||||||
; This code for reading the mouse data is based on some code which John Brooks helpfully provided, although I did things
|
; This code for reading the mouse data is based on some code which John Brooks helpfully provided, although I did things
|
||||||
|
@ -166,8 +250,44 @@ updatePlayer_shift anop
|
||||||
|
|
||||||
updatePlayer_dirty anop
|
updatePlayer_dirty anop
|
||||||
beq updatePlayer_noCollision
|
beq updatePlayer_noCollision
|
||||||
; Player collision here...
|
lda #PLAYER_STATE_EXPLODING
|
||||||
; brk $00
|
sta playerState
|
||||||
|
lda mouseAddress
|
||||||
|
sec
|
||||||
|
sbc #TILE_BYTE_WIDTH/2
|
||||||
|
sta mouseAddress
|
||||||
|
sec
|
||||||
|
sbc #SCREEN_ADDRESS
|
||||||
|
and #$fffc
|
||||||
|
tax
|
||||||
|
lda >screenToTileOffset,x
|
||||||
|
cmp #RHS_FIRST_TILE_OFFSET
|
||||||
|
bge updatePlayer_explosionOffLeft
|
||||||
|
tay
|
||||||
|
ldx tileRight,y
|
||||||
|
ldy tileRight,x
|
||||||
|
cpy #RHS_FIRST_TILE_OFFSET
|
||||||
|
blt updatePlayer_contCollision
|
||||||
|
lda mouseAddress
|
||||||
|
dec a
|
||||||
|
and #$fffc
|
||||||
|
sta mouseAddress
|
||||||
|
bra updatePlayer_contCollision
|
||||||
|
|
||||||
|
updatePlayer_explosionOffLeft anop
|
||||||
|
lda mouseAddress
|
||||||
|
clc
|
||||||
|
adc #TILE_BYTE_WIDTH
|
||||||
|
and #$fffc
|
||||||
|
sta mouseAddress
|
||||||
|
|
||||||
|
updatePlayer_contCollision anop
|
||||||
|
lda #PLAYER_EXPLOSION_FRAME_COUNT-1
|
||||||
|
sta playerFrameCount
|
||||||
|
lda #SHIP_EXPLOSION_LAST_OFFSET
|
||||||
|
sta playerExplosionOffset
|
||||||
|
jmp updatePlayer_exploding
|
||||||
|
|
||||||
updatePlayer_noCollision anop
|
updatePlayer_noCollision anop
|
||||||
lda mouseAddress
|
lda mouseAddress
|
||||||
sec
|
sec
|
||||||
|
@ -202,4 +322,22 @@ mouseX dc i2'0'
|
||||||
mouseY dc i2'0'
|
mouseY dc i2'0'
|
||||||
mouseDown dc i2'0'
|
mouseDown dc i2'0'
|
||||||
|
|
||||||
|
|
||||||
|
playerFrameCount dc i2'0'
|
||||||
|
playerExplosionOffset dc i2'0'
|
||||||
|
|
||||||
|
|
||||||
|
SHIP_EXPLOSION_LAST_OFFSET equ 7*4
|
||||||
|
|
||||||
|
shipExplosionJumpTable anop
|
||||||
|
dc i4'shipExplosion8'
|
||||||
|
dc i4'shipExplosion7'
|
||||||
|
dc i4'shipExplosion6'
|
||||||
|
dc i4'shipExplosion5'
|
||||||
|
dc i4'shipExplosion4'
|
||||||
|
dc i4'shipExplosion3'
|
||||||
|
dc i4'shipExplosion2'
|
||||||
|
dc i4'shipExplosion1'
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -27,6 +27,11 @@ SCORPION_FAST_UPDATES_PER_TILE equ TILE_PIXEL_WIDTH/2-1
|
||||||
SCORPION_NUM_POSSIBLE_ROWS equ 15
|
SCORPION_NUM_POSSIBLE_ROWS equ 15
|
||||||
|
|
||||||
|
|
||||||
|
scorpionInitLevel entry
|
||||||
|
stz scorpionState
|
||||||
|
rtl
|
||||||
|
|
||||||
|
|
||||||
drawScorpion entry
|
drawScorpion entry
|
||||||
lda scorpionState
|
lda scorpionState
|
||||||
bne drawScorpion_cont
|
bne drawScorpion_cont
|
||||||
|
@ -78,6 +83,11 @@ jumpInst jmp >leftScorpion1
|
||||||
|
|
||||||
|
|
||||||
updateScorpion entry
|
updateScorpion entry
|
||||||
|
lda playerState
|
||||||
|
cmp #PLAYER_STATE_ONSCREEN
|
||||||
|
beq updateScorpion_playerOnscreen
|
||||||
|
rtl
|
||||||
|
updateScorpion_playerOnscreen anop
|
||||||
lda scorpionState
|
lda scorpionState
|
||||||
bne updateScorpion_cont
|
bne updateScorpion_cont
|
||||||
lda gameLevel
|
lda gameLevel
|
||||||
|
|
|
@ -40,6 +40,18 @@ SEGMENT_FACING_RIGHT equ 128
|
||||||
|
|
||||||
SEGMENT_MAX_POSITION_OFFSET equ TILE_PIXEL_WIDTH*SEGMENT_MAX_NUM*2-2
|
SEGMENT_MAX_POSITION_OFFSET equ TILE_PIXEL_WIDTH*SEGMENT_MAX_NUM*2-2
|
||||||
|
|
||||||
|
|
||||||
|
segmentsInitLevel entry
|
||||||
|
stz numSegments
|
||||||
|
ldx #SEGMENT_MAX_OFFSET
|
||||||
|
lda #SEGMENT_STATE_NONE
|
||||||
|
segmentsInitLevel_loop anop
|
||||||
|
sta segmentStates,x
|
||||||
|
dex
|
||||||
|
dex
|
||||||
|
bpl segmentsInitLevel_loop
|
||||||
|
rtl
|
||||||
|
|
||||||
|
|
||||||
drawSegments entry
|
drawSegments entry
|
||||||
ldx #SEGMENT_MAX_OFFSET
|
ldx #SEGMENT_MAX_OFFSET
|
||||||
|
@ -178,6 +190,11 @@ segmentBodyJump_jumpInst anop
|
||||||
nop
|
nop
|
||||||
|
|
||||||
updateSegments entry
|
updateSegments entry
|
||||||
|
lda playerState
|
||||||
|
cmp #PLAYER_STATE_ONSCREEN
|
||||||
|
beq updateSegments_playerOnscreen
|
||||||
|
rtl
|
||||||
|
updateSegments_playerOnscreen anop
|
||||||
; Clear the segment mask to start.
|
; Clear the segment mask to start.
|
||||||
stz segmentTileMask+0
|
stz segmentTileMask+0
|
||||||
stz segmentTileMask+2
|
stz segmentTileMask+2
|
||||||
|
|
|
@ -62,13 +62,16 @@ SPIDER_ADD_TIME equ 120
|
||||||
|
|
||||||
|
|
||||||
spiderInitGame entry
|
spiderInitGame entry
|
||||||
stz spiderAddTime
|
|
||||||
stz spiderState
|
|
||||||
lda #SPIDER_STARTING_TOP_ROW
|
lda #SPIDER_STARTING_TOP_ROW
|
||||||
sta spiderTopRow
|
sta spiderTopRow
|
||||||
lda #SPRITE_SPEED_SLOW
|
lda #SPRITE_SPEED_SLOW
|
||||||
jmp setSpiderSpeed
|
jmp setSpiderSpeed
|
||||||
|
|
||||||
|
spiderInitLevel entry
|
||||||
|
stz spiderAddTime
|
||||||
|
stz spiderState
|
||||||
|
rtl
|
||||||
|
|
||||||
|
|
||||||
drawSpider entry
|
drawSpider entry
|
||||||
lda spiderState
|
lda spiderState
|
||||||
|
@ -135,6 +138,11 @@ jumpInst jmp >spider1
|
||||||
|
|
||||||
|
|
||||||
updateSpider entry
|
updateSpider entry
|
||||||
|
lda playerState
|
||||||
|
cmp #PLAYER_STATE_ONSCREEN
|
||||||
|
beq updateSpider_cont
|
||||||
|
rtl
|
||||||
|
updateSpider_cont anop
|
||||||
ldx spiderState
|
ldx spiderState
|
||||||
cpx #SPIDER_STATE_LEFT_DIAG_DOWN
|
cpx #SPIDER_STATE_LEFT_DIAG_DOWN
|
||||||
blt updateSpider_testState
|
blt updateSpider_testState
|
||||||
|
|
|
@ -19,6 +19,10 @@ globalData data
|
||||||
SEGMENT_DIR_LEFT equ 0
|
SEGMENT_DIR_LEFT equ 0
|
||||||
SEGMENT_DIR_RIGHT equ 1
|
SEGMENT_DIR_RIGHT equ 1
|
||||||
|
|
||||||
|
PLAYER_STATE_NONE equ 0
|
||||||
|
PLAYER_STATE_EXPLODING equ 1
|
||||||
|
PLAYER_STATE_ONSCREEN equ 2
|
||||||
|
|
||||||
; The code uses segmentPixelOffset and the segment speed to figure out whether to draw the shifted sprite
|
; The code uses segmentPixelOffset and the segment speed to figure out whether to draw the shifted sprite
|
||||||
; or the regular sprite. By AND-ing with the speed, if the result is 0, then we want a non-shifted sprite.
|
; or the regular sprite. By AND-ing with the speed, if the result is 0, then we want a non-shifted sprite.
|
||||||
; If the result is non-zero, we want a shifted sprite. Then, we just need a per segment speed instead of a
|
; If the result is non-zero, we want a shifted sprite. Then, we just need a per segment speed instead of a
|
||||||
|
@ -133,6 +137,7 @@ numInfieldMushrooms dc i2'0'
|
||||||
; tileType
|
; tileType
|
||||||
|
|
||||||
|
|
||||||
|
playerState dc i2'PLAYER_STATE_NONE'
|
||||||
mouseAddress dc i2'0'
|
mouseAddress dc i2'0'
|
||||||
backupStack dc i2'0'
|
backupStack dc i2'0'
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ s6d2 =
|
||||||
|
|
||||||
s7d1 = /Users/jrand/Library/Developer/Xcode/DerivedData/BuGS-bffpexoblaghkzcbtjtzxeulnuto/Build/Products/Debug/BuGS.2mg
|
s7d1 = /Users/jrand/Library/Developer/Xcode/DerivedData/BuGS-bffpexoblaghkzcbtjtzxeulnuto/Build/Products/Debug/BuGS.2mg
|
||||||
|
|
||||||
g_limit_speed = 0
|
g_limit_speed = 3
|
||||||
|
|
||||||
|
|
||||||
bram1[00] = 00 00 00 01 00 00 0d 06 02 01 01 00 01 00 00 00
|
bram1[00] = 00 00 00 01 00 00 0d 06 02 01 01 00 01 00 00 00
|
||||||
|
|
|
@ -258,6 +258,10 @@ scoreAddOneThousand_skipZeroHundreds anop
|
||||||
ldx #P1_SCORE_THOUSANDS_OFFSET
|
ldx #P1_SCORE_THOUSANDS_OFFSET
|
||||||
jmp scoreAddOneToTile
|
jmp scoreAddOneToTile
|
||||||
|
|
||||||
|
|
||||||
|
checkHighScore entry
|
||||||
|
; TODO - Write this code
|
||||||
|
rtl
|
||||||
|
|
||||||
highScore dc i4'0'
|
highScore dc i4'0'
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user