From a68812698b48bbd2a106f339a2fa2c90dfaf66c0 Mon Sep 17 00:00:00 2001 From: shoofle Date: Sun, 30 Mar 2025 10:51:42 -0400 Subject: [PATCH] shuffle screen upgrade and interrupt driven update loop --- 21TheWorld.inc | 10 +- 21theworld.aseprite | Bin 3624 -> 3624 bytes KeyArtTiles.asm | 10 +- ScreenMainMenu.inc | 3 +- ScreenShuffle.inc | 462 +++++++++++++++++++++++++++++++------------- main.asm | 17 +- source.zip | Bin 417441 -> 419344 bytes 7 files changed, 352 insertions(+), 150 deletions(-) diff --git a/21TheWorld.inc b/21TheWorld.inc index 5e94e31..2bb4522 100644 --- a/21TheWorld.inc +++ b/21TheWorld.inc @@ -554,19 +554,19 @@ db $36, $00, $00, $00, $00, $00 db $ff,$06,$ff,$03,$ff,$03,$ff,$03,$ff,$03,$ff,$07,$ff,$0f,$ff,$3f db $ff,$3f,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$fe,$fe - db $ff,$ff,$fe,$fe,$fd,$fd,$ea,$ea,$d4,$d4,$88,$88,$50,$50,$a0,$a0 + db $ff,$ff,$fe,$fe,$fd,$fd,$ea,$ea,$d4,$d4,$a0,$a0,$50,$50,$a0,$a0 db $e0,$e0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $07,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $ff,$ff,$7f,$7f,$1f,$1f,$07,$07,$03,$03,$00,$00,$00,$00,$00,$00 db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$7f,$7f,$3f,$3f - db $fe,$fe,$fd,$fd,$fa,$fa,$f5,$f5,$ea,$ea,$d5,$d5,$ea,$ea,$d5,$d5 + db $fe,$fe,$fd,$fd,$fa,$fa,$fd,$fd,$fa,$fa,$d5,$d5,$fa,$fa,$f5,$f5 db $a0,$a0,$00,$00,$80,$80,$00,$00,$80,$80,$00,$00,$00,$00,$00,$00 db $1f,$1f,$1f,$1f,$0f,$0f,$07,$07,$07,$07,$03,$03,$03,$03,$01,$01 - db $dc,$dc,$aa,$aa,$d4,$d4,$aa,$aa,$d4,$d4,$aa,$aa,$54,$54,$aa,$aa + db $fc,$fc,$aa,$aa,$f4,$f4,$aa,$aa,$f4,$f4,$ea,$ea,$74,$74,$aa,$aa db $01,$01,$01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 - db $dc,$dc,$aa,$aa,$54,$54,$aa,$aa,$d4,$d4,$aa,$aa,$d4,$d4,$aa,$aa + db $fc,$fc,$aa,$aa,$74,$74,$aa,$aa,$f4,$f4,$ea,$ea,$f4,$f4,$aa,$aa db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$01,$01,$01 - db $ee,$ee,$d5,$d5,$ea,$ea,$f5,$f5,$ea,$ea,$f5,$f5,$fa,$fa,$fd,$fd + db $ee,$ee,$f5,$f5,$fa,$fa,$f5,$f5,$fa,$fa,$fd,$fd,$fa,$fa,$fd,$fd db $00,$00,$00,$00,$00,$00,$00,$00,$80,$80,$00,$00,$80,$80,$40,$40 db $01,$01,$03,$03,$03,$03,$07,$07,$07,$07,$0f,$0f,$1f,$1f,$1f,$1f db $ff,$ff,$fe,$fe,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff diff --git a/21theworld.aseprite b/21theworld.aseprite index 42a02c027de3a0a560004105bc91d8d1a9799eae..0c3c4e8c8398939219576ddb550619d2cbae729f 100644 GIT binary patch delta 22 ecmZ1>vqENr7!M=UWN{v)$znVLn>~5%GXelcKLz6e delta 22 ecmZ1>vqENr7!M=!WN{v)$znVLn>~5%GXelcO$Fot diff --git a/KeyArtTiles.asm b/KeyArtTiles.asm index 772c323..dd842b8 100644 --- a/KeyArtTiles.asm +++ b/KeyArtTiles.asm @@ -16,19 +16,19 @@ KeyArtTiles: db $ff,$06,$ff,$03,$ff,$03,$ff,$03,$ff,$03,$ff,$07,$ff,$0f,$ff,$3f db $ff,$3f,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$fe,$fe - db $ff,$ff,$fe,$fe,$fd,$fd,$ea,$ea,$d4,$d4,$88,$88,$50,$50,$a0,$a0 + db $ff,$ff,$fe,$fe,$fd,$fd,$ea,$ea,$d4,$d4,$a0,$a0,$50,$50,$a0,$a0 db $e0,$e0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $07,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $ff,$ff,$7f,$7f,$1f,$1f,$07,$07,$03,$03,$00,$00,$00,$00,$00,$00 db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$7f,$7f,$3f,$3f - db $fe,$fe,$fd,$fd,$fa,$fa,$f5,$f5,$ea,$ea,$d5,$d5,$ea,$ea,$d5,$d5 + db $fe,$fe,$fd,$fd,$fa,$fa,$fd,$fd,$fa,$fa,$d5,$d5,$fa,$fa,$f5,$f5 db $a0,$a0,$00,$00,$80,$80,$00,$00,$80,$80,$00,$00,$00,$00,$00,$00 db $1f,$1f,$1f,$1f,$0f,$0f,$07,$07,$07,$07,$03,$03,$03,$03,$01,$01 - db $dc,$dc,$aa,$aa,$d4,$d4,$aa,$aa,$d4,$d4,$aa,$aa,$54,$54,$aa,$aa + db $fc,$fc,$aa,$aa,$f4,$f4,$aa,$aa,$f4,$f4,$ea,$ea,$74,$74,$aa,$aa db $01,$01,$01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 - db $dc,$dc,$aa,$aa,$54,$54,$aa,$aa,$d4,$d4,$aa,$aa,$d4,$d4,$aa,$aa + db $fc,$fc,$aa,$aa,$74,$74,$aa,$aa,$f4,$f4,$ea,$ea,$f4,$f4,$aa,$aa db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$01,$01,$01 - db $ee,$ee,$d5,$d5,$ea,$ea,$f5,$f5,$ea,$ea,$f5,$f5,$fa,$fa,$fd,$fd + db $ee,$ee,$f5,$f5,$fa,$fa,$f5,$f5,$fa,$fa,$fd,$fd,$fa,$fa,$fd,$fd db $00,$00,$00,$00,$00,$00,$00,$00,$80,$80,$00,$00,$80,$80,$40,$40 db $01,$01,$03,$03,$03,$03,$07,$07,$07,$07,$0f,$0f,$1f,$1f,$1f,$1f db $ff,$ff,$fe,$fe,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff diff --git a/ScreenMainMenu.inc b/ScreenMainMenu.inc index 76b03d3..ba2e7bd 100644 --- a/ScreenMainMenu.inc +++ b/ScreenMainMenu.inc @@ -808,8 +808,7 @@ DrawTile: ; b: y. c: x. a: part id. hl: location of sprite in OAM ld a, d add a, e ld [hl+], a - ld a, 0 - ld [hl+], a + inc hl ret .skipThisTile diff --git a/ScreenShuffle.inc b/ScreenShuffle.inc index 97156f6..5320628 100644 --- a/ScreenShuffle.inc +++ b/ScreenShuffle.inc @@ -2,11 +2,26 @@ ;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 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 @@ -21,40 +36,33 @@ ShuffleSetup: ld a, 0 ld [vAnimationFrame], a - ld [vAnimationState], a - ld hl, .asyncTask - call Async_Spawn_HL - ret -.asyncTask + 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 CopyRangeUnsafe - - ld de, SAFE_DMA_LOCATION - ld a, HIGH(ZEROES) - call RunDMA - - ld hl, Shuffle.UITilemap ; origin - ld de, $9800 ; destination + call CopyRange + ret +.asyncTask + ld hl, ONES ; origin + ld de, _SCRN0 ; 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 + call CopyTilesToMap - - ; manually drawing the Big Card - ld hl, $9800 + $20*5 + 7 + ; manually drawing the Big Card +.drawBigCard + ld hl, _SCRN0 + 32*5 + 8 ld a, VARIABLE_TILES_START ld [hl+], a inc a @@ -127,41 +135,30 @@ ShuffleSetup: 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 - 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 - + call IncrementTimer 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 + call IncrementTimer - ld a, [hl] + 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 [hl-], a - ld [hl], a + ld [vTime], a + ld [vTime+1], a ld hl, SquaresTiles ld a, [vFrameCountSquares] @@ -171,78 +168,184 @@ ShuffleUpdate: .doneTimer - ld hl, rMYBTNP - - ld a, 0 - cp a, [hl] - jr z, .noButtons + 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 -.noButtons - + ; check for B button press and change scene + ld hl, rMYBTNP 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 + call ShuffleButtonHandler +.doneWithButtons - ;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 + call ShufflePickAnimation ld a, [vAnimationFrame] inc a - cp a, [hl] - jp nz, .animNotDone - dec a ld [vAnimationFrame], a - ld a, 0 - ld [vAnimationState], a + cp a, [hl] + call z, ShuffleAdvanceState + + call ShufflePickAnimation ld a, [vAnimationFrame] -.animNotDone - call ArrayClampLooping + call ArrayClamp ld [vAnimationFrame], a -.doneWithAnimation - inc hl + 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 @@ -250,27 +353,82 @@ ShuffleUpdate: add hl, bc ; two bytes per entry ; hl points to xy offsets - ld a, 40+16 - add a, [hl] - ld b, a + ld b, [hl] inc hl - ld a, 64+8 - add a, [hl] - ld c, a + ld c, [hl] ld a, 32 ld e, a - ld hl, $c000 + 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 ; safe bytes in hram for dma code to live at + ld de, SAFE_DMA_LOCATION ld a, HIGH(MY_OAM) call RunDMA - ; the card data is loaded asynchronously, initiated in CardReadUpdate - ld hl, SquaresTiles inc hl ld b, 0 @@ -283,10 +441,9 @@ ShuffleDraw: ld b, [hl] ld h, b ld l, c - ld de, $8000+$100*16 + 1*16 ; tile number $101 is the sliding background + ld de, _VRAM+$100*16 + 1*16 ; tile number $101 is the sliding background ld bc, (SquaresTileset8 - SquaresTileset7) / 8 call CopyRangeUnsafeBy8s - ret @@ -329,32 +486,63 @@ OneSwap: ; shuffles once and decrements vshuffleindex 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: +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 diff --git a/main.asm b/main.asm index f921cb1..d08ad60 100644 --- a/main.asm +++ b/main.asm @@ -267,12 +267,13 @@ Loop: ld a, b ; select buttons which were pressed this frame ld [rMYBTN], a ; save that as btn state + call SoundUpdate println "scene update is ", SCENE_UPDATE - 1 call SCENE_UPDATE - 1 ; hope this takes not too many scanlines! - ld b, 144 call AwaitLine + println "scene draw is ", SCENE_DRAW - 1 call SCENE_DRAW - 1 ; hope this takes fewer than 9 scanlines! println "scenee draw call is at ", @ @@ -283,6 +284,8 @@ println "scene draw is ", SCENE_DRAW - 1 call AwaitLine jp Loop + +SoundUpdate: ChangeScene: ; hl should be a pointer to, in sequence, setup update draw teardown ;call SCENE_TEARDOWN - 1 @@ -336,6 +339,18 @@ ArrayClampLooping: ; loops a to be in the array, assuming hl points to the lengt dec a ; then set it to length-1 : ret ; a is return value +ArrayClamp: + cp a, $FF + jp nz, :+ + ld a, 0 + ret +: cp a, [hl] + ret c +: ld a, [hl] + dec a + ret +: + PassList: ; hl has the address of a list. step past it. ld b, 0 diff --git a/source.zip b/source.zip index a935c13c7bd5dd8fc01eded3a25b32cf3a2ab2ba..338c939c3a61ed8eba0a94c921e6859fc009bc24 100644 GIT binary patch delta 6657 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 W;U#|AQJOc6GV?H5P0mjeVEqpTqq9)} delta 2626 zcmb_edu&rx81L(T+X@?l0ei9?Mj3mwrF(Rg4H#pa3u6r2h7ZObx4n03p%2!zlQCdw z0*WDmHslj95RC~E6djW^7>La1A0lGV7#79C^^N1H@ynNJb$XTb>Gkvv##@3~`a85R_)Bgq1uK8dw`U9$?X{PK&1N*% zY(u-xSEvnEqoI>_k(awbvDC*rhwfb1ZWSDKgm#{KN?jCL5un zk76?A(Bg|N)9%kk$~2m7Xz*g{(1nY|dRAuQPitx=5Z+`~->H(3U%fYvp{&={;|&a% zPpG?1488fA`fL_M8{##mau`}tqA8bcTbnf3%b2bIWsNY4q3@4qcBeBma7I%m+m7AT z9JNWd{p$*~vt>eu_Q*_zinnN8#SHB`sy(ofp(VGq`%4)5)2!Pir}D}w-H;r%c7raH z$%UOC=;~9MU-%21kjPNxce+GisPMAxv(yA>RgJ4LW@D{NwXrrFJEFUmig77iH$IcX zWrZGRYAXB^ai3sq~`Gzq&NDA!};LG7$cldaSNnnbf77~2gFt*;Rz1hKMFaf)u=74S)$fTpYgLz|EMovZiraO;etp5C`ve zlg6O8dTFJeKGIN5w~;hCgPomj5lIW@!A-Zg7)&dImzYW{p>9&c=gp9v7Nr>G+AJ1Q zKnz8ed@KE(6aL%`%e2WXJ;`6uT(MT5`Iq6pMUaXgk8p-6r@NJo^MXKlBe7E`)$4Q@ zuo}yW%j=*yk${hM(K?;3E+?_~1w`48GN@~7NdH1wMmY&MT|I<0s^#*!x`@BJroOqd znR4-T5o9M*PC4ljMLOC=okimJc2OJNXyK;(ueso)E!;<#kO8n$3mapdZj-!VXY{&s zoKOP&c%_v~2yNe<5$h-Gjl}Hr;o%Z^ZX5-Rf`Nd~+oQ*BD|Fy+9XA=jyv=dro^%DA zjkNlJp5UNHmz4C7ErH+6hg`g5ggBgFf<9@1X=7_#?Q8ORM0pWt`FgY9^NLYTywS=f zvpBOQTfNvx!$@4Z7IcmaW%RIJI5uP|G>UsElBj39=T924vz?u$+&a3gY&4 zxg67@;aVOz9B7G$Ozbnk_-V42Q#t^2H9N(C!$}GLc>N#H^{N5ghfUVoq%x_kTL#V4IDhH zA$VmzBu^WyI(o3FlCq^yT>+bGsCtQ|psE^J%M#j5eyYUmH&s)l#8_+lL-43yE(f}Ipv>BeBK$Vg}_X03#l zVEKCBe|IMD;77q+@gnHTZZaca4o#t0Qz6hJIrI2x9m{Kz*W0K&v7U~a41#maVUc4911I0fO+>_(Z~ys z%apbWkgf^U-~j=$nc=i#xce0TDgenEb0^b#c@q0q7x_xTd=aKIR)YxXY9p=|VJ0Ju i-pVS~#E3upjln}A5JoyfNt)N{@tO!3Q1ArM@&5pWYcFL0