From 475ab464d86bd7a742774407080b2d48e7eb10e4 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Tue, 11 May 2021 16:21:28 +0100 Subject: Auto Deck Machine functionalities --- src/engine/bank02.asm | 1026 ++++++++++++++++++++++++++++--------------------- src/engine/bank03.asm | 6 +- src/engine/bank06.asm | 166 ++++---- 3 files changed, 683 insertions(+), 515 deletions(-) (limited to 'src/engine') diff --git a/src/engine/bank02.asm b/src/engine/bank02.asm index 8680139..46df6f6 100644 --- a/src/engine/bank02.asm +++ b/src/engine/bank02.asm @@ -2260,7 +2260,7 @@ DeckBuildingParams: ; 8da9 (2:4da9) DeckSelectionMenu: ; 8db0 (2:4db0) ld hl, DeckBuildingParams call InitDeckBuildingParams - ld a, $ff + ld a, ALL_DECKS call DrawDecksScreen xor a @@ -2321,7 +2321,7 @@ HandleStartButtonInDeckSelectionMenu: ; 8dea (2:4dea) call GetPointerToDeckName pop de call OpenDeckConfirmationMenu - ld a, $ff + ld a, ALL_DECKS call DrawDecksScreen ld a, [wCurDeck] scf @@ -2421,7 +2421,7 @@ DeckSelectionSubMenu: ; 8e42 (2:4e42) or a jr z, .get_input_deck_name .asm_8ec4 - ld a, $ff + ld a, ALL_DECKS call DrawDecksScreen ld a, [wCurDeck] jp DeckSelectionMenu.init_menu_params @@ -2444,7 +2444,7 @@ DeckSelectionSubMenu: ; 8e42 (2:4e42) ld e, l ld hl, wCurDeckName call CopyListFromHLToDEInSRAM - ld a, $ff + ld a, ALL_DECKS call DrawDecksScreen ld a, [wCurDeck] jp DeckSelectionMenu.init_menu_params @@ -2637,7 +2637,7 @@ DeckSelectionData: ; 9027 (2:5027) GetPointerToDeckName: ; 9038 (2:5038) ld a, [wCurDeck] ld h, a - ld l, sDeck2Name - sDeck1Name + ld l, DECK_STRUCT_SIZE call HtimesL push de ld de, sDeck1Name @@ -2906,7 +2906,7 @@ AddDeckToCollection: ; 9152 (2:5152) ; draws the screen which shows the player's current ; deck configurations -; a = some flags to pick which deck names to show +; a = DECK_* flags to pick which deck names to show DrawDecksScreen: ; 9168 (2:5168) ld [hffb5], a call EmptyScreenAndLoadFontDuelAndHandCardsIcons @@ -3704,7 +3704,7 @@ FilteredCardListSelectionParams: ; 9670 (2:5670) db 7 ; y pos db 2 ; y spacing db 0 ; x spacing - db MAX_FILTERED_LIST_VISIBLE_CARDS ; num entries + db NUM_FILTERED_LIST_VISIBLE_CARDS ; num entries db SYM_CURSOR_R ; visible cursor tile db SYM_SPACE ; invisible cursor tile dw NULL ; wCardListHandlerFunction @@ -4294,7 +4294,7 @@ PrintFilteredCardList: ; 993d (2:593d) pop af call CreateFilteredCardList - ld a, MAX_FILTERED_LIST_VISIBLE_CARDS + ld a, NUM_FILTERED_LIST_VISIBLE_CARDS ld [wNumVisibleCardListEntries], a lb de, 1, 7 ld hl, wCardListCoords @@ -4431,14 +4431,14 @@ PrintDeckBuildingCardList: ; 99b0 (2:59b0) ; draw down cursor because ; there are still more cards ; to be scrolled down - xor a - ld [wcecd], a + xor a ; FALSE + ld [wUnableToScrollDown], a ld a, SYM_CURSOR_D jr .draw_cursor .cannot_scroll pop de - ld a, $01 - ld [wcecd], a + ld a, TRUE + ld [wUnableToScrollDown], a ld a, SYM_SPACE .draw_cursor ld b, 19 ; x coord @@ -4728,9 +4728,9 @@ HandleDeckCardSelectionList: ; 9b25 (2:5b25) cp c jr c, .asm_9b8f push af - ld a, [wcecd] + ld a, [wUnableToScrollDown] or a - jr nz, .asm_9b87 + jr nz, .cannot_scroll_down ld a, [wCardListVisibleOffset] inc a ld [wCardListVisibleOffset], a @@ -4740,7 +4740,7 @@ HandleDeckCardSelectionList: ; 9b25 (2:5b25) dec a jr .asm_9b8f -.asm_9b87 +.cannot_scroll_down pop af dec a push af @@ -5260,9 +5260,9 @@ HandleDeckConfirmationMenu: ; 9e41 (2:5e41) call InitCardSelectionParams ld a, [wNumUniqueCards] ld [wNumCardListEntries], a - cp MAX_DECK_CONFIRMATION_VISIBLE_CARDS + cp NUM_DECK_CONFIRMATION_VISIBLE_CARDS jr c, .no_cap - ld a, MAX_DECK_CONFIRMATION_VISIBLE_CARDS + ld a, NUM_DECK_CONFIRMATION_VISIBLE_CARDS .no_cap ld [wCardListNumCursorPositions], a ld [wNumVisibleCardListEntries], a @@ -5629,14 +5629,14 @@ SortCurDeckCardsByID: ; a028 (2:6028) ; 0xa06e ; goes through list in wCurDeckCards, and for each card in it -; creates list in wTempHandCardList of all unique cards +; creates list in wUniqueDeckCardList of all unique cards ; it finds (assuming wCurDeckCards is sorted by ID) -; also counts the number of the different cards +; also counts the total number of the different cards CreateCurDeckUniqueCardList: ; a06e (2:606e) ld b, 0 ld c, $0 ld hl, wCurDeckCards - ld de, wTempHandCardList + ld de, wUniqueDeckCardList .loop ld a, [hli] cp c @@ -5726,15 +5726,15 @@ PrintConfirmationCardList: ; a08a (2:608a) or a jr z, .no_more_cards pop de - xor a - ld [wcecd], a + xor a ; FALSE + ld [wUnableToScrollDown], a ld a, SYM_CURSOR_D jr .got_cursor_tile_2 .no_more_cards pop de - ld a, $01 - ld [wcecd], a + ld a, TRUE + ld [wUnableToScrollDown], a ld a, SYM_SPACE .got_cursor_tile_2 ld b, 19 ; x coord @@ -6147,7 +6147,7 @@ PrintFilteredCardSelectionList: ; a39f (2:639f) pop af call CreateFilteredCardList - ld a, MAX_DECK_CONFIRMATION_VISIBLE_CARDS + ld a, NUM_DECK_CONFIRMATION_VISIBLE_CARDS ld [wNumVisibleCardListEntries], a lb de, 2, 5 ld hl, wCardListCoords @@ -6308,14 +6308,14 @@ PrintCardSelectionList: ; a42d (2:642d) ; draw down cursor because ; there are still more cards ; to be scrolled down - xor a - ld [wcecd], a + xor a ; FALSE + ld [wUnableToScrollDown], a ld a, SYM_CURSOR_D jr .got_cursor_tile_2 .cannot_scroll pop de - ld a, $01 - ld [wcecd], a + ld a, TRUE + ld [wUnableToScrollDown], a ld a, [wCursorAlternateTile] .got_cursor_tile_2 ld b, 19 ; x coord @@ -6714,7 +6714,7 @@ CreateCardSetListAndInitListCoords: ; a6a0 (2:66a0) push af call .GetEntryPrefix call CreateCardSetList - ld a, MAX_CARD_ALBUM_VISIBLE_CARDS + ld a, NUM_CARD_ALBUM_VISIBLE_CARDS ld [wNumVisibleCardListEntries], a lb de, 2, 4 ld hl, wCardListCoords @@ -6853,14 +6853,14 @@ PrintCardSetListEntries: ; a6fa (2:66fa) or a jr z, .no_down_cursor pop de - xor a - ld [wcecd], a + xor a ; FALSE + ld [wUnableToScrollDown], a ld a, SYM_CURSOR_D jr .got_down_cursor_tile .no_down_cursor pop de - ld a, $01 - ld [wcecd], a + ld a, TRUE + ld [wUnableToScrollDown], a ld a, SYM_BOX_BTM_R .got_down_cursor_tile ld b, 19 @@ -7258,7 +7258,7 @@ HandleCardAlbumScreen: ; a913 (2:6913) db 4 ; y pos db 2 ; y spacing db 0 ; x spacing - db MAX_CARD_ALBUM_VISIBLE_CARDS ; num entries + db NUM_CARD_ALBUM_VISIBLE_CARDS ; num entries db SYM_CURSOR_R ; visible cursor tile db SYM_SPACE ; invisible cursor tile dw NULL ; wCardListHandlerFunction @@ -7783,15 +7783,20 @@ Data_adf5: ; adf5 (2:6df5) dw NULL ; wCardListHandlerFunction ; 0xadfe -; hl = ? -; de = deck -Func_adfe: ; adfe (2:6dfe) +; 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 @@ -7799,33 +7804,34 @@ Func_adfe: ; adfe (2:6dfe) ld [wTotalCardCount], a ld hl, wCardFilterCounts ld [hl], a - call .Func_ae21 + call .HandleList ; can skip call and fallthrough instead ret -.Func_ae21 +.HandleList call SortCurDeckCardsByID call CreateCurDeckUniqueCardList xor a ld [wCardListVisibleOffset], a .loop - ld hl, .Data_ae91 + ld hl, .DeckConfirmationCardSelectionParams call InitCardSelectionParams ld a, [wNumUniqueCards] ld [wNumCardListEntries], a cp $05 - jr c, .asm_ae3d + jr c, .got_num_positions ld a, $05 -.asm_ae3d +.got_num_positions ld [wCardListNumCursorPositions], a ld [wNumVisibleCardListEntries], a - call .Func_aeb9 - ld hl, wcfda + call .PrintTitleAndList + ld hl, wCardConfirmationText ld a, [hli] ld h, [hl] ld l, a call DrawWideTextBox_PrintText - ld hl, .Func_ae9a +; set card update function + ld hl, .CardListUpdateFunction ld d, h ld a, l ld hl, wCardListUpdateFunction @@ -7837,13 +7843,14 @@ Func_adfe: ; adfe (2:6dfe) .loop_input call DoFrame call HandleDeckCardSelectionList - jr c, .asm_ae89 + jr c, .selection_made call HandleLeftRightInCardList jr c, .loop_input ldh a, [hDPadHeld] and START jr z, .loop_input -.asm_ae70 + +.open_card_pge ld a, $01 call PlaySFXConfirmOrCancel ld a, [wCardListCursorPos] @@ -7859,13 +7866,13 @@ Func_adfe: ; adfe (2:6dfe) call OpenCardPageFromCardList jr .loop -.asm_ae89 +.selection_made ld a, [hffb3] cp $ff ret z - jr .asm_ae70 + jr .open_card_pge -.Data_ae91 +.DeckConfirmationCardSelectionParams db 0 ; x pos db 3 ; y pos db 2 ; y spacing @@ -7875,13 +7882,13 @@ Func_adfe: ; adfe (2:6dfe) db SYM_SPACE ; invisible cursor tile dw NULL ; wCardListHandlerFunction -.Func_ae9a +.CardListUpdateFunction ld hl, hffb0 ld [hl], $01 - call .Func_aed3 + call .PrintDeckIndexAndName ld de, $10e call InitTextPrinting - ld hl, wcfda + ld hl, wCardConfirmationText ld a, [hli] ld h, [hl] ld l, a @@ -7890,8 +7897,8 @@ Func_adfe: ; adfe (2:6dfe) ld [hl], $00 jp PrintConfirmationCardList -.Func_aeb9 - call .Func_aec9 +.PrintTitleAndList + call .ClearScreenAndPrintDeckTitle lb de, 3, 3 ld hl, wCardListCoords ld [hl], e @@ -7900,16 +7907,18 @@ Func_adfe: ; adfe (2:6dfe) call PrintConfirmationCardList ret -.Func_aec9 +.ClearScreenAndPrintDeckTitle call EmptyScreenAndLoadFontDuelAndHandCardsIcons - call .Func_aed3 + call .PrintDeckIndexAndName call EnableLCD ret -.Func_aed3 +; prints text in the form "X. deck" +; where X is the deck index in the list +.PrintDeckIndexAndName ld a, [wCurDeckName] or a - ret z + ret z ; not a valid deck ld de, $1 call InitTextPrinting ld a, [wCurDeck] @@ -7927,7 +7936,7 @@ Func_adfe: ; adfe (2:6dfe) call CopyListFromHLToDE ld hl, wDefaultText call GetTextLengthInTiles - ld b, $00 + ld b, $0 ld hl, wDefaultText add hl, bc ld d, h @@ -8288,124 +8297,138 @@ Func_b177: ; b177 (2:7177) dw Func_bc7a ; 0xb19d -Func_b19d: ; b19d (2:719d) +HandleDeckSaveMachineMenu: ; b19d (2:719d) xor a ld [wCardListVisibleOffset], a ldtx de, DeckSaveMachineText - ld hl, wd0a2 + ld hl, wDeckMachineTitleText ld [hl], e inc hl ld [hl], d - call Func_b379 - ld a, $3c - ld [wd0a5], a + call ClearScreenAndDrawDeckMachineScreen + ld a, NUM_DECK_SAVE_MACHINE_SLOTS + ld [wNumDeckMachineEntries], a + xor a -.asm_b1b3 - ld hl, Data_b6fb +.wait_input + ld hl, DeckMachineSelectionParams call InitCardSelectionParams - call Func_b704 + call DrawListScrollArrows call PrintNumSavedDecks ldtx hl, PleaseSelectDeckText call DrawWideTextBox_PrintText ldtx de, PleaseSelectDeckText - call Func_b285 - call Func_b29f - jr c, .asm_b1b3 + call InitDeckMachineDrawingParams + call HandleDeckMachineSelection + jr c, .wait_input cp $ff - ret z + ret z ; operation cancelled + ; get the index of selected deck ld b, a ld a, [wCardListVisibleOffset] add b - ld [wd088], a + ld [wSelectedDeckMachineEntry], a + call ResetCheckMenuCursorPositionAndBlink call DrawWideTextBox - ld hl, Unknown_b274 + ld hl, .DeckMachineMenuData call PlaceTextItems -.asm_b1e7 +.wait_input_submenu call DoFrame call HandleCheckMenuInput - jp nc, .asm_b1e7 + jp nc, .wait_input_submenu cp $ff - jr nz, .asm_b1fa - ld a, [wd086] - jp .asm_b1b3 + jr nz, .submenu_option_selected + ; return from submenu + ld a, [wTempDeckMachineCursorPos] + jp .wait_input -.asm_b1fa +.submenu_option_selected ld a, [wCheckMenuCursorYPosition] sla a ld hl, wCheckMenuCursorXPosition add [hl] or a - jr nz, .asm_b22c - call Func_b35b - jr nc, .asm_b216 - call Func_b592 - ld a, [wd086] - jp c, .asm_b1b3 - jr .asm_b25e + jr nz, .ok_1 -.asm_b216 +; 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, [wd086] - jr c, .asm_b1b3 - call Func_b592 - ld a, [wd086] - jp c, .asm_b1b3 - jr .asm_b25e - -.asm_b22c + 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, .asm_b24c - call Func_b35b - jr c, .asm_b240 + jr nz, .ok_2 + +; Delete a Deck + call CheckIfSelectedDeckMachineEntryIsEmpty + jr c, .is_empty call TryDeleteSavedDeck - ld a, [wd086] - jp c, .asm_b1b3 - jr .asm_b25e + ld a, [wTempDeckMachineCursorPos] + jp c, .wait_input + jr .return_to_list -.asm_b240 +.is_empty ld hl, WaitForVBlank call DrawWideTextBox_WaitForInput - ld a, [wd086] - jp .asm_b1b3 + ld a, [wTempDeckMachineCursorPos] + jp .wait_input -.asm_b24c +.ok_2 cp $2 - jr nz, .asm_b273 - call Func_b35b - jr c, .asm_b240 - call Func_b7c6 - ld a, [wd086] - jp nc, .asm_b1b3 - -.asm_b25e - ld a, [wd087] + 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 Func_b379 - call Func_b704 + call ClearScreenAndDrawDeckMachineScreen + call DrawListScrollArrows call PrintNumSavedDecks - ld a, [wd086] - jp .asm_b1b3 + ld a, [wTempDeckMachineCursorPos] + jp .wait_input -.asm_b273 +.cancel ret -Unknown_b274: ; b274 (2:7274) +.DeckMachineMenuData textitem 2, 14, SaveADeckText textitem 12, 14, DeleteADeckText textitem 2, 16, BuildADeckText textitem 12, 16, CancelText db $ff +; 0xb285 -Func_b285: ; b285 (2:7285) - ld a, $05 +; 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, wd0a7 + ld hl, wDeckMachineText ld [hl], e inc hl ld [hl], d - ld hl, Func_b403 + ld hl, DrawDeckMachineScreen ld d, h ld a, l ld hl, wCardListUpdateFunction @@ -8416,36 +8439,44 @@ Func_b285: ; b285 (2:7285) ret ; 0xb29f -Func_b29f: ; b29f (2:729f) +; 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, .asm_b303 - call .Func_b317 - jr c, Func_b29f ; loop back to start + jr c, .selection_made + + call .HandleListJumps + jr c, HandleDeckMachineSelection ; jump back to start ldh a, [hDPadHeld] and START - jr z, Func_b29f ; loop back to start + jr z, HandleDeckMachineSelection ; jump back to start ; start btn ld a, [wCardListVisibleOffset] - ld [wd087], a + ld [wTempCardListVisibleOffset], a ld b, a ld a, [wCardListCursorPos] - ld [wd086], a + 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, $00 + ld b, $0 ld hl, wMachineDeckPtrs add hl, bc ld a, [hli] ld h, [hl] ld l, a push hl - ld bc, $18 + ld bc, DECK_NAME_SIZE add hl, bc ld d, h ld e, l @@ -8454,32 +8485,36 @@ Func_b29f: ; b29f (2:729f) call DisableSRAM pop hl or a - jr z, Func_b29f ; loop back to start + 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, [wd087] + ld a, [wTempCardListVisibleOffset] ld [wCardListVisibleOffset], a - call Func_b379 - call Func_b704 + call ClearScreenAndDrawDeckMachineScreen + call DrawListScrollArrows call PrintNumSavedDecks - ld a, [wd086] + ld a, [wTempDeckMachineCursorPos] ld [wCardListCursorPos], a scf ret -.asm_b303 +.selection_made call DrawListCursor_Visible ld a, [wCardListVisibleOffset] - ld [wd087], a + ld [wTempCardListVisibleOffset], a ld a, [wCardListCursorPos] - ld [wd086], a + ld [wTempDeckMachineCursorPos], a ld a, [hffb3] or a ret -.Func_b317 +; 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] @@ -8492,60 +8527,64 @@ Func_b29f: ; b29f (2:729f) .d_right ld a, [wCardListVisibleOffset] - add $05 + add NUM_DECK_MACHINE_SLOTS ld b, a - add $05 - ld hl, wd0a5 + add NUM_DECK_MACHINE_SLOTS + ld hl, wNumDeckMachineEntries cp [hl] - jr c, .asm_b347 - ld a, [wd0a5] - sub $05 + jr c, .got_new_pos + ld a, [wNumDeckMachineEntries] + sub NUM_DECK_MACHINE_SLOTS ld b, a - jr .asm_b347 + jr .got_new_pos .d_left ld a, [wCardListVisibleOffset] - sub $05 + sub NUM_DECK_MACHINE_SLOTS ld b, a - jr nc, .asm_b347 - ld b, $00 + jr nc, .got_new_pos + ld b, 0 ; first entry -.asm_b347 +.got_new_pos ld a, b ld [wCardListVisibleOffset], a cp c - jr z, .asm_b359 + jr z, .set_carry + ; play SFX if jump was made + ; and update UI ld a, SFX_01 call PlaySFX - call Func_b403 + call DrawDeckMachineScreen call PrintNumSavedDecks -.asm_b359 +.set_carry scf ret ; 0xb35b -Func_b35b: ; b35b (2:735b) - ld a, [wd088] +; 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, $00 + ld h, $0 ld bc, wMachineDeckPtrs add hl, bc ld a, [hli] ld h, [hl] ld l, a - ld bc, $18 + ld bc, DECK_NAME_SIZE add hl, bc call EnableSRAM ld a, [hl] call DisableSRAM or a - ret nz + ret nz ; is valid scf - ret + ret; is empty ; 0xb379 -Func_b379: ; b379 (2:7379) +ClearScreenAndDrawDeckMachineScreen: ; b379 (2:7379) call Set_OBJ_8x8 xor a ld [wTileMapFill], a @@ -8561,18 +8600,19 @@ Func_b379: ; b379 (2:7379) lb de, 0, 0 lb bc, 20, 13 call DrawRegularTextBox - call Func_b3b3 + call SetDeckMachineTitleText call GetSavedDeckPointers - call Func_b3e5 + call PrintVisibleDeckMachineEntries call GetSavedDeckCount call EnableLCD ret ; 0xb3b3 -Func_b3b3: ; b3b3 (2:73b3) +; prints wDeckMachineTitleText as title text +SetDeckMachineTitleText: ; b3b3 (2:73b3) lb de, 1, 0 call InitTextPrinting - ld hl, wd0a2 + ld hl, wDeckMachineTitleText ld a, [hli] ld h, [hl] ld l, a @@ -8605,50 +8645,57 @@ GetSavedDeckPointers: ; b3c3 (2:73c3) ret ; 0xb3e5 -Func_b3e5: ; b3e5 (2:73e5) +; 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] - ld de, $202 - ld b, $05 -.asm_b3ed + lb de, 2, 2 + ld b, NUM_DECK_MACHINE_VISIBLE_DECKS +.loop push af push bc push de - call Func_b424 + call PrintDeckMachineEntry pop de pop bc pop af - ret c + ret c ; jump never made? dec b - ret z + ret z ; no more entries inc a inc e inc e - jr .asm_b3ed + jr .loop ; 0xb3fe -Func_b3fe: ; b3fe (2:73fe) - call Func_b704 - jr Func_b3e5 +UpdateDeckMachineScrollArrowsAndEntries: ; b3fe (2:73fe) + call DrawListScrollArrows + jr PrintVisibleDeckMachineEntries ; 0xb403 -Func_b403: ; b403 (2:7403) - call Func_b704 +DrawDeckMachineScreen: ; b403 (2:7403) + call DrawListScrollArrows ld hl, hffb0 ld [hl], $01 - call Func_b3b3 + call SetDeckMachineTitleText lb de, 1, 14 call InitTextPrinting - ld hl, wd0a7 + ld hl, wDeckMachineText ld a, [hli] ld h, [hl] ld l, a call ProcessTextFromID ld hl, hffb0 ld [hl], $00 - jr Func_b3e5 + jr PrintVisibleDeckMachineEntries ; 0xb424 -Func_b424: ; b424 (2:7424) +; 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 @@ -8661,10 +8708,13 @@ Func_b424: ; b424 (2:7424) 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, $00 + ld h, $0 ld bc, wMachineDeckPtrs add hl, bc ld a, [hli] @@ -8687,7 +8737,7 @@ Func_b424: ; b424 (2:7424) ld d, 13 inc e call InitTextPrinting - ld hl, Text_b4d4 + ld hl, .text call ProcessText scf ret @@ -8697,34 +8747,39 @@ Func_b424: ; b424 (2:7424) push bc ld d, 18 call InitTextPrinting - ld a, $0 + +; print the symbol hat 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, .asm_b482 - lb de, 3, "FW3_○" + jr c, .cannot_build + lb de, 3, "FW3_○" ; can build jr .asm_b4c2 - -.asm_b482 +.cannot_build push bc ld a, ALL_DECKS call CheckIfCanBuildSavedDeck - jr c, .asm_b490 + jr c, .cannot_build_at_all pop bc - lb de, 3, "FW3_❄" + lb de, 3, "FW3_❄" ; can build by dismantling jr .asm_b4c2 -.asm_b490 - lb de, 0, "FW0_✕" +.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 Func_b4e1 + call .GetNumCardsMissingToBuildDeck call CalculateOnesAndTensDigits ld hl, wOnesAndTensPlace ld a, [hli] @@ -8750,13 +8805,12 @@ Func_b424: ; b424 (2:7424) ld d, 13 inc e call InitTextPrinting - ld hl, Text_b4d4 + ld hl, .text call ProcessText or a ret -; 0xb4d4 -Text_b4d4: ; b4d4 (2:74d4) +.text db TX_SYMBOL, TX_END db TX_SYMBOL, TX_END db TX_SYMBOL, TX_END @@ -8764,14 +8818,18 @@ Text_b4d4: ; b4d4 (2:74d4) db TX_SYMBOL, TX_END db TX_SYMBOL, TX_END done -; 0xb4e1 -Func_b4e1: ; b4e1 (2:74e1) +; 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 @@ -8780,34 +8838,35 @@ Func_b4e1: ; b4e1 (2:74e1) ld a, [hli] ld h, [hl] ld l, a - ld bc, $18 + ld bc, DECK_NAME_SIZE add hl, bc + call EnableSRAM ld de, wTempCardCollection - ld bc, $0 -.asm_b505 + lb bc, 0, 0 +.loop inc b ld a, DECK_SIZE cp b - jr c, .asm_b520 + jr c, .done ld a, [hli] push hl ld l, a ld h, $00 add hl, de ld a, [hl] - and $7f + and CARD_COUNT_MASK or a - jr z, .asm_b51c + jr z, .none dec a ld [hl], a pop hl - jr .asm_b505 -.asm_b51c + jr .loop +.none inc c pop hl - jr .asm_b505 -.asm_b520 + jr .loop +.done ld a, c call DisableSRAM ret @@ -8859,43 +8918,53 @@ PrintNumSavedDecks: ; b545 (2:7545) INCROM $b568, $b592 -Func_b592: ; b592 (2:7592) - ld a, $ff +; 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 -.asm_b598 +.wait_input ld hl, DeckMachineMenuParameters call InitializeMenuParameters ldtx hl, ChooseADeckToSaveText call DrawWideTextBox_PrintText -.loop_input +.wait_submenu_input call DoFrame call HandleStartButtonInDeckSelectionMenu - jr c, .asm_b598 + jr c, .wait_input call HandleMenuInput - jp nc, .loop_input ; can be jr + jp nc, .wait_submenu_input ; can be jr ldh a, [hCurMenuItem] cp $ff - ret z + ret z ; operation cancelled ld [wCurDeck], a call CheckIfCurDeckIsValid - jp nc, .Func_b5c8 + jp nc, .SaveDeckInSelectedEntry ; can be jr + ; is an empty deck call PrintThereIsNoDeckHereText ld a, [wCurDeck] - jr .asm_b598 + jr .wait_input -.Func_b5c8 +; 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 Func_b379 - call Func_b704 + + call ClearScreenAndDrawDeckMachineScreen + call DrawListScrollArrows call PrintNumSavedDecks - ld a, [wd086] - ld hl, Data_b6fb + ld a, [wTempDeckMachineCursorPos] + ld hl, DeckMachineSelectionParams call InitCardSelectionParams call DrawListCursor_Visible call GetPointerToDeckName @@ -8921,11 +8990,11 @@ DeckMachineMenuParameters: ; b609 (2:7609) ; 0xb611 ; outputs in de pointer of saved deck -; corresponding to index in wd088 +; corresponding to index in wSelectedDeckMachineEntry GetSelectedSavedDeckPtr: ; b611 (2:7611) push af push hl - ld a, [wd088] + ld a, [wSelectedDeckMachineEntry] sla a ld e, a ld d, $00 @@ -9119,7 +9188,7 @@ TryDeleteSavedDeck: ; b6ca (2:76ca) ret ; 0xb6fb -Data_b6fb: ; b6fb (2:76fb) +DeckMachineSelectionParams: ; b6fb (2:76fb) db 1 ; x pos db 2 ; y pos db 2 ; y spacing @@ -9129,31 +9198,31 @@ Data_b6fb: ; b6fb (2:76fb) db SYM_SPACE ; invisible cursor tile dw NULL ; wCardListHandlerFunction -Func_b704: ; b704 (2:7704) +DrawListScrollArrows: ; b704 (2:7704) ld a, [wCardListVisibleOffset] or a - jr z, .asm_b70e + jr z, .no_up_cursor ld a, SYM_CURSOR_U jr .got_tile_1 -.asm_b70e +.no_up_cursor ld a, SYM_BOX_RIGHT .got_tile_1 lb bc, 19, 1 call WriteByteToBGMap0 ld a, [wCardListVisibleOffset] - add $06 + add NUM_DECK_MACHINE_VISIBLE_DECKS + 1 ld b, a - ld a, [wd0a5] + ld a, [wNumDeckMachineEntries] cp b - jr c, .asm_b72a - xor a - ld [wcecd], a + jr c, .no_down_cursor + xor a ; FALSE + ld [wUnableToScrollDown], a ld a, SYM_CURSOR_D jr .got_tile_2 -.asm_b72a - ld a, $01 - ld [wcecd], a +.no_down_cursor + ld a, TRUE + ld [wUnableToScrollDown], a ld a, SYM_BOX_RIGHT .got_tile_2 lb bc, 19, 11 @@ -9161,11 +9230,13 @@ Func_b704: ; b704 (2:7704) ret ; 0xb738 -Func_b738: ; b738 (2:7738) +; 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, $ff + ld a, ALL_DECKS call DrawDecksScreen xor a .init_menu_params @@ -9181,12 +9252,13 @@ Func_b738: ; b738 (2:7738) jp nc, .loop_input ; can be jr ldh a, [hCurMenuItem] cp $ff - jr nz, .asm_b76c + jr nz, .selected_deck + ; operation was cancelled call SafelySwitchToTempSRAMBank scf ret -.asm_b76c +.selected_deck ld [wCurDeck], a ldtx hl, DismantleThisDeckText call YesOrNoMenuWithText @@ -9197,26 +9269,28 @@ Func_b738: ; b738 (2:7738) .dismantle call GetPointerToDeckName push hl - ld de, wd089 + ld de, wDismantledDeckName call EnableSRAM call CopyListFromHLToDE pop hl push hl - ld bc, $18 + ld bc, DECK_NAME_SIZE add hl, bc call AddDeckToCollection pop hl ld a, DECK_STRUCT_SIZE call ClearNBytesFromHL call DisableSRAM - ld a, $ff + + ; redraw deck screen + ld a, ALL_DECKS call DrawDecksScreen ld a, [wCurDeck] ld hl, DeckMachineMenuParameters call InitializeMenuParameters call DrawCursor2 call SafelySwitchToTempSRAMBank - ld hl, wd089 + ld hl, wDismantledDeckName call CopyDeckName xor a ld [wTxRam2 + 0], a @@ -9227,79 +9301,92 @@ Func_b738: ; b738 (2:7738) ret ; 0xb7c6 -Func_b7c6: ; b7c6 (2:77c6) - ld a, [wd088] +; 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, .asm_b7f3 + jr nc, .build_deck ld a, ALL_DECKS call CheckIfCanBuildSavedDeck - jr c, .asm_b7ea + jr c, .do_not_own_all_cards_needed + ; can only be built by dismantling some deck ldtx hl, ThisDeckCanOnlyBeBuiltIfYouDismantleText call DrawWideTextBox_WaitForInput - call Func_b87d - jr nc, .asm_b7f3 + call .DismantleDecksNeededToBuild + jr nc, .build_deck + ; player chose not to dismantle -.asm_b7e5 +.set_carry_and_return ld a, [wCardListCursorPos] scf ret -.asm_b7ea +.do_not_own_all_cards_needed ldtx hl, YouDoNotOwnAllCardsNeededToBuildThisDeckText call DrawWideTextBox_WaitForInput - jp Func_b8f4 + jp .ShowMissingCardList -.asm_b7f3 +.build_deck call EnableSRAM call SafelySwitchToSRAM0 call FindFirstEmptyDeckSlot call SafelySwitchToTempSRAMBank call DisableSRAM - jr nc, .asm_b80b - call Func_b738 - jr nc, .asm_b80b + jr nc, .got_deck_slot + call HandleDismantleDeckToMakeSpace + jr nc, .got_deck_slot scf ret -.asm_b80b - ld [wd08a + $17], a - ld a, [wd088] +.got_deck_slot + ld [wDeckSlotForNewDeck], a + ld a, [wSelectedDeckMachineEntry] ld c, a - ld b, $00 + ld b, $0 sla c ld hl, wMachineDeckPtrs add hl, bc ld a, [hli] ld h, [hl] ld l, a - ld de, wc000 + + ; copy deck to buffer + ld de, wDeckToBuild ld b, DECK_STRUCT_SIZE call EnableSRAM call CopyNBytesFromHLToDE - ld hl, wc000 + $18 + ; remove the needed cards from collection + ld hl, wDeckToBuild + DECK_NAME_SIZE call SafelySwitchToSRAM0 call DecrementDeckCardsInCollection - ld a, [wd08a + $17] + + ; 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, sDeck1Name + ld bc, sBuiltDecks add hl, bc ld d, h ld e, l - ld hl, wc000 + ld hl, wDeckToBuild ld b, DECK_STRUCT_SIZE call CopyNBytesFromHLToDE call DisableSRAM - ld a, $ff + ; draw Decks screen + ld a, ALL_DECKS call DrawDecksScreen - ld a, [wd08a + $17] + ld a, [wDeckSlotForNewDeck] ld [wCurDeck], a ld hl, DeckMachineMenuParameters call InitializeMenuParameters @@ -9309,7 +9396,6 @@ Func_b7c6: ; b7c6 (2:77c6) call CopyDeckName call DisableSRAM call SafelySwitchToTempSRAMBank - xor a ld [wTxRam2 + 0], a ld [wTxRam2 + 1], a @@ -9317,10 +9403,15 @@ Func_b7c6: ; b7c6 (2:77c6) call DrawWideTextBox_WaitForInput scf ret -; 0xb87d -Func_b87d: ; b87d (2:787d) - farcall Func_1ba9a +; 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 @@ -9333,32 +9424,33 @@ Func_b87d: ; b87d (2:787d) .yes call EnableSRAM - ld a, [wd0a6] - bit 0, a - jr z, .asm_b8a3 - ld a, $00 - call .Func_b8db -.asm_b8a3 - ld a, [wd0a6] - bit 1, a - jr z, .asm_b8af - ld a, $01 - call .Func_b8db -.asm_b8af - ld a, [wd0a6] - bit 2, a - jr z, .asm_b8bb - ld a, $02 - call .Func_b8db -.asm_b8bb - ld a, [wd0a6] - bit 3, a - jr z, .asm_b8c7 - ld a, $03 - call .Func_b8db -.asm_b8c7 + 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, [wd0a6] + ld a, [wDecksToBeDismantled] call DrawDecksScreen call SafelySwitchToTempSRAMBank ldtx hl, DismantledTheDeckText @@ -9366,27 +9458,33 @@ Func_b87d: ; b87d (2:787d) or a ret -.Func_b8db +; 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, sDeck1Name + ld bc, sBuiltDecks add hl, bc push hl - ld bc, $18 + ld bc, DECK_NAME_SIZE add hl, bc call AddDeckToCollection pop hl ld a, DECK_STRUCT_SIZE call ClearNBytesFromHL ret -; 0xb8f4 -Func_b8f4: ; b8f4 (2:78f4) - ld a, [wd088] +; 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, $18 + ld hl, DECK_NAME_SIZE add hl, de ld de, wCurDeckCards ld b, DECK_SIZE @@ -9397,92 +9495,122 @@ Func_b8f4: ; b8f4 (2:78f4) 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 - ld hl, wTempHandCardList + +; creates list in wFilteredCardList with +; cards that are missing to build this deck + ld hl, wUniqueDeckCardList ld de, wFilteredCardList -.asm_b92a +.loop_deck_configuration ld a, [hli] or a - jr z, .asm_b946 + jr z, .finish_missing_card_list ld b, a push bc push de push hl ld hl, wCurDeckCards - call Func_b960 + call .CheckIfCardIsMissing pop hl pop de pop bc - jr nc, .asm_b92a + 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 -.asm_b93f +.loop_number_missing ld [de], a inc de dec c - jr nz, .asm_b93f - jr .asm_b92a -.asm_b946 - xor a + 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, wcfda + 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 Func_adfe - jp Func_b7c6.asm_b7e5 -; 0xb960 - -Func_b960: ; b960 (2:7960) - call .Func_b976 - ld hl, wc000 + 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 .Func_b986 + call .GetCardCountFromCollection ld a, e pop de + + ; d = card count in deck + ; a = card count in collection cp d - jr c, .asm_b971 + jr c, .not_enough or a ret -.asm_b971 + +.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 -.Func_b976 +; 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, $00 -.loop + ld d, 0 +.loop_deck_cards ld a, [hli] or a - jr z, .asm_b984 + jr z, .done_deck_cards cp e - jr nz, .loop + jr nz, .loop_deck_cards inc d - jr .loop -.asm_b984 + jr .loop_deck_cards +.done_deck_cards pop af ret -.Func_b986 +; 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, $00 + ld d, $0 add hl, de ld a, [hl] - and $7f + and CARD_COUNT_MASK ld e, a pop af ret @@ -9491,22 +9619,22 @@ Func_b960: ; b960 (2:7960) PrinterMenu_DeckConfiguration: ; b991 (2:7991) xor a ld [wCardListVisibleOffset], a - call Func_b379 + call ClearScreenAndDrawDeckMachineScreen ld a, DECK_SIZE - ld [wd0a5], a + ld [wNumDeckMachineEntries], a xor a .asm_b99e - ld hl, Data_b6fb + ld hl, DeckMachineSelectionParams call InitCardSelectionParams - call Func_b704 + call DrawListScrollArrows call PrintNumSavedDecks - ld hl, WaitForVBlank.lcd_off + ldtx hl, PleaseChooseDeckConfigurationToPrintText call DrawWideTextBox_PrintText - ld de, WaitForVBlank.lcd_off - call Func_b285 + ldtx de, PleaseChooseDeckConfigurationToPrintText + call InitDeckMachineDrawingParams .asm_b9b6 - call Func_b29f + call HandleDeckMachineSelection jr c, .asm_b99e cp $ff ret z @@ -9514,8 +9642,8 @@ PrinterMenu_DeckConfiguration: ; b991 (2:7991) ld b, a ld a, [wCardListVisibleOffset] add b - ld [wd088], a - call Func_b35b + ld [wSelectedDeckMachineEntry], a + call CheckIfSelectedDeckMachineEntryIsEmpty jr c, .asm_b9b6 call DrawWideTextBox ldtx hl, PrintThisDeckText @@ -9532,24 +9660,24 @@ PrinterMenu_DeckConfiguration: ; b991 (2:7991) xor a ; terminator byte for deck ld [wCurDeckCards + DECK_SIZE], a call SortCurDeckCardsByID - ld a, [wd088] + ld a, [wSelectedDeckMachineEntry] bank1call Func_7580 - call Func_b379 + call ClearScreenAndDrawDeckMachineScreen .no - ld a, [wd086] + ld a, [wTempDeckMachineCursorPos] ld [wCardListCursorPos], a jp .asm_b99e ; 0xba04 -Func_ba04: ; ba04 (2:7a04) - ld a, [wd0a9] - ld hl, Data_bb83 +HandleAutoDeckMenu: ; ba04 (2:7a04) + ld a, [wCurAutoDeckMachine] + ld hl, .DeckMachineTitleTextList sla a ld c, a ld b, $0 add hl, bc - ld de, wd0a2 + ld de, wDeckMachineTitleText ld a, [hli] ld [de], a inc de @@ -9557,42 +9685,45 @@ Func_ba04: ; ba04 (2:7a04) ld [de], a xor a ld [wCardListVisibleOffset], a - call Func_bb97 - ld a, $5 - ld [wd0a5], a + call .InitAutoDeckMenu + ld a, NUM_DECK_MACHINE_SLOTS + ld [wNumDeckMachineEntries], a xor a - ; fallthrough -Func_ba25: ; ba25 (2:7a25) +.please_select_deck ld hl, .MenuParameters call InitializeMenuParameters ldtx hl, PleaseSelectDeckText call DrawWideTextBox_PrintText - ld a, $5 + ld a, NUM_DECK_MACHINE_SLOTS ld [wCardListNumCursorPositions], a - ld hl, Func_b3fe + ld hl, UpdateDeckMachineScrollArrowsAndEntries ld d, h ld a, l ld hl, wCardListUpdateFunction ld [hli], a ld [hl], d -.asm_ba40 +.wait_input call DoFrame call HandleMenuInput - jr c, .asm_baa3 + 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, .asm_ba40 + jr z, .wait_input + ld a, [wCardListVisibleOffset] - ld [wd087], a + ld [wTempCardListVisibleOffset], a ld b, a ld a, [wCurMenuItem] - ld [wd086], a + ld [wTempDeckMachineCursorPos], a add b ld c, a inc a @@ -9607,7 +9738,7 @@ Func_ba25: ; ba25 (2:7a25) ld h, [hl] ld l, a push hl - ld bc, $18 + ld bc, DECK_NAME_SIZE add hl, bc ld d, h ld e, l @@ -9615,75 +9746,80 @@ Func_ba25: ; ba25 (2:7a25) pop hl call SafelySwitchToSRAM0 or a - jr z, .asm_ba40 + jr z, .wait_input ; invalid deck + + ; show confirmation list ld a, $1 call PlaySFXConfirmOrCancel call SafelySwitchToSRAM1 call OpenDeckConfirmationMenu call SafelySwitchToSRAM0 - ld a, [wd087] + ld a, [wTempCardListVisibleOffset] ld [wCardListVisibleOffset], a - call Func_bb97 - ld a, [wd086] - jp Func_ba25 + call .InitAutoDeckMenu + ld a, [wTempDeckMachineCursorPos] + jp .please_select_deck -.asm_baa3 +.deck_selection_made call DrawCursor2 ld a, [wCardListVisibleOffset] - ld [wd087], a + ld [wTempCardListVisibleOffset], a ld a, [wCurMenuItem] - ld [wd086], a + ld [wTempDeckMachineCursorPos], a ldh a, [hCurMenuItem] cp $ff - jp z, .asm_bb0d - ld [wd088], a + jp z, .exit ; operation cancelled + ld [wSelectedDeckMachineEntry], a call ResetCheckMenuCursorPositionAndBlink xor a ld [wce5e], a call DrawWideTextBox - ld hl, Data_bb76 + ld hl, .DeckMachineMenuData call PlaceTextItems -.asm_bacc +.wait_submenu_input call DoFrame call HandleCheckMenuInput_YourOrOppPlayArea - jp nc, .asm_bacc + jp nc, .wait_submenu_input cp $ff - jr nz, .asm_badf - ld a, [wd086] - jp Func_ba25 + jr nz, .submenu_option_selected + ld a, [wTempDeckMachineCursorPos] + jp .please_select_deck -.asm_badf +.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 Func_b7c6 + call TryBuildDeckMachineDeck call SafelySwitchToSRAM0 - ld a, [wd086] - jp nc, Func_ba25 - ld a, [wd087] + ld a, [wTempDeckMachineCursorPos] + jp nc, .please_select_deck + ld a, [wTempCardListVisibleOffset] ld [wCardListVisibleOffset], a - call Func_bb97 - ld a, [wd086] - jp Func_ba25 + call .InitAutoDeckMenu + ld a, [wTempDeckMachineCursorPos] + jp .please_select_deck .asm_bb09 cp $1 - jr nz, .asm_bb12 -.asm_bb0d + jr nz, .read_the_instructions +.exit xor a ld [wTempBankSRAM], a ret -.asm_bb12 +.read_the_instructions +; show card confirmation list ld a, [wCardListVisibleOffset] - ld [wd087], a + ld [wTempCardListVisibleOffset], a ld b, a ld a, [wCurMenuItem] - ld [wd086], a + ld [wTempDeckMachineCursorPos], a add b ld c, a ld [wCurDeck], a @@ -9691,22 +9827,25 @@ Func_ba25: ; ba25 (2:7a25) ld b, $0 ld hl, wMachineDeckPtrs add hl, bc + + ; set the description text in text box push hl - ld hl, wd0aa + ld hl, wAutoDeckMachineTextDescriptions add hl, bc - ld bc, wcfda + 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, $18 + ld bc, DECK_NAME_SIZE add hl, bc ld d, h ld e, l @@ -9714,18 +9853,20 @@ Func_ba25: ; ba25 (2:7a25) pop hl call SafelySwitchToSRAM0 or a - jp z, .asm_ba40 + jp z, .wait_input ; invalid deck + + ; show confirmation list ld a, $1 call PlaySFXConfirmOrCancel call SafelySwitchToSRAM1 xor a - call Func_adfe + call HandleDeckMissingCardsList call SafelySwitchToSRAM0 - ld a, [wd087] + ld a, [wTempCardListVisibleOffset] ld [wCardListVisibleOffset], a - call Func_bb97 - ld a, [wd086] - jp Func_ba25 + call .InitAutoDeckMenu + ld a, [wTempDeckMachineCursorPos] + jp .please_select_deck .MenuParameters db 1, 2 ; cursor x, cursor y @@ -9734,15 +9875,14 @@ Func_ba25: ; ba25 (2:7a25) db SYM_CURSOR_R ; cursor tile number db SYM_SPACE ; tile behind cursor dw NULL ; function pointer if non-0 -; 0xbb76 -Data_bb76: ; bb76 (2:7b76) +.DeckMachineMenuData textitem 2, 14, BuildADeckText textitem 12, 14, CancelText textitem 2, 16, ReadTheInstructionsText db $ff -Data_bb83: ; bb83 (2:7b83) +.DeckMachineTitleTextList tx FightingMachineText tx RockMachineText tx WaterMachineText @@ -9754,7 +9894,10 @@ Data_bb83: ; bb83 (2:7b83) tx AutoMachineText tx LegendaryMachineText -Func_bb97: ; bb97 (2:7b97) +; 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 @@ -9772,26 +9915,27 @@ Func_bb97: ; bb97 (2:7b97) call DrawRegularTextBox ld de, $100 call InitTextPrinting - ld hl, wd0a2 + ld hl, wDeckMachineTitleText ld a, [hli] ld h, [hl] ld l, a call ProcessTextFromID call SafelySwitchToSRAM1 - farcall Func_1ba14 - call Func_bbe4 - call Func_b3e5 + farcall ReadAutoDeckConfiguration + call .CreateAutoDeckPointerList + call PrintVisibleDeckMachineEntries call SafelySwitchToSRAM0 call EnableLCD ret -; 0xbbe4 -Func_bbe4: ; bbe4 (2:7be4) +; 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, sSavedDecks + ld hl, sAutoDecks ld bc, DECK_STRUCT_SIZE ld a, NUM_DECK_MACHINE_SLOTS .loop @@ -9813,25 +9957,25 @@ Func_bc04: ; bc04 (2:7c04) xor a ld [wCardListVisibleOffset], a ldtx de, DeckSaveMachineText - ld hl, wd0a2 + ld hl, wDeckMachineTitleText ld [hl], e inc hl ld [hl], d - call Func_b379 + call ClearScreenAndDrawDeckMachineScreen ld a, DECK_SIZE - ld [wd0a5], a + ld [wNumDeckMachineEntries], a xor a .asm_bc1a - ld hl, Data_b6fb + ld hl, DeckMachineSelectionParams call InitCardSelectionParams - call Func_b704 + call DrawListScrollArrows call PrintNumSavedDecks ldtx hl, PleaseChooseADeckConfigurationToSendText call DrawWideTextBox_PrintText ldtx de, PleaseChooseADeckConfigurationToSendText - call Func_b285 + call InitDeckMachineDrawingParams .asm_bc32 - call Func_b29f + call HandleDeckMachineSelection jr c, .asm_bc1a cp $ff jr nz, .asm_bc3f @@ -9842,8 +9986,8 @@ Func_bc04: ; bc04 (2:7c04) ld b, a ld a, [wCardListVisibleOffset] add b - ld [wd088], a - call Func_b35b + ld [wSelectedDeckMachineEntry], a + call CheckIfSelectedDeckMachineEntryIsEmpty jr c, .asm_bc32 call GetSelectedSavedDeckPtr @@ -9875,24 +10019,24 @@ Func_bc7a: ; bc7a (2:7c7a) xor a ld [wCardListVisibleOffset], a ldtx de, DeckSaveMachineText - ld hl, wd0a2 + ld hl, wDeckMachineTitleText ld [hl], e inc hl ld [hl], d - call Func_b379 + call ClearScreenAndDrawDeckMachineScreen ld a, DECK_SIZE - ld [wd0a5], a + ld [wNumDeckMachineEntries], a xor a .asm_bc90 - ld hl, Data_b6fb + ld hl, DeckMachineSelectionParams call InitCardSelectionParams - call Func_b704 + call DrawListScrollArrows call PrintNumSavedDecks ldtx hl, PleaseChooseASaveSlotText call DrawWideTextBox_PrintText ldtx de, PleaseChooseASaveSlotText - call Func_b285 - call Func_b29f + call InitDeckMachineDrawingParams + call HandleDeckMachineSelection jr c, .asm_bc90 cp $ff jr nz, .asm_bcb5 @@ -9903,8 +10047,8 @@ Func_bc7a: ; bc7a (2:7c7a) ld b, a ld a, [wCardListVisibleOffset] add b - ld [wd088], a - call Func_b35b + ld [wSelectedDeckMachineEntry], a + call CheckIfSelectedDeckMachineEntryIsEmpty jr nc, .asm_bcc4 jr .asm_bcd1 .asm_bcc4 @@ -9926,11 +10070,11 @@ Func_bc7a: ; bc7a (2:7c7a) call CopyNBytesFromHLToDE call DisableSRAM call SaveGame - call Func_b379 + call ClearScreenAndDrawDeckMachineScreen ld a, [wCardListCursorPos] - ld hl, Data_b6fb + ld hl, DeckMachineSelectionParams call InitCardSelectionParams - call Func_b704 + call DrawListScrollArrows call PrintNumSavedDecks call DrawListCursor_Visible ld hl, wNameBuffer diff --git a/src/engine/bank03.asm b/src/engine/bank03.asm index 5a9b86f..75e3081 100644 --- a/src/engine/bank03.asm +++ b/src/engine/bank03.asm @@ -3124,11 +3124,11 @@ ScriptCommand_OpenDeckMachine: ; d336 (3:5336) or a jr z, .asm_d360 dec a - ld [wd0a9], a - farcall Func_ba04 + ld [wCurAutoDeckMachine], a + farcall HandleAutoDeckMenu jr .asm_d364 .asm_d360 - farcall Func_b19d + farcall HandleDeckSaveMachineMenu .asm_d364 call ResumeSong call Func_c2d4 diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm index 89d7093..467af8c 100644 --- a/src/engine/bank06.asm +++ b/src/engine/bank06.asm @@ -4925,28 +4925,32 @@ KeyboardData_Deck: ; 1b019 (6:7019) db $0e, $12, $02 db $10, $0f, $01 -; unknown data. -; needs analyze. -; (6:70d6) - INCROM $1b0d6, $1ba14 + ds 4 ; empty -Func_1ba14: ; 1ba14 (6:7a14) +INCLUDE "data/auto_deck_card_lists.asm" +INCLUDE "data/auto_deck_machines.asm" + +; writes to sAutoDecks all the deck configurations +; from the Auto Deck Machine in wCurAutoDeckMachine +ReadAutoDeckConfiguration: ; 1ba14 (6:7a14) call EnableSRAM - ld a, [wd0a9] + ld a, [wCurAutoDeckMachine] ld l, a - ld h, $1e + ld h, 6 * NUM_DECK_MACHINE_SLOTS call HtimesL - ld bc, $78e8 + ld bc, AutoDeckMachineEntries add hl, bc - ld b, $00 -.asm_7a26 - call Func_1ba4c - call Func_1ba5b - call Func_1ba7d + ld b, 0 +.loop_decks + call .GetPointerToSRAMAutoDeck + call .ReadDeckConfiguration + call .ReadDeckName + + ; store deck description text ID push hl - ld de, wd0aa + ld de, wAutoDeckMachineTextDescriptions ld h, b - ld l, $02 + ld l, 2 call HtimesL add hl, de ld d, h @@ -4959,24 +4963,27 @@ Func_1ba14: ; 1ba14 (6:7a14) ld [de], a inc b ld a, b - cp $05 - jr nz, .asm_7a26 + cp NUM_DECK_MACHINE_SLOTS + jr nz, .loop_decks call DisableSRAM ret -Func_1ba4c: ; 1ba4c (6:7a4c) +; outputs in de the saved deck with index b +.GetPointerToSRAMAutoDeck push hl ld l, b ld h, DECK_STRUCT_SIZE call HtimesL - ld de, sSavedDecks + ld de, sAutoDecks add hl, de ld d, h ld e, l pop hl ret -Func_1ba5b: ; 1ba5b (6:7a5b) +; writes the deck configuration in SRAM +; by reading the given deck card list +.ReadDeckConfiguration push hl push bc push de @@ -4985,24 +4992,24 @@ Func_1ba5b: ; 1ba5b (6:7a5b) inc hl ld d, [hl] pop hl - ld bc, $0018 + ld bc, DECK_NAME_SIZE add hl, bc -.asm_7a67 +.loop_create_deck ld a, [de] inc de - ld b, a + ld b, a ; card count or a - jr z, .asm_7a77 + jr z, .done_create_deck ld a, [de] inc de - ld c, a -.asm_7a70 + ld c, a ; card ID +.loop_card_count ld [hl], c inc hl dec b - jr nz, .asm_7a70 - jr .asm_7a67 -.asm_7a77 + jr nz, .loop_card_count + jr .loop_create_deck +.done_create_deck pop de pop bc pop hl @@ -5010,87 +5017,104 @@ Func_1ba5b: ; 1ba5b (6:7a5b) inc hl ret -Func_1ba7d: ; 1ba7d (6:7a7d) +.ReadDeckName push hl push bc push de ld a, [hli] ld h, [hl] ld l, a - ld de, wd089 + ld de, wDismantledDeckName call CopyText pop hl - ld de, wd089 -.asm_7a8d + ld de, wDismantledDeckName +.loop_copy_name ld a, [de] ld [hli], a or a - jr z, .asm_7a95 + jr z, .done_copy_name inc de - jr .asm_7a8d -.asm_7a95 + jr .loop_copy_name +.done_copy_name pop bc pop hl inc hl inc hl ret -; farcall from 0xb87e(2:787d): [EF|06|9A|7A] -Func_1ba9a: ; 1ba9a (6:7a9a) +; tries out all combinations of dismantling the player's decks +; in order to build the deck in wSelectedDeckMachineEntry +; if none of the combinations work, return carry set +; otherwise, return in a which deck flags should be dismantled +CheckWhichDecksToDismantleToBuildSavedDeck: ; 1ba9a (6:7a9a) xor a - ld [wd0a6], a - ld a, $01 -.asm_7aa0 - call Func_1bae4 + ld [wDecksToBeDismantled], a + +; first check if it can be built by +; only dismantling a single deck + ld a, DECK_1 +.loop_single_built_decks + call .CheckIfCanBuild ret nc - sla a - cp $10 - jr z, .asm_7aac - jr .asm_7aa0 -.asm_7aac - ld a, $03 - call Func_1bae4 + sla a ; next deck + cp (1 << NUM_DECKS) + jr z, .two_deck_combinations + jr .loop_single_built_decks + +.two_deck_combinations +; next check all two deck combinations + ld a, DECK_1 | DECK_2 + call .CheckIfCanBuild ret nc - ld a, $05 - call Func_1bae4 + ld a, DECK_1 | DECK_3 + call .CheckIfCanBuild ret nc - ld a, $09 - call Func_1bae4 + ld a, DECK_1 | DECK_4 + call .CheckIfCanBuild ret nc - ld a, $06 - call Func_1bae4 + ld a, DECK_2 | DECK_3 + call .CheckIfCanBuild ret nc - ld a, $0a - call Func_1bae4 + ld a, DECK_2 | DECK_4 + call .CheckIfCanBuild ret nc - ld a, $0c - call Func_1bae4 + ld a, DECK_3 | DECK_4 + call .CheckIfCanBuild ret nc - ld a, $f7 -.asm_7ad2 - call Func_1bae4 + +; all but one deck combinations + ld a, $ff ^ DECK_4 +.loop_three_deck_combinations + call .CheckIfCanBuild ret nc sra a cp $ff - jr z, .asm_7ade - jr .asm_7ad2 -.asm_7ade - call Func_1bae4 + jr z, .all_decks + jr .loop_three_deck_combinations + +.all_decks +; finally check if can be built by dismantling all decks + call .CheckIfCanBuild ret nc + +; none of the combinations work scf ret -Func_1bae4: ; 1bae4 (6:7ae4) +; returns cary if wSelectedDeckMachineEntry cannot be built +; by dismantling the decks given by register a +; a = DECK_* flags +.CheckIfCanBuild push af - ld hl, wd088 + ld hl, wSelectedDeckMachineEntry ld b, [hl] farcall CheckIfCanBuildSavedDeck - jr c, .asm_7af5 + jr c, .cannot_build pop af - ld [wd0a6], a + ld [wDecksToBeDismantled], a or a ret -.asm_7af5 +.cannot_build pop af scf ret -- cgit v1.2.3