557 lines
11 KiB
PHP
557 lines
11 KiB
PHP
; screen variables already ddefined in screencardread
|
|
;DEF vPreviousCardIndex EQU VARIABLES_START
|
|
;def vBlocked equ vPreviousCardIndex + 1
|
|
def vAnimationFrame EQU SCREEN_VARS_START
|
|
def vState EQU vAnimationFrame+1
|
|
println "vState is ", vState
|
|
def vCurrentAnimation EQU vState+1 ; 2 bytes
|
|
def vShuffleIndex equ vCurrentAnimation+2
|
|
def vShuffleTime equ vShuffleIndex+1 ; 2 bytes
|
|
|
|
def S_Center = 0
|
|
def S_RightOut = 1
|
|
def S_Right = 2
|
|
def S_RightIn = 3
|
|
def S_LeftOut = 4
|
|
def S_Left = 5
|
|
def S_LeftIn = 6
|
|
def S_UpOut = 7
|
|
def S_Up = 8
|
|
def S_UpIn = 9
|
|
def S_DownOut = 10
|
|
def S_Down = 11
|
|
def S_DownIn = 12
|
|
|
|
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 a, S_Center
|
|
ld [vState], a
|
|
|
|
ld a, LOW(ShuffleAnimationRight)
|
|
ld [vCurrentAnimation], a
|
|
ld a, HIGH(ShuffleAnimationRight)
|
|
ld [vCurrentAnimation+1], a
|
|
|
|
ld hl, .asyncTask
|
|
call Async_Spawn_HL
|
|
|
|
ld hl, ZEROES
|
|
ld de, MY_OAM
|
|
ld bc, $100
|
|
call CopyRange
|
|
ret
|
|
.asyncTask
|
|
ld hl, ONES ; origin
|
|
ld de, _SCRN0 ; destination
|
|
ld b, 18 ; height
|
|
ld c, 20 ; width
|
|
call CopyTilesToMap
|
|
|
|
; manually drawing the Big Card
|
|
.drawBigCard
|
|
ld hl, _SCRN0 + 32*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
|
|
|
|
ld hl, Shuffle.UITileData
|
|
ld de, $9000 + VARIABLE_TILES_START*16
|
|
ld bc, Shuffle.UITileDataEnd - Shuffle.UITileData
|
|
call CopyRange
|
|
|
|
ret
|
|
|
|
ShuffleUpdate:
|
|
; incrrement vShuffleTime so we can use it for seeding RNG
|
|
ld hl, vShuffleTime
|
|
call IncrementTimer
|
|
|
|
ld hl, vTime
|
|
call IncrementTimer
|
|
|
|
ld a, [vTime+1]
|
|
cp a, $01
|
|
jp c, .doneTimer ; if the timer is less than $0100, skip to end
|
|
|
|
;otherwise reset the timer
|
|
ld a, 0
|
|
ld [vTime], a
|
|
ld [vTime+1], a
|
|
|
|
ld hl, SquaresTiles
|
|
ld a, [vFrameCountSquares]
|
|
inc a
|
|
call ArrayClampLooping
|
|
ld [vFrameCountSquares], a
|
|
|
|
.doneTimer
|
|
|
|
ld a, [rMYBTNP]
|
|
cp a, 0
|
|
jr z, .doneWithButtons
|
|
ld a, [rLFSR]
|
|
ld [rLFSR+1], a ; lfsr = (lfsr << 8) + (vShuffleTime & $ff)
|
|
ld a, [vShuffleTime]
|
|
ld [rLFSR], a
|
|
|
|
; check for B button press and change scene
|
|
ld hl, rMYBTNP
|
|
bit 4, [hl]
|
|
jp z, .doneWithB
|
|
ld hl, ScreenMainMenu
|
|
call ChangeScene
|
|
ret
|
|
.doneWithB
|
|
call ShuffleButtonHandler
|
|
.doneWithButtons
|
|
|
|
call ShufflePickAnimation
|
|
|
|
ld a, [vAnimationFrame]
|
|
inc a
|
|
ld [vAnimationFrame], a
|
|
cp a, [hl]
|
|
call z, ShuffleAdvanceState
|
|
|
|
call ShufflePickAnimation
|
|
ld a, [vAnimationFrame]
|
|
call ArrayClamp
|
|
ld [vAnimationFrame], a
|
|
|
|
call ShufflePickAnimation
|
|
|
|
call ShuffleAnimate
|
|
|
|
ret
|
|
|
|
ShuffleButtonHandler:
|
|
ld a, [vState]
|
|
cp a, S_Center
|
|
jp z, CenterButtonHandler
|
|
|
|
ld a, [vState]
|
|
cp a, S_Right
|
|
jp z, RightButtonHandler
|
|
ld a, [vState]
|
|
cp a, S_RightOut
|
|
jp z, RightButtonHandler
|
|
ld a, [vState]
|
|
cp a, S_RightIn
|
|
jp z, CenterButtonHandler
|
|
|
|
ld a, [vState]
|
|
cp a, S_Left
|
|
jp z, LeftButtonHandler
|
|
ld a, [vState]
|
|
cp a, S_LeftOut
|
|
jp z, LeftButtonHandler
|
|
ld a, [vState]
|
|
cp a, S_LeftIn
|
|
jp z, CenterButtonHandler
|
|
|
|
ld a, [vState]
|
|
cp a, S_Up
|
|
jp z, UpButtonHandler
|
|
ld a, [vState]
|
|
cp a, S_UpOut
|
|
jp z, UpButtonHandler
|
|
ld a, [vState]
|
|
cp a, S_UpIn
|
|
jp z, CenterButtonHandler
|
|
|
|
ld a, [vState]
|
|
cp a, S_Down
|
|
jp z, DownButtonHandler
|
|
ld a, [vState]
|
|
cp a, S_DownOut
|
|
jp z, DownButtonHandler
|
|
ld a, [vState]
|
|
cp a, S_DownIn
|
|
jp z, CenterButtonHandler
|
|
|
|
ret
|
|
|
|
CenterButtonHandler:
|
|
call DoSomeShuffling
|
|
|
|
ld hl, rMYBTNP
|
|
: bit 0, [hl]
|
|
jp z, :+
|
|
|
|
ld a, S_RightOut
|
|
ld [vState], a
|
|
: bit 1, [hl]
|
|
jp z, :+
|
|
|
|
ld a, S_LeftOut
|
|
ld [vState], a
|
|
: bit 2, [hl]
|
|
jp z, :+
|
|
|
|
ld a, S_UpOut
|
|
ld [vState], a
|
|
: bit 3, [hl]
|
|
jp z, :+
|
|
|
|
ld a, S_DownOut
|
|
ld [vState], a
|
|
: ret
|
|
|
|
RightButtonHandler:
|
|
ld hl, rMYBTNP
|
|
: bit 1, [hl]
|
|
jp z, :+
|
|
|
|
ld a, S_RightIn
|
|
ld [vState], a
|
|
: ret
|
|
|
|
LeftButtonHandler:
|
|
ld hl, rMYBTNP
|
|
: bit 0, [hl]
|
|
jp z, :+
|
|
|
|
ld a, S_LeftIn
|
|
ld [vState], a
|
|
: ret
|
|
|
|
UpButtonHandler:
|
|
ld hl, rMYBTNP
|
|
: bit 3, [hl]
|
|
jp z, :+
|
|
|
|
ld a, S_UpIn
|
|
ld [vState], a
|
|
: ret
|
|
|
|
DownButtonHandler:
|
|
ld hl, rMYBTNP
|
|
: bit 2, [hl]
|
|
jp z, :+
|
|
|
|
ld a, S_DownIn
|
|
ld [vState], a
|
|
: ret
|
|
|
|
|
|
|
|
ShuffleAdvanceState:
|
|
ld a, [vState]
|
|
ld hl, ShuffleNextStates + 1
|
|
ld b, 0
|
|
ld c, a
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld [vState], a
|
|
ld a, 0
|
|
ld [vAnimationFrame], a
|
|
ret
|
|
ShufflePickAnimation:
|
|
ld a, [vState]
|
|
ld b, 0
|
|
ld c, a
|
|
ld hl, ShuffleAnimations + 1
|
|
add hl, bc
|
|
add hl, bc
|
|
ld c, [hl]
|
|
inc hl
|
|
ld b, [hl]
|
|
ld h, b
|
|
ld l, c
|
|
ret
|
|
|
|
ShuffleAnimate:
|
|
; hl has to hold the address of the animation
|
|
|
|
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 b, [hl]
|
|
inc hl
|
|
ld c, [hl]
|
|
ld a, 32
|
|
ld e, a
|
|
ld hl, MY_OAM
|
|
call DrawWholeCard ; hl memory location, b y, c x, e width, d wiggle
|
|
|
|
ld a, [vState]
|
|
cp a, S_RightIn
|
|
jp z, HideSprites
|
|
cp a, S_LeftIn
|
|
jp z, HideSprites
|
|
cp a, S_UpIn
|
|
jp z, HideSprites
|
|
cp a, S_DownIn
|
|
jp z, HideSprites
|
|
|
|
call ShowSprites
|
|
ret
|
|
|
|
HideSprites:
|
|
ld hl, MY_OAM
|
|
.testTile
|
|
ld a, [hl]
|
|
cp a, (2+4)*8 ; y < 5*8 => skip
|
|
jp c, .goToNextTile
|
|
cp a, (2+5+8)*8 ; y > (5+8)*8 => skip
|
|
jp nc, .goToNextTile
|
|
|
|
inc hl
|
|
ld a, [hl] ; x value
|
|
dec hl
|
|
cp a, (1+7)*8 ; x < 7*8 => skip
|
|
jp c, .goToNextTile
|
|
cp a, (1+12)*8 ; x > 12*8 => skip
|
|
jp nc, .goToNextTile
|
|
|
|
inc hl
|
|
inc hl
|
|
inc hl
|
|
set OAMB_PRI, [hl]
|
|
dec hl
|
|
dec hl
|
|
dec hl
|
|
|
|
.goToNextTile
|
|
inc hl
|
|
inc hl
|
|
inc hl
|
|
inc hl
|
|
ld a, $A0
|
|
cp a, l
|
|
jp nz, .testTile
|
|
|
|
ret
|
|
|
|
ShowSprites:
|
|
ld hl, MY_OAM
|
|
.loop
|
|
inc hl
|
|
inc hl
|
|
inc hl
|
|
res OAMB_PRI, [hl]
|
|
inc hl
|
|
ld a, $A0
|
|
cp a, l
|
|
jp nz, .loop
|
|
|
|
ret
|
|
|
|
ShuffleDraw:
|
|
ld de, SAFE_DMA_LOCATION
|
|
ld a, HIGH(MY_OAM)
|
|
call RunDMA
|
|
|
|
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, _VRAM+$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
|
|
|
|
|
|
ShuffleNextStates:
|
|
db 13,
|
|
db S_Center
|
|
db S_Right ;def S_RightOut = 1
|
|
db S_Right ; def S_Right = 2
|
|
db S_Center ;def S_RightIn = 3
|
|
db S_Left ;def S_LeftOut = 4
|
|
db S_Left ;def S_Left = 5
|
|
db S_Center ;def S_LeftIn = 6
|
|
db S_Up ;def S_UpOut = 7
|
|
db S_Up ;def S_Up = 8
|
|
db S_Center ;def S_UpIn = 9
|
|
db S_Down ;def S_DownOut = 10
|
|
db S_Down ;def S_Down = 11
|
|
db S_Center ;def S_DownIn = 12
|
|
ShuffleAnimations:
|
|
db 13,
|
|
dw ShuffleAnimationNone ; def S_Center = 0
|
|
dw ShuffleAnimationRightOut ;def S_RightOut = 1
|
|
dw ShuffleAnimationRight ; def S_Right = 2
|
|
dw ShuffleAnimationRightIn ;def S_RightIn = 3
|
|
dw ShuffleAnimationLeftOut ;def S_LeftOut = 4
|
|
dw ShuffleAnimationLeft ;def S_Left = 5
|
|
dw ShuffleAnimationLeftIn ;def S_LeftIn = 6
|
|
dw ShuffleAnimationUpOut ;def S_UpOut = 7
|
|
dw ShuffleAnimationUp ;def S_Up = 8
|
|
dw ShuffleAnimationUpIn ;def S_UpIn = 9
|
|
dw ShuffleAnimationDownOut ;def S_DownOut = 10
|
|
dw ShuffleAnimationDown ;def S_Down = 11
|
|
dw ShuffleAnimationDownIn ;def S_DownIn = 12
|
|
|
|
ShuffleAnimationNone:
|
|
db 1, 56, 72
|
|
ShuffleAnimationRight:
|
|
db 1, 56, 115
|
|
ShuffleAnimationRightOut:
|
|
db 9, 56, 72, 56, 80, 56, 88, 56, 96, 56, 103, 56, 108, 56, 112, 56, 114, 56, 115,
|
|
ShuffleAnimationRightIn:
|
|
db 8, 56, 115, 56, 104, 56, 96, 56, 88, 56, 80, 56, 76, 56, 73, 56, 72,
|
|
ShuffleAnimationLeft:
|
|
db 1, 56, 32
|
|
ShuffleAnimationLeftOut:
|
|
db 9, 56, 72, 56, 64, 56, 56, 56, 49, 56, 42, 56, 36, 56, 35, 56, 33, 56, 32,
|
|
ShuffleAnimationLeftIn:
|
|
db 8, 56, 32, 56, 40, 56, 49, 56, 57, 56, 62, 56, 67, 56, 71, 56, 72,
|
|
ShuffleAnimationUp:
|
|
db 1, -24, 72
|
|
ShuffleAnimationUpOut:
|
|
db 13, 56, 72, 48, 72, 40, 72, 32, 72, 24, 72, 16, 72, 8, 72, 0, 72, -7, 72, -14, 72, -18, 72, -23, 72, -24, 72
|
|
ShuffleAnimationUpIn:
|
|
db 10, 1, 72, 8, 72, 16, 72, 24, 72, 32, 72, 40, 72, 46, 72, 52, 72, 55, 72, 56, 72,
|
|
ShuffleAnimationDown:
|
|
db 1, 136, 72
|
|
ShuffleAnimationDownOut:
|
|
db 13, 56, 72, 64, 72, 72, 72, 80, 72, 88, 72, 96, 72, 105, 72, 112, 72, 119, 72, 125, 72, 129, 72, 134, 72, 136, 72,
|
|
ShuffleAnimationDownIn:
|
|
db 12, 136, 72, 128, 72, 120, 72, 112, 72, 104, 72, 96, 72, 88, 72, 80, 72, 68, 72, 61, 72, 58, 72, 56, 72,
|
|
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:
|