PUSHS UNION "Screen Variables", WRAM0[SCREEN_VARS_START]
ds 16 ; why are we putting this so far in? i don't remember but whatever
vPreviousCardIndex: db
POPS

ScreenCardRead:
  dw CardReadSetup
  dw CardReadUpdate
  dw CardReadDraw
  dw CardReadTeardown

CardReadSetup:
  ld a, 1 
  ld [vBlocked], a 
  ld [vTooBusyForPrinter], a 

  ld hl, .asyncTask
  call Async_Spawn_HL
  
  ld hl, ZEROES
  ld de, MY_OAM
  ld bc, $100
  call CopyRange
  
  call CheckForPrinter

  ret

.asyncTask:

  ld hl, CardRead.UITilemap ; origin
  ld de, _SCRN0 ; destination
  ld b, 18 ; height
  ld c, 20 ; width
  call CopyTilesToMap
  
  ld hl, CardRead.PrinterTiles
  ld de, _VRAM + $1000 - $10*16
  ld bc, CardRead.PrinterTilesEnd - CardRead.PrinterTiles
  call CopyRange

  ld a, 0 
  ld [vBlocked], a 
  
  call ChangedCardTask

  ret

CardReadUpdate:
  ld a, [vPrinterStart]
  cp a, 0
  call z, CardUpdate
  
  call ScrollBackgroundTile
  
  ld a, [vTooBusyForPrinter]
  cp a, 0
  jp nz, .donePrinter

  .checkForPrinter
    ld a, [vPrinterStart]
    cp a, 0
    call z, CheckForPrinter
  .updatePrintUI
    ld a, [vPrinterStart]
    cp a, 0
    call z, CardRead.UpdatePrintUI 
  .runPrintJob
    ld a, [vPrinterStart]
    cp a, 0
    call nz, RunPrintJob
    
  .printButton
    ld hl, rMYBTNP
    bit 6, [hl] ; check select?
    jp z, .donePrinter
      
      ld a, [vPrinterState]
      cp a, PS_READY
      jp nz, .donePrinter
      
      call KickOffPrintJob
      ret
   .donePrinter
  
  ld hl, rMYBTNP
  bit 5, [hl]
  jp z, .doneWithB
    ld hl, ScreenSpreadSelect
    call ChangeScene
    ret
  .doneWithB
  
  ld a, [vSelectedSpreadCard]
  ld hl, rMYBTNP
  bit 1, [hl]
  jp z, :+ ; skip the following code if left is not pressed
    dec a 
  :
  bit 0, [hl]
  jp z, :+ ; skip the following code if right is not pressed
    inc a 
  :
  ld [vSelectedSpreadCard], a 
  ld a, [vCurrentSpread]
  ld l, a 
  ld a, [vCurrentSpread+1]
  ld h, a 
  ld a, [vSelectedSpreadCard]
  call ArrayClampLooping
  
  ld [vSelectedSpreadCard], a 
  ld hl, vPreviousSpreadCard
  cp a, [hl]
  ret z ; if the selected card diddn't change, nothing to do
  
  ld a, [vBlocked]
  cp a, 0 
  ret nz
  
  ld a, 1
  ld [vTooBusyForPrinter], a
  ld hl, ChangedCardTask
  call Async_Spawn_HL
  
  ret

CardReadDraw:
  ld a, [vCurrentBackgroundTile]
  ld l, a 
  ld a, [vCurrentBackgroundTile+1]
  ld h, a 
  ld de, _VRAM + $1000 + 1*16
  call CopyOneTileData
  
  call CardDraw
  
  ld de, SAFE_DMA_LOCATION
  ld a, HIGH(MY_OAM)
  call RunDMA

  ret

CardReadTeardown:
  ret
  
ChangedCardTask:
  ld a, [vSelectedSpreadCard]
  ld [vPreviousSpreadCard], a
  
  ld a, [vCurrentSpread]
  ld c, a 
  ld a, [vCurrentSpread+1]
  ld b, a ; gett bc as cuurrent spread address
  ld hl, _SCRN0 + (32*1)+11
  ld a, [vSelectedSpreadCard]
  call DrawSpreadMinimap

  ld a, [vCurrentSpread]
  ld l, a 
  ld a, [vCurrentSpread+1]
  ld h, a 
  call PassList ; skip spread layout
  ld a, [vSelectedSpreadCard]
  or a, a 
.loopThroughSpreadPositions
  jp z, .foundSpreadPositionDescription
  call PassList
  call PassList
  dec a 
  jp .loopThroughSpreadPositions
