summaryrefslogtreecommitdiff
path: root/src/engine/bank02.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/bank02.asm')
-rw-r--r--src/engine/bank02.asm10076
1 files changed, 0 insertions, 10076 deletions
diff --git a/src/engine/bank02.asm b/src/engine/bank02.asm
deleted file mode 100644
index 0b1f6f7..0000000
--- a/src/engine/bank02.asm
+++ /dev/null
@@ -1,10076 +0,0 @@
-_OpenDuelCheckMenu: ; 8000 (2:4000)
- call ResetCheckMenuCursorPositionAndBlink
- xor a
- ld [wce5e], a
- call DrawWideTextBox
-
-; reset cursor blink
- xor a
- ld [wCheckMenuCursorBlinkCounter], a
- ld hl, CheckMenuData
- call PlaceTextItems
-.loop
- call DoFrame
- call HandleCheckMenuInput
- jr nc, .loop
- cp $ff
- ret z ; B pressed
-
-; A was pressed
- ld a, [wCheckMenuCursorYPosition]
- sla a
- ld b, a
- ld a, [wCheckMenuCursorXPosition]
- add b
- ld hl, .jump_table
- call JumpToFunctionInTable
- jr _OpenDuelCheckMenu
-
-.jump_table
- dw DuelCheckMenu_InPlayArea
- dw DuelCheckMenu_Glossary
- dw DuelCheckMenu_YourPlayArea
- dw DuelCheckMenu_OppPlayArea
-
-; opens the In Play Area submenu
-DuelCheckMenu_InPlayArea: ; 8039 (2:4039)
- xor a
- ld [wInPlayAreaFromSelectButton], a
- farcall OpenInPlayAreaScreen
- ret
-
-; opens the Glossary submenu
-DuelCheckMenu_Glossary: ; 8042 (2:4042)
- farcall OpenGlossaryScreen
- ret
-
-; opens the Your Play Area submenu
-DuelCheckMenu_YourPlayArea: ; 8047 (2:4047)
- call ResetCheckMenuCursorPositionAndBlink
- xor a
- ld [wce5e], a
- ldh a, [hWhoseTurn]
-.draw
- ld h, a
- ld l, a
- call DrawYourOrOppPlayAreaScreen
-
- ld a, [wCheckMenuCursorYPosition]
- sla a
- ld b, a
- ld a, [wCheckMenuCursorXPosition]
- add b
- ld [wYourOrOppPlayAreaLastCursorPosition], a
- ld b, $f8 ; black arrow tile
- call DrawYourOrOppPlayArea_DrawArrows
-
- call DrawWideTextBox
-
-; reset cursor blink
- xor a
- ld [wCheckMenuCursorBlinkCounter], a
- ld hl, YourPlayAreaMenuData
- call PlaceTextItems
-
-.loop
- call DoFrame
- xor a
- call DrawYourOrOppPlayArea_RefreshArrows
- call HandleCheckMenuInput_YourOrOppPlayArea
- jr nc, .loop
-
- call DrawYourOrOppPlayArea_EraseArrows
- cp $ff
- ret z
-
- ld a, [wCheckMenuCursorYPosition]
- sla a
- ld b, a
- ld a, [wCheckMenuCursorXPosition]
- add b
- ld hl, .jump_table
- call JumpToFunctionInTable
- jr .draw
-
-.jump_table
- dw OpenYourOrOppPlayAreaScreen_TurnHolderPlayArea
- dw OpenYourOrOppPlayAreaScreen_TurnHolderHand
- dw OpenYourOrOppPlayAreaScreen_TurnHolderDiscardPile
-
-OpenYourOrOppPlayAreaScreen_TurnHolderPlayArea: ; 809e (2:409e)
- ldh a, [hWhoseTurn]
- push af
- bank1call OpenTurnHolderPlayAreaScreen
- pop af
- ldh [hWhoseTurn], a
- ret
-
-OpenYourOrOppPlayAreaScreen_NonTurnHolderPlayArea: ; 80a8 (2:40a8)
- ldh a, [hWhoseTurn]
- push af
- bank1call OpenNonTurnHolderPlayAreaScreen
- pop af
- ldh [hWhoseTurn], a
- ret
-
-OpenYourOrOppPlayAreaScreen_TurnHolderHand: ; 80b2 (2:40b2)
- ldh a, [hWhoseTurn]
- push af
- bank1call OpenTurnHolderHandScreen_Simple
- pop af
- ldh [hWhoseTurn], a
- ret
-
-OpenYourOrOppPlayAreaScreen_NonTurnHolderHand: ; 80bc (2:40bc)
- ldh a, [hWhoseTurn]
- push af
- bank1call OpenNonTurnHolderHandScreen_Simple
- pop af
- ldh [hWhoseTurn], a
- ret
-
-OpenYourOrOppPlayAreaScreen_TurnHolderDiscardPile: ; 80c6 (2:40c6)
- ldh a, [hWhoseTurn]
- push af
- bank1call OpenTurnHolderDiscardPileScreen
- pop af
- ldh [hWhoseTurn], a
- ret
-
-OpenYourOrOppPlayAreaScreen_NonTurnHolderDiscardPile: ; 80d0 (2:40d0)
- ldh a, [hWhoseTurn]
- push af
- bank1call OpenNonTurnHolderDiscardPileScreen
- pop af
- ldh [hWhoseTurn], a
- ret
-
-; opens the Opp. Play Area submenu
-; if clairvoyance is active, add the option to check
-; opponent's hand
-DuelCheckMenu_OppPlayArea: ; 80da (2:40da)
- call ResetCheckMenuCursorPositionAndBlink
- call IsClairvoyanceActive
- jr c, .clairvoyance1
-
- ld a, %10000000
- ld [wce5e], a
- jr .begin
-.clairvoyance1
- xor a
- ld [wce5e], a
-
-.begin
- ldh a, [hWhoseTurn]
-.turns
- ld l, a
- cp PLAYER_TURN
- jr nz, .opponent
- ld a, OPPONENT_TURN
- ld h, a
- jr .cursor
-.opponent
- ld a, PLAYER_TURN
- ld h, a
-
-.cursor
- call DrawYourOrOppPlayAreaScreen
-
-; convert cursor position and
-; store it in wYourOrOppPlayAreaLastCursorPosition
- ld a, [wCheckMenuCursorYPosition]
- sla a
- ld b, a
- ld a, [wCheckMenuCursorXPosition]
- add b
- add 3
- ld [wYourOrOppPlayAreaLastCursorPosition], a
-
-; draw black arrows in the Play Area
- ld b, $f8 ; black arrow tile
- call DrawYourOrOppPlayArea_DrawArrows
- call DrawWideTextBox
-
-; reset cursor blink
- xor a
- ld [wCheckMenuCursorBlinkCounter], a
-
-; place text items depending on clairvoyance
-; when active, allows to look at opp. hand
- call IsClairvoyanceActive
- jr c, .clairvoyance2
- ld hl, OppPlayAreaMenuData
- call PlaceTextItems
- jr .loop
-.clairvoyance2
- ld hl, OppPlayAreaMenuData_WithClairvoyance
- call PlaceTextItems
-
-; handle input
-.loop
- call DoFrame
- ld a, 1
- call DrawYourOrOppPlayArea_RefreshArrows
- call HandleCheckMenuInput_YourOrOppPlayArea
- jr nc, .loop
- call DrawYourOrOppPlayArea_EraseArrows
- cp $ff
- ret z ; B was pressed
-
-; A was pressed
-; jump to function corresponding to cursor position
- ld a, [wCheckMenuCursorYPosition]
- sla a
- ld b, a
- ld a, [wCheckMenuCursorXPosition]
- add b
- ld hl, .jump_table
- call JumpToFunctionInTable
- jr .turns
-
-.jump_table
- dw OpenYourOrOppPlayAreaScreen_NonTurnHolderPlayArea
- dw OpenYourOrOppPlayAreaScreen_NonTurnHolderHand
- dw OpenYourOrOppPlayAreaScreen_NonTurnHolderDiscardPile
-
-CheckMenuData: ; 8158 (2:4158)
- textitem 2, 14, InPlayAreaText
- textitem 2, 16, YourPlayAreaText
- textitem 12, 14, GlossaryText
- textitem 12, 16, OppPlayAreaText
- db $ff
-
-YourPlayAreaMenuData: ; 8169 (2:4169)
- textitem 2, 14, YourPokemonText
- textitem 12, 14, YourHandText
- textitem 2, 16, YourDiscardPileText2
- db $ff
-
-OppPlayAreaMenuData: ; 8176 (2:4176)
- textitem 2, 14, OpponentsPokemonText
- textitem 2, 16, OpponentsDiscardPileText2
- db $ff
-
-OppPlayAreaMenuData_WithClairvoyance: ; 8176 (2:4176)
- textitem 2, 14, OpponentsPokemonText
- textitem 12, 14, OpponentsHandText
- textitem 2, 16, OpponentsDiscardPileText2
- db $ff
-
-; checks if arrows need to be erased in Your Play Area or Opp. Play Area
-; and draws new arrows upon cursor position change
-; input:
-; a = an initial offset applied to the cursor position (used to adjust
-; for the different layouts of the Your Play Area and Opp. Play Area screens)
-DrawYourOrOppPlayArea_RefreshArrows: ; 818c (2:418c)
- push af
- ld b, a
- add b
- add b
- ld c, a
- ld a, [wCheckMenuCursorYPosition]
- sla a
- ld b, a
- ld a, [wCheckMenuCursorXPosition]
- add b
- add c
-; a = 2 * cursor ycoord + cursor xcoord + 3*a
-
-; if cursor position is different than
-; last position, then update arrows
- ld hl, wYourOrOppPlayAreaLastCursorPosition
- cp [hl]
- jr z, .unchanged
-
-; erase and draw arrows
- call DrawYourOrOppPlayArea_EraseArrows
- ld [wYourOrOppPlayAreaLastCursorPosition], a
- ld b, $f8 ; black arrow tile byte
- call DrawYourOrOppPlayArea_DrawArrows
-
-.unchanged
- pop af
- ret
-
-; write SYM_SPACE to positions tabulated in
-; YourOrOppPlayAreaArrowPositions, with offset calculated from the
-; cursor x and y positions in [wYourOrOppPlayAreaLastCursorPosition]
-; input:
-; [wYourOrOppPlayAreaLastCursorPosition]: cursor position (2*y + x)
-DrawYourOrOppPlayArea_EraseArrows: ; 81af (2:41af)
- push af
- ld a, [wYourOrOppPlayAreaLastCursorPosition]
- ld b, SYM_SPACE ; white tile
- call DrawYourOrOppPlayArea_DrawArrows
- pop af
- ret
-
-; writes tile in b to positions tabulated in
-; YourOrOppPlayAreaArrowPositions, with offset calculated from the
-; cursor x and y positions in a
-; input:
-; a = cursor position (2*y + x)
-; b = byte to draw
-DrawYourOrOppPlayArea_DrawArrows: ; 81ba (2:41ba)
- push bc
- ld hl, YourOrOppPlayAreaArrowPositions
- sla a
- ld c, a
- ld b, $00
- add hl, bc
-; hl points to YourOrOppPlayAreaArrowPositions
-; plus offset corresponding to a
-
-; load hl with draw position pointer
- ld a, [hli]
- ld h, [hl]
- ld l, a
- pop de
-
-.loop
- ld a, [hli]
- cp $ff
- jr z, .done
- ld b, a
- ld a, [hli]
- ld c, a
- ld a, d
- call WriteByteToBGMap0
- jr .loop
-.done
- ret
-
-YourOrOppPlayAreaArrowPositions: ; 81d7 (2:41d7)
- dw YourOrOppPlayAreaArrowPositions_PlayerPokemon
- dw YourOrOppPlayAreaArrowPositions_PlayerHand
- dw YourOrOppPlayAreaArrowPositions_PlayerDiscardPile
- dw YourOrOppPlayAreaArrowPositions_OpponentPokemon
- dw YourOrOppPlayAreaArrowPositions_OpponentHand
- dw YourOrOppPlayAreaArrowPositions_OpponentDiscardPile
-
-YourOrOppPlayAreaArrowPositions_PlayerPokemon: ; 81e3 (2:41e3)
-; x and y coordinates to draw byte
- db 5, 5
- db 0, 10
- db 4, 10
- db 8, 10
- db 12, 10
- db 16, 10
- db $ff
-
-YourOrOppPlayAreaArrowPositions_PlayerHand:
- db 14, 7
- db $ff
-
-YourOrOppPlayAreaArrowPositions_PlayerDiscardPile:
- db 14, 5
- db $ff
-
-YourOrOppPlayAreaArrowPositions_OpponentPokemon:
- db 5, 7
- db 0, 3
- db 4, 3
- db 8, 3
- db 12, 3
- db 16, 3
- db $ff
-
-YourOrOppPlayAreaArrowPositions_OpponentHand:
- db 0, 5
- db $ff
-
-YourOrOppPlayAreaArrowPositions_OpponentDiscardPile:
- db 0, 8
- db $ff
-
-; loads tiles and icons to display Your Play Area / Opp. Play Area screen,
-; and draws the screen according to the turn player
-; input: h -> [wCheckMenuPlayAreaWhichDuelist] and l -> [wCheckMenuPlayAreaWhichLayout]
-DrawYourOrOppPlayAreaScreen: ; 8209 (2:4209)
-; loads the turn holders
- ld a, h
- ld [wCheckMenuPlayAreaWhichDuelist], a
- ld a, l
- ld [wCheckMenuPlayAreaWhichLayout], a
-; fallthrough
-
-; loads tiles and icons to display Your Play Area / Opp. Play Area screen,
-; and draws the screen according to the turn player
-; input: [wCheckMenuPlayAreaWhichDuelist] and [wCheckMenuPlayAreaWhichLayout]
-_DrawYourOrOppPlayAreaScreen: ; 8211 (2:4211)
- xor a
- ld [wTileMapFill], a
- call ZeroObjectPositions
-
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
-
- call DoFrame
- call EmptyScreen
- call Set_OBJ_8x8
- call LoadCursorTile
- call LoadSymbolsFont
- call LoadDeckAndDiscardPileIcons
-
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- cp PLAYER_TURN
- jr nz, .opp_turn1
-
-; print <RAMNAME>'s Play Area
- ld de, wDefaultText
- call CopyPlayerName
- jr .get_text_length
-.opp_turn1
- ld de, wDefaultText
- call CopyOpponentName
-.get_text_length
- ld hl, wDefaultText
-
- call GetTextLengthInTiles
- ld a, 6 ; max name size in tiles
- sub b
- srl a
- add 4
-; a = (6 - name text in tiles) / 2 + 4
- ld d, a ; text horizontal alignment
-
- ld e, 0
- call InitTextPrinting
- ldtx hl, DuelistsPlayAreaText
- ldh a, [hWhoseTurn]
- cp PLAYER_TURN
- jr nz, .opp_turn2
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- cp PLAYER_TURN
- jr nz, .swap
-.opp_turn2
- call PrintTextNoDelay
- jr .draw
-.swap
- call SwapTurn
- call PrintTextNoDelay
- call SwapTurn
-
-.draw
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld b, a
- ld a, [wCheckMenuPlayAreaWhichLayout]
- cp b
- jr nz, .not_equal
-
- ld hl, PrizeCardsCoordinateData_YourOrOppPlayArea.player
- call DrawPlayArea_PrizeCards
- lb de, 6, 2 ; coordinates of player's active card
- call DrawYourOrOppPlayArea_ActiveCardGfx
- lb de, 1, 9 ; coordinates of player's bench cards
- ld c, 4 ; spacing
- call DrawPlayArea_BenchCards
- xor a
- call DrawYourOrOppPlayArea_Icons
- jr .done
-
-.not_equal
- ld hl, PrizeCardsCoordinateData_YourOrOppPlayArea.opponent
- call DrawPlayArea_PrizeCards
- lb de, 6, 5 ; coordinates of opponent's active card
- call DrawYourOrOppPlayArea_ActiveCardGfx
- lb de, 1, 2 ; coordinates of opponent's bench cards
- ld c, 4 ; spacing
- call DrawPlayArea_BenchCards
- ld a, $01
- call DrawYourOrOppPlayArea_Icons
-
-.done
- call EnableLCD
- ret
-
-Func_82b6: ; 82b6 (2:42b6)
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld b, a
- ld a, [wCheckMenuPlayAreaWhichLayout]
- cp b
- jr nz, .not_equal
-
- ld hl, PrizeCardsCoordinateData_YourOrOppPlayArea.player
- call DrawPlayArea_PrizeCards
- ret
-
-.not_equal
- ld hl, PrizeCardsCoordinateData_YourOrOppPlayArea.opponent
- call DrawPlayArea_PrizeCards
- ret
-
-; loads tiles and icons to display the In Play Area screen,
-; and draws the screen
-DrawInPlayAreaScreen: ; 82ce (2:42ce)
- xor a
- ld [wTileMapFill], a
- call ZeroObjectPositions
-
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- call DoFrame
- call EmptyScreen
-
- ld a, CHECK_PLAY_AREA
- ld [wDuelDisplayedScreen], a
- call Set_OBJ_8x8
- call LoadCursorTile
- call LoadSymbolsFont
- call LoadDeckAndDiscardPileIcons
-
- lb de, $80, $9f
- call SetupText
-
-; reset turn holders
- ldh a, [hWhoseTurn]
- ld [wCheckMenuPlayAreaWhichDuelist], a
- ld [wCheckMenuPlayAreaWhichLayout], a
-
-; player prize cards
- ld hl, PrizeCardsCoordinateData_InPlayArea.player
- call DrawPlayArea_PrizeCards
-
-; player bench cards
- lb de, 3, 15
- ld c, 3
- call DrawPlayArea_BenchCards
-
- ld hl, PlayAreaIconCoordinates.player2
- call DrawInPlayArea_Icons
-
- call SwapTurn
- ldh a, [hWhoseTurn]
- ld [wCheckMenuPlayAreaWhichDuelist], a
- call SwapTurn
-
-; opponent prize cards
- ld hl, PrizeCardsCoordinateData_InPlayArea.opponent
- call DrawPlayArea_PrizeCards
-
-; opponent bench cards
- lb de, 3, 0
- ld c, 3
- call DrawPlayArea_BenchCards
-
- call SwapTurn
- ld hl, PlayAreaIconCoordinates.opponent2
- call DrawInPlayArea_Icons
-
- call SwapTurn
- call DrawInPlayArea_ActiveCardGfx
- ret
-
-; draws players prize cards and bench cards
-_DrawPlayersPrizeAndBenchCards: ; 833c (2:433c)
- xor a
- ld [wTileMapFill], a
- call ZeroObjectPositions
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- call DoFrame
- call EmptyScreen
- call LoadSymbolsFont
- call LoadDeckAndDiscardPileIcons
-
-; player cards
- ld a, PLAYER_TURN
- ld [wCheckMenuPlayAreaWhichDuelist], a
- ld [wCheckMenuPlayAreaWhichLayout], a
- ld hl, PrizeCardsCoordinateData_2.player
- call DrawPlayArea_PrizeCards
- lb de, 5, 10 ; coordinates
- ld c, 3 ; spacing
- call DrawPlayArea_BenchCards
-
-; opponent cards
- ld a, OPPONENT_TURN
- ld [wCheckMenuPlayAreaWhichDuelist], a
- ld hl, PrizeCardsCoordinateData_2.opponent
- call DrawPlayArea_PrizeCards
- lb de, 1, 0 ; coordinates
- ld c, 3 ; spacing
- call DrawPlayArea_BenchCards
- ret
-
-; draws the active card gfx at coordinates de
-; of the player (or opponent) depending on wCheckMenuPlayAreaWhichDuelist
-; input:
-; de = coordinates
-DrawYourOrOppPlayArea_ActiveCardGfx: ; 837e (2:437e)
- push de
- ld a, DUELVARS_ARENA_CARD
- ld l, a
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld h, a
- ld a, [hl]
- cp -1
- jr z, .no_pokemon
-
- ld d, a
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld b, a
- ldh a, [hWhoseTurn]
- cp b
- jr nz, .swap
- ld a, d
- call LoadCardDataToBuffer1_FromDeckIndex
- jr .draw
-.swap
- call SwapTurn
- ld a, d
- call LoadCardDataToBuffer1_FromDeckIndex
- call SwapTurn
-
-.draw
- ld de, v0Tiles1 + $20 tiles ; destination offset of loaded gfx
- ld hl, wLoadedCard1Gfx
- ld a, [hli]
- ld h, [hl]
- ld l, a
- lb bc, $30, TILE_SIZE
- call LoadCardGfx
- bank1call SetBGP6OrSGB3ToCardPalette
- bank1call FlushAllPalettesOrSendPal23Packet
- pop de
-
-; draw card gfx
- ld a, $a0
- lb hl, 6, 1
- lb bc, 8, 6
- call FillRectangle
- bank1call ApplyBGP6OrSGB3ToCardImage
- ret
-
-.no_pokemon
- pop de
- ret
-
-; draws player and opponent arena card graphics
-; in the "In Play Area" screen
-DrawInPlayArea_ActiveCardGfx: ; 83cc (2:43cc)
- xor a
- ld [wArenaCardsInPlayArea], a
-
- ld a, DUELVARS_ARENA_CARD
- call GetTurnDuelistVariable
- cp -1 ; no pokemon
- jr z, .opponent1
-
- push af
- ld a, [wArenaCardsInPlayArea]
- or %00000001 ; set the player arena Pokemon bit
- ld [wArenaCardsInPlayArea], a
- pop af
-
-; load card gfx
- call LoadCardDataToBuffer1_FromDeckIndex
- lb de, $8a, $00
- ld hl, wLoadedCard1Gfx
- ld a, [hli]
- ld h, [hl]
- ld l, a
- lb bc, $30, TILE_SIZE
- call LoadCardGfx
- bank1call SetBGP6OrSGB3ToCardPalette
-
-.opponent1
- ld a, DUELVARS_ARENA_CARD
- call GetNonTurnDuelistVariable
- cp -1 ; no pokemon
- jr z, .draw
-
- push af
- ld a, [wArenaCardsInPlayArea]
- or %00000010 ; set the opponent arena Pokemon bit
- ld [wArenaCardsInPlayArea], a
- pop af
-
-; load card gfx
- call SwapTurn
- call LoadCardDataToBuffer1_FromDeckIndex
- lb de, $95, $00
- ld hl, wLoadedCard1Gfx
- ld a, [hli]
- ld h, [hl]
- ld l, a
- lb bc, $30, TILE_SIZE
- call LoadCardGfx
- bank1call SetBGP7OrSGB2ToCardPalette
- call SwapTurn
-
-.draw
- ld a, [wArenaCardsInPlayArea]
- or a
- ret z ; no arena cards in play
-
- bank1call FlushAllPalettesOrSendPal23Packet
- ld a, [wArenaCardsInPlayArea]
- and %00000001 ; test player arena card bit
- jr z, .opponent2
-
-; draw player arena card
- ld a, $a0
- lb de, 6, 9
- lb hl, 6, 1
- lb bc, 8, 6
- call FillRectangle
- bank1call ApplyBGP6OrSGB3ToCardImage
-
-.opponent2
- ld a, [wArenaCardsInPlayArea]
- and %00000010 ; test opponent arena card bit
- ret z
-
-; draw opponent arena card
- call SwapTurn
- ld a, $50
- lb de, 6, 2
- lb hl, 6, 1
- lb bc, 8, 6
- call FillRectangle
- bank1call ApplyBGP7OrSGB2ToCardImage
- call SwapTurn
- ret
-
-; draws prize cards depending on the turn
-; loaded in wCheckMenuPlayAreaWhichDuelist
-; input:
-; hl = pointer to coordinates
-DrawPlayArea_PrizeCards: ; 8464 (2:4464)
- push hl
- call GetDuelInitialPrizesUpperBitsSet
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld h, a
- ld l, DUELVARS_PRIZES
- ld a, [hl]
-
- pop hl
- ld b, 0
- push af
-; loop each prize card
-.loop
- inc b
- ld a, [wDuelInitialPrizes]
- inc a
- cp b
- jr z, .done
-
- pop af
- srl a ; right shift prize cards left
- push af
- jr c, .not_taken
- ld a, $e0 ; tile byte for empty slot
- jr .draw
-.not_taken
- ld a, $dc ; tile byte for card
-.draw
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
-
- push hl
- push bc
- lb hl, $01, $02 ; card tile gfx
- lb bc, 2, 2 ; rectangle size
- call FillRectangle
-
- ld a, [wConsole]
- cp CONSOLE_CGB
- jr nz, .not_cgb
- ld a, $02 ; blue colour
- lb bc, 2, 2
- lb hl, 0, 0
- call BankswitchVRAM1
- call FillRectangle
- call BankswitchVRAM0
-.not_cgb
- pop bc
- pop hl
- jr .loop
-.done
- pop af
- ret
-
-PrizeCardsCoordinateData_YourOrOppPlayArea: ; 84b4 (2:44b4)
-; x and y coordinates for player prize cards
-.player
- db 2, 1
- db 2, 3
- db 4, 1
- db 4, 3
- db 6, 1
- db 6, 3
-; x and y coordinates for opponent prize cards
-.opponent
- db 9, 17
- db 9, 15
- db 7, 17
- db 7, 15
- db 5, 17
- db 5, 15
-
-; used by Func_833c
-PrizeCardsCoordinateData_2: ; 84cc (2:44cc)
-; x and y coordinates for player prize cards
-.player
- db 6, 0
- db 6, 2
- db 8, 0
- db 8, 2
- db 10, 0
- db 10, 2
-; x and y coordinates for opponent prize cards
-.opponent
- db 4, 18
- db 4, 16
- db 2, 18
- db 2, 16
- db 0, 18
- db 0, 16
-
-PrizeCardsCoordinateData_InPlayArea: ; 84e4 (2:44e4)
-; x and y coordinates for player prize cards
-.player
- db 9, 1
- db 9, 3
- db 11, 1
- db 11, 3
- db 13, 1
- db 13, 3
-; x and y coordinates for opponent prize cards
-.opponent
- db 6, 17
- db 6, 15
- db 4, 17
- db 4, 15
- db 2, 17
- db 2, 15
-
-; calculates bits set up to the number of initial prizes, with upper 2 bits set, i.e:
-; 6 prizes: a = %11111111
-; 4 prizes: a = %11001111
-; 3 prizes: a = %11000111
-; 2 prizes: a = %11000011
-GetDuelInitialPrizesUpperBitsSet: ; 84fc (2:44fc)
- ld a, [wDuelInitialPrizes]
- ld b, $01
-.loop
- or a
- jr z, .done
- sla b
- dec a
- jr .loop
-.done
- dec b
- ld a, b
- or %11000000
- ld [wDuelInitialPrizesUpperBitsSet], a
- ret
-
-; draws filled and empty bench slots depending on the turn loaded in wCheckMenuPlayAreaWhichDuelist
-; if wCheckMenuPlayAreaWhichDuelist is different from wCheckMenuPlayAreaWhichLayout adjusts coordinates of the bench slots
-; input:
-; de = coordinates to draw bench
-; c = spacing between slots
-DrawPlayArea_BenchCards: ; 8511 (2:4511)
- ld a, [wCheckMenuPlayAreaWhichLayout]
- ld b, a
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- cp b
- jr z, .skip
-
-; adjust the starting bench position for opponent
- ld a, d
- add c
- add c
- add c
- add c
- ld d, a
- ; d = d + 4 * c
-
-; have the spacing go to the left instead of right
- xor a
- sub c
- ld c, a
- ; c = $ff - c + 1
-
- ld a, [wCheckMenuPlayAreaWhichDuelist]
-.skip
- ld h, a
- ld l, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
- ld b, [hl]
- ld l, DUELVARS_BENCH1_CARD_STAGE
-.loop_1
- dec b ; num of Bench Pokemon left
- jr z, .done
-
- ld a, [hli]
- push hl
- push bc
- sla a
- sla a
- add $e4
-; a holds the correct stage gfx tile
- ld b, a
- push bc
-
- lb hl, 1, 2
- lb bc, 2, 2
- call FillRectangle
-
- ld a, [wConsole]
- cp CONSOLE_CGB
- pop bc
- jr nz, .next
-
- ld a, b
- cp $ec ; tile offset of 2 stage
- jr z, .two_stage
- cp $f0 ; tile offset of 2 stage with no 1 stage
- jr z, .two_stage
-
- ld a, $02 ; blue colour
- jr .palette
-.two_stage
- ld a, $01 ; red colour
-.palette
- lb bc, 2, 2
- lb hl, 0, 0
- call BankswitchVRAM1
- call FillRectangle
- call BankswitchVRAM0
-
-.next ; adjust coordinates for next card
- pop bc
- pop hl
- ld a, d
- add c
- ld d, a
- ; d = d + c
- jr .loop_1
-
-.done
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld h, a
- ld l, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
- ld b, [hl]
- ld a, MAX_PLAY_AREA_POKEMON
- sub b
- ret z ; return if already full
-
- ld b, a
- inc b
-.loop_2
- dec b
- ret z
-
- push bc
- ld a, $f4 ; empty bench slot tile
- lb hl, 1, 2
- lb bc, 2, 2
- call FillRectangle
-
- ld a, [wConsole]
- cp CONSOLE_CGB
- jr nz, .not_cgb
-
- ld a, $02 ; colour
- lb bc, 2, 2
- lb hl, 0, 0
- call BankswitchVRAM1
- call FillRectangle
- call BankswitchVRAM0
-
-.not_cgb
- pop bc
- ld a, d
- add c
- ld d, a
- jr .loop_2
-
-; draws Your/Opp Play Area icons depending on value in a
-; the icons correspond to Deck, Discard Pile, and Hand
-; the corresponding number of cards is printed alongside each icon
-; for "Hand", text is displayed rather than an icon
-; input:
-; a = $00: draws player icons
-; a = $01: draws opponent icons
-DrawYourOrOppPlayArea_Icons: ; 85aa (2:45aa)
- or a
- jr nz, .opponent
- ld hl, PlayAreaIconCoordinates.player1
- jr .draw
-.opponent
- ld hl, PlayAreaIconCoordinates.opponent1
-
-.draw
-; hand icon and value
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld d, a
- ld e, DUELVARS_NUMBER_OF_CARDS_IN_HAND
- ld a, [de]
- ld b, a
- ld a, $d0 ; hand icon, unused?
- call DrawPlayArea_HandText
-
-; deck icon and value
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld d, a
- ld e, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
- ld a, [de]
- ld b, a
- ld a, DECK_SIZE
- sub b
- ld b, a
- ld a, $d4 ; deck icon
- call DrawPlayArea_IconWithValue
-
-; discard pile icon and value
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld d, a
- ld e, DUELVARS_NUMBER_OF_CARDS_IN_DISCARD_PILE
- ld a, [de]
- ld b, a
- ld a, $d8 ; discard pile icon
- call DrawPlayArea_IconWithValue
- ret
-
-; draws the interface icon corresponding to the gfx tile in a
-; also prints the number in decimal corresponding to the value in b
-; the coordinates in screen are given by [hl]
-; input:
-; a = tile for the icon
-; b = value to print alongside icon
-; hl = pointer to coordinates
-DrawPlayArea_IconWithValue: ; 85e1 (2:45e1)
-; drawing the icon
- ld d, [hl]
- inc hl
- ld e, [hl]
- inc hl
- push hl
- push bc
- lb hl, 1, 2
- lb bc, 2, 2
- call FillRectangle
-
- ld a, [wConsole]
- cp CONSOLE_CGB
- jr nz, .skip
-
- ld a, $02
- lb bc, 2, 2
- lb hl, 0, 0
- call BankswitchVRAM1
- call FillRectangle
- call BankswitchVRAM0
-
-.skip
-; adjust coordinate to the lower right
- inc d
- inc d
- inc e
- call InitTextPrinting
- pop bc
- ld a, b
- call CalculateOnesAndTensDigits
-
- ld hl, wOnesAndTensPlace
- ld a, [hli]
- ld b, a
- ld a, [hl]
-
-; loading numerical and cross symbols
- ld hl, wDefaultText
- ld [hl], TX_SYMBOL
- inc hl
- ld [hl], SYM_CROSS
- inc hl
- ld [hl], TX_SYMBOL
- inc hl
- ld [hli], a ; tens place
- ld [hl], TX_SYMBOL
- inc hl
- ld a, b
- ld [hli], a ; ones place
- ld [hl], TX_END
-
-; printing the decimal value
- ld hl, wDefaultText
- call ProcessText
- pop hl
- ret
-
-PlayAreaIconCoordinates: ; 8635 (2:4635)
-; used for "Your/Opp. Play Area" screen
-.player1
- db 15, 7 ; hand
- db 15, 2 ; deck
- db 15, 4 ; discard pile
-.opponent1
- db 1, 5 ; hand
- db 1, 9 ; deck
- db 1, 7 ; discard pile
-
-; used for "In Play Area" screen
-.player2
- db 15, 14
- db 15, 9
- db 15, 11
-.opponent2
- db 0, 2
- db 0, 6
- db 0, 4
-
-; draws In Play Area icons depending on value in a
-; the icons correspond to Deck, Discard Pile, and Hand
-; the corresponding number of cards is printed alongside each icon
-; for "Hand", text is displayed rather than an icon
-; input:
-; a = $00: draws player icons
-; a = $01: draws opponent icons
-DrawInPlayArea_Icons: ; 864d (2:464d)
- ldh a, [hWhoseTurn]
- ld d, a
- ld e, DUELVARS_NUMBER_OF_CARDS_IN_HAND
- ld a, [de]
- ld b, a
- ld a, $d0 ; hand icon, unused?
- call DrawPlayArea_HandText
-
-; deck
- ldh a, [hWhoseTurn]
- ld d, a
- ld e, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
- ld a, [de]
- ld b, a
- ld a, DECK_SIZE
- sub b
- ld b, a
- ld a, $d4 ; deck tile
- call DrawPlayArea_IconWithValue
-
-; discard pile
- ldh a, [hWhoseTurn]
- ld d, a
- ld e, $ed
- ld a, [de]
- ld b, a
- ld a, $d8 ; discard pile tile
- call DrawPlayArea_IconWithValue
- ret
-
-; prints text HandText_2 and a cross with decimal value of b
-; input
-; b = value to print alongside text
-DrawPlayArea_HandText: ; 8676 (2:4676)
- ld d, [hl]
- inc hl
- ld e, [hl]
- inc hl
-
-; text
- push hl
- push bc
- call InitTextPrinting
- ldtx hl, HandText_2
- call ProcessTextFromID
- pop bc
-
-; decimal value
- ld a, b
- call CalculateOnesAndTensDigits
- ld hl, wOnesAndTensPlace
- ld a, [hli]
- ld b, a
- ld a, [hl]
-
- ld hl, wDefaultText
- ld [hl], TX_SYMBOL
- inc hl
- ld [hl], SYM_CROSS
- inc hl
- ld [hl], TX_SYMBOL
- inc hl
- ld [hli], a
- ld [hl], TX_SYMBOL
- inc hl
-
-; draw to screen
- ld a, b
- ld [hli], a
- ld [hl], TX_END
- ld hl, wDefaultText
- call ProcessText
- pop hl
- ret
-
-; handle player input in menu in Your or Opp. Play Area
-; works out which cursor coordinate to go to
-; and sets carry flag if A or B are pressed
-; returns a = $1 if A pressed
-; returns a = $ff if B pressed
-HandleCheckMenuInput_YourOrOppPlayArea: ; 86ac (2:46ac)
- xor a
- ld [wPlaysSfx], a
- ld a, [wCheckMenuCursorXPosition]
- ld d, a
- ld a, [wCheckMenuCursorYPosition]
- ld e, a
-
-; d = cursor x position
-; e = cursor y position
-
- ldh a, [hDPadHeld]
- or a
- jr z, .skip
-
-; pad is pressed
- ld a, [wce5e]
- and %10000000
- ldh a, [hDPadHeld]
- jr nz, .check_vertical
- bit D_LEFT_F, a ; test left button
- jr nz, .horizontal
- bit D_RIGHT_F, a ; test right button
- jr z, .check_vertical
-
-; handle horizontal input
-.horizontal
- ld a, [wce5e]
- and %01111111
- or a
- jr nz, .asm_86dd ; jump if wce5e's lower 7 bits aren't set
- ld a, e
- or a
- jr z, .flip_x ; jump if y is 0
-
-; wce5e = %10000000
-; e = 1
- dec e ; change y position
- jr .flip_x
-
-.asm_86dd
- ld a, e
- or a
- jr nz, .flip_x ; jump if y is not 0
- inc e ; change y position
-.flip_x
- ld a, d
- xor $01 ; flip x position
- ld d, a
- jr .erase
-
-.check_vertical
- bit D_UP_F, a
- jr nz, .vertical
- bit D_DOWN_F, a
- jr z, .skip
-
-; handle vertical input
-.vertical
- ld a, d
- or a
- jr z, .flip_y ; jump if x is 0
- dec d
-.flip_y
- ld a, e
- xor $01 ; flip y position
- ld e, a
-
-.erase
- ld a, TRUE
- ld [wPlaysSfx], a
- push de
- call EraseCheckMenuCursor_YourOrOppPlayArea
- pop de
-
-; update x and y cursor positions
- ld a, d
- ld [wCheckMenuCursorXPosition], a
- ld a, e
- ld [wCheckMenuCursorYPosition], a
-
-; reset cursor blink
- xor a
- ld [wCheckMenuCursorBlinkCounter], a
-
-.skip
- ldh a, [hKeysPressed]
- and A_BUTTON | B_BUTTON
- jr z, .sfx
- and A_BUTTON
- jr nz, .a_pressed
-
-; B pressed
- ld a, $ff ; cancel
- call PlaySFXConfirmOrCancel
- scf
- ret
-
-.a_pressed
- call DisplayCheckMenuCursor_YourOrOppPlayArea
- ld a, $01
- call PlaySFXConfirmOrCancel
- scf
- ret
-
-.sfx
- ld a, [wPlaysSfx]
- or a
- jr z, .draw_cursor
- call PlaySFX
-
-.draw_cursor
- ld hl, wCheckMenuCursorBlinkCounter
- ld a, [hl]
- inc [hl]
- and %00001111
- ret nz ; only update cursor if blink's lower nibble is 0
-
- ld a, SYM_CURSOR_R ; cursor byte
- bit 4, [hl] ; only draw cursor if blink counter's fourth bit is not set
- jr z, DrawCheckMenuCursor_YourOrOppPlayArea
-; fallthrough
-
-; transforms cursor position into coordinates
-; in order to draw byte on menu cursor
-EraseCheckMenuCursor_YourOrOppPlayArea: ; 8741 (2:4741)
- ld a, SYM_SPACE ; white tile
-; fallthrough
-
-; draws in the cursor position
-; input:
-; a = tile byte to draw
-DrawCheckMenuCursor_YourOrOppPlayArea: ; 8743 (2:4743)
- ld e, a
- ld a, 10
- ld l, a
- ld a, [wCheckMenuCursorXPosition]
- ld h, a
- call HtimesL
-; h = 10 * cursor x pos
-
- ld a, l
- add 1
- ld b, a
- ld a, [wCheckMenuCursorYPosition]
- sla a
- add 14
- ld c, a
-; c = 11 + 2 * cursor y pos + 14
-
-; draw tile loaded in e
- ld a, e
- call WriteByteToBGMap0
- or a
- ret
-
-DisplayCheckMenuCursor_YourOrOppPlayArea: ; 8760 (2:4760)
- ld a, SYM_CURSOR_R ; load cursor byte
- jr DrawCheckMenuCursor_YourOrOppPlayArea
-
-; handles Peek Pkmn Power selection menus
-_HandlePeekSelection: ; 8764 (2:4764)
- call Set_OBJ_8x8
- call LoadCursorTile
-; reset wce5c and wIsSwapTurnPending
- xor a
- ld [wce5c], a
- ld [wIsSwapTurnPending], a
-
-; draw play area screen for the turn player
- ldh a, [hWhoseTurn]
- ld h, a
- ld l, a
- call DrawYourOrOppPlayAreaScreen
-
-.check_swap
- ld a, [wIsSwapTurnPending]
- or a
- jr z, .draw_menu_1
-; if wIsSwapTurnPending is TRUE, swap turn
- call SwapTurn
- xor a
- ld [wIsSwapTurnPending], a
-
-; prompt player to choose either own Play Area or opponent's
-.draw_menu_1
- xor a
- ld hl, .PlayAreaMenuParameters
- call InitializeMenuParameters
- call DrawWideTextBox
- ld hl, .YourOrOppPlayAreaData
- call PlaceTextItems
-
-.loop_input_1
- call DoFrame
- call HandleMenuInput
- jr nc, .loop_input_1
- cp -1
- jr z, .loop_input_1 ; can't use B btn
-
- call EraseCursor
- ldh a, [hCurMenuItem]
- or a
- jp nz, .PrepareYourPlayAreaSelection ; jump if not Opp Play Area
-
-; own Play Area was chosen
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld b, a
- ldh a, [hWhoseTurn]
- cp b
- jr z, .text_1
-
-; switch the play area to draw
- ld h, a
- ld l, a
- call DrawYourOrOppPlayAreaScreen
- xor a
- ld [wIsSwapTurnPending], a
-
-.text_1
- call DrawWideTextBox
- lb de, 1, 14
- call InitTextPrinting
- ldtx hl, WhichCardWouldYouLikeToSeeText
- call ProcessTextFromID
-
- xor a
- ld [wYourOrOppPlayAreaCurPosition], a
- ld de, PeekYourPlayAreaTransitionTable
- ld hl, wTransitionTablePtr
- ld [hl], e
- inc hl
- ld [hl], d
-
-.loop_input_2
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- call DoFrame
- call YourOrOppPlayAreaScreen_HandleInput
- jr c, .selection_cancelled
- jr .loop_input_2
-.selection_cancelled
- cp -1
- jr nz, .selection_made
- call ZeroObjectPositionsWithCopyToggleOn
- jr .check_swap
-.selection_made
- ld hl, .SelectionFunctionTable
- call JumpToFunctionInTable
- jr .loop_input_2
-
-.SelectionFunctionTable
-rept 6
- dw .SelectedPrize
-endr
- dw .SelectedOppsHand
- dw .SelectedDeck
-
-.YourOrOppPlayAreaData ; 8808 (2:4808)
- textitem 2, 14, YourPlayAreaText
- textitem 2, 16, OppPlayAreaText
- db $ff
-
-.PlayAreaMenuParameters ; 8811 (2:4811)
- db 1, 14 ; cursor x, cursor y
- db 2 ; y displacement between items
- db 2 ; number of items
- db SYM_CURSOR_R ; cursor tile number
- db SYM_SPACE ; tile behind cursor
- dw NULL ; function pointer if non-0
-
-.SelectedPrize ; 8819 (2:4819)
- ld a, [wYourOrOppPlayAreaCurPosition]
- ld c, a
- ld b, $1
-
-; left-shift b a number of times
-; corresponding to this prize card
-.loop_prize_bitmask
- or a
- jr z, .got_prize_bitmask
- sla b
- dec a
- jr .loop_prize_bitmask
-
-.got_prize_bitmask
- ld a, DUELVARS_PRIZES
- call GetTurnDuelistVariable
- and b
- ret z ; return if prize card taken
-
- ld a, c
- add $40
- ld [wce5c], a
- ld a, c
- add DUELVARS_PRIZE_CARDS
- call GetTurnDuelistVariable
- jr .ShowSelectedCard
-
-.SelectedOppsHand ; 883c (2:483c)
- call CreateHandCardList
- ret c
- ld hl, wDuelTempList
- call ShuffleCards
- ld a, [hl]
- jr .ShowSelectedCard
-
-.SelectedDeck ; 8849 (2:4849)
- call CreateDeckCardList
- ret c
- ld a, %01111111
- ld [wce5c], a
- ld a, [wDuelTempList]
-; fallthrough
-
-; input:
-; a = deck index of card to be loaded
-; output:
-; a = wce5c
-; with upper bit set if turn was swapped
-.ShowSelectedCard ; 8855 (2:4855)
- ld b, a
- ld a, [wce5c]
- or a
- jr nz, .display
- ; if wce5c is not set, set it as input deck index
- ld a, b
- ld [wce5c], a
-.display
- ld a, b
- call LoadCardDataToBuffer1_FromDeckIndex
- call Set_OBJ_8x16
- bank1call OpenCardPage_FromHand
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- pop af
-
-; if wIsSwapTurnPending is TRUE, swap turn
- ld a, [wIsSwapTurnPending]
- or a
- jr z, .dont_swap
- call SwapTurn
- ld a, [wce5c]
- or %10000000
- ret
-.dont_swap
- ld a, [wce5c]
- ret
-
-; prepare menu parameters to handle selection
-; of player's own Play Area
-.PrepareYourPlayAreaSelection: ; 8883 (2:4883)
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld b, a
- ldh a, [hWhoseTurn]
- cp b
- jr nz, .text_2
-
- ld l, a
- cp PLAYER_TURN
- jr nz, .opponent
- ld a, OPPONENT_TURN
- jr .draw_menu_2
-.opponent
- ld a, PLAYER_TURN
-
-.draw_menu_2
- ld h, a
- call DrawYourOrOppPlayAreaScreen
-
-.text_2
- call DrawWideTextBox
- lb de, 1, 14
- call InitTextPrinting
- ldtx hl, WhichCardWouldYouLikeToSeeText
- call ProcessTextFromID
-
- xor a
- ld [wYourOrOppPlayAreaCurPosition], a
- ld de, PeekOppPlayAreaTransitionTable
- ld hl, wTransitionTablePtr
- ld [hl], e
- inc hl
- ld [hl], d
-
- call SwapTurn
- ld a, TRUE
- ld [wIsSwapTurnPending], a ; mark pending to swap turn
- jp .loop_input_2
-
-PeekYourPlayAreaTransitionTable: ; 88c2 (2:48c2)
- cursor_transition $08, $28, $00, $04, $02, $01, $07
- cursor_transition $30, $28, $20, $05, $03, $07, $00
- cursor_transition $08, $38, $00, $00, $04, $03, $07
- cursor_transition $30, $38, $20, $01, $05, $07, $02
- cursor_transition $08, $48, $00, $02, $00, $05, $07
- cursor_transition $30, $48, $20, $03, $01, $07, $04
- cursor_transition $78, $50, $00, $07, $07, $00, $01
- cursor_transition $78, $28, $00, $07, $07, $00, $01
-
-PeekOppPlayAreaTransitionTable: ; 88fa (2:48fa)
- cursor_transition $a0, $60, $20, $02, $04, $07, $01
- cursor_transition $78, $60, $00, $03, $05, $00, $07
- cursor_transition $a0, $50, $20, $04, $00, $06, $03
- cursor_transition $78, $50, $00, $05, $01, $02, $06
- cursor_transition $a0, $40, $20, $00, $02, $06, $05
- cursor_transition $78, $40, $00, $01, $03, $04, $06
- cursor_transition $08, $38, $00, $07, $07, $05, $04
- cursor_transition $08, $60, $00, $06, $06, $01, $00
-
-_DrawAIPeekScreen: ; 8932 (2:4932)
- push bc
- call Set_OBJ_8x8
- call LoadCursorTile
- xor a
- ld [wIsSwapTurnPending], a
- ldh a, [hWhoseTurn]
- ld l, a
- ld de, PeekYourPlayAreaTransitionTable
- pop bc
- bit AI_PEEK_TARGET_HAND_F, b
- jr z, .draw_play_area
-
-; AI chose the hand
- call SwapTurn
- ld a, TRUE
- ld [wIsSwapTurnPending], a ; mark pending to swap turn
- ldh a, [hWhoseTurn]
- ld de, PeekOppPlayAreaTransitionTable
-.draw_play_area
- ld h, a
- push bc
- push de
- call DrawYourOrOppPlayAreaScreen
- pop de
- pop bc
-
-; get the right cursor position
-; depending on what action the AI chose
-; (prize card, hand, deck)
- ld hl, wMenuInputTablePointer
- ld [hl], e
- inc hl
- ld [hl], d
- ld a, b
- and $7f
- cp $7f
- jr nz, .prize_card
-; cursor on the deck
- ld a, $7
- ld [wYourOrOppPlayAreaCurPosition], a
- jr .got_cursor_position
-.prize_card
- bit AI_PEEK_TARGET_PRIZE_F, a
- jr z, .hand
- and $3f
- ld [wYourOrOppPlayAreaCurPosition], a
- jr .got_cursor_position
-.hand
- ld a, $6
- ld [wYourOrOppPlayAreaCurPosition], a
-.got_cursor_position
- call YourOrOppPlayAreaScreen_HandleInput.draw_cursor
-
- ld a, $1
- ld [wVBlankOAMCopyToggle], a
- ld a, [wIsSwapTurnPending]
- or a
- ret z
- call SwapTurn
- ret
-
-LoadCursorTile: ; 8992 (2:4992)
- ld de, v0Tiles0
- ld hl, .tile_data
- ld b, 16
- call SafeCopyDataHLtoDE
- ret
-
-.tile_data: ; 899e (2:499e)
- db $e0, $c0, $98, $b0, $84, $8c, $83, $82
- db $86, $8f, $9d, $be, $f4, $f8, $50, $60
-
-; handles input inside the "Your Play Area" or "Opp Play Area" screens
-; returns carry if either A or B button were pressed
-; returns -1 in a if B button was pressed
-YourOrOppPlayAreaScreen_HandleInput: ; 89ae (2:49ae)
- xor a
- ld [wPlaysSfx], a
-
-; get the transition data for the prize card with cursor
- ld hl, wTransitionTablePtr
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld a, [wYourOrOppPlayAreaCurPosition]
- ld [wPrizeCardCursorTemporaryPosition], a
- ld l, a
- ld h, 7 ; length of each transition table item
- call HtimesL
- add hl, de
-
-; get the transition index related to the directional input
- ldh a, [hDPadHeld]
- or a
- jp z, .check_button
- inc hl
- inc hl
- inc hl
-
- bit D_UP_F, a
- jr z, .else_if_down
-
- ; up
- ld a, [hl]
- jr .process_dpad
-
-.else_if_down
- inc hl
- bit D_DOWN_F, a
- jr z, .else_if_right
-
- ; down
- ld a, [hl]
- jr .process_dpad
-
-.else_if_right
- inc hl
- bit D_RIGHT_F, a
- jr z, .else_if_left
-
- ; right
- ld a, [hl]
- jr .process_dpad
-
-.else_if_left
- inc hl
- bit D_LEFT_F, a
- jr z, .check_button
-
- ; left
- ld a, [hl]
-.process_dpad
- ld [wYourOrOppPlayAreaCurPosition], a
- cp $8 ; if a >= 0x8
- jr nc, .next
- ld b, $1
-
-; this loop equals to
-; b = (1 << a)
-.make_bitmask_loop
- or a
- jr z, .make_bitmask_done
- sla b
- dec a
- jr .make_bitmask_loop
-
-.make_bitmask_done
-; check if the moved cursor refers to an existing item.
-; it's always true when this function was called from the glossary procedure.
- ld a, [wDuelInitialPrizesUpperBitsSet]
- and b
- jr nz, .next
-
-; when no cards exist at the cursor,
- ld a, [wPrizeCardCursorTemporaryPosition]
- cp $06
- jr nz, YourOrOppPlayAreaScreen_HandleInput
- ; move once more in the direction (recursively) until it reaches an existing item.
-
-; check if one of the dpad, left or right, is pressed.
-; if not, just go back to the start.
- ldh a, [hDPadHeld]
- bit D_RIGHT_F, a
- jr nz, .left_or_right
- bit D_LEFT_F, a
- jr z, YourOrOppPlayAreaScreen_HandleInput
-
-.left_or_right
- ; if started with 5 or 6 prize cards
- ; can switch sides normally,
- ld a, [wDuelInitialPrizes]
- cp PRIZES_5
- jr nc, .next
- ; else if it's last card,
- ld a, [wYourOrOppPlayAreaCurPosition]
- cp 5
- jr nz, .not_last_card
- ; place it at pos 3
- ld a, 3
- ld [wYourOrOppPlayAreaCurPosition], a
- jr .ok
-.not_last_card
- ; otherwise place at pos 2
- ld a, 2
- ld [wYourOrOppPlayAreaCurPosition], a
-
-.ok
- ld a, [wDuelInitialPrizes]
- cp PRIZES_3
- jr nc, .handled_cursor_pos
- ; in this case can just sub 2 from pos
- ld a, [wYourOrOppPlayAreaCurPosition]
- sub 2
- ld [wYourOrOppPlayAreaCurPosition], a
-
-.handled_cursor_pos
- ld a, [wYourOrOppPlayAreaCurPosition]
- ld [wPrizeCardCursorTemporaryPosition], a
- ld b, $1
- jr .make_bitmask_loop
-
-.next
- ld a, TRUE
- ld [wPlaysSfx], a
-
-; reset cursor blink
- xor a
- ld [wCheckMenuCursorBlinkCounter], a
-.check_button
- ldh a, [hKeysPressed]
- and A_BUTTON | B_BUTTON
- jr z, .return
-
- and A_BUTTON
- jr nz, .a_button
-
- ld a, -1 ; cancel
- call PlaySFXConfirmOrCancel
- scf
- ret
-
-.a_button
- call .draw_cursor
- ld a, $01
- call PlaySFXConfirmOrCancel
- ld a, [wYourOrOppPlayAreaCurPosition]
- scf
- ret
-
-.return
- ld a, [wPlaysSfx]
- or a
- jr z, .skip_sfx
- call PlaySFX
-.skip_sfx
- ld hl, wCheckMenuCursorBlinkCounter
- ld a, [hl]
- inc [hl]
- and (1 << 4) - 1
- ret nz
- bit 4, [hl]
- jr nz, ZeroObjectPositionsWithCopyToggleOn
-
-.draw_cursor
- call ZeroObjectPositions
- ld hl, wTransitionTablePtr
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld a, [wYourOrOppPlayAreaCurPosition]
- ld l, a
- ld h, 7
- call HtimesL
- add hl, de
-; hl = [wTransitionTablePtr] + 7 * wce52
-
- ld d, [hl]
- inc hl
- ld e, [hl]
- inc hl
- ld b, [hl]
- ld c, $00
- call SetOneObjectAttributes
- or a
- ret
-
-ZeroObjectPositionsWithCopyToggleOn: ; 8aa1 (2:4aa1)
- call ZeroObjectPositions
-
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- ret
-
-; handles the screen for Player to select prize card(s)
-_SelectPrizeCards: ; 8aaa (2:4aaa)
- xor a
- call GetFirstSetPrizeCard
- ld [wYourOrOppPlayAreaCurPosition], a
- ld de, hTempPlayAreaLocation_ffa1
- ld hl, wSelectedPrizeCardListPtr
- ld [hl], e
- inc hl
- ld [hl], d
-
-.check_prize_cards_to_select
- ld a, [wNumberOfPrizeCardsToSelect]
- or a
- jr z, .done_selection
- ld a, DUELVARS_PRIZES
- call GetTurnDuelistVariable
- or a
- jr nz, .got_prizes
-
-.done_selection
- ld a, DUELVARS_PRIZES
- call GetTurnDuelistVariable
- ldh [hTemp_ffa0], a
- ld a, [wSelectedPrizeCardListPtr + 0]
- ld l, a
- ld a, [wSelectedPrizeCardListPtr + 1]
- ld h, a
- ld [hl], $ff
- ret
-
-.got_prizes
- ldh a, [hWhoseTurn]
- ld h, a
- ld l, a
- call DrawYourOrOppPlayAreaScreen
- call DrawWideTextBox
- lb de, 1, 14
- call InitTextPrinting
- ldtx hl, PleaseChooseAPrizeText
- call ProcessTextFromID
- ld de, .cursor_transition_table
- ld hl, wMenuInputTablePointer
- ld [hl], e
- inc hl
- ld [hl], d
-.loop_handle_input
- ld a, $1
- ld [wVBlankOAMCopyToggle], a
- call DoFrame
- call YourOrOppPlayAreaScreen_HandleInput
- jr nc, .loop_handle_input
- cp $ff
- jr z, .loop_handle_input
-
- call ZeroObjectPositionsWithCopyToggleOn
-
-; get prize bit mask that corresponds
-; to the one pointed by the cursor
- ld a, [wYourOrOppPlayAreaCurPosition]
- ld c, a
- ld b, $1
-.loop
- or a
- jr z, .got_prize_mask
- sla b
- dec a
- jr .loop
-
-.got_prize_mask
- ; if cursor prize is not set,
- ; then return to input loop
- ld a, DUELVARS_PRIZES
- call GetTurnDuelistVariable
- and b
- jp z, .loop_handle_input ; can be jr
-
- ; remove prize
- ld a, DUELVARS_PRIZES
- call GetTurnDuelistVariable
- sub b
- ld [hl], a
-
- ; get its deck index
- ld a, c
- add DUELVARS_PRIZE_CARDS
- call GetTurnDuelistVariable
-
- ld hl, wSelectedPrizeCardListPtr
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld [de], a ; store deck index
- inc de
- ld [hl], d
- dec hl
- ld [hl], e
-
- ; add prize card to hand
- call AddCardToHand
- call LoadCardDataToBuffer1_FromDeckIndex
- call Set_OBJ_8x16
- bank1call OpenCardPage_FromHand
- ld a, [wNumberOfPrizeCardsToSelect]
- dec a
- ld [wNumberOfPrizeCardsToSelect], a
- ld a, [wYourOrOppPlayAreaCurPosition]
- call GetFirstSetPrizeCard
- ld [wYourOrOppPlayAreaCurPosition], a
- jp .check_prize_cards_to_select
-
-.cursor_transition_table
- cursor_transition $08, $28, $00, $04, $02, $01, $01
- cursor_transition $30, $28, $20, $05, $03, $00, $00
- cursor_transition $08, $38, $00, $00, $04, $03, $03
- cursor_transition $30, $38, $20, $01, $05, $02, $02
- cursor_transition $08, $48, $00, $02, $00, $05, $05
- cursor_transition $30, $48, $20, $03, $01, $04, $04
-
-_DrawPlayAreaToPlacePrizeCards: ; 8b85 (2:4b85)
- xor a
- ld [wTileMapFill], a
- call ZeroObjectPositions
- call EmptyScreen
- call LoadSymbolsFont
- call LoadPlacingThePrizesScreenTiles
-
- ldh a, [hWhoseTurn]
- ld [wCheckMenuPlayAreaWhichLayout], a
- ld [wCheckMenuPlayAreaWhichDuelist], a
-
- lb de, 0, 10
- ld c, 3
- call DrawPlayArea_BenchCards
- ld hl, .player_icon_coordinates
- call DrawYourOrOppPlayArea_Icons.draw
- lb de, 8, 6
- ld a, $a0
- lb hl, 1, 4
- lb bc, 4, 3
- call FillRectangle
-
- call SwapTurn
- ld a, TRUE
- ld [wIsSwapTurnPending], a ; mark pending to swap turn
- ldh a, [hWhoseTurn]
- ld [wCheckMenuPlayAreaWhichDuelist], a
- lb de, 6, 0
- ld c, 3
- call DrawPlayArea_BenchCards
- ld hl, .opp_icon_coordinates
- call DrawYourOrOppPlayArea_Icons.draw
- lb de, 8, 3
- ld a, $a0
- lb hl, 1, 4
- lb bc, 4, 3
- call FillRectangle
- call SwapTurn
- ret
-
-.player_icon_coordinates
- db 15, 11
- db 15, 6
- db 15, 8
-
-.opp_icon_coordinates
- db 0, 0
- db 0, 4
- db 0, 2
-
-; seems like a function to draw prize cards
-; given a list of coordinates in hl
-; unreferenced?
-; hl = pointer to coords
-Func_8bf2: ; 8bf2 (2:4bf2)
- push hl
- ld a, [wCheckMenuPlayAreaWhichDuelist]
- ld h, a
- ld l, DUELVARS_PRIZES
- ld a, [hl]
- pop hl
-
- ld b, 0
- push af
-.loop_prize_cards
- inc b
- ld a, [wDuelInitialPrizes]
- inc a
- cp b
- jr z, .done
- pop af
- srl a
- push af
- jr c, .not_taken
- ; same tile whether the prize card is taken or not
- ld a, $ac
- jr .got_tile
-.not_taken
- ld a, $ac
-.got_tile
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
- push hl
- push bc
- lb hl, 0, 0
- lb bc, 1, 1
- call FillRectangle
- ld a, [wConsole]
- cp CONSOLE_CGB
- jr nz, .skip_pal
- ld a, $02
- lb bc, 1, 1
- lb hl, 0, 0
- call BankswitchVRAM1
- call FillRectangle
- call BankswitchVRAM0
-.skip_pal
- pop bc
- pop hl
- jr .loop_prize_cards
-.done
- pop af
- ret
-
-; unknown data
-; unreferenced?
-Data_8c3f: ; 8c3f (6:4c3f)
- db $06, $05, $06, $06, $07, $05, $07, $06
- db $08, $05, $08, $06, $05, $0e, $05, $0d
- db $04, $0e, $04, $0d, $03, $0e, $03, $0d
-
-; gets the first prize card index that is set
-; beginning from index in register a
-; a = prize card index
-GetFirstSetPrizeCard: ; 8c57 (2:4c57)
- push bc
- push de
- push hl
- ld e, PRIZES_6
- ld c, a
- ldh a, [hWhoseTurn]
- ld h, a
- ld l, DUELVARS_PRIZES
- ld d, [hl]
-.loop_prizes
- call .GetPrizeMask
- and d
- jr nz, .done ; prize is set
- dec e
- jr nz, .next_prize
- ld c, 0
- jr .done
-.next_prize
- inc c
- ld a, PRIZES_6
- cp c
- jr nz, .loop_prizes
- ld c, 0
- jr .loop_prizes
-
-.done
- ld a, c ; first prize index that is set
- pop hl
- pop de
- pop bc
- ret
-
-; returns 1 shifted left by c bits
-.GetPrizeMask
- push bc
- ld a, c
- ld b, $1
-.loop
- or a
- jr z, .got_mask
- sla b
- dec a
- jr .loop
-.got_mask
- ld a, b
- pop bc
- ret
-
-OpenGlossaryScreen_TransitionTable: ; 8c8e (2:4c8e)
- cursor_transition $08, $28, $00, $04, $01, $05, $05
- cursor_transition $08, $38, $00, $00, $02, $06, $06
- cursor_transition $08, $48, $00, $01, $03, $07, $07
- cursor_transition $08, $58, $00, $02, $04, $08, $08
- cursor_transition $08, $68, $00, $03, $00, $09, $09
- cursor_transition $58, $28, $00, $09, $06, $00, $00
- cursor_transition $58, $38, $00, $05, $07, $01, $01
- cursor_transition $58, $48, $00, $06, $08, $02, $02
- cursor_transition $58, $58, $00, $07, $09, $03, $03
- cursor_transition $58, $68, $00, $08, $05, $04, $04
-
-; copies DECK_SIZE number of cards from de to hl in SRAM
-CopyDeckFromSRAM: ; 8cd4 (2:4cd4)
- push bc
- call EnableSRAM
- ld b, DECK_SIZE
-.loop
- ld a, [de]
- inc de
- ld [hli], a
- dec b
- jr nz, .loop
- xor a
- ld [hl], a
- call DisableSRAM
- pop bc
- ret
-
-; clears some WRAM addresses to act as
-; terminator bytes to wFilteredCardList and wCurDeckCards
-WriteCardListsTerminatorBytes: ; 8ce7 (2:4ce7)
- xor a
- ld hl, wFilteredCardList
- ld bc, DECK_SIZE
- add hl, bc
- ld [hl], a ; wcf16
- ld hl, wCurDeckCards
- ld bc, DECK_CONFIG_BUFFER_SIZE
- add hl, bc
- ld [hl], a ; wCurDeckCardsTerminator
- ret
-
-; inits some SRAM addresses
-Func_8cf9: ; 8cf9 (2:4cf9)
- call EnableSRAM
- xor a
- ld hl, sHasPromotionalCards
- ld [hli], a
- inc a ; $1
- ld [hli], a ; sb704
- ld [hli], a
- ld [hl], a
- ld [sUnnamedDeckCounter], a
- call DisableSRAM
-; ret missing
-; unintentional fallthrough
-
-; loads the Hard Cards icon gfx to v0Tiles2
-LoadHandCardsIcon: ; 8d0b (2:4d0b)
- ld hl, HandCardsGfx
- ld de, v0Tiles2 + $38 tiles
- call CopyListFromHLToDE
- ret
-
-HandCardsGfx: ; 8d15 (2:4d15)
- INCBIN "gfx/hand_cards.2bpp"
- db $00 ; end of data
-
-EmptyScreenAndLoadFontDuelAndHandCardsIcons: ; 8d56 (2:4d56)
- xor a
- ld [wTileMapFill], a
- call EmptyScreen
- call ZeroObjectPositions
- ld a, $1
- ld [wVBlankOAMCopyToggle], a
- call LoadSymbolsFont
- call LoadDuelCardSymbolTiles
- call LoadHandCardsIcon
- bank1call SetDefaultPalettes
- lb de, $3c, $bf
- call SetupText
- ret
-
-; empties screen, zeroes object positions,
-; loads cursor tile, symbol fonts, duel card symbols
-; hand card icon and sets default palettes
-Func_8d78: ; 8d78 (2:4d78)
- xor a
- ld [wTileMapFill], a
- call ZeroObjectPositions
- call EmptyScreen
- ld a, $1
- ld [wVBlankOAMCopyToggle], a
- call LoadCursorTile
- call LoadSymbolsFont
- call LoadDuelCardSymbolTiles
- call LoadHandCardsIcon
- bank1call SetDefaultPalettes
- lb de, $3c, $bf
- call SetupText
- ret
-
-; inits the following deck building params from hl:
-; wMaxNumCardsAllowed
-; wSameNameCardsLimit
-; wIncludeCardsInDeck
-; wDeckConfigurationMenuHandlerFunction
-; wDeckConfigurationMenuTransitionTable
-InitDeckBuildingParams: ; 8d9d (2:4d9d)
- ld de, wMaxNumCardsAllowed
- ld b, $7
-.loop
- ld a, [hli]
- ld [de], a
- inc de
- dec b
- jr nz, .loop
- ret
-
-DeckBuildingParams: ; 8da9 (2:4da9)
- db DECK_CONFIG_BUFFER_SIZE ; max number of cards
- db MAX_NUM_SAME_NAME_CARDS ; max number of same name cards
- db TRUE ; whether to include deck cards
- dw HandleDeckConfigurationMenu
- dw DeckConfigurationMenu_TransitionTable
-
-DeckSelectionMenu: ; 8db0 (2:4db0)
- ld hl, DeckBuildingParams
- call InitDeckBuildingParams
- ld a, ALL_DECKS
- call DrawDecksScreen
- xor a
-
-.init_menu_params
- ld hl, .DeckSelectionMenuParameters
- call InitializeMenuParameters
- ldtx hl, PleaseSelectDeckText
- call DrawWideTextBox_PrintText
-.loop_input
- call DoFrame
- jr c, .init_menu_params ; reinit menu parameters
- call HandleStartButtonInDeckSelectionMenu
- jr c, .init_menu_params
- call HandleMenuInput
- jr nc, .loop_input
- ldh a, [hCurMenuItem]
- cp $ff
- ret z ; B btn returns
-; A btn pressed on a deck
- ld [wCurDeck], a
- jp DeckSelectionSubMenu
-
-.DeckSelectionMenuParameters
- db 1, 2 ; cursor x, cursor y
- db 3 ; y displacement between items
- db 4 ; number of items
- db SYM_CURSOR_R ; cursor tile number
- db SYM_SPACE ; tile behind cursor
- dw NULL ; function pointer if non-0
-
-; handles START button press when in deck selection menu
-; does nothing if START button isn't pressed
-; if a press was handled, returns carry
-; prints "There is no deck here!" if the selected deck is empty
-HandleStartButtonInDeckSelectionMenu: ; 8dea (2:4dea)
- ldh a, [hDPadHeld]
- and START
- ret z ; skip
-
-; set menu item as current deck
- ld a, [wCurMenuItem]
- ld [wCurDeck], a
- call CheckIfCurDeckIsValid
- jp nc, .valid_deck ; can be jr
-
-; not a valid deck, cancel
- ld a, $ff ; cancel
- call PlaySFXConfirmOrCancel
- call PrintThereIsNoDeckHereText
- scf
- ret
-
-.valid_deck
- ld a, $1
- call PlaySFXConfirmOrCancel
- call GetPointerToDeckCards
- push hl
- call GetPointerToDeckName
- pop de
- call OpenDeckConfirmationMenu
- ld a, ALL_DECKS
- call DrawDecksScreen
- ld a, [wCurDeck]
- scf
- ret
-
-OpenDeckConfirmationMenu: ; 8e1f (2:4e1f)
-; copy deck name
- push de
- ld de, wCurDeckName
- call CopyListFromHLToDEInSRAM
- pop de
-
-; copy deck cards
- ld hl, wCurDeckCards
- call CopyDeckFromSRAM
-
- ld a, NUM_FILTERS
- ld hl, wCardFilterCounts
- call ClearNBytesFromHL
- ld a, DECK_SIZE
- ld [wTotalCardCount], a
- ld hl, wCardFilterCounts
- ld [hl], a
- call HandleDeckConfirmationMenu
- ret
-
-; handles the submenu when selecting a deck
-; (Modify Deck, Select Deck, Change Name and Cancel)
-DeckSelectionSubMenu: ; 8e42 (2:4e42)
- call DrawWideTextBox
- ld hl, DeckSelectionData
- call PlaceTextItems
- call ResetCheckMenuCursorPositionAndBlink
-.loop_input
- call DoFrame
- call HandleCheckMenuInput
- jp nc, .loop_input
- cp $ff
- jr nz, .option_selected
-; B btn pressed
-; erase cursor and go back
-; to deck selection handling
- call EraseCheckMenuCursor
- ld a, [wCurDeck]
- jp DeckSelectionMenu.init_menu_params
-
-.option_selected
- ld a, [wCheckMenuCursorXPosition]
- or a
- jp nz, DeckSelectionSubMenu_SelectOrCancel
- ld a, [wCheckMenuCursorYPosition]
- or a
- jp nz, .ChangeName
-
-; Modify Deck
-; read deck from SRAM
-; TODO
- call GetPointerToDeckCards
- ld e, l
- ld d, h
- ld hl, wCurDeckCards
- call CopyDeckFromSRAM
- ld a, 20
- ld hl, wCurDeckName
- call ClearNBytesFromHL
- ld de, wCurDeckName
- call GetPointerToDeckName
- call CopyListFromHLToDEInSRAM
-
- call HandleDeckBuildScreen
- jr nc, .asm_8ec4
- call EnableSRAM
- ld hl, wCurDeckCards
- call DecrementDeckCardsInCollection
- call GetPointerToDeckCards
- call AddDeckToCollection
- ld e, l
- ld d, h
- ld hl, wCurDeckCards
- ld b, DECK_SIZE
-.asm_8ea9
- ld a, [hli]
- ld [de], a
- inc de
- dec b
- jr nz, .asm_8ea9
- call GetPointerToDeckName
- ld d, h
- ld e, l
- ld hl, wCurDeckName
- call CopyListFromHLToDE
- call GetPointerToDeckName
- ld a, [hl]
- call DisableSRAM
- or a
- jr z, .get_input_deck_name
-.asm_8ec4
- ld a, ALL_DECKS
- call DrawDecksScreen
- ld a, [wCurDeck]
- jp DeckSelectionMenu.init_menu_params
-
-.ChangeName
- call CheckIfCurDeckIsValid
- jp nc, .get_input_deck_name
- call PrintThereIsNoDeckHereText
- jp DeckSelectionMenu.init_menu_params
-.get_input_deck_name
- ld a, 20
- ld hl, wCurDeckName
- call ClearNBytesFromHL
- ld de, wCurDeckName
- call GetPointerToDeckName
- call CopyListFromHLToDEInSRAM
- call InputCurDeckName
- call GetPointerToDeckName
- ld d, h
- ld e, l
- ld hl, wCurDeckName
- call CopyListFromHLToDEInSRAM
- ld a, ALL_DECKS
- call DrawDecksScreen
- ld a, [wCurDeck]
- jp DeckSelectionMenu.init_menu_params
-
-; gets current deck's name from user input
-InputCurDeckName: ; 8f05 (2:4f05)
- ld a, [wCurDeck]
- or a
- jr nz, .deck_2
- ld hl, Deck1Data
- jr .got_deck_ptr
-.deck_2
- dec a
- jr nz, .deck_3
- ld hl, Deck2Data
- jr .got_deck_ptr
-.deck_3
- dec a
- jr nz, .deck_4
- ld hl, Deck3Data
- jr .got_deck_ptr
-.deck_4
- ld hl, Deck4Data
-.got_deck_ptr
- ld a, MAX_DECK_NAME_LENGTH
- lb bc, 4, 1
- ld de, wCurDeckName
- farcall InputDeckName
- ld a, [wCurDeckName]
- or a
- ret nz
- ; empty name
- call .UnnamedDeck
- ret
-
-; handles the naming of unnamed decks
-; inputs as the deck name "DECK XXX"
-; where XXX is the current unnamed deck counter
-.UnnamedDeck
-; read the current unnamed deck number
-; and convert it to text
- ld hl, sUnnamedDeckCounter
- call EnableSRAM
- ld a, [hli]
- ld h, [hl]
- call DisableSRAM
- ld l, a
- ld de, wDefaultText
- call TwoByteNumberToText
-
- ld hl, wCurDeckName
- ld [hl], $6
- inc hl
- ld [hl], "D"
- inc hl
- ld [hl], "e"
- inc hl
- ld [hl], "c"
- inc hl
- ld [hl], "k"
- inc hl
- ld [hl], " "
- inc hl
- ld de, wDefaultText + 2
- ld a, [de]
- inc de
- ld [hli], a
- ld a, [de]
- inc de
- ld [hli], a
- ld a, [de]
- ld [hli], a
- xor a
- ld [hl], a
-
-; increment the unnamed deck counter
- ld hl, sUnnamedDeckCounter
- call EnableSRAM
- ld e, [hl]
- inc hl
- ld d, [hl]
-; capped at 999
- ld a, HIGH(MAX_UNNAMED_DECK_NUM)
- cp d
- jr nz, .incr_counter
- ld a, LOW(MAX_UNNAMED_DECK_NUM)
- cp e
- jr nz, .incr_counter
- ; reset counter
- ld de, 0
-.incr_counter
- inc de
- ld [hl], d
- dec hl
- ld [hl], e
- call DisableSRAM
- ret
-
-; handle deck selection sub-menu
-; the option is either "Select Deck" or "Cancel"
-; depending on the cursor Y pos
-DeckSelectionSubMenu_SelectOrCancel: ; 8f8a (2:4f8a)
- ld a, [wCheckMenuCursorYPosition]
- or a
- jp nz, CancelDeckSelectionSubMenu
-
-; select deck
- call CheckIfCurDeckIsValid
- jp nc, .SelectDeck
- ; invalid deck
- call PrintThereIsNoDeckHereText
- jp DeckSelectionMenu.init_menu_params
-
-.SelectDeck
- call EnableSRAM
- ld a, [sCurrentlySelectedDeck]
- call DisableSRAM
-
-; draw empty rectangle on currently selected deck
-; i.e. erase the Hand Cards Gfx icon
- ld h, $3
- ld l, a
- call HtimesL
- ld e, l
- inc e
- ld d, 2
- xor a
- lb hl, 0, 0
- lb bc, 2, 2
- call FillRectangle
-
-; set current deck as the selected deck
-; and draw the Hand Cards Gfx icon
- ld a, [wCurDeck]
- call EnableSRAM
- ld [sCurrentlySelectedDeck], a
- call DisableSRAM
- call DrawHandCardsTileOnCurDeck
-
-; print "<DECK> was chosen as the dueling deck!"
- call GetPointerToDeckName
- call EnableSRAM
- call CopyDeckName
- call DisableSRAM
- xor a
- ld [wTxRam2], a
- ld [wTxRam2 + 1], a
- ldtx hl, ChosenAsDuelingDeckText
- call DrawWideTextBox_WaitForInput
- ld a, [wCurDeck]
- jp DeckSelectionMenu.init_menu_params
-
-PrintThereIsNoDeckHereText: ; 8fe8 (2:4fe8)
- ldtx hl, ThereIsNoDeckHereText
- call DrawWideTextBox_WaitForInput
- ld a, [wCurDeck]
- ret
-
-; returns carry if deck in wCurDeck
-; is not a valid deck
-CheckIfCurDeckIsValid: ; 8ff2 (2:4ff2)
- ld a, [wCurDeck]
- ld hl, wDecksValid
- ld b, $0
- ld c, a
- add hl, bc
- ld a, [hl]
- or a
- ret nz ; is valid
- scf
- ret ; is not valid
-
-; write to $d00a the decimal representation (number characters)
-; of the value in hl
-; unreferenced?
-Func_9001: ; 9001 (2:5001)
- ld de, $d00a
- ld bc, -100
- call .GetNumberChar
- ld bc, -10
- call .GetNumberChar
- ld bc, -1
- call .GetNumberChar
- ret
-
-.GetNumberChar
- ld a, SYM_0 - 1
-.loop
- inc a
- add hl, bc
- jr c, .loop
- ld [de], a
- inc de
- ld a, l
- sub c
- ld l, a
- ld a, h
- sbc b
- ld h, a
- ret
-
-CancelDeckSelectionSubMenu: ; 9026 (2:5026)
- ret
-
-DeckSelectionData: ; 9027 (2:5027)
- textitem 2, 14, ModifyDeckText
- textitem 12, 14, SelectDeckText
- textitem 2, 16, ChangeNameText
- textitem 12, 16, CancelText
- db $ff
-
-; return, in hl, the pointer to sDeckXName where X is [wCurDeck] + 1
-GetPointerToDeckName: ; 9038 (2:5038)
- ld a, [wCurDeck]
- ld h, a
- ld l, DECK_STRUCT_SIZE
- call HtimesL
- push de
- ld de, sDeck1Name
- add hl, de
- pop de
- ret
-
-; return, in hl, the pointer to sDeckXCards where X is [wCurDeck] + 1
-GetPointerToDeckCards: ; 9048 (2:5048)
- push af
- ld a, [wCurDeck]
- ld h, a
- ld l, sDeck2Cards - sDeck1Cards
- call HtimesL
- push de
- ld de, sDeck1Cards
- add hl, de
- pop de
- pop af
- ret
-
-ResetCheckMenuCursorPositionAndBlink: ; 905a (2:505a)
- xor a
- ld [wCheckMenuCursorXPosition], a
- ld [wCheckMenuCursorYPosition], a
- ld [wCheckMenuCursorBlinkCounter], a
- ret
-
-; handle player input in check menu
-; works out which cursor coordinate to go to
-; and sets carry flag if A or B are pressed
-; returns a = $1 if A pressed
-; returns a = $ff if B pressed
-HandleCheckMenuInput: ; 9065 (2:5065)
- xor a
- ld [wPlaysSfx], a
- ld a, [wCheckMenuCursorXPosition]
- ld d, a
- ld a, [wCheckMenuCursorYPosition]
- ld e, a
-
-; d = cursor x position
-; e = cursor y position
-
- ldh a, [hDPadHeld]
- or a
- jr z, .no_pad
- bit D_LEFT_F, a
- jr nz, .horizontal
- bit D_RIGHT_F, a
- jr z, .check_vertical
-
-; handle horizontal input
-.horizontal
- ld a, d
- xor $1 ; flips x coordinate
- ld d, a
- jr .okay
-.check_vertical
- bit D_UP_F, a
- jr nz, .vertical
- bit D_DOWN_F, a
- jr z, .no_pad
-
-; handle vertical input
-.vertical
- ld a, e
- xor $01 ; flips y coordinate
- ld e, a
-
-.okay
- ld a, TRUE
- ld [wPlaysSfx], a
- push de
- call EraseCheckMenuCursor
- pop de
-
-; update x and y cursor positions
- ld a, d
- ld [wCheckMenuCursorXPosition], a
- ld a, e
- ld [wCheckMenuCursorYPosition], a
-
-; reset cursor blink
- xor a
- ld [wCheckMenuCursorBlinkCounter], a
-.no_pad
- ldh a, [hKeysPressed]
- and A_BUTTON | B_BUTTON
- jr z, .no_input
- and A_BUTTON
- jr nz, .a_press
- ld a, $ff ; cancel
- call PlaySFXConfirmOrCancel
- scf
- ret
-
-.a_press
- call DisplayCheckMenuCursor
- ld a, $01
- call PlaySFXConfirmOrCancel
- scf
- ret
-
-.no_input
- ld a, [wPlaysSfx]
- or a
- jr z, .check_blink
- call PlaySFX
-
-.check_blink
- ld hl, wCheckMenuCursorBlinkCounter
- ld a, [hl]
- inc [hl]
- and %00001111
- ret nz ; only update cursor if blink's lower nibble is 0
-
- ld a, SYM_CURSOR_R ; cursor byte
- bit 4, [hl] ; only draw cursor if blink counter's fourth bit is not set
- jr z, DrawCheckMenuCursor
-
-; draws in the cursor position
-EraseCheckMenuCursor: ; 90d8 (2:50d8)
- ld a, SYM_SPACE ; empty cursor
-; fallthrough
-
-; draws in the cursor position
-; input:
-; a = tile byte to draw
-DrawCheckMenuCursor: ; 90da (2:50da)
- ld e, a
- ld a, 10
- ld l, a
- ld a, [wCheckMenuCursorXPosition]
- ld h, a
- call HtimesL
-
- ld a, l
- add 1
- ld b, a
- ld a, [wCheckMenuCursorYPosition]
- sla a
- add 14
- ld c, a
-
- ld a, e
- call WriteByteToBGMap0
- or a
- ret
-
-DisplayCheckMenuCursor: ; 90f7 (2:50f7)
- ld a, SYM_CURSOR_R
- jr DrawCheckMenuCursor
-
-; plays sound depending on value in a
-; input:
-; a = $ff: play cancel sound
-; a != $ff: play confirm sound
-PlaySFXConfirmOrCancel: ; 90fb (2:50fb)
- push af
- inc a
- jr z, .asm_9103
- ld a, SFX_02 ; confirmation sfx
- jr .asm_9105
-.asm_9103
- ld a, SFX_03 ; cancellation sfx
-.asm_9105
- call PlaySFX
- pop af
- ret
-
-; goes through whole deck in hl
-; for each card ID, goes to its corresponding
-; entry in sCardCollection and decrements its count
-DecrementDeckCardsInCollection: ; 910a (2:510a)
- push hl
- ld b, $0
- ld d, DECK_SIZE
-.loop_deck
- ld a, [hli]
- or a
- jr z, .done
- ld c, a
- push hl
- ld hl, sCardCollection
- add hl, bc
- dec [hl]
- pop hl
- dec d
- jr nz, .loop_deck
-.done
- pop hl
- ret
-
-; like AddDeckToCollection, but takes care to
-; check if increasing the collection count would
-; go over MAX_AMOUNT_OF_CARD and caps it
-; this is because it's used within Gift Center,
-; so we cannot assume that the deck configuration
-; won't make it go over MAX_AMOUNT_OF_CARD
-; hl = deck configuration, with cards to add
-AddGiftCenterDeckCardsToCollection: ; 9120 (2:5120)
- push hl
- ld b, $0
- ld d, DECK_SIZE
-.loop_deck
- ld a, [hli]
- or a
- jr z, .done
- ld c, a
- push hl
- push de
- push bc
- ld a, ALL_DECKS
- call CreateCardCollectionListWithDeckCards
- pop bc
- pop de
- ld hl, wTempCardCollection
- add hl, bc
- ld a, [hl]
- cp MAX_AMOUNT_OF_CARD
- jr z, .next_card ; capped
- call EnableSRAM ; no DisableSRAM
- ld hl, sCardCollection
- add hl, bc
- ld a, [hl]
- cp CARD_NOT_OWNED
- jr nz, .incr
- ; not owned
- xor a
- ld [hl], a
-.incr
- inc [hl]
-.next_card
- pop hl
- dec d
- jr nz, .loop_deck
-.done
- pop hl
- ret
-
-; adds all cards in deck in hl to player's collection
-; assumes SRAM is enabled
-; hl = pointer to deck cards
-AddDeckToCollection: ; 9152 (2:5152)
- push hl
- ld b, $0
- ld d, DECK_SIZE
-.loop_deck
- ld a, [hli]
- or a
- jr z, .done
- ld c, a
- push hl
- ld hl, sCardCollection
- add hl, bc
- inc [hl]
- pop hl
- dec d
- jr nz, .loop_deck
-.done
- pop hl
- ret
-
-; draws the screen which shows the player's current
-; deck configurations
-; a = DECK_* flags to pick which deck names to show
-DrawDecksScreen: ; 9168 (2:5168)
- ld [hffb5], a
- call EmptyScreenAndLoadFontDuelAndHandCardsIcons
- lb de, 0, 0
- lb bc, 20, 4
- call DrawRegularTextBox
- lb de, 0, 3
- lb bc, 20, 4
- call DrawRegularTextBox
- lb de, 0, 6
- lb bc, 20, 4
- call DrawRegularTextBox
- lb de, 0, 9
- lb bc, 20, 4
- call DrawRegularTextBox
- ld hl, DeckNameMenuData
- call PlaceTextItems
-
-; mark all decks as invalid
- ld a, NUM_DECKS
- ld hl, wDecksValid
- call ClearNBytesFromHL
-
-; for each deck, check if it has cards and if so
-; mark is as valid in wDecksValid
-
-; deck 1
- ld a, [hffb5] ; should be ldh
- bit 0, a
- jr z, .skip_name_1
- ld hl, sDeck1Name
- lb de, 6, 2
- call PrintDeckName
-.skip_name_1
- ld hl, sDeck1Cards
- call CheckIfDeckHasCards
- jr c, .deck_2
- ld a, TRUE
- ld [wDeck1Valid], a
-
-.deck_2
- ld a, [hffb5] ; should be ldh
- bit 1, a
- jr z, .skip_name_2
- ld hl, sDeck2Name
- lb de, 6, 5
- call PrintDeckName
-.skip_name_2
- ld hl, sDeck2Cards
- call CheckIfDeckHasCards
- jr c, .deck_3
- ld a, TRUE
- ld [wDeck2Valid], a
-
-.deck_3
- ld a, [hffb5] ; should be ldh
- bit 2, a
- jr z, .skip_name_3
- ld hl, sDeck3Name
- lb de, 6, 8
- call PrintDeckName
-.skip_name_3
- ld hl, sDeck3Cards
- call CheckIfDeckHasCards
- jr c, .deck_4
- ld a, TRUE
- ld [wDeck3Valid], a
-
-.deck_4
- ld a, [hffb5] ; should be ldh
- bit 3, a
- jr z, .skip_name_4
- ld hl, sDeck4Name
- lb de, 6, 11
- call PrintDeckName
-.skip_name_4
- ld hl, sDeck4Cards
- call CheckIfDeckHasCards
- jr c, .place_cursor
- ld a, TRUE
- ld [wDeck4Valid], a
-
-.place_cursor
-; places cursor on sCurrentlySelectedDeck
-; if it's an empty deck, then advance the cursor
-; until it's selecting a valid deck
- call EnableSRAM
- ld a, [sCurrentlySelectedDeck]
- ld c, a
- ld b, $0
- ld d, 2
-.check_valid_deck
- ld hl, wDecksValid
- add hl, bc
- ld a, [hl]
- or a
- jr nz, .valid_selected_deck
- inc c
- ld a, NUM_DECKS
- cp c
- jr nz, .check_valid_deck
- ld c, 0 ; roll back to deck 1
- dec d
- jr z, .valid_selected_deck
- jr .check_valid_deck
-
-.valid_selected_deck
- ld a, c
- ld [sCurrentlySelectedDeck], a
- call DisableSRAM
- call DrawHandCardsTileOnCurDeck
- call EnableLCD
- ret
-
-DeckNameMenuData: ; 9242 (2:5242)
- textitem 4, 2, Deck1Text
- textitem 4, 5, Deck2Text
- textitem 4, 8, Deck3Text
- textitem 4, 11, Deck4Text
- db $ff
-
-; copies text from hl to wDefaultText
-; with " deck" appended to the end
-; hl = ptr to deck name
-CopyDeckName: ; 9253 (2:5253)
- ld de, wDefaultText
- call CopyListFromHLToDE
- ld hl, wDefaultText
- call GetTextLengthInTiles
- ld b, $0
- ld hl, wDefaultText
- add hl, bc
- ld d, h
- ld e, l
- ld hl, DeckNameSuffix
- call CopyListFromHLToDE
- ret
-
-; prints deck name given in hl in position de
-; if it's an empty deck, print "NEW DECK" instead
-; returns carry if it's an empty deck
-; hl = deck name (sDeck1Name ~ sDeck4Name)
-; de = coordinates to print text
-PrintDeckName: ; 926e (2:526e)
- push hl
- call CheckIfDeckHasCards
- pop hl
- jr c, .new_deck
-
-; print "<deck name> deck"
- push de
- ld de, wDefaultText
- call CopyListFromHLToDEInSRAM
- ld hl, wDefaultText
- call GetTextLengthInTiles
- ld b, $0
- ld hl, wDefaultText
- add hl, bc
- ld d, h
- ld e, l
- ld hl, DeckNameSuffix
- call CopyListFromHLToDE
- pop de
- ld hl, wDefaultText
- call InitTextPrinting
- call ProcessText
- or a
- ret
-
-.new_deck
-; print "NEW DECK"
- call InitTextPrinting
- ldtx hl, NewDeckText
- call ProcessTextFromID
- scf
- ret
-
-DeckNameSuffix: ; 92a7 (2:52a7)
- db " deck"
- done
-
-; copies a $00-terminated list from hl to de
-CopyListFromHLToDE: ; 92ad (2:52ad)
- ld a, [hli]
- ld [de], a
- or a
- ret z
- inc de
- jr CopyListFromHLToDE
-
-; same as CopyListFromHLToDE, but for SRAM copying
-CopyListFromHLToDEInSRAM: ; 92b4 (2:52b4)
- call EnableSRAM
- call CopyListFromHLToDE
- call DisableSRAM
- ret
-
-; appends text in hl to wDefaultText
-; then adds "deck" to the end
-; returns carry if deck has no cards
-; hl = text to append
-; de = input to InitTextPrinting
-AppendDeckName: ; 92be (2:52be)
- push hl
- call CheckIfDeckHasCards
- pop hl
- ret c ; no cards
-
- push de
- ; append the text from hl
- ld de, wDefaultText
- call CopyListFromHLToDEInSRAM
-
- ; get string length (up to DECK_NAME_SIZE_WO_SUFFIX)
- ld hl, wDefaultText
- call GetTextLengthInTiles
- ld a, c
- cp DECK_NAME_SIZE_WO_SUFFIX
- jr c, .got_len
- ld c, DECK_NAME_SIZE_WO_SUFFIX
-.got_len
- ld b, $0
- ld hl, wDefaultText
- add hl, bc
- ld d, h
- ld e, l
- ; append "deck" starting from the given length
- ld hl, .text_start
- ld b, .text_end - .text_start
- call CopyNBytesFromHLToDE
- xor a ; TX_END
- ld [wDefaultText + DECK_NAME_SIZE + 2], a
- pop de
- ld hl, wDefaultText
- call InitTextPrinting
- call ProcessText
- or a
- ret
-
-.text_start
- db " deck "
-.text_end
-
-; returns carry if the deck in hl
-; is not valid, that is, has no cards
-; alternatively, the direct address of the cards
-; can be used, since DECK_SIZE > DECK_NAME_SIZE
-; hl = deck name (sDeck1Name ~ sDeck4Name)
-; or deck cards (sDeck1Cards ~ sDeck4Cards)
-CheckIfDeckHasCards: ; 9314 (2:5314)
- ld bc, DECK_NAME_SIZE
- add hl, bc
- call EnableSRAM
- ld a, [hl]
- call DisableSRAM
- ; being max size means last char
- ; is not TX_END, i.e. $0
- or a
- jr nz, .max_size
- scf
- ret
-.max_size
- or a
- ret
-
-; calculates the y coordinate of the currently selected deck
-; and draws the hands card tile at that position
-DrawHandCardsTileOnCurDeck: ; 9326 (2:5326)
- call EnableSRAM
- ld a, [sCurrentlySelectedDeck]
- call DisableSRAM
- ld h, 3
- ld l, a
- call HtimesL
- ld e, l
- inc e ; (sCurrentlySelectedDeck * 3) + 1
- ld d, 2
-; fallthrough
-
-; de = coordinates to draw rectangle
-DrawHandCardsTileAtDE: ; 9339 (2:5339)
- ld a, $38 ; hand cards tile
- lb hl, 1, 2
- lb bc, 2, 2
- call FillRectangle
- ret
-
-; handles user input when selecting a card filter
-; when building a deck configuration
-; the handling of selecting cards themselves from the list
-; to add/remove to the deck is done in HandleDeckCardSelectionList
-HandleDeckBuildScreen: ; 9345 (2:5345)
- call WriteCardListsTerminatorBytes
- call CountNumberOfCardsForEachCardType
-.skip_count
- call DrawCardTypeIconsAndPrintCardCounts
-
- xor a
- ld [wCardListVisibleOffset], a
- ld [wCurCardTypeFilter], a ; FILTER_GRASS
- call PrintFilteredCardList
-
-.skip_draw
- ld hl, FiltersCardSelectionParams
- call InitCardSelectionParams
-.wait_input
- call DoFrame
- ldh a, [hDPadHeld]
- and START
- jr z, .no_start_btn_1
- ld a, $01
- call PlaySFXConfirmOrCancel
- call ConfirmDeckConfiguration
- ld a, [wCurCardTypeFilter]
- ld [wTempCardTypeFilter], a
- jr .wait_input
-
-.no_start_btn_1
- ld a, [wCurCardTypeFilter]
- ld b, a
- ld a, [wTempCardTypeFilter]
- cp b
- jr z, .check_down_btn
- ; need to refresh the filtered card list
- ld [wCurCardTypeFilter], a
- ld hl, wCardListVisibleOffset
- ld [hl], 0
- call PrintFilteredCardList
- ld a, NUM_FILTERS
- ld [wCardListNumCursorPositions], a
-
-.check_down_btn
- ldh a, [hDPadHeld]
- and D_DOWN
- jr z, .no_down_btn
- call ConfirmSelectionAndReturnCarry
- jr .jump_to_list
-
-.no_down_btn
- call HandleCardSelectionInput
- jr nc, .wait_input
- ld a, [hffb3]
- cp $ff ; operation cancelled?
- jp z, OpenDeckConfigurationMenu
-
-; input was made to jump to the card list
-.jump_to_list
- ld a, [wNumEntriesInCurFilter]
- or a
- jr z, .wait_input
- xor a
-.wait_list_input
- ld hl, FilteredCardListSelectionParams
- call InitCardSelectionParams
- ld a, [wNumEntriesInCurFilter]
- ld [wNumCardListEntries], a
- ld hl, wNumVisibleCardListEntries
- cp [hl]
- jr nc, .ok
- ; if total number of entries is greater than or equal to
- ; the number of visible entries, then set number of cursor positions
- ; as number of visible entries
- ld [wCardListNumCursorPositions], a
-.ok
- ld hl, PrintDeckBuildingCardList
- ld d, h
- ld a, l
- ld hl, wCardListUpdateFunction
- ld [hli], a
- ld [hl], d
-
- ld a, $01
- ld [wced2], a
-.loop_input
- call DoFrame
- ldh a, [hDPadHeld]
- and START
- jr z, .no_start_btn_2
- ld a, $01
- call PlaySFXConfirmOrCancel
-
- ; temporarily store current cursor position
- ; to retrieve it later
- ld a, [wCardListCursorPos]
- ld [wTempFilteredCardListNumCursorPositions], a
- call ConfirmDeckConfiguration
- ld a, [wTempFilteredCardListNumCursorPositions]
- jr .wait_list_input
-
-.no_start_btn_2
- call HandleSelectUpAndDownInList
- jr c, .loop_input
- call HandleDeckCardSelectionList
- jr c, .selection_made
- jr .loop_input
-
-.open_card_page
- ld a, $01
- call PlaySFXConfirmOrCancel
- ld a, [wCardListNumCursorPositions]
- ld [wTempCardListNumCursorPositions], a
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
-
- ; set wFilteredCardList as current card list
- ; and show card page screen
- ld de, wFilteredCardList
- ld hl, wCurCardListPtr
- ld [hl], e
- inc hl
- ld [hl], d
- call OpenCardPageFromCardList
- call DrawCardTypeIconsAndPrintCardCounts
-
- ld hl, FiltersCardSelectionParams
- call InitCardSelectionParams
- ld a, [wCurCardTypeFilter]
- ld [wTempCardTypeFilter], a
- call DrawHorizontalListCursor_Visible
- call PrintDeckBuildingCardList
- ld hl, FilteredCardListSelectionParams
- call InitCardSelectionParams
- ld a, [wTempCardListNumCursorPositions]
- ld [wCardListNumCursorPositions], a
- ld a, [wTempCardListCursorPos]
- ld [wCardListCursorPos], a
- jr .loop_input
-
-.selection_made
- call DrawListCursor_Invisible
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
- ld a, [hffb3]
- cp $ff
- jr nz, .open_card_page
- ; cancelled
- ld hl, FiltersCardSelectionParams
- call InitCardSelectionParams
- ld a, [wCurCardTypeFilter]
- ld [wTempCardTypeFilter], a
- jp .wait_input
-
-OpenDeckConfigurationMenu: ; 9461 (2:5461)
- xor a
- ld [wYourOrOppPlayAreaCurPosition], a
- ld de, wDeckConfigurationMenuTransitionTable
- ld hl, wMenuInputTablePointer
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hl], a
- ld a, $ff
- ld [wDuelInitialPrizesUpperBitsSet], a
-.skip_init
- xor a
- ld [wCheckMenuCursorBlinkCounter], a
- ld hl, wDeckConfigurationMenuHandlerFunction
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp hl
-
-HandleDeckConfigurationMenu: ; 9480 (2:5480)
- lb de, 0, 0
- lb bc, 20, 6
- call DrawRegularTextBox
- ld hl, DeckBuildMenuData
- call PlaceTextItems
-
-.do_frame
- ld a, $1
- ld [wVBlankOAMCopyToggle], a
- call DoFrame
- call YourOrOppPlayAreaScreen_HandleInput
- jr nc, .do_frame
- ld [wced6], a
- cp $ff
- jr nz, .asm_94b5
-.draw_icons
- call DrawCardTypeIconsAndPrintCardCounts
- ld a, [wTempCardListCursorPos]
- ld [wCardListCursorPos], a
- ld a, [wCurCardTypeFilter]
- call PrintFilteredCardList
- jp HandleDeckBuildScreen.skip_draw
-
-.asm_94b5
- push af
- call YourOrOppPlayAreaScreen_HandleInput.draw_cursor
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- pop af
- ld hl, .func_table
- call JumpToFunctionInTable
- jr OpenDeckConfigurationMenu.skip_init
-
-.func_table
- dw ConfirmDeckConfiguration ; Confirm
- dw ModifyDeckConfiguration ; Modify
- dw ChangeDeckName ; Name
- dw SaveDeckConfiguration ; Save
- dw DismantleDeck ; Dismantle
- dw CancelDeckModifications ; Cancel
-
-ConfirmDeckConfiguration: ; 94d3 (2:54d3)
- ld hl, wCardListVisibleOffset
- ld a, [hl]
- ld hl, wCardListVisibleOffsetBackup
- ld [hl], a
- call HandleDeckConfirmationMenu
- ld hl, wCardListVisibleOffsetBackup
- ld a, [hl]
- ld hl, wCardListVisibleOffset
- ld [hl], a
- call DrawCardTypeIconsAndPrintCardCounts
- ld hl, FiltersCardSelectionParams
- call InitCardSelectionParams
- ld a, [wCurCardTypeFilter]
- ld [wTempCardTypeFilter], a
- call DrawHorizontalListCursor_Visible
- ld a, [wCurCardTypeFilter]
- call PrintFilteredCardList
- ld a, [wced6]
- ld [wCardListCursorPos], a
- ret
-
-ModifyDeckConfiguration: ; 9505 (2:5505)
- add sp, $2
- jr HandleDeckConfigurationMenu.draw_icons
-
-; returns carry set if player chose to go back
-CancelDeckModifications: ; 9509 (2:5509)
-; if deck was not changed, cancel modification immediately
- call CheckIfCurrentDeckWasChanged
- jr nc, .cancel_modification
-; else prompt the player to confirm
- ldtx hl, QuitModifyingTheDeckText
- call YesOrNoMenuWithText
- jr c, SaveDeckConfiguration.go_back
-.cancel_modification
- add sp, $2
- or a
- ret
-
-SaveDeckConfiguration: ; 951a (2:551a)
-; handle deck configuration size
- ld a, [wTotalCardCount]
- cp DECK_SIZE
- jp z, .ask_to_save_deck ; can be jr
- ldtx hl, ThisIsntA60CardDeckText
- call DrawWideTextBox_WaitForInput
- ldtx hl, ReturnToOriginalConfigurationText
- call YesOrNoMenuWithText
- jr c, .print_deck_size_warning
-; return no carry
- add sp, $2
- or a
- ret
-.print_deck_size_warning
- ldtx hl, TheDeckMustInclude60CardsText
- call DrawWideTextBox_WaitForInput
- jr .go_back
-
-.ask_to_save_deck
- ldtx hl, SaveThisDeckText
- call YesOrNoMenuWithText
- jr c, .go_back
- call CheckIfThereAreAnyBasicCardsInDeck
- jr c, .set_carry
- ldtx hl, ThereAreNoBasicPokemonInThisDeckText
- call DrawWideTextBox_WaitForInput
- ldtx hl, YouMustIncludeABasicPokemonInTheDeckText
- call DrawWideTextBox_WaitForInput
-
-.go_back
- call DrawCardTypeIconsAndPrintCardCounts
- call PrintDeckBuildingCardList
- ld a, [wced6]
- ld [wCardListCursorPos], a
- ret
-
-.set_carry
- add sp, $2
- scf
- ret
-
-DismantleDeck: ; 9566 (2:5566)
- ldtx hl, DismantleThisDeckText
- call YesOrNoMenuWithText
- jr c, SaveDeckConfiguration.go_back
- call CheckIfHasOtherValidDecks
- jp nc, .Dismantle ; can be jr
- ldtx hl, ThereIsOnly1DeckSoCannotBeDismantledText
- call DrawWideTextBox_WaitForInput
- call EmptyScreen
- ld hl, FiltersCardSelectionParams
- call InitCardSelectionParams
- ld a, [wCurCardTypeFilter]
- ld [wTempCardTypeFilter], a
- call DrawHorizontalListCursor_Visible
- call PrintDeckBuildingCardList
- call EnableLCD
- ld a, [wced6]
- ld [wCardListCursorPos], a
- ret
-
-.Dismantle
- call EnableSRAM
- call GetPointerToDeckName
- ld a, [hl]
- or a
- jr z, .done_dismantle
- ld a, NAME_BUFFER_LENGTH
- call ClearNBytesFromHL
- call GetPointerToDeckCards
- call AddDeckToCollection
- ld a, DECK_SIZE
- call ClearNBytesFromHL
-.done_dismantle
- call DisableSRAM
- add sp, $2
- ret
-
-ChangeDeckName: ; 95b9 (2:55b9)
- call InputCurDeckName
- add sp, $2
- jp HandleDeckBuildScreen.skip_count
-
-; returns carry if current deck was changed
-; either through its card configuration or its name
-CheckIfCurrentDeckWasChanged: ; 95c1 (2:55c1)
- ld a, [wTotalCardCount]
- or a
- jr z, .skip_size_check
- cp DECK_SIZE
- jr nz, .set_carry
-.skip_size_check
-
-; copy the selected deck to wCurDeckCardChanges
- call GetPointerToDeckCards
- ld de, wCurDeckCardChanges
- ld b, DECK_SIZE
- call EnableSRAM
- call CopyNBytesFromHLToDE
- call DisableSRAM
-
-; loops through cards in wCurDeckCards
-; then if that card is found in wCurDeckCardChanges
-; overwrite it by $0
- ld a, $ff ; terminator byte
- ld [wCurDeckCardChanges + DECK_SIZE], a
- ld de, wCurDeckCards
-.loop_outer
- ld a, [de]
- or a
- jr z, .check_empty
- ld b, a
- inc de
- ld hl, wCurDeckCardChanges
-.loop_inner
- ld a, [hli]
- cp $ff
- jr z, .loop_outer
- cp b
- jr nz, .loop_inner
- ; found
- dec hl
- xor a
- ld [hli], a ; remove
- jr .loop_outer
-
-.check_empty
- ld hl, wCurDeckCardChanges
-.loop_check_empty
- ld a, [hli]
- cp $ff
- jr z, .is_empty
- or a
- jr nz, .set_carry
- jr .loop_check_empty
-
-.is_empty
-; wCurDeckCardChanges is empty (all $0)
-; check if name was changed
- call GetPointerToDeckName
- ld de, wCurDeckName
- call EnableSRAM
-.loop_name
- ld a, [de]
- cp [hl]
- jr nz, .set_carry
- inc de
- inc hl
- or a
- jr nz, .loop_name
- call DisableSRAM
- ret
-
-.set_carry
- call DisableSRAM
- scf
- ret
-
-; returns carry if doesn't have a valid deck
-; aside from the current deck
-CheckIfHasOtherValidDecks: ; 9622 (2:5622)
- ld hl, wDecksValid
- lb bc, 0, 0
-.loop
- inc b
- ld a, NUM_DECKS
- cp b
- jr c, .check_has_cards
- ld a, [hli]
- or a
- jr z, .loop
- ; is valid
- inc c
- ld a, 1
- cp c
- jr nc, .loop ; just 1 valid
- ; at least 2 decks are valid
-.no_carry
- or a
- ret
-
-.check_has_cards
-; doesn't have at least 2 valid decks
-; check if current deck is the only one
-; that is valid (i.e. has cards)
- call GetPointerToDeckCards
- call EnableSRAM
- ld a, [hl]
- call DisableSRAM
- or a
- jr z, .no_carry ; no cards
- ; has cards, is the only valid deck!
- scf
- ret
-
-; checks if wCurDeckCards has any basics
-; returns carry set if there is at least
-; 1 Basic Pokemon card
-CheckIfThereAreAnyBasicCardsInDeck: ; 9649 (2:5649)
- ld hl, wCurDeckCards
-.loop_cards
- ld a, [hli]
- ld e, a
- or a
- jr z, .no_carry
- call LoadCardDataToBuffer1_FromCardID
- jr c, .no_carry
- ld a, [wLoadedCard1Type]
- and TYPE_ENERGY
- jr nz, .loop_cards
- ld a, [wLoadedCard1Stage]
- or a
- jr nz, .loop_cards
- ; is basic card
- scf
- ret
-.no_carry
- or a
- ret
-
-FiltersCardSelectionParams: ; 9667 (2:5667)
- db 1 ; x pos
- db 1 ; y pos
- db 0 ; y spacing
- db 2 ; x spacing
- db NUM_FILTERS ; num entries
- db SYM_CURSOR_D ; visible cursor tile
- db SYM_SPACE ; invisible cursor tile
- dw NULL ; wCardListHandlerFunction
-
-FilteredCardListSelectionParams: ; 9670 (2:5670)
- db 0 ; x pos
- db 7 ; y pos
- db 2 ; y spacing
- db 0 ; x spacing
- db NUM_FILTERED_LIST_VISIBLE_CARDS ; num entries
- db SYM_CURSOR_R ; visible cursor tile
- db SYM_SPACE ; invisible cursor tile
- dw NULL ; wCardListHandlerFunction
-
-DeckConfigurationMenu_TransitionTable: ; 9679 (2:5679)
- cursor_transition $10, $20, $00, $03, $03, $01, $02
- cursor_transition $48, $20, $00, $04, $04, $02, $00
- cursor_transition $80, $20, $00, $05, $05, $00, $01
- cursor_transition $10, $30, $00, $00, $00, $04, $05
- cursor_transition $48, $30, $00, $01, $01, $05, $03
- cursor_transition $80, $30, $00, $02, $02, $03, $04
-
-; draws each card type icon in a line
-; the respective card counts underneath each icon
-; and prints"X/60" in the upper-right corner,
-; where X is the total card count
-DrawCardTypeIconsAndPrintCardCounts: ; 96a3 (2:56a3)
- call Set_OBJ_8x8
- call Func_8d78
- lb bc, 0, 5
- ld a, SYM_BOX_TOP
- call FillBGMapLineWithA
- call DrawCardTypeIcons
- call PrintCardTypeCounts
- lb de, 15, 0
- call PrintTotalCardCount
- lb de, 17, 0
- call PrintSlashSixty
- call EnableLCD
- ret
-
-; fills one line at coordinate bc in BG Map
-; with the byte in register a
-; fills the same line with $04 in VRAM1 if in CGB
-; bc = coordinates
-FillBGMapLineWithA: ; 96c7 (2:56c7)
- call BCCoordToBGMap0Address
- ld b, SCREEN_WIDTH
- call FillDEWithA
- ld a, [wConsole]
- cp CONSOLE_CGB
- ret nz ; return if not CGB
- ld a, $04
- ld b, SCREEN_WIDTH
- call BankswitchVRAM1
- call FillDEWithA
- call BankswitchVRAM0
- ret
-
-; saves the count of each type of card that is in wCurDeckCards
-; stores these values in wCardFilterCounts
-CountNumberOfCardsForEachCardType: ; 96e3 (2:56e3)
- ld hl, wCardFilterCounts
- ld de, CardTypeFilters
-.loop
- ld a, [de]
- cp -1
- ret z
- inc de
- call CountNumberOfCardsOfType
- ld [hli], a
- jr .loop
-
-; fills de with b bytes of the value in register a
-FillDEWithA: ; 96f4 (2:56f4)
- push hl
- ld l, e
- ld h, d
-.loop
- ld [hli], a
- dec b
- jr nz, .loop
- pop hl
- ret
-
-; draws all the card type icons
-; in a line specified by .CardTypeIcons
-DrawCardTypeIcons: ; 96fd (2:56fd)
- ld hl, .CardTypeIcons
-.loop
- ld a, [hli]
- or a
- ret z ; done
- ld d, [hl] ; x coord
- inc hl
- ld e, [hl] ; y coord
- inc hl
- call .DrawIcon
- jr .loop
-
-; input:
-; de = coordinates
-.DrawIcon
- push hl
- push af
- lb hl, 1, 2
- lb bc, 2, 2
- call FillRectangle
- pop af
- call GetCardTypeIconPalette
- ld b, a
- ld a, [wConsole]
- cp CONSOLE_CGB
- jr nz, .not_cgb
- ld a, b
- lb bc, 2, 2
- lb hl, 0, 0
- call BankswitchVRAM1
- call FillRectangle
- call BankswitchVRAM0
-.not_cgb
- pop hl
- ret
-
-.CardTypeIcons
-; icon tile, x coord, y coord
- db ICON_TILE_GRASS, 1, 2
- db ICON_TILE_FIRE, 3, 2
- db ICON_TILE_WATER, 5, 2
- db ICON_TILE_LIGHTNING, 7, 2
- db ICON_TILE_FIGHTING, 9, 2
- db ICON_TILE_PSYCHIC, 11, 2
- db ICON_TILE_COLORLESS, 13, 2
- db ICON_TILE_TRAINER, 15, 2
- db ICON_TILE_ENERGY, 17, 2
- db $00
-
-DeckBuildMenuData: ; 9751 (1:5751)
- ; x, y, text id
- textitem 2, 2, ConfirmText
- textitem 9, 2, ModifyText
- textitem 16, 2, NameText
- textitem 2, 4, SaveText
- textitem 9, 4, DismantleText
- textitem 16, 4, CancelText
- db $ff
-
-; prints "/60" to the coordinates given in de
-PrintSlashSixty: ; 976a (2:576a)
- ld hl, wDefaultText
- ld a, TX_SYMBOL
- ld [hli], a
- ld a, SYM_SLASH
- ld [hli], a
- ld a, TX_SYMBOL
- ld [hli], a
- ld a, SYM_6
- ld [hli], a
- ld a, TX_SYMBOL
- ld [hli], a
- ld a, SYM_0
- ld [hli], a
- ld [hl], TX_END
- call InitTextPrinting
- ld hl, wDefaultText
- call ProcessText
- ret
-
-; creates two separate lists given the card type in register a
-; if a card matches the card type given, then it's added to wFilteredCardList
-; if a card has been owned by the player, and its card count is at least 1,
-; (or in case it's 0 if it's in any deck configurations saved)
-; then its collection count is also added to wOwnedCardsCountList
-; if input a is $ff, then all card types are included
-CreateFilteredCardList: ; 978b (2:578b)
- push af
- push bc
- push de
- push hl
-
-; clear wOwnedCardsCountList and wFilteredCardList
- push af
- ld a, DECK_SIZE
- ld hl, wOwnedCardsCountList
- call ClearNBytesFromHL
- ld a, DECK_SIZE
- ld hl, wFilteredCardList
- call ClearNBytesFromHL
- pop af
-
-; loops all cards in collection
- ld hl, $0
- ld de, $0
- ld b, a ; input card type
-.loop_card_ids
- inc e
- call GetCardType
- jr c, .store_count
- ld c, a
- ld a, b
- cp $ff
- jr z, .add_card
- and FILTER_ENERGY
- cp FILTER_ENERGY
- jr z, .check_energy
- ld a, c
- cp b
- jr nz, .loop_card_ids
- jr .add_card
-.check_energy
- ld a, c
- and TYPE_ENERGY
- cp TYPE_ENERGY
- jr nz, .loop_card_ids
-
-.add_card
- push bc
- push hl
- ld bc, wFilteredCardList
- add hl, bc
- ld [hl], e
- ld hl, wTempCardCollection
- add hl, de
- ld a, [hl]
- pop hl
- cp CARD_NOT_OWNED
- jr z, .next_card ; jump if never seen card
- or a
- jr nz, .ok ; has at least 1
- call IsCardInAnyDeck
- jr c, .next_card ; jump if not in any deck
-.ok
- push hl
- ld bc, wOwnedCardsCountList
- add hl, bc
- ld [hl], a
- pop hl
- inc l
-.next_card
- pop bc
- jr .loop_card_ids
-
-.store_count
- ld a, l
- ld [wNumEntriesInCurFilter], a
-; add terminator bytes in both lists
- xor a
- ld c, l
- ld b, h
- ld hl, wFilteredCardList
- add hl, bc
- ld [hl], a ; $00
- ld a, $ff
- ld hl, wOwnedCardsCountList
- add hl, bc
- ld [hl], a ; $ff
- pop hl
- pop de
- pop bc
- pop af
- ret
-
-; returns carry if card ID in register e is not
-; found in any of the decks saved in SRAM
-IsCardInAnyDeck: ; 9803 (2:5803)
- push af
- push hl
- ld hl, sDeck1Cards
- call .FindCardInDeck
- jr nc, .found_card
- ld hl, sDeck2Cards
- call .FindCardInDeck
- jr nc, .found_card
- ld hl, sDeck3Cards
- call .FindCardInDeck
- jr nc, .found_card
- ld hl, sDeck4Cards
- call .FindCardInDeck
- jr nc, .found_card
- pop hl
- pop af
- scf
- ret
-.found_card
- pop hl
- pop af
- or a
- ret
-
-; returns carry if input card ID in register e
-; is not found in deck given by hl
-.FindCardInDeck
- call EnableSRAM
- ld b, DECK_SIZE
-.loop
- ld a, [hli]
- cp e
- jr z, .not_found
- dec b
- jr nz, .loop
-; not found
- call DisableSRAM
- scf
- ret
-.not_found
- call DisableSRAM
- or a
- ret
-
-; preserves all registers
-; hl = start of bytes to set to $0
-; a = number of bytes to set to $0
-ClearNBytesFromHL: ; 9843 (2:5843)
- push af
- push bc
- push hl
- ld b, a
- xor a
-.loop
- ld [hli], a
- dec b
- jr nz, .loop
- pop hl
- pop bc
- pop af
- ret
-
-; returns the number of times that card e
-; appears in wCurDeckCards
-GetCountOfCardInCurDeck: ; 9850 (2:5850)
- push hl
- ld hl, wCurDeckCards
- ld d, 0
-.loop
- ld a, [hli]
- or a
- jr z, .done
- cp e
- jr nz, .loop
- inc d
- jr .loop
-.done
- ld a, d
- pop hl
- ret
-
-; returns total count of card ID e
-; looks it up in wFilteredCardList
-; then uses the index to retrieve the count
-; value from wOwnedCardsCountList
-GetOwnedCardCount: ; 9863 (2:5863)
- push hl
- ld hl, wFilteredCardList
- ld d, -1
-.loop
- inc d
- ld a, [hli]
- or a
- jr z, .not_found
- cp e
- jr nz, .loop
- ld hl, wOwnedCardsCountList
- push de
- ld e, d
- ld d, $00
- add hl, de
- pop de
- ld a, [hl]
- pop hl
- ret
-.not_found
- xor a
- pop hl
- ret
-
-; appends text "X/Y", where X is the number of included cards
-; and Y is the total number of cards in storage of a given card ID
-; input:
-; e = card ID
-AppendOwnedCardCountAndStorageCountNumbers: ; 9880 (2:5880)
- push af
- push bc
- push de
- push hl
-; count how many bytes until $00
-.loop
- ld a, [hl]
- or a
- jr z, .print
- inc hl
- jr .loop
-.print
- push de
- call GetCountOfCardInCurDeck
- call ConvertToNumericalDigits
- ld [hl], TX_SYMBOL
- inc hl
- ld [hl], SYM_SLASH
- inc hl
- pop de
- call GetOwnedCardCount
- call ConvertToNumericalDigits
- ld [hl], TX_END
- pop hl
- pop de
- pop bc
- pop af
- ret
-
-; determines the ones and tens digits in a for printing
-; the ones place is added $20 (SYM_0) so that it maps to a numerical character
-; if the tens is 0, it maps to an empty character
-; a = value to calculate digits
-CalculateOnesAndTensDigits: ; 98a6 (2:58a6)
- push af
- push bc
- push de
- push hl
- ld c, -1
-.loop
- inc c
- sub 10
- jr nc, .loop
- jr z, .zero1
- add 10
- ; a = a mod 10
- ; c = floor(a / 10)
-.zero1
-; ones digit
- add SYM_0
- ld hl, wOnesAndTensPlace
- ld [hli], a
-
-; tens digit
- ld a, c
- or a
- jr z, .zero2
- add SYM_0
-.zero2
- ld [hl], a
-
- pop hl
- pop de
- pop bc
- pop af
- ret
-
-; converts value in register a to
-; numerical symbols for ProcessText
-; places the symbols in hl
-ConvertToNumericalDigits: ; 98c7 (2:58c7)
- call CalculateOnesAndTensDigits
- push hl
- ld hl, wOnesAndTensPlace
- ld a, [hli]
- ld b, a
- ld a, [hl]
- pop hl
- ld [hl], TX_SYMBOL
- inc hl
- ld [hli], a
- ld [hl], TX_SYMBOL
- inc hl
- ld a, b
- ld [hli], a
- ret
-
-; counts the number of cards in wCurDeckCards
-; that are the same type as input in register a
-; if input is $20, counts all energy cards instead
-; input:
-; - a = card type
-; output:
-; - a = number of cards of same type
-CountNumberOfCardsOfType: ; 98dc (2:58dc)
- push de
- push hl
- ld hl, $0
- ld b, a
- ld c, 0
-.loop_cards
- push hl
- push bc
- ld bc, wCurDeckCards
- add hl, bc
- ld a, [hl]
- pop bc
- pop hl
- inc l
- or a
- jr z, .done ; end of card list
-
-; get card type and compare it with input type
-; if input is FILTER_ENERGY, run a separate comparison
-; if it's the same type, increase the count
- ld e, a
- call GetCardType
- jr c, .done
- push hl
- ld l, a
- ld a, b
- and FILTER_ENERGY
- cp FILTER_ENERGY
- jr z, .check_energy
- ld a, l
- pop hl
- cp b
- jr nz, .loop_cards
- jr .incr_count
-
-; counts all energy cards as the same
-.check_energy
- ld a, l
- pop hl
- and TYPE_ENERGY
- cp TYPE_ENERGY
- jr nz, .loop_cards
-.incr_count
- inc c
- jr .loop_cards
-.done
- ld a, c
- pop hl
- pop de
- ret
-
-; prints the card count of each individual card type
-; assumes CountNumberOfCardsForEachCardType was already called
-; this is done by processing text in a single line
-; and concatenating all digits
-PrintCardTypeCounts: ; 9916 (2:5916)
- ld bc, $0
- ld hl, wDefaultText
-.loop
- push hl
- ld hl, wCardFilterCounts
- add hl, bc
- ld a, [hl]
- pop hl
- push bc
- call ConvertToNumericalDigits
- pop bc
- inc c
- ld a, NUM_FILTERS
- cp c
- jr nz, .loop
- ld [hl], TX_END
- lb de, 1, 4
- call InitTextPrinting
- ld hl, wDefaultText
- call ProcessText
- ret
-
-; prints the list of cards, applying the filter from register a
-; the counts of each card displayed is taken from wCurDeck
-; a = card type filter
-PrintFilteredCardList: ; 993d (2:593d)
- push af
- ld hl, CardTypeFilters
- ld b, $00
- ld c, a
- add hl, bc
- ld a, [hl]
- push af
-
-; copy sCardCollection to wTempCardCollection
- call EnableSRAM
- ld hl, sCardCollection
- ld de, wTempCardCollection
- ld b, CARD_COLLECTION_SIZE - 1
- call CopyNBytesFromHLToDE
- call DisableSRAM
-
- ld a, [wIncludeCardsInDeck]
- or a
- jr z, .ok
- call GetPointerToDeckCards
- ld d, h
- ld e, l
- call IncrementDeckCardsInTempCollection
-.ok
- pop af
-
- call CreateFilteredCardList
- ld a, NUM_FILTERED_LIST_VISIBLE_CARDS
- ld [wNumVisibleCardListEntries], a
- lb de, 1, 7
- ld hl, wCardListCoords
- ld [hl], e
- inc hl
- ld [hl], d
- call PrintDeckBuildingCardList
- pop af
- ret
-
-; used to filter the cards in the deck building/card selection screen
-CardTypeFilters: ; 997d (2:597d)
- db FILTER_GRASS
- db FILTER_FIRE
- db FILTER_WATER
- db FILTER_LIGHTNING
- db FILTER_FIGHTING
- db FILTER_PSYCHIC
- db FILTER_COLORLESS
- db FILTER_TRAINER
- db FILTER_ENERGY
- db -1 ; end of list
-
-; counts all the cards from each card type
-; (stored in wCardFilterCounts) and store it in wTotalCardCount
-; also prints it in coordinates de
-PrintTotalCardCount: ; 9987 (2:5987)
- push de
- ld bc, $0
- ld hl, wCardFilterCounts
-.loop
- ld a, [hli]
- add b
- ld b, a
- inc c
- ld a, NUM_FILTERS
- cp c
- jr nz, .loop
- ld hl, wDefaultText
- ld a, b
- ld [wTotalCardCount], a
- push bc
- call ConvertToNumericalDigits
- pop bc
- ld [hl], TX_END
- pop de
- call InitTextPrinting
- ld hl, wDefaultText
- call ProcessText
- ret
-
-; prints the name, level and storage count of the cards
-; that are visible in the list window
-; in the form:
-; CARD NAME/LEVEL X/Y
-; where X is the current count of that card
-; and Y is the storage count of that card
-PrintDeckBuildingCardList: ; 99b0 (2:59b0)
- push bc
- ld hl, wCardListCoords
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld b, 19 ; x coord
- ld c, e
- dec c
- ld a, [wCardListVisibleOffset]
- or a
- jr z, .no_cursor
- ld a, SYM_CURSOR_U
- jr .got_cursor_tile
-.no_cursor
- ld a, SYM_SPACE
-.got_cursor_tile
- call WriteByteToBGMap0
-
-; iterates by decreasing value in wNumVisibleCardListEntries
-; by 1 until it reaches 0
- ld a, [wCardListVisibleOffset]
- ld c, a
- ld b, $0
- ld hl, wFilteredCardList
- add hl, bc
- ld a, [wNumVisibleCardListEntries]
-.loop_filtered_cards
- push de
- or a
- jr z, .exit_loop
- ld b, a
- ld a, [hli]
- or a
- jr z, .invalid_card ; card ID of 0
- ld e, a
- call AddCardIDToVisibleList
- call LoadCardDataToBuffer1_FromCardID
- ld a, 13
- push bc
- push hl
- push de
- call CopyCardNameAndLevel
- pop de
- call AppendOwnedCardCountAndStorageCountNumbers
- pop hl
- pop bc
- pop de
- push hl
- call InitTextPrinting
- ld hl, wDefaultText
- jr .process_text
-
-.invalid_card
- pop de
- push hl
- call InitTextPrinting
- ld hl, Text_9a30
-.process_text
- call ProcessText
- pop hl
-
- ld a, b
- dec a
- inc e
- inc e
- jr .loop_filtered_cards
-
-.exit_loop
- ld a, [hli]
- or a
- jr z, .cannot_scroll
- pop de
-; draw down cursor because
-; there are still more cards
-; to be scrolled down
- xor a ; FALSE
- ld [wUnableToScrollDown], a
- ld a, SYM_CURSOR_D
- jr .draw_cursor
-.cannot_scroll
- pop de
- ld a, TRUE
- ld [wUnableToScrollDown], a
- ld a, SYM_SPACE
-.draw_cursor
- ld b, 19 ; x coord
- ld c, e
- dec c
- dec c
- call WriteByteToBGMap0
- pop bc
- ret
-
-Text_9a30:
- db TX_SYMBOL, TX_END
-
-Text_9a32:
- db TX_SYMBOL, TX_END
-
-Text_9a34:
- db TX_SYMBOL, TX_END
-
-Text_9a36:
- db TX_SYMBOL, TX_END
-
-Text_9a38:
- db TX_SYMBOL, TX_END
-
-Text_9a3a:
- db TX_SYMBOL, TX_END
-
-Text_9a3c:
- db TX_SYMBOL, TX_END
-
-Text_9a3e:
- db TX_SYMBOL, TX_END
-
-Text_9a40:
- db TX_SYMBOL, TX_END
-
-Text_9a42:
- db TX_SYMBOL, TX_END
-
-Text_9a44:
- db TX_SYMBOL, TX_END
-
-Text_9a46:
- db TX_SYMBOL, TX_END
-
-Text_9a48:
- db TX_SYMBOL, TX_END
-
-Text_9a4a:
- db TX_SYMBOL, TX_END
-
-Text_9a4c:
- db TX_SYMBOL, TX_END
-
-Text_9a4e:
- db TX_SYMBOL, TX_END
-
-Text_9a50:
- db TX_SYMBOL, TX_END
-
-Text_9a52:
- db TX_SYMBOL, TX_END
-
-Text_9a54:
- db TX_SYMBOL, TX_END
-
-Text_9a56:
- db TX_SYMBOL, TX_END
-
-Text_9a58:
- done
-
-; writes the card ID in register e to wVisibleListCardIDs
-; given its position in the list in register b
-; input:
-; b = list position (starts from bottom)
-; e = card ID
-AddCardIDToVisibleList: ; 9a59 (2:5a59)
- push af
- push bc
- push hl
- ld hl, wVisibleListCardIDs
- ld c, b
- ld a, [wNumVisibleCardListEntries]
- sub c
- ld c, a ; wNumVisibleCardListEntries - b
- ld b, $0
- add hl, bc
- ld [hl], e
- pop hl
- pop bc
- pop af
- ret
-
-; copies data from hl to:
-; wCardListCursorXPos
-; wCardListCursorYPos
-; wCardListYSpacing
-; wCardListXSpacing
-; wCardListNumCursorPositions
-; wVisibleCursorTile
-; wInvisibleCursorTile
-; wCardListHandlerFunction
-InitCardSelectionParams: ; 9a6d (2:5a6d)
- ld [wCardListCursorPos], a
- ld [hffb3], a
- ld de, wCardListCursorXPos
- ld b, $9
-.loop
- ld a, [hli]
- ld [de], a
- inc de
- dec b
- jr nz, .loop
- xor a
- ld [wCheckMenuCursorBlinkCounter], a
- ret
-
-HandleCardSelectionInput: ; 9a83 (2:5a83)
- xor a ; FALSE
- ld [wPlaysSfx], a
- ldh a, [hDPadHeld]
- or a
- jr z, .handle_ab_btns
-
-; handle d-pad
- ld b, a
- ld a, [wCardListNumCursorPositions]
- ld c, a
- ld a, [wCardListCursorPos]
- bit D_LEFT_F, b
- jr z, .check_d_right
- dec a
- bit 7, a
- jr z, .got_cursor_pos
- ; if underflow, set to max cursor pos
- ld a, [wCardListNumCursorPositions]
- dec a
- jr .got_cursor_pos
-.check_d_right
- bit D_RIGHT_F, b
- jr z, .handle_ab_btns
- inc a
- cp c
- jr c, .got_cursor_pos
- ; if over max pos, set to pos 0
- xor a
-.got_cursor_pos
- push af
- ld a, TRUE
- ld [wPlaysSfx], a
- call DrawHorizontalListCursor_Invisible
- pop af
- ld [wCardListCursorPos], a
- xor a
- ld [wCheckMenuCursorBlinkCounter], a
-
-.handle_ab_btns
- ld a, [wCardListCursorPos]
- ld [hffb3], a
- ldh a, [hKeysPressed]
- and A_BUTTON | B_BUTTON
- jr z, HandleCardSelectionCursorBlink
- and A_BUTTON
- jr nz, ConfirmSelectionAndReturnCarry
- ; b button
- ld a, $ff
- ld [hffb3], a
- call PlaySFXConfirmOrCancel
- scf
- ret
-
-; outputs cursor position in e and selection in a
-ConfirmSelectionAndReturnCarry: ; 9ad7 (2:5ad7)
- call DrawHorizontalListCursor_Visible
- ld a, $01
- call PlaySFXConfirmOrCancel
- ld a, [wCardListCursorPos]
- ld e, a
- ld a, [hffb3]
- scf
- ret
-
-HandleCardSelectionCursorBlink: ; 9ae8 (2:5ae8)
- ld a, [wPlaysSfx]
- or a
- jr z, .skip_sfx
- call PlaySFX
-.skip_sfx
- ld hl, wCheckMenuCursorBlinkCounter
- ld a, [hl]
- inc [hl]
- and $0f
- ret nz
- ld a, [wVisibleCursorTile]
- bit 4, [hl]
- jr z, DrawHorizontalListCursor
-
-DrawHorizontalListCursor_Invisible: ; 9b00 (2:5b00)
- ld a, [wInvisibleCursorTile]
-; fallthrough
-
-; like DrawListCursor but only
-; for lists with one line, and each entry
-; being laid horizontally
-; a = tile to write
-DrawHorizontalListCursor: ; 9b03 (2:5b03)
- ld e, a
- ld a, [wCardListXSpacing]
- ld l, a
- ld a, [wCardListCursorPos]
- ld h, a
- call HtimesL
- ld a, l
- ld hl, wCardListCursorXPos
- add [hl]
- ld b, a ; x coord
- ld hl, wCardListCursorYPos
- ld a, [hl]
- ld c, a ; y coord
- ld a, e
- call WriteByteToBGMap0
- or a
- ret
-
-DrawHorizontalListCursor_Visible: ; 9b20 (2:5b20)
- ld a, [wVisibleCursorTile]
- jr DrawHorizontalListCursor
-
-; handles user input when selecting cards to add
-; to deck configuration
-; returns carry if a selection was made
-; (either selected card or cancelled)
-; outputs in a the list index if selection was made
-; or $ff if operation was cancelled
-HandleDeckCardSelectionList: ; 9b25 (2:5b25)
- xor a ; FALSE
- ld [wPlaysSfx], a
-
- ldh a, [hDPadHeld]
- or a
- jp z, .asm_9bb9
-
- ld b, a
- ld a, [wCardListNumCursorPositions]
- ld c, a
- ld a, [wCardListCursorPos]
- bit D_UP_F, b
- jr z, .check_d_down
- push af
- ld a, TRUE
- ld [wPlaysSfx], a
- pop af
- dec a
- bit 7, a
- jr z, .asm_9b8f
- ld a, [wCardListVisibleOffset]
- or a
- jr z, .asm_9b5a
- dec a
- ld [wCardListVisibleOffset], a
- ld hl, wCardListUpdateFunction
- call CallIndirect
- xor a
- jr .asm_9b8f
-.asm_9b5a
- xor a
- ld [wPlaysSfx], a
- jr .asm_9b8f
-
-.check_d_down
- bit D_DOWN_F, b
- jr z, .asm_9b9d
- push af
- ld a, TRUE
- ld [wPlaysSfx], a
- pop af
- inc a
- cp c
- jr c, .asm_9b8f
- push af
- ld a, [wUnableToScrollDown]
- or a
- jr nz, .cannot_scroll_down
- ld a, [wCardListVisibleOffset]
- inc a
- ld [wCardListVisibleOffset], a
- ld hl, wCardListUpdateFunction
- call CallIndirect
- pop af
- dec a
- jr .asm_9b8f
-
-.cannot_scroll_down
- pop af
- dec a
- push af
- xor a ; FALSE
- ld [wPlaysSfx], a
- pop af
-
-.asm_9b8f
- push af
- call DrawListCursor_Invisible
- pop af
- ld [wCardListCursorPos], a
- xor a
- ld [wCheckMenuCursorBlinkCounter], a
- jr .asm_9bb9
-.asm_9b9d
- ld a, [wced2]
- or a
- jr z, .asm_9bb9
-
- bit D_LEFT_F, b
- jr z, .check_d_right
- call GetSelectedVisibleCardID
- call RemoveCardFromDeckAndUpdateCount
- jr .asm_9bb9
-.check_d_right
- bit D_RIGHT_F, b
- jr z, .asm_9bb9
- call GetSelectedVisibleCardID
- call AddCardToDeckAndUpdateCount
-
-.asm_9bb9
- ld a, [wCardListCursorPos]
- ld [hffb3], a
- ld hl, wCardListHandlerFunction
- ld a, [hli]
- or [hl]
- jr z, .handle_ab_btns
-
- ; this code seemingly never runs
- ; because wCardListHandlerFunction is always NULL
- ld a, [hld]
- ld l, [hl]
- ld h, a
- ld a, [hffb3]
- call CallHL
- jr nc, .handle_blink
-
-.select_card
- call DrawListCursor_Visible
- ld a, $01
- call PlaySFXConfirmOrCancel
- ld a, [wCardListCursorPos]
- ld e, a
- ld a, [hffb3]
- scf
- ret
-
-.handle_ab_btns
- ldh a, [hKeysPressed]
- and A_BUTTON | B_BUTTON
- jr z, .check_sfx
- and A_BUTTON
- jr nz, .select_card
- ld a, $ff
- ld [hffb3], a
- call PlaySFXConfirmOrCancel
- scf
- ret
-
-.check_sfx
- ld a, [wPlaysSfx]
- or a
- jr z, .handle_blink
- call PlaySFX
-.handle_blink
- ld hl, wCheckMenuCursorBlinkCounter
- ld a, [hl]
- inc [hl]
- and $0f
- ret nz
- ld a, [wVisibleCursorTile]
- bit 4, [hl]
- jr z, DrawListCursor
-; fallthrough
-
-DrawListCursor_Invisible: ; 9c0e (2:5c0e)
- ld a, [wInvisibleCursorTile]
-; fallthrough
-
-; draws cursor considering wCardListCursorPos
-; spaces each entry horizontally by wCardListXSpacing
-; and vertically by wCardListYSpacing
-; a = tile to write
-DrawListCursor: ; 9c11 (2:5c11)
- ld e, a
- ld a, [wCardListXSpacing]
- ld l, a
- ld a, [wCardListCursorPos]
- ld h, a
- call HtimesL
- ld a, l
- ld hl, wCardListCursorXPos
- add [hl]
- ld b, a ; x coord
- ld a, [wCardListYSpacing]
- ld l, a
- ld a, [wCardListCursorPos]
- ld h, a
- call HtimesL
- ld a, l
- ld hl, wCardListCursorYPos
- add [hl]
- ld c, a ; y coord
- ld a, e
- call WriteByteToBGMap0
- or a
- ret
-
-DrawListCursor_Visible: ; 9c3a (2:5c3a)
- ld a, [wVisibleCursorTile]
- jr DrawListCursor
-
-OpenCardPageFromCardList: ; 9c3f (2:5c3f)
-; get the card index that is selected
-; and open its card page
- ld hl, wCurCardListPtr
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [wCardListCursorPos]
- ld c, a
- ld b, $0
- add hl, bc
- ld a, [wCardListVisibleOffset]
- ld c, a
- ld b, $0
- add hl, bc
- ld e, [hl]
- ld d, $0
- push de
- call LoadCardDataToBuffer1_FromCardID
- lb de, $38, $9f
- call SetupText
- bank1call OpenCardPage_FromCheckHandOrDiscardPile
- pop de
-
-.handle_input
- ldh a, [hDPadHeld]
- ld b, a
- and A_BUTTON | B_BUTTON | SELECT | START
- jp nz, .exit
-
-; check d-pad
-; if UP or DOWN is pressed, change the
-; card that is being shown, given the
-; order in the current card list
- xor a ; FALSE
- ld [wPlaysSfx], a
- ld a, [wCardListNumCursorPositions]
- ld c, a
- ld a, [wCardListCursorPos]
- bit D_UP_F, b
- jr z, .check_d_down
- push af
- ld a, TRUE
- ld [wPlaysSfx], a
- pop af
- dec a
- bit 7, a
- jr z, .reopen_card_page
- ld a, [wCardListVisibleOffset]
- or a
- jr z, .handle_regular_card_page_input
- dec a
- ld [wCardListVisibleOffset], a
- xor a
- jr .reopen_card_page
-
-.check_d_down
- bit D_DOWN_F, b
- jr z, .handle_regular_card_page_input
- push af
- ld a, TRUE
- ld [wPlaysSfx], a
- pop af
- inc a
- cp c
- jr c, .reopen_card_page
- push af
- ld hl, wCurCardListPtr
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [wCardListCursorPos]
- ld c, a
- ld b, $0
- add hl, bc
- ld a, [wCardListVisibleOffset]
- inc a
- ld c, a
- ld b, $0
- add hl, bc
- ld a, [hl]
- or a
- jr z, .skip_change_card
- ld a, [wCardListVisibleOffset]
- inc a
- ld [wCardListVisibleOffset], a
- pop af
- dec a
-.reopen_card_page
- ld [wCardListCursorPos], a
- ld a, [wPlaysSfx]
- or a
- jp z, OpenCardPageFromCardList
- call PlaySFX
- jp OpenCardPageFromCardList
-
-.skip_change_card
- pop af
- jr .handle_regular_card_page_input ; unnecessary jr
-.handle_regular_card_page_input
- push de
- bank1call OpenCardPage.input_loop
- pop de
- jp .handle_input
-
-.exit
- ld a, $1
- ld [wVBlankOAMCopyToggle], a
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
- ret
-
-; opens card page from the card list
-; unreferenced?
-Func_9ced: ; 9ced (2:5ced)
- ld hl, wVisibleListCardIDs
- ld a, [wCardListCursorPos]
- ld c, a
- ld b, $00
- add hl, bc
- ld e, [hl]
- inc hl
- ld d, [hl]
- call LoadCardDataToBuffer1_FromCardID
- ld de, $389f
- call SetupText
- bank1call OpenCardPage_FromHand
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- ret
-
-; adds card in register e to deck configuration
-; and updates the values shown for its count
-; in the card selection list
-; input:
-; e = card ID
-AddCardToDeckAndUpdateCount: ; 9d0c (2:5d0c)
- call TryAddCardToDeck
- ret c ; failed to add card
- push de
- call PrintCardTypeCounts
- lb de, 15, 0
- call PrintTotalCardCount
- pop de
- call GetCountOfCardInCurDeck
- call PrintNumberValueInCursorYPos
- ret
-
-; tries to add card ID in register e to wCurDeckCards
-; fails to add card if one of the following conditions are met:
-; - total cards are equal to wMaxNumCardsAllowed
-; - cards with the same name as it reached the allowed limit
-; - player doesn't own more copies in the collection
-; returns carry if fails
-; otherwise, writes card ID to first empty slot in wCurDeckCards
-; input:
-; e = card ID
-TryAddCardToDeck: ; 9d22 (2:5d22)
- ld a, [wMaxNumCardsAllowed]
- ld d, a
- ld a, [wTotalCardCount]
- cp d
- jr nz, .not_equal
- ; wMaxNumCardsAllowed == wTotalCardCount
- scf
- ret
-
-.not_equal
- push de
- call .CheckIfCanAddCardWithSameName
- pop de
- ret c ; cannot add more cards with this name
-
- push de
- call GetCountOfCardInCurDeck
- ld b, a
- ld hl, wOwnedCardsCountList
- ld d, $0
- ld a, [wCardListVisibleOffset]
- ld e, a
- add hl, de
- ld a, [wCardListCursorPos]
- ld e, a
- add hl, de
- ld d, [hl]
- ld a, b
- cp d
- pop de
- scf
- ret z ; cannot add because player doesn't own more copies
-
- ld a, SFX_01
- call PlaySFX
- push de
- call .AddCardToCurDeck
- ld a, [wCurCardTypeFilter]
- ld c, a
- ld b, $0
- ld hl, wCardFilterCounts
- add hl, bc
- inc [hl]
- pop de
- or a
- ret
-
-; finds first empty slot in wCurDeckCards
-; then writes the value in e to it
-.AddCardToCurDeck
- ld hl, wCurDeckCards
-.loop
- ld a, [hl]
- or a
- jr z, .empty
- inc hl
- jr .loop
-.empty
- ld [hl], e
- inc hl
- xor a
- ld [hl], a
- ret
-
-; returns carry if card ID in e cannot be
-; added to the current deck configuration
-; due to having reached the maximum number
-; of cards allowed with that same name
-; e = card id
-.CheckIfCanAddCardWithSameName
- call LoadCardDataToBuffer1_FromCardID
- ld a, [wLoadedCard1Type]
- cp TYPE_ENERGY_DOUBLE_COLORLESS
- jr z, .double_colorless
- ; basic energy cards have no limit
- and TYPE_ENERGY
- cp TYPE_ENERGY
- jr z, .exit ; return if basic energy card
-.double_colorless
-
-; compare this card's name to
-; the names of cards in list wCurDeckCards
- ld a, [wLoadedCard1Name + 0]
- ld c, a
- ld a, [wLoadedCard1Name + 1]
- ld b, a
- ld hl, wCurDeckCards
- ld d, 0
- push de
-.loop_cards
- ld a, [hli]
- or a
- jr z, .exit_pop_de
- ld e, a
- ld d, $0
- call GetCardName
- ld a, e
- cp c
- jr nz, .loop_cards
- ld a, d
- cp b
- jr nz, .loop_cards
- ; has same name
- pop de
- inc d ; increment counter of cards with this name
- ld a, [wSameNameCardsLimit]
- cp d
- push de
- jr nz, .loop_cards
- ; reached the maximum number
- ; of cards with same name allowed
- pop de
- scf
- ret
-
-.exit_pop_de
- pop de
-.exit
- or a
- ret
-
-; gets the element in wVisibleListCardIDs
-; corresponding to index wCardListCursorPos
-GetSelectedVisibleCardID: ; 9db3 (2:5db3)
- ld hl, wVisibleListCardIDs
- ld a, [wCardListCursorPos]
- ld e, a
- ld d, $00
- add hl, de
- ld e, [hl]
- ret
-
-; appends the digits of value in register a to wDefaultText
-; then prints it in cursor Y position
-; a = value to convert to numerical digits
-PrintNumberValueInCursorYPos: ; 9dbf (2:5dbf)
- ld hl, wDefaultText
- call ConvertToNumericalDigits
- ld [hl], TX_END
- ld a, [wCardListYSpacing]
- ld l, a
- ld a, [wCardListCursorPos]
- ld h, a
- call HtimesL
- ld a, l
- ld hl, wCardListCursorYPos
- add [hl]
- ld e, a
- ld d, 14
- call InitTextPrinting
- ld hl, wDefaultText
- call ProcessText
- ret
-
-; removes card in register e from deck configuration
-; and updates the values shown for its count
-; in the card selection list
-; input:
-; e = card ID
-RemoveCardFromDeckAndUpdateCount: ; 9de4 (2:5de4)
- call RemoveCardFromDeck
- ret nc
- push de
- call PrintCardTypeCounts
- lb de, 15, 0
- call PrintTotalCardCount
- pop de
- call GetCountOfCardInCurDeck
- call PrintNumberValueInCursorYPos
- ret
-
-; removes card ID in e from wCurDeckCards
-RemoveCardFromDeck: ; 9dfa (2:5dfa)
- push de
- call GetCountOfCardInCurDeck
- pop de
- or a
- ret z ; card is not in deck
- ld a, SFX_01
- call PlaySFX
- push de
- call .RemoveCard
- ld a, [wCurCardTypeFilter]
- ld c, a
- ld b, $0
- ld hl, wCardFilterCounts
- add hl, bc
- dec [hl]
- pop de
- scf
- ret
-
-; remove first card instance of card ID in e
-; and shift all elements up by one
-.RemoveCard
- ld hl, wCurDeckCards
- ld d, 0 ; unnecessary
-.loop_1
- inc d ; unnecessary
- ld a, [hli]
- cp e
- jr nz, .loop_1
- ld c, l
- ld b, h
- dec bc
-
-.loop_2
- inc d ; unnecessary
- ld a, [hli]
- or a
- jr z, .done
- ld [bc], a
- inc bc
- jr .loop_2
-
-.done
- xor a
- ld [bc], a
- ret
-
-UpdateConfirmationCardScreen: ; 9e31 (2:5e31)
- ld hl, hffb0
- ld [hl], $01
- call PrintCurDeckNumberAndName
- ld hl, hffb0
- ld [hl], $00
- jp PrintConfirmationCardList
-
-HandleDeckConfirmationMenu: ; 9e41 (2:5e41)
-; if deck is empty, just show deck info header with empty card list
- ld a, [wTotalCardCount]
- or a
- jp z, ShowDeckInfoHeaderAndWaitForBButton
-
-; create list of all unique cards
- call SortCurDeckCardsByID
- call CreateCurDeckUniqueCardList
-
- xor a
- ld [wCardListVisibleOffset], a
-.init_params
- ld hl, .CardSelectionParams
- call InitCardSelectionParams
- ld a, [wNumUniqueCards]
- ld [wNumCardListEntries], a
- cp NUM_DECK_CONFIRMATION_VISIBLE_CARDS
- jr c, .no_cap
- ld a, NUM_DECK_CONFIRMATION_VISIBLE_CARDS
-.no_cap
- ld [wCardListNumCursorPositions], a
- ld [wNumVisibleCardListEntries], a
- call ShowConfirmationCardScreen
-
- ld hl, UpdateConfirmationCardScreen
- ld d, h
- ld a, l
- ld hl, wCardListUpdateFunction
- ld [hli], a
- ld [hl], d
-
- xor a
- ld [wced2], a
-.loop_input
- call DoFrame
- call HandleDeckCardSelectionList
- jr c, .selection_made
- call HandleLeftRightInCardList
- jr c, .loop_input
- ldh a, [hDPadHeld]
- and START
- jr z, .loop_input
-
-.selected_card
- ld a, $01
- call PlaySFXConfirmOrCancel
- ld a, [wCardListCursorPos]
- ld [wced7], a
-
- ; set wOwnedCardsCountList as current card list
- ; and show card page screen
- ld de, wOwnedCardsCountList
- ld hl, wCurCardListPtr
- ld [hl], e
- inc hl
- ld [hl], d
- call OpenCardPageFromCardList
- jr .init_params
-
-.selection_made
- ld a, [hffb3]
- cp $ff
- ret z ; operation cancelled
- jr .selected_card
-
-.CardSelectionParams
- db 0 ; x pos
- db 5 ; y pos
- db 2 ; y spacing
- db 0 ; x spacing
- db 7 ; num entries
- db SYM_CURSOR_R ; visible cursor tile
- db SYM_SPACE ; invisible cursor tile
- dw NULL ; wCardListHandlerFunction
-
-; handles pressing left/right in card lists
-; scrolls up/down a number of wCardListNumCursorPositions
-; entries respectively
-; returns carry if scrolling happened
-HandleLeftRightInCardList: ; 9eb8 (2:5eb8)
- ld a, [wCardListNumCursorPositions]
- ld d, a
- ld a, [wCardListVisibleOffset]
- ld c, a
- ldh a, [hDPadHeld]
- cp D_RIGHT
- jr z, .right
- cp D_LEFT
- jr z, .left
- or a
- ret
-
-.right
- ld a, [wCardListVisibleOffset]
- add d
- ld b, a
- add d
- ld hl, wNumCardListEntries
- cp [hl]
- jr c, .got_new_pos
- ld a, [wNumCardListEntries]
- sub d
- ld b, a
- jr .got_new_pos
-
-.left
- ld a, [wCardListVisibleOffset]
- sub d
- ld b, a
- jr nc, .got_new_pos
- ld b, 0 ; first index
-.got_new_pos
- ld a, b
- ld [wCardListVisibleOffset], a
- cp c
- jr z, .asm_9efa
- ld a, SFX_01
- call PlaySFX
- ld hl, wCardListUpdateFunction
- call CallIndirect
-.asm_9efa
- scf
- ret
-
-; handles scrolling up and down with Select button
-; in this case, the cursor position goes up/down
-; by wCardListNumCursorPositions entries respectively
-; return carry if scrolling happened, otherwise no carry
-HandleSelectUpAndDownInList: ; 9efc (2:5efc)
- ld a, [wCardListNumCursorPositions]
- ld d, a
- ld a, [wCardListVisibleOffset]
- ld c, a
- ldh a, [hDPadHeld]
- cp SELECT | D_DOWN
- jr z, .sel_down
- cp SELECT | D_UP
- jr z, .sel_up
- or a
- ret
-
-.sel_down
- ld a, [wCardListVisibleOffset]
- add d
- ld b, a ; wCardListVisibleOffset + wCardListNumCursorPositions
- add d
- ld hl, wNumCardListEntries
- cp [hl]
- jr c, .got_new_pos
- ld a, [wNumCardListEntries]
- sub d
- ld b, a ; wNumCardListEntries - wCardListNumCursorPositions
- jr .got_new_pos
-.sel_up
- ld a, [wCardListVisibleOffset]
- sub d
- ld b, a ; wCardListVisibleOffset - wCardListNumCursorPositions
- jr nc, .got_new_pos
- ld b, 0 ; go to first position
-
-.got_new_pos
- ld a, b
- ld [wCardListVisibleOffset], a
- cp c
- jr z, .set_carry
- ld a, SFX_01
- call PlaySFX
- ld hl, wCardListUpdateFunction
- call CallIndirect
-.set_carry
- scf
- ret
-
-; simply draws the deck info header
-; then awaits a b button press to exit
-ShowDeckInfoHeaderAndWaitForBButton: ; 9f40 (2:5f40)
- call ShowDeckInfoHeader
-.wait_input
- call DoFrame
- ldh a, [hKeysPressed]
- and B_BUTTON
- jr z, .wait_input
- ld a, $ff
- call PlaySFXConfirmOrCancel
- ret
-
-ShowConfirmationCardScreen: ; 9f52 (2:5f52)
- call ShowDeckInfoHeader
- lb de, 3, 5
- ld hl, wCardListCoords
- ld [hl], e
- inc hl
- ld [hl], d
- call PrintConfirmationCardList
- ret
-
-; counts all values stored in wCardFilterCounts
-; if the total count is 0, then
-; prints "No cards chosen."
-TallyCardsInCardFilterLists: ; 9f62 (2:5f62)
- lb bc, 0, 0
- ld hl, wCardFilterCounts
-.loop
- ld a, [hli]
- add b
- ld b, a
- inc c
- ld a, NUM_FILTERS
- cp c
- jr nz, .loop
- ld a, b
- or a
- ret nz
- lb de, 11, 1
- call InitTextPrinting
- ldtx hl, NoCardsChosenText
- call ProcessTextFromID
- ret
-
-; draws a box on the top of the screen
-; with wCurDeck's number, name and card count
-; and draws the Hand Cards icon if it's
-; the current dueling deck
-ShowDeckInfoHeader: ; 9f81 (2:5f81)
- call EmptyScreenAndLoadFontDuelAndHandCardsIcons
- lb de, 0, 0
- lb bc, 20, 4
- call DrawRegularTextBox
- ld a, [wCurDeckName]
- or a
- jp z, .print_card_count ; can be jr
-
-; draw hand cards icon if it's the current dueling deck
- call PrintCurDeckNumberAndName
- ld a, [wCurDeck]
- ld b, a
- call EnableSRAM
- ld a, [sCurrentlySelectedDeck]
- call DisableSRAM
- cp b
- jr nz, .print_card_count
- lb de, 2, 1
- call DrawHandCardsTileAtDE
-
-.print_card_count
- lb de, 14, 1
- call PrintTotalCardCount
- lb de, 16, 1
- call PrintSlashSixty
- call TallyCardsInCardFilterLists
- call EnableLCD
- ret
-
-; prints the name of wCurDeck in the form
-; "X· <deck name> deck", where X is the number
-; of the deck in the given menu
-; if no current deck, print blank line
-PrintCurDeckNumberAndName: ; 9fc0 (2:5fc0)
- ld a, [wCurDeck]
- cp $ff
- jr z, .skip_deck_numeral
-
-; print the deck number in the menu
-; in the form "X·"
- lb de, 3, 2
- call InitTextPrinting
- ld a, [wCurDeck]
- bit 7, a
- jr z, .incr_by_one
- and $7f
- jr .got_deck_numeral
-.incr_by_one
- inc a
-.got_deck_numeral
- ld hl, wDefaultText
- call ConvertToNumericalDigits
- ld [hl], "FW0_·"
- inc hl
- ld [hl], TX_END
- ld hl, wDefaultText
- call ProcessText
-
-.skip_deck_numeral
- ld hl, wCurDeckName
- ld de, wDefaultText
- call CopyListFromHLToDE
- ld a, [wCurDeck]
- cp $ff
- jr z, .blank_deck_name
-
-; print "<deck name> deck"
- ld hl, wDefaultText
- call GetTextLengthInTiles
- ld b, $0
- ld hl, wDefaultText
- add hl, bc
- ld d, h
- ld e, l
- ld hl, DeckNameSuffix
- call CopyListFromHLToDE
- lb de, 6, 2
- ld hl, wDefaultText
- call InitTextPrinting
- call ProcessText
- ret
-
-.blank_deck_name
- lb de, 2, 2
- ld hl, wDefaultText
- call InitTextPrinting
- call ProcessText
- ret
-
-; sorts wCurDeckCards by ID
-SortCurDeckCardsByID: ; a028 (2:6028)
-; wOpponentDeck is used to temporarily store deck's cards
-; so that it can be later sorted by ID
- ld hl, wCurDeckCards
- ld de, wOpponentDeck
- ld bc, wDuelTempList
- ld a, -1
- ld [bc], a
-.loop_copy
- inc a ; incr deck index
- push af
- ld a, [hli]
- ld [de], a
- inc de
- or a
- jr z, .sort_cards
- pop af
- ld [bc], a ; store deck index
- inc bc
- jr .loop_copy
-
-.sort_cards
- pop af
- ld a, $ff ; terminator byte for wDuelTempList
- ld [bc], a
-
-; force Opp Turn so that SortCardsInDuelTempListByID can be used
- ldh a, [hWhoseTurn]
- push af
- ld a, OPPONENT_TURN
- ldh [hWhoseTurn], a
- call SortCardsInDuelTempListByID
- pop af
- ldh [hWhoseTurn], a
-
-; given the ordered cards in wOpponentDeck,
-; each entry in it corresponds to its deck index
-; (first ordered card is deck index 0, second is deck index 1, etc)
-; place these in this order in wCurDeckCards
- ld hl, wCurDeckCards
- ld de, wDuelTempList
-.loop_order_by_deck_index
- ld a, [de]
- cp $ff
- jr z, .done
- ld c, a
- ld b, $0
- push hl
- ld hl, wOpponentDeck
- add hl, bc
- ld a, [hl]
- pop hl
- ld [hli], a
- inc de
- jr .loop_order_by_deck_index
-
-.done
- xor a
- ld [hl], a
- ret
-
-; goes through list in wCurDeckCards, and for each card in it
-; creates list in wUniqueDeckCardList of all unique cards
-; it finds (assuming wCurDeckCards is sorted by ID)
-; also counts the total number of the different cards
-CreateCurDeckUniqueCardList: ; a06e (2:606e)
- ld b, 0
- ld c, $0
- ld hl, wCurDeckCards
- ld de, wUniqueDeckCardList
-.loop
- ld a, [hli]
- cp c
- jr z, .loop
- ld c, a
- ld [de], a
- inc de
- or a
- jr z, .done
- inc b
- jr .loop
-.done
- ld a, b
- ld [wNumUniqueCards], a
- ret
-
-; prints the list of cards visible in the window
-; of the confirmation screen
-; card info is presented with name, level and
-; its count preceded by "x"
-PrintConfirmationCardList: ; a08a (2:608a)
- push bc
- ld hl, wCardListCoords
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld b, 19 ; x coord
- ld c, e
- dec c
- ld a, [wCardListVisibleOffset]
- or a
- jr z, .no_cursor
- ld a, SYM_CURSOR_U
- jr .got_cursor_tile_1
-.no_cursor
- ld a, SYM_SPACE
-.got_cursor_tile_1
- call WriteByteToBGMap0
-
-; iterates by decreasing value in wNumVisibleCardListEntries
-; by 1 until it reaches 0
- ld a, [wCardListVisibleOffset]
- ld c, a
- ld b, $0
- ld hl, wOwnedCardsCountList
- add hl, bc
- ld a, [wNumVisibleCardListEntries]
-.loop_cards
- push de
- or a
- jr z, .exit_loop
- ld b, a
- ld a, [hli]
- or a
- jr z, .no_more_cards
- ld e, a
- call AddCardIDToVisibleList
- call LoadCardDataToBuffer1_FromCardID
- ; places in wDefaultText the card's name and level
- ; then appends at the end "x" with the count of that card
- ; draws the card's type icon as well
- ld a, 13
- push bc
- push hl
- push de
- call CopyCardNameAndLevel
- pop de
- call .PrintCardCount
- pop hl
- pop bc
- pop de
- call .DrawCardTypeIcon
- push hl
- call InitTextPrinting
- ld hl, wDefaultText
- call ProcessText
- pop hl
- ld a, b
- dec a
- inc e
- inc e
- jr .loop_cards
-
-.exit_loop
- ld a, [hli]
- or a
- jr z, .no_more_cards
- pop de
- xor a ; FALSE
- ld [wUnableToScrollDown], a
- ld a, SYM_CURSOR_D
- jr .got_cursor_tile_2
-
-.no_more_cards
- pop de
- ld a, TRUE
- ld [wUnableToScrollDown], a
- ld a, SYM_SPACE
-.got_cursor_tile_2
- ld b, 19 ; x coord
- ld c, e
- dec c
- dec c
- call WriteByteToBGMap0
- pop bc
- ret
-
-; prints the card count preceded by a cross
-; for example "x42"
-.PrintCardCount
- push af
- push bc
- push de
- push hl
-.loop_search
- ld a, [hl]
- or a
- jr z, .found_card_id
- inc hl
- jr .loop_search
-.found_card_id
- call GetCountOfCardInCurDeck
- ld [hl], TX_SYMBOL
- inc hl
- ld [hl], SYM_CROSS
- inc hl
- call ConvertToNumericalDigits
- ld [hl], TX_END
- pop hl
- pop de
- pop bc
- pop af
- ret
-
-; draws the icon corresponding to the loaded card's type
-; can be any of Pokemon stages (basic, 1st and 2nd stage)
-; Energy or Trainer
-; draws it 2 tiles to the left and 1 up to
-; the current coordinate in de
-.DrawCardTypeIcon
- push hl
- push de
- push bc
- ld a, [wLoadedCard1Type]
- cp TYPE_ENERGY
- jr nc, .not_pkmn_card
-
-; pokemon card
- ld a, [wLoadedCard1Stage]
- ld b, a
- add b
- add b
- add b ; *4
- add ICON_TILE_BASIC_POKEMON
- jr .got_tile
-
-.not_pkmn_card
- cp TYPE_TRAINER
- jr nc, .trainer_card
-
-; energy card
- sub TYPE_ENERGY
- ld b, a
- add b
- add b
- add b ; *4
- add ICON_TILE_FIRE
- jr .got_tile
-
-.trainer_card
- ld a, ICON_TILE_TRAINER
-.got_tile
- dec d
- dec d
- dec e
- push af
- lb hl, 1, 2
- lb bc, 2, 2
- call FillRectangle
- pop af
-
- call GetCardTypeIconPalette
- ld b, a
- ld a, [wConsole]
- cp CONSOLE_CGB
- jr nz, .skip_pal
- ld a, b
- lb bc, 2, 2
- lb hl, 0, 0
- call BankswitchVRAM1
- call FillRectangle
- call BankswitchVRAM0
-.skip_pal
- pop bc
- pop de
- pop hl
- ret
-
-; returns in a the BG Pal corresponding to the
-; card type icon in input register a
-; if not found, returns $00
-GetCardTypeIconPalette: ; a173 (2:6173)
- push bc
- push hl
- ld b, a
- ld hl, .CardTypeIconPalettes
-.loop
- ld a, [hli]
- or a
- jr z, .done
- cp b
- jr z, .done
- inc hl
- jp .loop ; can be jr
-.done
- ld a, [hl]
- pop hl
- pop bc
- ret
-
-.CardTypeIconPalettes
-; icon tile, BG pal
- db ICON_TILE_FIRE, 1
- db ICON_TILE_GRASS, 2
- db ICON_TILE_LIGHTNING, 1
- db ICON_TILE_WATER, 2
- db ICON_TILE_FIGHTING, 3
- db ICON_TILE_PSYCHIC, 3
- db ICON_TILE_COLORLESS, 0
- db ICON_TILE_ENERGY, 2
- db ICON_TILE_BASIC_POKEMON, 2
- db ICON_TILE_STAGE_1_POKEMON, 2
- db ICON_TILE_STAGE_2_POKEMON, 1
- db ICON_TILE_TRAINER, 2
- db $00, $ff
-
-; inits WRAM vars to start creating deck configuration to send
-PrepareToBuildDeckConfigurationToSend: ; a1a2 (2:61a2)
- ld hl, wCurDeckCards
- ld a, wCurDeckCardsEnd - wCurDeckCards
- call ClearNBytesFromHL
- ld a, $ff
- ld [wCurDeck], a
- ld hl, .text
- ld de, wCurDeckName
- call CopyListFromHLToDE
- ld hl, .DeckConfigurationParams
- call InitDeckBuildingParams
- call HandleDeckBuildScreen
- ret
-
-.text
- text "Cards chosen to send"
- done
-
-.DeckConfigurationParams
- db DECK_SIZE ; max number of cards
- db 60 ; max number of same name cards
- db FALSE ; whether to include deck cards
- dw HandleSendDeckConfigurationMenu
- dw SendDeckConfigurationMenu_TransitionTable
-
-SendDeckConfigurationMenu_TransitionTable: ; a1df (2:61df)
- cursor_transition $10, $20, $00, $00, $00, $01, $02
- cursor_transition $48, $20, $00, $01, $01, $02, $00
- cursor_transition $80, $20, $00, $02, $02, $00, $01
-
-SendDeckConfigurationMenuData: ; a1f4 (2:61f4)
- textitem 2, 2, ConfirmText
- textitem 9, 2, SendText
- textitem 16, 2, CancelText
- db $ff
-
-HandleSendDeckConfigurationMenu: ; a201 (2:6201)
- ld de, $0
- lb bc, 20, 6
- call DrawRegularTextBox
- ld hl, SendDeckConfigurationMenuData
- call PlaceTextItems
- ld a, $ff
- ld [wDuelInitialPrizesUpperBitsSet], a
-.loop_input
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- call DoFrame
- call YourOrOppPlayAreaScreen_HandleInput
- jr nc, .loop_input
- ld [wced6], a
- cp $ff
- jr nz, .asm_a23b
- call DrawCardTypeIconsAndPrintCardCounts
- ld a, [wTempCardListCursorPos]
- ld [wCardListCursorPos], a
- ld a, [wCurCardTypeFilter]
- call PrintFilteredCardList
- jp HandleDeckBuildScreen.skip_draw
-.asm_a23b
- ld hl, .func_table
- call JumpToFunctionInTable
- jp OpenDeckConfigurationMenu.skip_init
-
-.func_table
- dw ConfirmDeckConfiguration ; Confirm
- dw .SendDeckConfiguration ; Send
- dw .CancelSendDeckConfiguration ; Cancel
-
-.SendDeckConfiguration
- ld a, [wCurDeckCards]
- or a
- jr z, .CancelSendDeckConfiguration
- xor a
- ld [wCardListVisibleOffset], a
- ld hl, Data_b04a
- call InitCardSelectionParams
- ld hl, wCurDeckCards
- ld de, wDuelTempList
- call CopyListFromHLToDE
- call PrintCardToSendText
- call Func_b088
- call EnableLCD
- ldtx hl, SendTheseCardsText
- call YesOrNoMenuWithText
- jr nc, .asm_a279
- add sp, $2
- jp HandleDeckBuildScreen.skip_count
-.asm_a279
- add sp, $2
- scf
- ret
-
-.CancelSendDeckConfiguration
- add sp, $2
- or a
- ret
-
-; copies b bytes from hl to de
-CopyNBytesFromHLToDE: ; a281 (2:6281)
- ld a, [hli]
- ld [de], a
- inc de
- dec b
- jr nz, CopyNBytesFromHLToDE
- ret
-
-; handles the screen showing all the player's cards
-HandlePlayersCardsScreen: ; a288 (2:6288)
- call WriteCardListsTerminatorBytes
- call PrintPlayersCardsHeaderInfo
- xor a
- ld [wCardListVisibleOffset], a
- ld [wCurCardTypeFilter], a
- call PrintFilteredCardSelectionList
- call EnableLCD
- xor a
- ld hl, FiltersCardSelectionParams
- call InitCardSelectionParams
-.wait_input
- call DoFrame
- ld a, [wCurCardTypeFilter]
- ld b, a
- ld a, [wTempCardTypeFilter]
- cp b
- jr z, .check_d_down
- ld [wCurCardTypeFilter], a
- ld hl, wCardListVisibleOffset
- ld [hl], $00
- call PrintFilteredCardSelectionList
-
- ld hl, hffb0
- ld [hl], $01
- call PrintPlayersCardsText
- ld hl, hffb0
- ld [hl], $00
-
- ld a, NUM_FILTERS
- ld [wCardListNumCursorPositions], a
-.check_d_down
- ldh a, [hDPadHeld]
- and D_DOWN
- jr z, .no_d_down
- call ConfirmSelectionAndReturnCarry
- jr .jump_to_list
-
-.no_d_down
- call HandleCardSelectionInput
- jr nc, .wait_input
- ld a, [hffb3]
- cp $ff ; operation cancelled
- jr nz, .jump_to_list
- ret
-
-.jump_to_list
- ld a, [wNumEntriesInCurFilter]
- or a
- jr z, .wait_input
-
- xor a
- ld hl, Data_a396
- call InitCardSelectionParams
- ld a, [wNumEntriesInCurFilter]
- ld [wNumCardListEntries], a
- ld hl, wNumVisibleCardListEntries
- cp [hl]
- jr nc, .asm_a300
- ld [wCardListNumCursorPositions], a
-.asm_a300
- ld hl, PrintCardSelectionList
- ld d, h
- ld a, l
- ld hl, wCardListUpdateFunction
- ld [hli], a
- ld [hl], d
- xor a
- ld [wced2], a
-
-.loop_input
- call DoFrame
- call HandleSelectUpAndDownInList
- jr c, .loop_input
- call HandleDeckCardSelectionList
- jr c, .asm_a36a
- ldh a, [hDPadHeld]
- and START
- jr z, .loop_input
- ; start btn pressed
-
-.open_card_page
- ld a, $01
- call PlaySFXConfirmOrCancel
- ld a, [wCardListNumCursorPositions]
- ld [wTempCardListNumCursorPositions], a
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
-
- ; set wFilteredCardList as current card list
- ; and show card page screen
- ld de, wFilteredCardList
- ld hl, wCurCardListPtr
- ld [hl], e
- inc hl
- ld [hl], d
- call OpenCardPageFromCardList
- call PrintPlayersCardsHeaderInfo
-
- ld hl, FiltersCardSelectionParams
- call InitCardSelectionParams
- ld a, [wCurCardTypeFilter]
- ld [wTempCardTypeFilter], a
- call DrawHorizontalListCursor_Visible
- call PrintCardSelectionList
- call EnableLCD
- ld hl, Data_a396
- call InitCardSelectionParams
- ld a, [wTempCardListNumCursorPositions]
- ld [wCardListNumCursorPositions], a
- ld a, [wTempCardListCursorPos]
- ld [wCardListCursorPos], a
- jr .loop_input
-
-.asm_a36a
- call DrawListCursor_Invisible
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
- ld a, [hffb3]
- cp $ff
- jr nz, .open_card_page
- ld hl, FiltersCardSelectionParams
- call InitCardSelectionParams
- ld a, [wCurCardTypeFilter]
- ld [wTempCardTypeFilter], a
- ld hl, hffb0
- ld [hl], $01
- call PrintPlayersCardsText
- ld hl, hffb0
- ld [hl], $00
- jp .wait_input
-
-Data_a396: ; a396 (2:6396)
- db 1 ; x pos
- db 5 ; y pos
- db 2 ; y spacing
- db 0 ; x spacing
- db 7 ; num entries
- db SYM_CURSOR_R ; visible cursor tile
- db SYM_SPACE ; invisible cursor tile
- dw NULL ; wCardListHandlerFunction
-
-; a = which card type filter
-PrintFilteredCardSelectionList: ; a39f (2:639f)
- push af
- ld hl, CardTypeFilters
- ld b, $00
- ld c, a
- add hl, bc
- ld a, [hl]
- push af
- ld a, ALL_DECKS
- call CreateCardCollectionListWithDeckCards
- pop af
- call CreateFilteredCardList
-
- ld a, NUM_DECK_CONFIRMATION_VISIBLE_CARDS
- ld [wNumVisibleCardListEntries], a
- lb de, 2, 5
- ld hl, wCardListCoords
- ld [hl], e
- inc hl
- ld [hl], d
- ld a, SYM_SPACE
- ld [wCursorAlternateTile], a
- call PrintCardSelectionList
- pop af
- ret
-
-; outputs in wTempCardCollection all the cards in sCardCollection
-; plus the cards that are being used in built decks
-; a = DECK_* flags for which decks to include in the collection
-CreateCardCollectionListWithDeckCards: ; a3ca (2:63ca)
- ld [hffb5], a
-; copies sCardCollection to wTempCardCollection
- ld hl, sCardCollection
- ld de, wTempCardCollection
- ld b, CARD_COLLECTION_SIZE - 1
- call EnableSRAM
- call CopyNBytesFromHLToDE
- call DisableSRAM
-
-; deck_1
- ld a, [hffb5] ; should be ldh
- bit DECK_1_F, a
- jr z, .deck_2
- ld de, sDeck1Cards
- call IncrementDeckCardsInTempCollection
-.deck_2
- ld a, [hffb5] ; should be ldh
- bit DECK_2_F, a
- jr z, .deck_3
- ld de, sDeck2Cards
- call IncrementDeckCardsInTempCollection
-.deck_3
- ld a, [hffb5] ; should be ldh
- bit DECK_3_F, a
- jr z, .deck_4
- ld de, sDeck3Cards
- call IncrementDeckCardsInTempCollection
-.deck_4
- ld a, [hffb5] ; should be ldh
- bit DECK_4_F, a
- ret z
- ld de, sDeck4Cards
- call IncrementDeckCardsInTempCollection
- ret
-
-; goes through cards in deck in de
-; and for each card ID, increments its corresponding
-; entry in wTempCardCollection
-IncrementDeckCardsInTempCollection: ; a412 (2:6412)
- call EnableSRAM
- ld bc, wTempCardCollection
- ld h, DECK_SIZE
-.loop
- ld a, [de]
- inc de
- or a
- jr z, .done
- push hl
- ld h, $0
- ld l, a
- add hl, bc
- inc [hl]
- pop hl
- dec h
- jr nz, .loop
-.done
- call DisableSRAM
- ret
-
-; prints the name, level and storage count of the cards
-; that are visible in the list window
-; in the form:
-; CARD NAME/LEVEL X
-; where X is the current count of that card
-PrintCardSelectionList: ; a42d (2:642d)
- push bc
- ld hl, wCardListCoords
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld b, 19 ; x coord
- ld c, e
- ld a, [wCardListVisibleOffset]
- or a
- jr z, .alternate_cursor_tile
- ld a, SYM_CURSOR_U
- jr .got_cursor_tile_1
-.alternate_cursor_tile
- ld a, [wCursorAlternateTile]
-.got_cursor_tile_1
- call WriteByteToBGMap0
-
-; iterates by decreasing value in wNumVisibleCardListEntries
-; by 1 until it reaches 0
- ld a, [wCardListVisibleOffset]
- ld c, a
- ld b, $0
- ld hl, wFilteredCardList
- add hl, bc
- ld a, [wNumVisibleCardListEntries]
-.loop_filtered_cards
- push de
- or a
- jr z, .exit_loop
- ld b, a
- ld a, [hli]
- or a
- jr z, .invalid_card ; card ID of 0
- ld e, a
- call AddCardIDToVisibleList
- call LoadCardDataToBuffer1_FromCardID
- ; places in wDefaultText the card's name and level
- ; then appends at the end the count of that card
- ; in the card storage
- ld a, 14
- push bc
- push hl
- push de
- call CopyCardNameAndLevel
- pop de
- call AppendOwnedCardCountNumber
- pop hl
- pop bc
- pop de
- push hl
- call InitTextPrinting
- ld hl, wDefaultText
- jr .process_text
-.invalid_card
- pop de
- push hl
- call InitTextPrinting
- ld hl, Text_9a36
-.process_text
- call ProcessText
- pop hl
-
- ld a, b
- dec a
- inc e
- inc e
- jr .loop_filtered_cards
-
-.exit_loop
- ld a, [hli]
- or a
- jr z, .cannot_scroll
- pop de
-; draw down cursor because
-; there are still more cards
-; to be scrolled down
- xor a ; FALSE
- ld [wUnableToScrollDown], a
- ld a, SYM_CURSOR_D
- jr .got_cursor_tile_2
-.cannot_scroll
- pop de
- ld a, TRUE
- ld [wUnableToScrollDown], a
- ld a, [wCursorAlternateTile]
-.got_cursor_tile_2
- ld b, 19 ; x coord
- ld c, e
- dec c
- dec c
- call WriteByteToBGMap0
- pop bc
- ret
-
-; appends the card count given in register e
-; to the list in hl, in numerical form
-; (i.e. its numeric symbol representation)
-AppendOwnedCardCountNumber: ; a4ae (2:64ae)
- push af
- push bc
- push de
- push hl
-; increment hl until end is reached ($00 byte)
-.loop
- ld a, [hl]
- or a
- jr z, .end
- inc hl
- jr .loop
-.end
- call GetOwnedCardCount
- call ConvertToNumericalDigits
- ld [hl], $00 ; insert byte terminator
- pop hl
- pop de
- pop bc
- pop af
- ret
-
-; print header info (card count and player name)
-PrintPlayersCardsHeaderInfo: ; a4c6 (2:64c6)
- call Set_OBJ_8x8
- call Func_8d78
-.skip_empty_screen
- lb bc, 0, 4
- ld a, SYM_BOX_TOP
- call FillBGMapLineWithA
- call PrintTotalNumberOfCardsInCollection
- call PrintPlayersCardsText
- call DrawCardTypeIcons
- ret
-
-; prints "<PLAYER>'s cards"
-PrintPlayersCardsText: ; a4de (2:64de)
- lb de, 1, 0
- call InitTextPrinting
- ld de, wDefaultText
- call CopyPlayerName
- ld hl, wDefaultText
- call ProcessText
- ld hl, wDefaultText
- call GetTextLengthInTiles
- inc b
- ld d, b
- ld e, 0
- call InitTextPrinting
- ldtx hl, SCardsText
- call ProcessTextFromID
- ret
-
-PrintTotalNumberOfCardsInCollection: ; a504 (2:6504)
- ld a, ALL_DECKS
- call CreateCardCollectionListWithDeckCards
-
-; count all the cards in collection
- ld de, wTempCardCollection + 1
- ld b, 0
- ld hl, 0
-.loop_all_cards
- ld a, [de]
- inc de
- and $7f
- push bc
- ld b, $00
- ld c, a
- add hl, bc
- pop bc
- inc b
- ld a, NUM_CARDS
- cp b
- jr nz, .loop_all_cards
-
-; hl = total number of cards in collection
- call .GetTotalCountDigits
- ld hl, wTempCardCollection
- ld de, wOnesAndTensPlace
- ld b, $00
- call .PlaceNumericalChar
- call .PlaceNumericalChar
- call .PlaceNumericalChar
- call .PlaceNumericalChar
- call .PlaceNumericalChar
- ld a, $07
- ld [hli], a
- ld [hl], TX_END
- lb de, 13, 0
- call InitTextPrinting
- ld hl, wTempCardCollection
- call ProcessText
- ret
-
-; places a numerical character in hl from de
-; doesn't place a 0 if no non-0
-; numerical character has been placed before
-; this makes it so that there are no
-; 0s in more significant digits
-.PlaceNumericalChar
- ld [hl], TX_SYMBOL
- inc hl
- ld a, b
- or a
- jr z, .leading_num
- ld a, [de]
- inc de
- ld [hli], a
- ret
-.leading_num
-; don't place a 0 as a leading number
- ld a, [de]
- inc de
- cp SYM_0
- jr z, .space_char
- ld [hli], a
- ld b, $01 ; at least one non-0 char was placed
- ret
-.space_char
- xor a ; SYM_SPACE
- ld [hli], a
- ret
-
-; gets the digits in decimal form
-; of value stored in hl
-; stores the result in wOnesAndTensPlace
-.GetTotalCountDigits
- ld de, wOnesAndTensPlace
- ld bc, -10000
- call .GetDigit
- ld bc, -1000
- call .GetDigit
- ld bc, -100
- call .GetDigit
- ld bc, -10
- call .GetDigit
- ld bc, -1
- call .GetDigit
- ret
-
-.GetDigit
- ld a, SYM_0 - 1
-.loop
- inc a
- add hl, bc
- jr c, .loop
- ld [de], a
- inc de
- ld a, l
- sub c
- ld l, a
- ld a, h
- sbc b
- ld h, a
- ret
-
-; fills wFilteredCardList and wOwnedCardsCountList
-; with cards IDs and counts, respectively,
-; from given Card Set in register a
-; a = CARD_SET_* constant
-CreateCardSetList: ; a596 (2:6596)
- push af
- ld a, DECK_SIZE
- ld hl, wFilteredCardList
- call ClearNBytesFromHL
- ld a, DECK_SIZE
- ld hl, wOwnedCardsCountList
- call ClearNBytesFromHL
- xor a
- ld [wOwnedPhantomCardFlags], a
- pop af
-
- ld hl, 0
- lb de, 0, 0
- ld b, a
-.loop_all_cards
- inc e
- call LoadCardDataToBuffer1_FromCardID
- jr c, .done_pkmn_cards
- ld a, [wLoadedCard1Set]
- and $f0 ; set 1
- swap a
- cp b
- jr nz, .loop_all_cards
-
-; it's same set as input
- ld a, e
- cp VENUSAUR1
- jp z, .SetVenusaur1OwnedFlag
- cp MEW2
- jp z, .SetMew2OwnedFlag
-
- push bc
- push hl
- ld bc, wFilteredCardList
- add hl, bc
- ld [hl], e ; card ID
-
- ld hl, wTempCardCollection
- add hl, de
- ld a, [hl]
- pop hl
- push hl
- ld bc, wOwnedCardsCountList
- add hl, bc
- ld [hl], a ; card count in collection
- pop hl
-
- inc l
- pop bc
- jr .loop_all_cards
-
-.done_pkmn_cards
-; for the energy cards, put all basic energy cards in Colosseum
-; and Double Colorless energy in Mystery
- ld a, b
- cp CARD_SET_MYSTERY
- jr z, .mystery
- or a
- jr nz, .skip_energy_cards
-
-; colosseum
-; places all basic energy cards in wFilteredCardList
- lb de, 0, 0
-.loop_basic_energy_cards
- inc e
- ld a, e
- cp DOUBLE_COLORLESS_ENERGY
- jr z, .skip_energy_cards
- push bc
- push hl
- ld bc, wFilteredCardList
- add hl, bc
- ld [hl], e
- ld hl, wTempCardCollection
- add hl, de
- ld a, [hl]
- pop hl
- push hl
- ld bc, wOwnedCardsCountList
- add hl, bc
- ld [hl], a
- pop hl
- inc l
- pop bc
- jr .loop_basic_energy_cards
-
-.mystery
-; places double colorless energy card in wFilteredCardList
- lb de, 0, 0
-.loop_find_double_colorless
- inc e
- ld a, e
- cp BULBASAUR
- jr z, .skip_energy_cards
- cp DOUBLE_COLORLESS_ENERGY
- jr nz, .loop_find_double_colorless
- ; double colorless energy
- push bc
- push hl
- ld bc, wFilteredCardList
- add hl, bc
- ld [hl], e
- ld hl, wTempCardCollection
- add hl, de
- ld a, [hl]
- pop hl
- push hl
- ld bc, wOwnedCardsCountList
- add hl, bc
- ld [hl], a
- pop hl
- inc l
- pop bc
- jr .loop_find_double_colorless
-
-.skip_energy_cards
- ld a, [wOwnedPhantomCardFlags]
- bit VENUSAUR_OWNED_PHANTOM_F, a
- jr z, .check_mew
- call .PlaceVenusaur1InList
-.check_mew
- bit MEW_OWNED_PHANTOM_F, a
- jr z, .find_first_owned
- call .PlaceMew2InList
-
-.find_first_owned
- dec l
- ld c, l
- ld b, h
-.loop_owned_cards
- ld hl, wOwnedCardsCountList
- add hl, bc
- ld a, [hl]
- cp CARD_NOT_OWNED
- jr nz, .found_owned
- dec c
- jr .loop_owned_cards
-
-.found_owned
- inc c
- ld a, c
- ld [wNumEntriesInCurFilter], a
- xor a
- ld hl, wFilteredCardList
- add hl, bc
- ld [hl], a
- ld a, $ff ; terminator byte
- ld hl, wOwnedCardsCountList
- add hl, bc
- ld [hl], a
- ret
-
-.SetMew2OwnedFlag
- ld a, (1 << MEW_OWNED_PHANTOM_F)
-; fallthrough
-
-.SetPhantomOwnedFlag
- push hl
- push bc
- ld b, a
- ld hl, wTempCardCollection
- add hl, de
- ld a, [hl]
- cp CARD_NOT_OWNED
- jr z, .skip_set_flag
- ld a, [wOwnedPhantomCardFlags]
- or b
- ld [wOwnedPhantomCardFlags], a
-.skip_set_flag
- pop bc
- pop hl
- jp .loop_all_cards
-
-.SetVenusaur1OwnedFlag
- ld a, (1 << VENUSAUR_OWNED_PHANTOM_F)
- jr .SetPhantomOwnedFlag
-
-.PlaceVenusaur1InList
- push af
- push hl
- ld e, VENUSAUR1
-; fallthrough
-
-; places card in register e directly in the list
-.PlaceCardInList
- ld bc, wFilteredCardList
- add hl, bc
- ld [hl], e
- pop hl
- push hl
- ld bc, wOwnedCardsCountList
- add hl, bc
- ld [hl], $01
- pop hl
- inc l
- pop af
- ret
-
-.PlaceMew2InList
- push af
- push hl
- ld e, MEW2
- jr .PlaceCardInList
-
-; a = CARD_SET_* constant
-CreateCardSetListAndInitListCoords: ; a6a0 (2:66a0)
- push af
- ld hl, sCardCollection
- ld de, wTempCardCollection
- ld b, CARD_COLLECTION_SIZE - 1
- call EnableSRAM
- call CopyNBytesFromHLToDE
- call DisableSRAM
- pop af
-
- push af
- call .GetEntryPrefix
- call CreateCardSetList
- ld a, NUM_CARD_ALBUM_VISIBLE_CARDS
- ld [wNumVisibleCardListEntries], a
- lb de, 2, 4
- ld hl, wCardListCoords
- ld [hl], e
- inc hl
- ld [hl], d
- pop af
- ret
-
-; places in entry name the prefix associated with the selected Card Set
-; a = CARD_SET_* constant
-.GetEntryPrefix
- push af
- cp CARD_SET_PROMOTIONAL
- jr nz, .laboratory
- lb de, 3, "FW3_P"
- jr .got_prefix
-.laboratory
- cp CARD_SET_LABORATORY
- jr nz, .mystery
- lb de, 3, "FW3_D"
- jr .got_prefix
-.mystery
- cp CARD_SET_MYSTERY
- jr nz, .evolution
- lb de, 3, "FW3_C"
- jr .got_prefix
-.evolution
- cp CARD_SET_EVOLUTION
- jr nz, .colosseum
- lb de, 3, "FW3_B"
- jr .got_prefix
-.colosseum
- lb de, 3, "FW3_A"
-
-.got_prefix
- ld hl, wCurDeckName
- ld [hl], d
- inc hl
- ld [hl], e
- pop af
- ret
-
-; prints the cards being shown in the Card Album screen
-; for the corresponding Card Set
-PrintCardSetListEntries: ; a6fa (2:66fa)
- push bc
- ld hl, wCardListCoords
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld b, $13
- ld c, e
- dec c
- dec c
-
-; draw up cursor on top right
- ld a, [wCardListVisibleOffset]
- or a
- jr z, .no_up_cursor
- ld a, SYM_CURSOR_U
- jr .got_up_cursor_tile
-.no_up_cursor
- ld a, SYM_BOX_TOP_R
-.got_up_cursor_tile
- call WriteByteToBGMap0
-
- ld a, [wCardListVisibleOffset]
- ld l, a
- ld h, $00
- ld a, [wNumVisibleCardListEntries]
-.loop_visible_cards
- push de
- or a
- jr z, .handle_down_cursor
- ld b, a
- ld de, wFilteredCardList
- push hl
- add hl, de
- ld a, [hl]
- pop hl
- inc l
- or a
- jr z, .no_down_cursor
- ld e, a
- call AddCardIDToVisibleList
- call LoadCardDataToBuffer1_FromCardID
- push bc
- push hl
- ld de, wOwnedCardsCountList
- add hl, de
- dec hl
- ld a, [hl]
- cp CARD_NOT_OWNED
- jr nz, .owned
- ld hl, .EmptySlotText
- ld de, wDefaultText
- call CopyListFromHLToDE
- jr .print_text
-.owned
- ld a, 13
- call CopyCardNameAndLevel
-.print_text
- pop hl
- pop bc
- pop de
- push hl
- call InitTextPrinting
- pop hl
- push hl
- call .AppendCardListIndex
- call ProcessText
- ld hl, wDefaultText
- jr .asm_a76d
-
- ; this code is never reached
- pop de
- push hl
- call InitTextPrinting
- ld hl, Text_9a36
-
-.asm_a76d
- call ProcessText
- pop hl
- ld a, b
- dec a
- inc e
- inc e
- jr .loop_visible_cards
-
-.handle_down_cursor
- ld de, wFilteredCardList
- add hl, de
- ld a, [hl]
- or a
- jr z, .no_down_cursor
- pop de
- xor a ; FALSE
- ld [wUnableToScrollDown], a
- ld a, SYM_CURSOR_D
- jr .got_down_cursor_tile
-.no_down_cursor
- pop de
- ld a, TRUE
- ld [wUnableToScrollDown], a
- ld a, SYM_BOX_BTM_R
-.got_down_cursor_tile
- ld b, 19
- ld c, 17
- call WriteByteToBGMap0
- pop bc
- ret
-
-.EmptySlotText
- textfw0 "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"
- done
-
-; gets the index in the card list and adds it to wCurDeckName
-.AppendCardListIndex
- push bc
- push de
- ld de, wFilteredCardList
- add hl, de
- dec hl
- ld a, [hl]
- cp DOUBLE_COLORLESS_ENERGY + 1
- jr c, .energy_card
- cp VENUSAUR1
- jr z, .phantom_card
- cp MEW2
- jr z, .phantom_card
-
- ld a, [wNumVisibleCardListEntries]
- sub b
- ld hl, wCardListVisibleOffset
- add [hl]
- inc a
- call CalculateOnesAndTensDigits
- ld hl, wOnesAndTensPlace
- ld a, [hli]
- ld b, a
- ld a, [hl]
- or a
- jr nz, .got_index
- ld a, SYM_0
-.got_index
- ld hl, wCurDeckName + 2 ; skip prefix
- ld [hl], TX_SYMBOL
- inc hl
- ld [hli], a ; tens place
- ld [hl], TX_SYMBOL
- inc hl
- ld a, b
- ld [hli], a ; ones place
- ld [hl], TX_SYMBOL
- inc hl
- xor a ; SYM_SPACE
- ld [hli], a
- ld [hl], a
- ld hl, wCurDeckName
- pop de
- pop bc
- ret
-
-.energy_card
- call CalculateOnesAndTensDigits
- ld hl, wOnesAndTensPlace
- ld a, [hli]
- ld b, a
- ld hl, wCurDeckName + 2
- lb de, 3, "FW3_E"
- ld [hl], d
- inc hl
- ld [hl], e
- inc hl
- ld [hl], TX_SYMBOL
- inc hl
- ld a, SYM_0
- ld [hli], a
- ld [hl], TX_SYMBOL
- inc hl
- ld a, b
- ld [hli], a
- ld [hl], TX_SYMBOL
- inc hl
- xor a ; SYM_SPACE
- ld [hli], a
- ld [hl], a
- ld hl, wCurDeckName + 2
- pop de
- pop bc
- ret
-
-.phantom_card
-; phantom cards get only "✕✕" in their index number
- ld hl, wCurDeckName + 2
- ld [hl], "FW0_✕"
- inc hl
- ld [hl], "FW0_✕"
- inc hl
- ld [hl], TX_SYMBOL
- inc hl
- xor a ; SYM_SPACE
- ld [hli], a
- ld [hl], a
- ld hl, wCurDeckName
- pop de
- pop bc
- ret
-
-; handles opening card page, and inputs when inside Card Album
-HandleCardAlbumCardPage: ; a828 (2:6828)
- ld a, [wCardListCursorPos]
- ld b, a
- ld a, [wCardListVisibleOffset]
- add b
- ld c, a
- ld b, $00
- ld hl, wOwnedCardsCountList
- add hl, bc
- ld a, [hl]
- cp CARD_NOT_OWNED
- jr z, .handle_input
-
- ld hl, wCurCardListPtr
- ld a, [hli]
- ld h, [hl]
- ld l, a
- add hl, bc
- ld e, [hl]
- ld d, $00
- push de
- call LoadCardDataToBuffer1_FromCardID
- lb de, $38, $9f
- call SetupText
- bank1call OpenCardPage_FromCheckHandOrDiscardPile
- pop de
-
-.handle_input
- ldh a, [hDPadHeld]
- ld b, a
- and A_BUTTON | B_BUTTON | SELECT | START
- jp nz, .exit
- xor a ; FALSE
- ld [wPlaysSfx], a
- ld a, [wCardListNumCursorPositions]
- ld c, a
- ld a, [wCardListCursorPos]
- bit D_UP_F, b
- jr z, .check_d_down
-
- push af
- ld a, TRUE
- ld [wPlaysSfx], a
- ld a, [wCardListCursorPos]
- ld hl, wCardListVisibleOffset
- add [hl]
- ld hl, wFirstOwnedCardIndex
- cp [hl]
- jr z, .open_card_page_pop_af_2
- pop af
-
- dec a
- bit 7, a
- jr z, .got_new_pos
- ld a, [wCardListVisibleOffset]
- or a
- jr z, .open_card_page
- dec a
- ld [wCardListVisibleOffset], a
- xor a
- jr .got_new_pos
-
-.check_d_down
- bit D_DOWN_F, b
- jr z, .asm_a8d6
-
- push af
- ld a, TRUE
- ld [wPlaysSfx], a
- pop af
-
- inc a
- cp c
- jr c, .got_new_pos
- push af
- ld hl, wCurCardListPtr
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [wCardListCursorPos]
- ld c, a
- ld b, $00
- add hl, bc
- ld a, [wCardListVisibleOffset]
- inc a
- ld c, a
- ld b, $00
- add hl, bc
- ld a, [hl]
- or a
- jr z, .open_card_page_pop_af_1
- ld a, [wCardListVisibleOffset]
- inc a
- ld [wCardListVisibleOffset], a
- pop af
- dec a
-.got_new_pos
- ; loop back to the start
- ld [wCardListCursorPos], a
- ld a, [wPlaysSfx]
- or a
- jp z, HandleCardAlbumCardPage
- call PlaySFX
- jp HandleCardAlbumCardPage
-.open_card_page_pop_af_1
- pop af
- jr .open_card_page
-
-.asm_a8d6
- ld a, [wced2]
- or a
- jr z, .open_card_page
- bit D_LEFT_F, b
- jr z, .check_d_right
- call RemoveCardFromDeck
- jr .open_card_page
-.check_d_right
- bit D_RIGHT_F, b
- jr z, .open_card_page
- call TryAddCardToDeck
-
-.open_card_page_pop_af_2
- pop af
-.open_card_page
- push de
- bank1call OpenCardPage.input_loop
- pop de
- jp .handle_input
-
-.exit
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
- ret
-
-GetFirstOwnedCardIndex: ; a901 (2:6901)
- ld hl, wOwnedCardsCountList
- ld b, 0
-.loop_cards
- ld a, [hli]
- cp CARD_NOT_OWNED
- jr nz, .owned
- inc b
- jr .loop_cards
-.owned
- ld a, b
- ld [wFirstOwnedCardIndex], a
- ret
-
-HandleCardAlbumScreen: ; a913 (2:6913)
- ld a, $01
- ld [hffb4], a ; should be ldh
-
- xor a
-.album_card_list
- ld hl, .MenuParameters
- call InitializeMenuParameters
- call .DrawCardAlbumScreen
-.loop_input_1
- call DoFrame
- call HandleMenuInput
- jp nc, .loop_input_1 ; can be jr
- ldh a, [hCurMenuItem]
- cp $ff
- ret z
-
- ; ignore input if this Card Set is unavailable
- ld c, a
- ld b, $0
- ld hl, wUnavailableAlbumCardSets
- add hl, bc
- ld a, [hl]
- or a
- jr nz, .loop_input_1
-
- ld a, c
- ld [wSelectedCardSet], a
- call CreateCardSetListAndInitListCoords
- call .PrintCardCount
- xor a
- ld [wCardListVisibleOffset], a
- call PrintCardSetListEntries
- call EnableLCD
- ld a, [wNumEntriesInCurFilter]
- or a
- jr nz, .asm_a968
-
-.loop_input_2
- call DoFrame
- ldh a, [hKeysPressed]
- and B_BUTTON
- jr z, .loop_input_2
- ld a, $ff
- call PlaySFXConfirmOrCancel
- ldh a, [hCurMenuItem]
- jp .album_card_list
-
-.asm_a968
- call .GetNumCardEntries
- xor a
- ld hl, .CardSelectionParams
- call InitCardSelectionParams
- ld a, [wNumEntriesInCurFilter]
- ld hl, wNumVisibleCardListEntries
- cp [hl]
- jr nc, .asm_a97e
- ld [wCardListNumCursorPositions], a
-.asm_a97e
- ld hl, PrintCardSetListEntries
- ld d, h
- ld a, l
- ld hl, wCardListUpdateFunction
- ld [hli], a
- ld [hl], d
-
- xor a
- ld [wced2], a
-.loop_input_3
- call DoFrame
- call HandleDeckCardSelectionList
- jr c, .selection_made
- call HandleLeftRightInCardList
- jr c, .loop_input_3
- ldh a, [hDPadHeld]
- and START
- jr z, .loop_input_3
-.open_card_page
- ld a, $01
- call PlaySFXConfirmOrCancel
- ld a, [wCardListNumCursorPositions]
- ld [wTempCardListNumCursorPositions], a
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
- ld c, a
- ld a, [wCardListVisibleOffset]
- add c
- ld hl, wOwnedCardsCountList
- ld c, a
- ld b, $00
- add hl, bc
- ld a, [hl]
- cp CARD_NOT_OWNED
- jr z, .loop_input_3
-
- ; set wFilteredCardList as current card list
- ld de, wFilteredCardList
- ld hl, wCurCardListPtr
- ld [hl], e
- inc hl
- ld [hl], d
-
- call GetFirstOwnedCardIndex
- call HandleCardAlbumCardPage
- call .PrintCardCount
- call PrintCardSetListEntries
- call EnableLCD
- ld hl, .CardSelectionParams
- call InitCardSelectionParams
- ld a, [wTempCardListNumCursorPositions]
- ld [wCardListNumCursorPositions], a
- ld a, [wTempCardListCursorPos]
- ld [wCardListCursorPos], a
- jr .loop_input_3
-
-.selection_made
- call DrawListCursor_Invisible
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
- ld a, [hffb3]
- cp $ff
- jr nz, .open_card_page
- ldh a, [hCurMenuItem]
- jp .album_card_list
-
-.MenuParameters
- db 3, 3 ; cursor x, cursor y
- db 2 ; y displacement between items
- db 5 ; number of items
- db SYM_CURSOR_R ; cursor tile number
- db SYM_SPACE ; tile behind cursor
- dw NULL ; function pointer if non-0
-
-.CardSelectionParams
- db 1 ; x pos
- db 4 ; y pos
- db 2 ; y spacing
- db 0 ; x spacing
- db NUM_CARD_ALBUM_VISIBLE_CARDS ; num entries
- db SYM_CURSOR_R ; visible cursor tile
- db SYM_SPACE ; invisible cursor tile
- dw NULL ; wCardListHandlerFunction
-
-.GetNumCardEntries
- ld hl, wFilteredCardList
- ld b, $00
-.loop_card_ids
- ld a, [hli]
- or a
- jr z, .asm_aa1f
- inc b
- jr .loop_card_ids
-.asm_aa1f
- ld a, b
- ld [wNumCardListEntries], a
- ret
-
-; prints "X/Y" where X is number of cards owned in the set
-; and Y is the total card count of the Card Set
-.PrintCardCount
- call Set_OBJ_8x8
- xor a
- ld [wTileMapFill], a
- call ZeroObjectPositions
- call EmptyScreen
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- call LoadCursorTile
- call LoadSymbolsFont
- call LoadDuelCardSymbolTiles
- bank1call SetDefaultPalettes
- lb de, $3c, $ff
- call SetupText
- lb de, 1, 1
- call InitTextPrinting
-
-; print the total number of cards that are in the Card Set
- ld a, [wSelectedCardSet]
- cp CARD_SET_PROMOTIONAL
- jr nz, .check_laboratory
-; promotional
- ldtx hl, Item5PromotionalCardText
- ld e, NUM_CARDS_PROMOTIONAL - 2 ; minus the phantom cards
- ld a, [wOwnedPhantomCardFlags]
- bit VENUSAUR_OWNED_PHANTOM_F, a
- jr z, .check_owns_mew
- inc e
-.check_owns_mew
- bit MEW_OWNED_PHANTOM_F, a
- jr z, .has_card_set_count
- inc e
- jr .has_card_set_count
-.check_laboratory
- cp CARD_SET_LABORATORY
- jr nz, .check_mystery
- ldtx hl, Item4LaboratoryText
- ld e, NUM_CARDS_LABORATORY
- jr .has_card_set_count
-.check_mystery
- cp CARD_SET_MYSTERY
- jr nz, .check_evolution
- ldtx hl, Item3MysteryText
- ld e, NUM_CARDS_MYSTERY
- jr .has_card_set_count
-.check_evolution
- cp CARD_SET_EVOLUTION
- jr nz, .colosseum
- ldtx hl, Item2EvolutionText
- ld e, NUM_CARDS_EVOLUTION
- jr .has_card_set_count
-.colosseum
- ldtx hl, Item1ColosseumText
- ld e, NUM_CARDS_COLOSSEUM
-
-.has_card_set_count
- push de
- call ProcessTextFromID
- call .CountOwnedCardsInSet
- lb de, 14, 1
- call InitTextPrinting
-
- ld a, [wNumOwnedCardsInSet]
- ld hl, wDefaultText
- call ConvertToNumericalDigits
- call CalculateOnesAndTensDigits
- ld [hl], TX_SYMBOL
- inc hl
- ld [hl], SYM_SLASH
- inc hl
- pop de
-
- ld a, e
- call ConvertToNumericalDigits
- ld [hl], TX_END
- ld hl, wDefaultText
- call ProcessText
- lb de, 0, 2
- lb bc, 20, 16
- call DrawRegularTextBox
- call EnableLCD
- ret
-
-; counts number of cards in wOwnedCardsCountList
-; that is not set as CARD_NOT_OWNED
-.CountOwnedCardsInSet
- ld hl, wOwnedCardsCountList
- ld b, 0
-.loop_card_count
- ld a, [hli]
- cp $ff
- jr z, .got_num_owned_cards
- cp CARD_NOT_OWNED
- jr z, .loop_card_count
- inc b
- jr .loop_card_count
-.got_num_owned_cards
- ld a, b
- ld [wNumOwnedCardsInSet], a
- ret
-
-.DrawCardAlbumScreen
- xor a
- ld [wTileMapFill], a
- call EmptyScreen
- ld a, [hffb4]
- dec a
- jr nz, .skip_clear_screen
- ld [hffb4], a
- call Set_OBJ_8x8
- call ZeroObjectPositions
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- call LoadCursorTile
- call LoadSymbolsFont
- call LoadDuelCardSymbolTiles
- bank1call SetDefaultPalettes
- lb de, $3c, $ff
- call SetupText
-
-.skip_clear_screen
- lb de, 0, 0
- lb bc, 20, 13
- call DrawRegularTextBox
- ld hl, .BoosterPacksMenuData
- call PlaceTextItems
-
- ; set all Card Sets as available
- ld a, NUM_CARD_SETS
- ld hl, wUnavailableAlbumCardSets
- call ClearNBytesFromHL
-
- ; check whether player has had promotional cards
- call EnableSRAM
- ld a, [sHasPromotionalCards]
- call DisableSRAM
- or a
- jr nz, .has_promotional
-
- ; doesn't have promotional, check if
- ; this is still the case by checking the collection
- ld a, CARD_SET_PROMOTIONAL
- call CreateCardSetListAndInitListCoords
- ld a, [wFilteredCardList]
- or a
- jr nz, .set_has_promotional
- ; still has no promotional, print empty Card Set name
- ld a, TRUE
- ld [wUnavailableAlbumCardSets + CARD_SET_PROMOTIONAL], a
- ld e, 11
- ld d, 5
- call InitTextPrinting
- ldtx hl, EmptyPromotionalCardText
- call ProcessTextFromID
- jr .has_promotional
-
-.set_has_promotional
- call EnableSRAM
- ld a, TRUE
- ld [sHasPromotionalCards], a
- call DisableSRAM
-.has_promotional
- ldtx hl, ViewWhichCardFileText
- call DrawWideTextBox_PrintText
- call EnableLCD
- ret
-
-.BoosterPacksMenuData
- textitem 7, 1, BoosterPackTitleText
- textitem 5, 3, Item1ColosseumText
- textitem 5, 5, Item2EvolutionText
- textitem 5, 7, Item3MysteryText
- textitem 5, 9, Item4LaboratoryText
- textitem 5, 11, Item5PromotionalCardText
- db $ff
-
-PrinterMenu_PokemonCards: ; ab7b (2:6b7b)
- call WriteCardListsTerminatorBytes
- call PrintPlayersCardsHeaderInfo
- xor a
- ld [wCardListVisibleOffset], a
- ld [wCurCardTypeFilter], a
- call PrintFilteredCardSelectionList
- call EnableLCD
- xor a
- ld hl, FiltersCardSelectionParams
- call InitCardSelectionParams
-
-.loop_frame_1
- call DoFrame
- ld a, [wCurCardTypeFilter]
- ld b, a
- ld a, [wTempCardTypeFilter]
- cp b
- jr z, .handle_input
- ld [wCurCardTypeFilter], a
- ld hl, wCardListVisibleOffset
- ld [hl], $00
- call PrintFilteredCardSelectionList
- ld hl, hffb0
- ld [hl], $01
- call PrintPlayersCardsText
- ld hl, hffb0
- ld [hl], $00
- ld a, NUM_FILTERS
- ld [wCardListNumCursorPositions], a
-.handle_input
- ldh a, [hDPadHeld]
- and D_DOWN
- jr z, .asm_abca
-; d_down
- call ConfirmSelectionAndReturnCarry
- jr .asm_abd7
-.asm_abca
- call HandleCardSelectionInput
- jr nc, .loop_frame_1
- ld a, [hffb3]
- cp $ff
- jr nz, .asm_abd7
- ret
-
-.asm_abd7
- ld a, [wNumEntriesInCurFilter]
- or a
- jr z, .loop_frame_1
-
- xor a
- ld hl, Data_a396
- call InitCardSelectionParams
- ld a, [wNumEntriesInCurFilter]
- ld [wNumCardListEntries], a
- ld hl, wNumVisibleCardListEntries
- cp [hl]
- jr nc, .asm_abf6
- ld [wCardListNumCursorPositions], a
- ld [wTempCardListNumCursorPositions], a
-.asm_abf6
- ld hl, PrintCardSelectionList
- ld d, h
- ld a, l
- ld hl, wCardListUpdateFunction
- ld [hli], a
- ld [hl], d
- xor a
- ld [wced2], a
-
-.loop_frame_2
- call DoFrame
- call HandleSelectUpAndDownInList
- jr c, .loop_frame_2
- call HandleDeckCardSelectionList
- jr c, .asm_ac60
- ldh a, [hDPadHeld]
- and START
- jr z, .loop_frame_2
-; start btn
- ld a, $01
- call PlaySFXConfirmOrCancel
- ld a, [wCardListNumCursorPositions]
- ld [wTempCardListNumCursorPositions], a
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
-
- ; set wFilteredCardList as current card list
- ; and show card page screen
- ld de, wFilteredCardList
- ld hl, wCurCardListPtr
- ld [hl], e
- inc hl
- ld [hl], d
- call OpenCardPageFromCardList
- call PrintPlayersCardsHeaderInfo
-
-.asm_ac37
- ld hl, FiltersCardSelectionParams
- call InitCardSelectionParams
- ld a, [wCurCardTypeFilter]
- ld [wTempCardTypeFilter], a
- call DrawHorizontalListCursor_Visible
- call PrintCardSelectionList
- call EnableLCD
- ld hl, Data_a396
- call InitCardSelectionParams
- ld a, [wTempCardListNumCursorPositions]
- ld [wCardListNumCursorPositions], a
- ld a, [wTempCardListCursorPos]
- ld [wCardListCursorPos], a
- jr .loop_frame_2
-
-.asm_ac60
- call DrawListCursor_Invisible
- ld a, [wCardListNumCursorPositions]
- ld [wTempCardListNumCursorPositions], a
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
- ld a, [hffb3]
- cp $ff
- jr nz, .asm_ac92
-
- ld hl, FiltersCardSelectionParams
- call InitCardSelectionParams
- ld a, [wCurCardTypeFilter]
- ld [wTempCardTypeFilter], a
- ld hl, hffb0
- ld [hl], $01
- call PrintPlayersCardsText
- ld hl, hffb0
- ld [hl], $00
- jp .loop_frame_1
-
-.asm_ac92
- call DrawListCursor_Visible
- call .Func_acde
- lb de, 1, 1
- call InitTextPrinting
- ldtx hl, PrintThisCardYesNoText
- call ProcessTextFromID
- ld a, $01
- ld hl, Data_ad05
- call InitCardSelectionParams
-.loop_frame
- call DoFrame
- call HandleCardSelectionInput
- jr nc, .loop_frame
- ld a, [hffb3]
- or a
- jr nz, .asm_acd5
- ld hl, wFilteredCardList
- ld a, [wTempCardListCursorPos]
- ld c, a
- ld b, $00
- add hl, bc
- ld a, [wCardListVisibleOffset]
- ld c, a
- ld b, $00
- add hl, bc
- ld a, [hl]
- bank1call Func_758a
- call PrintPlayersCardsHeaderInfo
- jp .asm_ac37
-
-.asm_acd5
- call .Func_acde
- call PrintPlayersCardsHeaderInfo.skip_empty_screen
- jp .asm_ac37
-
-.Func_acde
- xor a
- lb hl, 0, 0
- lb de, 0, 0
- lb bc, 20, 4
- call FillRectangle
- ld a, [wConsole]
- cp CONSOLE_CGB
- ret nz ; exit if not CGB
-
- xor a
- lb hl, 0, 0
- lb de, 0, 0
- lb bc, 20, 4
- call BankswitchVRAM1
- call FillRectangle
- call BankswitchVRAM0
- ret
-
-Data_ad05: ; ad05 (2:6d05)
- db 3 ; x pos
- db 3 ; y pos
- db 0 ; y spacing
- db 4 ; x spacing
- db 2 ; num entries
- db SYM_CURSOR_R ; visible cursor tile
- db SYM_SPACE ; invisible cursor tile
- dw NULL ; wCardListHandlerFunction
-
-PrinterMenu_CardList: ; ad0e (2:6d0e)
- call WriteCardListsTerminatorBytes
- call Set_OBJ_8x8
- call Func_8d78
- lb bc, 0, 4
- ld a, SYM_BOX_TOP
- call FillBGMapLineWithA
-
- xor a
- ld [wCardListVisibleOffset], a
- ld [wCurCardTypeFilter], a
- call PrintFilteredCardSelectionList
- call EnableLCD
- lb de, 1, 1
- call InitTextPrinting
- ld hl, EnableLCD
- call ProcessTextFromID
- ld a, $01
- ld hl, Data_ad05
- call InitCardSelectionParams
-.loop_frame
- call DoFrame
- call HandleCardSelectionInput
- jr nc, .loop_frame
- ld a, [hffb3]
- or a
- ret nz
- bank1call PrintCardList
- ret
-
-HandlePrinterMenu: ; ad51 (2:6d51)
- bank1call PreparePrinterConnection
- ret c
- xor a
-.loop
- ld hl, PrinterMenuParameters
- call InitializeMenuParameters
- call EmptyScreenAndLoadFontDuelAndHandCardsIcons
- lb de, 4, 0
- lb bc, 12, 12
- call DrawRegularTextBox
- lb de, 6, 2
- call InitTextPrinting
- ldtx hl, PrintMenuItemsText
- call ProcessTextFromID
- ldtx hl, WhatWouldYouLikeToPrintText
- call DrawWideTextBox_PrintText
- call EnableLCD
-.loop_input
- call DoFrame
- call HandleMenuInput
- jr nc, .loop_input
- ldh a, [hCurMenuItem]
- cp $ff
- call z, PrinterMenu_QuitPrint
- ld [wSelectedPrinterMenuItem], a
- ld hl, PrinterMenuFunctionTable
- call JumpToFunctionInTable
- ld a, [wSelectedPrinterMenuItem]
- jr .loop
-
-PrinterMenu_QuitPrint: ; ad9a (2:6d9a)
- add sp, $2 ; exit menu
- ldtx hl, PleaseMakeSureToTurnGameBoyPrinterOffText
- call DrawWideTextBox_WaitForInput
- ret
-
-PrinterMenuFunctionTable: ; ada3 (2:6da3)
- dw PrinterMenu_PokemonCards
- dw PrinterMenu_DeckConfiguration
- dw PrinterMenu_CardList
- dw PrinterMenu_PrintQuality
- dw PrinterMenu_QuitPrint
-
-PrinterMenuParameters: ; adad (2:6dad)
- db 5, 2 ; cursor x, cursor y
- db 2 ; y displacement between items
- db 5 ; number of items
- db SYM_CURSOR_R ; cursor tile number
- db SYM_SPACE ; tile behind cursor
- dw NULL ; function pointer if non-0
-
-PrinterMenu_PrintQuality: ; adb5 (2:6db5)
- ldtx hl, PleaseSetTheContrastText
- call DrawWideTextBox_PrintText
- call EnableSRAM
- ld a, [sPrinterContrastLevel]
- call DisableSRAM
- ld hl, Data_adf5
- call InitCardSelectionParams
-.loop_frame
- call DoFrame
- call HandleCardSelectionInput
- jr nc, .loop_frame
- ld a, [hffb3]
- cp $ff
- jr z, .asm_ade2
- call EnableSRAM
- ld [sPrinterContrastLevel], a
- call DisableSRAM
-.asm_ade2
- add sp, $2 ; exit menu
- ld a, [wSelectedPrinterMenuItem]
- ld hl, PrinterMenuParameters
- call InitializeMenuParameters
- ldtx hl, WhatWouldYouLikeToPrintText
- call DrawWideTextBox_PrintText
- jr HandlePrinterMenu.loop_input
-
-Data_adf5: ; adf5 (2:6df5)
- db 5 ; x pos
- db 16 ; y pos
- db 0 ; y spacing
- db 2 ; x spacing
- db 5 ; num entries
- db SYM_CURSOR_R ; visible cursor tile
- db SYM_SPACE ; invisible cursor tile
- dw NULL ; wCardListHandlerFunction
-
-; handles printing and player input
-; in the card confirmation list shown
-; when cards are missing for some deck configuration
-; hl = deck name
-; de = deck cards
-HandleDeckMissingCardsList: ; adfe (2:6dfe)
-; read deck name from hl and cards from de
- push de
- ld de, wCurDeckName
- call CopyListFromHLToDEInSRAM
- pop de
- ld hl, wCurDeckCards
- call CopyDeckFromSRAM
-
- ld a, NUM_FILTERS
- ld hl, wCardFilterCounts
- call ClearNBytesFromHL
- ld a, DECK_SIZE
- ld [wTotalCardCount], a
- ld hl, wCardFilterCounts
- ld [hl], a
- call .HandleList ; can skip call and fallthrough instead
- ret
-
-.HandleList
- call SortCurDeckCardsByID
- call CreateCurDeckUniqueCardList
- xor a
- ld [wCardListVisibleOffset], a
-.loop
- ld hl, .DeckConfirmationCardSelectionParams
- call InitCardSelectionParams
- ld a, [wNumUniqueCards]
- ld [wNumCardListEntries], a
- cp $05
- jr c, .got_num_positions
- ld a, $05
-.got_num_positions
- ld [wCardListNumCursorPositions], a
- ld [wNumVisibleCardListEntries], a
- call .PrintTitleAndList
- ld hl, wCardConfirmationText
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call DrawWideTextBox_PrintText
-
-; set card update function
- ld hl, .CardListUpdateFunction
- ld d, h
- ld a, l
- ld hl, wCardListUpdateFunction
- ld [hli], a
- ld [hl], d
- xor a
- ld [wced2], a
-
-.loop_input
- call DoFrame
- call HandleDeckCardSelectionList
- jr c, .selection_made
- call HandleLeftRightInCardList
- jr c, .loop_input
- ldh a, [hDPadHeld]
- and START
- jr z, .loop_input
-
-.open_card_pge
- ld a, $01
- call PlaySFXConfirmOrCancel
- ld a, [wCardListCursorPos]
- ld [wced7], a
-
- ; set wOwnedCardsCountList as current card list
- ; and show card page screen
- ld de, wOwnedCardsCountList
- ld hl, wCurCardListPtr
- ld [hl], e
- inc hl
- ld [hl], d
- call OpenCardPageFromCardList
- jr .loop
-
-.selection_made
- ld a, [hffb3]
- cp $ff
- ret z
- jr .open_card_pge
-
-.DeckConfirmationCardSelectionParams
- db 0 ; x pos
- db 3 ; y pos
- db 2 ; y spacing
- db 0 ; x spacing
- db 5 ; num entries
- db SYM_CURSOR_R ; visible cursor tile
- db SYM_SPACE ; invisible cursor tile
- dw NULL ; wCardListHandlerFunction
-
-.CardListUpdateFunction
- ld hl, hffb0
- ld [hl], $01
- call .PrintDeckIndexAndName
- lb de, 1, 14
- call InitTextPrinting
- ld hl, wCardConfirmationText
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call ProcessTextFromID
- ld hl, hffb0
- ld [hl], $00
- jp PrintConfirmationCardList
-
-.PrintTitleAndList
- call .ClearScreenAndPrintDeckTitle
- lb de, 3, 3
- ld hl, wCardListCoords
- ld [hl], e
- inc hl
- ld [hl], d
- call PrintConfirmationCardList
- ret
-
-.ClearScreenAndPrintDeckTitle
- call EmptyScreenAndLoadFontDuelAndHandCardsIcons
- call .PrintDeckIndexAndName
- call EnableLCD
- ret
-
-; prints text in the form "X.<DECK NAME> deck"
-; where X is the deck index in the list
-.PrintDeckIndexAndName
- ld a, [wCurDeckName]
- or a
- ret z ; not a valid deck
- lb de, 0, 1
- call InitTextPrinting
- ld a, [wCurDeck]
- inc a
- ld hl, wDefaultText
- call ConvertToNumericalDigits
- ld [hl], "FW0_·"
- inc hl
- ld [hl], TX_END
- ld hl, wDefaultText
- call ProcessText
-
- ld hl, wCurDeckName
- ld de, wDefaultText
- call CopyListFromHLToDE
- ld hl, wDefaultText
- call GetTextLengthInTiles
- ld b, $0
- ld hl, wDefaultText
- add hl, bc
- ld d, h
- ld e, l
- ld hl, DeckNameSuffix
- call CopyListFromHLToDE
- lb de, 3, 1
- ld hl, wDefaultText
- call InitTextPrinting
- call ProcessText
- ret
-
-Func_af1d: ; af1d (2:6f1d)
- xor a
- ld [wTileMapFill], a
- call ZeroObjectPositions
- call EmptyScreen
- ld a, $1
- ld [wVBlankOAMCopyToggle], a
- call LoadSymbolsFont
- bank1call SetDefaultPalettes
-
- lb de, $3c, $bf
- call SetupText
- lb de, 3, 1
- call InitTextPrinting
- ldtx hl, ProceduresForSendingCardsText
- call ProcessTextFromID
- lb de, 1, 3
- call InitTextPrinting
- ldtx hl, CardSendingProceduresText
- ld a, $01
- ld [wLineSeparation], a
- call ProcessTextFromID
- xor a
- ld [wLineSeparation], a
- ldtx hl, PleaseReadTheProceduresForSendingCardsText
- call DrawWideTextBox_WaitForInput
-
- call EnableLCD
- call PrepareToBuildDeckConfigurationToSend
- jr c, .asm_af6b
- ld a, $01
- or a
- ret
-
-.asm_af6b
- ld hl, wCurDeckCards
- ld de, wDuelTempList
- call CopyListFromHLToDE
- xor a
- ld [wNameBuffer], a
- bank1call SendCard
- ret c
- call EnableSRAM
- ld hl, wCurDeckCards
- call DecrementDeckCardsInCollection
- call DisableSRAM
- call SaveGame
- ld hl, wNameBuffer
- ld de, wDefaultText
- call CopyListFromHLToDE
- xor a
- ret
-
-; never reached
- scf
- ret
-
-Func_af98: ; af98 (2:6f98)
- xor a
- ld [wDuelTempList], a
- ld [wNameBuffer], a
- bank1call ReceiveCard
- ret c
-
- call EnableSRAM
- ld hl, wDuelTempList
- call AddGiftCenterDeckCardsToCollection
- call DisableSRAM
- call SaveGame
- xor a
- ld [wCardListVisibleOffset], a
- ld hl, Data_b04a
- call InitCardSelectionParams
- call PrintReceivedTheseCardsText
- call Func_b088
- call EnableLCD
- ld a, [wNumEntriesInCurFilter]
- ld [wNumCardListEntries], a
- ld hl, wNumVisibleCardListEntries
- cp [hl]
- jr nc, .asm_afd4
- ld [wCardListNumCursorPositions], a
-.asm_afd4
- ld hl, ShowReceivedCardsList
- ld d, h
- ld a, l
- ld hl, wCardListUpdateFunction
- ld [hli], a
- ld [hl], d
-
- xor a
- ld [wced2], a
-.asm_afe2
- call DoFrame
- call HandleDeckCardSelectionList
- jr c, .asm_b02f
- call HandleLeftRightInCardList
- jr c, .asm_afe2
- ldh a, [hDPadHeld]
- and START
- jr z, .asm_afe2
-.asm_aff5
- ld a, $01
- call PlaySFXConfirmOrCancel
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
-
- ; set wFilteredCardList as current card list
- ; and show card page screen
- ld de, wFilteredCardList
- ld hl, wCurCardListPtr
- ld [hl], e
- inc hl
- ld [hl], d
- call OpenCardPageFromCardList
- call PrintReceivedTheseCardsText
-
- call PrintCardSelectionList
- call EnableLCD
- ld hl, Data_b04a
- call InitCardSelectionParams
- ld a, [wNumEntriesInCurFilter]
- ld hl, wNumVisibleCardListEntries
- cp [hl]
- jr nc, .asm_b027
- ld [wCardListNumCursorPositions], a
-.asm_b027
- ld a, [wTempCardListCursorPos]
- ld [wCardListCursorPos], a
- jr .asm_afe2
-.asm_b02f
- call DrawListCursor_Invisible
- ld a, [wCardListCursorPos]
- ld [wTempCardListCursorPos], a
- ld a, [hffb3]
- cp $ff
- jr nz, .asm_aff5
- ld hl, wNameBuffer
- ld de, wDefaultText
- call CopyListFromHLToDE
- or a
- ret
-
-Data_b04a: ; b04a (2:704a)
- db 1 ; x pos
- db 3 ; y pos
- db 2 ; y spacing
- db 0 ; x spacing
- db 5 ; num entries
- db SYM_CURSOR_R ; visible cursor tile
- db SYM_SPACE ; invisible cursor tile
- dw NULL ; wCardListHandlerFunction
-
-ShowReceivedCardsList: ; b053 (2:7053)
- ld hl, hffb0
- ld [hl], $01
- lb de, 1, 1
- call InitTextPrinting
- ldtx hl, CardReceivedText
- call ProcessTextFromID
- ld hl, wNameBuffer
- ld de, wDefaultText
- call CopyListFromHLToDE
- xor a
- ld [wTxRam2 + 0], a
- ld [wTxRam2 + 1], a
- lb de, 1, 14
- call InitTextPrinting
- ldtx hl, ReceivedTheseCardsFromText
- call PrintTextNoDelay
- ld hl, hffb0
- ld [hl], $00
- jp PrintCardSelectionList
-
-Func_b088: ; b088 (2:7088)
- ld a, CARD_COLLECTION_SIZE - 1
- ld hl, wTempCardCollection
- call ClearNBytesFromHL
- ld de, wDuelTempList
- call .Func_b0b2
- ld a, $ff
- call .Func_b0c0
- ld a, $05
- ld [wNumVisibleCardListEntries], a
- lb de, 2, 3
- ld hl, wCardListCoords
- ld [hl], e
- inc hl
- ld [hl], d
- ld a, SYM_BOX_RIGHT
- ld [wCursorAlternateTile], a
- call PrintCardSelectionList
- ret
-
-.Func_b0b2
- ld bc, wTempCardCollection
-.loop
- ld a, [de]
- inc de
- or a
- ret z
- ld h, $00
- ld l, a
- add hl, bc
- inc [hl]
- jr .loop
-
-.Func_b0c0
- push af
- push bc
- push de
- push hl
- push af
- ld a, DECK_SIZE
- ld hl, wOwnedCardsCountList
- call ClearNBytesFromHL
- ld a, DECK_SIZE
- ld hl, wFilteredCardList
- call ClearNBytesFromHL
- pop af
- ld hl, $0
- ld de, $0
- ld b, a
-.asm_b0dd
- inc e
- call GetCardType
- jr c, .asm_b119
- ld c, a
- ld a, b
- cp $ff
- jr z, .asm_b0fc
- and FILTER_ENERGY
- cp FILTER_ENERGY
- jr z, .asm_b0f5
- ld a, c
- cp b
- jr nz, .asm_b0dd
- jr .asm_b0fc
-.asm_b0f5
- ld a, c
- and TYPE_ENERGY
- cp TYPE_ENERGY
- jr nz, .asm_b0dd
-.asm_b0fc
- push bc
- push hl
- ld bc, wFilteredCardList
- add hl, bc
- ld [hl], e
- ld hl, wTempCardCollection
- add hl, de
- ld a, [hl]
- and $7f
- pop hl
- or a
- jr z, .asm_b116
- push hl
- ld bc, wOwnedCardsCountList
- add hl, bc
- ld [hl], a
- pop hl
- inc l
-.asm_b116
- pop bc
- jr .asm_b0dd
-
-.asm_b119
- ld a, l
- ld [wNumEntriesInCurFilter], a
- xor a
- ld c, l
- ld b, h
- ld hl, wFilteredCardList
- add hl, bc
- ld [hl], a
- ld a, $ff
- ld hl, wOwnedCardsCountList
- add hl, bc
- ld [hl], a
- pop hl
- pop de
- pop bc
- pop af
- ret
-
-PrintCardToSendText: ; b131 (2:7131)
- call EmptyScreenAndDrawTextBox
- lb de, 1, 1
- call InitTextPrinting
- ldtx hl, CardToSendText
- call ProcessTextFromID
- ret
-
-PrintReceivedTheseCardsText: ; b141 (2:7141)
- call EmptyScreenAndDrawTextBox
- lb de, 1, 1
- call InitTextPrinting
- ldtx hl, CardReceivedText
- call ProcessTextFromID
- ld hl, wNameBuffer
- ld de, wDefaultText
- call CopyListFromHLToDE
- xor a
- ld [wTxRam2 + 0], a
- ld [wTxRam2 + 1], a
- ldtx hl, ReceivedTheseCardsFromText
- call DrawWideTextBox_PrintText
- ret
-
-EmptyScreenAndDrawTextBox: ; b167 (2:7167)
- call Set_OBJ_8x8
- call Func_8d78
- lb de, 0, 0
- lb bc, 20, 13
- call DrawRegularTextBox
- ret
-
-Func_b177: ; b177 (2:7177)
- ld a, [wd10e]
- and $03
- ld hl, .FunctionTable
- call JumpToFunctionInTable
- jr c, .asm_b18f
- or a
- jr nz, .asm_b18f
- xor a
- ld [wTxRam2 + 0], a
- ld [wTxRam2 + 1], a
- ret
-.asm_b18f
- ld a, $ff
- ld [wd10e], a
- ret
-
-.FunctionTable
- dw Func_af1d
- dw Func_af98
- dw Func_bc04
- dw Func_bc7a
-
-HandleDeckSaveMachineMenu: ; b19d (2:719d)
- xor a
- ld [wCardListVisibleOffset], a
- ldtx de, DeckSaveMachineText
- ld hl, wDeckMachineTitleText
- ld [hl], e
- inc hl
- ld [hl], d
- call ClearScreenAndDrawDeckMachineScreen
- ld a, NUM_DECK_SAVE_MACHINE_SLOTS
- ld [wNumDeckMachineEntries], a
-
- xor a
-.wait_input
- ld hl, DeckMachineSelectionParams
- call InitCardSelectionParams
- call DrawListScrollArrows
- call PrintNumSavedDecks
- ldtx hl, PleaseSelectDeckText
- call DrawWideTextBox_PrintText
- ldtx de, PleaseSelectDeckText
- call InitDeckMachineDrawingParams
- call HandleDeckMachineSelection
- jr c, .wait_input
- cp $ff
- ret z ; operation cancelled
- ; get the index of selected deck
- ld b, a
- ld a, [wCardListVisibleOffset]
- add b
- ld [wSelectedDeckMachineEntry], a
-
- call ResetCheckMenuCursorPositionAndBlink
- call DrawWideTextBox
- ld hl, .DeckMachineMenuData
- call PlaceTextItems
-.wait_input_submenu
- call DoFrame
- call HandleCheckMenuInput
- jp nc, .wait_input_submenu
- cp $ff
- jr nz, .submenu_option_selected
- ; return from submenu
- ld a, [wTempDeckMachineCursorPos]
- jp .wait_input
-
-.submenu_option_selected
- ld a, [wCheckMenuCursorYPosition]
- sla a
- ld hl, wCheckMenuCursorXPosition
- add [hl]
- or a
- jr nz, .ok_1
-
-; Save a Deck
- call CheckIfSelectedDeckMachineEntryIsEmpty
- jr nc, .prompt_ok_if_deleted
- call SaveDeckInDeckSaveMachine
- ld a, [wTempDeckMachineCursorPos]
- jp c, .wait_input
- jr .return_to_list
-.prompt_ok_if_deleted
- ldtx hl, OKIfFileDeletedText
- call YesOrNoMenuWithText
- ld a, [wTempDeckMachineCursorPos]
- jr c, .wait_input
- call SaveDeckInDeckSaveMachine
- ld a, [wTempDeckMachineCursorPos]
- jp c, .wait_input
- jr .return_to_list
-
-.ok_1
- cp $1
- jr nz, .ok_2
-
-; Delete a Deck
- call CheckIfSelectedDeckMachineEntryIsEmpty
- jr c, .is_empty
- call TryDeleteSavedDeck
- ld a, [wTempDeckMachineCursorPos]
- jp c, .wait_input
- jr .return_to_list
-
-.is_empty
- ld hl, WaitForVBlank
- call DrawWideTextBox_WaitForInput
- ld a, [wTempDeckMachineCursorPos]
- jp .wait_input
-
-.ok_2
- cp $2
- jr nz, .cancel
-
-; Build a Deck
- call CheckIfSelectedDeckMachineEntryIsEmpty
- jr c, .is_empty
- call TryBuildDeckMachineDeck
- ld a, [wTempDeckMachineCursorPos]
- jp nc, .wait_input
-
-.return_to_list
- ld a, [wTempCardListVisibleOffset]
- ld [wCardListVisibleOffset], a
- call ClearScreenAndDrawDeckMachineScreen
- call DrawListScrollArrows
- call PrintNumSavedDecks
- ld a, [wTempDeckMachineCursorPos]
- jp .wait_input
-
-.cancel
- ret
-
-.DeckMachineMenuData
- textitem 2, 14, SaveADeckText
- textitem 12, 14, DeleteADeckText
- textitem 2, 16, BuildADeckText
- textitem 12, 16, CancelText
- db $ff
-
-; sets the number of cursor positions for deck machine menu,
-; sets the text ID to show given by de
-; and sets DrawDeckMachineScreen as the update function
-; de = text ID
-InitDeckMachineDrawingParams: ; b285 (2:7285)
- ld a, NUM_DECK_MACHINE_SLOTS
- ld [wCardListNumCursorPositions], a
- ld hl, wDeckMachineText
- ld [hl], e
- inc hl
- ld [hl], d
- ld hl, DrawDeckMachineScreen
- ld d, h
- ld a, l
- ld hl, wCardListUpdateFunction
- ld [hli], a
- ld [hl], d
- xor a
- ld [wced2], a
- ret
-
-; handles player input inside the Deck Machine screen
-; the Start button opens up the deck confirmation menu
-; and returns carry
-; otherwise, returns no carry and selection made in a
-HandleDeckMachineSelection: ; b29f (2:729f)
- call DoFrame
- call HandleDeckCardSelectionList
- jr c, .selection_made
-
- call .HandleListJumps
- jr c, HandleDeckMachineSelection ; jump back to start
- ldh a, [hDPadHeld]
- and START
- jr z, HandleDeckMachineSelection ; jump back to start
-
-; start btn
- ld a, [wCardListVisibleOffset]
- ld [wTempCardListVisibleOffset], a
- ld b, a
- ld a, [wCardListCursorPos]
- ld [wTempDeckMachineCursorPos], a
- add b
- ld c, a
- inc a
- or $80
- ld [wCurDeck], a
-
- ; get pointer to selected deck cards
- ; and if it's an empty deck, jump to start
- sla c
- ld b, $0
- ld hl, wMachineDeckPtrs
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- push hl
- ld bc, DECK_NAME_SIZE
- add hl, bc
- ld d, h
- ld e, l
- call EnableSRAM
- ld a, [hl]
- call DisableSRAM
- pop hl
- or a
- jr z, HandleDeckMachineSelection ; jump back to start
-
-; show deck confirmation screen with deck cards
-; and return carry set
- ld a, $01
- call PlaySFXConfirmOrCancel
- call OpenDeckConfirmationMenu
- ld a, [wTempCardListVisibleOffset]
- ld [wCardListVisibleOffset], a
- call ClearScreenAndDrawDeckMachineScreen
- call DrawListScrollArrows
- call PrintNumSavedDecks
- ld a, [wTempDeckMachineCursorPos]
- ld [wCardListCursorPos], a
- scf
- ret
-
-.selection_made
- call DrawListCursor_Visible
- ld a, [wCardListVisibleOffset]
- ld [wTempCardListVisibleOffset], a
- ld a, [wCardListCursorPos]
- ld [wTempDeckMachineCursorPos], a
- ld a, [hffb3]
- or a
- ret
-
-; handles right and left input for jumping several entries at once
-; returns carry if jump was made
-.HandleListJumps
- ld a, [wCardListVisibleOffset]
- ld c, a
- ldh a, [hDPadHeld]
- cp D_RIGHT
- jr z, .d_right
- cp D_LEFT
- jr z, .d_left
- or a
- ret
-
-.d_right
- ld a, [wCardListVisibleOffset]
- add NUM_DECK_MACHINE_SLOTS
- ld b, a
- add NUM_DECK_MACHINE_SLOTS
- ld hl, wNumDeckMachineEntries
- cp [hl]
- jr c, .got_new_pos
- ld a, [wNumDeckMachineEntries]
- sub NUM_DECK_MACHINE_SLOTS
- ld b, a
- jr .got_new_pos
-
-.d_left
- ld a, [wCardListVisibleOffset]
- sub NUM_DECK_MACHINE_SLOTS
- ld b, a
- jr nc, .got_new_pos
- ld b, 0 ; first entry
-
-.got_new_pos
- ld a, b
- ld [wCardListVisibleOffset], a
- cp c
- jr z, .set_carry
- ; play SFX if jump was made
- ; and update UI
- ld a, SFX_01
- call PlaySFX
- call DrawDeckMachineScreen
- call PrintNumSavedDecks
-.set_carry
- scf
- ret
-
-; returns carry if deck corresponding to the
-; entry selected in the Deck Machine menu is empty
-CheckIfSelectedDeckMachineEntryIsEmpty: ; b35b (2:735b)
- ld a, [wSelectedDeckMachineEntry]
- sla a
- ld l, a
- ld h, $0
- ld bc, wMachineDeckPtrs
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld bc, DECK_NAME_SIZE
- add hl, bc
- call EnableSRAM
- ld a, [hl]
- call DisableSRAM
- or a
- ret nz ; is valid
- scf
- ret; is empty
-
-ClearScreenAndDrawDeckMachineScreen: ; b379 (2:7379)
- call Set_OBJ_8x8
- xor a
- ld [wTileMapFill], a
- call ZeroObjectPositions
- call EmptyScreen
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- call LoadSymbolsFont
- call LoadDuelCardSymbolTiles
- bank1call SetDefaultPalettes
- lb de, $3c, $ff
- call SetupText
- lb de, 0, 0
- lb bc, 20, 13
- call DrawRegularTextBox
- call SetDeckMachineTitleText
- call GetSavedDeckPointers
- call PrintVisibleDeckMachineEntries
- call GetSavedDeckCount
- call EnableLCD
- ret
-
-; prints wDeckMachineTitleText as title text
-SetDeckMachineTitleText: ; b3b3 (2:73b3)
- lb de, 1, 0
- call InitTextPrinting
- ld hl, wDeckMachineTitleText
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call ProcessTextFromID
- ret
-
-; save all sSavedDecks pointers in wMachineDeckPtrs
-GetSavedDeckPointers: ; b3c3 (2:73c3)
- ld a, NUM_DECK_SAVE_MACHINE_SLOTS
- add NUM_DECK_SAVE_MACHINE_SLOTS ; add a is better
- ld hl, wMachineDeckPtrs
- call ClearNBytesFromHL
- ld de, wMachineDeckPtrs
- ld hl, sSavedDecks
- ld bc, DECK_STRUCT_SIZE
- ld a, NUM_DECK_SAVE_MACHINE_SLOTS
-.loop_saved_decks
- push af
- ld a, l
- ld [de], a
- inc de
- ld a, h
- ld [de], a
- inc de
- add hl, bc
- pop af
- dec a
- jr nz, .loop_saved_decks
- ret
-
-; given the cursor position in the deck machine menu
-; prints the deck names of all entries that are visible
-PrintVisibleDeckMachineEntries: ; b3e5 (2:73e5)
- ld a, [wCardListVisibleOffset]
- lb de, 2, 2
- ld b, NUM_DECK_MACHINE_VISIBLE_DECKS
-.loop
- push af
- push bc
- push de
- call PrintDeckMachineEntry
- pop de
- pop bc
- pop af
- ret c ; jump never made?
- dec b
- ret z ; no more entries
- inc a
- inc e
- inc e
- jr .loop
-
-UpdateDeckMachineScrollArrowsAndEntries: ; b3fe (2:73fe)
- call DrawListScrollArrows
- jr PrintVisibleDeckMachineEntries
-
-DrawDeckMachineScreen: ; b403 (2:7403)
- call DrawListScrollArrows
- ld hl, hffb0
- ld [hl], $01
- call SetDeckMachineTitleText
- lb de, 1, 14
- call InitTextPrinting
- ld hl, wDeckMachineText
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call ProcessTextFromID
- ld hl, hffb0
- ld [hl], $00
- jr PrintVisibleDeckMachineEntries
-
-; prints the deck name of the deck corresponding
-; to index in register a, from wMachineDeckPtrs
-; also checks whether the deck can be built
-; either by dismantling other decks or not,
-; and places the corresponding symbol next to the name
-PrintDeckMachineEntry: ; b424 (2:7424)
- ld b, a
- push bc
- ld hl, wDefaultText
- inc a
- call ConvertToNumericalDigits
- ld [hl], "FW0_·"
- inc hl
- ld [hl], TX_END
- call InitTextPrinting
- ld hl, wDefaultText
- call ProcessText
- pop af
-
-; get the deck corresponding to input index
-; and append its name to wDefaultText
- push af
- sla a
- ld l, a
- ld h, $0
- ld bc, wMachineDeckPtrs
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- inc d
- inc d
- inc d
- push de
- call AppendDeckName
- pop de
- pop bc
- jr nc, .valid_deck
-
-; invalid deck, give it the default
-; empty deck name ("--------------")
- call InitTextPrinting
- ldtx hl, EmptyDeckNameText
- call ProcessTextFromID
- ld d, 13
- inc e
- call InitTextPrinting
- ld hl, .text
- call ProcessText
- scf
- ret
-
-.valid_deck
- push de
- push bc
- ld d, 18
- call InitTextPrinting
-
-; print the symbol that symbolizes whether the deck can
-; be built, or if another deck has to be dismantled to build it
- ld a, $0 ; no decks dismantled
- call CheckIfCanBuildSavedDeck
- pop bc
- ld hl, wDefaultText
- jr c, .cannot_build
- lb de, 3, "FW3_○" ; can build
- jr .asm_b4c2
-.cannot_build
- push bc
- ld a, ALL_DECKS
- call CheckIfCanBuildSavedDeck
- jr c, .cannot_build_at_all
- pop bc
- lb de, 3, "FW3_❄" ; can build by dismantling
- jr .asm_b4c2
-
-.cannot_build_at_all
- lb de, 0, "FW0_✕" ; cannot build even by dismantling
- call Func_22ca
- pop bc
- pop de
-
-; place in wDefaultText the number of cards
-; that are needed in order to build the deck
- push bc
- ld d, 17
- inc e
- call InitTextPrinting
- pop bc
- call .GetNumCardsMissingToBuildDeck
- call CalculateOnesAndTensDigits
- ld hl, wOnesAndTensPlace
- ld a, [hli]
- ld b, a
- ld a, [hl]
- ld hl, wDefaultText
- ld [hl], TX_SYMBOL
- inc hl
- ld [hli], a
- ld [hl], TX_SYMBOL
- inc hl
- ld a, b
- ld [hli], a
- ld [hl], TX_END
- ld hl, wDefaultText
- call ProcessText
- or a
- ret
-
-.asm_b4c2
- call Func_22ca
- pop de
- ld d, 13
- inc e
- call InitTextPrinting
- ld hl, .text
- call ProcessText
- or a
- ret
-
-.text
- db TX_SYMBOL, TX_END
- db TX_SYMBOL, TX_END
- db TX_SYMBOL, TX_END
- db TX_SYMBOL, TX_END
- db TX_SYMBOL, TX_END
- db TX_SYMBOL, TX_END
- done
-
-; outputs in a the number of cards that the player does not own
-; in order to build the deck entry from wMachineDeckPtrs
-; given in register b
-.GetNumCardsMissingToBuildDeck
- push bc
- call SafelySwitchToSRAM0
- call CreateCardCollectionListWithDeckCards
- call SafelySwitchToTempSRAMBank
- pop bc
-
-; get address to cards for the corresponding deck entry
- sla b
- ld c, b
- ld b, $00
- ld hl, wMachineDeckPtrs
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld bc, DECK_NAME_SIZE
- add hl, bc
-
- call EnableSRAM
- ld de, wTempCardCollection
- lb bc, 0, 0
-.loop
- inc b
- ld a, DECK_SIZE
- cp b
- jr c, .done
- ld a, [hli]
- push hl
- ld l, a
- ld h, $00
- add hl, de
- ld a, [hl]
- and CARD_COUNT_MASK
- or a
- jr z, .none
- dec a
- ld [hl], a
- pop hl
- jr .loop
-.none
- inc c
- pop hl
- jr .loop
-.done
- ld a, c
- call DisableSRAM
- ret
-
-; counts how many decks in sSavedDecks are not empty
-; stores value in wNumSavedDecks
-GetSavedDeckCount: ; b525 (2:7525)
- call EnableSRAM
- ld hl, sSavedDecks
- ld bc, DECK_STRUCT_SIZE
- ld d, NUM_DECK_SAVE_MACHINE_SLOTS
- ld e, 0
-.loop
- ld a, [hl]
- or a
- jr z, .empty_slot
- inc e
-.empty_slot
- dec d
- jr z, .got_count
- add hl, bc
- jr .loop
-.got_count
- ld a, e
- ld [wNumSavedDecks], a
- call DisableSRAM
- ret
-
-; prints "[wNumSavedDecks]/60"
-PrintNumSavedDecks: ; b545 (2:7545)
- ld a, [wNumSavedDecks]
- ld hl, wDefaultText
- call ConvertToNumericalDigits
- ld a, TX_SYMBOL
- ld [hli], a
- ld a, SYM_SLASH
- ld [hli], a
- ld a, NUM_DECK_SAVE_MACHINE_SLOTS
- call ConvertToNumericalDigits
- ld [hl], TX_END
- lb de, 14, 1
- call InitTextPrinting
- ld hl, wDefaultText
- call ProcessText
- ret
-
-; prints "X/Y" where X is the current list index
-; and Y is the total number of saved decks
-; unreferenced?
-Func_b568: ; b568 (2:7568)
- ld a, [wCardListCursorPos]
- ld b, a
- ld a, [wCardListVisibleOffset]
- add b
- inc a
- ld hl, wDefaultText
- call ConvertToNumericalDigits
- ld a, TX_SYMBOL
- ld [hli], a
- ld a, SYM_SLASH
- ld [hli], a
- ld a, [wNumSavedDecks]
- call ConvertToNumericalDigits
- ld [hl], TX_END
- lb de, 14, 1
- call InitTextPrinting
- ld hl, wDefaultText
- call ProcessText
- ret
-
-; handles player choice in what deck to save
-; in the Deck Save Machine
-; assumes the slot to save was selected and
-; is stored in wSelectedDeckMachineEntry
-; if operation was successful, return carry
-SaveDeckInDeckSaveMachine: ; b592 (2:7592)
- ld a, ALL_DECKS
- call DrawDecksScreen
- xor a
-.wait_input
- ld hl, DeckMachineMenuParameters
- call InitializeMenuParameters
- ldtx hl, ChooseADeckToSaveText
- call DrawWideTextBox_PrintText
-.wait_submenu_input
- call DoFrame
- call HandleStartButtonInDeckSelectionMenu
- jr c, .wait_input
- call HandleMenuInput
- jp nc, .wait_submenu_input ; can be jr
- ldh a, [hCurMenuItem]
- cp $ff
- ret z ; operation cancelled
- ld [wCurDeck], a
- call CheckIfCurDeckIsValid
- jp nc, .SaveDeckInSelectedEntry ; can be jr
- ; is an empty deck
- call PrintThereIsNoDeckHereText
- ld a, [wCurDeck]
- jr .wait_input
-
-; overwrites data in the selected deck in SRAM
-; with the deck that was chosen, in wCurDeck
-; then returns carry
-.SaveDeckInSelectedEntry
- call GetPointerToDeckName
- call GetSelectedSavedDeckPtr
- ld b, DECK_STRUCT_SIZE
- call EnableSRAM
- call CopyNBytesFromHLToDE
- call DisableSRAM
-
- call ClearScreenAndDrawDeckMachineScreen
- call DrawListScrollArrows
- call PrintNumSavedDecks
- ld a, [wTempDeckMachineCursorPos]
- ld hl, DeckMachineSelectionParams
- call InitCardSelectionParams
- call DrawListCursor_Visible
- call GetPointerToDeckName
- call EnableSRAM
- call CopyDeckName
- call DisableSRAM
- xor a
- ld [wTxRam2 + 0], a
- ld [wTxRam2 + 1], a
- ldtx hl, SavedTheConfigurationForText
- call DrawWideTextBox_WaitForInput
- scf
- ret
-
-DeckMachineMenuParameters: ; b609 (2:7609)
- db 1, 2 ; cursor x, cursor y
- db 3 ; y displacement between items
- db 4 ; number of items
- db SYM_CURSOR_R ; cursor tile number
- db SYM_SPACE ; tile behind cursor
- dw NULL ; function pointer if non-0
-
-; outputs in de pointer of saved deck
-; corresponding to index in wSelectedDeckMachineEntry
-GetSelectedSavedDeckPtr: ; b611 (2:7611)
- push af
- push hl
- ld a, [wSelectedDeckMachineEntry]
- sla a
- ld e, a
- ld d, $00
- ld hl, wMachineDeckPtrs
- add hl, de
- ld e, [hl]
- inc hl
- ld d, [hl]
- pop hl
- pop af
- ret
-
-; checks if it's possible to build saved deck with index b
-; includes cards from already built decks from flags in a
-; returns carry if cannot build the deck with the given criteria
-; a = DECK_* flags for which decks to include in the collection
-; b = saved deck index
-CheckIfCanBuildSavedDeck: ; b625 (2:7625)
- push bc
- call SafelySwitchToSRAM0
- call CreateCardCollectionListWithDeckCards
- call SafelySwitchToTempSRAMBank
- pop bc
- sla b
- ld c, b
- ld b, $0
- ld hl, wMachineDeckPtrs
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld bc, DECK_NAME_SIZE
- add hl, bc
- call CheckIfHasEnoughCardsToBuildDeck
- ret
-
-; switches to SRAM bank 0 and stores current SRAM bank in wTempBankSRAM
-; skips if current SRAM bank is already 0
-SafelySwitchToSRAM0: ; b644 (2:7644)
- push af
- ldh a, [hBankSRAM]
- or a
- jr z, .skip
- ld [wTempBankSRAM], a
- xor a
- call BankswitchSRAM
-.skip
- pop af
- ret
-
-; switches to SRAM bank 1 and stores current SRAM bank in wTempBankSRAM
-; skips if current SRAM bank is already 1
-SafelySwitchToSRAM1: ; b653 (2:7653)
- push af
- ldh a, [hBankSRAM]
- cp BANK("SRAM1")
- jr z, .skip
- ld [wTempBankSRAM], a
- ld a, BANK("SRAM1")
- call BankswitchSRAM
-.skip
- pop af
- ret
-
-SafelySwitchToTempSRAMBank: ; b664 (2:7664)
- push af
- push bc
- ldh a, [hBankSRAM]
- ld b, a
- ld a, [wTempBankSRAM]
- cp b
- jr z, .skip
- call BankswitchSRAM
-.skip
- pop bc
- pop af
- ret
-
-; returns carry if wTempCardCollection does not
-; have enough cards to build deck pointed by hl
-; hl = pointer to cards of deck to check
-CheckIfHasEnoughCardsToBuildDeck: ; b675 (2:7675)
- call EnableSRAM
- ld de, wTempCardCollection
- ld b, 0
-.loop
- inc b
- ld a, DECK_SIZE
- cp b
- jr c, .no_carry
- ld a, [hli]
- push hl
- ld l, a
- ld h, $00
- add hl, de
- ld a, [hl]
- or a
- jr z, .set_carry
- cp CARD_NOT_OWNED
- jr z, .set_carry
- dec a
- ld [hl], a
- pop hl
- jr .loop
-
-.set_carry
- pop hl
- call DisableSRAM
- scf
- ret
-
-.no_carry
- call DisableSRAM
- or a
- ret
-
-; outputs in a the first slot that is empty to build a deck
-; if no empty slot is found, return carry
-FindFirstEmptyDeckSlot: ; b6a1 (2:76a1)
- ld hl, sDeck1Cards
- ld a, [hl]
- or a
- jr nz, .check_deck_2
- xor a
- ret
-
-.check_deck_2
- ld hl, sDeck2Cards
- ld a, [hl]
- or a
- jr nz, .check_deck_3
- ld a, 1
- ret
-
-.check_deck_3
- ld hl, sDeck3Cards
- ld a, [hl]
- or a
- jr nz, .check_deck_4
- ld a, 2
- ret
-
-.check_deck_4
- ld hl, sDeck4Cards
- ld a, [hl]
- or a
- jr nz, .set_carry
- ld a, 3
- ret
-
-.set_carry
- scf
- ret
-
-; prompts the player whether to delete selected saved deck
-; if player selects yes, clears memory in SRAM
-; corresponding to that saved deck slot
-; if player selects no, return carry
-TryDeleteSavedDeck: ; b6ca (2:76ca)
- ldtx hl, DoYouReallyWishToDeleteText
- call YesOrNoMenuWithText
- jr c, .no
- call GetSelectedSavedDeckPtr
- ld l, e
- ld h, d
- push hl
- call EnableSRAM
- call CopyDeckName
- pop hl
- ld a, DECK_STRUCT_SIZE
- call ClearNBytesFromHL
- call DisableSRAM
- xor a
- ld [wTxRam2 + 0], a
- ld [wTxRam2 + 1], a
- ldtx hl, DeletedTheConfigurationForText
- call DrawWideTextBox_WaitForInput
- or a
- ret
-
-.no
- ld a, [wCardListCursorPos]
- scf
- ret
-
-DeckMachineSelectionParams: ; b6fb (2:76fb)
- db 1 ; x pos
- db 2 ; y pos
- db 2 ; y spacing
- db 0 ; x spacing
- db 5 ; num entries
- db SYM_CURSOR_R ; visible cursor tile
- db SYM_SPACE ; invisible cursor tile
- dw NULL ; wCardListHandlerFunction
-
-DrawListScrollArrows: ; b704 (2:7704)
- ld a, [wCardListVisibleOffset]
- or a
- jr z, .no_up_cursor
- ld a, SYM_CURSOR_U
- jr .got_tile_1
-.no_up_cursor
- ld a, SYM_BOX_RIGHT
-.got_tile_1
- lb bc, 19, 1
- call WriteByteToBGMap0
-
- ld a, [wCardListVisibleOffset]
- add NUM_DECK_MACHINE_VISIBLE_DECKS + 1
- ld b, a
- ld a, [wNumDeckMachineEntries]
- cp b
- jr c, .no_down_cursor
- xor a ; FALSE
- ld [wUnableToScrollDown], a
- ld a, SYM_CURSOR_D
- jr .got_tile_2
-.no_down_cursor
- ld a, TRUE
- ld [wUnableToScrollDown], a
- ld a, SYM_BOX_RIGHT
-.got_tile_2
- lb bc, 19, 11
- call WriteByteToBGMap0
- ret
-
-; handles the deck menu for when the player
-; needs to make space for new deck to build
-HandleDismantleDeckToMakeSpace: ; b738 (2:7738)
- ldtx hl, YouMayOnlyCarry4DecksText
- call DrawWideTextBox_WaitForInput
- call SafelySwitchToSRAM0
- ld a, ALL_DECKS
- call DrawDecksScreen
- xor a
-.init_menu_params
- ld hl, DeckMachineMenuParameters
- call InitializeMenuParameters
- ldtx hl, ChooseADeckToDismantleText
- call DrawWideTextBox_PrintText
-.loop_input
- call DoFrame
- call HandleStartButtonInDeckSelectionMenu
- jr c, .init_menu_params
- call HandleMenuInput
- jp nc, .loop_input ; can be jr
- ldh a, [hCurMenuItem]
- cp $ff
- jr nz, .selected_deck
- ; operation was cancelled
- call SafelySwitchToTempSRAMBank
- scf
- ret
-
-.selected_deck
- ld [wCurDeck], a
- ldtx hl, DismantleThisDeckText
- call YesOrNoMenuWithText
- jr nc, .dismantle
- ld a, [wCurDeck]
- jr .init_menu_params
-
-.dismantle
- call GetPointerToDeckName
- push hl
- ld de, wDismantledDeckName
- call EnableSRAM
- call CopyListFromHLToDE
- pop hl
- push hl
- ld bc, DECK_NAME_SIZE
- add hl, bc
- call AddDeckToCollection
- pop hl
- ld a, DECK_STRUCT_SIZE
- call ClearNBytesFromHL
- call DisableSRAM
-
- ; redraw deck screen
- ld a, ALL_DECKS
- call DrawDecksScreen
- ld a, [wCurDeck]
- ld hl, DeckMachineMenuParameters
- call InitializeMenuParameters
- call DrawCursor2
- call SafelySwitchToTempSRAMBank
- ld hl, wDismantledDeckName
- call CopyDeckName
- xor a
- ld [wTxRam2 + 0], a
- ld [wTxRam2 + 1], a
- ldtx hl, DismantledDeckText
- call DrawWideTextBox_WaitForInput
- ld a, [wCurDeck]
- ret
-
-; tries to build the deck in wSelectedDeckMachineEntry
-; will check if can be built with or without dismantling
-; prompts the player in case a deck has to be dismantled
-; or, if it's impossible to build deck, shows missing cards list
-TryBuildDeckMachineDeck: ; b7c6 (2:77c6)
- ld a, [wSelectedDeckMachineEntry]
- ld b, a
- push bc
- ld a, $0
- call CheckIfCanBuildSavedDeck
- pop bc
- jr nc, .build_deck
- ld a, ALL_DECKS
- call CheckIfCanBuildSavedDeck
- jr c, .do_not_own_all_cards_needed
- ; can only be built by dismantling some deck
- ldtx hl, ThisDeckCanOnlyBeBuiltIfYouDismantleText
- call DrawWideTextBox_WaitForInput
- call .DismantleDecksNeededToBuild
- jr nc, .build_deck
- ; player chose not to dismantle
-
-.set_carry_and_return
- ld a, [wCardListCursorPos]
- scf
- ret
-
-.do_not_own_all_cards_needed
- ldtx hl, YouDoNotOwnAllCardsNeededToBuildThisDeckText
- call DrawWideTextBox_WaitForInput
- jp .ShowMissingCardList
-
-.build_deck
- call EnableSRAM
- call SafelySwitchToSRAM0
- call FindFirstEmptyDeckSlot
- call SafelySwitchToTempSRAMBank
- call DisableSRAM
- jr nc, .got_deck_slot
- call HandleDismantleDeckToMakeSpace
- jr nc, .got_deck_slot
- scf
- ret
-
-.got_deck_slot
- ld [wDeckSlotForNewDeck], a
- ld a, [wSelectedDeckMachineEntry]
- ld c, a
- ld b, $0
- sla c
- ld hl, wMachineDeckPtrs
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
- ; copy deck to buffer
- ld de, wDeckToBuild
- ld b, DECK_STRUCT_SIZE
- call EnableSRAM
- call CopyNBytesFromHLToDE
-
- ; remove the needed cards from collection
- ld hl, wDeckToBuild + DECK_NAME_SIZE
- call SafelySwitchToSRAM0
- call DecrementDeckCardsInCollection
-
- ; copy the deck cards from the buffer
- ; to the deck slot that was chosen
- ld a, [wDeckSlotForNewDeck]
- ld l, a
- ld h, DECK_STRUCT_SIZE
- call HtimesL
- ld bc, sBuiltDecks
- add hl, bc
- ld d, h
- ld e, l
- ld hl, wDeckToBuild
- ld b, DECK_STRUCT_SIZE
- call CopyNBytesFromHLToDE
- call DisableSRAM
-
- ; draw Decks screen
- ld a, ALL_DECKS
- call DrawDecksScreen
- ld a, [wDeckSlotForNewDeck]
- ld [wCurDeck], a
- ld hl, DeckMachineMenuParameters
- call InitializeMenuParameters
- call DrawCursor2
- call GetPointerToDeckName
- call EnableSRAM
- call CopyDeckName
- call DisableSRAM
- call SafelySwitchToTempSRAMBank
- xor a
- ld [wTxRam2 + 0], a
- ld [wTxRam2 + 1], a
- ldtx hl, BuiltDeckText
- call DrawWideTextBox_WaitForInput
- scf
- ret
-
-; asks the player for confirmation to dismantle decks
-; needed to build the selected deck from the Deck Save Machine
-; returns carry set if player selected "no"
-; if player selected "yes", dismantle decks
-.DismantleDecksNeededToBuild
-; shows Decks screen with the names
-; of the decks to be dismantled
- farcall CheckWhichDecksToDismantleToBuildSavedDeck
- call SafelySwitchToSRAM0
- call DrawDecksScreen
- ldtx hl, DismantleTheseDecksText
- call YesOrNoMenuWithText
- jr nc, .yes
-; no
- call SafelySwitchToTempSRAMBank
- scf
- ret
-
-.yes
- call EnableSRAM
- ld a, [wDecksToBeDismantled]
- bit DECK_1_F, a
- jr z, .deck_2
- ld a, DECK_1_F
- call .DismantleDeck
-.deck_2
- ld a, [wDecksToBeDismantled]
- bit DECK_2_F, a
- jr z, .deck_3
- ld a, DECK_2_F
- call .DismantleDeck
-.deck_3
- ld a, [wDecksToBeDismantled]
- bit DECK_3_F, a
- jr z, .deck_4
- ld a, DECK_3_F
- call .DismantleDeck
-.deck_4
- ld a, [wDecksToBeDismantled]
- bit DECK_4_F, a
- jr z, .done_dismantling
- ld a, DECK_4_F
- call .DismantleDeck
-
-.done_dismantling
- call DisableSRAM
- ld a, [wDecksToBeDismantled]
- call DrawDecksScreen
- call SafelySwitchToTempSRAMBank
- ldtx hl, DismantledTheDeckText
- call DrawWideTextBox_WaitForInput
- or a
- ret
-
-; dismantles built deck given by a
-; and adds its cards to the collection
-; a = DECK_*_F to dismantle
-.DismantleDeck
- ld l, a
- ld h, DECK_STRUCT_SIZE
- call HtimesL
- ld bc, sBuiltDecks
- add hl, bc
- push hl
- ld bc, DECK_NAME_SIZE
- add hl, bc
- call AddDeckToCollection
- pop hl
- ld a, DECK_STRUCT_SIZE
- call ClearNBytesFromHL
- ret
-
-; collects cards missing from player's collection
-; and shows its confirmation list
-.ShowMissingCardList
-; copy saved deck card from SRAM to wCurDeckCards
-; and make unique card list sorted by ID
- ld a, [wSelectedDeckMachineEntry]
- ld [wCurDeck], a
- call GetSelectedSavedDeckPtr
- ld hl, DECK_NAME_SIZE
- add hl, de
- ld de, wCurDeckCards
- ld b, DECK_SIZE
- call EnableSRAM
- call CopyNBytesFromHLToDE
- call DisableSRAM
- xor a ; terminator byte for deck
- ld [wCurDeckCards + DECK_SIZE], a
- call SortCurDeckCardsByID
- call CreateCurDeckUniqueCardList
-
-; create collection card list, including
-; the cards from all built decks
- ld a, ALL_DECKS
- call SafelySwitchToSRAM0
- call CreateCardCollectionListWithDeckCards
- call SafelySwitchToTempSRAMBank
-
-; creates list in wFilteredCardList with
-; cards that are missing to build this deck
- ld hl, wUniqueDeckCardList
- ld de, wFilteredCardList
-.loop_deck_configuration
- ld a, [hli]
- or a
- jr z, .finish_missing_card_list
- ld b, a
- push bc
- push de
- push hl
- ld hl, wCurDeckCards
- call .CheckIfCardIsMissing
- pop hl
- pop de
- pop bc
- jr nc, .loop_deck_configuration
- ; this card is missing
- ; store in wFilteredCardList this card ID
- ; a number of times equal to the amount still needed
- ld c, a
- ld a, b
-.loop_number_missing
- ld [de], a
- inc de
- dec c
- jr nz, .loop_number_missing
- jr .loop_deck_configuration
-
-.finish_missing_card_list
- xor a ; terminator byte
- ld [de], a
-
- ldtx bc, TheseCardsAreNeededToBuildThisDeckText
- ld hl, wCardConfirmationText
- ld a, c
- ld [hli], a
- ld a, b
- ld [hl], a
-
- call GetSelectedSavedDeckPtr
- ld h, d
- ld l, e
- ld de, wFilteredCardList
- call HandleDeckMissingCardsList
- jp .set_carry_and_return
-
-; checks if player has enough cards with ID given in register a
-; in the collection to build the deck and, if not, returns
-; carry set and outputs in a the difference
-; a = card ID
-; hl = deck cards
-.CheckIfCardIsMissing
- call .GetCardCountFromDeck
- ld hl, wTempCardCollection
- push de
- call .GetCardCountFromCollection
- ld a, e
- pop de
-
- ; d = card count in deck
- ; a = card count in collection
- cp d
- jr c, .not_enough
- or a
- ret
-
-.not_enough
-; needs more cards than player owns in collection
-; return carry set and the number of cards needed
- ld e, a
- ld a, d
- sub e
- scf
- ret z
-
-; returns in d the card count of card ID given in register a
-; that is found in the card list in hl
-; a = card ID
-; hl = deck cards
-.GetCardCountFromDeck
- push af
- ld e, a
- ld d, 0
-.loop_deck_cards
- ld a, [hli]
- or a
- jr z, .done_deck_cards
- cp e
- jr nz, .loop_deck_cards
- inc d
- jr .loop_deck_cards
-.done_deck_cards
- pop af
- ret
-
-; returns in e the card count of card ID given in register a
-; that is found in the card collection
-; a = card ID
-; hl = card collection
-.GetCardCountFromCollection
- push af
- ld e, a
- ld d, $0
- add hl, de
- ld a, [hl]
- and CARD_COUNT_MASK
- ld e, a
- pop af
- ret
-
-PrinterMenu_DeckConfiguration: ; b991 (2:7991)
- xor a
- ld [wCardListVisibleOffset], a
- call ClearScreenAndDrawDeckMachineScreen
- ld a, DECK_SIZE
- ld [wNumDeckMachineEntries], a
-
- xor a
-.asm_b99e
- ld hl, DeckMachineSelectionParams
- call InitCardSelectionParams
- call DrawListScrollArrows
- call PrintNumSavedDecks
- ldtx hl, PleaseChooseDeckConfigurationToPrintText
- call DrawWideTextBox_PrintText
- ldtx de, PleaseChooseDeckConfigurationToPrintText
- call InitDeckMachineDrawingParams
-.asm_b9b6
- call HandleDeckMachineSelection
- jr c, .asm_b99e
- cp $ff
- ret z
-
- ld b, a
- ld a, [wCardListVisibleOffset]
- add b
- ld [wSelectedDeckMachineEntry], a
- call CheckIfSelectedDeckMachineEntryIsEmpty
- jr c, .asm_b9b6
- call DrawWideTextBox
- ldtx hl, PrintThisDeckText
- call YesOrNoMenuWithText
- jr c, .no
- call GetSelectedSavedDeckPtr
- ld hl, $18
- add hl, de
- ld de, wCurDeckCards
- ld b, DECK_SIZE
- call EnableSRAM
- call CopyNBytesFromHLToDE
- call DisableSRAM
- xor a ; terminator byte for deck
- ld [wCurDeckCards + DECK_SIZE], a
- call SortCurDeckCardsByID
- ld a, [wSelectedDeckMachineEntry]
- bank1call PrintDeckConfiguration
- call ClearScreenAndDrawDeckMachineScreen
-
-.no
- ld a, [wTempDeckMachineCursorPos]
- ld [wCardListCursorPos], a
- jp .asm_b99e
-
-HandleAutoDeckMenu: ; ba04 (2:7a04)
- ld a, [wCurAutoDeckMachine]
- ld hl, .DeckMachineTitleTextList
- sla a
- ld c, a
- ld b, $0
- add hl, bc
- ld de, wDeckMachineTitleText
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hl]
- ld [de], a
- xor a
- ld [wCardListVisibleOffset], a
- call .InitAutoDeckMenu
- ld a, NUM_DECK_MACHINE_SLOTS
- ld [wNumDeckMachineEntries], a
- xor a
-
-.please_select_deck
- ld hl, .MenuParameters
- call InitializeMenuParameters
- ldtx hl, PleaseSelectDeckText
- call DrawWideTextBox_PrintText
- ld a, NUM_DECK_MACHINE_SLOTS
- ld [wCardListNumCursorPositions], a
- ld hl, UpdateDeckMachineScrollArrowsAndEntries
- ld d, h
- ld a, l
- ld hl, wCardListUpdateFunction
- ld [hli], a
- ld [hl], d
-.wait_input
- call DoFrame
- call HandleMenuInput
- jr c, .deck_selection_made
-
-; the following lines do nothing
- ldh a, [hDPadHeld]
- and D_UP | D_DOWN
- jr z, .asm_ba4e
-.asm_ba4e
-
-; check whether to show deck confirmation list
- ldh a, [hDPadHeld]
- and START
- jr z, .wait_input
-
- ld a, [wCardListVisibleOffset]
- ld [wTempCardListVisibleOffset], a
- ld b, a
- ld a, [wCurMenuItem]
- ld [wTempDeckMachineCursorPos], a
- add b
- ld c, a
- inc a
- or $80
- ld [wCurDeck], a
- sla c
- ld b, $0
- ld hl, wMachineDeckPtrs
- add hl, bc
- call SafelySwitchToSRAM1
- ld a, [hli]
- ld h, [hl]
- ld l, a
- push hl
- ld bc, DECK_NAME_SIZE
- add hl, bc
- ld d, h
- ld e, l
- ld a, [hl]
- pop hl
- call SafelySwitchToSRAM0
- or a
- jr z, .wait_input ; invalid deck
-
- ; show confirmation list
- ld a, $1
- call PlaySFXConfirmOrCancel
- call SafelySwitchToSRAM1
- call OpenDeckConfirmationMenu
- call SafelySwitchToSRAM0
- ld a, [wTempCardListVisibleOffset]
- ld [wCardListVisibleOffset], a
- call .InitAutoDeckMenu
- ld a, [wTempDeckMachineCursorPos]
- jp .please_select_deck
-
-.deck_selection_made
- call DrawCursor2
- ld a, [wCardListVisibleOffset]
- ld [wTempCardListVisibleOffset], a
- ld a, [wCurMenuItem]
- ld [wTempDeckMachineCursorPos], a
- ldh a, [hCurMenuItem]
- cp $ff
- jp z, .exit ; operation cancelled
- ld [wSelectedDeckMachineEntry], a
- call ResetCheckMenuCursorPositionAndBlink
- xor a
- ld [wce5e], a
- call DrawWideTextBox
- ld hl, .DeckMachineMenuData
- call PlaceTextItems
-.wait_submenu_input
- call DoFrame
- call HandleCheckMenuInput_YourOrOppPlayArea
- jp nc, .wait_submenu_input
- cp $ff
- jr nz, .submenu_option_selected
- ld a, [wTempDeckMachineCursorPos]
- jp .please_select_deck
-
-.submenu_option_selected
- ld a, [wCheckMenuCursorYPosition]
- sla a
- ld hl, wCheckMenuCursorXPosition
- add [hl]
- or a
- jr nz, .asm_bb09
-
-; Build a Deck
- call SafelySwitchToSRAM1
- call TryBuildDeckMachineDeck
- call SafelySwitchToSRAM0
- ld a, [wTempDeckMachineCursorPos]
- jp nc, .please_select_deck
- ld a, [wTempCardListVisibleOffset]
- ld [wCardListVisibleOffset], a
- call .InitAutoDeckMenu
- ld a, [wTempDeckMachineCursorPos]
- jp .please_select_deck
-
-.asm_bb09
- cp $1
- jr nz, .read_the_instructions
-.exit
- xor a
- ld [wTempBankSRAM], a
- ret
-
-.read_the_instructions
-; show card confirmation list
- ld a, [wCardListVisibleOffset]
- ld [wTempCardListVisibleOffset], a
- ld b, a
- ld a, [wCurMenuItem]
- ld [wTempDeckMachineCursorPos], a
- add b
- ld c, a
- ld [wCurDeck], a
- sla c
- ld b, $0
- ld hl, wMachineDeckPtrs
- add hl, bc
-
- ; set the description text in text box
- push hl
- ld hl, wAutoDeckMachineTextDescriptions
- add hl, bc
- ld bc, wCardConfirmationText
- ld a, [hli]
- ld [bc], a
- inc bc
- ld a, [hl]
- ld [bc], a
- pop hl
-
- call SafelySwitchToSRAM1
- ld a, [hli]
- ld h, [hl]
- ld l, a
- push hl
- ld bc, DECK_NAME_SIZE
- add hl, bc
- ld d, h
- ld e, l
- ld a, [hl]
- pop hl
- call SafelySwitchToSRAM0
- or a
- jp z, .wait_input ; invalid deck
-
- ; show confirmation list
- ld a, $1
- call PlaySFXConfirmOrCancel
- call SafelySwitchToSRAM1
- xor a
- call HandleDeckMissingCardsList
- call SafelySwitchToSRAM0
- ld a, [wTempCardListVisibleOffset]
- ld [wCardListVisibleOffset], a
- call .InitAutoDeckMenu
- ld a, [wTempDeckMachineCursorPos]
- jp .please_select_deck
-
-.MenuParameters
- db 1, 2 ; cursor x, cursor y
- db 2 ; y displacement between items
- db 5 ; number of items
- db SYM_CURSOR_R ; cursor tile number
- db SYM_SPACE ; tile behind cursor
- dw NULL ; function pointer if non-0
-
-.DeckMachineMenuData
- textitem 2, 14, BuildADeckText
- textitem 12, 14, CancelText
- textitem 2, 16, ReadTheInstructionsText
- db $ff
-
-.DeckMachineTitleTextList
- tx FightingMachineText
- tx RockMachineText
- tx WaterMachineText
- tx LightningMachineText
- tx GrassMachineText
- tx PsychicMachineText
- tx ScienceMachineText
- tx FireMachineText
- tx AutoMachineText
- tx LegendaryMachineText
-
-; clears screen, loads the proper tiles
-; prints the Auto Deck title and deck entries
-; and creates the auto deck configurations
-.InitAutoDeckMenu
- call Set_OBJ_8x8
- xor a
- ld [wTileMapFill], a
- call ZeroObjectPositions
- call EmptyScreen
- ld a, $01
- ld [wVBlankOAMCopyToggle], a
- call LoadSymbolsFont
- call LoadDuelCardSymbolTiles
- bank1call SetDefaultPalettes
- lb de, $3c, $ff
- call SetupText
- lb de, 0, 0
- lb bc, 20, 13
- call DrawRegularTextBox
- lb de, 1, 0
- call InitTextPrinting
- ld hl, wDeckMachineTitleText
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call ProcessTextFromID
- call SafelySwitchToSRAM1
- farcall ReadAutoDeckConfiguration
- call .CreateAutoDeckPointerList
- call PrintVisibleDeckMachineEntries
- call SafelySwitchToSRAM0
- call EnableLCD
- ret
-
-; writes to wMachineDeckPtrs the pointers
-; to the Auto Decks in sAutoDecks
-.CreateAutoDeckPointerList
- ld a, 2 * NUM_DECK_MACHINE_SLOTS
- ld hl, wMachineDeckPtrs
- call ClearNBytesFromHL
- ld de, wMachineDeckPtrs
- ld hl, sAutoDecks
- ld bc, DECK_STRUCT_SIZE
- ld a, NUM_DECK_MACHINE_SLOTS
-.loop
- push af
- ld a, l
- ld [de], a
- inc de
- ld a, h
- ld [de], a
- inc de
- add hl, bc
- pop af
- dec a
- jr nz, .loop
- ret
-
-Func_bc04: ; bc04 (2:7c04)
- xor a
- ld [wCardListVisibleOffset], a
- ldtx de, DeckSaveMachineText
- ld hl, wDeckMachineTitleText
- ld [hl], e
- inc hl
- ld [hl], d
- call ClearScreenAndDrawDeckMachineScreen
- ld a, DECK_SIZE
- ld [wNumDeckMachineEntries], a
- xor a
-.asm_bc1a
- ld hl, DeckMachineSelectionParams
- call InitCardSelectionParams
- call DrawListScrollArrows
- call PrintNumSavedDecks
- ldtx hl, PleaseChooseADeckConfigurationToSendText
- call DrawWideTextBox_PrintText
- ldtx de, PleaseChooseADeckConfigurationToSendText
- call InitDeckMachineDrawingParams
-.asm_bc32
- call HandleDeckMachineSelection
- jr c, .asm_bc1a
- cp $ff
- jr nz, .asm_bc3f
- ld a, $01
- or a
- ret
-.asm_bc3f
- ld b, a
- ld a, [wCardListVisibleOffset]
- add b
- ld [wSelectedDeckMachineEntry], a
- call CheckIfSelectedDeckMachineEntryIsEmpty
- jr c, .asm_bc32
-
- call GetSelectedSavedDeckPtr
- ld l, e
- ld h, d
- ld de, wDuelTempList
- ld b, DECK_STRUCT_SIZE
- call EnableSRAM
- call CopyNBytesFromHLToDE
- call DisableSRAM
-
- xor a
- ld [wNameBuffer], a
- bank1call SendDeckConfiguration
- ret c
-
- call GetSelectedSavedDeckPtr
- ld l, e
- ld h, d
- ld de, wDefaultText
- call EnableSRAM
- call CopyListFromHLToDE
- call DisableSRAM
- or a
- ret
-
-Func_bc7a: ; bc7a (2:7c7a)
- xor a
- ld [wCardListVisibleOffset], a
- ldtx de, DeckSaveMachineText
- ld hl, wDeckMachineTitleText
- ld [hl], e
- inc hl
- ld [hl], d
- call ClearScreenAndDrawDeckMachineScreen
- ld a, DECK_SIZE
- ld [wNumDeckMachineEntries], a
- xor a
-.asm_bc90
- ld hl, DeckMachineSelectionParams
- call InitCardSelectionParams
- call DrawListScrollArrows
- call PrintNumSavedDecks
- ldtx hl, PleaseChooseASaveSlotText
- call DrawWideTextBox_PrintText
- ldtx de, PleaseChooseASaveSlotText
- call InitDeckMachineDrawingParams
- call HandleDeckMachineSelection
- jr c, .asm_bc90
- cp $ff
- jr nz, .asm_bcb5
- ld a, $01
- or a
- ret
-.asm_bcb5
- ld b, a
- ld a, [wCardListVisibleOffset]
- add b
- ld [wSelectedDeckMachineEntry], a
- call CheckIfSelectedDeckMachineEntryIsEmpty
- jr nc, .asm_bcc4
- jr .asm_bcd1
-.asm_bcc4
- ldtx hl, OKIfFileDeletedText
- call YesOrNoMenuWithText
- jr nc, .asm_bcd1
- ld a, [wCardListCursorPos]
- jr .asm_bc90
-.asm_bcd1
- xor a
- ld [wDuelTempList], a
- ld [wNameBuffer], a
- bank1call ReceiveDeckConfiguration
- ret c
- call EnableSRAM
- ld hl, wDuelTempList
- call GetSelectedSavedDeckPtr
- ld b, DECK_STRUCT_SIZE
- call CopyNBytesFromHLToDE
- call DisableSRAM
- call SaveGame
- call ClearScreenAndDrawDeckMachineScreen
- ld a, [wCardListCursorPos]
- ld hl, DeckMachineSelectionParams
- call InitCardSelectionParams
- call DrawListScrollArrows
- call PrintNumSavedDecks
- call DrawListCursor_Visible
- ld hl, wNameBuffer
- ld de, wDefaultText
- call CopyListFromHLToDE
- xor a
- ld [wTxRam2 + 0], a
- ld [wTxRam2 + 1], a
- ldtx hl, ReceivedADeckConfigurationFromText
- call DrawWideTextBox_WaitForInput
- call GetSelectedSavedDeckPtr
- ld l, e
- ld h, d
- ld de, wDefaultText
- call EnableSRAM
- call CopyListFromHLToDE
- call DisableSRAM
- xor a
- ret