From b3da2023e414cdbcdb00bd36877fa93e9890abbb Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Wed, 22 Jul 2020 00:06:01 -0400 Subject: [PATCH] Get the scorpion moving to the right and to the left and poisoning the mushrooms. Still need to handle exploding the scorpion and double speed scorpions. --- BuGS/gameFlea.s | 2 +- BuGS/gameScorpion.s | 145 +++++++++++++++++++++++++++++++++++++++++--- BuGS/random.s | 54 +++++++++++++++-- 3 files changed, 184 insertions(+), 17 deletions(-) diff --git a/BuGS/gameFlea.s b/BuGS/gameFlea.s index d977b23..867229e 100644 --- a/BuGS/gameFlea.s +++ b/BuGS/gameFlea.s @@ -172,7 +172,7 @@ updateFlea_nextTile anop lda tiles+TILE_TYPE_OFFSET,x bne updateFlea_nextAction - jsl rand65535 + jsl rand0_to_65534 and #$7 bne updateFlea_nextAction lda #TILE_MUSHROOM4 diff --git a/BuGS/gameScorpion.s b/BuGS/gameScorpion.s index 204a246..cd3ed41 100644 --- a/BuGS/gameScorpion.s +++ b/BuGS/gameScorpion.s @@ -22,6 +22,10 @@ SCORPION_STATE_EXPLODING equ 3 SCORPION_SLOW_UPDATES_PER_TILE equ TILE_PIXEL_WIDTH-1 SCORPION_FAST_UPDATES_PER_TILE equ TILE_PIXEL_WIDTH/2-1 +; A scorpion will only be generated in the top N rows. This defines that number. +SCORPION_NUM_POSSIBLE_ROWS equ 15 + + drawScorpion entry lda scorpionState bne drawScorpion_cont @@ -149,31 +153,64 @@ jumpInst jmp >leftScorpion1 updateScorpion entry lda scorpionState - beq updateScorpion_done + bne updateScorpion_cont + rtl +updateScorpion_cont anop + cmp #SCORPION_STATE_EXPLODING + bra updateScorpion_notExploding + jmp updateScorpion_exploding + +updateScorpion_notExploding anop +; Common code for left or right moving scorpions lda scorpionSprite - beq updateScorpionLeft_resetSprite + beq updateScorpion_resetSprite sec sbc #$4 sta scorpionSprite - bra updateScorpionLeft_nextAction + bra updateScorpion_nextAction -updateScorpionLeft_resetSprite anop +updateScorpion_resetSprite anop lda #SCORPION_SPRITE_LAST_OFFSET sta scorpionSprite -updateScorpionLeft_nextAction anop +updateScorpion_nextAction anop lda scorpionShiftInTile - beq updateScorpionLeft_nextTile + beq updateScorpion_nextTile dec a sta scorpionShiftInTile and #$1 beq updateScorpion_done - dec scorpionScreenOffset - bra updateScorpion_done + lda scorpionState + cmp #SCORPION_STATE_LEFT + beq updateScorpion_screenLeft + inc scorpionScreenOffset + rtl +updateScorpion_screenLeft anop + dec scorpionScreenOffset + rtl + + +updateScorpion_nextTile anop + lda scorpionState + cmp #SCORPION_STATE_LEFT + beq updateScorpionLeft_nextTile + +updateScorpionRight_nextTile anop + inc scorpionScreenOffset + lda #SCORPION_SLOW_UPDATES_PER_TILE + sta scorpionShiftInTile + + ldx scorpionTileOffsets+2 + cpx #RHS_FIRST_TILE_OFFSET + blt updateScorpionRight_notOffScreen + cpx #LHS_FIRST_TILE_OFFSET + bge updateScorpionRight_notOffScreen + bra updateScorpion_offScreen + updateScorpionLeft_nextTile anop dec scorpionScreenOffset lda #SCORPION_SLOW_UPDATES_PER_TILE @@ -188,11 +225,32 @@ updateScorpionLeft_nextTile anop stx scorpionTileOffsets+2 lda tiles+TILE_LEFT_OFFSET,x sta scorpionTileOffsets + bra updateScorpion_maybePoison + +updateScorpionRight_notOffScreen anop + stx scorpionTileOffsets+4 + ldx scorpionTileOffsets + stx scorpionTileOffsets+2 + lda tiles+TILE_RIGHT_OFFSET,x + sta scorpionTileOffsets + +updateScorpion_maybePoison anop + lda tiles+TILE_TYPE_OFFSET,x + beq updateScorpion_done + cmp #TILE_MUSHROOM4+1 + bge updateScorpion_done + + ora #32 + sta tiles+TILE_TYPE_OFFSET,x rtl updateScorpion_offScreen anop stz scorpionState - + rtl + +updateScorpion_exploding anop +; Write this code + updateScorpion_done anop rtl @@ -201,11 +259,20 @@ addScorpion entry lda scorpionState bne addScorpion_done + jsl rand0_to_14 + asl a + tay + + jsl rand0_to_65534 + and #1 + beq addScorpion_right + lda #SCORPION_STATE_LEFT sta scorpionState - ldx #(24+25)*16 + ldx scorpionLeftTileOffset,y stx scorpionTileOffsets + lda tiles+TILE_SCREEN_OFFSET_OFFSET,x dec a sta scorpionScreenOffset @@ -217,6 +284,30 @@ addScorpion entry lda tiles+TILE_RIGHT_OFFSET,x sta scorpionTileOffsets+4 + bra addScorpion_common + +addScorpion_right anop + + lda #SCORPION_STATE_RIGHT + sta scorpionState + + ldx scorpionRightTileOffset,y + stx scorpionTileOffsets + + lda tiles+TILE_LEFT_OFFSET,x + sta scorpionTileOffsets+2 + + tax + lda tiles+TILE_LEFT_OFFSET,x + sta scorpionTileOffsets+4 + + tax + lda tiles+TILE_SCREEN_OFFSET_OFFSET,x + dec a + dec a + sta scorpionScreenOffset + +addScorpion_common anop lda #SCORPION_SLOW_UPDATES_PER_TILE sta scorpionShiftInTile @@ -275,6 +366,40 @@ scorpionRightJumpTable dc i4'rightScorpion4' dc i4'rightScorpion1s' dc i4'rightScorpion1' dc i4'rightScorpion1s' + + +scorpionLeftTileOffset dc i2'((0*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((1*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((2*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((3*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((4*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((5*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((6*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((7*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((8*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((9*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((10*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((11*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((12*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((13*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + dc i2'((14*GAME_NUM_TILES_WIDE)+GAME_NUM_TILES_WIDE-1)*SIZEOF_TILE_INFO' + + +scorpionRightTileOffset dc i2'0*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'1*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'2*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'3*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'4*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'5*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'6*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'7*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'8*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'9*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'10*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'11*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'12*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'13*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' + dc i2'14*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO' end diff --git a/BuGS/random.s b/BuGS/random.s index 0bd7d37..011ba23 100644 --- a/BuGS/random.s +++ b/BuGS/random.s @@ -4,6 +4,27 @@ ; ; Created by Jeremy Rand on 2020-07-19. ;Copyright © 2020 Jeremy Rand. All rights reserved. +; +; +; This code was suggested by John Brooks +; +; If you need a random range less than 16 bits, here the smaller EOR constants: +; BITS EOR_CONST +; 2 $0003 +; 3 $0006 +; 4 $000C +; 5 $0014 +; 6 $0030 +; 7 $0060 +; 8 $00B8 +; 9 $0110 +; 10 $0240 +; 11 $0500 +; 12 $0CA0 +; 13 $1B00 +; 14 $3500 +; 15 $6000 +; 16 $B400 ; case on @@ -15,44 +36,65 @@ random start randInit entry lda randomSeed sta seed65535 + and #$1f bne randInit_store32 lda #$1f randInit_store32 anop sta seed32 + + and #$f + bne randInit_store16 + lda #$f +randInit_store16 anop + sta seed16 + rtl +; Returns a number from 0 to 14 +rand0_to_14 entry + lda seed16 + lsr a + bcc skipEor16 + eor #$000c +skipEor16 anop + sta seed16 + dec a + rtl + -; Returns a number from 1 to 31 -rand32 entry +; Returns a number from 0 to 30 +rand0_to_30 entry lda seed32 lsr a bcc skipEor32 eor #$0014 skipEor32 anop sta seed32 + dec a rtl ; returns a number from 0 to 24 rand25 entry - jsl rand32 - dec a + jsl rand0_to_30 cmp #25 bge rand25 rtl -; Returns a number from 1 to 65535 -rand65535 entry +; Returns a number from 0 to 65534 +rand0_to_65534 entry lda seed65535 lsr a bcc skipEor65535 eor #$b400 skipEor65535 anop sta seed65535 + dec a rtl seed65535 dc i2'0' seed32 dc i2'0' +seed16 dc i2'0' end