Improve gameplay sequencing.
This commit is contained in:
parent
6474d431a4
commit
9b347b9e76
302
src/field.asm
302
src/field.asm
|
@ -53,6 +53,7 @@ hComboCt: ds 1
|
||||||
hLockDelayForce: ds 1
|
hLockDelayForce: ds 1
|
||||||
hHighestStack: ds 1
|
hHighestStack: ds 1
|
||||||
hDownFrames: ds 1
|
hDownFrames: ds 1
|
||||||
|
hStalePiece: ds 1
|
||||||
|
|
||||||
|
|
||||||
SECTION "Field Functions", ROM0
|
SECTION "Field Functions", ROM0
|
||||||
|
@ -502,6 +503,7 @@ ForceSpawnPiece::
|
||||||
TrySpawnPiece::
|
TrySpawnPiece::
|
||||||
; Always reset these for a new piece.
|
; Always reset these for a new piece.
|
||||||
xor a, a
|
xor a, a
|
||||||
|
ldh [hStalePiece], a
|
||||||
ldh [hDownFrames], a
|
ldh [hDownFrames], a
|
||||||
ldh [hLockDelayForce], a
|
ldh [hLockDelayForce], a
|
||||||
ldh a, [hCurrentLockDelay]
|
ldh a, [hCurrentLockDelay]
|
||||||
|
@ -660,7 +662,7 @@ FindMaxG:
|
||||||
ldh a, [hCurrentPieceX]
|
ldh a, [hCurrentPieceX]
|
||||||
call XYToSFieldPtr
|
call XYToSFieldPtr
|
||||||
|
|
||||||
DEF EXPERIMENTAL_OPTIMIZATION EQU 1
|
;DEF EXPERIMENTAL_OPTIMIZATION EQU 1
|
||||||
IF DEF(EXPERIMENTAL_OPTIMIZATION)
|
IF DEF(EXPERIMENTAL_OPTIMIZATION)
|
||||||
; The stack height marker gives a lower bound to how far the piece can fall.
|
; The stack height marker gives a lower bound to how far the piece can fall.
|
||||||
ldh a, [hHighestStack]
|
ldh a, [hHighestStack]
|
||||||
|
@ -686,7 +688,6 @@ IF DEF(EXPERIMENTAL_OPTIMIZATION)
|
||||||
jr .try
|
jr .try
|
||||||
ENDC
|
ENDC
|
||||||
|
|
||||||
|
|
||||||
.unoptimized
|
.unoptimized
|
||||||
push hl
|
push hl
|
||||||
ld a, 1
|
ld a, 1
|
||||||
|
@ -723,128 +724,30 @@ FieldProcess::
|
||||||
ldh [hYPosAtStartOfFrame], a
|
ldh [hYPosAtStartOfFrame], a
|
||||||
call FromShadowField
|
call FromShadowField
|
||||||
|
|
||||||
|
; Cleanup from last frame.
|
||||||
; Check if we're about to hold. Return if so.
|
|
||||||
ldh a, [hSelectState]
|
|
||||||
cp a, 1
|
|
||||||
jr nz, :+
|
|
||||||
ldh a, [hHoldSpent]
|
|
||||||
cp a, $FF
|
|
||||||
ret nz
|
|
||||||
|
|
||||||
; How deep can we go?
|
|
||||||
: call FindMaxG
|
|
||||||
|
|
||||||
|
|
||||||
; **************************************************************
|
|
||||||
; HANDLE UP
|
|
||||||
; Is a hard/sonic drop requested?
|
|
||||||
ldh a, [hUpState]
|
|
||||||
cp a, 1
|
|
||||||
jr nz, .postdrop
|
|
||||||
|
|
||||||
; What kind, if any?
|
|
||||||
ldh a, [hSimulationMode]
|
|
||||||
cp a, MODE_TGM1
|
|
||||||
jr z, .postdrop
|
|
||||||
cp a, MODE_HELL
|
|
||||||
jr z, .postdrop
|
|
||||||
cp a, MODE_TGW2
|
|
||||||
jr z, .harddrop
|
|
||||||
cp a, MODE_TGW3
|
|
||||||
jr z, .harddrop
|
|
||||||
cp a, MODE_EAWY
|
|
||||||
jr z, .harddrop
|
|
||||||
|
|
||||||
; Sonic drop.
|
|
||||||
.sonicdrop
|
|
||||||
ldh a, [hDownFrames]
|
|
||||||
add a, 10
|
|
||||||
ldh [hDownFrames], a
|
|
||||||
ld a, 20
|
|
||||||
ldh [hWantedG], a
|
|
||||||
ldh a, [hTicksUntilG]
|
|
||||||
dec a
|
|
||||||
ldh [hTicksUntilG], a
|
|
||||||
jr nz, .grav
|
|
||||||
ldh a, [hCurrentFramesPerGravityTick]
|
|
||||||
ldh [hTicksUntilG], a
|
|
||||||
jr .grav
|
|
||||||
|
|
||||||
; Hard drop.
|
|
||||||
.harddrop
|
|
||||||
ldh a, [hDownFrames]
|
|
||||||
add a, 10
|
|
||||||
ldh [hDownFrames], a
|
|
||||||
ld a, 20
|
|
||||||
ld b, a
|
|
||||||
ldh a, [hActualG]
|
|
||||||
cp a, b
|
|
||||||
jr nc, :+
|
|
||||||
ld b, a
|
|
||||||
: ldh a, [hCurrentPieceY]
|
|
||||||
add a, b
|
|
||||||
ldh [hCurrentPieceY], a
|
|
||||||
xor a, a
|
|
||||||
ldh [hCurrentLockDelayRemaining], a
|
|
||||||
call SFXKill
|
|
||||||
ld a, SFX_LOCK
|
|
||||||
call SFXEnqueue
|
|
||||||
jp .draw
|
|
||||||
|
|
||||||
; If we press down, we want to do a soft drop.
|
|
||||||
.postdrop
|
|
||||||
ldh a, [hDownState]
|
|
||||||
cp a, 0
|
|
||||||
jr z, :+
|
|
||||||
ldh a, [hDownFrames]
|
|
||||||
inc a
|
|
||||||
ldh [hDownFrames], a
|
|
||||||
ld a, 1
|
|
||||||
ldh [hTicksUntilG], a
|
|
||||||
|
|
||||||
; Gravity?
|
|
||||||
: ldh a, [hTicksUntilG]
|
|
||||||
dec a
|
|
||||||
ldh [hTicksUntilG], a
|
|
||||||
jr nz, .nograv
|
|
||||||
ldh a, [hCurrentFramesPerGravityTick]
|
|
||||||
ldh [hTicksUntilG], a
|
|
||||||
ldh a, [hCurrentGravityPerTick]
|
|
||||||
ldh [hWantedG], a
|
|
||||||
|
|
||||||
; Can we drop the full requested distance?
|
|
||||||
.grav
|
|
||||||
ldh a, [hWantedG]
|
|
||||||
ld b, a
|
|
||||||
ldh a, [hActualG]
|
|
||||||
cp a, b
|
|
||||||
jr c, .smallg
|
|
||||||
|
|
||||||
; Yes. Do it.
|
|
||||||
.bigg
|
|
||||||
ldh a, [hWantedG]
|
|
||||||
ld b, a
|
|
||||||
ldh a, [hCurrentPieceY]
|
|
||||||
add a, b
|
|
||||||
ldh [hCurrentPieceY], a
|
|
||||||
jr .nograv
|
|
||||||
|
|
||||||
; No. Smaller distance.
|
|
||||||
.smallg
|
|
||||||
ldh a, [hActualG]
|
|
||||||
ld b, a
|
|
||||||
ldh a, [hCurrentPieceY]
|
|
||||||
add a, b
|
|
||||||
ldh [hCurrentPieceY], a
|
|
||||||
|
|
||||||
; No gravity, or post gravity.
|
|
||||||
.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
|
||||||
|
|
||||||
|
; Is this the first frame of the piece?
|
||||||
|
ldh a, [hStalePiece]
|
||||||
|
cp a, 0
|
||||||
|
ld a, $FF
|
||||||
|
ldh [hStalePiece], a
|
||||||
|
jp z, .skipmovement
|
||||||
|
|
||||||
|
|
||||||
|
; **************************************************************
|
||||||
|
; HANDLE SELECT
|
||||||
|
; Check if we're about to hold. Return if so.
|
||||||
|
ldh a, [hSelectState]
|
||||||
|
cp a, 1
|
||||||
|
jr nz, .wantrotccw
|
||||||
|
ldh a, [hHoldSpent]
|
||||||
|
cp a, $FF
|
||||||
|
ret nz
|
||||||
|
|
||||||
|
|
||||||
; **************************************************************
|
; **************************************************************
|
||||||
; HANDLE ROTATION
|
; HANDLE ROTATION
|
||||||
|
@ -1232,10 +1135,122 @@ FieldProcess::
|
||||||
ldh [hCurrentPieceX], a
|
ldh [hCurrentPieceX], a
|
||||||
|
|
||||||
|
|
||||||
|
; **************************************************************
|
||||||
|
; HANDLE MAXIMUM FALL
|
||||||
|
; This little maneuver is going to cost us 51 years.
|
||||||
|
.skipmovement
|
||||||
|
.donemanipulating
|
||||||
|
: call FindMaxG
|
||||||
|
|
||||||
|
|
||||||
|
; **************************************************************
|
||||||
|
; HANDLE UP
|
||||||
|
; Is a hard/sonic drop requested?
|
||||||
|
ldh a, [hUpState]
|
||||||
|
cp a, 0
|
||||||
|
jr z, .postdrop
|
||||||
|
|
||||||
|
; What kind, if any?
|
||||||
|
ldh a, [hSimulationMode]
|
||||||
|
cp a, MODE_TGM1
|
||||||
|
jr z, .postdrop
|
||||||
|
cp a, MODE_HELL
|
||||||
|
jr z, .postdrop
|
||||||
|
cp a, MODE_TGW2
|
||||||
|
jr z, .harddrop
|
||||||
|
cp a, MODE_TGW3
|
||||||
|
jr z, .harddrop
|
||||||
|
cp a, MODE_EAWY
|
||||||
|
jr z, .harddrop
|
||||||
|
|
||||||
|
; Sonic drop.
|
||||||
|
.sonicdrop
|
||||||
|
ldh a, [hDownFrames]
|
||||||
|
add a, 10
|
||||||
|
ldh [hDownFrames], a
|
||||||
|
ld a, 20
|
||||||
|
ldh [hWantedG], a
|
||||||
|
ldh a, [hTicksUntilG]
|
||||||
|
dec a
|
||||||
|
ldh [hTicksUntilG], a
|
||||||
|
jr nz, .grav
|
||||||
|
ldh a, [hCurrentFramesPerGravityTick]
|
||||||
|
ldh [hTicksUntilG], a
|
||||||
|
jr .grav
|
||||||
|
|
||||||
|
; Hard drop.
|
||||||
|
.harddrop
|
||||||
|
ldh a, [hDownFrames]
|
||||||
|
add a, 10
|
||||||
|
ldh [hDownFrames], a
|
||||||
|
ld a, 20
|
||||||
|
ld b, a
|
||||||
|
ldh a, [hActualG]
|
||||||
|
cp a, b
|
||||||
|
jr nc, :+
|
||||||
|
ld b, a
|
||||||
|
: ldh a, [hCurrentPieceY]
|
||||||
|
add a, b
|
||||||
|
ldh [hCurrentPieceY], a
|
||||||
|
xor a, a
|
||||||
|
ldh [hCurrentLockDelayRemaining], a
|
||||||
|
call SFXKill
|
||||||
|
ld a, SFX_LOCK
|
||||||
|
call SFXEnqueue
|
||||||
|
jp .draw
|
||||||
|
|
||||||
|
; If we press down, we want to do a soft drop.
|
||||||
|
.postdrop
|
||||||
|
ldh a, [hDownState]
|
||||||
|
cp a, 0
|
||||||
|
jr z, :+
|
||||||
|
ldh a, [hDownFrames]
|
||||||
|
inc a
|
||||||
|
ldh [hDownFrames], a
|
||||||
|
ld a, 1
|
||||||
|
ldh [hTicksUntilG], a
|
||||||
|
|
||||||
|
; Gravity?
|
||||||
|
: ldh a, [hTicksUntilG]
|
||||||
|
dec a
|
||||||
|
ldh [hTicksUntilG], a
|
||||||
|
jr nz, .nograv
|
||||||
|
ldh a, [hCurrentFramesPerGravityTick]
|
||||||
|
ldh [hTicksUntilG], a
|
||||||
|
ldh a, [hCurrentGravityPerTick]
|
||||||
|
ldh [hWantedG], a
|
||||||
|
|
||||||
|
; Can we drop the full requested distance?
|
||||||
|
.grav
|
||||||
|
ldh a, [hWantedG]
|
||||||
|
ld b, a
|
||||||
|
ldh a, [hActualG]
|
||||||
|
cp a, b
|
||||||
|
jr c, .smallg
|
||||||
|
|
||||||
|
; Yes. Do it.
|
||||||
|
.bigg
|
||||||
|
ldh a, [hWantedG]
|
||||||
|
ld b, a
|
||||||
|
ldh a, [hCurrentPieceY]
|
||||||
|
add a, b
|
||||||
|
ldh [hCurrentPieceY], a
|
||||||
|
jr .postgrav
|
||||||
|
|
||||||
|
; No. Smaller distance.
|
||||||
|
.smallg
|
||||||
|
ldh a, [hActualG]
|
||||||
|
ld b, a
|
||||||
|
ldh a, [hCurrentPieceY]
|
||||||
|
add a, b
|
||||||
|
ldh [hCurrentPieceY], a
|
||||||
|
|
||||||
|
|
||||||
; **************************************************************
|
; **************************************************************
|
||||||
; HANDLE LOCKING
|
; HANDLE LOCKING
|
||||||
; Are we grounded?
|
; Are we grounded?
|
||||||
.donemanipulating
|
.postgrav
|
||||||
|
.nograv
|
||||||
ldh a, [hCurrentPieceY]
|
ldh a, [hCurrentPieceY]
|
||||||
inc a
|
inc a
|
||||||
ld b, a
|
ld b, a
|
||||||
|
@ -1249,42 +1264,57 @@ FieldProcess::
|
||||||
jr z, .notgrounded
|
jr z, .notgrounded
|
||||||
|
|
||||||
; We're grounded.
|
; We're grounded.
|
||||||
; If the y position changed, play a sound.
|
.grounded
|
||||||
ldh a, [hCurrentPieceY]
|
ldh a, [hCurrentPieceY]
|
||||||
ld b, a
|
ld b, a
|
||||||
ldh a, [hYPosAtStartOfFrame]
|
ldh a, [hYPosAtStartOfFrame]
|
||||||
cp a, b
|
cp a, b
|
||||||
jr z, :+
|
jr z, .postcheckforfirmdropsound ; Never play the sound if we didn't change rows.
|
||||||
ldh a, [hDownState]
|
ldh a, [hDownState]
|
||||||
cp a, 0
|
cp a, 0
|
||||||
jr nz, :+
|
jr nz, .postcheckforfirmdropsound ; Don't play the sound if we're holding down.
|
||||||
|
|
||||||
|
; Play the firm drop sound.
|
||||||
|
.playfirmdropsound
|
||||||
call SFXKill
|
call SFXKill
|
||||||
ld a, SFX_MOVE
|
ld a, SFX_MOVE
|
||||||
call SFXEnqueue
|
call SFXEnqueue
|
||||||
|
|
||||||
; If the down button is held, lock.
|
; If the down button is held, lock.
|
||||||
: ldh a, [hDownState]
|
.postcheckforfirmdropsound
|
||||||
|
ldh a, [hDownState]
|
||||||
cp a, 0
|
cp a, 0
|
||||||
jr z, :+
|
jr z, .dontforcelock
|
||||||
ld a, 1
|
|
||||||
|
; Set the lock delay to 0 and save it.
|
||||||
|
.forcelock
|
||||||
|
ld a, 0
|
||||||
ldh [hCurrentLockDelayRemaining], a
|
ldh [hCurrentLockDelayRemaining], a
|
||||||
: ldh a, [hCurrentLockDelayRemaining]
|
jr .checklockdelay
|
||||||
|
|
||||||
|
; Load the lock delay.
|
||||||
|
; Decrement it by one and save it.
|
||||||
|
.dontforcelock
|
||||||
|
ldh a, [hCurrentLockDelayRemaining]
|
||||||
dec a
|
dec a
|
||||||
ldh [hCurrentLockDelayRemaining], a
|
ldh [hCurrentLockDelayRemaining], a
|
||||||
; If we're out of lock delay, play a sound.
|
|
||||||
|
; Are we out of lock delay?
|
||||||
|
.checklockdelay
|
||||||
cp a, 0
|
cp a, 0
|
||||||
jr nz, .forcelockmaybe
|
jr nz, .checkfortgm3lockexception ; If not, check if the TGM3 exception applies.
|
||||||
call SFXKill
|
jr .dolock ; Otherwise, lock!
|
||||||
ld a, SFX_LOCK
|
|
||||||
call SFXEnqueue
|
|
||||||
jr .draw
|
|
||||||
|
|
||||||
; TGM3 sometimes forces a piece to immediately lock.
|
; TGM3 sometimes forces a piece to immediately lock.
|
||||||
.forcelockmaybe
|
.checkfortgm3lockexception
|
||||||
ldh a, [hLockDelayForce]
|
ldh a, [hLockDelayForce]
|
||||||
cp a, $FF
|
cp a, $FF
|
||||||
jr nz, .draw
|
jr nz, .draw ; It's not forced, so go to drawing.
|
||||||
xor a, a
|
xor a, a ; It is forced, so force it!
|
||||||
ldh [hCurrentLockDelayRemaining], a
|
ldh [hCurrentLockDelayRemaining], a
|
||||||
|
|
||||||
|
; Play the locking sound and draw the piece.
|
||||||
|
.dolock
|
||||||
call SFXKill
|
call SFXKill
|
||||||
ld a, SFX_LOCK
|
ld a, SFX_LOCK
|
||||||
call SFXEnqueue
|
call SFXEnqueue
|
||||||
|
|
Loading…
Reference in New Issue