From 1cd4ccea3a9b8c8e59285b84d53500a2313fbb5b Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Wed, 6 Jan 2021 23:27:51 -0500 Subject: [PATCH] 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. --- BuGS/game.s | 1 + BuGS/gamePlayer.s | 58 ++++++++++++-- BuGS/globals.s | 22 ++++-- BuGS/make/system601.2mg | Bin 10485824 -> 10485824 bytes BuGS/score.s | 163 ++++++++++++++++++++++++++-------------- 5 files changed, 174 insertions(+), 70 deletions(-) diff --git a/BuGS/game.s b/BuGS/game.s index c0cc643..b85102c 100644 --- a/BuGS/game.s +++ b/BuGS/game.s @@ -186,6 +186,7 @@ startGame entry bne startGame_notRunning rtl startGame_notRunning anop + sta isSinglePlayer stz gameRunning jsl addRandomMushrooms jsl scoreStartGame diff --git a/BuGS/gamePlayer.s b/BuGS/gamePlayer.s index da571a2..d0b2891 100644 --- a/BuGS/gamePlayer.s +++ b/BuGS/gamePlayer.s @@ -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 diff --git a/BuGS/globals.s b/BuGS/globals.s index 1424fb0..b5863ca 100644 --- a/BuGS/globals.s +++ b/BuGS/globals.s @@ -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' diff --git a/BuGS/make/system601.2mg b/BuGS/make/system601.2mg index 42cf938c7361d37bef86cb7a7e9a0aa3259e4022..1c02f74990a30495d05cd0829c54289c521bc431 100644 GIT binary patch delta 671 zcmWmASu+&?0D#fKy{JTs7L`O&v?$RkDhYLISBg+s+oV!dT!eJnEG@Qr_1KJQdiB#B z4`;sjZ!sJWF7mfJ5R;XYGEozlU+zL6I9wJLJs1g%L_$$S6GMO?vBVM23Rbd;1Xhzs z5^Gq?I@XiS1~#&Z&7`n}t!yKe?WD1TbTZgUCcDUDH+#q?hrR4$KL^O=Acx4~F!>a4 zgrgkeI43wsA*U#!nA4o$EG3+yl=GBPP6ZdZ$nvjBs<^~uu5guWT;~SW+~gKD+~y9o z)Nz-38ffGm_jy1Q&9u-;8|^&g5s!JoQ#yD?C(n7oOS*W)Yr5&-4R3izFMWjRXMjQ8 tGsG|>d|;H1MEJyKzVMZAj4{pxlYHj~Kl#NJ)66i-9KZiZLVx}(ECIX27Nh_G delta 671 zcmWmASu+&?0D#evdr?G-7L`O&v?!4lQAwyvyHcdh)ii=QgD_SUe^=QU4z4~d6 zhcn;%w-^ow7n!dKL}%utPSghGmb(xLj+95m4@E+wkx&#Xh$cXg7-ETIC98-hfz>3E z#2VJJj`bw7fsJfpGbwCgE89qAJ8A47oeXx8$u6?k%^tGJVK4jG&jE5d$RYALOg;r1 zp^&2-<2WZM;v~hCaEjBMp_H?fagK5-sN_5sSpHQ-H5a+WWv+0QYh0&>8{DLpTim9O zdhXD`UG8z82Rx*aCYouXl}9}02~T-O8|^%&gBQHy6`j1Mi*9=8xXTI>2Z;Ug+B;WbLPku4QG{5=7472|up}+qYmH^y=7O?;T diff --git a/BuGS/score.s b/BuGS/score.s index 0502378..bc279bf 100644 --- a/BuGS/score.s +++ b/BuGS/score.s @@ -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