gb-tarot/ScreenShuffle.inc

396 lines
9.5 KiB
PHP
Raw Permalink Normal View History

2025-01-23 13:16:55 -05:00
; 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: