; 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: