summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xengine/games/card_flip.asm1614
-rwxr-xr-xgfx/card_flip/card_flip.pal44
-rwxr-xr-xgfx/card_flip/card_flip.tilemapbin0 -> 132 bytes
-rwxr-xr-xgfx/card_flip/card_flip_1.2bpp.lzbin0 -> 402 bytes
-rwxr-xr-xgfx/card_flip/card_flip_1.pngbin0 -> 476 bytes
-rwxr-xr-xgfx/card_flip/card_flip_2.2bpp.lzbin0 -> 612 bytes
-rwxr-xr-xgfx/card_flip/card_flip_2.pngbin0 -> 1283 bytes
-rwxr-xr-xgfx/card_flip/card_flip_3.2bpp.lzbin0 -> 27 bytes
-rwxr-xr-xgfx/card_flip/card_flip_3.pngbin0 -> 99 bytes
-rwxr-xr-xgfx/card_flip/off.2bpp1
-rwxr-xr-xgfx/card_flip/off.pngbin0 -> 79 bytes
-rwxr-xr-xgfx/card_flip/on.2bpp1
-rwxr-xr-xgfx/card_flip/on.pngbin0 -> 79 bytes
-rw-r--r--main.asm6
-rw-r--r--wram.asm18
15 files changed, 1679 insertions, 5 deletions
diff --git a/engine/games/card_flip.asm b/engine/games/card_flip.asm
new file mode 100755
index 00000000..41c7e141
--- /dev/null
+++ b/engine/games/card_flip.asm
@@ -0,0 +1,1614 @@
+CARDFLIP_LIGHT_OFF EQU "♂" ; $ef
+CARDFLIP_LIGHT_ON EQU "♀" ; $f5
+
+CARDFLIP_DECK_SIZE EQU 4 * 6
+
+; two labels below called from inside ./dummy_game.asm
+Unknown_e0908:
+; Graphics for an unused Game Corner
+; game were meant to be here.
+ret_e0908::
+ ret
+
+_CardFlip:
+ ld hl, wOptions
+ set NO_TEXT_SCROLL, [hl]
+ call ClearBGPalettes
+ call ClearTilemap
+ call ClearSprites
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ call DisableLCD
+ call LoadStandardFont
+ call LoadFontsExtra
+
+ ld hl, CardFlipLZ01
+ ld de, vTiles2 tile $00
+ call Decompress
+ ld hl, CardFlipLZ02
+ ld de, vTiles2 tile $3e
+ call Decompress
+ ld hl, CardFlipLZ03
+ ld de, vTiles0 tile $00
+ call Decompress
+ ld hl, CardFlipOffButtonGFX
+ ld de, vTiles0 tile CARDFLIP_LIGHT_OFF
+ ld bc, 1 tiles
+ call CopyBytes
+ ld hl, CardFlipOnButtonGFX
+ ld de, vTiles0 tile CARDFLIP_LIGHT_ON
+ ld bc, 1 tiles
+ call CopyBytes
+
+ call CardFlip_InitTilemap
+ call CardFlip_InitAttrPals
+ call EnableLCD
+ call WaitBGMap2
+ ld a, %11100100
+ call DmgToCgbBGPals
+ lb de, %11100100, %11100100
+ call DmgToCgbObjPals
+ call DelayFrame
+ xor a
+ ld [wJumptableIndex], a
+ ld a, $2
+ ld [wCardFlipCursorY], a
+ ld [wCardFlipCursorX], a
+ ld de, MUSIC_GAME_CORNER
+ call PlayMusic
+.MasterLoop:
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .leavethegame
+ call .CardFlip
+ jr .MasterLoop
+.leavethegame
+ call WaitSFX
+ ld de, SFX_QUIT_SLOTS
+ call PlaySFX
+ call WaitSFX
+ call ClearBGPalettes
+ ld hl, wOptions
+ res 4, [hl]
+ ret
+
+.CardFlip:
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, .Jumptable
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.Jumptable:
+ dw .AskPlayWithThree
+ dw .DeductCoins
+ dw .ChooseACard
+ dw .PlaceYourBet
+ dw .CheckTheCard
+ dw .TabulateTheResult
+ dw .PlayAgain
+ dw .Quit
+
+.Increment:
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+.AskPlayWithThree:
+ ld hl, .CardFlipPlayWithThreeCoinsText
+ call CardFlip_UpdateCoinBalanceDisplay
+ call YesNoBox
+ jr c, .SaidNo
+ call CardFlip_ShuffleDeck
+ call .Increment
+ ret
+
+.SaidNo:
+ ld a, 7
+ ld [wJumptableIndex], a
+ ret
+
+.CardFlipPlayWithThreeCoinsText:
+ text_far _CardFlipPlayWithThreeCoinsText
+ text_end
+
+.DeductCoins:
+ ld a, [wCoins]
+ ld h, a
+ ld a, [wCoins + 1]
+ ld l, a
+ ld a, h
+ and a
+ jr nz, .deduct ; You have at least 256 coins.
+ ld a, l
+ cp 3
+ jr nc, .deduct ; You have at least 3 coins.
+ ld hl, .CardFlipNotEnoughCoinsText
+ call CardFlip_UpdateCoinBalanceDisplay
+ ld a, 7
+ ld [wJumptableIndex], a
+ ret
+
+.deduct
+ ld de, -3
+ add hl, de
+ ld a, h
+ ld [wCoins], a
+ ld a, l
+ ld [wCoins + 1], a
+ ld de, SFX_TRANSACTION
+ call PlaySFX
+ xor a
+ ldh [hBGMapMode], a
+ call CardFlip_PrintCoinBalance
+ ld a, $1
+ ldh [hBGMapMode], a
+ call WaitSFX
+ call .Increment
+ ret
+
+.CardFlipNotEnoughCoinsText:
+ text_far _CardFlipNotEnoughCoinsText
+ text_end
+
+.ChooseACard:
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 0, 0
+ lb bc, 12, 9
+ call CardFlip_FillGreenBox
+ hlcoord 9, 0
+ ld bc, SCREEN_WIDTH
+ ld a, [wCardFlipNumCardsPlayed]
+ call AddNTimes
+ ld [hl], CARDFLIP_LIGHT_ON
+ ld a, $1
+ ldh [hBGMapMode], a
+ ld c, 20
+ call DelayFrames
+ hlcoord 2, 0
+ call PlaceCardFaceDown
+ ld a, $1
+ ldh [hBGMapMode], a
+ ld c, 20
+ call DelayFrames
+ hlcoord 2, 6
+ call PlaceCardFaceDown
+ call WaitBGMap
+ ld hl, .CardFlipChooseACardText
+ call CardFlip_UpdateCoinBalanceDisplay
+ xor a
+ ld [wCardFlipWhichCard], a
+.loop
+ call JoyTextDelay
+ ldh a, [hJoyLast]
+ and A_BUTTON
+ jr nz, .next
+ ld de, SFX_KINESIS
+ call PlaySFX
+ call PlaceOAMCardBorder
+ ld c, 4
+ call DelayFrames
+ ld hl, wCardFlipWhichCard
+ ld a, [hl]
+ xor $1
+ ld [hl], a
+ jr .loop
+
+.next
+ ld de, SFX_SLOT_MACHINE_START
+ call PlaySFX
+ ld a, $3
+.loop2
+ push af
+ call PlaceOAMCardBorder
+ ld c, 4
+ call DelayFrames
+ call ClearSprites
+ ld c, 4
+ call DelayFrames
+ pop af
+ dec a
+ jr nz, .loop2
+ ld hl, wCardFlipWhichCard
+ ld a, [hl]
+ push af
+ xor $1
+ ld [hl], a
+ call GetCoordsOfChosenCard
+ lb bc, 6, 5
+ call CardFlip_FillGreenBox
+ pop af
+ ld [wCardFlipWhichCard], a
+ call .Increment
+ ret
+
+.CardFlipChooseACardText:
+ text_far _CardFlipChooseACardText
+ text_end
+
+.PlaceYourBet:
+ ld hl, .CardFlipPlaceYourBetText
+ call CardFlip_UpdateCoinBalanceDisplay
+.betloop
+ call JoyTextDelay
+ ldh a, [hJoyLast]
+ and A_BUTTON
+ jr nz, .betdone
+ call ChooseCard_HandleJoypad
+ call CardFlip_UpdateCursorOAM
+ call DelayFrame
+ jr .betloop
+
+.betdone
+ call .Increment
+ ret
+
+.CardFlipPlaceYourBetText:
+ text_far _CardFlipPlaceYourBetText
+ text_end
+
+.CheckTheCard:
+ xor a
+ ldh [hVBlankCounter], a
+ call CardFlip_UpdateCursorOAM
+ call WaitSFX
+ ld de, SFX_CHOOSE_A_CARD
+ call PlaySFX
+ call WaitSFX
+ ld a, [wCardFlipNumCardsPlayed]
+ ld e, a
+ ld d, 0
+ ld hl, wDeck
+ add hl, de
+ add hl, de
+ ld a, [wCardFlipWhichCard]
+ ld e, a
+ add hl, de
+ ld a, [hl]
+ ld [wCardFlipFaceUpCard], a
+ ld e, a
+ ld hl, wDiscardPile
+ add hl, de
+ ld [hl], TRUE
+ call GetCoordsOfChosenCard
+ call CardFlip_DisplayCardFaceUp
+ call WaitBGMap2
+ call .Increment
+ ret
+
+.TabulateTheResult:
+ call CardFlip_CheckWinCondition
+ call WaitPressAorB_BlinkCursor
+ call .Increment
+ ret
+
+.PlayAgain:
+ call ClearSprites
+ ld hl, .CardFlipPlayAgainText
+ call CardFlip_UpdateCoinBalanceDisplay
+ call YesNoBox
+ jr nc, .Continue
+ call .Increment
+ ret
+
+.Continue:
+ ld a, [wCardFlipNumCardsPlayed]
+ inc a
+ ld [wCardFlipNumCardsPlayed], a
+ cp 12
+ jr c, .KeepTheCurrentDeck
+ call CardFlip_InitTilemap
+ ld a, $1
+ ldh [hBGMapMode], a
+ call CardFlip_ShuffleDeck
+ ld hl, .CardFlipShuffledText
+ call PrintText
+ jr .LoopAround
+
+.KeepTheCurrentDeck:
+ call CardFlip_BlankDiscardedCardSlot
+
+.LoopAround:
+ ld a, 1
+ ld [wJumptableIndex], a
+ ret
+
+.CardFlipPlayAgainText:
+ text_far _CardFlipPlayAgainText
+ text_end
+
+.CardFlipShuffledText:
+ text_far _CardFlipShuffledText
+ text_end
+
+.Quit:
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+CardFlip_ShuffleDeck:
+ ld hl, wDeck
+ ld bc, CARDFLIP_DECK_SIZE
+ xor a
+ call ByteFill
+ ld de, wDeck
+ ld c, CARDFLIP_DECK_SIZE - 1
+.loop
+ call Random
+ and $1f
+ cp CARDFLIP_DECK_SIZE
+ jr nc, .loop
+ ld l, a
+ ld h, $0
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .loop
+ ld [hl], c
+ dec c
+ jr nz, .loop
+ xor a
+ ld [wCardFlipNumCardsPlayed], a
+ ld hl, wDiscardPile
+ ld bc, CARDFLIP_DECK_SIZE
+ call ByteFill
+ ret
+
+CollapseCursorPosition:
+ ld hl, 0
+ ld bc, 6
+ ld a, [wCardFlipCursorY]
+ call AddNTimes
+ ld b, $0
+ ld a, [wCardFlipCursorX]
+ ld c, a
+ add hl, bc
+ ret
+
+GetCoordsOfChosenCard:
+ ld a, [wCardFlipWhichCard]
+ and a
+ jr nz, .BottomCard
+ hlcoord 2, 0
+ bcpixel 2, 3
+ jr .done
+
+.BottomCard:
+ hlcoord 2, 6
+ bcpixel 8, 3
+
+.done
+ ret
+
+PlaceCardFaceDown:
+ xor a
+ ldh [hBGMapMode], a
+ ld de, .FaceDownCardTilemap
+ lb bc, 6, 5
+ call CardFlip_CopyToBox
+ ret
+
+.FaceDownCardTilemap:
+ db $08, $09, $09, $09, $0a
+ db $0b, $28, $2b, $28, $0c
+ db $0b, $2c, $2d, $2e, $0c
+ db $0b, $2f, $30, $31, $0c
+ db $0b, $32, $33, $34, $0c
+ db $0d, $0e, $0e, $0e, $0f
+
+CardFlip_DisplayCardFaceUp:
+ xor a
+ ldh [hBGMapMode], a
+ push hl
+ push hl
+ ; Flip the card face up.
+ ld de, .FaceUpCardTilemap
+ lb bc, 6, 5
+ call CardFlip_CopyToBox
+
+ ; Get the level and species of the upturned card.
+ ld a, [wCardFlipFaceUpCard]
+ ld e, a
+ ld d, 0
+ ld hl, .Deck
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld e, a
+ ld d, [hl]
+
+ ; Place the level.
+ pop hl
+ ld bc, 3 + SCREEN_WIDTH
+ add hl, bc
+ ld [hl], e
+
+ ; Place the Pokepic.
+ ld bc, SCREEN_HEIGHT
+ add hl, bc
+ ld a, d
+ ld de, SCREEN_WIDTH
+ ld b, 3
+.row
+ push hl
+ ld c, 3
+.col
+ ld [hli], a
+ inc a
+ dec c
+ jr nz, .col
+ pop hl
+ add hl, de
+ dec b
+ jr nz, .row
+ pop hl
+
+ ; Pointless CGB check
+ ldh a, [hCGB]
+ and a
+ ret z
+
+ ; Set the attributes
+ ld de, wAttrmap - wTilemap
+ add hl, de
+ ld a, [wCardFlipFaceUpCard]
+ and 3
+ inc a
+ lb bc, 6, 5
+ call CardFlip_FillBox
+ ret
+
+.FaceUpCardTilemap:
+ db $18, $19, $19, $19, $1a
+ db $1b, $35, $7f, $7f, $1c
+ db $0b, $28, $28, $28, $0c
+ db $0b, $28, $28, $28, $0c
+ db $0b, $28, $28, $28, $0c
+ db $1d, $1e, $1e, $1e, $1f
+
+.Deck:
+ ; level, pic anchor (3x3)
+ db "1", $4e, "1", $57, "1", $69, "1", $60
+ db "2", $4e, "2", $57, "2", $69, "2", $60
+ db "3", $4e, "3", $57, "3", $69, "3", $60
+ db "4", $4e, "4", $57, "4", $69, "4", $60
+ db "5", $4e, "5", $57, "5", $69, "5", $60
+ db "6", $4e, "6", $57, "6", $69, "6", $60
+
+CardFlip_UpdateCoinBalanceDisplay:
+ push hl
+ hlcoord 0, 12
+ ld b, 4
+ ld c, SCREEN_WIDTH - 2
+ call Textbox
+ pop hl
+ call PrintTextboxText
+ call CardFlip_PrintCoinBalance
+ ret
+
+CardFlip_PrintCoinBalance:
+ hlcoord 9, 15
+ ld bc, $0109
+ call Textbox
+ hlcoord 10, 16
+ ld de, .CoinStr
+ call PlaceString
+ hlcoord 15, 16
+ ld de, wCoins
+ lb bc, PRINTNUM_LEADINGZEROS | 2, 4
+ call PrintNum
+ ret
+
+.CoinStr:
+ db "COIN@"
+
+CardFlip_InitTilemap:
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ ld a, $29
+ call ByteFill
+ hlcoord 9, 0
+ ld de, CardFlipTilemap
+ lb bc, 12, 11
+ call CardFlip_CopyToBox
+ hlcoord 0, 12
+ lb bc, 4, 18
+ call Textbox
+ ret
+
+CardFlip_FillGreenBox:
+ ld a, $29
+
+CardFlip_FillBox:
+.row
+ push bc
+ push hl
+.col
+ ld [hli], a
+ dec c
+ jr nz, .col
+ pop hl
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .row
+ ret
+
+CardFlip_CopyToBox:
+.row
+ push bc
+ push hl
+.col
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .col
+ pop hl
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .row
+ ret
+
+CardFlip_CopyOAM:
+ ld de, wVirtualOAMSprite00
+ ld a, [hli]
+.loop
+ push af
+ ld a, [hli]
+ add b
+ ld [de], a ; y
+ inc de
+ ld a, [hli]
+ add c
+ ld [de], a ; x
+ inc de
+ ld a, [hli]
+ ld [de], a ; tile id
+ inc de
+ ld a, [hli]
+ ld [de], a ; attributes
+ inc de
+ pop af
+ dec a
+ jr nz, .loop
+ ret
+
+CardFlip_ShiftDigitsUpOnePixel:
+; The top rows of digits 1-9 become the bottom rows of 0-8,
+; so this routine relies on the top rows being blank.
+ ld de, vTiles0 tile "0"
+ ld hl, vTiles0 tile "0" + 2
+ ld bc, 10 tiles - 2
+ call CopyBytes
+ ld hl, vTiles0 tile "9" + 1 tiles - 2
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ret
+
+CardFlip_BlankDiscardedCardSlot:
+ xor a
+ ldh [hBGMapMode], a
+ ld a, [wCardFlipFaceUpCard]
+ ld e, a
+ ld d, 0
+
+ and 3 ; get mon
+ ld c, a
+ ld b, 0
+
+ ld a, e
+ and $1c ; get level
+ srl a
+ add LOW(.Jumptable)
+ ld l, a
+ ld a, 0
+ adc HIGH(.Jumptable)
+ ld h, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.Jumptable:
+ dw .Level1
+ dw .Level2
+ dw .Level3
+ dw .Level4
+ dw .Level5
+ dw .Level6
+
+.Level1:
+ ld hl, wDiscardPile + 4
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .discarded2
+ hlcoord 13, 3
+ add hl, bc
+ add hl, bc
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $37
+ ret
+
+.discarded2
+ hlcoord 13, 3
+ add hl, bc
+ add hl, bc
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3d
+ ret
+
+.Level2:
+ ld hl, wDiscardPile - 4
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .discarded1
+ hlcoord 13, 4
+ add hl, bc
+ add hl, bc
+ ld [hl], $3b
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+
+.discarded1
+ hlcoord 13, 4
+ add hl, bc
+ add hl, bc
+ ld [hl], $3d
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+
+.Level3:
+ ld hl, wDiscardPile + 4
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .discarded4
+ hlcoord 13, 6
+ add hl, bc
+ add hl, bc
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $38
+ ret
+
+.discarded4
+ hlcoord 13, 6
+ add hl, bc
+ add hl, bc
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3d
+ ret
+
+.Level4:
+ ld hl, wDiscardPile - 4
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .discarded3
+ hlcoord 13, 7
+ add hl, bc
+ add hl, bc
+ ld [hl], $3c
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+
+.discarded3
+ hlcoord 13, 7
+ add hl, bc
+ add hl, bc
+ ld [hl], $3d
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+
+.Level5:
+ ld hl, wDiscardPile + 4
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .discarded6
+ hlcoord 13, 9
+ add hl, bc
+ add hl, bc
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $39
+ ret
+
+.discarded6
+ hlcoord 13, 9
+ add hl, bc
+ add hl, bc
+ ld [hl], $36
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3d
+ ret
+
+.Level6:
+ ld hl, wDiscardPile - 4
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .discarded5
+ hlcoord 13, 10
+ add hl, bc
+ add hl, bc
+ ld [hl], $3c
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+
+.discarded5
+ hlcoord 13, 10
+ add hl, bc
+ add hl, bc
+ ld [hl], $3d
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hl], $3a
+ ret
+
+CardFlip_CheckWinCondition:
+ call CollapseCursorPosition
+ add hl, hl
+ ld de, .Jumptable
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.Jumptable:
+ dw .Impossible
+ dw .Impossible
+ dw .PikaJiggly
+ dw .PikaJiggly
+ dw .PoliOddish
+ dw .PoliOddish
+
+ dw .Impossible
+ dw .Impossible
+ dw .Pikachu
+ dw .Jigglypuff
+ dw .Poliwag
+ dw .Oddish
+
+ dw .OneTwo
+ dw .One
+ dw .PikaOne
+ dw .JigglyOne
+ dw .PoliOne
+ dw .OddOne
+
+ dw .OneTwo
+ dw .Two
+ dw .PikaTwo
+ dw .JigglyTwo
+ dw .PoliTwo
+ dw .OddTwo
+
+ dw .ThreeFour
+ dw .Three
+ dw .PikaThree
+ dw .JigglyThree
+ dw .PoliThree
+ dw .OddThree
+
+ dw .ThreeFour
+ dw .Four
+ dw .PikaFour
+ dw .JigglyFour
+ dw .PoliFour
+ dw .OddFour
+
+ dw .FiveSix
+ dw .Five
+ dw .PikaFive
+ dw .JigglyFive
+ dw .PoliFive
+ dw .OddFive
+
+ dw .FiveSix
+ dw .Six
+ dw .PikaSix
+ dw .JigglySix
+ dw .PoliSix
+ dw .OddSix
+
+.Impossible:
+ jp .Lose
+
+.PikaJiggly:
+ ld a, [wCardFlipFaceUpCard]
+ and $2
+ jp nz, .Lose
+ jr .WinSix
+
+.PoliOddish:
+ ld a, [wCardFlipFaceUpCard]
+ and $2
+ jr nz, .WinSix
+ jp .Lose
+
+.WinSix:
+ ld c, $6
+ ld de, SFX_2ND_PLACE
+ jp .Payout
+
+.OneTwo:
+ ld a, [wCardFlipFaceUpCard]
+ and $18
+ jr z, .WinNine
+ jp .Lose
+
+.ThreeFour:
+ ld a, [wCardFlipFaceUpCard]
+ and $18
+ cp $8
+ jr z, .WinNine
+ jp .Lose
+
+.FiveSix:
+ ld a, [wCardFlipFaceUpCard]
+ and $18
+ cp $10
+ jr z, .WinNine
+ jp .Lose
+
+.WinNine:
+ ld c, $9
+ ld de, SFX_2ND_PLACE
+ jp .Payout
+
+.Pikachu:
+ ld a, [wCardFlipFaceUpCard]
+ and $3
+ jr z, .WinTwelve
+ jp .Lose
+
+.Jigglypuff:
+ ld a, [wCardFlipFaceUpCard]
+ and $3
+ cp $1
+ jr z, .WinTwelve
+ jp .Lose
+
+.Poliwag:
+ ld a, [wCardFlipFaceUpCard]
+ and $3
+ cp $2
+ jr z, .WinTwelve
+ jp .Lose
+
+.Oddish:
+ ld a, [wCardFlipFaceUpCard]
+ and $3
+ cp $3
+ jr z, .WinTwelve
+ jp .Lose
+
+.WinTwelve:
+ ld c, $c
+ ld de, SFX_2ND_PLACE
+ jp .Payout
+
+.One:
+ ld a, [wCardFlipFaceUpCard]
+ and $1c
+ jr z, .WinEighteen
+ jp .Lose
+
+.Two:
+ ld a, [wCardFlipFaceUpCard]
+ and $1c
+ cp $4
+ jr z, .WinEighteen
+ jp .Lose
+
+.Three:
+ ld a, [wCardFlipFaceUpCard]
+ and $1c
+ cp $8
+ jr z, .WinEighteen
+ jp .Lose
+
+.Four:
+ ld a, [wCardFlipFaceUpCard]
+ and $1c
+ cp $c
+ jr z, .WinEighteen
+ jp .Lose
+
+.Five:
+ ld a, [wCardFlipFaceUpCard]
+ and $1c
+ cp $10
+ jr z, .WinEighteen
+ jp .Lose
+
+.Six:
+ ld a, [wCardFlipFaceUpCard]
+ and $1c
+ cp $14
+ jr z, .WinEighteen
+ jp .Lose
+
+.WinEighteen:
+ ld c, $12
+ ld de, SFX_2ND_PLACE
+ jp .Payout
+
+.PikaOne:
+ ld e, $0
+ jr .CheckWin72
+
+.JigglyOne:
+ ld e, $1
+ jr .CheckWin72
+
+.PoliOne:
+ ld e, $2
+ jr .CheckWin72
+
+.OddOne:
+ ld e, $3
+ jr .CheckWin72
+
+.PikaTwo:
+ ld e, $4
+ jr .CheckWin72
+
+.JigglyTwo:
+ ld e, $5
+ jr .CheckWin72
+
+.PoliTwo:
+ ld e, $6
+ jr .CheckWin72
+
+.OddTwo:
+ ld e, $7
+ jr .CheckWin72
+
+.PikaThree:
+ ld e, $8
+ jr .CheckWin72
+
+.JigglyThree:
+ ld e, $9
+ jr .CheckWin72
+
+.PoliThree:
+ ld e, $a
+ jr .CheckWin72
+
+.OddThree:
+ ld e, $b
+ jr .CheckWin72
+
+.PikaFour:
+ ld e, $c
+ jr .CheckWin72
+
+.JigglyFour:
+ ld e, $d
+ jr .CheckWin72
+
+.PoliFour:
+ ld e, $e
+ jr .CheckWin72
+
+.OddFour:
+ ld e, $f
+ jr .CheckWin72
+
+.PikaFive:
+ ld e, $10
+ jr .CheckWin72
+
+.JigglyFive:
+ ld e, $11
+ jr .CheckWin72
+
+.PoliFive:
+ ld e, $12
+ jr .CheckWin72
+
+.OddFive:
+ ld e, $13
+ jr .CheckWin72
+
+.PikaSix:
+ ld e, $14
+ jr .CheckWin72
+
+.JigglySix:
+ ld e, $15
+ jr .CheckWin72
+
+.PoliSix:
+ ld e, $16
+ jr .CheckWin72
+
+.OddSix:
+ ld e, $17
+
+.CheckWin72:
+ ld a, [wCardFlipFaceUpCard]
+ cp e
+ jr nz, .Lose
+ ld c, 72
+ ld de, SFX_2ND_PLACE
+ jr .Payout
+
+.Lose:
+ ld de, SFX_WRONG
+ call PlaySFX
+ ld hl, .CardFlipDarnText
+ call CardFlip_UpdateCoinBalanceDisplay
+ call WaitSFX
+ ret
+
+.Payout:
+ push bc
+ push de
+ ld hl, .CardFlipYeahText
+ call CardFlip_UpdateCoinBalanceDisplay
+ pop de
+ call PlaySFX
+ call WaitSFX
+ pop bc
+.loop
+ push bc
+ call .IsCoinCaseFull
+ jr c, .full
+ call .AddCoinPlaySFX
+
+.full
+ call CardFlip_PrintCoinBalance
+ ld c, 2
+ call DelayFrames
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+
+.CardFlipYeahText:
+ text_far _CardFlipYeahText
+ text_end
+
+.CardFlipDarnText:
+ text_far _CardFlipDarnText
+ text_end
+
+.AddCoinPlaySFX:
+ ld a, [wCoins]
+ ld h, a
+ ld a, [wCoins + 1]
+ ld l, a
+ inc hl
+ ld a, h
+ ld [wCoins], a
+ ld a, l
+ ld [wCoins + 1], a
+ ld de, SFX_PAY_DAY
+ call PlaySFX
+ ret
+
+.IsCoinCaseFull:
+ ld a, [wCoins]
+ cp HIGH(MAX_COINS)
+ jr c, .less
+ jr z, .check_low
+ jr .more
+
+.check_low
+ ld a, [wCoins + 1]
+ cp LOW(MAX_COINS)
+ jr c, .less
+
+.more
+ scf
+ ret
+
+.less
+ and a
+ ret
+
+PlaceOAMCardBorder:
+ call GetCoordsOfChosenCard
+ ld hl, .SpriteData
+ call CardFlip_CopyOAM
+ ret
+
+.SpriteData:
+ db 18
+ dbsprite 0, 0, 0, 0, $04, 0
+ dbsprite 1, 0, 0, 0, $06, 0
+ dbsprite 2, 0, 0, 0, $06, 0
+ dbsprite 3, 0, 0, 0, $06, 0
+ dbsprite 4, 0, 0, 0, $04, 0 | X_FLIP
+
+ dbsprite 0, 1, 0, 0, $05, 0
+ dbsprite 4, 1, 0, 0, $05, 0 | X_FLIP
+
+ dbsprite 0, 2, 0, 0, $05, 0
+ dbsprite 4, 2, 0, 0, $05, 0 | X_FLIP
+
+ dbsprite 0, 3, 0, 0, $05, 0
+ dbsprite 4, 3, 0, 0, $05, 0 | X_FLIP
+
+ dbsprite 0, 4, 0, 0, $05, $00
+ dbsprite 4, 4, 0, 0, $05, 0 | X_FLIP
+
+ dbsprite 0, 5, 0, 0, $04, 0 | Y_FLIP
+ dbsprite 1, 5, 0, 0, $06, 0 | Y_FLIP
+ dbsprite 2, 5, 0, 0, $06, 0 | Y_FLIP
+ dbsprite 3, 5, 0, 0, $06, 0 | Y_FLIP
+ dbsprite 4, 5, 0, 0, $04, 0 | X_FLIP | Y_FLIP
+
+ChooseCard_HandleJoypad:
+ ld hl, hJoyLast
+ ld a, [hl]
+ and D_LEFT
+ jp nz, .d_left
+ ld a, [hl]
+ and D_RIGHT
+ jp nz, .d_right
+ ld a, [hl]
+ and D_UP
+ jp nz, .d_up
+ ld a, [hl]
+ and D_DOWN
+ jp nz, .d_down
+ ret
+
+.d_left
+ ld hl, wCardFlipCursorX
+ ld a, [wCardFlipCursorY]
+ and a
+ jr z, .mon_pair_left
+ cp $1
+ jr z, .mon_group_left
+ ld a, [hl]
+ and a
+ ret z
+ dec [hl]
+ jp .play_sound
+
+.mon_group_left
+ ld a, [hl]
+ cp $3
+ jr c, .left_to_number_gp
+ dec [hl]
+ jp .play_sound
+
+.mon_pair_left
+ ld a, [hl]
+ and $e
+ ld [hl], a
+ cp $3
+ jr c, .left_to_number_gp
+ dec [hl]
+ dec [hl]
+ jp .play_sound
+
+.left_to_number_gp
+ ld a, $2
+ ld [wCardFlipCursorY], a
+ ld a, $1
+ ld [wCardFlipCursorX], a
+ jp .play_sound
+
+.d_right
+ ld hl, wCardFlipCursorX
+ ld a, [wCardFlipCursorY]
+ and a
+ jr z, .mon_pair_right
+ ld a, [hl]
+ cp $5
+ ret nc
+ inc [hl]
+ jr .play_sound
+
+.mon_pair_right
+ ld a, [hl]
+ and $e
+ ld [hl], a
+ cp $4
+ ret nc
+ inc [hl]
+ inc [hl]
+ jr .play_sound
+
+.d_up
+ ld hl, wCardFlipCursorY
+ ld a, [wCardFlipCursorX]
+ and a
+ jr z, .num_pair_up
+ cp $1
+ jr z, .num_gp_up
+ ld a, [hl]
+ and a
+ ret z
+ dec [hl]
+ jr .play_sound
+
+.num_gp_up
+ ld a, [hl]
+ cp $3
+ jr c, .up_to_mon_group
+ dec [hl]
+ jr .play_sound
+
+.num_pair_up
+ ld a, [hl]
+ and $e
+ ld [hl], a
+ cp $3
+ jr c, .up_to_mon_group
+ dec [hl]
+ dec [hl]
+ jr .play_sound
+
+.up_to_mon_group
+ ld a, $1
+ ld [wCardFlipCursorY], a
+ ld a, $2
+ ld [wCardFlipCursorX], a
+ jr .play_sound
+
+.d_down
+ ld hl, wCardFlipCursorY
+ ld a, [wCardFlipCursorX]
+ and a
+ jr z, .num_pair_down
+ ld hl, wCardFlipCursorY
+ ld a, [hl]
+ cp $7
+ ret nc
+ inc [hl]
+ jr .play_sound
+
+.num_pair_down
+ ld a, [hl]
+ and $e
+ ld [hl], a
+ cp $6
+ ret nc
+ inc [hl]
+ inc [hl]
+
+.play_sound
+ ld de, SFX_POKEBALLS_PLACED_ON_TABLE
+ call PlaySFX
+ ret
+
+CardFlip_UpdateCursorOAM:
+ call ClearSprites
+ ldh a, [hCGB]
+ and a
+ jr nz, .skip
+ ldh a, [hVBlankCounter]
+ and $4
+ ret nz
+
+.skip
+ call CollapseCursorPosition
+ add hl, hl
+ add hl, hl
+ ld de, .OAMData
+ add hl, de
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call CardFlip_CopyOAM
+ ret
+
+.OAMData:
+cardflip_cursor: MACRO
+if _NARG >= 5
+ dbpixel \1, \2, \3, \4
+ dw \5
+else
+ dbpixel \1, \2
+ dw \3
+endc
+ENDM
+
+ cardflip_cursor 11, 2, .Impossible
+ cardflip_cursor 12, 2, .Impossible
+ cardflip_cursor 13, 2, .PokeGroupPair
+ cardflip_cursor 13, 2, .PokeGroupPair
+ cardflip_cursor 17, 2, .PokeGroupPair
+ cardflip_cursor 17, 2, .PokeGroupPair
+
+ cardflip_cursor 11, 3, .Impossible
+ cardflip_cursor 12, 3, .Impossible
+ cardflip_cursor 13, 3, .PokeGroup
+ cardflip_cursor 15, 3, .PokeGroup
+ cardflip_cursor 17, 3, .PokeGroup
+ cardflip_cursor 19, 3, .PokeGroup
+
+ cardflip_cursor 11, 5, .NumGroupPair
+ cardflip_cursor 12, 5, .NumGroup
+ cardflip_cursor 13, 5, .SingleTile
+ cardflip_cursor 15, 5, .SingleTile
+ cardflip_cursor 17, 5, .SingleTile
+ cardflip_cursor 19, 5, .SingleTile
+
+ cardflip_cursor 11, 5, .NumGroupPair
+ cardflip_cursor 12, 6, 0, 4, .NumGroup
+ cardflip_cursor 13, 6, 0, 4, .SingleTile
+ cardflip_cursor 15, 6, 0, 4, .SingleTile
+ cardflip_cursor 17, 6, 0, 4, .SingleTile
+ cardflip_cursor 19, 6, 0, 4, .SingleTile
+
+ cardflip_cursor 11, 8, .NumGroupPair
+ cardflip_cursor 12, 8, .NumGroup
+ cardflip_cursor 13, 8, .SingleTile
+ cardflip_cursor 15, 8, .SingleTile
+ cardflip_cursor 17, 8, .SingleTile
+ cardflip_cursor 19, 8, .SingleTile
+
+ cardflip_cursor 11, 8, .NumGroupPair
+ cardflip_cursor 12, 9, 0, 4, .NumGroup
+ cardflip_cursor 13, 9, 0, 4, .SingleTile
+ cardflip_cursor 15, 9, 0, 4, .SingleTile
+ cardflip_cursor 17, 9, 0, 4, .SingleTile
+ cardflip_cursor 19, 9, 0, 4, .SingleTile
+
+ cardflip_cursor 11, 11, .NumGroupPair
+ cardflip_cursor 12, 11, .NumGroup
+ cardflip_cursor 13, 11, .SingleTile
+ cardflip_cursor 15, 11, .SingleTile
+ cardflip_cursor 17, 11, .SingleTile
+ cardflip_cursor 19, 11, .SingleTile
+
+ cardflip_cursor 11, 11, .NumGroupPair
+ cardflip_cursor 12, 12, 0, 4, .NumGroup
+ cardflip_cursor 13, 12, 0, 4, .SingleTile
+ cardflip_cursor 15, 12, 0, 4, .SingleTile
+ cardflip_cursor 17, 12, 0, 4, .SingleTile
+ cardflip_cursor 19, 12, 0, 4, .SingleTile
+
+.SingleTile:
+ db 6
+ dbsprite -1, 0, 7, 0, $00, 0 | PRIORITY
+ dbsprite 0, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 1, 0, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 0, 7, 5, $00, 0 | Y_FLIP | PRIORITY
+ dbsprite 0, 0, 0, 5, $02, 0 | Y_FLIP | PRIORITY
+ dbsprite 1, 0, 0, 5, $03, 0 | PRIORITY
+
+.PokeGroup:
+ db 26
+ dbsprite -1, 0, 7, 0, $00, 0 | PRIORITY
+ dbsprite 0, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 1, 0, 0, 0, $00, 0 | X_FLIP | PRIORITY
+ dbsprite -1, 1, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 1, 0, 0, $01, 0 | X_FLIP | PRIORITY
+ dbsprite -1, 2, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 2, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 3, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 3, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 4, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 4, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 5, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 5, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 6, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 6, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 7, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 7, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 8, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 8, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 9, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 9, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 10, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 10, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 10, 7, 1, $00, 0 | Y_FLIP | PRIORITY
+ dbsprite 0, 10, 0, 1, $02, 0 | Y_FLIP | PRIORITY
+ dbsprite 1, 10, 0, 1, $03, 0 | PRIORITY
+
+.NumGroup:
+ db 20
+ dbsprite -1, 0, 7, 0, $00, 0 | PRIORITY
+ dbsprite 0, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 1, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 2, 0, 0, 0, $03, 0 | PRIORITY
+ dbsprite 3, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 4, 0, 0, 0, $03, 0 | PRIORITY
+ dbsprite 5, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 6, 0, 0, 0, $03, 0 | PRIORITY
+ dbsprite 7, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 8, 0, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 0, 7, 5, $00, 0 | Y_FLIP | PRIORITY
+ dbsprite 0, 0, 0, 5, $02, 0 | Y_FLIP | PRIORITY
+ dbsprite 1, 0, 0, 5, $02, 0 | Y_FLIP | PRIORITY
+ dbsprite 2, 0, 0, 5, $03, 0 | PRIORITY
+ dbsprite 3, 0, 0, 5, $02, 0 | Y_FLIP | PRIORITY
+ dbsprite 4, 0, 0, 5, $03, 0 | PRIORITY
+ dbsprite 5, 0, 0, 5, $02, 0 | Y_FLIP | PRIORITY
+ dbsprite 6, 0, 0, 5, $03, 0 | PRIORITY
+ dbsprite 7, 0, 0, 5, $02, 0 | Y_FLIP | PRIORITY
+ dbsprite 8, 0, 0, 5, $03, 0 | PRIORITY
+
+.NumGroupPair:
+ db 30
+ dbsprite 0, 0, 0, 0, $00, 0 | PRIORITY
+ dbsprite 1, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 2, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 3, 0, 0, 0, $03, 0 | PRIORITY
+ dbsprite 4, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 5, 0, 0, 0, $03, 0 | PRIORITY
+ dbsprite 6, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 7, 0, 0, 0, $03, 0 | PRIORITY
+ dbsprite 8, 0, 0, 0, $02, 0 | PRIORITY
+ dbsprite 9, 0, 0, 0, $03, 0 | PRIORITY
+ dbsprite 0, 1, 0, 0, $01, 0 | PRIORITY
+ dbsprite 3, 1, 0, 0, $03, 0 | PRIORITY
+ dbsprite 5, 1, 0, 0, $03, 0 | PRIORITY
+ dbsprite 7, 1, 0, 0, $03, 0 | PRIORITY
+ dbsprite 9, 1, 0, 0, $03, 0 | PRIORITY
+ dbsprite 0, 2, 0, 0, $01, 0 | PRIORITY
+ dbsprite 3, 2, 0, 0, $03, 0 | PRIORITY
+ dbsprite 5, 2, 0, 0, $03, 0 | PRIORITY
+ dbsprite 7, 2, 0, 0, $03, 0 | PRIORITY
+ dbsprite 9, 2, 0, 0, $03, 0 | PRIORITY
+ dbsprite 0, 2, 0, 1, $00, 0 | Y_FLIP | PRIORITY
+ dbsprite 1, 2, 0, 1, $02, 0 | Y_FLIP | PRIORITY
+ dbsprite 2, 2, 0, 1, $02, 0 | Y_FLIP | PRIORITY
+ dbsprite 3, 2, 0, 1, $03, 0 | PRIORITY
+ dbsprite 4, 2, 0, 1, $03, 0 | PRIORITY
+ dbsprite 5, 2, 0, 1, $03, 0 | PRIORITY
+ dbsprite 6, 2, 0, 1, $03, 0 | PRIORITY
+ dbsprite 7, 2, 0, 1, $03, 0 | PRIORITY
+ dbsprite 8, 2, 0, 1, $03, 0 | PRIORITY
+ dbsprite 9, 2, 0, 1, $03, 0 | PRIORITY
+
+.PokeGroupPair:
+ db 38
+ dbsprite -1, 0, 7, 0, $00, 0 | PRIORITY
+ dbsprite 3, 0, 0, 0, $00, 0 | X_FLIP | PRIORITY
+ dbsprite -1, 1, 7, 0, $01, 0 | PRIORITY
+ dbsprite 3, 1, 0, 0, $01, 0 | X_FLIP | PRIORITY
+ dbsprite -1, 2, 7, 0, $01, 0 | PRIORITY
+ dbsprite 3, 2, 0, 0, $01, 0 | X_FLIP | PRIORITY
+ dbsprite -1, 3, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 3, 0, 0, $03, 0 | PRIORITY
+ dbsprite 3, 3, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 4, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 4, 0, 0, $03, 0 | PRIORITY
+ dbsprite 3, 4, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 5, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 5, 0, 0, $03, 0 | PRIORITY
+ dbsprite 3, 5, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 6, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 6, 0, 0, $03, 0 | PRIORITY
+ dbsprite 3, 6, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 7, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 7, 0, 0, $03, 0 | PRIORITY
+ dbsprite 3, 7, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 8, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 8, 0, 0, $03, 0 | PRIORITY
+ dbsprite 3, 8, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 9, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 9, 0, 0, $03, 0 | PRIORITY
+ dbsprite 3, 9, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 10, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 10, 0, 0, $03, 0 | PRIORITY
+ dbsprite 3, 10, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 11, 7, 0, $01, 0 | PRIORITY
+ dbsprite 1, 11, 0, 0, $03, 0 | PRIORITY
+ dbsprite 3, 11, 0, 0, $03, 0 | PRIORITY
+ dbsprite -1, 11, 7, 1, $00, 0 | Y_FLIP | PRIORITY
+ dbsprite 0, 11, 0, 1, $02, 0 | Y_FLIP | PRIORITY
+ dbsprite 1, 11, 0, 1, $03, 0 | Y_FLIP | PRIORITY
+ dbsprite 2, 11, 0, 1, $02, 0 | Y_FLIP | PRIORITY
+ dbsprite 3, 11, 0, 1, $03, 0 | X_FLIP | Y_FLIP | PRIORITY
+
+.Impossible:
+ db 4
+ dbsprite 0, 0, 0, 0, $00, 0 | PRIORITY
+ dbsprite 1, 0, 0, 0, $00, 0 | X_FLIP | PRIORITY
+ dbsprite 0, 1, 0, 0, $00, 0 | Y_FLIP | PRIORITY
+ dbsprite 1, 1, 0, 0, $00, 0 | X_FLIP | Y_FLIP | PRIORITY
+
+CardFlip_InitAttrPals:
+ ldh a, [hCGB]
+ and a
+ ret z
+
+ hlcoord 0, 0, wAttrmap
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ xor a
+ call ByteFill
+
+ hlcoord 12, 1, wAttrmap
+ lb bc, 2, 2
+ ld a, $1
+ call CardFlip_FillBox
+
+ hlcoord 14, 1, wAttrmap
+ lb bc, 2, 2
+ ld a, $2
+ call CardFlip_FillBox
+
+ hlcoord 16, 1, wAttrmap
+ lb bc, 2, 2
+ ld a, $3
+ call CardFlip_FillBox
+
+ hlcoord 18, 1, wAttrmap
+ lb bc, 2, 2
+ ld a, $4
+ call CardFlip_FillBox
+
+ hlcoord 9, 0, wAttrmap
+ lb bc, 12, 1
+ ld a, $1
+ call CardFlip_FillBox
+
+ ld hl, .palettes
+ ld de, wBGPals1
+ ld bc, 9 palettes
+ call CopyBytes
+ ret
+
+.palettes
+INCLUDE "gfx/card_flip/card_flip.pal"
+
+CardFlipLZ03:
+INCBIN "gfx/card_flip/card_flip_3.2bpp.lz"
+
+CardFlipOffButtonGFX:
+INCBIN "gfx/card_flip/off.2bpp"
+
+CardFlipOnButtonGFX:
+INCBIN "gfx/card_flip/on.2bpp"
+
+CardFlipLZ01:
+INCBIN "gfx/card_flip/card_flip_1.2bpp.lz"
+
+CardFlipLZ02:
+INCBIN "gfx/card_flip/card_flip_2.2bpp.lz"
+
+CardFlipTilemap:
+INCBIN "gfx/card_flip/card_flip.tilemap"
diff --git a/gfx/card_flip/card_flip.pal b/gfx/card_flip/card_flip.pal
new file mode 100755
index 00000000..24c5566f
--- /dev/null
+++ b/gfx/card_flip/card_flip.pal
@@ -0,0 +1,44 @@
+ RGB 31, 31, 31
+ RGB 17, 07, 31
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 29, 25, 00
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 31, 13, 30
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 08, 17, 30
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 08, 31, 08
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 17, 07, 31
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 17, 07, 31
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 17, 07, 31
+ RGB 06, 19, 08
+ RGB 00, 00, 00
+
+ RGB 31, 31, 31
+ RGB 31, 31, 31
+ RGB 31, 00, 00
+ RGB 31, 00, 00
diff --git a/gfx/card_flip/card_flip.tilemap b/gfx/card_flip/card_flip.tilemap
new file mode 100755
index 00000000..f6cdbefb
--- /dev/null
+++ b/gfx/card_flip/card_flip.tilemap
Binary files differ
diff --git a/gfx/card_flip/card_flip_1.2bpp.lz b/gfx/card_flip/card_flip_1.2bpp.lz
new file mode 100755
index 00000000..8a60b966
--- /dev/null
+++ b/gfx/card_flip/card_flip_1.2bpp.lz
Binary files differ
diff --git a/gfx/card_flip/card_flip_1.png b/gfx/card_flip/card_flip_1.png
new file mode 100755
index 00000000..d3bfef22
--- /dev/null
+++ b/gfx/card_flip/card_flip_1.png
Binary files differ
diff --git a/gfx/card_flip/card_flip_2.2bpp.lz b/gfx/card_flip/card_flip_2.2bpp.lz
new file mode 100755
index 00000000..f238c797
--- /dev/null
+++ b/gfx/card_flip/card_flip_2.2bpp.lz
Binary files differ
diff --git a/gfx/card_flip/card_flip_2.png b/gfx/card_flip/card_flip_2.png
new file mode 100755
index 00000000..d7123061
--- /dev/null
+++ b/gfx/card_flip/card_flip_2.png
Binary files differ
diff --git a/gfx/card_flip/card_flip_3.2bpp.lz b/gfx/card_flip/card_flip_3.2bpp.lz
new file mode 100755
index 00000000..12baf9a8
--- /dev/null
+++ b/gfx/card_flip/card_flip_3.2bpp.lz
Binary files differ
diff --git a/gfx/card_flip/card_flip_3.png b/gfx/card_flip/card_flip_3.png
new file mode 100755
index 00000000..22745096
--- /dev/null
+++ b/gfx/card_flip/card_flip_3.png
Binary files differ
diff --git a/gfx/card_flip/off.2bpp b/gfx/card_flip/off.2bpp
new file mode 100755
index 00000000..0e7c66a3
--- /dev/null
+++ b/gfx/card_flip/off.2bpp
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/gfx/card_flip/off.png b/gfx/card_flip/off.png
new file mode 100755
index 00000000..ac588564
--- /dev/null
+++ b/gfx/card_flip/off.png
Binary files differ
diff --git a/gfx/card_flip/on.2bpp b/gfx/card_flip/on.2bpp
new file mode 100755
index 00000000..18497c4f
--- /dev/null
+++ b/gfx/card_flip/on.2bpp
@@ -0,0 +1 @@
+ÁÁÁÁ \ No newline at end of file
diff --git a/gfx/card_flip/on.png b/gfx/card_flip/on.png
new file mode 100755
index 00000000..cea1577e
--- /dev/null
+++ b/gfx/card_flip/on.png
Binary files differ
diff --git a/main.asm b/main.asm
index c3922e1e..dd4e7ab5 100644
--- a/main.asm
+++ b/main.asm
@@ -323,11 +323,7 @@ ret_e0000:
INCLUDE "engine/events/diploma.asm"
INCLUDE "engine/events/print_unown_2.asm"
-
-ret_e0908::
- ret
-_CardFlip::
- dr $e0909, $e199d
+INCLUDE "engine/games/card_flip.asm"
_UnownPuzzle::
dr $e199d, $e2668
diff --git a/wram.asm b/wram.asm
index 63c34287..32911293 100644
--- a/wram.asm
+++ b/wram.asm
@@ -392,6 +392,18 @@ wSlotsDataEnd::
wSlotsEnd::
NEXTU ; c5d0
+; card flip
+wCardFlip:: ; c5d0
+wDeck:: ds 24
+wDeckEnd::
+; c5e8
+wCardFlipNumCardsPlayed:: db
+wCardFlipFaceUpCard:: db
+wDiscardPile:: ds 24
+wDiscardPileEnd::
+wCardFlipEnd::
+
+NEXTU ; c5d0
; unused (engine/gfx/color.asm)
ds 50
@@ -1098,6 +1110,12 @@ wTrainerCardBadgeTileID:: db
wTrainerCardBadgeAttributes:: db
NEXTU ; ce64
+; card flip data
+wCardFlipCursorY:: db
+wCardFlipCursorX:: db
+wCardFlipWhichCard:: db
+
+NEXTU ; ce64
; magnet train
wMagnetTrainOffset:: db
wMagnetTrainPosition:: db