From 1f1efd05daa2bb3a327dab2cbb889178a844c414 Mon Sep 17 00:00:00 2001 From: alpine9000 Date: Mon, 25 Apr 2016 20:54:03 +1000 Subject: [PATCH] wip - render pathways when required --- 028.bs/Makefile | 3 + 028.bs/foreground.tmx | 9 ++- 028.bs/game1.s | 133 +++++++++++++++++++++++++++++++++++++----- 028.bs/player.s | 27 ++++++--- 4 files changed, 149 insertions(+), 23 deletions(-) diff --git a/028.bs/Makefile b/028.bs/Makefile index bf63067..7d7e27b 100644 --- a/028.bs/Makefile +++ b/028.bs/Makefile @@ -136,6 +136,9 @@ out/foreground-map.s: foreground.tmx rm items-map.s mv items-indexes.s out rm foreground-indexes.s + mv pathway-map.s out + mv pathway-indexes.s out + out/background-map.s: background.tmx ../tools/mapgen/out/mapgen --depth=3 --input=background.tmx diff --git a/028.bs/foreground.tmx b/028.bs/foreground.tmx index a603630..7e47065 100644 --- a/028.bs/foreground.tmx +++ b/028.bs/foreground.tmx @@ -8,12 +8,17 @@ - eJxjZ2BgsGTEjtlH5eguZwekmYBYDAs9Kkd/OS0c8sTInQfij2ToG5XDLUdJfLIC8xc34+BJW8NBDhQvu4FYFxiuxoyoNEwOlgdOMqDKLYfGyWBJW8NBjpg4ewyNL3lG3HLfqZhGRrIcteL6LgNq3hls6W6oyA3GNt9IlgMAObNbyg== + eJxjZ2BgsGTEjtlH5eguZwekmYBYDAs9Kkd/OS0c8qNyAyM3GNPISJYDxctuPHG2nIK4HpUbzR9DXW4wppGRLDcY23wjWQ4AcBJSvQ== + + + + + eJxjYBgFo2AUjIKhCc4D8Uck/kkgNmZkYNBlRKVHAe0AcjhLAvFjBggfBORHw34UjIJRMApGARYAAKjfBWM= - eJxjYBgFgw04MuLnE1JPCDgRqZ5YdcMdgMKX2DBGV+dKhD6QHucREtbUSFOwMEancamFybuQaDep6kcqQI5TQnGCnpdIyVsgQEx+IhUM5XIO5HZkDAKE6g/0sgY5DtzICAty9FATkBJ/gyWuSa2z3amonlS7R8EooBUAAJkfC84= + eJxjYBgFgw04MuLnE1JPCDgRqZ5YdcMdgMKX2DBGV+dKhD6QHucREtbUSFOwMMYVJy6MqGph6lxItJtU9SMduDISjhv0vERK3oLZQW0wlMs5kNuRMQiQU3/A1LiRERbk6KEmICX+Bktck1pnu1NRPal2j4JRQCsAAIdJC5A= diff --git a/028.bs/game1.s b/028.bs/game1.s index 5589cc7..419c596 100644 --- a/028.bs/game1.s +++ b/028.bs/game1.s @@ -3,6 +3,8 @@ xdef BigBang xdef IncrementScore + xdef pathwayRenderPending + xdef copperList xdef mpanelCopperList xdef copperListBpl1Ptr @@ -17,6 +19,7 @@ xdef foregroundOffscreen xdef foregroundScrollX xdef map + xdef pathwayMap xdef itemsMap xdef mapSize xdef moving @@ -76,6 +79,7 @@ Entry: Reset: + move.w #0,pathwayRenderPending move.w #0,moving move.l #playareaFade,playareaFadePtr move.l #panelFade,panelFadePtr @@ -104,7 +108,7 @@ SetupBoardLoop: move.l foregroundScrollX,d0 move.w #1,moving bsr Update - bsr RenderNextForegroundFrame + bsr RenderNextForegroundFrame cmp.l #FOREGROUND_PLAYAREA_WIDTH_WORDS,frameCount bge .gotoGameLoop bra SetupBoardLoop @@ -166,11 +170,8 @@ GameLoop: move.w #0,moving .s2: jsr ProcessJoystick - - jsr InstallNextTileColor - jsr CheckPlayerMiss bsr Update - bsr RenderNextForegroundFrame + bsr RenderNextForegroundFrame jsr RenderNextBackgroundFrame if TIMING_TEST=1 @@ -183,7 +184,7 @@ GameLoop: bra GameLoop -Update: +Update: jsr UpdatePlayer .backgroundUpdates: @@ -211,8 +212,15 @@ Update: bne .c1 bsr ResetAnimPattern bsr ResetDeAnimPattern + rts .c1: .skipForegroundUpdates: + cmp.w #0,pathwayRenderPending + beq .dontRenderPathway + jsr RenderPathway +.dontRenderPathway: + jsr InstallNextTileColor + jsr CheckPlayerMiss rts @@ -337,6 +345,99 @@ RenderNextForegroundFrame: blt .loop rts +RenderPathway: + ;; only render when scroll complete + move.l foregroundScrollX,d0 + lsr.l #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels + and.b #$f,d0 + cmp.b #$f,d0 + bne .skip + + sub.w #1,pathwayRenderPending + move.w #6,d6 +.loopY: + move.l #5,d5 +.loopX: + bsr GetPathTile + move.l d0,a2 + move.w (a2),d0 + cmp.w #0,d0 + beq .dontBlit + + lea foregroundTilemap,a1 + add.w d0,a1 ; source tile + + move.l foregroundScrollX,d0 + lsr.w #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels + lsr.w #3,d0 ; bytes to scroll + move.l foregroundOffscreen,a0 + add.l d0,a0 + + move.l #-BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH*8,d0 + move.w d5,d4 + mulu.w #2,d4 + add.l d4,d0 + add.l #10,d0 + add.l d0,a0 + move.l #10,d2 + sub.l d6,d2 + jsr BlitTile +.dontBlit: + dbra d5,.loopX + dbra d6,.loopY +.skip: + + rts + + +GetPathTile: + ;; d5 - x board index + ;; d6 - y board index + ;; + ;; d0 - pathwayOffset + + lea pathwayMap,a2 + + ;; calculate the a2 offset of the top right tile based on foreground scroll + move.l foregroundScrollX,d0 + lsr.l #FOREGROUND_SCROLL_TILE_INDEX_CONVERT,d0 + lsr.l #1,d0 + and.b #$f0,d0 + add.l d0,a2 + + move.l #(FOREGROUND_PLAYAREA_WIDTH_WORDS/2)-1,d1 + sub.w d5,d1 ; x column + mulu.w #FOREGROUND_PLAYAREA_HEIGHT_WORDS*2,d1 + sub.l d1,a2 ; player x if y == bottom ? + + sub.l d1,d1 + move.w #FOREGROUND_PLAYAREA_HEIGHT_WORDS-1,d1 + sub.w d6,d1 ; y row + lsl.w #1,d1 + add.l d1,a2 + + ;; a2 now points at the tile at the coordinate + move.l a2,d0 + rts + + +RenderNextForegroundPathwayFrame: + lea pathwayMap,a2 + move.l foregroundScrollX,d0 + lsr.l #FOREGROUND_SCROLL_TILE_INDEX_CONVERT,d0 + lsr.l #1,d0 + and.b #$f0,d0 + add.l d0,a2 + move.l 0,d3 +.loop: + move.l d3,d2 + bsr RenderForegroundTile + add.l #2,a2 + add.l #1,d3 + cmp.l #FOREGROUND_PLAYAREA_HEIGHT_WORDS,d3 + blt .loop + rts + RenderForegroundTile_NoAnim: ;; a2 - address of tileIndex @@ -359,6 +460,9 @@ RenderForegroundTile: move.l foregroundOffscreen,a0 add.l d0,a0 lea foregroundTilemap,a1 + move.w (a2),d0 + cmp.l #0,d0 + beq .s2 add.w (a2),a1 ; source tile add.l #(BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH*(256-(16*8)+32)/4)+BITPLANE_WIDTH_BYTES-FOREGROUND_PLAYAREA_RIGHT_MARGIN_BYTES,a0 lea animIndex,a4 @@ -512,7 +616,7 @@ Level3InterruptHandler: move.w #INTF_VERTB,INTREQ(a6) ; clear interrupt bit add.l #1,verticalBlankCount jsr SetupSpriteData - jsr P61_Music + ;; jsr P61_Music .checkCopper: move.w INTREQR(a6),d0 and.w #INTF_COPER,d0 @@ -895,7 +999,6 @@ InstallFlagsGreyPalette: InstallNextTileColor: - movem.l d0-a6,-(sp) lea playAreaCopperPalettePtr2,a1 add.l #6,a1 ; point to COLOR01 move.l tileFadePtr,a0 @@ -913,7 +1016,6 @@ InstallNextTileColor: .reset: move.l #tileFade,tileFadePtr .done: - movem.l (sp)+,d0-a6 rts InstallNextGreyPalette: @@ -990,9 +1092,13 @@ panel: incbin "out/panel.bin" mpanel: incbin "out/mpanel.bin" + +pathwayMap: + include "out/pathway-map.s" + dc.w $FFFF map: include "out/foreground-map.s" - dc.w $FFFF + dc.w $FFFF itemsMap: include "out/items-indexes.s" dc.w $FFFF @@ -1010,7 +1116,9 @@ verticalBlankCount: dc.l 0 moving: dc.w 0 - +pathwayRenderPending: + dc.w 0 + tileFadePtr: dc.l tileFade playareaFadePtr: @@ -1018,8 +1126,7 @@ playareaFadePtr: panelFadePtr: dc.l panelFade flagsFadePtr: - dc.l flagsFade - + dc.l flagsFade bigBangIndex: ds.l FOREGROUND_PLAYAREA_HEIGHT_WORDS*FOREGROUND_PLAYAREA_WIDTH_WORDS,0 diff --git a/028.bs/player.s b/028.bs/player.s index e27693e..feab677 100644 --- a/028.bs/player.s +++ b/028.bs/player.s @@ -12,6 +12,9 @@ xdef InstallPlayerColorPalette xdef SelectNextPlayerSprite xdef CalculateScore + + xdef spriteLagX + xdef spriteY PLAYER_INSTALL_COLOR_PALETTE equ 0 PLAYER_SPRITE_DATA equ 4 @@ -242,6 +245,7 @@ InstallRobotColorPalette: rts CheckPlayerMiss: + cmp.w #PLAYER_CHECK_MISS_PIXELS,spriteR beq .check cmp.w #PLAYER_CHECK_MISS_PIXELS,spriteU @@ -253,7 +257,8 @@ CheckPlayerMiss: rts .check: - lea map,a2 + lea pathwayMap,a2 + lea map,a3 ;; calculate the a2 offset of the top right tile based on foreground scroll move.l foregroundScrollX,d0 @@ -261,46 +266,52 @@ CheckPlayerMiss: lsr.l #1,d0 and.b #$f0,d0 add.l d0,a2 + add.l d0,a3 ;; add the offset based on the sprite's x position move.w spriteLagX,d0 - cmpi.w #PLAYER_LEFT_X,d0 blt .doBigBang - sub.w #PLAYER_LEFT_X,d0 lsr.w #4,d0 ; x columns - - move.l #(FOREGROUND_PLAYAREA_WIDTH_WORDS/2)-1,d1 sub.w d0,d1 mulu.w #FOREGROUND_PLAYAREA_HEIGHT_WORDS*2,d1 sub.l d1,a2 ; player x if y == bottom ? + sub.l d1,a3 ; player x if y == bottom ? ;; add the offset based on the sprite's y postion move.w #PLAYER_BOTTOM_Y,d0 sub.w spriteY,d0 lsr.w #4,d0 ; y columns - ;; add.w #1,d0 sub.l d1,d1 move.w #FOREGROUND_PLAYAREA_HEIGHT_WORDS-1,d1 sub.w d0,d1 lsl.w #1,d1 add.l d1,a2 + add.l d1,a3 ;; a2 now points at the tile under the sprite move.w (a2),d0 - - ;; cmp.w #$78e,d0 bge .noBigBang + + move.w (a3),d0 + cmp.w #$78e,d0 + bge .noBigBang + .doBigBang: jmp BigBang .noBigBang: + move.w (a3),d0 + cmp.w #$78e*2,d0 + blt .dontRenderPathway + move.w #2,pathwayRenderPending +.dontRenderPathway: rts SelectNextPlayerSprite: