diff options
author | ElectroDeoxys <ElectroDeoxys@gmail.com> | 2021-09-27 11:56:10 +0100 |
---|---|---|
committer | ElectroDeoxys <ElectroDeoxys@gmail.com> | 2021-09-27 11:56:10 +0100 |
commit | 7825b5ef0f09a877142ea1eb221e895bb60a0253 (patch) | |
tree | 9d46dfebd219919f5144786caf3ebfdf7cdab3a7 /src/engine/auto_deck_machines.asm | |
parent | 48f83527c769441b6c123f3382d90e2e962ef9a0 (diff) |
Split bank 6
Diffstat (limited to 'src/engine/auto_deck_machines.asm')
-rw-r--r-- | src/engine/auto_deck_machines.asm | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/src/engine/auto_deck_machines.asm b/src/engine/auto_deck_machines.asm new file mode 100644 index 0000000..0f84cef --- /dev/null +++ b/src/engine/auto_deck_machines.asm @@ -0,0 +1,191 @@ +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: + call EnableSRAM + ld a, [wCurAutoDeckMachine] + ld l, a + ld h, 6 * NUM_DECK_MACHINE_SLOTS + call HtimesL + ld bc, AutoDeckMachineEntries + add hl, bc + ld b, 0 +.loop_decks + call .GetPointerToSRAMAutoDeck + call .ReadDeckConfiguration + call .ReadDeckName + + ; store deck description text ID + push hl + ld de, wAutoDeckMachineTextDescriptions + ld h, b + ld l, 2 + call HtimesL + add hl, de + ld d, h + ld e, l + pop hl + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc b + ld a, b + cp NUM_DECK_MACHINE_SLOTS + jr nz, .loop_decks + call DisableSRAM + ret + +; outputs in de the saved deck with index b +.GetPointerToSRAMAutoDeck + push hl + ld l, b + ld h, DECK_STRUCT_SIZE + call HtimesL + ld de, sAutoDecks + add hl, de + ld d, h + ld e, l + pop hl + ret + +; writes the deck configuration in SRAM +; by reading the given deck card list +.ReadDeckConfiguration + push hl + push bc + push de + push de + ld e, [hl] + inc hl + ld d, [hl] + pop hl + ld bc, DECK_NAME_SIZE + add hl, bc +.loop_create_deck + ld a, [de] + inc de + ld b, a ; card count + or a + jr z, .done_create_deck + ld a, [de] + inc de + ld c, a ; card ID +.loop_card_count + ld [hl], c + inc hl + dec b + jr nz, .loop_card_count + jr .loop_create_deck +.done_create_deck + pop de + pop bc + pop hl + inc hl + inc hl + ret + +.ReadDeckName + push hl + push bc + push de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wDismantledDeckName + call CopyText + pop hl + ld de, wDismantledDeckName +.loop_copy_name + ld a, [de] + ld [hli], a + or a + jr z, .done_copy_name + inc de + jr .loop_copy_name +.done_copy_name + pop bc + pop hl + inc hl + inc hl + ret + +; 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: + xor a + 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 ; 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, DECK_1 | DECK_3 + call .CheckIfCanBuild + ret nc + ld a, DECK_1 | DECK_4 + call .CheckIfCanBuild + ret nc + ld a, DECK_2 | DECK_3 + call .CheckIfCanBuild + ret nc + ld a, DECK_2 | DECK_4 + call .CheckIfCanBuild + ret nc + ld a, DECK_3 | DECK_4 + call .CheckIfCanBuild + ret nc + +; all but one deck combinations + ld a, $ff ^ DECK_4 +.loop_three_deck_combinations + call .CheckIfCanBuild + ret nc + sra a + cp $ff + 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 + +; returns carry if wSelectedDeckMachineEntry cannot be built +; by dismantling the decks given by register a +; a = DECK_* flags +.CheckIfCanBuild + push af + ld hl, wSelectedDeckMachineEntry + ld b, [hl] + farcall CheckIfCanBuildSavedDeck + jr c, .cannot_build + pop af + ld [wDecksToBeDismantled], a + or a + ret +.cannot_build + pop af + scf + ret |