Sonic drop and hold.
This commit is contained in:
parent
0f2e811130
commit
61ef24a9e8
122
src/field.asm
122
src/field.asm
|
@ -501,20 +501,40 @@ FieldProcess::
|
||||||
pop de
|
pop de
|
||||||
call DrawPiece
|
call DrawPiece
|
||||||
|
|
||||||
|
|
||||||
|
; Check if we're about to hold.
|
||||||
|
ld a, [hSelectState]
|
||||||
|
cp a, 1
|
||||||
|
jr nz, :+
|
||||||
|
ld a, [hHoldSpent]
|
||||||
|
cp a, $FF
|
||||||
|
ret nz
|
||||||
|
|
||||||
|
|
||||||
|
; If we press up, we want to do a sonic drop.
|
||||||
|
ldh a, [hUpState]
|
||||||
|
cp a, 1
|
||||||
|
jr nz, :+
|
||||||
|
ld b, 20
|
||||||
|
jr .grav
|
||||||
|
|
||||||
|
|
||||||
; Gravity?
|
; Gravity?
|
||||||
ldh a, [hTicksUntilG]
|
: ldh a, [hTicksUntilG]
|
||||||
dec a
|
dec a
|
||||||
ldh [hTicksUntilG], a
|
ldh [hTicksUntilG], a
|
||||||
jr nz, .nograv
|
jr nz, .nograv
|
||||||
ldh a, [hCurrentFramesPerGravityTick]
|
ldh a, [hCurrentFramesPerGravityTick]
|
||||||
ldh [hTicksUntilG], a
|
ldh [hTicksUntilG], a
|
||||||
|
|
||||||
|
|
||||||
; Move the piece down, but first check if there's still sufficient "down" to go.
|
; Move the piece down, but first check if there's still sufficient "down" to go.
|
||||||
ldh a, [hCurrentGravityPerTick]
|
ldh a, [hCurrentGravityPerTick]
|
||||||
ld b, a
|
ld b, a
|
||||||
|
.grav
|
||||||
: ldh a, [hCurrentPieceY]
|
: ldh a, [hCurrentPieceY]
|
||||||
add a, b
|
add a, b
|
||||||
cp a, 22
|
cp a, 23
|
||||||
jr c, :+
|
jr c, :+
|
||||||
dec b
|
dec b
|
||||||
jr z, .nograv
|
jr z, .nograv
|
||||||
|
@ -536,18 +556,21 @@ FieldProcess::
|
||||||
jr z, .nograv
|
jr z, .nograv
|
||||||
jr :-
|
jr :-
|
||||||
|
|
||||||
|
|
||||||
.dolower
|
.dolower
|
||||||
pop bc
|
pop bc
|
||||||
ldh a, [hCurrentPieceY]
|
ldh a, [hCurrentPieceY]
|
||||||
add a, b
|
add a, b
|
||||||
ldh [hCurrentPieceY], a
|
ldh [hCurrentPieceY], a
|
||||||
|
|
||||||
|
|
||||||
.nograv
|
.nograv
|
||||||
ldh a, [hCurrentPieceX]
|
ldh a, [hCurrentPieceX]
|
||||||
ldh [hWantX], a
|
ldh [hWantX], a
|
||||||
ldh a, [hCurrentPieceRotationState]
|
ldh a, [hCurrentPieceRotationState]
|
||||||
ldh [hWantRotation], a
|
ldh [hWantRotation], a
|
||||||
|
|
||||||
|
|
||||||
; Want left?
|
; Want left?
|
||||||
.wantleft
|
.wantleft
|
||||||
ldh a, [hLeftState]
|
ldh a, [hLeftState]
|
||||||
|
@ -563,6 +586,7 @@ FieldProcess::
|
||||||
dec a
|
dec a
|
||||||
ldh [hWantX], a
|
ldh [hWantX], a
|
||||||
|
|
||||||
|
|
||||||
; Want right?
|
; Want right?
|
||||||
.wantright
|
.wantright
|
||||||
ldh a, [hRightState]
|
ldh a, [hRightState]
|
||||||
|
@ -611,7 +635,7 @@ FieldProcess::
|
||||||
ld b, a
|
ld b, a
|
||||||
ldh a, [hCurrentPieceX]
|
ldh a, [hCurrentPieceX]
|
||||||
cp a, b
|
cp a, b
|
||||||
jr z, .postmove ; Neither move nor rotate.
|
jp z, .postmove ; Neither move nor rotate.
|
||||||
|
|
||||||
; Move only.
|
; Move only.
|
||||||
ldh a, [hCurrentPieceY]
|
ldh a, [hCurrentPieceY]
|
||||||
|
@ -623,10 +647,11 @@ FieldProcess::
|
||||||
call GetPieceData
|
call GetPieceData
|
||||||
call CanPieceFit
|
call CanPieceFit
|
||||||
cp a, $FF
|
cp a, $FF
|
||||||
jr nz, .postmove
|
jp nz, .postmove
|
||||||
ldh a, [hWantX]
|
ldh a, [hWantX]
|
||||||
ldh [hCurrentPieceX], a
|
ldh [hCurrentPieceX], a
|
||||||
jr .postmove
|
jp .postmove
|
||||||
|
|
||||||
|
|
||||||
.trymoverot
|
.trymoverot
|
||||||
ldh a, [hCurrentPieceY]
|
ldh a, [hCurrentPieceY]
|
||||||
|
@ -650,8 +675,95 @@ FieldProcess::
|
||||||
pop bc
|
pop bc
|
||||||
call CanPieceFit
|
call CanPieceFit
|
||||||
cp a, $FF
|
cp a, $FF
|
||||||
|
jr nz, .maybekick
|
||||||
|
ldh a, [hWantX]
|
||||||
|
ldh [hCurrentPieceX], a
|
||||||
|
ldh a, [hWantRotation]
|
||||||
|
ldh [hCurrentPieceRotationState], a
|
||||||
|
call SetPieceDataOffset
|
||||||
|
jp .postmove
|
||||||
|
|
||||||
|
|
||||||
|
; Try kicks if the piece isn't I or O. And in the case of J L and T, only if the blocked side is the left or right.
|
||||||
|
.maybekick
|
||||||
|
ld c, a
|
||||||
|
ldh a, [hCurrentPiece]
|
||||||
|
cp a, PIECE_I
|
||||||
|
jr z, .postmove
|
||||||
|
cp a, PIECE_O
|
||||||
|
jr z, .postmove
|
||||||
|
cp a, PIECE_S
|
||||||
|
jr z, .trykickright
|
||||||
|
cp a, PIECE_Z
|
||||||
|
jr z, .trykickright
|
||||||
|
ld a, c
|
||||||
|
cp a, 1
|
||||||
|
jr z, .postmove
|
||||||
|
cp a, 5
|
||||||
|
jr z, .postmove
|
||||||
|
cp a, 9
|
||||||
|
jr z, .postmove
|
||||||
|
|
||||||
|
|
||||||
|
.trykickright
|
||||||
|
ldh a, [hCurrentPieceY]
|
||||||
|
ld b, a
|
||||||
|
ldh a, [hWantX]
|
||||||
|
inc a
|
||||||
|
call XYToSFieldPtr
|
||||||
|
ld d, h
|
||||||
|
ld e, l
|
||||||
|
ldh a, [hPieceDataBase]
|
||||||
|
ld l, a
|
||||||
|
ldh a, [hPieceDataBase+1]
|
||||||
|
ld h, a
|
||||||
|
ldh a, [hWantRotation]
|
||||||
|
rlc a
|
||||||
|
rlc a
|
||||||
|
push bc
|
||||||
|
ld c, a
|
||||||
|
xor a, a
|
||||||
|
ld b, a
|
||||||
|
add hl, bc
|
||||||
|
pop bc
|
||||||
|
call CanPieceFit
|
||||||
|
cp a, $FF
|
||||||
|
jr nz, .trykickleft
|
||||||
|
ldh a, [hWantX]
|
||||||
|
inc a
|
||||||
|
ldh [hCurrentPieceX], a
|
||||||
|
ldh a, [hWantRotation]
|
||||||
|
ldh [hCurrentPieceRotationState], a
|
||||||
|
call SetPieceDataOffset
|
||||||
|
jr .postmove
|
||||||
|
|
||||||
|
|
||||||
|
.trykickleft
|
||||||
|
ldh a, [hCurrentPieceY]
|
||||||
|
ld b, a
|
||||||
|
ldh a, [hWantX]
|
||||||
|
dec a
|
||||||
|
call XYToSFieldPtr
|
||||||
|
ld d, h
|
||||||
|
ld e, l
|
||||||
|
ldh a, [hPieceDataBase]
|
||||||
|
ld l, a
|
||||||
|
ldh a, [hPieceDataBase+1]
|
||||||
|
ld h, a
|
||||||
|
ldh a, [hWantRotation]
|
||||||
|
rlc a
|
||||||
|
rlc a
|
||||||
|
push bc
|
||||||
|
ld c, a
|
||||||
|
xor a, a
|
||||||
|
ld b, a
|
||||||
|
add hl, bc
|
||||||
|
pop bc
|
||||||
|
call CanPieceFit
|
||||||
|
cp a, $FF
|
||||||
jr nz, .postmove
|
jr nz, .postmove
|
||||||
ldh a, [hWantX]
|
ldh a, [hWantX]
|
||||||
|
dec a
|
||||||
ldh [hCurrentPieceX], a
|
ldh [hCurrentPieceX], a
|
||||||
ldh a, [hWantRotation]
|
ldh a, [hWantRotation]
|
||||||
ldh [hCurrentPieceRotationState], a
|
ldh [hCurrentPieceRotationState], a
|
||||||
|
|
|
@ -25,7 +25,7 @@ hCurrentPieceX:: ds 1
|
||||||
hCurrentPieceY:: ds 1
|
hCurrentPieceY:: ds 1
|
||||||
hCurrentPieceRotationState:: ds 1
|
hCurrentPieceRotationState:: ds 1
|
||||||
hHeldPiece: ds 1
|
hHeldPiece: ds 1
|
||||||
hHoldSpent: ds 1
|
hHoldSpent:: ds 1
|
||||||
hSkipJingle: ds 1
|
hSkipJingle: ds 1
|
||||||
|
|
||||||
|
|
||||||
|
@ -227,7 +227,31 @@ spawnPieceMode:
|
||||||
; Field will let us know when it has locked in place.
|
; Field will let us know when it has locked in place.
|
||||||
pieceInMotionMode:
|
pieceInMotionMode:
|
||||||
call FieldProcess
|
call FieldProcess
|
||||||
jr drawStaticInfo
|
|
||||||
|
; Do we hold?
|
||||||
|
ld a, [hSelectState]
|
||||||
|
cp a, 1
|
||||||
|
jr nz, :+
|
||||||
|
ld a, [hHoldSpent]
|
||||||
|
cp a, $FF
|
||||||
|
jr z, :+
|
||||||
|
; Reset position and rotation.
|
||||||
|
ld a, 5
|
||||||
|
ldh [hCurrentPieceX], a
|
||||||
|
ld a, 3
|
||||||
|
ldh [hCurrentPieceY], a
|
||||||
|
xor a, a
|
||||||
|
ldh [hSkipJingle], a
|
||||||
|
ldh [hCurrentPieceRotationState], a
|
||||||
|
call DoHold
|
||||||
|
ld a, MODE_SPAWN_PIECE
|
||||||
|
ld [wMode], a
|
||||||
|
|
||||||
|
; Do we go into delay state?
|
||||||
|
; TODO
|
||||||
|
|
||||||
|
|
||||||
|
: jr drawStaticInfo
|
||||||
|
|
||||||
|
|
||||||
delayMode:
|
delayMode:
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#Emulicious settings file
|
#Emulicious settings file
|
||||||
#Fri Oct 20 08:16:53 CEST 2023
|
#Fri Oct 20 08:40:06 CEST 2023
|
||||||
WindowEventViewerWindowHeight=1416
|
WindowEventViewerWindowHeight=1416
|
||||||
WindowEventViewerWindowDivider=876
|
WindowEventViewerWindowDivider=876
|
||||||
WindowMemoryTracerWindowY=631
|
WindowMemoryTracerWindowY=631
|
||||||
|
|
Loading…
Reference in New Issue