; screen variables already ddefined in screencardread
;DEF vPreviousCardIndex EQU VARIABLES_START
;def vBlocked equ vPreviousCardIndex + 1 
def vAnimationFrame EQU SCREEN_VARS_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
  ld [vShuffleIndex], a 
  
  ld a, 0 
  ld [vAnimationFrame], a 
  ld [vAnimationState], a 
  
  ld hl, .asyncTask
  call Async_Spawn_HL
  ret 
.asyncTask
  ld a, LOW(ShuffleAnimationRight)
  ld [vCurrentAnimation], a 
  ld a, HIGH(ShuffleAnimationRight)
  ld [vCurrentAnimation+1], a 
  
  ld hl, ZEROES
  ld de, MY_OAM
  ld bc, $100
  call CopyRangeUnsafe
  
  ld de, SAFE_DMA_LOCATION
  ld a, HIGH(ZEROES)
  call RunDMA

  ld hl, Shuffle.UITilemap ; origin
  ld de, $9800 ; destination
  ld b, 18 ; height
  ld c, 20 ; width
  call CopyTilesToMapUnsafe

  ld hl, Shuffle.UITileData
  ld de, $9000 + VARIABLE_TILES_START*16
  ld bc, Shuffle.UITileDataEnd - Shuffle.UITileData
  call CopyRangeUnsafe 
  
  
  ; manually drawing the Big Card
  ld hl, $9800 + $20*5 + 7
  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
  ld 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
  ld 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
  ld a, [vFrameCountSquares]
  inc a
  call ArrayClampLooping
  ld [vFrameCountSquares], a 

.doneTimer

  ld hl, rMYBTNP
  
  ld a, 0 
  cp a, [hl]
  jr z, .noButtons
  ld a, [rLFSR]
  ld [rLFSR+1], a ; lfsr = (lfsr << 8) + (vShuffleTime & $ff)
  ld a, [vShuffleTime]
  ld [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 
  ld [vAnimationState], a
  ld a, 0
  ld [vAnimationFrame], a 
  
  ld a, LOW(ShuffleAnimationRight)
  ld [vCurrentAnimation], a 
  ld a, HIGH(ShuffleAnimationRight)
  ld [vCurrentAnimation+1], a
  
  call DoSomeShuffling
.doneWithRight
  bit 1, [hl]
  jp z, .doneWithLeft
  
  ld a, 1
  ld [vAnimationState], a
  ld a, 0
  ld [vAnimationFrame], a 
  
  ld a, LOW(ShuffleAnimationRightReturn)
  ld [vCurrentAnimation], a 
  ld a, HIGH(ShuffleAnimationRightReturn)
  ld [vCurrentAnimation+1], a
.doneWithLeft

  ;animation logic!
  ld a, [vCurrentAnimation]
  ld l, a 
  ld a, [vCurrentAnimation+1]
  ld h, a  ; fetch current animation
  
  ld a, [vAnimationState]
  or a, a
  jp z, .doneWithAnimation
  
  ld a, [vAnimationFrame]
  inc a 
  cp a, [hl]
  jp nz, .animNotDone
  dec a 
  ld [vAnimationFrame], a
  ld a, 0
  ld [vAnimationState], a 
  ld a, [vAnimationFrame]
.animNotDone
  call ArrayClampLooping
  ld [vAnimationFrame], a 
  
.doneWithAnimation
  inc hl 
  ld b, 0 
  ld 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 ; hl memory location, b y, c x, e width, d wiggle
  
  ret

ShuffleDraw:
  ld de, SAFE_DMA_LOCATION ; safe bytes in hram for dma code to live at
  ld a, HIGH(MY_OAM)
  call RunDMA
  
  ; the card data is loaded asynchronously, initiated in CardReadUpdate
  
  ld hl, SquaresTiles
  inc hl 
  ld b, 0
  ld 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
 
  
  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
  ld 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
  
  ld a, [vShuffleIndex]
  dec a
  ld [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 
  ld [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: