From eb418fb1c41f761b07188d543d9ef59ebbf67ce9 Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Fri, 2 Oct 2020 14:50:14 -0400 Subject: [PATCH] Add the ability to shoot centipede segments. --- .../xcschemes/xcschememanagement.plist | 6 +- BuGS/game.s | 5 + BuGS/gameSegments.s | 128 ++++++++++++++++-- 3 files changed, 125 insertions(+), 14 deletions(-) diff --git a/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist b/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist index c7870af..1f9303c 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 + 2 BuGS.xcscheme_^#shared#^_ @@ -17,12 +17,12 @@ DiskImage.xcscheme_^#shared#^_ orderHint - 2 + 3 doNotBuild.xcscheme_^#shared#^_ orderHint - 3 + 1 diff --git a/BuGS/game.s b/BuGS/game.s index de34e0b..63114d1 100644 --- a/BuGS/game.s +++ b/BuGS/game.s @@ -243,6 +243,8 @@ checkKey_loop2 anop cmp #'c' beq checkKey_centipede + cmp #'C' + beq checkKey_shootCentipede lda colourPalette inc a @@ -273,6 +275,9 @@ checkKey_addSpider anop checkKey_shootSpider anop jmp shootSpider + +checkKey_shootCentipede anop + jmp shootRandomSegment checkKey_quit anop stz shouldQuit diff --git a/BuGS/gameSegments.s b/BuGS/gameSegments.s index 4ec5924..a5eb066 100644 --- a/BuGS/gameSegments.s +++ b/BuGS/gameSegments.s @@ -18,9 +18,10 @@ SEGMENT_MAX_NUM equ 12 SEGMENT_MAX_OFFSET equ SEGMENT_MAX_NUM*2-2 SEGMENT_STATE_NONE equ 0 -SEGMENT_STATE_HEAD equ 1 -SEGMENT_STATE_POISONED_HEAD equ 2 -SEGMENT_STATE_BODY equ 3 +SEGMENT_STATE_EXPLODING equ 1 +SEGMENT_STATE_HEAD equ 2 +SEGMENT_STATE_POISONED_HEAD equ 3 +SEGMENT_STATE_BODY equ 4 SEGMENT_DIR_LEFT equ 0 SEGMENT_DIR_RIGHT equ 1 @@ -59,11 +60,17 @@ drawSegments_nextSegment anop drawSegments_cont anop phx + cmp #SEGMENT_STATE_EXPLODING + beq drawSegments_exploding cmp #SEGMENT_STATE_BODY bne drawSegments_head jsl segmentBodyJump bra drawSegments_handleTiles - + +drawSegments_exploding anop + jsl segmentExplodingJump + bra drawSegments_handleTiles + drawSegments_head anop jsl segmentHeadJump @@ -91,7 +98,20 @@ drawSegments_skipSegment anop drawSegments_done anop rtl - + +segmentExplodingJump entry + lda segmentPosOffset,x + tax + ldy segmentFacing,x + lda explosionJumpTable,y + sta segmentExplodingJump_jumpInst+1 + lda explosionJumpTable+2,y + sta segmentExplodingJump_jumpInst+3 + ldy segmentScreenOffsets,x + +segmentExplodingJump_jumpInst anop + jmp >leftHead1 + nop segmentHeadJump entry lda segmentPixelOffset @@ -236,7 +256,7 @@ updateSegments_nextSegment anop jmp updateSegments_skipSegment updateSegments_cont anop cmp #SEGMENT_STATE_BODY - bne updateSegments_head + bne updateSegments_headOrExploding lda segmentPosOffset,x beq updateSegments_bodyWrapPos @@ -258,8 +278,7 @@ updateSegments_bodyMarkTile anop plx jmp updateSegments_skipSegment -updateSegments_head anop -; jsl waitForKey +updateSegments_headOrExploding anop lda segmentPosOffset,x beq updateSegments_headWrapPos dec a @@ -292,6 +311,14 @@ updateSegments_headWrapPos anop lda segmentCurrentTile sta segmentCurrentTile+SEGMENT_MAX_POSITION_OFFSET +; We could be in exploding state and if so, we want to skip the rest of the +; code for update head segments. + lda segmentStates,x + cmp #SEGMENT_STATE_EXPLODING + bne updateSegments_notExplodingWrap + jsr updateSegmentExplodingWrap + bra updateSegments_skipSegment +updateSegments_notExplodingWrap anop ; Important - Do facing last because we use that to index into the jump ; table for update. lda segmentFacing @@ -316,7 +343,15 @@ updateSegments_headNoWrap anop sta segmentTileOffsetsLR,y lda segmentCurrentTile+2,y sta segmentCurrentTile,y - + +; We could be in exploding state and if so, we want to skip the rest of the +; code for update head segments. + lda segmentStates,x + cmp #SEGMENT_STATE_EXPLODING + bne updateSegments_notExplodingNoWrap + jsr updateSegmentExplodingNoWrap + bra updateSegments_skipSegment +updateSegments_notExplodingNoWrap anop ; Important - Do facing last because we use that to index into the jump ; table for update. lda segmentFacing+2,y @@ -352,8 +387,27 @@ updateSegments_skipSegment anop jmp updateSegments_nextSegment updateSegments_done anop rtl + + +updateSegmentExplodingNoWrap entry + lda segmentFacing+2,y + bra updateSegmentExploding_common + +updateSegmentExplodingWrap entry + lda segmentFacing +updateSegmentExploding_common anop + beq updateSegmentExploding_done + sec + sbc #$4 + sta segmentFacing,y + rts + +updateSegmentExploding_done anop + lda #SEGMENT_STATE_NONE + sta segmentStates,x + rts - + updateSegmentLeftFast entry tyx dec segmentScreenOffsets,x @@ -1451,9 +1505,61 @@ addFastHeadSegment entry rtl +; Call this with the segment num * 2 in the X register shootSegment entry -; Write this code... + dec numSegments + lda #SEGMENT_STATE_EXPLODING + sta segmentStates,x + ldy segmentPosOffset,x + +; We take over the segmentFacing value when exploding to be an explosion sprite offset + lda #EXPLOSION_LAST_OFFSET + sta segmentFacing,y + + lda segmentCurrentTile,y + cmp #(NUM_GAME_TILES-GAME_NUM_TILES_WIDE)*SIZEOF_TILE_INFO + bge shootSegment_skipMushroom + tay + lda tileType,y + beq shootSegment_normalMushroom + cmp #TILE_POISON_MUSHROOM1 + bge shootSegment_poisonMushroom +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 + sta tileDirty,y +shootSegment_skipMushroom anop +; If this is the last segment, then do not look for a following body segment + cpx #22 + bge shootSegment_done +; If the segment after this is a body segment, then it is now a head segment + lda segmentStates+2,x + cmp #SEGMENT_STATE_BODY + bne shootSegment_done + lda #SEGMENT_STATE_HEAD + sta segmentStates+2,x +shootSegment_done anop rtl + + +shootRandomSegment entry + lda numSegments + bne shootRandomSegment_hasSegments + rtl +shootRandomSegment_hasSegments anop + lda #12 + jsl randN + asl a + tax + lda segmentStates,x + cmp #SEGMENT_STATE_HEAD + blt shootRandomSegment_hasSegments + jmp shootSegment numSegments dc i2'0'