From 020a2dc3b21e448f86e0e0c435f98863f58f7aeb Mon Sep 17 00:00:00 2001 From: Randy Thiemann Date: Fri, 20 Oct 2023 12:46:55 +0200 Subject: [PATCH] Proper animations on prelock. --- src/field.asm | 363 ++++++++++++++++++++++++++++++++++++++--- src/state_gameplay.asm | 2 +- tools/Emulicious.ini | 6 +- tools/GBTD/gbtd.ini | 2 +- tools/projects/out.exp | 1 + 5 files changed, 345 insertions(+), 29 deletions(-) diff --git a/src/field.asm b/src/field.asm index 04cc0d8..6ed22dd 100644 --- a/src/field.asm +++ b/src/field.asm @@ -11,12 +11,14 @@ wShadowField:: ds (14*26) SECTION "Field High Variables", HRAM -hPieceDataBase:: ds 2 -hPieceDataOffset:: ds 1 +hPieceDataBase: ds 2 +hPieceDataOffset: ds 1 hCurrentLockDelayRemaining:: ds 1 -hTicksUntilG:: ds 1 -hWantX:: ds 1 -hWantRotation:: ds 1 +hWantedTile: ds 1 +hTicksUntilG: ds 1 +hWantX: ds 1 +hYPosAtStartOfFrame: ds 1 +hWantRotation: ds 1 SECTION "Field Functions", ROM0 @@ -508,18 +510,8 @@ DrawPiece: FieldProcess:: ; Wipe out the piece. ldh a, [hCurrentPieceY] - ld b, a - ldh a, [hCurrentPieceX] - call XYToFieldPtr - ld d, h - ld e, l - call GetPieceData - ld b, TILE_FIELD_EMPTY - push hl - push de - pop hl - pop de - call DrawPiece + ldh [hYPosAtStartOfFrame], a + call FromShadowField ; Check if we're about to hold. @@ -532,13 +524,21 @@ FieldProcess:: ; If we press up, we want to do a sonic drop. - ldh a, [hUpState] +: ldh a, [hUpState] cp a, 1 jr nz, :+ ld b, 20 jr .grav + ; If we press down, we want to do a soft drop. +: ldh a, [hDownState] + cp a, 0 + jr z, :+ + ld a, 1 + ldh [hTicksUntilG], a + + ; Gravity? : ldh a, [hTicksUntilG] dec a @@ -791,13 +791,77 @@ FieldProcess:: .postmove - ; TODO: Do we need to reset the lock timer? - ; TODO: Do we need to decrement the lock timer? - ; TODO: What tile do we use to draw the piece? + ; Are we grounded? + ldh a, [hCurrentPieceY] + inc a + ld b, a + ldh a, [hCurrentPieceX] + call XYToSFieldPtr + ld d, h + ld e, l + call GetPieceData + call CanPieceFit + cp a, $FF + jr z, .notgrounded + + ; We're grounded. + ; If the y position changed, play a sound. + ldh a, [hCurrentPieceY] + ld b, a + ldh a, [hYPosAtStartOfFrame] + cp a, b + jr z, :+ + ld a, SFX_DROP + call SFXEnqueue + ; If the down button is held, lock. +: ldh a, [hDownState] + cp a, 0 + jr z, :+ + ld a, 1 + ldh [hCurrentLockDelayRemaining], a +: ldh a, [hCurrentLockDelayRemaining] + dec a + ldh [hCurrentLockDelayRemaining], a + ; If we're out of lock delay, play a sound. + cp a, 0 + jr nz, .draw + ld a, SFX_LOCK + call SFXEnqueue + jr .draw + +.notgrounded + ; Otherwise reset the lock delay. + ldh a, [hCurrentLockDelay] + ldh [hCurrentLockDelayRemaining], a ; Draw the piece. .draw + ; If the lock delay is at the highest value, draw the piece normally. + ldh a, [hCurrentPiece] + ld b, TILE_PIECE_0 + add a, b + ldh [hWantedTile], a + ldh a, [hCurrentLockDelay] + ld b, a + ldh a, [hCurrentLockDelayRemaining] + cp a, b + jr z, .drawpiece + + ; If the lock delay is 0, draw the piece in the final color. + ldh a, [hCurrentPiece] + ld b, TILE_PIECE_0+7 + add a, b + ldh [hWantedTile], a + ldh a, [hCurrentLockDelayRemaining] + cp a, 0 + jr z, .drawpiece + + ; Otherwise, look it up. + call GetTileShade + + ; TODO: What tile do we use to draw the piece? +.drawpiece ldh a, [hCurrentPieceY] ld b, a ldh a, [hCurrentPieceX] @@ -805,9 +869,7 @@ FieldProcess:: ld d, h ld e, l call GetPieceData - ldh a, [hCurrentPiece] - ld b, TILE_PIECE_0 - add a, b + ldh a, [hWantedTile] ld b, a push hl push de @@ -816,4 +878,257 @@ FieldProcess:: call DrawPiece ret + +GetTileShade: + ; Possible values for tile delay: + ; 30, 25, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 1 + ; We don't need to handle the 1 case. + ld a, 0 + ld b, a +: ldh a, [hCurrentLockDelay] + cp a, 30 + jr z, .max30 +: cp a, 25 + jr z, .max25 +: cp a, 20 + jr z, .max20 +: cp a, 18 + jp z, .max18 +: cp a, 16 + jp z, .max16 +: cp a, 14 + jp z, .max14 +: cp a, 12 + jp z, .max12 +: cp a, 10 + jp z, .max10 +: cp a, 8 + jp z, .max8 +: cp a, 6 + jp z, .max6 +: cp a, 4 + jp z, .max4 +: cp a, 2 + jp z, .max2 + ret +.max30 + ld a, [hCurrentLockDelayRemaining] + cp a, 4 + ret c + cp a, 8 + jp c, .s6 + cp a, 12 + jp c, .s5 + cp a, 16 + jp c, .s4 + cp a, 20 + jp c, .s3 + cp a, 24 + jp c, .s2 + cp a, 28 + jp c, .s1 + jp .s0 +.max25 + ld a, [hCurrentLockDelayRemaining] + cp a, 3 + ret c + cp a, 6 + jp c, .s6 + cp a, 9 + jp c, .s5 + cp a, 12 + jp c, .s4 + cp a, 15 + jp c, .s3 + cp a, 18 + jp c, .s2 + cp a, 21 + jp c, .s1 + jp .s0 +.max20 + ld a, [hCurrentLockDelayRemaining] + cp a, 2 + ret c + cp a, 5 + jp c, .s6 + cp a, 7 + jp c, .s5 + cp a, 10 + jp c, .s4 + cp a, 12 + jp c, .s3 + cp a, 15 + jp c, .s2 + cp a, 17 + jp c, .s1 + jp .s0 +.max18 + ld a, [hCurrentLockDelayRemaining] + cp a, 2 + ret c + cp a, 4 + jp c, .s6 + cp a, 6 + jp c, .s5 + cp a, 9 + jp c, .s4 + cp a, 11 + jp c, .s3 + cp a, 13 + jp c, .s2 + cp a, 15 + jp c, .s1 + jp .s0 +.max16 + ld a, [hCurrentLockDelayRemaining] + cp a, 2 + ret c + cp a, 4 + jp c, .s6 + cp a, 6 + jp c, .s5 + cp a, 8 + jp c, .s4 + cp a, 10 + jp c, .s3 + cp a, 12 + jp c, .s2 + cp a, 14 + jp c, .s1 + jp .s0 +.max14 + ld a, [hCurrentLockDelayRemaining] + cp a, 2 + ret c + cp a, 4 + jp c, .s6 + cp a, 6 + jp c, .s5 + cp a, 7 + jp c, .s4 + cp a, 9 + jp c, .s3 + cp a, 11 + jp c, .s2 + cp a, 13 + jp c, .s1 + jp .s0 +.max12 + ld a, [hCurrentLockDelayRemaining] + cp a, 1 + ret c + cp a, 3 + jp c, .s6 + cp a, 4 + jp c, .s5 + cp a, 6 + jp c, .s4 + cp a, 7 + jp c, .s3 + cp a, 9 + jp c, .s2 + cp a, 10 + jp c, .s1 + jp .s0 +.max10 + ld a, [hCurrentLockDelayRemaining] + cp a, 1 + ret c + cp a, 2 + jp c, .s6 + cp a, 3 + jp c, .s5 + cp a, 5 + jr c, .s4 + cp a, 6 + jr c, .s3 + cp a, 7 + jr c, .s2 + cp a, 8 + jr c, .s1 + jr .s0 +.max8 + ld a, [hCurrentLockDelayRemaining] + cp a, 1 + ret c + cp a, 2 + jr c, .s6 + cp a, 3 + jr c, .s5 + cp a, 4 + jr c, .s4 + cp a, 5 + jr c, .s3 + cp a, 6 + jr c, .s2 + cp a, 7 + jr c, .s1 + jr .s0 +.max6 + ld a, [hCurrentLockDelayRemaining] + cp a, 1 + ret c + cp a, 2 + jr c, .s5 + cp a, 3 + jr c, .s3 + cp a, 4 + jr c, .s2 + cp a, 5 + jr c, .s1 + jr .s0 +.max4 + ld a, [hCurrentLockDelayRemaining] + cp a, 1 + ret c + cp a, 2 + jr c, .s4 + jr .s0 +.max2 + ld a, [hCurrentLockDelayRemaining] + jr .s4 +.s0 + ldh a, [hCurrentPiece] + ld b, TILE_PIECE_0 + add a, b + ldh [hWantedTile], a + ret +.s1 + ldh a, [hCurrentPiece] + ld b, TILE_PIECE_0+(2*7) + add a, b + ldh [hWantedTile], a + ret +.s2 + ldh a, [hCurrentPiece] + ld b, TILE_PIECE_0+(3*7) + add a, b + ldh [hWantedTile], a + ret +.s3 + ldh a, [hCurrentPiece] + ld b, TILE_PIECE_0+(4*7) + add a, b + ldh [hWantedTile], a + ret +.s4 + ldh a, [hCurrentPiece] + ld b, TILE_PIECE_0+(5*7) + add a, b + ldh [hWantedTile], a + ret +.s5 + ldh a, [hCurrentPiece] + ld b, TILE_PIECE_0+(6*7) + add a, b + ldh [hWantedTile], a + ret +.s6 + ldh a, [hCurrentPiece] + ld b, TILE_PIECE_0+(7*7) + add a, b + ldh [hWantedTile], a + ret + + ENDC diff --git a/src/state_gameplay.asm b/src/state_gameplay.asm index f504748..15478b2 100644 --- a/src/state_gameplay.asm +++ b/src/state_gameplay.asm @@ -248,7 +248,7 @@ pieceInMotionMode: ld [wMode], a ; Do we go into delay state? - ldh a, [hCurrentLockDelayRemaining] +: ldh a, [hCurrentLockDelayRemaining] cp a, 0 jr nz, :+ ld a, MODE_DELAY diff --git a/tools/Emulicious.ini b/tools/Emulicious.ini index c3cba31..419ce03 100644 --- a/tools/Emulicious.ini +++ b/tools/Emulicious.ini @@ -1,5 +1,5 @@ #Emulicious settings file -#Fri Oct 20 11:45:02 CEST 2023 +#Fri Oct 20 12:46:32 CEST 2023 WindowEventViewerWindowHeight=1416 WindowEventViewerWindowDivider=876 WindowMemoryTracerWindowY=631 @@ -199,8 +199,8 @@ GameBoyErrorBreakpointMessage32= InterruptBreakpointCondition= Recent0=C\:\\workspace\\dmgtris\\bin\\out.gb GameBoyErrorBreakpointMessage20= -WindowEmuliciousY=422 -WindowEmuliciousX=89 +WindowEmuliciousY=302 +WindowEmuliciousX=153 GameBoyErrorBreakpointEnabled9=false GameBoyErrorBreakpointEnabled8=false GameBoyErrorBreakpointEnabled7=false diff --git a/tools/GBTD/gbtd.ini b/tools/GBTD/gbtd.ini index e64c41a..cd26ee0 100644 --- a/tools/GBTD/gbtd.ini +++ b/tools/GBTD/gbtd.ini @@ -1,5 +1,5 @@ [General] -GBRPath=c:\workspace\dmgtris\src\res\sources\ +GBRPath=C:\workspace\dmgtris\src\res\sources\ [Recently used files] F0=c:\workspace\dmgtris\src\res\sources\tiles.gbr F1=c:\workspace\dmgtris\src\res\tiles.gbr diff --git a/tools/projects/out.exp b/tools/projects/out.exp index 7f01b12..f8d0ae4 100644 --- a/tools/projects/out.exp +++ b/tools/projects/out.exp @@ -8,3 +8,4 @@ hPieceDataBase 2 Hexadecimal hPieceDataOffset 1 Hexadecimal hCurrentPiece 1 Hexadecimal hCurrentPieceY 1 Hexadecimal +hUpState 1 Hexadecimal