396 lines
9.5 KiB
PHP
396 lines
9.5 KiB
PHP
|
; screen variables already ddefined in screencardread
|
||
|
;DEF vPreviousCardIndex EQU VARIABLES_START
|
||
|
;def vBlocked equ vPreviousCardIndex + 1
|
||
|
def vAnimationFrame EQU VARIABLES_START
|
||
|
def vAnimationState EQU vAnimationFrame+1
|
||
|
def vCurrentAnimation EQU vAnimationState+1 ; 2 bytes
|
||
|
def vShuffleIndex equ vCurrentAnimation+2
|
||
|
def vShuffleTime equ vShuffleIndex+1 ; 2 bytes
|
||
|
|
||
|
ScreenShuffle:
|
||
|
dw ShuffleSetup
|
||
|
dw ShuffleUpdate
|
||
|
dw ShuffleDraw
|
||
|
dw ShuffleTeardown
|
||
|
|
||
|
ShuffleSetup:
|
||
|
ld hl, SHUFFLED_DECK
|
||
|
ld a, [hl]
|
||
|
dec a
|
||
|
ldh [vShuffleIndex], a
|
||
|
|
||
|
ld a, 0
|
||
|
ldh [vAnimationFrame], a
|
||
|
ldh [vAnimationState], a
|
||
|
ld a, LOW(ShuffleAnimationRight)
|
||
|
ldh [vCurrentAnimation], a
|
||
|
ld a, HIGH(ShuffleAnimationRight)
|
||
|
ldh [vCurrentAnimation+1], a
|
||
|
|
||
|
ld a, LOW(RunDMA) ; zero out the OAM
|
||
|
ld [vAsyncNext], a
|
||
|
ld a, HIGH(RunDMA)
|
||
|
ld [vAsyncNext+1], a
|
||
|
ld a, LOW(.loadUIMap)
|
||
|
ld [vAsyncAfter], a
|
||
|
ld a, HIGH(.loadUIMap)
|
||
|
ld [vAsyncAfter+1], a
|
||
|
|
||
|
ld a, HIGH(ZEROES)
|
||
|
ld de, vMenuIndexPrevious+2 ; arguments to the first async call.
|
||
|
|
||
|
call DoInAsyncVBlank
|
||
|
|
||
|
ld hl, ZEROES ; hl is source
|
||
|
ld de, $c000 ; de is destination
|
||
|
ld bc, $100 ; length to copy
|
||
|
call CopyRangeUnsafe
|
||
|
|
||
|
ret
|
||
|
|
||
|
.loadUIMap
|
||
|
|
||
|
ld hl, Shuffle.UITilemap ; origin
|
||
|
ld de, $9800 ; destination
|
||
|
ld b, 18 ; height
|
||
|
ld c, 20 ; width
|
||
|
|
||
|
ld a, LOW(CopyTilesToMapThreadsafe)
|
||
|
ld [vAsyncNext], a
|
||
|
ld a, HIGH(CopyTilesToMapThreadsafe)
|
||
|
ld [vAsyncNext+1], a
|
||
|
|
||
|
ld a, LOW(.loadTiles)
|
||
|
ld [vAsyncAfter], a
|
||
|
ld a, HIGH(.loadTiles)
|
||
|
ld [vAsyncAfter+1], a
|
||
|
ret
|
||
|
.loadTiles
|
||
|
ld hl, Shuffle.UITileData
|
||
|
ld de, $9000 + VARIABLE_TILES_START*16
|
||
|
ld bc, Shuffle.UITileDataEnd - Shuffle.UITileData
|
||
|
|
||
|
ld a, LOW(CopyRangeUnsafe)
|
||
|
ldh [vAsyncNext], a
|
||
|
ld a, HIGH(CopyRangeUnsafe)
|
||
|
ldh [vAsyncNext+1], a
|
||
|
|
||
|
ld a, LOW(.drawBigCard)
|
||
|
ld [vAsyncAfter], a
|
||
|
ld a, HIGH(.drawBigCard)
|
||
|
ld [vAsyncAfter+1], a
|
||
|
ret
|
||
|
.drawBigCard
|
||
|
ld hl, $9800 + $20*5 + 8
|
||
|
ld a, VARIABLE_TILES_START
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
ld b, 0
|
||
|
ld c, 32 - 4
|
||
|
add hl, bc
|
||
|
|
||
|
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
add hl, bc
|
||
|
sub a, 2
|
||
|
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
add hl, bc
|
||
|
sub a, 2
|
||
|
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
add hl, bc
|
||
|
sub a, 2
|
||
|
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
add hl, bc
|
||
|
sub a, 2
|
||
|
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
add hl, bc
|
||
|
sub a, 2
|
||
|
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
add hl, bc
|
||
|
inc a
|
||
|
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
ld [hl+], a
|
||
|
inc a
|
||
|
ld [hl+], a
|
||
|
ret
|
||
|
|
||
|
ShuffleUpdate:
|
||
|
ld hl, vShuffleTime
|
||
|
ldh a, [rDELTAT]
|
||
|
ld b, a
|
||
|
ld a, [hl]
|
||
|
add a, b
|
||
|
ld [hl+], a ; inc hl to get high byte
|
||
|
ld a, [hl]
|
||
|
adc a, 0
|
||
|
ld [hl], a ; this is addinig rDELTAT to vShuffleTime so we can use it for
|
||
|
; seeding the rng
|
||
|
|
||
|
|
||
|
ld hl, vTime
|
||
|
ldh a, [rDELTAT]
|
||
|
ld b, a
|
||
|
ld a, [hl]
|
||
|
add a, b
|
||
|
ld [hl+], a ; inc hl to get high byte
|
||
|
ld a, [hl]
|
||
|
adc a, 0
|
||
|
ld [hl], a ; increment time. when the 16bit time register is greater
|
||
|
; than 4096 ($10_00) then one second has passed. so that's satisfied when
|
||
|
; vTime+1 is equal to or greater than $10
|
||
|
|
||
|
ld a, [hl]
|
||
|
cp a, $01
|
||
|
jp c, .doneTimer ; if the timer is less than $0100, skip to end
|
||
|
|
||
|
;otherwise reset the timer
|
||
|
ld a, 0
|
||
|
ld [hl-], a
|
||
|
ld [hl], a
|
||
|
|
||
|
ld hl, SquaresTiles
|
||
|
ldh a, [vFrameCountSquares]
|
||
|
inc a
|
||
|
call ArrayClampLooping
|
||
|
ldh [vFrameCountSquares], a
|
||
|
|
||
|
.doneTimer
|
||
|
|
||
|
ld hl, rMYBTNP
|
||
|
|
||
|
ld a, 0
|
||
|
cp a, [hl]
|
||
|
jr z, .noButtons
|
||
|
ldh a, [rLFSR]
|
||
|
ldh [rLFSR+1], a ; lfsr = (lfsr << 8) + (vShuffleTime & $ff)
|
||
|
ldh a, [vShuffleTime]
|
||
|
ldh [rLFSR], a
|
||
|
|
||
|
.noButtons
|
||
|
|
||
|
bit 4, [hl]
|
||
|
jp z, .doneWithB
|
||
|
ld hl, ScreenMainMenu
|
||
|
call ChangeScene
|
||
|
ret
|
||
|
.doneWithB
|
||
|
bit 0, [hl]
|
||
|
jp z, .doneWithRight
|
||
|
|
||
|
ld a, 1
|
||
|
ldh [vAnimationState], a
|
||
|
ld a, 0
|
||
|
ldh [vAnimationFrame], a
|
||
|
|
||
|
ld a, LOW(ShuffleAnimationRight)
|
||
|
ldh [vCurrentAnimation], a
|
||
|
ld a, HIGH(ShuffleAnimationRight)
|
||
|
ldh [vCurrentAnimation+1], a
|
||
|
|
||
|
call DoSomeShuffling
|
||
|
.doneWithRight
|
||
|
bit 1, [hl]
|
||
|
jp z, .doneWithLeft
|
||
|
|
||
|
ld a, 1
|
||
|
ldh [vAnimationState], a
|
||
|
ld a, 0
|
||
|
ldh [vAnimationFrame], a
|
||
|
|
||
|
ld a, LOW(ShuffleAnimationRightReturn)
|
||
|
ldh [vCurrentAnimation], a
|
||
|
ld a, HIGH(ShuffleAnimationRightReturn)
|
||
|
ldh [vCurrentAnimation+1], a
|
||
|
.doneWithLeft
|
||
|
|
||
|
;animation logic!
|
||
|
ldh a, [vCurrentAnimation]
|
||
|
ld l, a
|
||
|
ldh a, [vCurrentAnimation+1]
|
||
|
ld h, a ; fetch current animation
|
||
|
|
||
|
ldh a, [vAnimationState]
|
||
|
or a, a
|
||
|
jp z, .doneWithAnimation
|
||
|
|
||
|
ldh a, [vAnimationFrame]
|
||
|
inc a
|
||
|
cp a, [hl]
|
||
|
jp nz, .animNotDone
|
||
|
dec a
|
||
|
ldh [vAnimationFrame], a
|
||
|
ld a, 0
|
||
|
ld [vAnimationState], a
|
||
|
ldh a, [vAnimationFrame]
|
||
|
.animNotDone
|
||
|
call ArrayClampLooping
|
||
|
ldh [vAnimationFrame], a
|
||
|
|
||
|
.doneWithAnimation
|
||
|
inc hl
|
||
|
ld b, 0
|
||
|
ldh a, [vAnimationFrame]
|
||
|
ld c, a
|
||
|
add hl, bc
|
||
|
add hl, bc ; two bytes per entry
|
||
|
|
||
|
; hl points to xy offsets
|
||
|
ld a, 40+16
|
||
|
add a, [hl]
|
||
|
ld b, a
|
||
|
inc hl
|
||
|
ld a, 64+8
|
||
|
add a, [hl]
|
||
|
ld c, a
|
||
|
ld a, 32
|
||
|
ld e, a
|
||
|
ld hl, $c000
|
||
|
call DrawWholeCard
|
||
|
|
||
|
ret
|
||
|
|
||
|
ShuffleDraw:
|
||
|
; the card data is loaded asynchronously, initiated in CardReadUpdate
|
||
|
|
||
|
ld hl, SquaresTiles
|
||
|
inc hl
|
||
|
ld b, 0
|
||
|
ldh a, [vFrameCountSquares]
|
||
|
ld c, a
|
||
|
add hl, bc
|
||
|
add hl, bc
|
||
|
ld c, [hl]
|
||
|
inc hl
|
||
|
ld b, [hl]
|
||
|
ld h, b
|
||
|
ld l, c
|
||
|
ld de, $8000+$100*16 + 1*16 ; tile number $101 is the sliding background
|
||
|
ld bc, (SquaresTileset8 - SquaresTileset7) / 8
|
||
|
call CopyRangeUnsafeBy8s
|
||
|
|
||
|
ld de, vMenuIndexPrevious+2 ; safe bytes in hram for dma code to live at
|
||
|
ld a, $c0
|
||
|
call RunDMA
|
||
|
|
||
|
ret
|
||
|
|
||
|
ShuffleTeardown:
|
||
|
ret
|
||
|
|
||
|
DoSomeShuffling:
|
||
|
call OneSwap
|
||
|
call OneSwap
|
||
|
call OneSwap
|
||
|
call OneSwap
|
||
|
call OneSwap
|
||
|
call OneSwap
|
||
|
ret
|
||
|
|
||
|
OneSwap: ; shuffles once and decrements vshuffleindex
|
||
|
; vShuffleIndex holds the index of the next card to swap with something
|
||
|
ldh a, [vShuffleIndex]
|
||
|
cp a, 1
|
||
|
jp z, .zeroIndex ; if we're swapping index 1 with index 0 skip it
|
||
|
|
||
|
ld d, a
|
||
|
dec d ; this holds the highest index we could want to swap with
|
||
|
|
||
|
call RandomUnderD ; takes d as limit (inclusive)
|
||
|
ld e, a ; shuffle 2 is randint(vshuffleindex-1)
|
||
|
ld c, d ; shuffle 1 is vshuffleindex
|
||
|
ld hl, SHUFFLED_DECK
|
||
|
call SwapCards ; arguments c and e as indices to swap, hl as array in memory
|
||
|
|
||
|
ldh a, [vShuffleIndex]
|
||
|
dec a
|
||
|
ldh [vShuffleIndex], a ; decrement vshuffleindex so the next time around
|
||
|
; we do the next step of the shuffle
|
||
|
ret
|
||
|
.zeroIndex
|
||
|
ld a, [SHUFFLED_DECK]
|
||
|
dec a
|
||
|
ldh [vShuffleIndex], a
|
||
|
ret
|
||
|
|
||
|
|
||
|
ShuffleAnimationRight:
|
||
|
db 15, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15
|
||
|
ShuffleAnimationRightReturn:
|
||
|
db 15, 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1
|
||
|
|
||
|
Shuffle.UITilemap:
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
|
||
|
Shuffle.UITilemapEnd:
|
||
|
|
||
|
Shuffle.UITileData:
|
||
|
db $00,$ff,$7f,$ff,$7f,$ff,$60,$ff,$6f,$ff,$6d,$fa,$6a,$fd,$6d,$fa ; top-left
|
||
|
db $00,$ff,$ff,$ff,$ff,$ff,$00,$ff,$ff,$ff,$55,$aa,$aa,$55,$55,$aa ; top-middle
|
||
|
db $00,$ff,$fe,$ff,$fe,$ff,$06,$ff,$f6,$ff,$56,$bf,$b6,$5f,$56,$bf ; top-right
|
||
|
db $6a,$fd,$6d,$fa,$6a,$fd,$6d,$fa,$6a,$fd,$6d,$fa,$6a,$fd,$6d,$fa ; middle-left
|
||
|
db $aa,$55,$55,$aa,$aa,$55,$55,$aa,$aa,$55,$55,$aa,$aa,$55,$55,$aa ; middle-middle
|
||
|
db $b6,$5f,$56,$bf,$b6,$5f,$56,$bf,$b6,$5f,$56,$bf,$b6,$5f,$56,$bf ; middle-right
|
||
|
db $6a,$fd,$6d,$fa,$6a,$fd,$6f,$ff,$60,$ff,$7f,$ff,$7f,$ff,$00,$ff ; bottom-left
|
||
|
db $aa,$55,$55,$aa,$aa,$55,$ff,$ff,$00,$ff,$ff,$ff,$ff,$ff,$00,$ff ; bottom-middle
|
||
|
db $b6,$5f,$56,$bf,$b6,$5f,$f6,$ff,$06,$ff,$fe,$ff,$fe,$ff,$00,$ff ; bottom-right
|
||
|
Shuffle.UITileDataEnd:
|