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 bne startGame_notRunning
rtl rtl
startGame_notRunning anop startGame_notRunning anop
sta isSinglePlayer
stz gameRunning stz gameRunning
jsl addRandomMushrooms jsl addRandomMushrooms
jsl scoreStartGame jsl scoreStartGame

View File

@ -23,8 +23,9 @@ initPlayer entry
ldy #STARTING_NUM_LIVES ldy #STARTING_NUM_LIVES
sty numLives sty numLives
stz playerIgnoreFirstPoll stz playerIgnoreFirstPoll
stz playerNum
ldx #P1_LIVES_OFFSET ldx #P1_LIVES_OFFSET
initPlayer_loop anop initPlayer_loop1 anop
lda #TILE_PLAYER lda #TILE_PLAYER
sta tileType,x sta tileType,x
phy phy
@ -33,9 +34,35 @@ initPlayer_loop anop
dex dex
dex dex
dey dey
bne initPlayer_loop bne initPlayer_loop1
rtl
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 playerLevelStart entry
stz playerIgnoreFirstPoll stz playerIgnoreFirstPoll
@ -53,12 +80,19 @@ playerLevelStart entry
sta mouseAddress sta mouseAddress
lda #1 lda #1
sta mouseDown 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 lda #P1_LIVES_OFFSET
playerLevelStart_cont anop
sec sec
sbc numLives sbc numLives,x
sec sec
sbc numLives sbc numLives,x
tax tax
lda #TILE_EMPTY lda #TILE_EMPTY
sta tileType,x sta tileType,x
@ -67,13 +101,20 @@ playerLevelStart entry
playerAddLife 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 lda #P1_LIVES_OFFSET
playerAddLife_cont anop
sec sec
sbc numLives sbc numLives
sec sec
sbc numLives sbc numLives
inc numLives,x
tax tax
inc numLives
lda #TILE_PLAYER lda #TILE_PLAYER
sta tileType,x sta tileType,x
_dirtyNonGameTile _dirtyNonGameTile
@ -90,7 +131,8 @@ updatePlayer_gameRunning anop
bne updatePlayer_notNone bne updatePlayer_notNone
lda playerFrameCount lda playerFrameCount
bne updatePlayer_wait bne updatePlayer_wait
lda numLives ldx playerNum
lda numLives,x
beq updatePlayer_gameOver beq updatePlayer_gameOver
lda numSegments lda numSegments
bne updatePlayer_notNextLevel bne updatePlayer_notNextLevel

View File

@ -134,6 +134,9 @@ SOUND_SYSTEM_VOLUME gequ $e100ca
MOUSE_STATUS gequ $c027 MOUSE_STATUS gequ $c027
MOUSE_DATA_REG gequ $c024 MOUSE_DATA_REG gequ $c024
PLAYER_ONE gequ 0
PLAYER_TWO gequ 2
gameRunning dc i2'1' 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 ; this information will need to be copied to a backup location when the player
; switches. ; switches.
numSegments dc i2'0' numSegments dc i2'0'
numLives dc i2'0'
gameLevel dc i2'0' gameLevel dc i2'0'
gameScore dc i4'0' gameScore dc i4'0'
scoreWithin12000 dc i2'0' scoreWithin12000 dc i2'0'
@ -150,10 +152,18 @@ scoreNum20000 dc i2'0'
centipedeLevelNum dc i2'0' centipedeLevelNum dc i2'0'
colourLevelNum dc i2'0' colourLevelNum dc i2'0'
numInfieldMushrooms dc i2'0' numInfieldMushrooms dc i2'0'
scoreOnesOffset dc i2'0'
scoreTensOffset dc i2'0'
scoreHundredsOffset dc i2'0'
scoreThousandsOffset dc i2'0'
; tileType ; tileType
playerState dc i2'PLAYER_STATE_NONE' 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' mouseX dc i2'0'
mouseY dc i2'0' mouseY dc i2'0'
mouseAddress dc i2'0' mouseAddress dc i2'0'

Binary file not shown.

View File

@ -99,16 +99,60 @@ scoreStartGame entry
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType,x sta tileType,x
_dirtyNonGameTile _dirtyNonGameTile
dex
dex
scoreStartGame_loop anop scoreStartGame_loop1 anop
dex
dex
lda #TILE_EMPTY lda #TILE_EMPTY
sta tileType,x sta tileType,x
_dirtyNonGameTile _dirtyNonGameTile
dex
dex
cpx #P1_SCORE_FIRST_OFFSET 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 rtl
@ -176,158 +220,158 @@ scoreAddToTile_done anop
scoreAddOne entry scoreAddOne entry
_incrementScore 1 _incrementScore 1
ldx #P1_SCORE_ONES_OFFSET ldx scoreOnesOffset
jmp scoreAddOneToTile jmp scoreAddOneToTile
scoreAddFive entry scoreAddFive entry
_incrementScore 5 _incrementScore 5
ldx #P1_SCORE_ONES_OFFSET ldx scoreOnesOffset
lda #5*4 lda #5*4
jmp scoreAddToTile jmp scoreAddToTile
scoreAddTen entry scoreAddTen entry
_incrementScore 10 _incrementScore 10
lda tileType+P1_SCORE_ONES_OFFSET ldx scoreOnesOffset
lda tileType,x
bne scoreAddTen_skipZeroOnes bne scoreAddTen_skipZeroOnes
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET sta tileType,x
ldx #P1_SCORE_ONES_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddTen_skipZeroOnes anop scoreAddTen_skipZeroOnes anop
ldx #P1_SCORE_TENS_OFFSET ldx scoreTensOffset
jmp scoreAddOneToTile jmp scoreAddOneToTile
scoreAddOneHundred entry scoreAddOneHundred entry
_incrementScore 100 _incrementScore 100
lda tileType+P1_SCORE_ONES_OFFSET ldx scoreOnesOffset
lda tileType,x
bne scoreAddHundred_skipZeroOnes bne scoreAddHundred_skipZeroOnes
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET sta tileType,x
ldx #P1_SCORE_ONES_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddHundred_skipZeroOnes anop scoreAddHundred_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET ldx scoreTensOffset
lda tileType,x
bne scoreAddHundred_skipZeroTens bne scoreAddHundred_skipZeroTens
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET sta tileType,x
ldx #P1_SCORE_TENS_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddHundred_skipZeroTens anop scoreAddHundred_skipZeroTens anop
ldx #P1_SCORE_HUNDREDS_OFFSET ldx scoreHundredsOffset
jmp scoreAddOneToTile jmp scoreAddOneToTile
scoreAddTwoHundred entry scoreAddTwoHundred entry
_incrementScore 200 _incrementScore 200
lda tileType+P1_SCORE_ONES_OFFSET ldx scoreOnesOffset
lda tileType,x
bne scoreAddTwoHundred_skipZeroOnes bne scoreAddTwoHundred_skipZeroOnes
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET sta tileType,x
ldx #P1_SCORE_ONES_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddTwoHundred_skipZeroOnes anop scoreAddTwoHundred_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET ldx scoreTensOffset
lda tileType,x
bne scoreAddTwoHundred_skipZeroTens bne scoreAddTwoHundred_skipZeroTens
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET sta tileType,x
ldx #P1_SCORE_TENS_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddTwoHundred_skipZeroTens anop scoreAddTwoHundred_skipZeroTens anop
ldx #P1_SCORE_HUNDREDS_OFFSET ldx scoreHundredsOffset
lda #2*4 lda #2*4
jmp scoreAddToTile jmp scoreAddToTile
scoreAddThreeHundred entry scoreAddThreeHundred entry
_incrementScore 300 _incrementScore 300
lda tileType+P1_SCORE_ONES_OFFSET ldx scoreOnesOffset
lda tileType,x
bne scoreAddThreeHundred_skipZeroOnes bne scoreAddThreeHundred_skipZeroOnes
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET sta tileType,x
ldx #P1_SCORE_ONES_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddThreeHundred_skipZeroOnes anop scoreAddThreeHundred_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET ldx scoreTensOffset
lda tileType,x
bne scoreAddThreeHundred_skipZeroTens bne scoreAddThreeHundred_skipZeroTens
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET sta tileType,x
ldx #P1_SCORE_TENS_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddThreeHundred_skipZeroTens anop scoreAddThreeHundred_skipZeroTens anop
ldx #P1_SCORE_HUNDREDS_OFFSET ldx scoreHundredsOffset
lda #3*4 lda #3*4
jmp scoreAddToTile jmp scoreAddToTile
scoreAddSixHundred entry scoreAddSixHundred entry
_incrementScore 600 _incrementScore 600
lda tileType+P1_SCORE_ONES_OFFSET ldx scoreOnesOffset
lda tileType,x
bne scoreAddSixHundred_skipZeroOnes bne scoreAddSixHundred_skipZeroOnes
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET sta tileType,x
ldx #P1_SCORE_ONES_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddSixHundred_skipZeroOnes anop scoreAddSixHundred_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET ldx scoreTensOffset
lda tileType,x
bne scoreAddSixHundred_skipZeroTens bne scoreAddSixHundred_skipZeroTens
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET sta tileType,x
ldx #P1_SCORE_TENS_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddSixHundred_skipZeroTens anop scoreAddSixHundred_skipZeroTens anop
ldx #P1_SCORE_HUNDREDS_OFFSET ldx scoreHundredsOffset
lda #6*4 lda #6*4
jmp scoreAddToTile jmp scoreAddToTile
scoreAddNineHundred entry scoreAddNineHundred entry
_incrementScore 900 _incrementScore 900
lda tileType+P1_SCORE_ONES_OFFSET ldx scoreOnesOffset
lda tileType,x
bne scoreAddNineHundred_skipZeroOnes bne scoreAddNineHundred_skipZeroOnes
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET sta tileType,x
ldx #P1_SCORE_ONES_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddNineHundred_skipZeroOnes anop scoreAddNineHundred_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET ldx scoreTensOffset
lda tileType,x
bne scoreAddNineHundred_skipZeroTens bne scoreAddNineHundred_skipZeroTens
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET sta tileType,x
ldx #P1_SCORE_TENS_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddNineHundred_skipZeroTens anop scoreAddNineHundred_skipZeroTens anop
ldx #P1_SCORE_HUNDREDS_OFFSET ldx scoreHundredsOffset
lda #9*4 lda #9*4
jmp scoreAddToTile jmp scoreAddToTile
scoreAddOneThousand entry scoreAddOneThousand entry
_incrementScore 1000 _incrementScore 1000
lda tileType+P1_SCORE_ONES_OFFSET ldx scoreOnesOffset
lda tileType,x
bne scoreAddOneThousand_skipZeroOnes bne scoreAddOneThousand_skipZeroOnes
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_ONES_OFFSET sta tileType,x
ldx #P1_SCORE_ONES_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddOneThousand_skipZeroOnes anop scoreAddOneThousand_skipZeroOnes anop
lda tileType+P1_SCORE_TENS_OFFSET ldx scoreTensOffset
lda tileType,x
bne scoreAddOneThousand_skipZeroTens bne scoreAddOneThousand_skipZeroTens
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_TENS_OFFSET sta tileType,x
ldx #P1_SCORE_TENS_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddOneThousand_skipZeroTens anop scoreAddOneThousand_skipZeroTens anop
lda tileType+P1_SCORE_HUNDREDS_OFFSET ldx scoreHundredsOffset
lda tileType,x
bne scoreAddOneThousand_skipZeroHundreds bne scoreAddOneThousand_skipZeroHundreds
lda #TILE_NUMBER_0 lda #TILE_NUMBER_0
sta tileType+P1_SCORE_HUNDREDS_OFFSET sta tileType,x
ldx #P1_SCORE_HUNDREDS_OFFSET
_dirtyNonGameTile _dirtyNonGameTile
scoreAddOneThousand_skipZeroHundreds anop scoreAddOneThousand_skipZeroHundreds anop
ldx #P1_SCORE_THOUSANDS_OFFSET ldx scoreThousandsOffset
jmp scoreAddOneToTile jmp scoreAddOneToTile
@ -372,7 +416,14 @@ checkHighScore_doneCopy anop
lda gameScore+2 lda gameScore+2
sta settings+SETTINGS_HIGH_SCORE_OFFSET+HIGH_SCORE_SCORE_OFFSET+2,y 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 ldx #P1_SCORE_ONES_OFFSET-18
checkHighScore_saveHighScore anop
lda tileType,x lda tileType,x
jsl tileTypeToAscii jsl tileTypeToAscii
sta settings+SETTINGS_HIGH_SCORE_OFFSET+HIGH_SCORE_SCORE_TEXT_OFFSET,y sta settings+SETTINGS_HIGH_SCORE_OFFSET+HIGH_SCORE_SCORE_TEXT_OFFSET,y