TheMagician:
  db 10, "THE       "
  db 10, "MAGICIAN  "
  db 9, "capacity "
  db 9, "knowing  "
  db 9, "manifest "
  dw MagicianMapEnd - MagicianMap
  dw MagicianMap
  dw MagicianTilesEnd - MagicianTiles
  dw MagicianTiles
  dw .SpriteTilesEnd - .SpriteTiles
  dw .SpriteTiles
  dw .fInit
  dw .fUpdate
  dw .fDraw

; CARD_VARS_START + 0 ; timer for lemniscate
; CARD_VARS_START + 2 ; frame counter 1
; CARD_VARS_START + 3 ; frame counter 2
.fInit:
  ld hl, CVS
  ld a, 0 
  ld [hl+], a ; CVS timer for flame
  ld [hl+], a 
  ld [hl+], a ; CVS+2 frame of flame 1
  ld [hl+], a ; CVS+3 frame of flame 2
  ld [hl+], a ; CVS+4 color cycling frame
  ld [hl+], a ; CVS+5 sprite frame
  ld [hl+], a ; CVS+6 delay timer for sheen
  ld [hl+], a 
  ld [hl+], a ; CVS+8 frame of sheen animation

   ; starting values for flame 1
  ld a, 0 ; starting frame number for flame 1
  ld [CVS+2], a 
  ld hl, MY_OAM
  ld [hl], 36 ; y
  inc hl 
  ld [hl], 39 ; x 
  inc hl 
  ld [hl], 1 ; tile
  inc hl
  set OAMB_PAL1, [hl]

  ; srtarting values for flame 2
  ld a, 10
  ld [CVS+3], a
  ld hl, MY_OAM + 1*4 ; pre-populate with flame 2 
  ld [hl], 36 ; y 
  inc hl 
  ld [hl], 59 ; x
  inc hl 
  ld [hl], 2 ; tile
  inc hl
  set OAMB_PAL1, [hl]
  
  ; starting values for sheens
  ld hl, MY_OAM + 2*4 ; sword sheen sprite goes in OAM+2
  ld [hl], 0
  inc hl
  ld [hl], 0 
  inc hl 
  ld [hl], 3 ; sword sheen sprite
  
  ld hl, MY_OAM + 3*4 ; pentaacle sheen ggoes in OAM+3
  ld [hl], 0 
  inc hl 
  ld [hl], 0
  inc hl
  ld [hl], 4 ; pentacle sheen sprite
  inc hl
  set OAMB_PRI, [hl]
  
  ret 
.fUpdate:
  ld hl, CVS
  call IncrementTimer
  
  ld a, [CVS+1] ; checking the high byte of the timer
  cp a, $01 ; $10 = 1 second, $02 = 1/8 of a second
  jp c, .doneWithTimer1 ; if the timer is less than $0600, skip 
  
  ; if the timer is greater or equal to $0600, reset it 
  ld a, 0 
  ld [CVS], a 
  ld [CVS+1], a 
  call .drawFlames
.doneWithTimer1

  ld hl, CVS+6
  call IncrementTimer
  ld a, [CVS+6+1]
  cp a, $40 ; this should go off every four seconds
  jp c, .doneWithTimer2
  
  ld a, 0
  ld [CVS+6], a 
  ld [CVS+6+1], a 
  ld a, 1 
  ld [CVS+8], a  ; set the sheen animation to run 
.doneWithTimer2

  ld a, [CVS+8]
  cp a, 0
  jp z, .doneWithTimer3

  ; play the sheen animation
  call .runSheen
  
.doneWithTimer3
  ret

.drawFlames:
  ;update positions based on animation data
  ;draw frame 1
  ld hl, .flameAnimation
  ld a, [CVS+2]
  inc a
  call ArrayClampLooping
  ld [CVS+2], a 
  
  ld b, 0 
  ld c, a 
  
  ld hl, .flameAnimation+1
  add hl, bc ; add bc twice (it's a list of pairs) to jump to the bc'th element 
  add hl, bc ; of the list
  ld b, [hl] ; load y into b
  inc hl 
  ld c, [hl] ; load x into c
  
  
  ld hl, MY_OAM
  ld [hl], b 
  inc hl 
  ld [hl], c
  inc hl
  
  
  ;draw frame 2
  ld hl, .flameAnimation
  ld a, [CVS+3]
  inc a
  call ArrayClampLooping
  ld [CVS+3], a 
  
  ld b, 0 
  ld c, a 
  
  ld hl, .flameAnimation+1
  add hl, bc ; add bc twice (it's a list of pairs) to jump to the bc'th element 
  add hl, bc ; of the list
  ld b, [hl] ; load y into b
  inc hl 
  ld c, [hl] ; load x into c
  
  ld hl, MY_OAM + 1*4
  ld [hl], b 
  inc hl 
  ld [hl], c
  inc hl
  
  ; advance the three-frame palette cyclling animation
  ld b, 12
  ld a, [CVS+4]
  inc a 
  call ArrayClampLoopingB
  ld [CVS+4], a 
  cp a, 0
  jp z, :+
  cp a, 4
  jp z, :++
  cp a, 8
  jp z, :+++
  jp .doneWithPalette
:
  ld a, %10_10_00_00
  ld [rOBP1], a
  jp .doneWithPalette
:
  ld a, %00_10_10_00
  ld [rOBP1], a
  jp .doneWithPalette
:
  ld a, %10_00_10_00
  ld [rOBP1], a
  jp .doneWithPalette

.doneWithPalette
  ; advance the two-frame sprite swapping animation
  ld b, 8
  ld a, [CVS+5]
  inc a
  call ArrayClampLoopingB
  ld [CVS+5], a 
  cp a, 0 
  jp z, :+
  cp a, 4
  jp z, :++
  jp .doneWithSpriteSwap
:
  ld hl, MY_OAM + 0*4 + 2
  ld [hl], 1
  ld hl, MY_OAM + 1*4 + 2
  ld [hl], 2
  jp .doneWithSpriteSwap
:
  ld hl, MY_OAM + 0*4 + 2
  ld [hl], 2
  ld hl, MY_OAM + 1*4 + 2
  ld [hl], 1

  jp .doneWithSpriteSwap
.doneWithSpriteSwap
  ; two-frame left-right animation
  ld a, [CVS+5]
  bit 0, a 
  jp z, :+
  jp :++
:
  ld hl, MY_OAM + 0*4 + 3
  ld a, OAMF_XFLIP
  xor a, [hl]
  ld [hl], a 
  
  ld hl, MY_OAM + 1*4 + 3
  ld a, OAMF_XFLIP
  xor a, [hl]
  ld [hl], a 
:

  ret
  
.flameAnimation:
  db 32, 29, 35, 28, 35, 26, 36, 25, 37, 24, 39, 24, 40, 25, 42, 27, 44, 29, 45, 31, 46, 33, 48, 34, 50, 34, 51, 33, 53, 32, 54, 30, 55, 29, 55, 28, 55, 26, 54, 25, 53, 24, 51, 24, 50, 25, 48, 27, 46, 29, 45, 31, 44, 33, 42, 34, 40, 34, 39, 33, 37, 32, 36, 30, 35

.runSheen:
  ld hl, .swordSheen
  ld a, [CVS+8]
  inc a
  call ArrayClampLooping
  ld [CVS+8], a 
  
  ld b, 0
  ld c, a 
  
  ld hl, .swordSheen+1
  add hl, bc ; add bc twice (it's a list of pairs) to jump to the bc'th element 
  add hl, bc ; of the list
  ld b, [hl] ; load y into b
  dec b
  inc hl 
  ld c, [hl] ; load x into c
  
  ld hl, MY_OAM + 2*4
  ld [hl], b 
  inc hl 
  ld [hl], c
  
  ld a, [CVS+8]
  
  ld b, 0
  ld c, a 
  
  ld hl, .pentacleSheen+1
  add hl, bc ; add bc twice (it's a list of pairs) to jump to the bc'th element 
  add hl, bc ; of the list
  ld b, [hl] ; load y into b
  inc hl 
  ld c, [hl] ; load x into c
  
  ld hl, MY_OAM + 3*4
  ld [hl], b 
  inc hl 
  ld [hl], c
  inc hl
  
  ret 
.swordSheen:
  db 22, 96, 0, 96, 21, 96, 22, 96, 23, 96, 24, 96, 25, 96, 26, 96, 27, 96, 28, 96, 29, 96, 30, 96, 31, 96, 32, 96, 33, 96, 34, 96, 35, 96, 36, 96, 37, 96, 38, 96, 39, 96, 40, 96, 41,  
.pentacleSheen:
  db 22, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 32, 96, 33, 96, 34, 96, 35, 96, 36, 96, 37, 96, 38, 96, 39, 96, 40, 96, 41,   
.fDraw:
  ret  

.SpriteTiles:
	db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	db $20,$20,$30,$30,$38,$28,$3c,$24,$6c,$54,$c6,$fa,$6c,$54,$38,$38
	db $0c,$0c,$18,$18,$38,$28,$3c,$24,$6c,$54,$c6,$fa,$6c,$54,$38,$38
	db $00,$d0,$00,$68,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	db $00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$00,$80,$00,$80,$00,$80
.SpriteTilesEnd:
  
MagicianTiles:
  db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	db $ff,$ff,$ff,$ff,$e0,$e0,$fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe
	db $01,$21,$03,$23,$03,$22,$03,$3e,$01,$02,$01,$02,$01,$02,$01,$02
	db $fe,$81,$d5,$aa,$bb,$c4,$d5,$aa,$ae,$d1,$d5,$aa,$c2,$9d,$d1,$8e
	db $ff,$00,$ff,$00,$ff,$00,$ff,$70,$df,$50,$df,$50,$df,$50,$57,$d8
	db $ff,$00,$ff,$00,$ff,$00,$77,$88,$ff,$01,$dd,$23,$ff,$01,$57,$a9
	db $df,$50,$df,$50,$df,$50,$d7,$d8,$df,$58,$dd,$56,$fb,$26,$fb,$96
	db $ff,$01,$dd,$23,$ff,$01,$55,$aa,$ff,$00,$5d,$a2,$ff,$00,$55,$aa
	db $fb,$56,$f2,$ad,$f0,$4b,$c0,$b3,$c0,$60,$40,$a0,$c0,$20,$40,$a0
	db $ff,$00,$dd,$22,$ff,$00,$55,$aa,$7f,$80,$5d,$a2,$7f,$80,$15,$6a
	db $3f,$40,$15,$6a,$3b,$44,$15,$2a,$0f,$10,$05,$0a,$00,$07,$01,$04
	db $01,$04,$01,$04,$01,$04,$01,$04,$01,$0c,$05,$88,$85,$58,$45,$b0
	db $ff,$00,$dd,$22,$ff,$3f,$60,$a0,$c0,$60,$40,$c0,$80,$df,$8f,$90
	db $ff,$00,$dd,$22,$ff,$fc,$03,$06,$03,$02,$01,$01,$01,$f1,$e1,$19
	db $8f,$90,$8f,$90,$8f,$96,$89,$96,$8f,$91,$8f,$91,$8f,$90,$8f,$93
	db $f1,$09,$f1,$09,$f1,$69,$91,$69,$f1,$09,$71,$89,$f1,$09,$f0,$c9
	db $d0,$8b,$d0,$89,$50,$89,$50,$08,$50,$08,$40,$18,$40,$10,$40,$10
	db $c0,$20,$40,$a0,$c0,$20,$40,$a0,$c0,$20,$40,$a0,$80,$60,$40,$a0
	db $8e,$91,$87,$88,$81,$86,$80,$87,$83,$84,$83,$84,$80,$87,$80,$84
	db $70,$88,$e0,$10,$80,$70,$00,$f0,$e0,$10,$e0,$10,$00,$f0,$00,$20
	db $40,$10,$40,$10,$40,$10,$40,$10,$40,$10,$40,$10,$40,$10,$40,$10
	db $48,$14,$40,$1c,$40,$1c,$40,$1e,$50,$0e,$50,$0e,$50,$0e,$50,$0f
	db $fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe,$e0,$e0,$ff,$ff,$ff,$ff
	db $7f,$7f,$7f,$7f,$7f,$7f,$7f,$7f,$7f,$7f,$07,$07,$ff,$ff,$ff,$ff
	db $ff,$ff,$ff,$ff,$07,$07,$7f,$7f,$7f,$7f,$7f,$7f,$7f,$7f,$7f,$7f
	db $c0,$20,$40,$b0,$b0,$48,$50,$ac,$ec,$13,$55,$aa,$aa,$55,$55,$aa
	db $e5,$10,$45,$b0,$85,$70,$55,$a0,$95,$60,$55,$a0,$95,$60,$15,$e0
	db $95,$60,$55,$a0,$95,$60,$15,$e0,$95,$60,$00,$ff,$00,$00,$7f,$7f
	db $40,$20,$40,$20,$40,$20,$40,$10,$40,$10,$00,$ff,$00,$00,$fe,$fe
	db $01,$02,$01,$02,$01,$02,$01,$02,$01,$02,$01,$e2,$01,$22,$01,$12
	db $81,$92,$41,$52,$41,$4a,$41,$4a,$81,$8a,$c1,$ca,$31,$36,$21,$e6
	db $41,$46,$81,$82,$00,$03,$00,$03,$80,$81,$40,$40,$20,$20,$40,$40
	db $50,$0f,$50,$0f,$52,$0d,$50,$87,$50,$87,$50,$87,$50,$87,$50,$87
	db $50,$87,$50,$87,$50,$87,$00,$77,$60,$ff,$f8,$ff,$fc,$ff,$fe,$ff
	db $80,$84,$80,$84,$80,$82,$80,$82,$80,$82,$80,$82,$80,$82,$80,$82
	db $80,$82,$80,$c2,$40,$62,$60,$3e,$40,$20,$40,$20,$40,$20,$40,$20
	db $00,$20,$00,$20,$01,$21,$01,$21,$01,$21,$01,$21,$01,$21,$01,$21
	db $02,$05,$00,$07,$02,$05,$00,$03,$00,$03,$00,$03,$00,$03,$00,$03
	db $00,$03,$00,$03,$00,$3f,$1e,$63,$3e,$43,$3e,$c3,$ff,$81,$ff,$80
	db $ff,$84,$ff,$a3,$ff,$a9,$7f,$fd,$8f,$7d,$07,$fd,$07,$fd,$05,$ff
	db $e8,$57,$c0,$ff,$20,$df,$00,$ff,$80,$7f,$00,$ff,$00,$ff,$00,$ff
	db $8a,$77,$00,$ff,$00,$ff,$00,$ff,$07,$ff,$0f,$ff,$1f,$ff,$3f,$ff
	db $40,$10,$40,$10,$40,$10,$40,$10,$40,$18,$40,$18,$40,$18,$40,$18
	db $ee,$11,$55,$aa,$aa,$55,$55,$aa,$2a,$d5,$15,$6a,$2a,$55,$11,$6e
	db $0a,$35,$15,$2a,$0a,$35,$01,$1e,$0a,$15,$04,$1b,$02,$0d,$01,$0e
	db $ff,$00,$ff,$00,$8f,$70,$03,$8c,$01,$02,$00,$03,$03,$8c,$07,$f8
	db $ff,$00,$ff,$00,$ff,$00,$77,$88,$fe,$01,$dc,$23,$ff,$00,$57,$a8
	db $ff,$00,$ff,$00,$f1,$0e,$40,$b1,$00,$c0,$80,$40,$c0,$31,$51,$ae
	db $ff,$00,$ff,$00,$ff,$00,$77,$88,$7f,$80,$5d,$a2,$ff,$00,$57,$a8
	db $1f,$1f,$20,$20,$1f,$1f,$00,$00,$02,$02,$06,$06,$3f,$7f,$46,$46
	db $ff,$ff,$00,$00,$ff,$ff,$00,$00,$00,$00,$00,$00,$ff,$ff,$00,$00
	db $80,$80,$00,$00,$80,$80,$7f,$7f,$00,$00,$00,$00,$ff,$ff,$00,$00
	db $01,$01,$00,$00,$00,$00,$fe,$fe,$01,$01,$07,$07,$f8,$f8,$38,$3f
	db $00,$00,$ff,$ff,$00,$00,$3e,$3e,$c1,$c9,$00,$77,$00,$1c,$c1,$f7
	db $64,$64,$c2,$c2,$01,$01,$01,$01,$83,$83,$44,$45,$48,$48,$84,$84
	db $03,$03,$00,$00,$00,$ff,$fe,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	db $80,$80,$00,$00,$00,$ff,$00,$81,$00,$ff,$83,$ff,$c7,$ff,$af,$ff
	db $00,$00,$00,$00,$00,$ff,$00,$18,$00,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	db $00,$00,$00,$00,$00,$ff,$00,$00,$00,$ff,$80,$ff,$80,$ff,$c0,$ff
	db $c3,$ff,$c7,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$1f,$ff,$1f,$bf,$1f,$3f
	db $3e,$3e,$00,$00,$00,$ff,$01,$07,$03,$ff,$03,$ff,$07,$ff,$f3,$ff
	db $f9,$ff,$fd,$ff,$fc,$ff,$fe,$ff,$fe,$ff,$fe,$ff,$ff,$ff,$ff,$ff
	db $2f,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	db $ff,$ff,$ff,$ff,$fe,$ff,$fc,$ff,$fd,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	db $3f,$ff,$7f,$ff,$7f,$ff,$ff,$ff,$ff,$ff,$e0,$ff,$c0,$fe,$c0,$e6
	db $80,$7f,$00,$ff,$00,$ff,$f0,$ff,$fc,$ff,$fc,$ff,$ff,$ff,$ff,$ff
	db $80,$e4,$80,$fd,$80,$fd,$80,$e6,$80,$cc,$80,$eb,$c1,$ff,$ff,$ff
	db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$7f,$ff,$3f,$ff,$1f,$7f
	db $1f,$bf,$1f,$7f,$3f,$7f,$3f,$ff,$3f,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	db $fe,$ff,$fe,$ff,$fe,$ff,$fe,$ff,$fe,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$f9,$ff,$f0,$ff,$f0,$f8
	db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$7f,$ff,$07,$ff
	db $f0,$f8,$f0,$fe,$e0,$fc,$e0,$f0,$e0,$f1,$e0,$fb,$f0,$ff,$fe,$ff
	db $07,$8f,$07,$0f,$07,$0f,$07,$7f,$0f,$1f,$0f,$1f,$0f,$3f,$1f,$ff
	db $3f,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	db $1f,$3f,$1f,$ff,$1f,$7f,$1f,$3f,$1f,$7f,$3f,$ff,$ff,$ff,$fe,$ff
	db $ff,$ff,$ff,$ff,$ff,$ff,$c1,$ff,$80,$ef,$00,$cf,$00,$dc,$00,$d4
	db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$1f,$ff,$1f,$7f,$0f,$7f
	db $00,$56,$00,$63,$00,$61,$00,$38,$00,$97,$00,$90,$00,$d1,$80,$ff
	db $0f,$7f,$0f,$ff,$0f,$ff,$1f,$3f,$1f,$ff,$3f,$ff,$7f,$ff,$ff,$ff
	db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$f1,$ff,$e1,$fb,$e0,$f1,$e0,$f9
	db $f0,$fc,$c0,$f0,$80,$e2,$80,$c6,$80,$ec,$c0,$ff,$ff,$ff,$ff,$ff
	db $95,$60,$55,$a0,$95,$60,$15,$e0,$95,$60,$55,$a0,$95,$60,$15,$e0
	db $00,$00,$ff,$ff,$00,$00,$00,$00,$00,$00,$01,$01,$01,$01,$00,$00
	db $aa,$55,$00,$ff,$a2,$5d,$00,$ff,$aa,$55,$00,$ff,$22,$dd,$80,$ff
	db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$77,$88
	db $ff,$00,$ff,$00,$ff,$00,$77,$88,$ff,$00,$dd,$22,$ff,$00,$57,$a8
	db $ff,$00,$dd,$22,$ff,$00,$55,$aa,$ff,$00,$5d,$a2,$ff,$00,$55,$aa
	db $ff,$00,$55,$aa,$fb,$04,$55,$aa,$ff,$00,$55,$aa,$bb,$44,$55,$aa
	db $ff,$00,$55,$aa,$fb,$04,$55,$aa,$ff,$00,$55,$aa,$bb,$44,$d5,$aa
	db $fe,$01,$55,$aa,$bb,$44,$55,$aa,$ee,$11,$55,$aa,$aa,$55,$55,$aa
	db $ee,$11,$55,$aa,$aa,$55,$55,$aa,$aa,$55,$55,$aa,$aa,$55,$11,$ee
	db $aa,$55,$55,$aa,$aa,$55,$11,$ee,$aa,$55,$44,$bb,$aa,$55,$01,$fe
	db $aa,$55,$44,$bb,$aa,$55,$00,$ff,$aa,$55,$00,$ff,$00,$00,$00,$00
	db $aa,$55,$44,$bb,$aa,$55,$00,$ff,$aa,$55,$04,$fb,$aa,$55,$00,$ff
	db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	db $46,$46,$3f,$7f,$06,$06,$02,$02,$00,$00,$00,$00,$00,$00,$00,$00
MagicianTilesEnd:

MagicianMap:
  db $6f, $1e, $6f, $6f, $6f, $6f, $6f, $6f
	db $1f, $20, $70, $70, $70, $70, $70, $70
	db $21, $22, $23, $26, $27, $71, $71, $71
	db $72, $2b, $24, $28, $29, $73, $72, $72
	db $74, $33, $25, $2c, $2d, $1d, $74, $74
	db $75, $75, $34, $3c, $3e, $2a, $45, $75
	db $76, $76, $6c, $3d, $1c, $2e, $46, $76
	db $77, $77, $35, $36, $37, $44, $3f, $78
	db $4b, $4c, $4d, $4e, $38, $2f, $40, $6e
	db $7a, $6d, $4f, $50, $39, $3a, $41, $42
	db $53, $54, $56, $51, $52, $3b, $43, $5b
	db $6a, $55, $57, $79, $58, $59, $5a, $5d
	db $6b, $65, $66, $67, $60, $61, $5c, $5e
	db $79, $5f, $68, $69, $62, $63, $79, $79
	db $79, $79, $79, $1b, $32, $64, $79, $79
	db $79, $79, $79, $30, $31, $79, $79, $79
MagicianMapEnd: