diff --git a/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist b/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist
index 1ebd7b3..dc9e153 100644
--- a/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist
+++ b/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -7,7 +7,7 @@
Binary.xcscheme_^#shared#^_
orderHint
- 1
+ 3
BuGS.xcscheme_^#shared#^_
@@ -17,12 +17,12 @@
DiskImage.xcscheme_^#shared#^_
orderHint
- 3
+ 2
doNotBuild.xcscheme_^#shared#^_
orderHint
- 2
+ 1
diff --git a/BuGS/game.s b/BuGS/game.s
index fd8abff..9f61a29 100644
--- a/BuGS/game.s
+++ b/BuGS/game.s
@@ -161,6 +161,10 @@ drawTile entry
jumpInst jmp >mushroom1
nop
+
+addPlayer entry
+; TODO - Write code to add a new life.
+ rtl
setupScreen entry
@@ -229,7 +233,7 @@ checkKey_loop2 anop
beq checkKey_quit
cmp #'f'
- beq checkKey_addFlea
+ beq checkKey_shootFlea
cmp #'F'
beq checkKey_shootFlea
@@ -244,9 +248,7 @@ checkKey_loop2 anop
beq checkKey_shootSpider
cmp #'+'
- beq checkKey_fast
- cmp #'-'
- beq checkKey_slow
+ beq checkKey_scoreAdd
cmp #'g'
beq checkKey_game
@@ -259,9 +261,6 @@ checkKey_loop2 anop
checkKey_done anop
rtl
-checkKey_addFlea anop
- jmp addFlea
-
checkKey_shootFlea anop
jmp shootFlea
@@ -273,18 +272,13 @@ checkKey_shootSpider anop
checkKey_shootCentipede anop
jmp shootRandomSegment
+
+checkKey_scoreAdd anop
+ jmp scoreAddTwentyThousand
checkKey_quit anop
stz shouldQuit
rtl
-
-checkKey_fast anop
- lda #SPRITE_SPEED_FAST
- jsl setFleaSpeed
-
-checkKey_slow anop
- lda #SPRITE_SPEED_SLOW
- jsl setFleaSpeed
checkKey_game anop
jmp startGame
diff --git a/BuGS/gameFlea.s b/BuGS/gameFlea.s
index f81c522..1162ae4 100644
--- a/BuGS/gameFlea.s
+++ b/BuGS/gameFlea.s
@@ -64,11 +64,10 @@ jumpInst jmp >flea1
updateFlea entry
lda fleaState
- bne updateFlea_cont
-
-updateFlea_cont anop
+ beq updateFlea_maybeAdd
+
cmp #FLEA_STATE_FALLING
- beq updateFlea_cont2
+ beq updateFlea_cont
; Handle explosion
lda fleaSprite
@@ -81,8 +80,39 @@ updateFlea_cont anop
updateFlea_explosionDone anop
stz fleaState
rtl
+
+updateFlea_maybeAdd anop
+ lda gameRunning
+ bne updateFlea_doNotAdd
+ lda gameLevel
+ beq updateFlea_doNotAdd
+ lda scoreNum20000
+ bne updateFlea_moreThan20000
+; Below 20000 points, 5 or more mushrooms do not result in a flea
+ lda #4
+ bra updateFlea_checkNumMushrooms
+updateFlea_moreThan20000 anop
+ cmp #6
+ bge updateFlea_moreThan120000
+; Between 20000 and 120000, 9 or more mushrooms do not result in a flea
+ lda #8
+ bra updateFlea_checkNumMushrooms
+updateFlea_moreThan120000 anop
+; Above 120000, 15 or more mushrooms do not result in a flea and for every
+; 20000 more points, this goes up by 1 more mushroom. So, the accumulator
+; has 6 in it for scores from 120000 to 139999. Add 8 to that to get 14
+; which is the threshold at which fleas appear.
+ clc
+ adc #8
+updateFlea_checkNumMushrooms anop
+ cmp numInfieldMushrooms
+ blt updateFlea_doNotAdd
+ jmp addFlea
+
+updateFlea_doNotAdd anop
+ rtl
-updateFlea_cont2 anop
+updateFlea_cont anop
lda fleaHeightInTile
beq updateFlea_nextTile
dec a
@@ -133,7 +163,9 @@ updateFlea_nextTile anop
bne updateFlea_nextAction
lda #TILE_MUSHROOM4
sta tileType,x
-
+ cpx #SPIDER_TOP_ROW_OFFSET
+ blt updateFlea_nextAction
+ inc numInfieldMushrooms
bra updateFlea_nextAction
updateFlea_bottom anop
@@ -155,8 +187,16 @@ updateFlea_done anop
addFlea entry
lda fleaState
bne addFlea_done
-
- lda fleaSpriteSpeed
+
+ lda scoreNum20000
+ cmp #3
+ bge addFlea_fast
+ lda #SEGMENT_SPEED_SLOW
+ bra addFlea_setSpeed
+addFlea_fast anop
+ lda #SEGMENT_SPEED_FAST
+addFlea_setSpeed anop
+ sta fleaSpriteSpeed
jsl setFleaSpeed
lda #FLEA_STATE_FALLING
diff --git a/BuGS/gameScorpion.s b/BuGS/gameScorpion.s
index 60c5c35..6a597bb 100644
--- a/BuGS/gameScorpion.s
+++ b/BuGS/gameScorpion.s
@@ -245,11 +245,8 @@ addScorpion entry
rtl
addScorpion_doit anop
- lda gameScore+2
+ lda scoreNum20000
bne addScorpion_randomSpeed
- lda gameScore
- cmp #20000
- bge addScorpion_randomSpeed
addScorpion_slow anop
lda #SPRITE_SPEED_SLOW
bra addScorpion_setSpeed
diff --git a/BuGS/gameSegments.s b/BuGS/gameSegments.s
index d382459..337b6a6 100644
--- a/BuGS/gameSegments.s
+++ b/BuGS/gameSegments.s
@@ -1687,14 +1687,17 @@ shootSegment_doneScore anop
bge shootSegment_skipMushroom
tay
lda tileType,y
- beq shootSegment_normalMushroom
+ beq shootSegment_noMushroom
cmp #TILE_POISON_MUSHROOM1
- bge shootSegment_poisonMushroom
+ blt shootSegment_normalMushroom
+ lda #TILE_POISON_MUSHROOM4
+ bra shootSegment_dirtyTile
+shootSegment_noMushroom anop
+ cpy #SPIDER_TOP_ROW_OFFSET
+ blt shootSegment_normalMushroom
+ inc numInfieldMushrooms
shootSegment_normalMushroom anop
lda #TILE_MUSHROOM4
- bra shootSegment_dirtyTile
-shootSegment_poisonMushroom anop
- lda #TILE_POISON_MUSHROOM4
shootSegment_dirtyTile anop
sta tileType,y
lda #TILE_STATE_DIRTY
diff --git a/BuGS/gameSpider.s b/BuGS/gameSpider.s
index b09ccfc..4e527cf 100644
--- a/BuGS/gameSpider.s
+++ b/BuGS/gameSpider.s
@@ -26,10 +26,6 @@ SPIDER_STATE_RIGHT_DOWN equ 9
SPIDER_STATE_RIGHT_UP equ 10
-; A spider only travels in the bottom N rows. This defines that number.
-SPIDER_NUM_POSSIBLE_ROWS equ 10
-SPIDER_TOP_ROW equ GAME_NUM_TILES_TALL-SPIDER_NUM_POSSIBLE_ROWS
-SPIDER_TOP_ROW_OFFSET equ SPIDER_TOP_ROW*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO
SPIDER_LHS_TILE_OFFSET equ SPIDER_TOP_ROW_OFFSET
SPIDER_RHS_TILE_OFFSET equ SPIDER_TOP_ROW_OFFSET+(GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO
@@ -422,6 +418,9 @@ updateSpider_tilesUp anop
beq updateSpider_tilesUpCont
lda #TILE_EMPTY
sta tileType,x
+ cpx #SPIDER_TOP_ROW_OFFSET
+ blt updateSpider_tilesUpCont
+ dec numInfieldMushrooms
updateSpider_tilesUpCont anop
ldx spiderTileOffsets+10
@@ -494,6 +493,9 @@ updateSpider_tilesDown anop
beq updateSpider_tilesDownCont
lda #TILE_EMPTY
sta tileType,x
+ cpx #SPIDER_TOP_ROW_OFFSET
+ blt updateSpider_tilesDownCont
+ dec numInfieldMushrooms
updateSpider_tilesDownCont anop
ldx spiderTileOffsets+8
diff --git a/BuGS/global.macros b/BuGS/global.macros
index 1da1d1a..6831da9 100644
--- a/BuGS/global.macros
+++ b/BuGS/global.macros
@@ -138,3 +138,38 @@ _dirtyGameTile_skip&SYSCNT anop
_dirtyNonGameTile_skip&SYSCNT anop
mend
+
+
+; Update the score
+ macro
+ _incrementScore &increment
+ lda #&increment
+ clc
+ adc gameScore
+ sta gameScore
+ bcc _incrementScore_noCarry&SYSCNT
+ inc gameScore+2
+_incrementScore_noCarry&SYSCNT anop
+ lda #&increment
+ clc
+ adc scoreWithin12000
+ cmp #12000
+ blt _incrementScore_noExtraMan&SYSCNT
+ sec
+ sbc #12000
+ pha
+ jsl addPlayer
+ pla
+_incrementScore_noExtraMan&SYSCNT anop
+ sta scoreWithin12000
+ lda #&increment
+ clc
+ adc scoreWithin20000
+ cmp #20000
+ blt _incrementScore_no2000&SYSCNT
+ sec
+ sbc #20000
+ inc scoreNum20000
+_incrementScore_no2000&SYSCNT anop
+ sta scoreWithin20000
+ mend
diff --git a/BuGS/globals.s b/BuGS/globals.s
index 14537c2..d67b224 100644
--- a/BuGS/globals.s
+++ b/BuGS/globals.s
@@ -28,6 +28,11 @@ SEGMENT_DIR_RIGHT equ 1
SEGMENT_SPEED_FAST equ 0
SEGMENT_SPEED_SLOW equ 1
+; A spider only travels in the bottom N rows. This defines that number.
+SPIDER_NUM_POSSIBLE_ROWS equ 10
+SPIDER_TOP_ROW equ GAME_NUM_TILES_TALL-SPIDER_NUM_POSSIBLE_ROWS
+SPIDER_TOP_ROW_OFFSET equ SPIDER_TOP_ROW*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO
+
SCREEN_BYTES_PER_ROW gequ 160
SIZEOF_TILE_INFO gequ 2
@@ -140,6 +145,7 @@ gameRunning dc i2'1'
numSegments dc i2'0'
gameLevel dc i2'0'
gameScore dc i4'0'
+scoreNum20000 dc i2'0'
backupStack dc i2'0'
diff --git a/BuGS/level.s b/BuGS/level.s
index d39c9e4..73a6b43 100644
--- a/BuGS/level.s
+++ b/BuGS/level.s
@@ -95,10 +95,8 @@ levelNext_skip anop
sta colourLevelNum
inc gameLevel
- lda gameScore+2
- bne levelNext_fastOnly
- lda gameScore
- cmp #40000
+ lda scoreNum20000
+ cmp #2
bge levelNext_fastOnly
ldy centipedeLevelNum
diff --git a/BuGS/score.s b/BuGS/score.s
index ab41e80..c3761b6 100644
--- a/BuGS/score.s
+++ b/BuGS/score.s
@@ -19,10 +19,14 @@ TILE_SCORE_ONES_OFFSET equ TILE_SCORE_ONES*SIZEOF_TILE_INFO
TILE_SCORE_TENS_OFFSET equ TILE_SCORE_ONES_OFFSET-SIZEOF_TILE_INFO
TILE_SCORE_HUNDREDS_OFFSET equ TILE_SCORE_TENS_OFFSET-SIZEOF_TILE_INFO
TILE_SCORE_THOUSANDS_OFFSET equ TILE_SCORE_HUNDREDS_OFFSET-SIZEOF_TILE_INFO
+TILE_SCORE_TEN_THOUSANDS_OFFSET equ TILE_SCORE_THOUSANDS_OFFSET-SIZEOF_TILE_INFO
scoreStartGame entry
stz gameScore
stz gameScore+2
+ stz scoreWithin12000
+ stz scoreWithin20000
+ stz scoreNum20000
ldx #TILE_SCORE_ONES_OFFSET
lda #TILE_NUMBER_0
@@ -158,35 +162,20 @@ scoreAddToTile_done anop
scoreAddOne entry
- inc gameScore
- bne scoreAddOne_noCarry
- inc gameScore+2
-scoreAddOne_noCarry anop
+ _incrementScore 1
ldx #TILE_SCORE_ONES_OFFSET
jmp scoreAddOneToTile
scoreAddFive entry
- lda #5
- clc
- adc gameScore
- sta gameScore
- bcc scoreAddFive_noCarry
- inc gameScore+2
-scoreAddFive_noCarry anop
+ _incrementScore 5
ldx #TILE_SCORE_ONES_OFFSET
lda #5*4
jmp scoreAddToTile
scoreAddTen entry
- lda #10
- clc
- adc gameScore
- sta gameScore
- bcc scoreAddTen_noCarry
- inc gameScore+2
-scoreAddTen_noCarry anop
+ _incrementScore 10
lda tileType+TILE_SCORE_ONES_OFFSET
bne scoreAddTen_skipZeroOnes
lda #TILE_NUMBER_0
@@ -199,13 +188,7 @@ scoreAddTen_skipZeroOnes anop
scoreAddOneHundred entry
- lda #100
- clc
- adc gameScore
- sta gameScore
- bcc scoreAddHundred_noCarry
- inc gameScore+2
-scoreAddHundred_noCarry anop
+ _incrementScore 100
lda tileType+TILE_SCORE_ONES_OFFSET
bne scoreAddHundred_skipZeroOnes
lda #TILE_NUMBER_0
@@ -225,13 +208,7 @@ scoreAddHundred_skipZeroTens anop
scoreAddTwoHundred entry
- lda #200
- clc
- adc gameScore
- sta gameScore
- bcc scoreAddTwoHundred_noCarry
- inc gameScore+2
-scoreAddTwoHundred_noCarry anop
+ _incrementScore 200
lda tileType+TILE_SCORE_ONES_OFFSET
bne scoreAddTwoHundred_skipZeroOnes
lda #TILE_NUMBER_0
@@ -252,13 +229,7 @@ scoreAddTwoHundred_skipZeroTens anop
scoreAddThreeHundred entry
- lda #300
- clc
- adc gameScore
- sta gameScore
- bcc scoreAddThreeHundred_noCarry
- inc gameScore+2
-scoreAddThreeHundred_noCarry anop
+ _incrementScore 300
lda tileType+TILE_SCORE_ONES_OFFSET
bne scoreAddThreeHundred_skipZeroOnes
lda #TILE_NUMBER_0
@@ -279,13 +250,7 @@ scoreAddThreeHundred_skipZeroTens anop
scoreAddSixHundred entry
- lda #600
- clc
- adc gameScore
- sta gameScore
- bcc scoreAddSixHundred_noCarry
- inc gameScore+2
-scoreAddSixHundred_noCarry anop
+ _incrementScore 600
lda tileType+TILE_SCORE_ONES_OFFSET
bne scoreAddSixHundred_skipZeroOnes
lda #TILE_NUMBER_0
@@ -306,13 +271,7 @@ scoreAddSixHundred_skipZeroTens anop
scoreAddNineHundred entry
- lda #900
- clc
- adc gameScore
- sta gameScore
- bcc scoreAddNineHundred_noCarry
- inc gameScore+2
-scoreAddNineHundred_noCarry anop
+ _incrementScore 900
lda tileType+TILE_SCORE_ONES_OFFSET
bne scoreAddNineHundred_skipZeroOnes
lda #TILE_NUMBER_0
@@ -333,13 +292,7 @@ scoreAddNineHundred_skipZeroTens anop
scoreAddOneThousand entry
- lda #1000
- clc
- adc gameScore
- sta gameScore
- bcc scoreAddOneThousand_noCarry
- inc gameScore+2
-scoreAddOneThousand_noCarry anop
+ _incrementScore 1000
lda tileType+TILE_SCORE_ONES_OFFSET
bne scoreAddOneThousand_skipZeroOnes
lda #TILE_NUMBER_0
@@ -363,8 +316,21 @@ scoreAddOneThousand_skipZeroTens anop
scoreAddOneThousand_skipZeroHundreds anop
ldx #TILE_SCORE_THOUSANDS_OFFSET
jmp scoreAddOneToTile
+
+; This function is used purely for debug to test high score threshold stuff. It
+; doesn't do all the right things though to update the score on the display so I am
+; cheating a bit here.
+scoreAddTwentyThousand entry
+ _incrementScore 20000
+ ldx #TILE_SCORE_TEN_THOUSANDS_OFFSET
+ lda #2*4
+ jmp scoreAddToTile
+
+
highScore dc i4'0'
+scoreWithin12000 dc i2'0'
+scoreWithin20000 dc i2'0'
end
diff --git a/BuGS/tiles.c b/BuGS/tiles.c
index eb6c405..96ef477 100644
--- a/BuGS/tiles.c
+++ b/BuGS/tiles.c
@@ -63,6 +63,8 @@ word numDirtyNonGameTiles;
word numPlayers;
+word numInfieldMushrooms;
+
/* Implementation */
@@ -282,6 +284,7 @@ void addStartingMushrooms(void)
{
tTileNum tileNum;
unsigned int numMushrooms = 0;
+ numInfieldMushrooms = 0;
while (numMushrooms < STARTING_NUM_MUSHROOMS)
{
@@ -294,5 +297,7 @@ void addStartingMushrooms(void)
tileType[tileNum] = TILE_MUSHROOM4;
ADD_DIRTY_GAME_TILE(tileNum);
numMushrooms++;
+ if ((tileNum / GAME_NUM_TILES_WIDE) >= GAME_NUM_TILES_TALL - 10)
+ numInfieldMushrooms++;
}
}
diff --git a/BuGS/tiles.h b/BuGS/tiles.h
index b0dd49b..c5f90dc 100644
--- a/BuGS/tiles.h
+++ b/BuGS/tiles.h
@@ -117,6 +117,7 @@ extern word tileBitMask[NUM_GAME_TILES];
extern tTileOffset dirtyNonGameTiles[NUM_NON_GAME_TILES];
extern word numDirtyNonGameTiles;
+extern word numInfieldMushrooms;
/* API */