diff --git a/crosshair.s b/crosshair.s index 51ce6d9..a600f9d 100644 --- a/crosshair.s +++ b/crosshair.s @@ -97,6 +97,29 @@ renderCrosshairDone: rts +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; protectCrosshair +; +; Trashes PARAML0 +; +protectCrosshair: + pha + + lda #crosshairGameObject + sta PARAML0 + jsr vramPtr + cpx #$ffff + beq protectCrosshairDone + + lda #crosshairGameObject+GO_BACKGROUND + sta PARAML0 + jsr protectGameObject + +protectCrosshairDone: + pla + rts + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; unrenderCrosshair ; diff --git a/gamemanager.s b/gamemanager.s index bbc22cc..de70aee 100644 --- a/gamemanager.s +++ b/gamemanager.s @@ -96,7 +96,8 @@ gameplayLoopScroll: bmi gameplayLoopAngleCheck jsr scrollMap - + jsr updateCrosshair + jsr protectCrosshair gameplayLoopAngleCheck: lda projectileActive ; Skip interactivity during shots @@ -115,6 +116,7 @@ gameplayLoopAim: jsr unrenderCrosshair ldy currentPlayer jsr updateCrosshair + jsr protectCrosshair jsr renderCrosshair gameplayLoopPower: @@ -289,6 +291,8 @@ endTurnHeader: jsr renderPlayerHeader jsr renderInventory stz turnRequested + + jsr protectCrosshair rts endTurnFocusPlayer0: @@ -337,7 +341,7 @@ scrollMapApplyScrolling: asl sta leftScreenEdge clc - adc #160-GAMEOBJECTWIDTH/4-1 + adc #160-GAMEOBJECTWIDTH/4-2 sta rightScreenEdge jsr clipTerrain @@ -408,15 +412,53 @@ fire: ; Handles moving a player ; move: + SAVE_AY + + ; Unrender everything jsr unrenderCrosshair jsr unrenderPlayers - lda #playerData + + ; Find active player game object data + ldy currentPlayer + PLAYERPTR_Y + tya + clc + adc #playerData sta PARAML0 + + ; Prepare parameters of move ldx playerMoveRequested + lda currentPlayer + beq moveParamsPlayer0 + lda #-1 + sta placeGameObjectRightOffset + lda #GAMEOBJECTWIDTH-7 + sta placeGameObjectLeftOffset + +movePerformMove: jsr moveGameObjectOnTerrain + bra moveCleanup + +moveParamsPlayer0: + lda #-6 + sta placeGameObjectRightOffset + lda #GAMEOBJECTWIDTH-2 + sta placeGameObjectLeftOffset + bra movePerformMove + +moveCleanup: + ; Handle side effects caused by move stz playerMoveRequested + ldy currentPlayer + jsr updateCrosshair + + ; Re-render everything + jsr protectPlayers jsr renderPlayers + jsr protectCrosshair jsr renderCrosshair + + RESTORE_AY rts @@ -465,6 +507,6 @@ mapScrollPos: .word 0 ;leftScreenEdge = $6E ; Moved to zero page for speed and cross-bank convenience ; .word 0 -rightScreenEdge: - .word 160-GAMEOBJECTWIDTH/4-1 +rightScreenEdge: ; Right edge minus one game object width, for easy render clipping + .word 160-GAMEOBJECTWIDTH/4-2 diff --git a/gameobject.s b/gameobject.s index af1dd40..1334ded 100644 --- a/gameobject.s +++ b/gameobject.s @@ -49,10 +49,29 @@ terrainHeightAtGameObjectPos: rts +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; placeGameObjectOnTerrainDefault +; +; PARAML0 = Pointer to gameobject data +; +; Trashes SCRATCHL,SCRATCHL2 +; +placeGameObjectOnTerrainDefault: + stz placeGameObjectRightOffset + pha + lda #GAMEOBJECTWIDTH + sta placeGameObjectLeftOffset + pla + jmp placeGameObjectOnTerrain + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; placeGameObjectOnTerrain ; ; PARAML0 = Pointer to gameobject data +; placeGameObjectLeftOffset = Left edge of height to check (default=GAMEOBJECTWIDTH) +; placeGameObjectRightOffset = Right edge of height to check (default=0) +; ; Trashes SCRATCHL,SCRATCHL2 ; placeGameObjectOnTerrain: @@ -61,6 +80,9 @@ placeGameObjectOnTerrain: ; Check forwardmost position ldy #GO_POSX lda (PARAML0),y + clc + adc placeGameObjectRightOffset + jsr terrainHeightAtGameObjectPos sta SCRATCHL2 @@ -68,7 +90,8 @@ placeGameObjectOnTerrain: ldy #GO_POSX lda (PARAML0),y sec - sbc #GAMEOBJECTWIDTH + sbc placeGameObjectLeftOffset + jsr terrainHeightAtGameObjectPos cmp SCRATCHL2 ; Take higher value bcc placeGameObjectOnTerrainRear @@ -87,7 +110,10 @@ placeGameObjectOnTerrainRear: bra placeGameObjectOnTerrainDone - +placeGameObjectLeftOffset: + .word GAMEOBJECTWIDTH +placeGameObjectRightOffset: + .word 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; moveGameObjectOnTerrain @@ -161,11 +187,17 @@ moveGameObjectOnTerrainTooFar: bra moveGameObjectOnTerrainTooDone +moveGameObjectLeftOffset: + .word 0 +moveGameObjectRightOffset: + .word GAMEOBJECTWIDTH + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; vramPtr ; ; PARAML0 = Pointer to X,Y (16 bits each, Y is bottom relative) -; X => Offset to upper left corner of VRAM, or ffff if offscreen +; X => Offset to upper left corner of VRAM, or $ffff if offscreen ; ; Trashes SCRATCHL ; diff --git a/player.s b/player.s index 99012fb..a9b3196 100644 --- a/player.s +++ b/player.s @@ -110,7 +110,7 @@ playerCreate: clc adc SCRATCHL sta PARAML0 - jsr placeGameObjectOnTerrain + jsr placeGameObjectOnTerrainDefault jsr createProgressBar rts