Start work on supporting two player games. When the user starts a two player game now, two scores are initialized and the number of lives of the two players are independently tracked. Also, all of the score code has been updated to increment the player one or player two score correct. Still need to implement the logic to save the game state per player and switch between the players on each death.

This commit is contained in:
Jeremy Rand 2021-01-06 23:27:51 -05:00
parent 4700bd9cff
commit 1cd4ccea3a
5 changed files with 174 additions and 70 deletions

View File

@ -186,6 +186,7 @@ startGame entry
bne startGame_notRunning
rtl
startGame_notRunning anop
sta isSinglePlayer
stz gameRunning
jsl addRandomMushrooms
jsl scoreStartGame

View File

@ -23,8 +23,9 @@ initPlayer entry
ldy #STARTING_NUM_LIVES
sty numLives
stz playerIgnoreFirstPoll
stz playerNum
ldx #P1_LIVES_OFFSET
initPlayer_loop anop
initPlayer_loop1 anop
lda #TILE_PLAYER
sta tileType,x
phy
@ -33,9 +34,35 @@ initPlayer_loop anop
dex
dex
dey
bne initPlayer_loop
rtl
bne initPlayer_loop1
lda isSinglePlayer
beq initPlayer_done
; DEBUG
; lda #PLAYER_TWO
; sta playerNum
; DEBUG
ldy #STARTING_NUM_LIVES
sty numLives+2
ldx #P2_LIVES_OFFSET
initPlayer_loop2 anop
lda #TILE_PLAYER
sta tileType,x
phy
_dirtyNonGameTile
ply
dex
dex
dey
bne initPlayer_loop2
initPlayer_done anop
jmp playerSwitch
playerSwitch entry
jsl scoreSwitchPlayer
rtl
playerLevelStart entry
stz playerIgnoreFirstPoll
@ -53,12 +80,19 @@ playerLevelStart entry
sta mouseAddress
lda #1
sta mouseDown
dec numLives
ldx playerNum
dec numLives,x
cpx #PLAYER_ONE
beq playerLevelStart_playerOne
lda #P2_LIVES_OFFSET
bra playerLevelStart_cont
playerLevelStart_playerOne anop
lda #P1_LIVES_OFFSET
playerLevelStart_cont anop
sec
sbc numLives
sbc numLives,x
sec
sbc numLives
sbc numLives,x
tax
lda #TILE_EMPTY
sta tileType,x
@ -67,13 +101,20 @@ playerLevelStart entry
playerAddLife entry
ldx playerNum
cpx #PLAYER_ONE
beq playerAddLife_playerOne
lda #P2_LIVES_OFFSET
bra playerAddLife_cont
playerAddLife_playerOne anop
lda #P1_LIVES_OFFSET
playerAddLife_cont anop
sec
sbc numLives
sec
sbc numLives
inc numLives,x
tax
inc numLives
lda #TILE_PLAYER
sta tileType,x
_dirtyNonGameTile
@ -90,7 +131,8 @@ updatePlayer_gameRunning anop
bne updatePlayer_notNone
lda playerFrameCount
bne updatePlayer_wait
lda numLives
ldx playerNum
lda numLives,x
beq updatePlayer_gameOver
lda numSegments
bne updatePlayer_notNextLevel

View File

@ -134,6 +134,9 @@ SOUND_SYSTEM_VOLUME gequ $e100ca
MOUSE_STATUS gequ $c027
MOUSE_DATA_REG gequ $c024
PLAYER_ONE gequ 0
PLAYER_TWO gequ 2
gameRunning dc i2'1'
@ -141,7 +144,6 @@ gameRunning dc i2'1'
; this information will need to be copied to a backup location when the player
; switches.
numSegments dc i2'0'
numLives dc i2'0'
gameLevel dc i2'0'
gameScore dc i4'0'
scoreWithin12000 dc i2'0'
@ -150,15 +152,23 @@ scoreNum20000 dc i2'0'
centipedeLevelNum dc i2'0'
colourLevelNum dc i2'0'
numInfieldMushrooms dc i2'0'
scoreOnesOffset dc i2'0'
scoreTensOffset dc i2'0'
scoreHundredsOffset dc i2'0'
scoreThousandsOffset dc i2'0'
; tileType
playerState dc i2'PLAYER_STATE_NONE'
mouseX dc i2'0'
mouseY dc i2'0'
playerState dc i2'PLAYER_STATE_NONE'
playerNum dc i2'0'
isSinglePlayer dc i2'0'
numLives dc i2'0' ; Two values for this, indexed by playerNum
dc i2'0'
mouseX dc i2'0'
mouseY dc i2'0'
mouseAddress dc i2'0'
backupStack dc i2'0'
collision dc i2'0'
backupStack dc i2'0'
collision dc i2'0'
collisionAddr dc i2'0'

Binary file not shown.

View File

@ -99,19 +99,63 @@ scoreStartGame entry
lda #TILE_NUMBER_0
sta tileType,x
_dirtyNonGameTile
dex
dex
scoreStartGame_loop anop
dex
dex
scoreStartGame_loop1 anop
lda #TILE_EMPTY
sta tileType,x
_dirtyNonGameTile
dex
dex
cpx #P1_SCORE_FIRST_OFFSET
bne scoreStartGame_loop
bge scoreStartGame_loop1
ldx #P2_SCORE_ONES_OFFSET
lda isSinglePlayer
beq scoreStartGame_loop2
lda #TILE_NUMBER_0
sta tileType,x
_dirtyNonGameTile
dex
dex
scoreStartGame_loop2 anop
lda #TILE_EMPTY
sta tileType,x
_dirtyNonGameTile
dex
dex
cpx #P2_SCORE_FIRST_OFFSET
bge scoreStartGame_loop2
rtl
scoreSwitchPlayer entry
lda playerNum
cmp #PLAYER_ONE
beq scoreSwitchPlayer_isPlayer1
lda #P2_SCORE_ONES_OFFSET
sta scoreOnesOffset
lda #P2_SCORE_TENS_OFFSET
sta scoreTensOffset
lda #P2_SCORE_HUNDREDS_OFFSET
sta scoreHundredsOffset
lda #P2_SCORE_THOUSANDS_OFFSET
sta scoreThousandsOffset
bra scoreSwitchPlayer_done
scoreSwitchPlayer_isPlayer1 anop
lda #P1_SCORE_ONES_OFFSET
sta scoreOnesOffset
lda #P1_SCORE_TENS_OFFSET
sta scoreTensOffset
lda #P1_SCORE_HUNDREDS_OFFSET
sta scoreHundredsOffset
lda #P1_SCORE_THOUSANDS_OFFSET
sta scoreThousandsOffset
scoreSwitchPlayer_done anop
rtl
; The score tile to increment is in the X register
; Note that this function and the next one do no sanitization
; of the value in the X register. That also means that if
@ -176,158 +220,158 @@ scoreAddToTile_done anop
scoreAddOne entry
_incrementScore 1
ldx #P1_SCORE_ONES_OFFSET
ldx scoreOnesOffset
jmp scoreAddOneToTile
scoreAddFive entry
_incrementScore 5
ldx #P1_SCORE_ONES_OFFSET
ldx scoreOnesOffset
lda #5*4
jmp scoreAddToTile
scoreAddTen entry
_incrementScore 10
lda tileType+P1_SCORE_ONES_OFFSET
ldx scoreOnesOffset
lda tileType,x
bne scoreAddTen_skipZeroOnes
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET
ldx #P1_SCORE_ONES_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddTen_skipZeroOnes anop
ldx #P1_SCORE_TENS_OFFSET
ldx scoreTensOffset
jmp scoreAddOneToTile
scoreAddOneHundred entry
_incrementScore 100
lda tileType+P1_SCORE_ONES_OFFSET
ldx scoreOnesOffset
lda tileType,x
bne scoreAddHundred_skipZeroOnes
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET
ldx #P1_SCORE_ONES_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddHundred_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET
ldx scoreTensOffset
lda tileType,x
bne scoreAddHundred_skipZeroTens
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET
ldx #P1_SCORE_TENS_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddHundred_skipZeroTens anop
ldx #P1_SCORE_HUNDREDS_OFFSET
ldx scoreHundredsOffset
jmp scoreAddOneToTile
scoreAddTwoHundred entry
_incrementScore 200
lda tileType+P1_SCORE_ONES_OFFSET
ldx scoreOnesOffset
lda tileType,x
bne scoreAddTwoHundred_skipZeroOnes
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET
ldx #P1_SCORE_ONES_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddTwoHundred_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET
ldx scoreTensOffset
lda tileType,x
bne scoreAddTwoHundred_skipZeroTens
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET
ldx #P1_SCORE_TENS_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddTwoHundred_skipZeroTens anop
ldx #P1_SCORE_HUNDREDS_OFFSET
ldx scoreHundredsOffset
lda #2*4
jmp scoreAddToTile
scoreAddThreeHundred entry
_incrementScore 300
lda tileType+P1_SCORE_ONES_OFFSET
ldx scoreOnesOffset
lda tileType,x
bne scoreAddThreeHundred_skipZeroOnes
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET
ldx #P1_SCORE_ONES_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddThreeHundred_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET
ldx scoreTensOffset
lda tileType,x
bne scoreAddThreeHundred_skipZeroTens
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET
ldx #P1_SCORE_TENS_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddThreeHundred_skipZeroTens anop
ldx #P1_SCORE_HUNDREDS_OFFSET
ldx scoreHundredsOffset
lda #3*4
jmp scoreAddToTile
scoreAddSixHundred entry
_incrementScore 600
lda tileType+P1_SCORE_ONES_OFFSET
ldx scoreOnesOffset
lda tileType,x
bne scoreAddSixHundred_skipZeroOnes
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET
ldx #P1_SCORE_ONES_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddSixHundred_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET
ldx scoreTensOffset
lda tileType,x
bne scoreAddSixHundred_skipZeroTens
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET
ldx #P1_SCORE_TENS_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddSixHundred_skipZeroTens anop
ldx #P1_SCORE_HUNDREDS_OFFSET
ldx scoreHundredsOffset
lda #6*4
jmp scoreAddToTile
scoreAddNineHundred entry
_incrementScore 900
lda tileType+P1_SCORE_ONES_OFFSET
ldx scoreOnesOffset
lda tileType,x
bne scoreAddNineHundred_skipZeroOnes
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET
ldx #P1_SCORE_ONES_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddNineHundred_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET
ldx scoreTensOffset
lda tileType,x
bne scoreAddNineHundred_skipZeroTens
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET
ldx #P1_SCORE_TENS_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddNineHundred_skipZeroTens anop
ldx #P1_SCORE_HUNDREDS_OFFSET
ldx scoreHundredsOffset
lda #9*4
jmp scoreAddToTile
scoreAddOneThousand entry
_incrementScore 1000
lda tileType+P1_SCORE_ONES_OFFSET
ldx scoreOnesOffset
lda tileType,x
bne scoreAddOneThousand_skipZeroOnes
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET
ldx #P1_SCORE_ONES_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddOneThousand_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET
ldx scoreTensOffset
lda tileType,x
bne scoreAddOneThousand_skipZeroTens
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET
ldx #P1_SCORE_TENS_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddOneThousand_skipZeroTens anop
lda tileType+P1_SCORE_HUNDREDS_OFFSET
ldx scoreHundredsOffset
lda tileType,x
bne scoreAddOneThousand_skipZeroHundreds
lda #TILE_NUMBER_0
sta tileType+P1_SCORE_HUNDREDS_OFFSET
ldx #P1_SCORE_HUNDREDS_OFFSET
sta tileType,x
_dirtyNonGameTile
scoreAddOneThousand_skipZeroHundreds anop
ldx #P1_SCORE_THOUSANDS_OFFSET
ldx scoreThousandsOffset
jmp scoreAddOneToTile
@ -372,7 +416,14 @@ checkHighScore_doneCopy anop
lda gameScore+2
sta settings+SETTINGS_HIGH_SCORE_OFFSET+HIGH_SCORE_SCORE_OFFSET+2,y
lda playerNum
cmp #PLAYER_ONE
beq checkHighScore_isPlayer1
ldx #P2_SCORE_ONES_OFFSET-18
bra checkHighScore_saveHighScore
checkHighScore_isPlayer1 anop
ldx #P1_SCORE_ONES_OFFSET-18
checkHighScore_saveHighScore anop
lda tileType,x
jsl tileTypeToAscii
sta settings+SETTINGS_HIGH_SCORE_OFFSET+HIGH_SCORE_SCORE_TEXT_OFFSET,y