.foundSpreadPositionDescription
  ld de, _SCRN0 + 32*5 + 11
  call PrintString
  ld de, _SCRN0 + 32*6 + 11
  call PrintString
  
  ld hl, SHUFFLED_DECK+1
  ld a, [vSelectedSpreadCard]
  ld c, a 
  ld b, 0
  add hl, bc 
  ld a, [hl] 
  ld [vSelectedCardIndex], a 
  ld [vPreviousCardIndex], a 
  
  call LoadCardData
  call CardRead.UpdatePrintUIImmediate
  
  ld a, 0
  ld [vTooBusyForPrinter], a
 
  ret
  
  
CardRead.UpdatePrintUI:
  ld a, [vPrinterState]
  ld hl, vPreviousPrinterState
  cp a, [hl]
  ret z ; if the printer state has not changed, return.
  ; otherwise updae previous printer state and we're good
  ld [hl], a 
  
  ld hl, CardRead.UpdatePrintUIImmediate
  call Async_Spawn_HL
  ret
  
CardRead.UpdatePrintUIImmediate:
  ld a, [vPrinterState]
  ld hl, CardRead.PrinterNotDetected
  cp a, PS_NONE
  jp z, .setIt

  ld hl, CardRead.PrinterAvailable
  cp a, PS_READY
  jp z, .setIt
  
  ld hl, CardRead.PrinterFull
  cp a, PS_FULL
  jp z, .setIt
  
  ld hl, CardRead.PrinterPrinting
  cp a, PS_PRINTING
  jp z, .setIt
  
  ld hl, CardRead.PrinterError
  cp a, PS_ERROR
  jp z, .setIt
  
  .setIt
  ld de, _SCRN0 + 32*7 + 10
  ld b, 2
  ld c, 9
  call CopyTilesToMap
  
  ret

CardRead.PrinterNotDetected:
  db $06, $05, $05, $05, $05, $05, $05, $05, $07
	db $01, $01, $01, $01, $01, $01, $01, $01, $01
CardRead.PrinterAvailable:
  db $03, $00, $f1, $f2, $00, $f3, $f4, $00, $04
	db $06, $05, $05, $05, $05, $05, $05, $05, $07
CardRead.PrinterFull:
  db $03, $00, $f1, $f2, $00, $f9, $fa, $00, $04
	db $06, $05, $05, $05, $05, $05, $05, $05, $07
CardRead.PrinterPrinting:
  db $03, $00, $f1, $f2, $00, $f7, $f8, $00, $04
	db $06, $05, $05, $05, $05, $05, $05, $05, $07
CardRead.PrinterError:
  db $03, $00, $f1, $f2, $00, $f5, $f6, $00, $04
	db $06, $05, $05, $05, $05, $05, $05, $05, $07

CardRead.PrinterTiles:
  db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	db $00,$1c,$00,$0e,$38,$3f,$64,$7f,$7f,$7f,$7f,$40,$7f,$40,$3f,$3f
	db $00,$00,$00,$00,$00,$00,$06,$b6,$ff,$ff,$ff,$11,$ff,$11,$fe,$fe
	db $00,$00,$00,$00,$0e,$0e,$12,$1e,$24,$3c,$38,$38,$00,$00,$00,$00
	db $00,$00,$00,$00,$5a,$5a,$92,$92,$5a,$5a,$52,$52,$9b,$9b,$00,$00
	db $00,$00,$18,$18,$18,$18,$18,$18,$18,$18,$00,$00,$18,$18,$00,$00
	db $00,$00,$00,$00,$d8,$d8,$94,$94,$d8,$d8,$94,$94,$d2,$d2,$00,$00
	db $00,$00,$00,$00,$19,$19,$15,$15,$19,$19,$11,$11,$11,$11,$00,$00
	db $00,$00,$00,$00,$92,$92,$5a,$5a,$96,$96,$52,$52,$52,$52,$00,$00
	db $00,$00,$00,$00,$1d,$1d,$11,$11,$19,$19,$11,$11,$11,$11,$00,$00
	db $00,$00,$00,$00,$52,$52,$52,$52,$52,$52,$52,$52,$db,$db,$00,$00
CardRead.PrinterTilesEnd:


CardRead.UITilemap:
	db $0e, $0a, $0a, $0a, $0a, $0a, $0a, $0a, $0a, $0f, $09, $02, $02, $02, $02, $02, $02, $02, $08, $01
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $03, $00, $00, $00, $00, $00, $00, $00, $04, $01
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $03, $00, $00, $00, $00, $00, $00, $00, $04, $01
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $03, $00, $00, $00, $00, $00, $00, $00, $04, $01
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $03, $00, $00, $00, $00, $00, $00, $00, $04, $01
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $03, $00, $00, $00, $00, $00, $00, $00, $04, $01
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $03, $00, $00, $00, $00, $00, $00, $00, $04, $01
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $06, $05, $05, $05, $05, $05, $05, $05, $07, $01
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	db $0b, $00, $00, $00, $00, $00, $00, $00, $00, $0c, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	db $11, $0d, $0d, $0d, $0d, $0d, $0d, $0d, $0d, $10, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
CardRead.UITilemapEnd: