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 42cf938..1c02f74 100644 Binary files a/BuGS/make/system601.2mg and b/BuGS/make/system601.2mg differ 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