summaryrefslogtreecommitdiff
path: root/src/engine/menus/deck_selection.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/menus/deck_selection.asm')
-rw-r--r--src/engine/menus/deck_selection.asm546
1 files changed, 546 insertions, 0 deletions
diff --git a/src/engine/menus/deck_selection.asm b/src/engine/menus/deck_selection.asm
new file mode 100644
index 0000000..83de8d0
--- /dev/null
+++ b/src/engine/menus/deck_selection.asm
@@ -0,0 +1,546 @@
+INCLUDE "data/glossary_menu_transitions.asm"
+
+; copies DECK_SIZE number of cards from de to hl in SRAM
+CopyDeckFromSRAM:
+ 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:
+ 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
+InitPromotionalCardAndDeckCounterSaveData:
+ 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:
+ ld hl, HandCardsGfx
+ ld de, v0Tiles2 + $38 tiles
+ call CopyListFromHLToDE
+ ret
+
+HandCardsGfx:
+ INCBIN "gfx/hand_cards.2bpp"
+ db $00 ; end of data
+
+EmptyScreenAndLoadFontDuelAndHandCardsIcons:
+ 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:
+ 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:
+ ld de, wMaxNumCardsAllowed
+ ld b, $7
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .loop
+ ret
+
+DeckBuildingParams:
+ 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:
+ 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:
+ 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:
+; 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:
+ 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:
+ 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:
+ 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:
+ ldtx hl, ThereIsNoDeckHereText
+ call DrawWideTextBox_WaitForInput
+ ld a, [wCurDeck]
+ ret
+
+; returns carry if deck in wCurDeck
+; is not a valid deck
+CheckIfCurDeckIsValid:
+ 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:
+ 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:
+ ret
+
+DeckSelectionData:
+ 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:
+ 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:
+ 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:
+ xor a
+ ld [wCheckMenuCursorXPosition], a
+ ld [wCheckMenuCursorYPosition], a
+ ld [wCheckMenuCursorBlinkCounter], a
+ ret