diff options
author | ElectroDeoxys <ElectroDeoxys@gmail.com> | 2021-09-29 09:02:02 +0100 |
---|---|---|
committer | ElectroDeoxys <ElectroDeoxys@gmail.com> | 2021-09-29 09:02:02 +0100 |
commit | bae47106f18266d2c3b97b6d954b91d9b16c0ccf (patch) | |
tree | 4d1a24de37ddb1b22ff22991a275fca351a3651d /src/engine/effect_functions.asm | |
parent | b0487fa979d0b5f3241e9e0659dd4b29a7e38f18 (diff) |
Reorganise some folders in engine/
Diffstat (limited to 'src/engine/effect_functions.asm')
-rw-r--r-- | src/engine/effect_functions.asm | 11194 |
1 files changed, 0 insertions, 11194 deletions
diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm deleted file mode 100644 index ce3a517..0000000 --- a/src/engine/effect_functions.asm +++ /dev/null @@ -1,11194 +0,0 @@ -Poison50PercentEffect: ; 2c000 (b:4000) - ldtx de, PoisonCheckText - call TossCoin_BankB - ret nc - -PoisonEffect: ; 2c007 (b:4007) - lb bc, CNF_SLP_PRZ, POISONED - jr ApplyStatusEffect - -DoublePoisonEffect: ; 2c00c (b:400c) - lb bc, CNF_SLP_PRZ, DOUBLE_POISONED - jr ApplyStatusEffect - -Paralysis50PercentEffect: ; 2c011 (b:4011) - ldtx de, ParalysisCheckText - call TossCoin_BankB - ret nc - -ParalysisEffect: ; 2c018 (b:4018) - lb bc, PSN_DBLPSN, PARALYZED - jr ApplyStatusEffect - -Confusion50PercentEffect: ; 2c01d (b:401d) - ldtx de, ConfusionCheckText - call TossCoin_BankB - ret nc - -ConfusionEffect: ; 2c024 (b:4024) - lb bc, PSN_DBLPSN, CONFUSED - jr ApplyStatusEffect - -Sleep50PercentEffect: ; 2c029 (b:4029) - ldtx de, SleepCheckText - call TossCoin_BankB - ret nc - -SleepEffect: ; 2c030 (b:4030) - lb bc, PSN_DBLPSN, ASLEEP - jr ApplyStatusEffect - -ApplyStatusEffect: ; 2c035 (b:4035) - ldh a, [hWhoseTurn] - ld hl, wWhoseTurn - cp [hl] - jr nz, .can_induce_status - ld a, [wTempNonTurnDuelistCardID] - cp CLEFAIRY_DOLL - jr z, .cant_induce_status - cp MYSTERIOUS_FOSSIL - jr z, .cant_induce_status - ; Snorlax's Thick Skinned prevents it from being statused... - cp SNORLAX - jr nz, .can_induce_status - call SwapTurn - xor a - ; ...unless already so, or if affected by Muk's Toxic Gas - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - call SwapTurn - jr c, .can_induce_status - -.cant_induce_status - ld a, c - ld [wNoEffectFromWhichStatus], a - call SetNoEffectFromStatus - or a - ret - -.can_induce_status - ld hl, wEffectFunctionsFeedbackIndex - push hl - ld e, [hl] - ld d, $0 - ld hl, wEffectFunctionsFeedback - add hl, de - call SwapTurn - ldh a, [hWhoseTurn] - ld [hli], a - call SwapTurn - ld [hl], b ; mask of status conditions not to discard on the target - inc hl - ld [hl], c ; status condition to inflict to the target - pop hl - ; advance wEffectFunctionsFeedbackIndex - inc [hl] - inc [hl] - inc [hl] - scf - ret - -TossCoin_BankB: ; 2c07e (b:407e) - call TossCoin - ret - -TossCoinATimes_BankB: ; 2c082 (b:4082) - call TossCoinATimes - ret - -CommentedOut_2c086: ; 2c086 (b:4086) - ret - -Func_2c087: ; 2c087 (b:4087) - xor a - jr Func_2c08c - -Func_2c08a: ; 2c08a (b:408a) - ld a, $1 - -Func_2c08c: ; 2c08c (b:408c) - push de - push af - ld a, OPPACTION_TOSS_COIN_A_TIMES - call SetOppAction_SerialSendDuelData - pop af - pop de - call SerialSend8Bytes - call TossCoinATimes - ret - -SetNoEffectFromStatus: ; 2c09c (b:409c) - ld a, EFFECT_FAILED_NO_EFFECT - ld [wEffectFailed], a - ret - -SetWasUnsuccessful: ; 2c0a2 (b:40a2) - ld a, EFFECT_FAILED_UNSUCCESSFUL - ld [wEffectFailed], a - ret - -Func_2c0a8: ; 2c0a8 (b:40a8) - ldh a, [hTemp_ffa0] - push af - ldh a, [hWhoseTurn] - ldh [hTemp_ffa0], a - ld a, OPPACTION_6B30 - call SetOppAction_SerialSendDuelData - bank1call Func_4f2d - ld c, a - pop af - ldh [hTemp_ffa0], a - ld a, c - ret - -Func_2c0bd: ; 2c0bd (b:40bd) - call ExchangeRNG - bank1call Func_4f2d - call ShuffleDeck - ret - -; return carry if Player is the Turn Duelist -IsPlayerTurn: ; 2c0c7 (b:40c7) - ld a, DUELVARS_DUELIST_TYPE - call GetTurnDuelistVariable - cp DUELIST_TYPE_PLAYER - jr z, .player - or a - ret -.player - scf - ret - -; Stores information about the attack damage for AI purposes -; taking into account poison damage between turns. -; if target poisoned -; [wAIMinDamage] <- [wDamage] -; [wAIMaxDamage] <- [wDamage] -; else -; [wAIMinDamage] <- [wDamage] + d -; [wAIMaxDamage] <- [wDamage] + e -; [wDamage] <- [wDamage] + a -UpdateExpectedAIDamage_AccountForPoison: ; 2c0d4 (b:40d4) - push af - ld a, DUELVARS_ARENA_CARD_STATUS - call GetNonTurnDuelistVariable - and POISONED | DOUBLE_POISONED - jr z, UpdateExpectedAIDamage.skip_push_af - pop af - ld a, [wDamage] - ld [wAIMinDamage], a - ld [wAIMaxDamage], a - ret - -; Sets some variables for AI use -; [wAIMinDamage] <- [wDamage] + d -; [wAIMaxDamage] <- [wDamage] + e -; [wDamage] <- [wDamage] + a -UpdateExpectedAIDamage: ; 2c0e9 (b:40e9) - push af - -.skip_push_af - ld hl, wDamage - ld a, [hl] - add d - ld [wAIMinDamage], a - ld a, [hl] - add e - ld [wAIMaxDamage], a - pop af - add [hl] - ld [hl], a - ret - -; Stores information about the attack damage for AI purposes -; [wDamage] <- a (average amount of damage) -; [wAIMinDamage] <- d (minimum) -; [wAIMaxDamage] <- e (maximum) -SetExpectedAIDamage: ; 2c0fb (b:40fb) - ld [wDamage], a - xor a - ld [wDamage + 1], a - ld a, d - ld [wAIMinDamage], a - ld a, e - ld [wAIMaxDamage], a - ret - -Func_2c10b: ; 2c10b (b:410b) - ldh [hTempPlayAreaLocation_ff9d], a - bank1call Func_61a1 - bank1call PrintPlayAreaCardList_EnableLCD - bank1call Func_6194 - ret - -; deal damage to all the turn holder's benched Pokemon -; input: a = amount of damage to deal to each Pokemon -DealDamageToAllBenchedPokemon: ; 2c117 (b:4117) - ld e, a - ld d, $00 - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld c, a - ld b, PLAY_AREA_ARENA - jr .skip_to_bench -.loop - push bc - call DealDamageToPlayAreaPokemon_RegularAnim - pop bc -.skip_to_bench - inc b - dec c - jr nz, .loop - ret - -Func_2c12e: ; 2c12e (b:412e) - ld [wLoadedAttackAnimation], a - ldh a, [hTempPlayAreaLocation_ff9d] - ld b, a - ld c, $0 ; neither WEAKNESS nor RESISTANCE - ldh a, [hWhoseTurn] - ld h, a - bank1call PlayAttackAnimation - bank1call WaitAttackAnimation - ret - -; apply a status condition of type 1 identified by register a to the target -ApplySubstatus1ToDefendingCard: ; 2c140 (b:4140) - push af - ld a, DUELVARS_ARENA_CARD_SUBSTATUS1 - call GetTurnDuelistVariable - pop af - ld [hli], a - ret - -; apply a status condition of type 2 identified by register a to the target, -; unless prevented by wNoDamageOrEffect -ApplySubstatus2ToDefendingCard: ; 2c149 (b:4149) - push af - call CheckNoDamageOrEffect - jr c, .no_damage_orEffect - ld a, DUELVARS_ARENA_CARD_SUBSTATUS2 - call GetNonTurnDuelistVariable - pop af - ld [hl], a - ld l, $f6 - ld [hl], a - ret - -.no_damage_orEffect - pop af - push hl - bank1call DrawDuelMainScene - pop hl - ld a, l - or h - call nz, DrawWideTextBox_PrintText - ret - -; overwrites in wDamage, wAIMinDamage and wAIMaxDamage -; with the value in a. -SetDefiniteDamage: ; 2c166 (b:4166) - ld [wDamage], a - ld [wAIMinDamage], a - ld [wAIMaxDamage], a - xor a - ld [wDamage + 1], a - ret - -; overwrites wAIMinDamage and wAIMaxDamage -; with value in wDamage. -SetDefiniteAIDamage: ; 2c174 (b:4174) - ld a, [wDamage] - ld [wAIMinDamage], a - ld [wAIMaxDamage], a - ret - -; returns in a some random occupied Play Area location -; in Turn Duelist's Play Area. -PickRandomPlayAreaCard: ; 2c17e (b:417e) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - call Random - or a - ret - -; outputs in hl the next position -; in hTempList to place a new card, -; and increments hCurSelectionItem. -GetNextPositionInTempList: ; 2c188 (b:4188) - push de - ld hl, hCurSelectionItem - ld a, [hl] - inc [hl] - ld e, a - ld d, $00 - ld hl, hTempList - add hl, de - pop de - ret - -; creates in wDuelTempList list of attached Fire Energy cards -; that are attached to the Turn Duelist's Arena card. -CreateListOfFireEnergyAttachedToArena: ; 2c197 (b:4197) - ld a, TYPE_ENERGY_FIRE - ; fallthrough - -; creates in wDuelTempList a list of cards that -; are in the Arena of the same type as input a. -; this is called to list Energy cards of a specific type -; that are attached to the Arena Pokemon. -; input: -; a = TYPE_ENERGY_* constant -; output: -; a = number of cards in list; -; wDuelTempList filled with cards, terminated by $ff -CreateListOfEnergyAttachedToArena: ; 2c199 (b:4199) - ld b, a - ld c, 0 - ld de, wDuelTempList - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop - ld a, [hl] - cp CARD_LOCATION_ARENA - jr nz, .next - push de - ld a, l - call GetCardIDFromDeckIndex - call GetCardType - pop de - cp b - jr nz, .next ; is same as input type? - ld a, l - ld [de], a - inc de - inc c -.next - inc l - ld a, l - cp DECK_SIZE - jr c, .loop - - ld a, $ff - ld [de], a - ld a, c - ret - -; prints the text "<X> devolved to <Y>!" with -; the proper card names and levels. -; input: -; d = deck index of the lower stage card -; e = deck index of card that was devolved -PrintDevolvedCardNameAndLevelText: ; 2c1c4 (b:41c4) - push de - ld a, e - call LoadCardDataToBuffer1_FromDeckIndex - ld bc, wTxRam2 - ld hl, wLoadedCard1Name - ld a, [hli] - ld [bc], a - inc bc - ld a, [hl] - ld [bc], a - - inc bc ; wTxRam2_b - xor a - ld [bc], a - inc bc - ld [bc], a - - ld a, d - call LoadCardDataToBuffer1_FromDeckIndex - ld a, 18 - call CopyCardNameAndLevel - ld [hl], $00 - ldtx hl, PokemonDevolvedToText - call DrawWideTextBox_WaitForInput - pop de - ret - -HandleSwitchDefendingPokemonEffect: ; 2c1ec (b:41ec) - ld e, a - cp $ff - ret z - -; check Defending Pokemon's HP - ld a, DUELVARS_ARENA_CARD_HP - call GetNonTurnDuelistVariable - or a - jr nz, .switch - -; if 0, handle Destiny Bond first - push de - bank1call HandleDestinyBondSubstatus - pop de - -.switch - call HandleNoDamageOrEffect - ret c - -; attack was successful, switch Defending Pokemon - call SwapTurn - call SwapArenaWithBenchPokemon - call SwapTurn - - xor a - ld [wccc5], a - ld [wDuelDisplayedScreen], a - inc a - ld [wccef], a - ret - -; returns carry if Defending has No Damage or Effect -; if so, print its appropriate text. -HandleNoDamageOrEffect: ; 2c216 (b:4216) - call CheckNoDamageOrEffect - ret nc - ld a, l - or h - call nz, DrawWideTextBox_PrintText - scf - ret - -; applies HP recovery on Pokemon after an attack -; with HP recovery effect, and handles its animation. -; input: -; d = damage effectiveness -; e = HP amount to recover -ApplyAndAnimateHPRecovery: ; 2c221 (b:4221) - push de - ld hl, wccbd - ld [hl], e - inc hl - ld [hl], d - -; get Arena card's damage - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - pop de - or a - ret z ; return if no damage - -; load correct animation - push de - ld a, ATK_ANIM_HEAL - ld [wLoadedAttackAnimation], a - ld bc, $01 ; arrow - bank1call PlayAttackAnimation - -; compare HP to be restored with max HP -; if HP to be restored would cause HP to -; be larger than max HP, cap it accordingly - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - ld b, $00 - pop de - ld a, DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - add e - ld e, a - ld a, 0 - adc d - ld d, a - ; de = damage dealt + current HP - ; bc = max HP of card - call CompareDEtoBC - jr c, .skip_cap - ; cap de to value in bc - ld e, c - ld d, b - -.skip_cap - ld [hl], e ; apply new HP to arena card - bank1call WaitAttackAnimation - ret - -; returns carry if Play Area has no damage counters. -CheckIfPlayAreaHasAnyDamage: ; 2c25b (b:425b) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld d, a - ld e, PLAY_AREA_ARENA -.loop_play_area - call GetCardDamageAndMaxHP - or a - ret nz ; found damage - inc e - dec d - jr nz, .loop_play_area - ; no damage found - scf - ret - -; makes a list in wDuelTempList with the deck indices -; of Trainer cards found in Turn Duelist's Discard Pile. -; returns carry set if no Trainer cards found, and loads -; corresponding text to notify this. -CreateTrainerCardListFromDiscardPile: ; 2c26e (b:426e) -; get number of cards in Discard Pile -; and have hl point to the end of the -; Discard Pile list in wOpponentDeckCards. - ld a, DUELVARS_NUMBER_OF_CARDS_IN_DISCARD_PILE - call GetTurnDuelistVariable - ld b, a - add DUELVARS_DECK_CARDS - ld l, a - - ld de, wDuelTempList - inc b - jr .next_card - -.check_trainer - ld a, [hl] - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_TRAINER - jr nz, .next_card - - ld a, [hl] - ld [de], a - inc de - -.next_card - dec l - dec b - jr nz, .check_trainer - - ld a, $ff ; terminating byte - ld [de], a - ld a, [wDuelTempList] - cp $ff - jr z, .no_trainers - or a - ret -.no_trainers - ldtx hl, ThereAreNoTrainerCardsInDiscardPileText - scf - ret - -; makes a list in wDuelTempList with the deck indices -; of all basic energy cards found in Turn Duelist's Discard Pile. -CreateEnergyCardListFromDiscardPile_OnlyBasic: ; 2c2a0 (b:42a0) - ld c, $01 - jr CreateEnergyCardListFromDiscardPile - -; makes a list in wDuelTempList with the deck indices -; of all energy cards (including Double Colorless) -; found in Turn Duelist's Discard Pile. -CreateEnergyCardListFromDiscardPile_AllEnergy: ; 2c2a4 (b:42a4) - ld c, $00 -; fallthrough - -; makes a list in wDuelTempList with the deck indices -; of energy cards found in Turn Duelist's Discard Pile. -; if (c == 0), all energy cards are allowed; -; if (c != 0), double colorless energy cards are not included. -; returns carry if no energy cards were found. -CreateEnergyCardListFromDiscardPile: ; 2c2a6 (b:42a6) -; get number of cards in Discard Pile -; and have hl point to the end of the -; Discard Pile list in wOpponentDeckCards. - ld a, DUELVARS_NUMBER_OF_CARDS_IN_DISCARD_PILE - call GetTurnDuelistVariable - ld b, a - add DUELVARS_DECK_CARDS - ld l, a - - ld de, wDuelTempList - inc b - jr .next_card - -.check_energy - ld a, [hl] - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - and TYPE_ENERGY - jr z, .next_card - -; if (c != $00), then we dismiss Double Colorless -; energy cards found. - ld a, c - or a - jr z, .copy - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY_DOUBLE_COLORLESS - jr nc, .next_card - -.copy - ld a, [hl] - ld [de], a - inc de - -; goes through Discard Pile list -; in wOpponentDeckCards in descending order. -.next_card - dec l - dec b - jr nz, .check_energy - -; terminating byte on wDuelTempList - ld a, $ff - ld [de], a - -; check if any energy card was found -; by checking whether the first byte -; in wDuelTempList is $ff. -; if none were found, return carry. - ld a, [wDuelTempList] - cp $ff - jr z, .set_carry - or a - ret - -.set_carry - scf - ret - -; returns carry if Deck is empty -CheckIfDeckIsEmpty: ; 2c2e0 (b:42e0) - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetTurnDuelistVariable - ldtx hl, NoCardsLeftInTheDeckText - cp DECK_SIZE - ccf - ret - -; searches through Deck in wDuelTempList looking for -; a certain card or cards, and prints text depending -; on whether at least one was found. -; if none were found, asks the Player whether to look -; in the Deck anyway, and returns carry if No is selected. -; uses SEARCHEFFECT_* as input which determines what to search for: -; SEARCHEFFECT_CARD_ID = search for card ID in e -; SEARCHEFFECT_NIDORAN = search for either NidoranM or NidoranF -; SEARCHEFFECT_BASIC_FIGHTING = search for any Basic Fighting Pokemon -; SEARCHEFFECT_BASIC_ENERGY = search for any Basic Energy -; SEARCHEFFECT_POKEMON = search for any Pokemon card -; input: -; d = SEARCHEFFECT_* constant -; e = (optional) card ID to search for in deck -; hl = text to print if Deck has card(s) -; output: -; carry set if refused to look at deck -LookForCardsInDeck: ; 2c2ec (b:42ec) - push hl - push bc - ld a, [wDuelTempList] - cp $ff - jr z, .none_in_deck - ld a, d - ld hl, .search_table - call JumpToFunctionInTable - jr c, .none_in_deck - pop bc - pop hl - call DrawWideTextBox_WaitForInput - or a - ret - -.none_in_deck - pop hl - call LoadTxRam2 - pop hl - ldtx hl, ThereIsNoInTheDeckText - call DrawWideTextBox_WaitForInput - ldtx hl, WouldYouLikeToCheckTheDeckText - call YesOrNoMenuWithText_SetCursorToYes - ret - -.search_table - dw .SearchDeckForCardID - dw .SearchDeckForNidoran - dw .SearchDeckForBasicFighting - dw .SearchDeckForBasicEnergy - dw .SearchDeckForPokemon - -.set_carry ; 2c321 (b:4321) - scf - ret - -; returns carry if no card with -; same card ID as e is found in Deck -.SearchDeckForCardID ; 2c323 (b:4323) - ld hl, wDuelTempList -.loop_deck_e - ld a, [hli] - cp $ff - jr z, .set_carry - push de - call GetCardIDFromDeckIndex - ld a, e - pop de - cp e - jr nz, .loop_deck_e - or a - ret - -; returns carry if no NidoranM or NidoranF card is found in Deck -.SearchDeckForNidoran ; 2c336 (b:4336) - ld hl, wDuelTempList -.loop_deck_nidoran - ld a, [hli] - cp $ff - jr z, .set_carry - call GetCardIDFromDeckIndex - ld a, e - cp NIDORANF - jr z, .found_nidoran - cp NIDORANM - jr nz, .loop_deck_nidoran -.found_nidoran - or a - ret - -; returns carry if no Basic Fighting Pokemon is found in Deck -.SearchDeckForBasicFighting ; 2c34c (b:434c) - ld hl, wDuelTempList -.loop_deck_fighting - ld a, [hli] - cp $ff - jr z, .set_carry - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_PKMN_FIGHTING - jr nz, .loop_deck_fighting - ld a, [wLoadedCard2Stage] - or a ; BASIC - jr nz, .loop_deck_fighting - ret - -; returns carry if no Basic Energy cards are found in Deck -.SearchDeckForBasicEnergy ; 2c365 (b:4365) - ld hl, wDuelTempList -.loop_deck_energy - ld a, [hli] - cp $ff - jr z, .set_carry - call GetCardIDFromDeckIndex - call GetCardType - cp TYPE_ENERGY_DOUBLE_COLORLESS - jr z, .loop_deck_energy - and TYPE_ENERGY - jr z, .loop_deck_energy - or a - ret - -; returns carry if no Pokemon cards are found in Deck -.SearchDeckForPokemon ; 2c37d (b:437d) - ld hl, wDuelTempList -.loop_deck_pkmn - ld a, [hli] - cp $ff - jr z, .set_carry - call GetCardIDFromDeckIndex - call GetCardType - cp TYPE_ENERGY - jr nc, .loop_deck_pkmn - or a - ret - -; handles the Player selection of attack -; to use, i.e. Amnesia or Metronome on. -; returns carry if none selected. -; outputs: -; d = card index of defending card -; e = attack index selected -HandleDefendingPokemonAttackSelection: ; 2c391 (b:4391) - bank1call DrawDuelMainScene - call SwapTurn - xor a - ldh [hCurSelectionItem], a - -.start - bank1call PrintAndLoadAttacksToDuelTempList - push af - ldh a, [hCurSelectionItem] - ld hl, .menu_parameters - call InitializeMenuParameters - pop af - - ld [wNumMenuItems], a - call EnableLCD -.loop_input - call DoFrame - ldh a, [hKeysPressed] - bit B_BUTTON_F, a - jr nz, .set_carry - and START - jr nz, .open_atk_page - call HandleMenuInput - jr nc, .loop_input - cp -1 - jr z, .loop_input - -; an attack was selected - ldh a, [hCurMenuItem] - add a - ld e, a - ld d, $00 - ld hl, wDuelTempList - add hl, de - ld d, [hl] - inc hl - ld e, [hl] - call SwapTurn - or a - ret - -.set_carry - call SwapTurn - scf - ret - -.open_atk_page - ldh a, [hCurMenuItem] - ldh [hCurSelectionItem], a - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - bank1call OpenAttackPage - call SwapTurn - bank1call DrawDuelMainScene - call SwapTurn - jr .start - -.menu_parameters - db 1, 13 ; 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 - -; loads in hl the pointer to attack's name. -; input: -; d = deck index of card -; e = attack index (0 = first attack, 1 = second attack) -GetAttackName: ; 2c3fc (b:43fc) - ld a, d - call LoadCardDataToBuffer1_FromDeckIndex - ld hl, wLoadedCard1Atk1Name - inc e - dec e - jr z, .load_name - ld hl, wLoadedCard1Atk2Name -.load_name - ld a, [hli] - ld h, [hl] - ld l, a - ret - -; returns carry if Defending Pokemon -; doesn't have an attack. -CheckIfDefendingPokemonHasAnyAttack: ; 2c40e (b:440e) - call SwapTurn - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Atk1Category] - cp POKEMON_POWER - jr nz, .has_attack - ld hl, wLoadedCard2Atk2Name - ld a, [hli] - or [hl] - jr nz, .has_attack - call SwapTurn - scf - ret -.has_attack - call SwapTurn - or a - ret - -; overwrites HP and Stage data of the card that was -; devolved in the Play Area to the values of new card. -; if the damage exceeds HP of pre-evolution, -; then HP is set to zero. -; input: -; a = card index of pre-evolved card -UpdateDevolvedCardHPAndStage: ; 2c431 (b:4431) - push bc - push de - push af - ldh a, [hTempPlayAreaLocation_ff9d] - ld e, a - call GetCardDamageAndMaxHP - ld b, a ; store damage - ld a, e - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - pop af - - ld [hl], a - call LoadCardDataToBuffer2_FromDeckIndex - ld a, e - add DUELVARS_ARENA_CARD_HP - ld l, a - ld a, [wLoadedCard2HP] - sub b ; subtract damage from new HP - jr nc, .got_hp - ; damage exceeds HP - xor a ; 0 HP -.got_hp - ld [hl], a - ld a, e -; overwrite card stage - add DUELVARS_ARENA_CARD_STAGE - ld l, a - ld a, [wLoadedCard2Stage] - ld [hl], a - pop de - pop bc - ret - -; reset various status after devolving card. -ResetDevolvedCardStatus: ; 2c45d (b:445d) -; if it's Arena card, clear status conditions - ldh a, [hTempPlayAreaLocation_ff9d] - or a - jr nz, .skip_clear_status - call ClearAllStatusConditions -.skip_clear_status -; reset changed color status - ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_CHANGED_TYPE - call GetTurnDuelistVariable - ld [hl], $00 -; reset C2 flags - ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_FLAGS - ld l, a - ld [hl], $00 - ret - -; prompts the Player with a Yes/No question -; whether to quit the screen, even though -; they can select more cards from list. -; [hCurSelectionItem] holds number of cards -; that were already selected by the Player. -; input: -; - a = total number of cards that can be selected -; output: -; - carry set if "No" was selected -AskWhetherToQuitSelectingCards: ; 2c476 (b:4476) - ld hl, hCurSelectionItem - sub [hl] - ld l, a - ld h, $00 - call LoadTxRam3 - ldtx hl, YouCanSelectMoreCardsQuitText - call YesOrNoMenuWithText - ret - -; handles the selection of a forced switch by link/AI opponent or by the player. -; outputs the Play Area location of the chosen bench card in hTempPlayAreaLocation_ff9d. -DuelistSelectForcedSwitch: ; 2c487 (b:4487) - ld a, DUELVARS_DUELIST_TYPE - call GetNonTurnDuelistVariable - cp DUELIST_TYPE_LINK_OPP - jr z, .link_opp - - cp DUELIST_TYPE_PLAYER - jr z, .player - -; AI opponent - call SwapTurn - bank1call AIDoAction_ForcedSwitch - call SwapTurn - - ld a, [wPlayerAttackingAttackIndex] - ld e, a - ld a, [wPlayerAttackingCardIndex] - ld d, a - ld a, [wPlayerAttackingCardID] - call CopyAttackDataAndDamage_FromCardID - call Func_16f6 - ret - -.player - ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText - call DrawWideTextBox_WaitForInput - call SwapTurn - bank1call HasAlivePokemonInBench - ld a, $01 - ld [wcbd4], a -.asm_2c4c0 - bank1call OpenPlayAreaScreenForSelection - jr c, .asm_2c4c0 - call SwapTurn - ret - -.link_opp -; get selection from link opponent - ld a, OPPACTION_FORCE_SWITCH_ACTIVE - call SetOppAction_SerialSendDuelData -.loop - call SerialRecvByte - jr nc, .received - halt - nop - jr .loop -.received - ldh [hTempPlayAreaLocation_ff9d], a - ret - -; returns in a the card index of energy card -; attached to Defending Pokemon -; that is to be discarded by the AI for an effect. -; outputs $ff is none was found. -; output: -; a = deck index of attached energy card chosen -AIPickEnergyCardToDiscardFromDefendingPokemon: ; 2c4da (b:44da) - call SwapTurn - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - - xor a - call CreateArenaOrBenchEnergyCardList - jr nc, .has_energy - ; no energy, return - ld a, $ff - jr .done - -.has_energy - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - ld e, COLORLESS - ld a, [wAttachedEnergies + COLORLESS] - or a - jr nz, .pick_color ; has colorless attached? - - ; no colorless energy attached. - ; if it's colorless Pokemon, just - ; pick any energy card at random... - ld a, [wLoadedCard1Type] - cp COLORLESS - jr nc, .choose_random - - ; ...if not, check if it has its - ; own color energy attached. - ; if it doesn't, pick at random. - ld e, a - ld d, $00 - ld hl, wAttachedEnergies - add hl, de - ld a, [hl] - or a - jr z, .choose_random - -; pick attached card with same color as e -.pick_color - ld hl, wDuelTempList -.loop_energy - ld a, [hli] - cp $ff - jr z, .choose_random - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - and TYPE_PKMN - cp e - jr nz, .loop_energy - dec hl - -.done_chosen - ld a, [hl] -.done - call SwapTurn - ret - -.choose_random - call CountCardsInDuelTempList - ld hl, wDuelTempList - call ShuffleCards - jr .done_chosen - -; handles AI logic to pick attack for Amnesia -AIPickAttackForAmnesia: ; 2c532 (b:4532) -; load Defending Pokemon attacks - call SwapTurn - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - call HandleEnergyBurn - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - ld d, a - call LoadCardDataToBuffer2_FromDeckIndex -; if has no attack 1 name, return - ld hl, wLoadedCard2Atk1Name - ld a, [hli] - or [hl] - jr z, .chosen - -; if Defending Pokemon has enough energy for second attack, choose it - ld e, SECOND_ATTACK - bank1call _CheckIfEnoughEnergiesToAttack - jr nc, .chosen -; otherwise if first attack isn't a Pkmn Power, choose it instead. - ld e, FIRST_ATTACK_OR_PKMN_POWER - ld a, [wLoadedCard2Atk1Category] - cp POKEMON_POWER - jr nz, .chosen -; if it is a Pkmn Power, choose second attack. - ld e, SECOND_ATTACK -.chosen - ld a, e - call SwapTurn - ret - -; Return in a the PLAY_AREA_* of the non-turn holder's Pokemon card in bench with the lowest (remaining) HP. -; if multiple cards are tied for the lowest HP, the one with the highest PLAY_AREA_* is returned. -GetBenchPokemonWithLowestHP: ; 2c564 (b:4564) - call SwapTurn - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld c, a - lb de, PLAY_AREA_ARENA, $ff - ld b, d - ld a, DUELVARS_BENCH1_CARD_HP - call GetTurnDuelistVariable - jr .start -; find Play Area location with least amount of HP -.loop_bench - ld a, e - cp [hl] - jr c, .next ; skip if HP is higher - ld e, [hl] - ld d, b - -.next - inc hl -.start - inc b - dec c - jr nz, .loop_bench - - ld a, d - call SwapTurn - ret - -; handles drawing and selection of screen for -; choosing a color (excluding colorless), for use -; of Shift Pkmn Power and Conversion attacks. -; outputs in a the color that was selected or, -; if B was pressed, returns carry. -; input: -; a = Play Area location (PLAY_AREA_*), with: -; bit 7 not set if it's applying to opponent's card -; bit 7 set if it's applying to player's card -; hl = text to be printed in the bottom box -; output: -; a = color that was selected -HandleColorChangeScreen: ; 2c588 (b:4588) - or a - call z, SwapTurn - push af - call .DrawScreen - pop af - call z, SwapTurn - - ld hl, .menu_params - xor a - call InitializeMenuParameters - call EnableLCD - -.loop_input - call DoFrame - call HandleMenuInput - jr nc, .loop_input - cp -1 ; b pressed? - jr z, .set_carry - ld e, a - ld d, $00 - ld hl, ShiftListItemToColor - add hl, de - ld a, [hl] - or a - ret -.set_carry - scf - ret - -.menu_params - db 1, 1 ; cursor x, cursor y - db 2 ; y displacement between items - db MAX_PLAY_AREA_POKEMON ; number of items - db SYM_CURSOR_R ; cursor tile number - db SYM_SPACE ; tile behind cursor - dw NULL ; function pointer if non-0 - -.DrawScreen: ; 2c5be (b:45be) - push hl - push af - call EmptyScreen - call ZeroObjectPositions - call LoadDuelCardSymbolTiles - -; load card data - pop af - and $7f - ld [wTempPlayAreaLocation_cceb], a - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - -; draw card gfx - 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 - ld a, $a0 - lb hl, 6, 1 - lb de, 9, 2 - lb bc, 8, 6 - call FillRectangle - bank1call ApplyBGP6OrSGB3ToCardImage - -; print card name and level at the top - ld a, 16 - call CopyCardNameAndLevel - ld [hl], $00 - lb de, 7, 0 - call InitTextPrinting - ld hl, wDefaultText - call ProcessText - -; list all the colors - ld hl, ShiftMenuData - call PlaceTextItems - -; print card's color, resistance and weakness - ld a, [wTempPlayAreaLocation_cceb] - call GetPlayAreaCardColor - inc a - lb bc, 15, 9 - call WriteByteToBGMap0 - ld a, [wTempPlayAreaLocation_cceb] - call GetPlayAreaCardWeakness - lb bc, 15, 10 - bank1call PrintCardPageWeaknessesOrResistances - ld a, [wTempPlayAreaLocation_cceb] - call GetPlayAreaCardResistance - lb bc, 15, 11 - bank1call PrintCardPageWeaknessesOrResistances - - call DrawWideTextBox - -; print list of color names on all list items - lb de, 4, 1 - ldtx hl, ColorListText - call InitTextPrinting_ProcessTextFromID - -; print input hl to text box - lb de, 1, 14 - pop hl - call InitTextPrinting_ProcessTextFromID - -; draw and apply palette to color icons - ld hl, ColorTileAndBGP - lb de, 2, 0 - ld c, NUM_COLORED_TYPES -.loop_colors - ld a, [hli] - push de - push bc - push hl - lb hl, 1, 2 - lb bc, 2, 2 - call FillRectangle - - ld a, [wConsole] - cp CONSOLE_CGB - jr nz, .skip_vram1 - pop hl - push hl - call BankswitchVRAM1 - ld a, [hl] - lb hl, 0, 0 - lb bc, 2, 2 - call FillRectangle - call BankswitchVRAM0 - -.skip_vram1 - pop hl - pop bc - pop de - inc hl - inc e - inc e - dec c - jr nz, .loop_colors - ret - -; loads wTxRam2 and wTxRam2_b: -; [wTxRam2] <- wLoadedCard1Name -; [wTxRam2_b] <- input color as text symbol -; input: -; a = type (color) constant -LoadCardNameAndInputColor: ; 2c686 (b:4686) - add a - ld e, a - ld d, $00 - ld hl, ColorToTextSymbol - add hl, de - -; load wTxRam2 with card's name - ld de, wTxRam2 - ld a, [wLoadedCard1Name] - ld [de], a - inc de - ld a, [wLoadedCard1Name + 1] - ld [de], a - -; load wTxRam2_b with ColorToTextSymbol - inc de - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - ret - -ShiftMenuData: ; 2c6a1 (b:46a1) - ; x, y, text id - textitem 10, 9, TypeText - textitem 10, 10, WeaknessText - textitem 10, 11, ResistanceText - db $ff - -ColorTileAndBGP: ; 2c6ae (b:46ae) - ; tile, BG - db $e4, $02 - db $e0, $01 - db $eC, $02 - db $e8, $01 - db $f0, $03 - db $f4, $03 - -ShiftListItemToColor: ; 2c6ba (b:46ba) - db GRASS - db FIRE - db WATER - db LIGHTNING - db FIGHTING - db PSYCHIC - -ColorToTextSymbol: ; 2c6c0 (b:46c0) - tx FireSymbolText - tx GrassSymbolText - tx LightningSymbolText - tx WaterSymbolText - tx FightingSymbolText - tx PsychicSymbolText - -DrawSymbolOnPlayAreaCursor: ; 2c6cc (b:46cc) - ld c, a - add a - add c - add 2 - ; a = 3*a + 2 - ld c, a - ld a, b - ld b, 0 - call WriteByteToBGMap0 - ret - -; possibly unreferenced -Func_2c6d9: ; 2c6d9 (b:46d9) - ldtx hl, IncompleteText - call DrawWideTextBox_WaitForInput - ret - -PlayAreaSelectionMenuParameters: ; 2c6e0 (b:46e0) - db 0, 0 ; cursor x, cursor y - db 3 ; y displacement between items - db MAX_PLAY_AREA_POKEMON ; number of items - db SYM_CURSOR_R ; cursor tile number - db SYM_SPACE ; tile behind cursor - dw NULL ; function pointer if non-0 - -BenchSelectionMenuParameters: ; 2c6e8 (b:46e8) - db 0, 3 ; cursor x, cursor y - db 3 ; y displacement between items - db MAX_PLAY_AREA_POKEMON ; number of items - db SYM_CURSOR_R ; cursor tile number - db SYM_SPACE ; tile behind cursor - dw NULL ; function pointer if non-0 - -SpitPoison_AIEffect: ; 2c6f0 (b:46f0) - ld a, 10 / 2 - lb de, 0, 10 - jp SetExpectedAIDamage - -; If heads, defending Pokemon becomes poisoned -SpitPoison_Poison50PercentEffect: ; 2c6f8 (b:46f8) - ldtx de, PoisonCheckText - call TossCoin_BankB - jp c, PoisonEffect - ld a, ATK_ANIM_SPIT_POISON_SUCCESS - ld [wLoadedAttackAnimation], a - call SetNoEffectFromStatus - ret - -; outputs in hTemp_ffa0 the result of the coin toss (0 = tails, 1 = heads). -; in case it was heads, stores in hTempPlayAreaLocation_ffa1 -; the PLAY_AREA_* location of the Bench Pokemon that was selected for switch. -TerrorStrike_50PercentSelectSwitchPokemon: ; 2c70a (b:470a) - xor a - ldh [hTemp_ffa0], a - -; return failure if no Pokemon to switch to - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp 2 - ret c - -; toss coin and store whether it was tails (0) or heads (1) in hTemp_ffa0. -; return if it was tails. - ldtx de, IfHeadsChangeOpponentsActivePokemonText - call Func_2c08a - ldh [hTemp_ffa0], a - ret nc - - call DuelistSelectForcedSwitch - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTempPlayAreaLocation_ffa1], a - ret - -; if coin toss at hTemp_ffa0 was heads and it's possible, -; switch the Defending Pokemon -TerrorStrike_SwitchDefendingPokemon: ; 2c726 (b:4726) - ldh a, [hTemp_ffa0] - or a - ret z - ldh a, [hTempPlayAreaLocation_ffa1] - call HandleSwitchDefendingPokemonEffect - ret - -PoisonFang_AIEffect: ; 2c730 (b:4730) - ld a, 10 - lb de, 10, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -WeepinbellPoisonPowder_AIEffect: ; 2c738 (b:4738) - ld a, 5 - lb de, 0, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -; return carry if there are no Pokemon cards in the non-turn holder's bench -VictreebelLure_AssertPokemonInBench: ; 2c740 (b:4740) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - ldtx hl, EffectNoPokemonOnTheBenchText - cp 2 - ret - -; return in hTempPlayAreaLocation_ffa1 the PLAY_AREA_* location -; of the Bench Pokemon that was selected for switch -VictreebelLure_SelectSwitchPokemon: ; 2c74b (b:474b) - ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText - call DrawWideTextBox_WaitForInput - call SwapTurn - bank1call HasAlivePokemonInBench -.select_pokemon - bank1call OpenPlayAreaScreenForSelection - jr c, .select_pokemon - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - call SwapTurn - ret - -; Return in hTemp_ffa0 the PLAY_AREA_* of the non-turn holder's Pokemon card in bench with the lowest (remaining) HP. -; if multiple cards are tied for the lowest HP, the one with the highest PLAY_AREA_* is returned. -VictreebelLure_GetBenchPokemonWithLowestHP: ; 2c764 (b:4764) - call GetBenchPokemonWithLowestHP - ldh [hTemp_ffa0], a - ret - -; Defending Pokemon is swapped out for the one with the PLAY_AREA_* at hTemp_ffa0 -; unless Mew's Neutralizing Shield or Haunter's Transparency prevents it. -VictreebelLure_SwitchDefendingPokemon: ; 2c76a (b:476a) - call SwapTurn - ldh a, [hTemp_ffa0] - ld e, a - call HandleNShieldAndTransparency - call nc, SwapArenaWithBenchPokemon - call SwapTurn - xor a - ld [wDuelDisplayedScreen], a - ret - -; If heads, defending Pokemon can't retreat next turn -AcidEffect: ; 2c77e (b:477e) - ldtx de, AcidCheckText - call TossCoin_BankB - ret nc - ld a, SUBSTATUS2_UNABLE_RETREAT - call ApplySubstatus2ToDefendingCard - ret - -GloomPoisonPowder_AIEffect: ; 2c78b (b:478b) - ld a, 10 - lb de, 10, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -; Defending Pokemon and user become confused -FoulOdorEffect: ; 2c793 (b:4793) - call ConfusionEffect - call SwapTurn - call ConfusionEffect - call SwapTurn - ret - -; If heads, prevent all damage done to user next turn -KakunaStiffenEffect: ; 2c7a0 (b:47a0) - ldtx de, IfHeadsNoDamageNextTurnText - call TossCoin_BankB - jp nc, SetWasUnsuccessful - ld a, ATK_ANIM_PROTECT - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS1_NO_DAMAGE_STIFFEN - call ApplySubstatus1ToDefendingCard - ret - -KakunaPoisonPowder_AIEffect: ; 2c7b4 (b:47b4) - ld a, 5 - lb de, 0, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -GolbatLeechLifeEffect: ; 2c7bc (b:47bc) - ld hl, wDealtDamage - ld e, [hl] - inc hl ; wDamageEffectiveness - ld d, [hl] - call ApplyAndAnimateHPRecovery - ret - -VenonatLeechLifeEffect: ; 2c7c6 (b:47c6) - ld hl, wDealtDamage - ld e, [hl] - inc hl ; wDamageEffectiveness - ld d, [hl] - call ApplyAndAnimateHPRecovery - ret - -; During your next turn, double damage -SwordsDanceEffect: ; 2c7d0 (b:47d0) - ld a, [wTempTurnDuelistCardID] - cp SCYTHER - ret nz - ld a, SUBSTATUS1_NEXT_TURN_DOUBLE_DAMAGE - call ApplySubstatus1ToDefendingCard - ret - -; If heads, defending Pokemon becomes confused -ZubatSupersonicEffect: ; 2c7dc (b:47dc) - call Confusion50PercentEffect - call nc, SetNoEffectFromStatus - ret - -ZubatLeechLifeEffect: ; 2c7e3 (b:47e3) - ld hl, wDealtDamage - ld e, [hl] - inc hl - ld d, [hl] - call ApplyAndAnimateHPRecovery - ret - -Twineedle_AIEffect: ; 2c7ed (b:47ed) - ld a, 60 / 2 - lb de, 0, 60 - jp SetExpectedAIDamage - -; Flip 2 coins; deal 30x number of heads -Twineedle_MultiplierEffect: ; 2c7f5 (b:47f5) - ld hl, 30 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 2 - call TossCoinATimes_BankB - ld e, a - add a - add e - call ATimes10 - call SetDefiniteDamage - ret - -BeedrillPoisonSting_AIEffect: ; 2c80d (b:480d) - ld a, 5 - lb de, 0, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -ExeggcuteLeechSeedEffect: ; 2c815 (b:4815) - ld hl, wDealtDamage - ld a, [hli] - or a - ret z ; return if no damage dealt - ld de, 10 - call ApplyAndAnimateHPRecovery - ret - -FoulGas_AIEffect: ; 2c822 (b:4822) - ld a, 5 - lb de, 0, 10 - jp UpdateExpectedAIDamage - -; If heads, defending Pokemon becomes poisoned. If tails, defending Pokemon becomes confused -FoulGas_PoisonOrConfusionEffect: ; 2c82a (b:482a) - ldtx de, PoisonedIfHeadsConfusedIfTailsText - call TossCoin_BankB - jp c, PoisonEffect - jp ConfusionEffect - -; an exact copy of KakunaStiffenEffect -; If heads, prevent all damage done to user next turn -MetapodStiffenEffect: ; 2c836 (b:4836) - ldtx de, IfHeadsNoDamageNextTurnText - call TossCoin_BankB - jp nc, SetWasUnsuccessful - ld a, ATK_ANIM_PROTECT - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS1_NO_DAMAGE_STIFFEN - call ApplySubstatus1ToDefendingCard - ret - -; returns carry if no cards in Deck or if -; Play Area is full already. -Sprout_CheckDeckAndPlayArea: ; 2c84a (b:484a) - call CheckIfDeckIsEmpty - ret c ; return if no cards in deck - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, NoSpaceOnTheBenchText - cp MAX_PLAY_AREA_POKEMON - ccf - ret - -Sprout_PlayerSelectEffect: ; 2c85a (b:485a) - ld a, $ff - ldh [hTemp_ffa0], a - - call CreateDeckCardList - ldtx hl, ChooseAnOddishFromDeckText - ldtx bc, OddishText - lb de, SEARCHEFFECT_CARD_ID, ODDISH - call LookForCardsInDeck - ret c - -; draw Deck list interface and print text - bank1call Func_5591 - ldtx hl, ChooseAnOddishText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText - -.loop - bank1call DisplayCardList - jr c, .pressed_b - call GetCardIDFromDeckIndex - ld bc, ODDISH - call CompareDEtoBC - jr nz, .play_sfx - -; Oddish was selected - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - or a - ret - -.play_sfx - ; play SFX and loop back - call Func_3794 - jr .loop - -.pressed_b -; figure if Player can exit the screen without selecting, -; that is, if the Deck has no Oddish card. - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop_b_press - ld a, [hl] - cp CARD_LOCATION_DECK - jr nz, .next - ld a, l - call GetCardIDFromDeckIndex - ld bc, ODDISH - call CompareDEtoBC - jr z, .play_sfx ; found Oddish, go back to top loop -.next - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_b_press - -; no Oddish in Deck, can safely exit screen - ld a, $ff - ldh [hTemp_ffa0], a - or a - ret - -Sprout_AISelectEffect: ; 2c8b7 (b:48b7) - call CreateDeckCardList - ld hl, wDuelTempList -.loop_deck - ld a, [hli] - ldh [hTemp_ffa0], a - cp $ff - ret z ; no Oddish - call GetCardIDFromDeckIndex - ld a, e - cp ODDISH - jr nz, .loop_deck - ret ; Oddish found - -Sprout_PutInPlayAreaEffect: ; 2c8cc (b:48cc) - ldh a, [hTemp_ffa0] - cp $ff - jr z, .shuffle - call SearchCardInDeckAndAddToHand - call AddCardToHand - call PutHandPokemonCardInPlayArea - call IsPlayerTurn - jr c, .shuffle - ; display card on screen - ldh a, [hTemp_ffa0] - ldtx hl, PlacedOnTheBenchText - bank1call DisplayCardDetailScreen -.shuffle - call Func_2c0bd - ret - -; returns carry if no Pokemon on Bench -Teleport_CheckBench: ; 2c8ec (b:48ec) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, ThereAreNoPokemonOnBenchText - cp 2 - ret - -Teleport_PlayerSelectEffect: ; 2c8f7 (b:48f7) - ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText - call DrawWideTextBox_WaitForInput - bank1call HasAlivePokemonInBench - ld a, $01 - ld [wcbd4], a -.loop - bank1call OpenPlayAreaScreenForSelection - jr c, .loop - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ret - -Teleport_AISelectEffect: ; 2c90f (b:490f) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - call Random - ldh [hTemp_ffa0], a - ret - -Teleport_SwitchEffect: ; 2c91a (b:491a) - ldh a, [hTemp_ffa0] - ld e, a - call SwapArenaWithBenchPokemon - xor a - ld [wDuelDisplayedScreen], a - ret - -BigEggsplosion_AIEffect: ; 2c925 (b:4925) - ldh a, [hTempPlayAreaLocation_ff9d] - ld e, a - call GetPlayAreaCardAttachedEnergies - ld a, [wTotalAttachedEnergies] - call SetDamageToATimes20 - inc h - jr nz, .capped - ld l, 255 -.capped - ld a, l - ld [wAIMaxDamage], a - srl a - ld [wDamage], a - xor a - ld [wAIMinDamage], a - ret - -; Flip coins equal to attached energies; deal 20x number of heads -BigEggsplosion_MultiplierEffect: ; 2c944 (b:4944) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ld hl, 20 - call LoadTxRam3 - ld a, [wTotalAttachedEnergies] - ldtx de, DamageCheckIfHeadsXDamageText - call TossCoinATimes_BankB -; fallthrough - -; set damage to 20*a. Also return result in hl -SetDamageToATimes20: ; 2c958 (b:4958) - ld l, a - ld h, $00 - ld e, l - ld d, h - add hl, hl - add hl, hl - add hl, de - add hl, hl - add hl, hl - ld a, l - ld [wDamage], a - ld a, h - ld [wDamage + 1], a - ret - -Thrash_AIEffect: ; 2c96b (b:496b) - ld a, (30 + 40) / 2 - lb de, 30, 40 - jp SetExpectedAIDamage - -; If heads 10 more damage; if tails, 10 damage to itself -Thrash_ModifierEffect: ; 2c973 (b:4973) - ldtx de, IfHeadPlus10IfTails10ToYourselfText - call TossCoin_BankB - ldh [hTemp_ffa0], a - ret nc - ld a, 10 - call AddToDamage - ret - -Thrash_RecoilEffect: ; 2c982 (b:4982) - ldh a, [hTemp_ffa0] - or a - ret nz - ld a, 10 - call DealRecoilDamageToSelf - ret - -Toxic_AIEffect: ; 2c98c (b:498c) - ld a, 20 - lb de, 20, 20 - jp UpdateExpectedAIDamage - -; Defending Pokémon becomes double poisoned (takes 20 damage per turn rather than 10) -Toxic_DoublePoisonEffect: ; 2c994 (b:4994) - call DoublePoisonEffect - ret - -BoyfriendsEffect: ; 2c998 (b:4998) - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - ld c, PLAY_AREA_ARENA -.loop - ld a, [hl] - cp $ff - jr z, .done - call GetCardIDFromDeckIndex - ld a, e - cp NIDOKING - jr nz, .next - ld a, d - cp $00 ; why check d? Card IDs are only 1 byte long - jr nz, .next - inc c -.next - inc hl - jr .loop -.done -; c holds number of Nidoking found in Play Area - ld a, c - add a - call ATimes10 - call AddToDamage ; adds 2 * 10 * c - ret - -NidoranFFurySwipes_AIEffect: ; 2c9be (b:49be) - ld a, 30 / 2 - lb de, 0, 30 - jp SetExpectedAIDamage - -NidoranFFurySwipes_MultiplierEffect: ; 2c9c6 (b:49c6) - ld hl, 10 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 3 - call TossCoinATimes_BankB - call ATimes10 - call SetDefiniteDamage - ret - -NidoranFCallForFamily_CheckDeckAndPlayArea: ; 2c9db (b:49db) - call CheckIfDeckIsEmpty - ret c ; return if no cards in deck - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, NoSpaceOnTheBenchText - cp MAX_PLAY_AREA_POKEMON - ccf - ret - -NidoranFCallForFamily_PlayerSelectEffect: ; 2c9eb (b:49eb) - ld a, $ff - ldh [hTemp_ffa0], a - - call CreateDeckCardList - ldtx hl, ChooseNidoranFromDeckText - ldtx bc, NidoranMNidoranFText - lb de, SEARCHEFFECT_NIDORAN, $00 - call LookForCardsInDeck - ret c - -; draw Deck list interface and print text - bank1call Func_5591 - ldtx hl, ChooseNidoranText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText - -.loop - bank1call DisplayCardList - jr c, .pressed_b - call GetCardIDFromDeckIndex - ld bc, NIDORANF - call CompareDEtoBC - jr z, .selected_nidoran - ld bc, NIDORANM - call CompareDEtoBC - jr nz, .loop ; .play_sfx would be more appropriate here - -.selected_nidoran - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - or a - ret - -.play_sfx - ; play SFX and loop back - call Func_3794 - jr .loop - -.pressed_b -; figure if Player can exit the screen without selecting, -; that is, if the Deck has no NidoranF or NidoranM card. - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop_b_press - ld a, [hl] - cp CARD_LOCATION_DECK - jr nz, .next - ld a, l - call GetCardIDFromDeckIndex - ld bc, NIDORANF - call CompareDEtoBC - jr z, .play_sfx ; found, go back to top loop - ld bc, NIDORANM - jr z, .play_sfx ; found, go back to top loop -.next - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_b_press - -; no Nidoran in Deck, can safely exit screen - ld a, $ff - ldh [hTemp_ffa0], a - or a - ret - -NidoranFCallForFamily_AISelectEffect: ; 2ca55 (b:4a55) - call CreateDeckCardList - ld hl, wDuelTempList -.loop_deck - ld a, [hli] - ldh [hTemp_ffa0], a - cp $ff - ret z ; none found - call GetCardIDFromDeckIndex - ld a, e - cp NIDORANF - jr z, .found - cp NIDORANM - jr nz, .loop_deck -.found - ret - -NidoranFCallForFamily_PutInPlayAreaEffect: ; 2ca6e (b:4a6e) - ldh a, [hTemp_ffa0] - cp $ff - jr z, .shuffle - call SearchCardInDeckAndAddToHand - call AddCardToHand - call PutHandPokemonCardInPlayArea - call IsPlayerTurn - jr c, .shuffle - ; display card on screen - ldh a, [hTemp_ffa0] - ldtx hl, PlacedOnTheBenchText - bank1call DisplayCardDetailScreen -.shuffle - call Func_2c0bd - ret - -HornHazard_AIEffect: ; 2ca8e (b:4a8e) - ld a, 30 / 2 - lb de, 0, 30 - jp SetExpectedAIDamage - -HornHazard_NoDamage50PercentEffect: ; 2ca96 (b:4a96) - ldtx de, DamageCheckIfTailsNoDamageText - call TossCoin_BankB - jr c, .heads - xor a - call SetDefiniteDamage - call SetWasUnsuccessful - ret -.heads - ld a, ATK_ANIM_HIT - ld [wLoadedAttackAnimation], a - ret - -NidorinaSupersonicEffect: ; 2caac (b:4aac) - call Confusion50PercentEffect - call nc, SetNoEffectFromStatus - ret - -NidorinaDoubleKick_AIEffect: ; 2cab3 (b:4ab3) - ld a, 60 / 2 - lb de, 0, 60 - jp SetExpectedAIDamage - -NidorinaDoubleKick_MultiplierEffect: ; 2cabb (b:4abb) - ld hl, 30 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 2 - call TossCoinATimes_BankB - ld e, a - add a - add e - call ATimes10 - call SetDefiniteDamage - ret - -NidorinoDoubleKick_AIEffect: ; 2cad3 (b:4ad3) - ld a, 60 / 2 - lb de, 0, 60 - jp SetExpectedAIDamage - -NidorinoDoubleKick_MultiplierEffect: ; 2cabb (b:4abb) - ld hl, 30 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 2 - call TossCoinATimes_BankB - ld e, a - add a - add e - call ATimes10 - call SetDefiniteDamage - ret - -ButterfreeWhirlwind_CheckBench: ; 2caf3 (b:4af3) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp 2 - jr nc, .has_bench - ; no bench, do not do effect - ld a, $ff - ldh [hTemp_ffa0], a - ret -.has_bench - call DuelistSelectForcedSwitch - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ret - -ButterfreeWhirlwind_SwitchEffect: ; 2cb09 (b:4b09) - ldh a, [hTemp_ffa0] - call HandleSwitchDefendingPokemonEffect - ret - -ButterfreeMegaDrainEffect: ; 2cb0f (b:4b0f) - ld hl, wDealtDamage - ld a, [hli] - ld h, [hl] - ld l, a - srl h - rr l - bit 0, l - jr z, .rounded - ; round up to nearest 10 - ld de, 10 / 2 - add hl, de -.rounded - ld e, l - ld d, h - call ApplyAndAnimateHPRecovery - ret - -WeedlePoisonSting_AIEffect: ; 2cb27 (b:4b27) - ld a, 5 - lb de, 0, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -IvysaurPoisonPowder_AIEffect: ; 2cb2f (b:4b2f) - ld a, 10 - lb de, 10, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -BulbasaurLeechSeedEffect: ; 2cb37 (b:4b37) - ld hl, wDealtDamage - ld a, [hli] - or [hl] - ret z ; return if no damage dealt - lb de, 0, 10 - call ApplyAndAnimateHPRecovery - ret - -; returns carry if no Grass Energy in Play Area -EnergyTrans_CheckPlayArea: ; 2cb44 (b:4b44) - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ldh a, [hTempPlayAreaLocation_ff9d] - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - ret c ; cannot use Pkmn Power - -; search in Play Area for at least 1 Grass Energy type - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop_deck - ld a, [hl] - and CARD_LOCATION_PLAY_AREA - jr z, .next - push hl - ld a, l - call GetCardIDFromDeckIndex - call GetCardType - pop hl - cp TYPE_ENERGY_GRASS - ret z -.next - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_deck - -; none found - ldtx hl, NoGrassEnergyText - scf - ret - -EnergyTrans_PrintProcedure: ; 2cb6f (b:4b6f) - ldtx hl, ProcedureForEnergyTransferText - bank1call DrawWholeScreenTextBox - or a - ret - -EnergyTrans_TransferEffect: ; 2cb77 (b:4b77) - ld a, DUELVARS_DUELIST_TYPE - call GetTurnDuelistVariable - cp DUELIST_TYPE_PLAYER - jr z, .player -; not player - bank1call Func_61a1 - bank1call PrintPlayAreaCardList_EnableLCD - ret - -.player - xor a - ldh [hCurSelectionItem], a - bank1call Func_61a1 - -.draw_play_area - bank1call PrintPlayAreaCardList_EnableLCD - push af - ldh a, [hCurSelectionItem] - ld hl, PlayAreaSelectionMenuParameters - call InitializeMenuParameters - pop af - ld [wNumMenuItems], a - -; handle the action of taking a Grass Energy card -.loop_input_take - call DoFrame - call HandleMenuInput - jr nc, .loop_input_take - cp -1 ; b press? - ret z - -; a press - ldh [hAIPkmnPowerEffectParam], a - ldh [hCurSelectionItem], a - call CheckIfCardHasGrassEnergyAttached - jr c, .play_sfx ; no Grass attached - - ldh [hAIEnergyTransEnergyCard], a - ldh a, [hAIEnergyTransEnergyCard] ; useless - ; temporarily take card away to draw Play Area - call AddCardToHand - bank1call PrintPlayAreaCardList_EnableLCD - ldh a, [hAIPkmnPowerEffectParam] - ld e, a - ldh a, [hAIEnergyTransEnergyCard] - ; give card back - call PutHandCardInPlayArea - - ; draw Grass symbol near cursor - ldh a, [hAIPkmnPowerEffectParam] - ld b, SYM_GRASS - call DrawSymbolOnPlayAreaCursor - -; handle the action of placing a Grass Energy card -.loop_input_put - call DoFrame - call HandleMenuInput - jr nc, .loop_input_put - cp -1 ; b press? - jr z, .remove_symbol - -; a press - ldh [hCurSelectionItem], a - ldh [hAIEnergyTransPlayAreaLocation], a - ld a, OPPACTION_6B15 - call SetOppAction_SerialSendDuelData - ldh a, [hAIEnergyTransPlayAreaLocation] - ld e, a - ldh a, [hAIEnergyTransEnergyCard] - ; give card being held to this Pokemon - call AddCardToHand - call PutHandCardInPlayArea - -.remove_symbol - ldh a, [hAIPkmnPowerEffectParam] - ld b, SYM_SPACE - call DrawSymbolOnPlayAreaCursor - call EraseCursor - jr .draw_play_area - -.play_sfx - call Func_3794 - jr .loop_input_take - -EnergyTrans_AIEffect: ; 2cbfb (b:4bfb) - ldh a, [hAIEnergyTransPlayAreaLocation] - ld e, a - ldh a, [hAIEnergyTransEnergyCard] - call AddCardToHand - call PutHandCardInPlayArea - bank1call PrintPlayAreaCardList_EnableLCD - ret - -; returns carry if no Grass Energy cards -; attached to card in Play Area location of a. -; input: -; a = PLAY_AREA_* of location to check -CheckIfCardHasGrassEnergyAttached: ; 2cc0a (b:4c0a) - or CARD_LOCATION_PLAY_AREA - ld e, a - - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop - ld a, [hl] - cp e - jr nz, .next - push de - push hl - ld a, l - call GetCardIDFromDeckIndex - call GetCardType - pop hl - pop de - cp TYPE_ENERGY_GRASS - jr z, .no_carry -.next - inc l - ld a, l - cp DECK_SIZE - jr c, .loop - scf - ret -.no_carry - ld a, l - or a - ret - -GrimerMinimizeEffect: ; 2cc30 (b:4c30) - ld a, SUBSTATUS1_REDUCE_BY_20 - call ApplySubstatus1ToDefendingCard - ret - -ToxicGasEffect: ; 2cc36 (b:4c36) - scf - ret - -Sludge_AIEffect: ; 2cc38 (b:4c38) - ld a, 5 - lb de, 0, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -; returns carry if no cards in Deck -; or if Play Area is full already. -BellsproutCallForFamily_CheckDeckAndPlayArea: ; 2cc40 (b:4c40) - call CheckIfDeckIsEmpty - ret c ; return if no cards in deck - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, NoSpaceOnTheBenchText - cp MAX_PLAY_AREA_POKEMON - ccf - ret - -BellsproutCallForFamily_PlayerSelectEffect: ; 2cc50 (b:4c50) - ld a, $ff - ldh [hTemp_ffa0], a - - call CreateDeckCardList - ldtx hl, ChooseABellsproutFromDeckText - ldtx bc, BellsproutText - lb de, SEARCHEFFECT_CARD_ID, BELLSPROUT - call LookForCardsInDeck - ret c - -; draw Deck list interface and print text - bank1call Func_5591 - ldtx hl, ChooseABellsproutText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText - -.loop - bank1call DisplayCardList - jr c, .pressed_b - call GetCardIDFromDeckIndex - ld bc, BELLSPROUT - call CompareDEtoBC - jr nz, .play_sfx - -; Bellsprout was selected - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - or a - ret - -.play_sfx - ; play SFX and loop back - call Func_3794 - jr .loop - -.pressed_b -; figure if Player can exit the screen without selecting, -; that is, if the Deck has no Bellsprout card. - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop_b_press - ld a, [hl] - cp CARD_LOCATION_DECK - jr nz, .next - ld a, l - call GetCardIDFromDeckIndex - ld bc, BELLSPROUT - call CompareDEtoBC - jr z, .play_sfx ; found Bellsprout, go back to top loop -.next - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_b_press - -; no Bellsprout in Deck, can safely exit screen - ld a, $ff - ldh [hTemp_ffa0], a - or a - ret - -BellsproutCallForFamily_AISelectEffect: ; 2ccad (b:4cad) - call CreateDeckCardList - ld hl, wDuelTempList -.loop_deck - ld a, [hli] - ldh [hTemp_ffa0], a - cp $ff - ret z ; no Bellsprout - call GetCardIDFromDeckIndex - ld a, e - cp BELLSPROUT - jr nz, .loop_deck - ret ; Bellsprout found - -BellsproutCallForFamily_PutInPlayAreaEffect: ; 2ccc2 (b:4cc2) - ldh a, [hTemp_ffa0] - cp $ff - jr z, .shuffle - call SearchCardInDeckAndAddToHand - call AddCardToHand - call PutHandPokemonCardInPlayArea - call IsPlayerTurn - jr c, .shuffle - ldh a, [hTemp_ffa0] - ldtx hl, PlacedOnTheBenchText - bank1call DisplayCardDetailScreen -.shuffle - call Func_2c0bd - ret - -WeezingSmog_AIEffect: ; 2cce2 (b:4ce2) - ld a, 5 - lb de, 0, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -WeezingSelfdestructEffect: ; 2ccea (b:4cea) - ld a, 60 - call DealRecoilDamageToSelf - ld a, $01 - ld [wIsDamageToSelf], a - ld a, 10 - call DealDamageToAllBenchedPokemon - call SwapTurn - xor a - ld [wIsDamageToSelf], a - ld a, 10 - call DealDamageToAllBenchedPokemon - call SwapTurn - ret - -Shift_OncePerTurnCheck: ; 2cd09 (b:4d09) - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - and USED_PKMN_POWER_THIS_TURN - jr nz, .already_used - ldh a, [hTempPlayAreaLocation_ff9d] - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - ret -.already_used - ldtx hl, OnlyOncePerTurnText - scf - ret - -Shift_PlayerSelectEffect: ; 2cd21 (b:4d21) - ldtx hl, ChoosePokemonWishToColorChangeText - ldh a, [hTemp_ffa0] - or $80 - call HandleColorChangeScreen - ldh [hAIPkmnPowerEffectParam], a - ret c ; cancelled - -; check whether the color selected is valid - ; look in Turn Duelist's Play Area - call .CheckColorInPlayArea - ret nc - ; look in NonTurn Duelist's Play Area - call SwapTurn - call .CheckColorInPlayArea - call SwapTurn - ret nc - ; not found in either Duelist's Play Area - ldtx hl, UnableToSelectText - call DrawWideTextBox_WaitForInput - jr Shift_PlayerSelectEffect ; loop back to start - -; checks in input color in a exists in Turn Duelist's Play Area -; returns carry if not found. -.CheckColorInPlayArea: ; 2cd44 (b:4d44) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld c, a - ld b, PLAY_AREA_ARENA -.loop_play_area - push bc - ld a, b - call GetPlayAreaCardColor - pop bc - ld hl, hAIPkmnPowerEffectParam - cp [hl] - ret z ; found - inc b - dec c - jr nz, .loop_play_area - ; not found - scf - ret - -Shift_ChangeColorEffect: ; 2cd5d (b:4d5d) - ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - - ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - set USED_PKMN_POWER_THIS_TURN_F, [hl] - - ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_CHANGED_TYPE - ld l, a - ldh a, [hAIPkmnPowerEffectParam] - or HAS_CHANGED_COLOR - ld [hl], a - call LoadCardNameAndInputColor - ldtx hl, ChangedTheColorOfText - call DrawWideTextBox_WaitForInput - ret - -VenomPowder_AIEffect: ; 2cd84 (b:4d84) - ld a, 5 - lb de, 0, 10 - jp UpdateExpectedAIDamage - -VenomPowder_PoisonConfusion50PercentEffect: ; 2cd8c (b:4d8c) - ldtx de, VenomPowderCheckText - call TossCoin_BankB - ret nc ; return if tails - -; heads - call PoisonEffect - call ConfusionEffect - ret c - ld a, CONFUSED | POISONED - ld [wNoEffectFromWhichStatus], a - ret - -TangelaPoisonPowder_AIEffect: ; 2cda0 (b:4da0) - ld a, 5 - lb de, 0, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -Heal_OncePerTurnCheck: ; 2cda8 (b:4da8) - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - and USED_PKMN_POWER_THIS_TURN - jr nz, .already_used - - call CheckIfPlayAreaHasAnyDamage - ldtx hl, NoPokemonWithDamageCountersText - ret c ; no damage counters to heal - - ldh a, [hTempPlayAreaLocation_ff9d] - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - ret - -.already_used - ldtx hl, OnlyOncePerTurnText - scf - ret - -Heal_RemoveDamageEffect: ; 2cdc7 (b:4dc7) - ldtx de, IfHeadsHealIsSuccessfulText - call TossCoin_BankB - ldh [hAIPkmnPowerEffectParam], a - jr nc, .done - - ld a, DUELVARS_DUELIST_TYPE - call GetTurnDuelistVariable - cp DUELIST_TYPE_LINK_OPP - jr z, .link_opp - and DUELIST_TYPE_AI_OPP - jr nz, .done - -; player - ldtx hl, ChoosePkmnToRemoveDamageCounterText - call DrawWideTextBox_WaitForInput - bank1call HasAlivePokemonInPlayArea -.loop_input - bank1call OpenPlayAreaScreenForSelection - jr c, .loop_input - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hPlayAreaEffectTarget], a - ld e, a - call GetCardDamageAndMaxHP - or a - jr z, .loop_input ; has no damage counters - ldh a, [hTempPlayAreaLocation_ff9d] - call SerialSend8Bytes - jr .done - -.link_opp - call SerialRecv8Bytes - ldh [hPlayAreaEffectTarget], a - ; fallthrough - -.done -; flag Pkmn Power as being used regardless of coin outcome - ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - set USED_PKMN_POWER_THIS_TURN_F, [hl] - ldh a, [hAIPkmnPowerEffectParam] - or a - ret z ; return if coin was tails - - ldh a, [hPlayAreaEffectTarget] - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - add 10 ; remove 1 damage counter - ld [hl], a - ldh a, [hPlayAreaEffectTarget] - call Func_2c10b - call ExchangeRNG - ret - -PetalDance_AIEffect: ; 2ce23 (b:4e23) - ld a, 120 / 2 - lb de, 0, 120 - jp SetExpectedAIDamage - -PetalDance_MultiplierEffect: ; 2ce2b (b:4e2b) - ld hl, 40 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 3 - call TossCoinATimes_BankB - add a - add a - call ATimes10 - ; a = 4 * 10 * heads - call SetDefiniteDamage - call SwapTurn - call ConfusionEffect - call SwapTurn - ret - -PoisonWhip_AIEffect: ; 2ce4b (b:4e4b) - ld a, 10 - lb de, 10, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -SolarPower_CheckUse: ; 2ce53 (b:4e53) - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - and USED_PKMN_POWER_THIS_TURN - jr nz, .already_used - - ldh a, [hTempPlayAreaLocation_ff9d] - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - ret c ; can't use PKMN due to status or Toxic Gas - -; return carry if none of the Arena cards have status conditions - ld a, DUELVARS_ARENA_CARD_STATUS - call GetTurnDuelistVariable - or a - jr nz, .has_status - ld a, DUELVARS_ARENA_CARD_STATUS - call GetNonTurnDuelistVariable - or a - jr z, .no_status -.has_status - or a - ret -.already_used - ldtx hl, OnlyOncePerTurnText - scf - ret -.no_status - ldtx hl, NotAffectedByPoisonSleepParalysisOrConfusionText - scf - ret - -SolarPower_RemoveStatusEffect: ; 2ce82 (b:4e82) - ld a, ATK_ANIM_HEAL_BOTH_SIDES - ld [wLoadedAttackAnimation], a - bank1call Func_7415 - ldh a, [hTempPlayAreaLocation_ff9d] - ld b, a - ld c, $00 - ldh a, [hWhoseTurn] - ld h, a - bank1call PlayAttackAnimation - bank1call WaitAttackAnimation - - ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - set USED_PKMN_POWER_THIS_TURN_F, [hl] - ld l, DUELVARS_ARENA_CARD_STATUS - ld [hl], NO_STATUS - - ld a, DUELVARS_ARENA_CARD_STATUS - call GetNonTurnDuelistVariable - ld [hl], NO_STATUS - bank1call DrawDuelHUDs - ret - -VenusaurMegaDrainEffect: ; 2ceb0 (b:4eb0) - ld hl, wDealtDamage - ld a, [hli] - ld h, [hl] - ld l, a - srl h - rr l - bit 0, l - jr z, .rounded - ; round up to nearest 10 - ld de, 10 / 2 - add hl, de -.rounded - ld e, l - ld d, h - call ApplyAndAnimateHPRecovery - ret - -; applies the damage bonus for attacks that get bonus -; from extra Water energy cards. -; this bonus is always 10 more damage for each extra Water energy -; and is always capped at a maximum of 20 damage. -; input: -; b = number of Water energy cards needed for paying Energy Cost -; c = number of colorless energy cards needed for paying Energy Cost -ApplyExtraWaterEnergyDamageBonus: ; 2cec8 (b:4ec8) - ld a, [wMetronomeEnergyCost] - or a - jr z, .not_metronome - ld c, a ; amount of colorless needed for Metronome - ld b, 0 ; no Water energy needed for Metronome - -.not_metronome - push bc - ldh a, [hTempPlayAreaLocation_ff9d] - ld e, a - call GetPlayAreaCardAttachedEnergies - pop bc - - ld hl, wAttachedEnergies + WATER - ld a, c - or a - jr z, .check_bonus ; is Energy cost all water energy? - - ; it's not, so we need to remove the - ; Water energy cards from calculations - ; if they pay for colorless instead. - ld a, [wTotalAttachedEnergies] - cp [hl] - jr nz, .check_bonus ; skip if at least 1 non-Water energy attached - - ; Water is the only energy color attached - ld a, c - add b - ld b, a - ; b += c - -.check_bonus - ld a, [hl] - sub b - jr c, .skip_bonus ; is water energy < b? - jr z, .skip_bonus ; is water energy == b? - -; a holds number of water energy not payed for energy cost - cp 3 - jr c, .less_than_3 - ld a, 2 ; cap this to 2 for bonus effect -.less_than_3 - call ATimes10 - call AddToDamage ; add 10 * a to damage - -.skip_bonus - ld a, [wDamage] - ld [wAIMinDamage], a - ld [wAIMaxDamage], a - ret - -OmastarWaterGunEffect: ; 2cf05 (b:4f05) - lb bc, 1, 1 - jr ApplyExtraWaterEnergyDamageBonus - -OmastarSpikeCannon_AIEffect: ; 2cf0a (b:4f0a) - ld a, 60 / 2 - lb de, 0, 60 - jp SetExpectedAIDamage - -OmastarSpikeCannon_MultiplierEffect: ; 2cf12 (b:4f12) - ld hl, 30 - call LoadTxRam3 - ld a, 2 - ldtx de, DamageCheckIfHeadsXDamageText - call TossCoinATimes_BankB - ld e, a - add a - add e - call ATimes10 - call SetDefiniteDamage ; 3 * 10 * heads - ret - -ClairvoyanceEffect: ; 2cf2a (b:4f2a) - scf - ret - -OmanyteWaterGunEffect: ; 2cf2c (b:4f2c) - lb bc, 1, 0 - jp ApplyExtraWaterEnergyDamageBonus - -WartortleWithdrawEffect: ; 2cf32 (b:4f32) - ldtx de, IfHeadsNoDamageNextTurnText - call TossCoin_BankB - jp nc, SetWasUnsuccessful - ld a, ATK_ANIM_PROTECT - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS1_NO_DAMAGE_10 - call ApplySubstatus1ToDefendingCard - ret - -RainDanceEffect: ; 2cf46 (b:4f46) - scf - ret - -HydroPumpEffect: ; 2cf48 (b:4f48) - lb bc, 3, 0 - jp ApplyExtraWaterEnergyDamageBonus - -KinglerFlail_AIEffect: ; 2cf4e (b:4f4e) - call KinglerFlail_HPCheck - jp SetDefiniteAIDamage - -KinglerFlail_HPCheck: ; 2cf54 (b:4f54) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - call SetDefiniteDamage - ret - -; returns carry if no cards in Deck -; or if Play Area is full already. -KrabbyCallForFamily_CheckDeckAndPlayArea: ; 2cf5d (b:4f5d) - call CheckIfDeckIsEmpty - ret c ; return if no cards in deck - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, NoSpaceOnTheBenchText - cp MAX_PLAY_AREA_POKEMON - ccf - ret - -KrabbyCallForFamily_PlayerSelectEffect: ; 2cf6d (b:4f6d) - ld a, $ff - ldh [hTemp_ffa0], a - - call CreateDeckCardList - ldtx hl, ChooseAKrabbyFromDeckText - ldtx bc, KrabbyText - lb de, SEARCHEFFECT_CARD_ID, KRABBY - call LookForCardsInDeck - ret c - -; draw Deck list interface and print text - bank1call Func_5591 - ldtx hl, ChooseAKrabbyText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText - -.loop - bank1call DisplayCardList - jr c, .pressed_b - call GetCardIDFromDeckIndex - ld bc, KRABBY - call CompareDEtoBC - jr nz, .play_sfx - -; Krabby was selected - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - or a - ret - -.play_sfx - ; play SFX and loop back - call Func_3794 - jr .loop - -.pressed_b -; figure if Player can exit the screen without selecting, -; that is, if the Deck has no Krabby card. - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop_b_press - ld a, [hl] - cp CARD_LOCATION_DECK - jr nz, .next - ld a, l - call GetCardIDFromDeckIndex - ld bc, KRABBY - call CompareDEtoBC - jr z, .play_sfx ; found Krabby, go back to top loop -.next - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_b_press - -; no Krabby in Deck, can safely exit screen - ld a, $ff - ldh [hTemp_ffa0], a - or a - ret - -KrabbyCallForFamily_AISelectEffect: ; 2cfdf (b:4fdf) - call CreateDeckCardList - ld hl, wDuelTempList -.loop_deck - ld a, [hli] - ldh [hTemp_ffa0], a - cp $ff - ret z ; no Krabby - call GetCardIDFromDeckIndex - ld a, e - cp KRABBY - jr nz, .loop_deck - ret ; Krabby found - -KrabbyCallForFamily_PutInPlayAreaEffect: ; 2cfca (b:4fca) - ldh a, [hTemp_ffa0] - cp $ff - jr z, .shuffle - call SearchCardInDeckAndAddToHand - call AddCardToHand - call PutHandPokemonCardInPlayArea - call IsPlayerTurn - jr c, .shuffle - ldh a, [hTemp_ffa0] - ldtx hl, PlacedOnTheBenchText - bank1call DisplayCardDetailScreen -.shuffle - call Func_2c0bd - ret - -MagikarpFlail_AIEffect: ; 2cfff (b:4fff) - call MagikarpFlail_HPCheck - jp SetDefiniteAIDamage - -MagikarpFlail_HPCheck: ; 2d005 (b:5005) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - call SetDefiniteDamage - ret - -HeadacheEffect: ; 2d00e (b:500e) - ld a, DUELVARS_ARENA_CARD_SUBSTATUS3 - call GetNonTurnDuelistVariable - set SUBSTATUS3_HEADACHE, [hl] - ret - -PsyduckFurySwipes_AIEffect: ; 2d016 (b:5016) - ld a, 30 / 2 - lb de, 0, 30 - jp SetExpectedAIDamage - -PsyduckFurySwipes_MultiplierEffect: ; 2d01e (b:501e) - ld hl, 10 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 3 - call TossCoinATimes_BankB - call ATimes10 - call SetDefiniteDamage - ret - -GolduckHyperBeam_PlayerSelectEffect: ; 2d033 (b:5033) - call SwapTurn - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ld a, [wTotalAttachedEnergies] - or a - jr z, .no_energy - -; draw Energy Card list screen - ldtx hl, ChooseDiscardEnergyCardFromOpponentText - call DrawWideTextBox_WaitForInput - xor a ; PLAY_AREA_ARENA - call CreateArenaOrBenchEnergyCardList - xor a ; PLAY_AREA_ARENA - bank1call DisplayEnergyDiscardScreen - -.loop_input - bank1call HandleEnergyDiscardMenuInput - jr c, .loop_input - - call SwapTurn - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a ; store selected card to discard - ret - -.no_energy - call SwapTurn - ld a, $ff - ldh [hTemp_ffa0], a - or a - ret - -GolduckHyperBeam_AISelectEffect: ; 2d065 (b:5065) - call AIPickEnergyCardToDiscardFromDefendingPokemon - ldh [hTemp_ffa0], a - ret - -GolduckHyperBeam_DiscardEffect: ; 2d06b (b:506b) - call HandleNoDamageOrEffect - ret c ; return if attack had no effect - - ; check if energy card was chosen to discard - ldh a, [hTemp_ffa0] - cp $ff - ret z ; return if none selected - - ; discard Defending card's energy - call SwapTurn - call PutCardInDiscardPile - ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT - call GetTurnDuelistVariable - ld [hl], LAST_TURN_EFFECT_DISCARD_ENERGY - call SwapTurn - ret - -SeadraWaterGunEffect: ; 2d085 (b:5085) - lb bc, 1, 1 - jp ApplyExtraWaterEnergyDamageBonus - -SeadraAgilityEffect: ; 2d08b (b:508b) - ldtx de, IfHeadsDoNotReceiveDamageOrEffectText - call TossCoin_BankB - ret nc ; return if tails - ld a, ATK_ANIM_AGILITY_PROTECT - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS1_AGILITY - call ApplySubstatus1ToDefendingCard - ret - -ShellderSupersonicEffect: ; 2d09d (b:509d) - call Confusion50PercentEffect - call nc, SetNoEffectFromStatus - ret - -HideInShellEffect: ; 2d0a4 (b:50a4) - ldtx de, IfHeadsNoDamageNextTurnText - call TossCoin_BankB - jp nc, SetWasUnsuccessful - ld a, ATK_ANIM_PROTECT - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS1_NO_DAMAGE_11 - call ApplySubstatus1ToDefendingCard - ret - -VaporeonQuickAttack_AIEffect: ; 2d0b8 (b:50b8) - ld a, (10 + 30) / 2 - lb de, 10, 30 - jp SetExpectedAIDamage - -VaporeonQuickAttack_DamageBoostEffect: ; 2d0c0 (b:50c0) - ld hl, 20 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsPlusDamageText - call TossCoin_BankB - ret nc ; return if tails - ld a, 20 - call AddToDamage - ret - -VaporeonWaterGunEffect: ; 2d0d3 (b:50d3) - lb bc, 2, 1 - jp ApplyExtraWaterEnergyDamageBonus - -; returns carry if Arena card has no Water Energy attached -; or if it doesn't have any damage counters. -StarmieRecover_CheckEnergyHP: ; 2d0d9 (b:50d9) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ld a, [wAttachedEnergies + WATER] - ldtx hl, NotEnoughWaterEnergyText - cp 1 - ret c ; return if not enough energy - call GetCardDamageAndMaxHP - ldtx hl, NoDamageCountersText - cp 10 - ret ; return carry if no damage - -StarmieRecover_PlayerSelectEffect: ; 2d0f0 (b:50f0) - ld a, TYPE_ENERGY_WATER - call CreateListOfEnergyAttachedToArena - xor a ; PLAY_AREA_ARENA - bank1call DisplayEnergyDiscardScreen -.loop_input - bank1call HandleEnergyDiscardMenuInput - jr c, .loop_input - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a ; store card chosen - ret - -StarmieRecover_AISelectEffect: ; 2d103 (b:5103) - ld a, TYPE_ENERGY_WATER - call CreateListOfEnergyAttachedToArena - ld a, [wDuelTempList] ; pick first card - ldh [hTemp_ffa0], a - ret - -StarmieRecover_DiscardEffect: ; 2d10e (b:510e) - ldh a, [hTemp_ffa0] - call PutCardInDiscardPile - ret - -StarmieRecover_HealEffect: ; 2d114 (b:5114) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - ld e, a ; all damage for recovery - ld d, 0 - call ApplyAndAnimateHPRecovery - ret - -SquirtleWithdrawEffect: ; 2d120 (b:5120) - ldtx de, IfHeadsNoDamageNextTurnText - call TossCoin_BankB - jp nc, SetWasUnsuccessful - ld a, ATK_ANIM_PROTECT - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS1_NO_DAMAGE_10 - call ApplySubstatus1ToDefendingCard - ret - -HorseaSmokescreenEffect: ; 2d134 (b:5134) - ld a, SUBSTATUS2_SMOKESCREEN - call ApplySubstatus2ToDefendingCard - ret - -TentacruelSupersonicEffect: ; 2d13a (b:513a) - call Confusion50PercentEffect - call nc, SetNoEffectFromStatus - ret - -JellyfishSting_AIEffect: ; 2d141 (b:5141) - ld a, 10 - lb de, 10, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -; returns carry if Defending Pokemon has no attacks -PoliwhirlAmnesia_CheckAttacks: ; 2d149 (b:5149) - call SwapTurn - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Atk1Category] - cp POKEMON_POWER - jr nz, .has_attack - ld hl, wLoadedCard2Atk2Name - ld a, [hli] - or [hl] - jr nz, .has_attack -; has no attack - call SwapTurn - ldtx hl, NoAttackMayBeChoosenText - scf - ret -.has_attack - call SwapTurn - or a - ret - -PoliwhirlAmnesia_PlayerSelectEffect: ; 2d16f (b:516f) - call PlayerPickAttackForAmnesia - ret - -PoliwhirlAmnesia_AISelectEffect: ; 2d173 (b:5173) - call AIPickAttackForAmnesia - ldh [hTemp_ffa0], a - ret - -PoliwhirlAmnesia_DisableEffect: ; 2d179 (b:5179) - call ApplyAmnesiaToAttack - ret - -PlayerPickAttackForAmnesia: ; 2d17d (b:517d) - ldtx hl, ChooseAttackOpponentWillNotBeAbleToUseText - call DrawWideTextBox_WaitForInput - call HandleDefendingPokemonAttackSelection - ld a, e - ldh [hTemp_ffa0], a - ret - -; applies the Amnesia effect on the defending Pokemon, -; for the attack index in hTemp_ffa0. -ApplyAmnesiaToAttack: ; 2d18a (b:518a) - ld a, SUBSTATUS2_AMNESIA - call ApplySubstatus2ToDefendingCard - ld a, [wNoDamageOrEffect] - or a - ret nz ; no effect - -; set selected attack as disabled - ld a, DUELVARS_ARENA_CARD_DISABLED_ATTACK_INDEX - call GetNonTurnDuelistVariable - ldh a, [hTemp_ffa0] - ld [hl], a - - ld l, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT - ld [hl], LAST_TURN_EFFECT_AMNESIA - - call IsPlayerTurn - ret c ; return if Player - -; the rest of the routine if for Opponent -; to announce which attack was used for Amnesia. - call SwapTurn - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - ld d, a - ldh a, [hTemp_ffa0] - ld e, a - call GetAttackName - call LoadTxRam2 - ldtx hl, WasChosenForTheEffectOfAmnesiaText - call DrawWideTextBox_WaitForInput - call SwapTurn - ret - -PoliwhirlDoubleslap_AIEffect: ; 2d1c0 (b:51c0) - ld a, 60 / 2 - lb de, 0, 60 - jp SetExpectedAIDamage - -PoliwhirlDoubleslap_MultiplierEffect: ; 2d1c8 (b:51c8) - ld hl, 30 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 2 - call TossCoinATimes_BankB - ld e, a - add a - add e - call ATimes10 - call SetDefiniteDamage - ret - -PoliwrathWaterGunEffect: ; 2d1e0 (b:51e0) - lb bc, 2, 1 - jp ApplyExtraWaterEnergyDamageBonus - -Whirlpool_PlayerSelectEffect: ; 2d1e6 (b:51e6) - call SwapTurn - xor a ; PLAY_AREA_ARENA - call CreateArenaOrBenchEnergyCardList - jr c, .no_energy - - ldtx hl, ChooseDiscardEnergyCardFromOpponentText - call DrawWideTextBox_WaitForInput - xor a ; PLAY_AREA_ARENA - bank1call DisplayEnergyDiscardScreen -.loop_input - bank1call HandleEnergyDiscardMenuInput - jr c, .loop_input - - call SwapTurn - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a ; store selected card to discard - ret - -.no_energy - call SwapTurn - ld a, $ff - ldh [hTemp_ffa0], a - ret - -Whirlpool_AISelectEffect: ; 2d20e (b:520e) - call AIPickEnergyCardToDiscardFromDefendingPokemon - ldh [hTemp_ffa0], a - ret - -Whirlpool_DiscardEffect: ; 2d214 (b:5214) - call HandleNoDamageOrEffect - ret c ; return if attack had no effect - ldh a, [hTemp_ffa0] - cp $ff - ret z ; return if none selected - - ; discard Defending card's energy - ; this doesn't update DUELVARS_ARENA_CARD_LAST_TURN_EFFECT - call SwapTurn - call PutCardInDiscardPile - ; ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT - ; call GetTurnDuelistVariable - ; ld [hl], LAST_TURN_EFFECT_DISCARD_ENERGY - call SwapTurn - ret - -PoliwagWaterGunEffect: ; 2d227 (b:5227) - lb bc, 1, 0 - jp ApplyExtraWaterEnergyDamageBonus - -ClampEffect: ; 2d22d (b:522d) - ld a, ATK_ANIM_HIT_EFFECT - ld [wLoadedAttackAnimation], a - ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText - call TossCoin_BankB - jp c, ParalysisEffect -; unsuccessful - xor a ; ATK_ANIM_NONE - ld [wLoadedAttackAnimation], a - call SetDefiniteDamage - call SetWasUnsuccessful - ret - -CloysterSpikeCannon_AIEffect: ; 2d246 (b:5246) - ld a, 60 / 2 - lb de, 0, 60 - jp SetExpectedAIDamage - -CloysterSpikeCannon_MultiplierEffect: ; 2d24e (b:524e) - ld hl, 30 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 2 - call TossCoinATimes_BankB - ld e, a - add a - add e - call ATimes10 - call SetDefiniteDamage - ret - -Blizzard_BenchDamage50PercentEffect: ; 2d266 (b:5266) - ldtx de, DamageToOppBenchIfHeadsDamageToYoursIfTailsText - call TossCoin_BankB - ldh [hTemp_ffa0], a ; store coin result - ret - -Blizzard_BenchDamageEffect: ; 2d26f (b:526f) - ldh a, [hTemp_ffa0] - or a - jr nz, .opp_bench - -; own bench - ld a, $01 - ld [wIsDamageToSelf], a - ld a, 10 - call DealDamageToAllBenchedPokemon - ret - -.opp_bench - call SwapTurn - ld a, 10 - call DealDamageToAllBenchedPokemon - call SwapTurn - ret - -; return carry if can use Cowardice -Cowardice_Check: ; 2d28b (b:528b) - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - ret c ; return if cannot use - - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, EffectNoPokemonOnTheBenchText - cp 2 - ret c ; return if no bench - - ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - ldtx hl, CannotBeUsedInTurnWhichWasPlayedText - and CAN_EVOLVE_THIS_TURN - scf - ret z ; return if was played this turn - - or a - ret - -Cowardice_PlayerSelectEffect: ; 2d2ae (b:52ae) - ldh a, [hTemp_ffa0] - or a - ret nz ; return if not Arena card - ldtx hl, SelectPokemonToPlaceInTheArenaText - call DrawWideTextBox_WaitForInput - bank1call HasAlivePokemonInBench - bank1call OpenPlayAreaScreenForSelection - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hAIPkmnPowerEffectParam], a - ret - -Cowardice_RemoveFromPlayAreaEffect: ; 2d2c3 (b:52c3) - ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - -; put card in Discard Pile temporarily, so that -; all cards attached are discarded as well. - push af - ldh a, [hTemp_ffa0] - ld e, a - call MovePlayAreaCardToDiscardPile - -; if card was in Arena, swap selected Bench -; Pokemon with Arena, otherwise skip. - ldh a, [hTemp_ffa0] - or a - jr nz, .skip_switch - ldh a, [hAIPkmnPowerEffectParam] - ld e, a - call SwapArenaWithBenchPokemon - -.skip_switch -; move card back to Hand from Discard Pile -; and adjust Play Area - pop af - call MoveDiscardPileCardToHand - call AddCardToHand - call ShiftAllPokemonToFirstPlayAreaSlots - - xor a - ld [wDuelDisplayedScreen], a - ret - -LaprasWaterGunEffect: ; 2d2eb (b:52eb) - lb bc, 1, 0 - jp ApplyExtraWaterEnergyDamageBonus - -Quickfreeze_InitialEffect: ; 2d2f1 (b:52f1) - scf - ret - -Quickfreeze_Paralysis50PercentEffect: ; 2d2f3 (b:52f3) - ldtx de, ParalysisCheckText - call TossCoin_BankB - jr c, .heads - -; tails - call SetWasUnsuccessful - bank1call DrawDuelMainScene - bank1call Func_1bca - call WaitForWideTextBoxInput - ret - -.heads - call ParalysisEffect - ldh a, [hTempPlayAreaLocation_ff9d] - ld b, a - ld c, $00 - ldh a, [hWhoseTurn] - ld h, a - bank1call PlayAttackAnimation - bank1call Func_741a - bank1call WaitAttackAnimation - bank1call Func_6df1 - bank1call DrawDuelHUDs - bank1call Func_1bca - call c, WaitForWideTextBoxInput - ret - -IceBreath_ZeroDamage: ; 2d329 (b:5329) - xor a - call SetDefiniteDamage - ret - -IceBreath_RandomPokemonDamageEffect: ; 2d32e (b:532e) - call SwapTurn - call PickRandomPlayAreaCard - ld b, a - ld de, 40 - call DealDamageToPlayAreaPokemon_RegularAnim - call SwapTurn - ret - -FocusEnergyEffect: ; 2d33f (b:533f) - ld a, [wTempTurnDuelistCardID] - cp VAPOREON1 - ret nz ; return if no Vaporeon1 - ld a, SUBSTATUS1_NEXT_TURN_DOUBLE_DAMAGE - call ApplySubstatus1ToDefendingCard - ret - -PlayerPickFireEnergyCardToDiscard: ; 2d34b (b:534b) - call CreateListOfFireEnergyAttachedToArena - xor a - bank1call DisplayEnergyDiscardScreen - bank1call HandleEnergyDiscardMenuInput - ldh a, [hTempCardIndex_ff98] - ldh [hTempList], a - ret - -AIPickFireEnergyCardToDiscard: ; 2d35a (b:535a) - call CreateListOfFireEnergyAttachedToArena - ld a, [wDuelTempList] - ldh [hTempList], a ; pick first in list - ret - -; returns carry if Arena card has no Fire Energy cards -ArcanineFlamethrower_CheckEnergy: ; 2d363 (b:5363) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ld a, [wAttachedEnergies] - ldtx hl, NotEnoughFireEnergyText - cp 1 - ret - -ArcanineFlamethrower_PlayerSelectEffect: ; 2d371 (b:5371) - call PlayerPickFireEnergyCardToDiscard - ret - -ArcanineFlamethrower_AISelectEffect: ; 2d375 (b:5375) - call AIPickFireEnergyCardToDiscard - ret - -ArcanineFlamethrower_DiscardEffect: ; 2d379 (b:5379) - ldh a, [hTempList] - call PutCardInDiscardPile - ret - -TakeDownEffect: ; 2d37f (b:537f) - ld a, 30 - call DealRecoilDamageToSelf - ret - -ArcanineQuickAttack_AIEffect: ; 2d385 (b:5385) - ld a, (10 + 30) / 2 - lb de, 10, 30 - jp SetExpectedAIDamage - -ArcanineQuickAttack_DamageBoostEffect: ; 2d38d (b:538d) - ld hl, 20 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsPlusDamageText - call TossCoin_BankB - ret nc ; return if tails - ld a, 20 - call AddToDamage - ret - -; return carry if has less than 2 Fire Energy cards -FlamesOfRage_CheckEnergy: ; 2d3a0 (b:53a0) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ld a, [wAttachedEnergies] - ldtx hl, NotEnoughFireEnergyText - cp 2 - ret - -FlamesOfRage_PlayerSelectEffect: ; 2d3ae (b:53ae) - ldtx hl, ChooseAndDiscard2FireEnergyCardsText - call DrawWideTextBox_WaitForInput - - xor a - ldh [hCurSelectionItem], a - call CreateListOfFireEnergyAttachedToArena - xor a - bank1call DisplayEnergyDiscardScreen -.loop_input - bank1call HandleEnergyDiscardMenuInput - ret c - call GetNextPositionInTempList - ldh a, [hTempCardIndex_ff98] - ld [hl], a - call RemoveCardFromDuelTempList - ldh a, [hCurSelectionItem] - cp 2 - ret nc ; return when 2 have been chosen - bank1call DisplayEnergyDiscardMenu - jr .loop_input - -FlamesOfRage_AISelectEffect: ; 2d3d5 (b:53d5) - call AIPickFireEnergyCardToDiscard - ld a, [wDuelTempList + 1] - ldh [hTempList + 1], a - ret - -FlamesOfRage_DiscardEffect: ; 2d3de (b:53de) - ldh a, [hTempList] - call PutCardInDiscardPile - ldh a, [hTempList + 1] - call PutCardInDiscardPile - ret - -FlamesOfRage_AIEffect: ; 2d3e9 (b:53e9) - call FlamesOfRage_DamageBoostEffect - jp SetDefiniteAIDamage - -FlamesOfRage_DamageBoostEffect: ; 2d3ef (b:53ef) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - call AddToDamage - ret - -RapidashStomp_AIEffect: ; 2d3f8 (b:53f8) - ld a, (20 + 30) / 2 - lb de, 20, 30 - jp SetExpectedAIDamage - -RapidashStomp_DamageBoostEffect: ; 2d400 (b:5400) - ld hl, 10 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsPlusDamageText - call TossCoin_BankB - ret nc ; return if tails - ld a, 10 - call AddToDamage - ret - -RapidashAgilityEffect: ; 2d413 (b:5413) - ldtx de, IfHeadsDoNotReceiveDamageOrEffectText - call TossCoin_BankB - ret nc ; return if tails - ld a, ATK_ANIM_AGILITY_PROTECT - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS1_AGILITY - call ApplySubstatus1ToDefendingCard - ret - -; returns carry if Opponent has no Pokemon in bench -NinetalesLure_CheckBench: ; 2d425 (b:5425) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - ldtx hl, EffectNoPokemonOnTheBenchText - cp 2 - ret - -NinetalesLure_PlayerSelectEffect: ; 2d430 (b:5430) - ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText - call DrawWideTextBox_WaitForInput - call SwapTurn - bank1call HasAlivePokemonInBench -.loop_input - bank1call OpenPlayAreaScreenForSelection - jr c, .loop_input - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - call SwapTurn - ret - -NinetalesLure_AISelectEffect: ; 2d449 (b:5449) - call GetBenchPokemonWithLowestHP - ldh [hTemp_ffa0], a - ret - -NinetalesLure_SwitchEffect: ; 2d44f (b:544f) - call SwapTurn - ldh a, [hTemp_ffa0] - ld e, a - call HandleNShieldAndTransparency - call nc, SwapArenaWithBenchPokemon - call SwapTurn - xor a - ld [wDuelDisplayedScreen], a - ret - -; return carry if no Fire energy cards -FireBlast_CheckEnergy: ; 2d463 (b:5463) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ldtx hl, NotEnoughFireEnergyText - ld a, [wAttachedEnergies] - cp 1 - ret - -FireBlast_PlayerSelectEffect: ; 2d471 (b:5471) - call PlayerPickFireEnergyCardToDiscard - ret - -FireBlast_AISelectEffect: ; 2d475 (b:5475) - call AIPickFireEnergyCardToDiscard - ret - -FireBlast_DiscardEffect: ; 2d479 (b:5479) - ldh a, [hTempList] - call PutCardInDiscardPile - ret - -; return carry if no Fire energy cards -Ember_CheckEnergy: ; 2d47f (b:547f) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ldtx hl, NotEnoughFireEnergyText - ld a, [wAttachedEnergies] - cp 1 - ret - -Ember_PlayerSelectEffect: ; 2d48d (b:548d) - call PlayerPickFireEnergyCardToDiscard - ret - -Ember_AISelectEffect: ; 2d491 (b:5491) - call AIPickFireEnergyCardToDiscard - ret - -Ember_DiscardEffect: ; 2d495 (b:5495) - ldh a, [hTempList] - call PutCardInDiscardPile - ret - -; return carry if no Fire energy cards -Wildfire_CheckEnergy: ; 2d49b (b:549b) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ldtx hl, NotEnoughFireEnergyText - ld a, [wAttachedEnergies] - cp 1 - ret - -Wildfire_PlayerSelectEffect: ; 2d4a9 (b:54a9) - ldtx hl, DiscardOppDeckAsManyFireEnergyCardsText - call DrawWideTextBox_WaitForInput - - xor a - ldh [hCurSelectionItem], a - call CreateListOfFireEnergyAttachedToArena - xor a - bank1call DisplayEnergyDiscardScreen - -; show list to Player and for each card selected to discard, -; just increase a counter and store it. -; this will be the output used by Wildfire_DiscardEnergyEffect. - xor a - ld [wEnergyDiscardMenuDenominator], a -.loop - ldh a, [hCurSelectionItem] - ld [wEnergyDiscardMenuNumerator], a - bank1call HandleEnergyDiscardMenuInput - jr c, .done - ld hl, hCurSelectionItem - inc [hl] - call RemoveCardFromDuelTempList - jr c, .done - bank1call DisplayEnergyDiscardMenu - jr .loop - -.done -; return carry if no cards were discarded -; output the result in hTemp_ffa0 - ldh a, [hCurSelectionItem] - ldh [hTemp_ffa0], a - or a - ret nz - scf - ret - -Wildfire_AISelectEffect: ; 2d4dd (b:54dd) -; AI always chooses 0 cards to discard - xor a - ldh [hTempList], a - ret - -Wildfire_DiscardEnergyEffect: ; 2d4e1 (b:54e1) - call CreateListOfFireEnergyAttachedToArena - ldh a, [hTemp_ffa0] - or a - ret z ; no cards to discard - -; discard cards from wDuelTempList equal to the number -; of cards that were input in hTemp_ffa0. -; these are all the Fire Energy cards attached to Arena card -; so it will discard the cards in order, regardless -; of the actual order that was selected by Player. - ld c, a - ld hl, wDuelTempList -.loop_discard - ld a, [hli] - call PutCardInDiscardPile - dec c - jr nz, .loop_discard - ret - -Wildfire_DiscardDeckEffect: ; 2d4f4 (b:54f4) - ldh a, [hTemp_ffa0] - ld c, a - ld b, $00 - call SwapTurn - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetTurnDuelistVariable - ld a, DECK_SIZE - sub [hl] - cp c - jr nc, .start_discard - ; only discard number of cards that are left in deck - ld c, a - -.start_discard - push bc - inc c - jr .check_remaining - -.loop - ; discard top card from deck - call DrawCardFromDeck - call nc, PutCardInDiscardPile -.check_remaining - dec c - jr nz, .loop - - pop hl - call LoadTxRam3 - ldtx hl, DiscardedCardsFromDeckText - call DrawWideTextBox_PrintText - call SwapTurn - ret - -Moltres1DiveBomb_AIEffect: ; 2d523 (b:5523) - ld a, 80 / 2 - lb de, 0, 80 - jp SetExpectedAIDamage - -Moltres1DiveBomb_Success50PercentEffect: ; 2d52b (b:552b) - ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText - call TossCoin_BankB - jr c, .heads -; tails - xor a - call SetDefiniteDamage - call SetWasUnsuccessful - ret -.heads - ld a, ATK_ANIM_DIVE_BOMB - ld [wLoadedAttackAnimation], a - ret - -FlareonQuickAttack_AIEffect: ; 2d541 (b:5541) - ld a, (10 + 30) / 2 - lb de, 10, 30 - jp SetExpectedAIDamage - -FlareonQuickAttack_DamageBoostEffect: ; 2d549 (b:5549) - ld hl, 20 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsPlusDamageText - call TossCoin_BankB - ret nc ; return if tails - ld a, 20 - call AddToDamage - ret - -; return carry if no Fire Energy attached -FlareonFlamethrower_CheckEnergy: ; 2d55c (b:555c) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ldtx hl, NotEnoughFireEnergyText - ld a, [wAttachedEnergies] - cp 1 - ret - -FlareonFlamethrower_PlayerSelectEffect: ; 2d56a (b:556a) - call PlayerPickFireEnergyCardToDiscard - ret - -FlareonFlamethrower_AISelectEffect: ; 2d56e (b:556e) - call AIPickFireEnergyCardToDiscard - ret - -FlareonFlamethrower_DiscardEffect: ; 2d572 (b:5572) - ldh a, [hTempList] - call PutCardInDiscardPile - ret - -; return carry if no Fire Energy attached -MagmarFlamethrower_CheckEnergy: ; 2d578 (b:5578) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ldtx hl, NotEnoughFireEnergyText - ld a, [wAttachedEnergies] - cp 1 - ret - -MagmarFlamethrower_PlayerSelectEffect: ; 2d586 (b:5586) - call PlayerPickFireEnergyCardToDiscard - ret - -MagmarFlamethrower_AISelectEffect: ; 2d58a (b:558a) - call AIPickFireEnergyCardToDiscard - ret - -MagmarFlamethrower_DiscardEffect: ; 2d58e (b:558e) - ldh a, [hTempList] - call PutCardInDiscardPile - ret - -MagmarSmokescreenEffect: ; 2d594 (b:5594) - ld a, SUBSTATUS2_SMOKESCREEN - call ApplySubstatus2ToDefendingCard - ret - -MagmarSmog_AIEffect: ; 2d59a (b:559a) - ld a, 5 - lb de, 0, 10 - jp UpdateExpectedAIDamage_AccountForPoison - -; return carry if no Fire Energy attached -CharmeleonFlamethrower_CheckEnergy: ; 2d5a2 (b:55a2) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ldtx hl, NotEnoughFireEnergyText - ld a, [wAttachedEnergies] - cp 1 - ret - -CharmeleonFlamethrower_PlayerSelectEffect: ; 2d5b0 (b:55b0) - call PlayerPickFireEnergyCardToDiscard - ret - -CharmeleonFlamethrower_AISelectEffect: ; 2d5b4 (b:55b4) - call AIPickFireEnergyCardToDiscard - ret - -CharmeleonFlamethrower_DiscardEffect: ; 2d5b8 (b:55b8) - ldh a, [hTempList] - call PutCardInDiscardPile - ret - -EnergyBurnEffect: ; 2d5be (b:55be) - scf - ret - -; return carry if has less than 2 Fire Energy cards -FireSpin_CheckEnergy: ; 2d5c0 (b:55c0) - xor a ; PLAY_AREA_ARENA - call CreateArenaOrBenchEnergyCardList - call CountCardsInDuelTempList - ldtx hl, NotEnoughEnergyCardsText - cp 2 - ret - -FireSpin_PlayerSelectEffect: ; 2d5cd (b:55cd) - ldtx hl, ChooseAndDiscard2EnergyCardsText - call DrawWideTextBox_WaitForInput - - xor a - ldh [hCurSelectionItem], a - xor a - call CreateArenaOrBenchEnergyCardList - call SortCardsInDuelTempListByID - xor a - bank1call DisplayEnergyDiscardScreen - - ld a, 2 - ld [wEnergyDiscardMenuDenominator], a -.loop_input - bank1call HandleEnergyDiscardMenuInput - ret c - call GetNextPositionInTempList - ldh a, [hTempCardIndex_ff98] - ld [hl], a - ld hl, wEnergyDiscardMenuNumerator - inc [hl] - ldh a, [hCurSelectionItem] - cp 2 - jr nc, .done - ldh a, [hTempCardIndex_ff98] - call RemoveCardFromDuelTempList - bank1call DisplayEnergyDiscardMenu - jr .loop_input -.done -; return when 2 have been chosen - or a - ret - -FireSpin_AISelectEffect: ; 2d606 (b:5606) - xor a ; PLAY_AREA_ARENA - call CreateArenaOrBenchEnergyCardList - ld hl, wDuelTempList - ld a, [hli] - ldh [hTempList], a - ld a, [hl] - ldh [hTempList + 1], a - ret - -FireSpin_DiscardEffect: ; 2d614 (b:5614) - ld hl, hTempList - ld a, [hli] - call PutCardInDiscardPile - ld a, [hli] - call PutCardInDiscardPile - ret - -; returns carry if Pkmn Power cannot be used -; or if Arena card is not Charizard. -; this is unused. -EnergyBurnCheck_Unreferenced: ; 2d620 (b:5620) - xor a - bank1call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - ret c - ld a, DUELVARS_ARENA_CARD - push de - call GetTurnDuelistVariable - call GetCardIDFromDeckIndex - ld a, e - pop de - cp CHARIZARD - jr nz, .not_charizard - or a - ret -.not_charizard - scf - ret - -FlareonRage_AIEffect: ; 2d638 (b:5638) - call FlareonRage_DamageBoostEffect - jp SetDefiniteAIDamage - -FlareonRage_DamageBoostEffect: ; 2d63e (b:563e) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - call AddToDamage - ret - -MixUpEffect: ; 2d647 (b:5647) - call SwapTurn - call CreateHandCardList - call SortCardsInDuelTempListByID - -; first go through Hand to place -; all Pkmn cards in it in the Deck. - ld hl, wDuelTempList - ld c, 0 -.loop_hand - ld a, [hl] - cp $ff - jr z, .done_hand - call .CheckIfCardIsPkmnCard - jr nc, .next_hand - ; found Pkmn card, place in deck - inc c - ld a, [hl] - call RemoveCardFromHand - call ReturnCardToDeck -.next_hand - inc hl - jr .loop_hand - -.done_hand - ld a, c - ldh [hCurSelectionItem], a - push bc - ldtx hl, ThePkmnCardsInHandAndDeckWereShuffledText - call DrawWideTextBox_WaitForInput - - call Func_2c0bd - call CreateDeckCardList - pop bc - ldh a, [hCurSelectionItem] - or a - jr z, .done ; if no cards were removed from Hand, return - -; c holds the number of cards that were placed in the Deck. -; now pick Pkmn cards from the Deck to place in Hand. - ld hl, wDuelTempList -.loop_deck - ld a, [hl] - call .CheckIfCardIsPkmnCard - jr nc, .next_deck - dec c - ld a, [hl] - call SearchCardInDeckAndAddToHand - call AddCardToHand -.next_deck - inc hl - ld a, c - or a - jr nz, .loop_deck -.done - call SwapTurn - ret - -; returns carry if card index in a is Pkmn card -.CheckIfCardIsPkmnCard: ; 2d69a (b:569a) - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - ret - -DancingEmbers_AIEffect: ; 2d6a3 (b:56a3) - ld a, 80 / 2 - lb de, 0, 80 - jp SetExpectedAIDamage - -DancingEmbers_MultiplierEffect: ; 2d6ab (b:56ab) - ld hl, 10 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 8 - call TossCoinATimes_BankB - call ATimes10 - call SetDefiniteDamage - ret - -Firegiver_InitialEffect: ; 2d6c0 (b:56c0) - scf - ret - -Firegiver_AddToHandEffect: ; 2d6c2 (b:56c2) -; fill wDuelTempList with all Fire Energy card -; deck indices that are in the Deck. - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable - ld de, wDuelTempList - ld c, 0 -.loop_cards - ld a, [hl] - cp CARD_LOCATION_DECK - jr nz, .next - push hl - push de - ld a, l - call GetCardIDFromDeckIndex - call GetCardType - pop de - pop hl - cp TYPE_ENERGY_FIRE - jr nz, .next - ld a, l - ld [de], a - inc de - inc c -.next - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_cards - ld a, $ff - ld [de], a - -; check how many were found - ld a, c - or a - jr nz, .found - ; return if none found - ldtx hl, ThereWasNoFireEnergyText - call DrawWideTextBox_WaitForInput - call Func_2c0bd - ret - -.found -; pick a random number between 1 and 4, -; up to the maximum number of Fire Energy -; cards that were found. - ld a, 4 - call Random - inc a - cp c - jr c, .ok - ld a, c - -.ok - ldh [hCurSelectionItem], a -; load correct attack animation depending -; on what side the effect is from. - ld d, ATK_ANIM_FIREGIVER_PLAYER - ld a, [wDuelistType] - cp DUELIST_TYPE_PLAYER - jr z, .player_1 -; opponent - ld d, ATK_ANIM_FIREGIVER_OPP -.player_1 - ld a, d - ld [wLoadedAttackAnimation], a - -; start loop for adding Energy cards to hand - ldh a, [hCurSelectionItem] - ld c, a - ld hl, wDuelTempList -.loop_energy - push hl - push bc - ld bc, $0 - ldh a, [hWhoseTurn] - ld h, a - bank1call PlayAttackAnimation - bank1call WaitAttackAnimation - -; load correct coordinates to update the number of cards -; in hand and deck during animation. - lb bc, 18, 7 ; x, y for hand number - ld e, 3 ; y for deck number - ld a, [wLoadedAttackAnimation] - cp ATK_ANIM_FIREGIVER_PLAYER - jr z, .player_2 - lb bc, 4, 5 ; x, y for hand number - ld e, 10 ; y for deck number - -.player_2 -; update and print number of cards in hand - ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND - call GetTurnDuelistVariable - inc a - bank1call WriteTwoDigitNumberInTxSymbolFormat -; update and print number of cards in deck - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetTurnDuelistVariable - ld a, DECK_SIZE - 1 - sub [hl] - ld c, e - bank1call WriteTwoDigitNumberInTxSymbolFormat - -; load Fire Energy card index and add to hand - pop bc - pop hl - ld a, [hli] - call SearchCardInDeckAndAddToHand - call AddCardToHand - dec c - jr nz, .loop_energy - -; load the number of cards added to hand and print text - ldh a, [hCurSelectionItem] - ld l, a - ld h, $00 - call LoadTxRam3 - ldtx hl, DrewFireEnergyFromTheHandText - call DrawWideTextBox_WaitForInput - call Func_2c0bd - ret - -Moltres2DiveBomb_AIEffect: ; 2d76e (b:576e) - ld a, 70 / 2 - lb de, 0, 70 - jp SetExpectedAIDamage - -Moltres2DiveBomb_Success50PercentEffect: ; 2d776 (b:5776) - ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText - call TossCoin_BankB - jr c, .heads -; tails - xor a - call SetDefiniteDamage - call SetWasUnsuccessful - ret -.heads - ld a, ATK_ANIM_DIVE_BOMB - ld [wLoadedAttackAnimation], a - ret - -; output in de the number of energy cards -; attached to the Defending Pokemon times 10. -; used for attacks that deal 10x number of energy -; cards attached to the Defending card. -GetEnergyAttachedMultiplierDamage: ; 2d78c (b:578c) - call SwapTurn - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable - - ld c, 0 -.loop - ld a, [hl] - cp CARD_LOCATION_ARENA - jr nz, .next - ; is in Arena - ld a, l - call GetCardIDFromDeckIndex - call GetCardType - and TYPE_ENERGY - jr z, .next - ; is Energy attached to Arena card - inc c -.next - inc l - ld a, l - cp DECK_SIZE - jr c, .loop - - call SwapTurn - ld l, c - ld h, $00 - ld b, $00 - add hl, hl ; hl = 2 * c - add hl, hl ; hl = 4 * c - add hl, bc ; hl = 5 * c - add hl, hl ; hl = 10 * c - ld e, l - ld d, h - ret - -; draws list of Energy Cards in Discard Pile -; for Player to select from. -; the Player can select up to 2 cards from the list. -; these cards are given in $ff-terminated list -; in hTempList. -HandleEnergyCardsInDiscardPileSelection: ; 2d7bc (b:57bc) - push hl - xor a - ldh [hCurSelectionItem], a - call CreateEnergyCardListFromDiscardPile_AllEnergy - pop hl - jr c, .finish - - call DrawWideTextBox_WaitForInput -.loop -; draws Discard Pile screen and textbox, -; and handles Player input - bank1call InitAndDrawCardListScreenLayout - ldtx hl, ChooseAnEnergyCardText - ldtx de, PlayerDiscardPileText - bank1call SetCardListHeaderText - bank1call DisplayCardList - jr nc, .selected - -; Player is trying to exit screen, -; but can select up to 2 cards total. -; prompt Player to confirm exiting screen. - ld a, 2 - call AskWhetherToQuitSelectingCards - jr c, .loop - jr .finish - -.selected -; a card was selected, so add it to list - call GetNextPositionInTempList - ldh a, [hTempCardIndex_ff98] - ld [hl], a - call RemoveCardFromDuelTempList - or a - jr z, .finish ; no more cards? - ldh a, [hCurSelectionItem] - cp 2 - jr c, .loop ; already selected 2 cards? - -.finish -; place terminating byte on list - call GetNextPositionInTempList - ld [hl], $ff - or a - ret - -; returns carry if Pkmn Power cannot be used, and -; sets the correct text in hl for failure. -Curse_CheckDamageAndBench: ; 2d7fc (b:57fc) - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - -; fail if Pkmn Power has already been used - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - ldtx hl, OnlyOncePerTurnText - and USED_PKMN_POWER_THIS_TURN - jr nz, .set_carry - -; fail if Opponent only has 1 Pokemon in Play Area - call SwapTurn - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - call SwapTurn - ldtx hl, CannotUseSinceTheresOnly1PkmnText - cp 2 - jr c, .set_carry - -; fail if Opponent has no damage counters - call SwapTurn - call CheckIfPlayAreaHasAnyDamage - call SwapTurn - ldtx hl, NoPokemonWithDamageCountersText - jr c, .set_carry - -; return carry if Pkmn Power cannot be used due -; to Toxic Gas or status. - ldh a, [hTempPlayAreaLocation_ff9d] - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - ret - -.set_carry - scf - ret - -Curse_PlayerSelectEffect: ; 2d834 (b:5834) - ldtx hl, ProcedureForCurseText - bank1call DrawWholeScreenTextBox - call SwapTurn - xor a - ldh [hCurSelectionItem], a - bank1call Func_61a1 -.start - bank1call PrintPlayAreaCardList_EnableLCD - push af - ldh a, [hCurSelectionItem] - ld hl, PlayAreaSelectionMenuParameters - call InitializeMenuParameters - pop af - ld [wNumMenuItems], a - -; first pick a target to take 1 damage counter from. -.loop_input_first - call DoFrame - call HandleMenuInput - jr nc, .loop_input_first - cp $ff - jr z, .cancel - ldh [hCurSelectionItem], a - ldh [hTempPlayAreaLocation_ffa1], a - call GetCardDamageAndMaxHP - or a - jr nz, .picked_first ; test if has damage - ; play sfx - call Func_3794 - jr .loop_input_first - -.picked_first -; give 10 HP to card selected, draw the scene, -; then immediately revert this. - ldh a, [hTempPlayAreaLocation_ffa1] - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - push af - push hl - add 10 - ld [hl], a - bank1call PrintPlayAreaCardList_EnableLCD - pop hl - pop af - ld [hl], a - -; draw damage counter on cursor - ldh a, [hTempPlayAreaLocation_ffa1] - ld b, SYM_HP_NOK - call DrawSymbolOnPlayAreaCursor - -; handle input to pick the target to receive the damage counter. -.loop_input_second - call DoFrame - call HandleMenuInput - jr nc, .loop_input_second - ldh [hPlayAreaEffectTarget], a - cp $ff - jr nz, .a_press ; was a pressed? - -; b press -; erase the damage counter symbol -; and loop back up again. - ldh a, [hTempPlayAreaLocation_ffa1] - ld b, SYM_SPACE - call DrawSymbolOnPlayAreaCursor - call EraseCursor - jr .start - -.a_press - ld hl, hTempPlayAreaLocation_ffa1 - cp [hl] - jr z, .loop_input_second ; same as first? -; a different Pokemon was picked, -; so store this Play Area location -; and erase the damage counter in the cursor. - ldh a, [hTempPlayAreaLocation_ffa1] - ld b, SYM_SPACE - call DrawSymbolOnPlayAreaCursor - call EraseCursor - call SwapTurn - or a - ret - -.cancel -; return carry if operation was cancelled. - call SwapTurn - scf - ret - -Curse_TransferDamageEffect: ; 2d8bb (b:58bb) -; set Pkmn Power as used - ldh a, [hTempList] - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - set USED_PKMN_POWER_THIS_TURN_F, [hl] - -; figure out the type of duelist that used Curse. -; if it was the player, no need to draw the Play Area screen. - call SwapTurn - ld a, DUELVARS_DUELIST_TYPE - call GetNonTurnDuelistVariable - cp DUELIST_TYPE_PLAYER - jr z, .vs_player - -; vs. opponent - bank1call Func_61a1 -.vs_player -; transfer the damage counter to the targets that were selected. - ldh a, [hPlayAreaEffectTarget] - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - sub 10 - ld [hl], a - ldh a, [hTempPlayAreaLocation_ffa1] - add DUELVARS_ARENA_CARD_HP - ld l, a - ld a, 10 - add [hl] - ld [hl], a - - bank1call PrintPlayAreaCardList_EnableLCD - ld a, DUELVARS_DUELIST_TYPE - call GetNonTurnDuelistVariable - cp DUELIST_TYPE_PLAYER - jr z, .done -; vs. opponent - ldh a, [hPlayAreaEffectTarget] - ldh [hTempPlayAreaLocation_ff9d], a - bank1call Func_6194 - -.done - call SwapTurn - call ExchangeRNG - bank1call Func_6e49 - ret - -GengarDarkMind_PlayerSelectEffect: ; 2d903 (b:5903) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp 2 - jr nc, .has_bench -; no bench Pokemon to damage. - ld a, $ff - ldh [hTemp_ffa0], a - ret - -.has_bench -; opens Play Area screen to select Bench Pokemon -; to damage, and store it before returning. - ldtx hl, ChoosePkmnInTheBenchToGiveDamageText - call DrawWideTextBox_WaitForInput - call SwapTurn - bank1call HasAlivePokemonInBench -.loop_input - bank1call OpenPlayAreaScreenForSelection - jr c, .loop_input - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - call SwapTurn - ret - -GengarDarkMind_AISelectEffect: ; 2d92a (b:592a) - ld a, $ff - ldh [hTemp_ffa0], a - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp 2 - ret c ; return if no Bench Pokemon -; just pick Pokemon with lowest remaining HP. - call GetBenchPokemonWithLowestHP - ldh [hTemp_ffa0], a - ret - -GengarDarkMind_DamageBenchEffect: ; 2d93c (b:593c) - ldh a, [hTemp_ffa0] - cp $ff - ret z ; no target chosen - call SwapTurn - ld b, a - ld de, 10 - call DealDamageToPlayAreaPokemon_RegularAnim - call SwapTurn - ret - -SleepingGasEffect: ; 2d94f (b:594f) - call Sleep50PercentEffect - call nc, SetNoEffectFromStatus - ret - -DestinyBond_CheckEnergy: ; 2d956 (b:5956) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ld a, [wAttachedEnergies + PSYCHIC] - ldtx hl, NotEnoughPsychicEnergyText - cp 1 - ret - -DestinyBond_PlayerSelectEffect: ; 2d964 (b:5964) -; handle input and display of Energy card list - ld a, TYPE_ENERGY_PSYCHIC - call CreateListOfEnergyAttachedToArena - xor a - bank1call DisplayEnergyDiscardScreen - bank1call HandleEnergyDiscardMenuInput - ret c - ldh a, [hTempCardIndex_ff98] - ldh [hTempList], a - ret - -DestinyBond_AISelectEffect: ; 2d976 (b:5976) -; pick first card in list - ld a, TYPE_ENERGY_PSYCHIC - call CreateListOfEnergyAttachedToArena - ld a, [wDuelTempList] - ldh [hTempList], a - ret - -DestinyBond_DiscardEffect: ; 2d981 (b:5981) - ldh a, [hTempList] - call PutCardInDiscardPile - ret - -DestinyBond_DestinyBondEffect: ; 2d987 (b:5987) - ld a, SUBSTATUS1_DESTINY_BOND - call ApplySubstatus1ToDefendingCard - ret - -; returns carry if no Energy cards in Discard Pile. -EnergyConversion_CheckEnergy: ; 2d98d (b:598d) - call CreateEnergyCardListFromDiscardPile_AllEnergy - ldtx hl, ThereAreNoEnergyCardsInDiscardPileText - ret - -EnergyConversion_PlayerSelectEffect: ; 2d994 (b:5994) - ldtx hl, Choose2EnergyCardsFromDiscardPileForHandText - call HandleEnergyCardsInDiscardPileSelection - ret - -EnergyConversion_AISelectEffect: ; 2d99b (b:599b) - call CreateEnergyCardListFromDiscardPile_AllEnergy - ld hl, wDuelTempList - ld de, hTempList - ld c, 2 -; select the first two energy cards found in Discard Pile -.loop - ld a, [hli] - cp $ff - jr z, .done - ld [de], a - inc de - dec c - jr nz, .loop -.done - ld a, $ff - ld [de], a - ret - -EnergyConversion_AddToHandEffect: ; 2d9b4 (b:59b4) -; damage itself - ld a, 10 - call DealRecoilDamageToSelf - -; loop cards that were chosen -; until $ff is reached, -; and move them to the hand. - ld hl, hTempList - ld de, wDuelTempList -.loop_cards - ld a, [hli] - ld [de], a - inc de - cp $ff - jr z, .done - call MoveDiscardPileCardToHand - call AddCardToHand - jr .loop_cards - -.done - call IsPlayerTurn - ret c - bank1call Func_4b38 - ret - -; return carry if Defending Pokemon is not asleep -DreamEaterEffect: ; 2d9d6 (b:59d6) - ld a, DUELVARS_ARENA_CARD_STATUS - call GetNonTurnDuelistVariable - and CNF_SLP_PRZ - cp ASLEEP - ret z ; return if asleep -; not asleep, set carry and load text - ldtx hl, OpponentIsNotAsleepText - scf - ret - -TransparencyEffect: ; 2d9e5 (b:59e5) - scf - ret - -; returns carry if neither the Turn Duelist or -; the non-Turn Duelist have any deck cards. -Prophecy_CheckDeck: ; 2d9e7 (b:59e7) - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetTurnDuelistVariable - cp DECK_SIZE - jr c, .no_carry - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetNonTurnDuelistVariable - cp DECK_SIZE - jr c, .no_carry - ldtx hl, NoCardsLeftInTheDeckText - scf - ret -.no_carry - or a - ret - -Prophecy_PlayerSelectEffect: ; 2da00 (b:5a00) - ldtx hl, ProcedureForProphecyText - bank1call DrawWholeScreenTextBox -.select_deck - bank1call DrawDuelMainScene - ldtx hl, PleaseSelectTheDeckText - call TwoItemHorizontalMenu - ldh a, [hKeysHeld] - and B_BUTTON - jr nz, Prophecy_PlayerSelectEffect ; loop back to start - - ldh a, [hCurMenuItem] - ldh [hTempList], a ; store selection in first position in list - or a - jr z, .turn_duelist - -; non-turn duelist - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetNonTurnDuelistVariable - cp DECK_SIZE - jr nc, .select_deck ; no cards, go back to deck selection - call SwapTurn - call HandleProphecyScreen - call SwapTurn - ret - -.turn_duelist - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetTurnDuelistVariable - cp DECK_SIZE - jr nc, .select_deck ; no cards, go back to deck selection - call HandleProphecyScreen - ret - -Prophecy_AISelectEffect: ; 2da3c (b:5a3c) -; AI doesn't ever choose this attack -; so this it does no sorting. - ld a, $ff - ldh [hTemp_ffa0], a - ret - -Prophecy_ReorderDeckEffect: ; 2da41 (b:5a41) - ld hl, hTempList - ld a, [hli] - or a - jr z, .ReorderCards ; turn duelist's deck - cp $ff - ret z - - ; non-turn duelist's deck - call SwapTurn - call .ReorderCards - call SwapTurn - ret - -.ReorderCards - ld c, 0 -; add selected cards to hand in the specified order -.loop_add_hand - ld a, [hli] - cp $ff - jr z, .dec_hl - call SearchCardInDeckAndAddToHand - inc c - jr .loop_add_hand - -.dec_hl -; go to last card that was in the list - dec hl - dec hl - -.loop_return_deck -; return the cards to the top of the deck - ld a, [hld] - call ReturnCardToDeck - dec c - jr nz, .loop_return_deck - call IsPlayerTurn - ret c - ; print text in case it was the opponent - ldtx hl, ExchangedCardsInDuelistsHandText - call DrawWideTextBox_WaitForInput - ret - -; draw and handle Player selection for reordering -; the top 3 cards of Deck. -; the resulting list is output in order in hTempList. -HandleProphecyScreen: ; 2da76 (b:5a76) - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetTurnDuelistVariable - ld b, a - ld a, DECK_SIZE - sub [hl] ; a = number of cards in deck - -; store in c the number of cards that will be reordered. -; this number is 3, unless the deck as fewer cards than -; that in which case it will be the number of cards remaining. - ld c, 3 - cp c - jr nc, .got_number_cards - ld c, a ; store number of remaining cards in c -.got_number_cards - ld a, c - inc a - ld [wNumberOfCardsToOrder], a - -; store in wDuelTempList the cards -; at top of Deck to be reordered. - ld a, b - add DUELVARS_DECK_CARDS - ld l, a - ld de, wDuelTempList -.loop_top_cards - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop_top_cards - ld a, $ff ; terminating byte - ld [de], a - -.start - call CountCardsInDuelTempList - ld b, a - ld a, 1 ; start at 1 - ldh [hCurSelectionItem], a - -; initialize buffer ahead in wDuelTempList. - ld hl, wDuelTempList + 10 - xor a -.loop_init_buffer - ld [hli], a - dec b - jr nz, .loop_init_buffer - ld [hl], $ff - - bank1call InitAndDrawCardListScreenLayout - ldtx hl, ChooseTheOrderOfTheCardsText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText - bank1call Func_5735 - -.loop_selection - bank1call DisplayCardList - jr c, .clear - -; first check if this card was already selected - ldh a, [hCurMenuItem] - ld e, a - ld d, $00 - ld hl, wDuelTempList + 10 - add hl, de - ld a, [hl] - or a - jr nz, .loop_selection ; already chosen - -; being here means card hasn't been selected yet, -; so add its order number to buffer and increment -; the sort number for the next card. - ldh a, [hCurSelectionItem] - ld [hl], a - inc a - ldh [hCurSelectionItem], a - bank1call Func_5744 - ldh a, [hCurSelectionItem] - ld hl, wNumberOfCardsToOrder - cp [hl] - jr c, .loop_selection ; still more cards - -; confirm that the ordering has been completed - call EraseCursor - ldtx hl, IsThisOKText - call YesOrNoMenuWithText_LeftAligned - jr c, .start ; if not, return back to beginning of selection - -; write in hTempList the card list -; in order that was selected. - ld hl, wDuelTempList + 10 - ld de, wDuelTempList - ld c, 0 -.loop_order - ld a, [hli] - cp $ff - jr z, .done - push hl - push bc - ld c, a - ld b, $00 - ld hl, hTempList - add hl, bc - ld a, [de] - ld [hl], a - pop bc - pop hl - inc de - inc c - jr .loop_order -; now hTempList has the list of card deck indices -; in the order selected to be place on top of the deck. - -.done - ld b, $00 - ld hl, hTempList + 1 - add hl, bc - ld [hl], $ff ; terminating byte - or a - ret - -.clear -; check if any reordering was done. - ld hl, hCurSelectionItem - ld a, [hl] - cp 1 - jr z, .loop_selection ; none done, go back -; clear the order that was selected thus far. - dec a - ld [hl], a - ld c, a - ld hl, wDuelTempList + 10 -.loop_clear - ld a, [hli] - cp c - jr nz, .loop_clear - ; clear this byte - dec hl - ld [hl], $00 - bank1call Func_5744 - jr .loop_selection - -HypnoDarkMind_PlayerSelectEffect: ; 2db2b (b:5b2b) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp 2 - jr nc, .has_bench -; no bench Pokemon to damage. - ld a, $ff - ldh [hTemp_ffa0], a - ret - -.has_bench -; opens Play Area screen to select Bench Pokemon -; to damage, and store it before returning. - ldtx hl, ChoosePkmnInTheBenchToGiveDamageText - call DrawWideTextBox_WaitForInput - call SwapTurn - bank1call HasAlivePokemonInBench -.loop_input - bank1call OpenPlayAreaScreenForSelection - jr c, .loop_input - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - call SwapTurn - ret - -HypnoDarkMind_AISelectEffect: ; 2db52 (b:5b52) - ld a, $ff - ldh [hTemp_ffa0], a - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp 2 - ret c ; return if no Bench Pokemon -; just pick Pokemon with lowest remaining HP. - call GetBenchPokemonWithLowestHP - ldh [hTemp_ffa0], a - ret - -HypnoDarkMind_DamageBenchEffect: ; 2db64 (b:5b64) - ldh a, [hTemp_ffa0] - cp $ff - ret z ; no target chosen - call SwapTurn - ld b, a - ld de, 10 - call DealDamageToPlayAreaPokemon_RegularAnim - call SwapTurn - ret - -InvisibleWallEffect: ; 2db77 (b:5b77) - scf - ret - -MrMimeMeditate_AIEffect: ; 2db79 (b:5b79) - call MrMimeMeditate_DamageBoostEffect - jp SetDefiniteAIDamage - -MrMimeMeditate_DamageBoostEffect: ; 2db7f (b:5b7f) -; add damage counters of Defending card to damage - call SwapTurn - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - call SwapTurn - call AddToDamage - ret - -; returns carry if Damage Swap cannot be used. -DamageSwap_CheckDamage: ; 2db8e (b:5b8e) - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - call CheckIfPlayAreaHasAnyDamage - jr c, .no_damage - ldh a, [hTempPlayAreaLocation_ff9d] - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - ret -.no_damage - ldtx hl, NoPokemonWithDamageCountersText - scf - ret - -DamageSwap_SelectAndSwapEffect: ; 2dba2 (b:5ba2) - ld a, DUELVARS_DUELIST_TYPE - call GetTurnDuelistVariable - cp DUELIST_TYPE_PLAYER - jr z, .player -; non-player - bank1call Func_61a1 - bank1call PrintPlayAreaCardList_EnableLCD - ret - -.player - ldtx hl, ProcedureForDamageSwapText - bank1call DrawWholeScreenTextBox - xor a - ldh [hCurSelectionItem], a - bank1call Func_61a1 - -.start - bank1call PrintPlayAreaCardList_EnableLCD - push af - ldh a, [hCurSelectionItem] - ld hl, PlayAreaSelectionMenuParameters - call InitializeMenuParameters - pop af - ld [wNumMenuItems], a - -; handle selection of Pokemon to take damage from -.loop_input_first - call DoFrame - call HandleMenuInput - jr nc, .loop_input_first - cp $ff - ret z ; quit when B button is pressed - - ldh [hTempPlayAreaLocation_ffa1], a - ldh [hCurSelectionItem], a - -; if card has no damage, play sfx and return to start - call GetCardDamageAndMaxHP - or a - jr z, .no_damage - -; take damage away temporarily to draw UI. - ldh a, [hTempPlayAreaLocation_ffa1] - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - push af - push hl - add 10 - ld [hl], a - bank1call PrintPlayAreaCardList_EnableLCD - pop hl - pop af - ld [hl], a - -; draw damage counter in cursor - ldh a, [hTempPlayAreaLocation_ffa1] - ld b, SYM_HP_NOK - call DrawSymbolOnPlayAreaCursor - -; handle selection of Pokemon to give damage to -.loop_input_second - call DoFrame - call HandleMenuInput - jr nc, .loop_input_second - ; if B is pressed, return damage counter - ; to card that it was taken from - cp $ff - jr z, .update_ui - -; try to give the card selected the damage counter -; if it would KO, ignore it. - ldh [hPlayAreaEffectTarget], a - ldh [hCurSelectionItem], a - call TryGiveDamageCounter_DamageSwap - jr c, .loop_input_second - - ld a, OPPACTION_6B15 - call SetOppAction_SerialSendDuelData - -.update_ui - ldh a, [hTempPlayAreaLocation_ffa1] - ld b, SYM_SPACE - call DrawSymbolOnPlayAreaCursor - call EraseCursor - jr .start - -.no_damage - call Func_3794 - jr .loop_input_first - -; tries to give damage counter to hPlayAreaEffectTarget, -; and if successful updates UI screen. -DamageSwap_SwapEffect: ; 2dc27 (b:5c27) - call TryGiveDamageCounter_DamageSwap - ret c - bank1call PrintPlayAreaCardList_EnableLCD - or a - ret - -; tries to give the damage counter to the target -; chosen by the Player (hPlayAreaEffectTarget). -; if the damage counter would KO card, then do -; not give the damage counter and return carry. -TryGiveDamageCounter_DamageSwap: ; 2dc30 (b:5c30) - ldh a, [hPlayAreaEffectTarget] - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - sub 10 - jr z, .set_carry ; would bring HP to zero? -; has enough HP to receive a damage counter - ld [hl], a - ldh a, [hTempPlayAreaLocation_ffa1] - add DUELVARS_ARENA_CARD_HP - ld l, a - ld a, 10 - add [hl] - ld [hl], a - or a - ret -.set_carry - scf - ret - -PsywaveEffect: ; 2dc49 (b:5c49) - call GetEnergyAttachedMultiplierDamage - ld hl, wDamage - ld [hl], e - inc hl - ld [hl], d - ret - -; returns carry if neither Duelist has evolved Pokemon. -DevolutionBeam_CheckPlayArea: ; 2dc53 (b:5c53) - call CheckIfTurnDuelistHasEvolvedCards - ret nc - call SwapTurn - call CheckIfTurnDuelistHasEvolvedCards - call SwapTurn - ldtx hl, ThereAreNoStage1PokemonText - ret - -; returns carry of Player cancelled selection. -; otherwise, output in hTemp_ffa0 which Play Area -; was selected ($0 = own Play Area, $1 = opp. Play Area) -; and in hTempPlayAreaLocation_ffa1 selected card. -DevolutionBeam_PlayerSelectEffect: ; 2dc64 (b:5c64) - ldtx hl, ProcedureForDevolutionBeamText - bank1call DrawWholeScreenTextBox - -.start - bank1call DrawDuelMainScene - ldtx hl, PleaseSelectThePlayAreaText - call TwoItemHorizontalMenu - ldh a, [hKeysHeld] - and B_BUTTON - jr nz, .set_carry - -; a Play Area was selected - ldh a, [hCurMenuItem] - or a - jr nz, .opp_chosen - -; player chosen - call HandleEvolvedCardSelection - jr c, .start - - xor a -.store_selection - ld hl, hTemp_ffa0 - ld [hli], a ; store which Duelist Play Area selected - ldh a, [hTempPlayAreaLocation_ff9d] - ld [hl], a ; store which card selected - or a - ret - -.opp_chosen - call SwapTurn - call HandleEvolvedCardSelection - call SwapTurn - jr c, .start - ld a, $01 - jr .store_selection - -.set_carry - scf - ret - -DevolutionBeam_AISelectEffect: ; 2dc9e (b:5c9e) - ld a, $01 - ldh [hTemp_ffa0], a - call SwapTurn - call FindFirstNonBasicCardInPlayArea - call SwapTurn - jr c, .found - xor a - ldh [hTemp_ffa0], a - call FindFirstNonBasicCardInPlayArea -.found - ldh [hTempPlayAreaLocation_ffa1], a - ret - -DevolutionBeam_LoadAnimation: ; 2dcb6 (b:5cb6) - xor a ; ATK_ANIM_NONE - ld [wLoadedAttackAnimation], a - ret - -DevolutionBeam_DevolveEffect: ; 2dcbb (b:5cbb) - ldh a, [hTemp_ffa0] - or a - jr z, .DevolvePokemon - cp $ff - ret z - -; opponent's Play Area - call SwapTurn - ldh a, [hTempPlayAreaLocation_ffa1] - jr nz, .skip_handle_no_damage_effect - call HandleNoDamageOrEffect - jr c, .unaffected -.skip_handle_no_damage_effect - call .DevolvePokemon -.unaffected - call SwapTurn - ret - -.DevolvePokemon - ld a, ATK_ANIM_DEVOLUTION_BEAM - ld [wLoadedAttackAnimation], a - ldh a, [hTempPlayAreaLocation_ffa1] - ld b, a - ld c, $00 - ldh a, [hWhoseTurn] - ld h, a - bank1call PlayAttackAnimation - bank1call WaitAttackAnimation - -; load selected card's data - ldh a, [hTempPlayAreaLocation_ffa1] - ldh [hTempPlayAreaLocation_ff9d], a - ld [wTempPlayAreaLocation_cceb], a - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - -; check if car is affected - ld a, [wLoadedCard1ID] - ld [wTempNonTurnDuelistCardID], a - ld de, $0 - ldh a, [hTempPlayAreaLocation_ff9d] - or a - jr nz, .skip_substatus_check - call HandleNoDamageOrEffectSubstatus - jr c, .check_no_damage_effect -.skip_substatus_check - call HandleDamageReductionOrNoDamageFromPkmnPowerEffects -.check_no_damage_effect - call CheckNoDamageOrEffect - jr nc, .devolve - call DrawWideTextBox_WaitForInput - ret - -.devolve - ldh a, [hTempPlayAreaLocation_ffa1] - ldh [hTempPlayAreaLocation_ff9d], a - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - bank1call GetCardOneStageBelow - call PrintDevolvedCardNameAndLevelText - - ld a, d - call UpdateDevolvedCardHPAndStage - call ResetDevolvedCardStatus - -; add the evolved card to the hand - ld a, e - call AddCardToHand - -; check if this devolution KO's card - ldh a, [hTempPlayAreaLocation_ffa1] - call PrintPlayAreaCardKnockedOutIfNoHP - - xor a - ld [wDuelDisplayedScreen], a - ret - -; returns carry if Turn Duelist -; has no Stage1 or Stage2 cards in Play Area. -CheckIfTurnDuelistHasEvolvedCards: ; 2dd3b (b:5d3b) - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - ld d, h - ld e, DUELVARS_ARENA_CARD_STAGE -.loop - ld a, [hli] - cp $ff - jr z, .set_carry - ld a, [de] - inc de - or a - jr z, .loop ; is Basic Stage - ret -.set_carry - scf - ret - -; handles Player selection of an evolved card in Play Area. -; returns carry if Player cancelled operation. -HandleEvolvedCardSelection: ; 2dd50 (b:5d50) - bank1call HasAlivePokemonInPlayArea -.loop - bank1call OpenPlayAreaScreenForSelection - ret c - ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_STAGE - call GetTurnDuelistVariable - or a - jr z, .loop ; if Basic, loop - ret - -; finds first occurrence in Play Area -; of Stage 1 or 2 card, and outputs its -; Play Area location in a, with carry set. -; if none found, don't return carry set. -FindFirstNonBasicCardInPlayArea: ; 2dd62 (b:5d62) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld c, a - - ld b, PLAY_AREA_ARENA - ld l, DUELVARS_ARENA_CARD_STAGE -.loop - ld a, [hli] - or a - jr nz, .not_basic - inc b - dec c - jr nz, .loop - or a - ret -.not_basic - ld a, b - scf - ret - -NeutralizingShieldEffect: ; 2dd79 (b:5d79) - scf - ret - -Psychic_AIEffect: ; 2dd7b (b:5d7b) - call Psychic_DamageBoostEffect - jp SetDefiniteAIDamage - -Psychic_DamageBoostEffect: ; 2dd81 (b:5d81) - call GetEnergyAttachedMultiplierDamage - ld hl, wDamage - ld a, e - add [hl] - ld [hli], a - ld a, d - adc [hl] - ld [hl], a - ret - -; return carry if no Psychic Energy attached -Barrier_CheckEnergy: ; 2dd8e (b:5d8e) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ld a, [wAttachedEnergies + PSYCHIC] - ldtx hl, NotEnoughPsychicEnergyText - cp 1 - ret - -Barrier_PlayerSelectEffect: ; 2dd9c (b:5d9c) - ld a, TYPE_ENERGY_PSYCHIC - call CreateListOfEnergyAttachedToArena - xor a ; PLAY_AREA_ARENA - bank1call DisplayEnergyDiscardScreen - bank1call HandleEnergyDiscardMenuInput - ret c - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - ret - -Barrier_AISelectEffect: ; 2ddae (b:5dae) -; AI picks the first energy in list - ld a, TYPE_ENERGY_PSYCHIC - call CreateListOfEnergyAttachedToArena - ld a, [wDuelTempList] - ldh [hTemp_ffa0], a - ret - -Barrier_DiscardEffect: ; 2ddb9 (b:5db9) - ldh a, [hTemp_ffa0] - call PutCardInDiscardPile - ret - -Barrier_BarrierEffect: ; 2ddbf (b:5dbf) - ld a, SUBSTATUS1_BARRIER - call ApplySubstatus1ToDefendingCard - ret - -Mewtwo3EnergyAbsorption_CheckDiscardPile: ; 2ddc5 (b:5dc5) - call CreateEnergyCardListFromDiscardPile_AllEnergy - ldtx hl, ThereAreNoEnergyCardsInDiscardPileText - ret - -Mewtwo3EnergyAbsorption_PlayerSelectEffect: ; 2ddcc (b:5dcc) - ldtx hl, Choose2EnergyCardsFromDiscardPileToAttachText - call HandleEnergyCardsInDiscardPileSelection - ret - -Mewtwo3EnergyAbsorption_AISelectEffect: ; 2ddd3 (b:5dd3) -; AI picks first 2 energy cards - call CreateEnergyCardListFromDiscardPile_AllEnergy - ld hl, wDuelTempList - ld de, hTempList - ld c, 2 -.loop - ld a, [hli] - cp $ff - jr z, .done - ld [de], a - inc de - dec c - jr nz, .loop -.done - ld a, $ff ; terminating byte - ld [de], a - ret - -Mewtwo3EnergyAbsorption_AddToHandEffect: ; 2ddec (b:5dec) - ld hl, hTempList -.loop - ld a, [hli] - cp $ff - ret z - push hl - call MoveDiscardPileCardToHand - call GetTurnDuelistVariable - ld [hl], CARD_LOCATION_ARENA - pop hl - jr .loop - -Mewtwo2EnergyAbsorption_CheckDiscardPile: ; 2ddff (b:5dff) - call CreateEnergyCardListFromDiscardPile_AllEnergy - ldtx hl, ThereAreNoEnergyCardsInDiscardPileText - ret - -Mewtwo2EnergyAbsorption_PlayerSelectEffect: ; 2de06 (b:5e06) - ldtx hl, Choose2EnergyCardsFromDiscardPileToAttachText - call HandleEnergyCardsInDiscardPileSelection - ret - -Mewtwo2EnergyAbsorption_AISelectEffect: ; 2de0d (b:5e0d) -; AI picks first 2 energy cards - call CreateEnergyCardListFromDiscardPile_AllEnergy - ld hl, wDuelTempList - ld de, hTempList - ld c, 2 -.loop - ld a, [hli] - cp $ff - jr z, .done - ld [de], a - inc de - dec c - jr nz, .loop -.done - ld a, $ff ; terminating byte - ld [de], a - ret - -Mewtwo2EnergyAbsorption_AddToHandEffect: ; 2de26 (b:5e26) - ld hl, hTempList -.loop - ld a, [hli] - cp $ff - ret z - push hl - call MoveDiscardPileCardToHand - call GetTurnDuelistVariable - ld [hl], CARD_LOCATION_ARENA - pop hl - jr .loop - -; returns carry if Strange Behavior cannot be used. -StrangeBehavior_CheckDamage: ; 2de39 (b:5e39) -; does Play Area have any damage counters? - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - call CheckIfPlayAreaHasAnyDamage - ldtx hl, NoPokemonWithDamageCountersText - jr c, .set_carry -; can Slowbro receive any damage counters without KO-ing? - ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - ldtx hl, CannotUseBecauseItWillBeKnockedOutText - cp 10 + 10 - jr c, .set_carry -; can Pkmn Power be used? - ldh a, [hTempPlayAreaLocation_ff9d] - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - ret - -.set_carry - scf - ret - -StrangeBehavior_SelectAndSwapEffect: ; 2de5b (b:5e5b) - ld a, DUELVARS_DUELIST_TYPE - call GetTurnDuelistVariable - cp DUELIST_TYPE_PLAYER - jr z, .player - -; not player - bank1call Func_61a1 - bank1call PrintPlayAreaCardList_EnableLCD - ret - -.player - ldtx hl, ProcedureForStrangeBehaviorText - bank1call DrawWholeScreenTextBox - - xor a - ldh [hCurSelectionItem], a - bank1call Func_61a1 -.start - bank1call PrintPlayAreaCardList_EnableLCD - push af - ldh a, [hCurSelectionItem] - ld hl, PlayAreaSelectionMenuParameters - call InitializeMenuParameters - pop af - - ld [wNumMenuItems], a -.loop_input - call DoFrame - call HandleMenuInput - jr nc, .loop_input - cp -1 - ret z ; return when B button is pressed - - ldh [hCurSelectionItem], a - ldh [hTempPlayAreaLocation_ffa1], a - ld hl, hTemp_ffa0 - cp [hl] - jr z, .play_sfx ; can't select Slowbro itself - - call GetCardDamageAndMaxHP - or a - jr z, .play_sfx ; can't select card without damage - - call TryGiveDamageCounter_StrangeBehavior - jr c, .play_sfx - ld a, OPPACTION_6B15 - call SetOppAction_SerialSendDuelData - jr .start - -.play_sfx - call Func_3794 - jr .loop_input - -StrangeBehavior_SwapEffect: ; 2deb3 (b:5eb3) - call TryGiveDamageCounter_StrangeBehavior - ret c - bank1call PrintPlayAreaCardList_EnableLCD - or a - ret - -; tries to give the damage counter to the target -; chosen by the Player (hTemp_ffa0). -; if the damage counter would KO card, then do -; not give the damage counter and return carry. -TryGiveDamageCounter_StrangeBehavior: ; 2debc (b:5ebc) - ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - sub 10 - jr z, .set_carry ; would bring HP to zero? -; has enough HP to receive a damage counter - ld [hl], a - ldh a, [hTempPlayAreaLocation_ffa1] - add DUELVARS_ARENA_CARD_HP - ld l, a - ld a, 10 - add [hl] - ld [hl], a - or a - ret -.set_carry - scf - ret - -; returns carry if has no damage counters. -SpacingOut_CheckDamage: ; 2ded5 (b:5ed5) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - ldtx hl, NoDamageCountersText - cp 10 - ret - -SpacingOut_Success50PercentEffect: ; 2dee0 (b:5ee0) - ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText - call TossCoin_BankB - ldh [hTemp_ffa0], a - jp nc, SetWasUnsuccessful - ld a, ATK_ANIM_RECOVER - ld [wLoadedAttackAnimation], a - ret - -SpacingOut_HealEffect: ; 2def1 (b:5ef1) - ldh a, [hTemp_ffa0] - or a - ret z ; coin toss was tails - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - or a - ret z ; no damage counters - ld a, DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - add 10 - ld [hl], a - ret - -; sets carry if no Trainer cards in the Discard Pile. -Scavenge_CheckDiscardPile: ; 2df05 (b:5f05) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ld a, [wAttachedEnergies + PSYCHIC] - ldtx hl, NotEnoughPsychicEnergyText - cp 1 - ret c ; return if no Psychic energy attached - call CreateTrainerCardListFromDiscardPile - ldtx hl, ThereAreNoTrainerCardsInDiscardPileText ; this is redundant - ret - -Scavenge_PlayerSelectEnergyEffect: ; 2df1a (b:5f1a) - ld a, TYPE_ENERGY_PSYCHIC - call CreateListOfEnergyAttachedToArena - xor a ; PLAY_AREA_ARENA - bank1call DisplayEnergyDiscardScreen - bank1call HandleEnergyDiscardMenuInput - ret c - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - or a - ret - -Scavenge_AISelectEffect: ; 2df2d (b:5f2d) -; AI picks first Energy card in list - ld a, TYPE_ENERGY_PSYCHIC - call CreateListOfEnergyAttachedToArena - ld a, [wDuelTempList] - ldh [hTemp_ffa0], a -; AI picks first Trainer card in list - call CreateTrainerCardListFromDiscardPile - ld a, [wDuelTempList] - ldh [hTempPlayAreaLocation_ffa1], a - ret - -Scavenge_DiscardEffect: ; 2df40 (b:5f40) - ldh a, [hTemp_ffa0] - call PutCardInDiscardPile - ret - -Scavenge_PlayerSelectTrainerEffect: ; 2df46 (b:5f46) - call CreateTrainerCardListFromDiscardPile - bank1call Func_5591 - ldtx hl, PleaseSelectCardText - ldtx de, PlayerDiscardPileText - bank1call SetCardListHeaderText -.loop_input - bank1call DisplayCardList - jr c, .loop_input - ldh a, [hTempCardIndex_ff98] - ldh [hTempPlayAreaLocation_ffa1], a - ret - -Scavenge_AddToHandEffect: ; 2df5f (b:5f5f) - ldh a, [hTempPlayAreaLocation_ffa1] - call MoveDiscardPileCardToHand - call AddCardToHand - call IsPlayerTurn - ret c - ldh a, [hTempPlayAreaLocation_ffa1] - ldtx hl, WasPlacedInTheHandText - bank1call DisplayCardDetailScreen - ret - -; returns carry if Defending Pokemon has no attacks -SlowpokeAmnesia_CheckAttacks: ; 2df74 (b:5f74) - call CheckIfDefendingPokemonHasAnyAttack - ldtx hl, NoAttackMayBeChoosenText - ret - -SlowpokeAmnesia_PlayerSelectEffect: ; 2df7b (b:5f7b) - call PlayerPickAttackForAmnesia - ret - -SlowpokeAmnesia_AISelectEffect: ; 2df7f (b:5f7f) - call AIPickAttackForAmnesia - ldh [hTemp_ffa0], a - ret - -SlowpokeAmnesia_DisableEffect: ; 2df85 (b:5f85) - call ApplyAmnesiaToAttack - ret - -; returns carry if Arena card has no Psychic Energy attached -; or if it doesn't have any damage counters. -KadabraRecover_CheckEnergyHP: ; 2df89 (b:5f89) - ld e, PLAY_AREA_ARENA - call GetPlayAreaCardAttachedEnergies - ld a, [wAttachedEnergies + PSYCHIC] - ldtx hl, NotEnoughPsychicEnergyText - cp 1 - ret c ; return if not enough energy - call GetCardDamageAndMaxHP - ldtx hl, NoDamageCountersText - cp 10 - ret ; return carry if no damage - -KadabraRecover_PlayerSelectEffect: ; 2dfa0 (b:5fa0) - ld a, TYPE_ENERGY_PSYCHIC - call CreateListOfEnergyAttachedToArena - xor a ; PLAY_AREA_ARENA - bank1call DisplayEnergyDiscardScreen - bank1call HandleEnergyDiscardMenuInput - ret c - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a ; store card chosen - ret - -KadabraRecover_AISelectEffect: ; 2dfb2 (b:5fb2) - ld a, TYPE_ENERGY_PSYCHIC - call CreateListOfEnergyAttachedToArena - ld a, [wDuelTempList] ; pick first card - ldh [hTemp_ffa0], a - ret - -KadabraRecover_DiscardEffect: ; 2dfbd (b:5fbd) - ldh a, [hTemp_ffa0] - call PutCardInDiscardPile - ret - -KadabraRecover_HealEffect: ; 2dfc3 (b:5fc3) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - ld e, a ; all damage for recovery - ld d, 0 - call ApplyAndAnimateHPRecovery - ret - -JynxDoubleslap_AIEffect: ; 2dfd7 (b:5fd7) - ld a, 20 / 2 - lb de, 0, 20 - jp SetExpectedAIDamage - -JynxDoubleslap_MultiplierEffect: ; 2dfcf (b:5fcf) - ld hl, 10 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 2 - call TossCoinATimes_BankB - call ATimes10 - call SetDefiniteDamage - ret - -JynxMeditate_AIEffect: ; 2dff2 (b:5ff2) - call JynxMeditate_DamageBoostEffect - jp SetDefiniteAIDamage - -JynxMeditate_DamageBoostEffect: ; 2dfec (b:5fec) -; add damage counters of Defending card to damage - call SwapTurn - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - call SwapTurn - call AddToDamage - ret - -MysteryAttack_AIEffect: ; 2e001 (b:6001) - ld a, 10 - lb de, 0, 20 - jp SetExpectedAIDamage - -MysteryAttack_RandomEffect: ; 2e009 (b:6009) - ld a, 10 - call SetDefiniteDamage - -; chooses a random effect from 8 possible options. - call UpdateRNGSources - and %111 - ldh [hTemp_ffa0], a - ld hl, .random_effect - jp JumpToFunctionInTable - -.random_effect - dw ParalysisEffect - dw PoisonEffect - dw SleepEffect - dw ConfusionEffect - dw .no_effect ; this will actually activate recovery effect afterwards - dw .no_effect - dw .more_damage - dw .no_damage - -.more_damage - ld a, 20 - call SetDefiniteDamage - ret - -.no_damage - ld a, ATK_ANIM_GLOW_EFFECT - ld [wLoadedAttackAnimation], a - xor a - call SetDefiniteDamage - call SetNoEffectFromStatus -.no_effect - ret - -MysteryAttack_RecoverEffect: ; 2e03e (b:603e) -; in case the 5th option was chosen for random effect, -; trigger recovery effect for 10 HP. - ldh a, [hTemp_ffa0] - cp 4 - ret nz - lb de, 0, 10 - call ApplyAndAnimateHPRecovery - ret - -StoneBarrage_AIEffect: ; 2e04a (b:604a) - ld a, 10 - lb de, 0, 100 - jp SetExpectedAIDamage - -StoneBarrage_MultiplierEffect: ; 2e052 (b:6052) - xor a - ldh [hTemp_ffa0], a -.loop_coin_toss - ldtx de, FlipUntilFailAppears10DamageForEachHeadsText - xor a - call TossCoinATimes_BankB - jr nc, .tails - ld hl, hTemp_ffa0 - inc [hl] ; increase heads count - jr .loop_coin_toss - -.tails -; store resulting damage - ldh a, [hTemp_ffa0] - ld l, a - ld h, 10 - call HtimesL - ld de, wDamage - ld a, l - ld [de], a - inc de - ld a, h - ld [de], a - ret - -OnixHardenEffect: ; 2e075 (b:6075) - ld a, SUBSTATUS1_HARDEN - call ApplySubstatus1ToDefendingCard - ret - -PrimeapeFurySwipes_AIEffect: ; 2e07b (b:607b) - ld a, 60 / 2 - lb de, 0, 60 - jp SetExpectedAIDamage - -PrimeapeFurySwipes_MultiplierEffect: ; 2e083 (b:6083) - ld hl, 20 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 3 - call TossCoinATimes_BankB - add a - call ATimes10 - call SetDefiniteDamage - ret - -TantrumEffect: ; 2e099 (b:6099) - ldtx de, IfTailsYourPokemonBecomesConfusedText - call TossCoin_BankB - ret c ; return if heads -; confuse Pokemon - ld a, ATK_ANIM_MULTIPLE_SLASH - ld [wLoadedAttackAnimation], a - call SwapTurn - call ConfusionEffect - call SwapTurn - ret - -StrikesBackEffect: ; 2e0af (b:60af) - scf - ret - -KabutoArmorEffect: ; 2e0b1 (b:60b1) - scf - ret - -AbsorbEffect: ; 2e0b3 (b:60b3) - ld hl, wDealtDamage - ld a, [hli] - ld h, [hl] - ld l, a - srl h - rr l - bit 0, l - jr z, .rounded - ; round up to nearest 10 - ld de, 5 - add hl, de -.rounded - ld e, l - ld d, h - call ApplyAndAnimateHPRecovery - ret - -SnivelEffect: ; 2e0cb (b:60cb) - ld a, SUBSTATUS2_REDUCE_BY_20 - call ApplySubstatus2ToDefendingCard - ret - -CuboneRage_AIEffect: ; 2e0d1 (b:60d1) - call CuboneRage_DamageBoostEffect - jp SetDefiniteAIDamage - -CuboneRage_DamageBoostEffect: ; 2e0d7 (b:60d7) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - call AddToDamage - ret - -Bonemerang_AIEffect: ; 2e0e0 (b:60e0) - ld a, 60 / 2 - lb de, 0, 60 - jp SetExpectedAIDamage - -Bonemerang_MultiplierEffect: ; 2e0e8 (b:60e8) - ld hl, 30 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 2 - call TossCoinATimes_BankB - ld e, a - add a ; a = 2 * heads - add e ; a = 3 * heads - call ATimes10 - call SetDefiniteDamage - ret - -; returns carry if can't add Pokemon from deck -MarowakCallForFamily_CheckDeckAndPlayArea: ; 2e100 (b:6100) - call CheckIfDeckIsEmpty - ret c ; no cards in deck - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, NoSpaceOnTheBenchText - cp MAX_PLAY_AREA_POKEMON - ccf - ret - -MarowakCallForFamily_PlayerSelectEffect: ; 2e110 (b:6110) - ld a, $ff - ldh [hTemp_ffa0], a - - call CreateDeckCardList - ldtx hl, ChooseBasicFightingPokemonFromDeckText - ldtx bc, FightingPokemonDeckText - lb de, SEARCHEFFECT_BASIC_FIGHTING, $00 - call LookForCardsInDeck - ret c - -; draw Deck list interface and print text - bank1call Func_5591 - ldtx hl, ChooseBasicFightingPokemonText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText - -.loop - bank1call DisplayCardList - jr c, .pressed_b - - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp FIGHTING - jr nz, .play_sfx ; is Fighting? - ld a, [wLoadedCard2Stage] - or a - jr nz, .play_sfx ; is Basic? - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - or a - ret - -.play_sfx - ; play SFX and loop back - call Func_3794 - jr .loop - -.pressed_b -; figure if Player can exit the screen without selecting, -; that is, if the Deck has no Basic Fighting Pokemon. - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop_b_press - ld a, [hl] - cp CARD_LOCATION_DECK - jr nz, .next - ld a, l - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard1Type] - cp FIGHTING - jr nz, .next ; found, go back to top loop - ld a, [wLoadedCard1Stage] - or a - jr z, .play_sfx ; found, go back to top loop -.next - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_b_press - -; no valid card in Deck, can safely exit screen - ld a, $ff - ldh [hTemp_ffa0], a - or a - ret - -MarowakCallForFamily_AISelectEffect: ; 2e177 (b:6177) - call CreateDeckCardList - ld hl, wDuelTempList -.loop_deck - ld a, [hli] - ldh [hTemp_ffa0], a - cp $ff - ret z ; none found - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp FIGHTING - jr nz, .loop_deck - ld a, [wLoadedCard2Stage] - or a - jr nz, .loop_deck -; found - ret - -MarowakCallForFamily_PutInPlayAreaEffect: ; 2e194 (b:6194) - ldh a, [hTemp_ffa0] - cp $ff - jr z, .shuffle - call SearchCardInDeckAndAddToHand - call AddCardToHand - call PutHandPokemonCardInPlayArea - call IsPlayerTurn - jr c, .shuffle - ; display card on screen - ldh a, [hTemp_ffa0] - ldtx hl, PlacedOnTheBenchText - bank1call DisplayCardDetailScreen -.shuffle - call Func_2c0bd - ret - -KarateChop_AIEffect: ; 2e1b4 (b:61b4) - call KarateChop_DamageSubtractionEffect - jp SetDefiniteAIDamage - -KarateChop_DamageSubtractionEffect: ; 2e1ba (b:61ba) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - ld e, a - ld hl, wDamage - ld a, [hl] - sub e - ld [hli], a - ld a, [hl] - sbc 0 - ld [hl], a - rla - ret nc -; cap it to 0 damage - xor a - call SetDefiniteDamage - ret - -SubmissionEffect: ; 2e1d1 (b:61d1) - ld a, 20 - call DealRecoilDamageToSelf - ret - -GolemSelfdestructEffect: ; 2e1d7 (b:61d7) - ld a, 100 - call DealRecoilDamageToSelf - ld a, $01 - ld [wIsDamageToSelf], a - ld a, 20 - call DealDamageToAllBenchedPokemon - call SwapTurn - xor a - ld [wIsDamageToSelf], a - ld a, 20 - call DealDamageToAllBenchedPokemon - call SwapTurn - ret - -GravelerHardenEffect: ; 2e1f6 (b:61f6) - ld a, SUBSTATUS1_HARDEN - call ApplySubstatus1ToDefendingCard - ret - -Ram_SelectSwitchEffect: ; 2e1fc (b:61fc) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp 2 - jr c, .no_bench - call DuelistSelectForcedSwitch - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ret -.no_bench - ld a, $ff - ldh [hTemp_ffa0], a - ret - -Ram_RecoilSwitchEffect: ; 2e212 (b:6212) - ld a, 20 - call DealRecoilDamageToSelf - ldh a, [hTemp_ffa0] - call HandleSwitchDefendingPokemonEffect - ret - -LeerEffect: ; 2e21d (b:621d) - ldtx de, IfHeadsOpponentCannotAttackText - call TossCoin_BankB - jp nc, SetWasUnsuccessful - ld a, ATK_ANIM_LEER - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS2_LEER - call ApplySubstatus2ToDefendingCard - ret - -; return carry if opponent has no Bench Pokemon. -StretchKick_CheckBench: ; 2e231 (b:6231) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - ldtx hl, EffectNoPokemonOnTheBenchText - cp 2 - ret - -StretchKick_PlayerSelectEffect: ; 2e23c (b:623c) - ldtx hl, ChoosePkmnInTheBenchToGiveDamageText - call DrawWideTextBox_WaitForInput - call SwapTurn - bank1call HasAlivePokemonInBench -.loop_input - bank1call OpenPlayAreaScreenForSelection - jr c, .loop_input - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - call SwapTurn - ret - -StretchKick_AISelectEffect: ; 2e255 (b:6255) -; chooses Bench Pokemon with least amount of remaining HP - call GetBenchPokemonWithLowestHP - ldh [hTemp_ffa0], a - ret - -StretchKick_BenchDamageEffect: ; 2e25b (b:625b) - call SwapTurn - ldh a, [hTemp_ffa0] - ld b, a - ld de, 20 - call DealDamageToPlayAreaPokemon_RegularAnim - call SwapTurn - ret - -SandAttackEffect: ; 2e26b (b:626b) - ld a, SUBSTATUS2_SAND_ATTACK - call ApplySubstatus2ToDefendingCard - ret - -SandslashFurySwipes_AIEffect: ; 2e271 (b:6271) - ld a, 60 / 2 - lb de, 0, 60 - jp SetExpectedAIDamage - -SandslashFurySwipes_MultiplierEffect: ; 2e279 (b:6279) - ld hl, 20 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 3 - call TossCoinATimes_BankB - add a - call ATimes10 - call SetDefiniteDamage - ret - -EarthquakeEffect: ; 2e28f (b:628f) - ld a, $01 - ld [wIsDamageToSelf], a - ld a, 10 - call DealDamageToAllBenchedPokemon - ret - -PrehistoricPowerEffect: ; 2e29a (b:629a) - scf - ret - -; returns carry if Pkmn Power can't be used. -Peek_OncePerTurnCheck: ; 2e29c (b:629c) - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - and USED_PKMN_POWER_THIS_TURN - jr nz, .already_used - ldh a, [hTempPlayAreaLocation_ff9d] - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - ret -.already_used - ldtx hl, OnlyOncePerTurnText - scf - ret - -Peek_SelectEffect: ; 2e2b4 (b:62b4) -; set Pkmn Power used flag - ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - set USED_PKMN_POWER_THIS_TURN_F, [hl] - - ld a, DUELVARS_DUELIST_TYPE - call GetTurnDuelistVariable - cp DUELIST_TYPE_LINK_OPP - jr z, .link_opp - and DUELIST_TYPE_AI_OPP - jr nz, .ai_opp - -; player - call Func_3b31 - call HandlePeekSelection - ldh [hAIPkmnPowerEffectParam], a - call SerialSend8Bytes - ret - -.link_opp - call SerialRecv8Bytes - ldh [hAIPkmnPowerEffectParam], a - -.ai_opp - ldh a, [hAIPkmnPowerEffectParam] - bit AI_PEEK_TARGET_HAND_F, a - jr z, .prize_or_deck - and (~AI_PEEK_TARGET_HAND & $ff) ; unset bit to get deck index -; if masked value is higher than $40, then it means -; that AI chose to look at Player's deck. -; all deck indices will be smaller than $40. - cp $40 - jr c, .hand - ldh a, [hAIPkmnPowerEffectParam] - jr .prize_or_deck - -.hand -; AI chose to look at random card in hand, -; so display it to the Player on screen. - call SwapTurn - ldtx hl, PeekWasUsedToLookInYourHandText - bank1call DisplayCardDetailScreen - call SwapTurn - ret - -.prize_or_deck -; AI chose either a prize card or Player's top deck card, -; so show Play Area and draw cursor appropriately. - call Func_3b31 - call SwapTurn - ldh a, [hAIPkmnPowerEffectParam] - xor $80 - call DrawAIPeekScreen - call SwapTurn - ldtx hl, CardPeekWasUsedOnText - call DrawWideTextBox_WaitForInput - ret - -BoneAttackEffect: ; 2e30f (b:630f) - ldtx de, IfHeadsOpponentCannotAttackText - call TossCoin_BankB - ret nc - ld a, SUBSTATUS2_BONE_ATTACK - call ApplySubstatus2ToDefendingCard - ret - -; return carry if neither Play Area -; has room for more Bench Pokemon. -Wail_BenchCheck: ; 2e31c (b:631c) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - cp MAX_PLAY_AREA_POKEMON - jr c, .no_carry - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp MAX_PLAY_AREA_POKEMON - jr c, .no_carry - ldtx hl, NoSpaceOnTheBenchText - scf - ret -.no_carry - or a - ret - -Wail_FillBenchEffect: ; 2e335 (b:6335) - call SwapTurn - call .FillBench - call SwapTurn - call .FillBench - -; display both Play Areas - ldtx hl, BasicPokemonWasPlacedOnEachBenchText - call DrawWideTextBox_WaitForInput - bank1call HasAlivePokemonInPlayArea - bank1call OpenPlayAreaScreenForSelection - call SwapTurn - bank1call HasAlivePokemonInPlayArea - bank1call OpenPlayAreaScreenForSelection - call SwapTurn - ret - -.FillBench ; 2e35a (b:635a) - call CreateDeckCardList - ret c - ld hl, wDuelTempList - call ShuffleCards - -; if no more space in the Bench, then return. -.check_bench - push hl - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - pop hl - cp MAX_PLAY_AREA_POKEMON - jr nc, .done - -; there's still space, so look for the next -; Basic Pokemon card to put in the Bench. -.loop - ld a, [hli] - ldh [hTempCardIndex_ff98], a - cp $ff - jr z, .done - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - jr nc, .loop ; is Pokemon card? - ld a, [wLoadedCard2Stage] - or a - jr nz, .loop ; is Basic? -; place card in Bench - push hl - ldh a, [hTempCardIndex_ff98] - call SearchCardInDeckAndAddToHand - call AddCardToHand - call PutHandPokemonCardInPlayArea - pop hl - jr .check_bench - -.done - call Func_2c0bd - ret - -Thunderpunch_AIEffect: ; 2e399 (b:6399) - ld a, (30 + 40) / 2 - lb de, 30, 40 - jp SetExpectedAIDamage - -Thunderpunch_ModifierEffect: ; 2e3a1 (b:63a1) - ldtx de, IfHeadPlus10IfTails10ToYourselfText - call TossCoin_BankB - ldh [hTemp_ffa0], a - ret nc ; return if got tails - ld a, 10 - call AddToDamage - ret - -Thunderpunch_RecoilEffect: ; 2e3b0 (b:63b0) - ldh a, [hTemp_ffa0] - or a - ret nz ; return if got heads - ld a, 10 - call DealRecoilDamageToSelf - ret - -LightScreenEffect: ; 2e3ba (b:63ba) - ld a, SUBSTATUS1_HALVE_DAMAGE - call ApplySubstatus1ToDefendingCard - ret - -ElectabuzzQuickAttack_AIEffect: ; 2e3c0 (b:63c0) - ld a, (10 + 30) / 2 - lb de, 10, 30 - jp SetExpectedAIDamage - -ElectabuzzQuickAttack_DamageBoostEffect: ; 2e3c8 (b:63c8) - ld hl, 20 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsPlusDamageText - call TossCoin_BankB - ret nc ; return if tails - ld a, 20 - call AddToDamage - ret - -MagnemiteSelfdestructEffect: ; 2e3db (b:63db) - ld a, 40 - call DealRecoilDamageToSelf - - ld a, $01 - ld [wIsDamageToSelf], a - ld a, 10 - call DealDamageToAllBenchedPokemon - call SwapTurn - - xor a - ld [wIsDamageToSelf], a - ld a, 10 - call DealDamageToAllBenchedPokemon - call SwapTurn - ret - -ZapdosThunder_Recoil50PercentEffect: ; 2e3fa (b:63fa) - ld hl, 30 - call LoadTxRam3 - ldtx de, IfTailsDamageToYourselfTooText - call TossCoin_BankB - ldh [hTemp_ffa0], a - ret - -ZapdosThunder_RecoilEffect: ; 2e409 (b:6409) - ld hl, 30 - call LoadTxRam3 - ldh a, [hTemp_ffa0] - or a - ret nz ; return if got heads - ld a, 30 - call DealRecoilDamageToSelf - ret - -ThunderboltEffect: ; 2e419 (b:6419) - xor a - call CreateArenaOrBenchEnergyCardList - ld hl, wDuelTempList -; put all energy cards in Discard Pile -.loop - ld a, [hli] - cp $ff - ret z - call PutCardInDiscardPile - jr .loop - -ThunderstormEffect: ; 2e429 (b:6429) - ld a, 1 - ldh [hCurSelectionItem], a - - call SwapTurn - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld c, a - ld b, 0 - ld e, b - jr .next_pkmn - -.check_damage - push de - push bc - call .DisplayText - ld de, $0 - call SwapTurn - call TossCoin_BankB - call SwapTurn - push af - call GetNextPositionInTempList - pop af - ld [hl], a ; store result in list - pop bc - pop de - jr c, .next_pkmn - inc b ; increase number of tails - -.next_pkmn - inc e - dec c - jr nz, .check_damage - -; all coins were tossed for each Benched Pokemon - call GetNextPositionInTempList - ld [hl], $ff - ld a, b - ldh [hTemp_ffa0], a - call Func_3b21 - call SwapTurn - -; tally recoil damage - ldh a, [hTemp_ffa0] - or a - jr z, .skip_recoil - ; deal number of tails times 10 to self - call ATimes10 - call DealRecoilDamageToSelf -.skip_recoil - -; deal damage for Bench Pokemon that got heads - call SwapTurn - ld hl, hTempPlayAreaLocation_ffa1 - ld b, PLAY_AREA_BENCH_1 -.loop_bench - ld a, [hli] - cp $ff - jr z, .done - or a - jr z, .skip_damage ; skip if tails - ld de, 20 - call DealDamageToPlayAreaPokemon_RegularAnim -.skip_damage - inc b - jr .loop_bench - -.done - call SwapTurn - ret - -; displays text for current Bench Pokemon, -; printing its Bench number and name. -.DisplayText ; 2e491 (b:6491) - ld b, e - ldtx hl, BenchText - ld de, wDefaultText - call CopyText - ld a, $30 ; 0 FW character - add b - ld [de], a - inc de - ld a, $20 ; space FW character - ld [de], a - inc de - - ld a, DUELVARS_ARENA_CARD - add b - call GetTurnDuelistVariable - call LoadCardDataToBuffer2_FromDeckIndex - ld hl, wLoadedCard2Name - ld a, [hli] - ld h, [hl] - ld l, a - call CopyText - - xor a - ld [wDuelDisplayedScreen], a - ret - -JolteonQuickAttack_AIEffect: ; 2e4bb (b:64bb) - ld a, (10 + 30) / 2 - lb de, 10, 30 - jp SetExpectedAIDamage - -JolteonQuickAttack_DamageBoostEffect: ; 2e4c3 (b:64c3) - ld hl, 20 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsPlusDamageText - call TossCoin_BankB - ret nc ; return if tails - ld a, 20 - call AddToDamage - ret - -PinMissile_AIEffect: ; 2e4d6 (b:64d6) - ld a, (20 * 4) / 2 - lb de, 0, 80 - jp SetExpectedAIDamage - -PinMissile_MultiplierEffect: ; 2e4de (b:64de) - ld hl, 20 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 4 - call TossCoinATimes_BankB - add a ; a = 2 * heads - call ATimes10 - call SetDefiniteDamage - ret - -Fly_AIEffect: ; 2e4f4 (b:64f4) - ld a, 30 / 2 - lb de, 0, 30 - jp SetExpectedAIDamage - -Fly_Success50PercentEffect: ; 2e4fc (b:64fc) - ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText - call TossCoin_BankB - jr c, .heads - xor a ; ATK_ANIM_NONE - ld [wLoadedAttackAnimation], a - call SetDefiniteDamage - call SetWasUnsuccessful - ret -.heads - ld a, ATK_ANIM_AGILITY_PROTECT - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS1_FLY - call ApplySubstatus1ToDefendingCard - ret - -ThunderJolt_Recoil50PercentEffect: ; 2e51a (b:651a) - ld hl, 10 - call LoadTxRam3 - ldtx de, IfTailsDamageToYourselfTooText - call TossCoin_BankB - ldh [hTemp_ffa0], a - ret - -ThunderJolt_RecoilEffect: ; 2e529 (b:6529) - ld hl, 10 - call LoadTxRam3 - ldh a, [hTemp_ffa0] - or a - ret nz ; return if was heads - ld a, 10 - call DealRecoilDamageToSelf - ret - -Spark_PlayerSelectEffect: ; 2e539 (b:6539) - ld a, $ff - ldh [hTemp_ffa0], a - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp 2 - ret c ; has no Bench Pokemon - - ldtx hl, ChoosePkmnInTheBenchToGiveDamageText - call DrawWideTextBox_WaitForInput - call SwapTurn - bank1call HasAlivePokemonInBench - - ; the following two instructions can be removed - ; since Player selection will overwrite it. - ld a, PLAY_AREA_BENCH_1 - ldh [hTempPlayAreaLocation_ff9d], a - -.loop_input - bank1call OpenPlayAreaScreenForSelection - jr c, .loop_input - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - call SwapTurn - ret - -Spark_AISelectEffect: ; 2e562 (b:6562) - ld a, $ff - ldh [hTemp_ffa0], a - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp 2 - ret c ; has no Bench Pokemon -; AI always picks Pokemon with lowest HP remaining - call GetBenchPokemonWithLowestHP - ldh [hTemp_ffa0], a - ret - -Spark_BenchDamageEffect: ; 2e574 (b:6574) - ldh a, [hTemp_ffa0] - cp $ff - ret z - call SwapTurn - ldh a, [hTemp_ffa0] - ld b, a - ld de, 10 - call DealDamageToPlayAreaPokemon_RegularAnim - call SwapTurn - ret - -Pikachu3GrowlEffect: ; 2e589 (b:6589) - ld a, SUBSTATUS2_GROWL - call ApplySubstatus2ToDefendingCard - ret - -Pikachu4GrowlEffect: ; 2e58f (b:658f) - ld a, SUBSTATUS2_GROWL - call ApplySubstatus2ToDefendingCard - ret - -ChainLightningEffect: ; 2e595 (b:6595) - ld a, 10 - call SetDefiniteDamage - call SwapTurn - call GetArenaCardColor - call SwapTurn - ldh [hCurSelectionItem], a - cp COLORLESS - ret z ; don't damage if colorless - -; opponent's Bench - call SwapTurn - call .DamageSameColorBench - call SwapTurn - -; own Bench - ld a, $01 - ld [wIsDamageToSelf], a - call .DamageSameColorBench - ret - -.DamageSameColorBench ; 2e5ba (b:65ba) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld e, a - ld d, PLAY_AREA_ARENA - jr .next_bench - -.check_damage - ld a, d - call GetPlayAreaCardColor - ld c, a - ldh a, [hCurSelectionItem] - cp c - jr nz, .next_bench ; skip if not same color -; apply damage to this Bench card - push de - ld b, d - ld de, 10 - call DealDamageToPlayAreaPokemon_RegularAnim - pop de - -.next_bench - inc d - dec e - jr nz, .check_damage - ret - -RaichuAgilityEffect: ; 2e5dc (b:65dc) - ldtx de, IfHeadsDoNotReceiveDamageOrEffectText - call TossCoin_BankB - ret nc ; skip if got tails - ld a, ATK_ANIM_AGILITY_PROTECT - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS1_AGILITY - call ApplySubstatus1ToDefendingCard - ret - -RaichuThunder_Recoil50PercentEffect: ; 2e5ee (b:65ee) - ld hl, 30 - call LoadTxRam3 - ldtx de, IfTailsDamageToYourselfTooText - call TossCoin_BankB - ldh [hTemp_ffa0], a - ret - -RaichuThunder_RecoilEffect: ; 2e5fd (b:65fd) - ld hl, 30 - call LoadTxRam3 - ldh a, [hTemp_ffa0] - or a - ret nz ; return if got heads - ld a, 30 - call DealRecoilDamageToSelf - ret - -Gigashock_PlayerSelectEffect: ; 2e60d (b:660d) - call SwapTurn - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - cp 2 - jr nc, .has_bench - call SwapTurn - ld a, $ff - ldh [hTempList], a - ret - -.has_bench - ldtx hl, ChooseUpTo3PkmnOnBenchToGiveDamageText - call DrawWideTextBox_WaitForInput - -; init number of items in list and cursor position - xor a - ldh [hCurSelectionItem], a - ld [wce72], a - bank1call Func_61a1 -.start - bank1call PrintPlayAreaCardList_EnableLCD - push af - ld a, [wce72] - ld hl, BenchSelectionMenuParameters - call InitializeMenuParameters - pop af - -; exclude Arena Pokemon from number of items - dec a - ld [wNumMenuItems], a - -.loop_input - call DoFrame - call HandleMenuInput - jr nc, .loop_input - cp -1 - jr z, .try_cancel - - ld [wce72], a - call .CheckIfChosenAlready - jr nc, .not_chosen - ; play SFX - call Func_3794 - jr .loop_input - -.not_chosen -; mark this Play Area location - ldh a, [hCurMenuItem] - inc a - ld b, SYM_LIGHTNING - call DrawSymbolOnPlayAreaCursor -; store it in the list of chosen Bench Pokemon - call GetNextPositionInTempList - ldh a, [hCurMenuItem] - inc a - ld [hl], a - -; check if 3 were chosen already - ldh a, [hCurSelectionItem] - ld c, a - cp 3 - jr nc, .chosen ; check if already chose 3 - - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - dec a - cp c - jr nz, .start ; if sill more options available, loop back - ; fallthrough if no other options available to choose - -.chosen - ldh a, [hCurMenuItem] - inc a - call Func_2c10b - ldh a, [hKeysPressed] - and B_BUTTON - jr nz, .try_cancel - call SwapTurn - call GetNextPositionInTempList - ld [hl], $ff ; terminating byte - ret - -.try_cancel - ldh a, [hCurSelectionItem] - or a - jr z, .start ; none selected, can safely loop back to start - -; undo last selection made - dec a - ldh [hCurSelectionItem], a - ld e, a - ld d, $00 - ld hl, hTempList - add hl, de - ld a, [hl] - - push af - ld b, SYM_SPACE - call DrawSymbolOnPlayAreaCursor - call EraseCursor - pop af - - dec a - ld [wce72], a - jr .start - -; returns carry if Bench Pokemon -; in register a was already chosen. -.CheckIfChosenAlready: ; 2e6af (b:66af) - inc a - ld c, a - ldh a, [hCurSelectionItem] - ld b, a - ld hl, hTempList - inc b - jr .next_check -.check_chosen - ld a, [hli] - cp c - scf - ret z ; return if chosen already -.next_check - dec b - jr nz, .check_chosen - or a - ret - -Gigashock_AISelectEffect: ; 2e6c3 (b:66c3) -; if Bench has 3 Pokemon or less, no need for selection, -; since AI will choose them all. - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp MAX_PLAY_AREA_POKEMON - 1 - jr nc, .start_selection - -; select them all - ld hl, hTempList - ld b, PLAY_AREA_ARENA - jr .next_bench -.select_bench - ld [hl], b - inc hl -.next_bench - inc b - dec a - jr nz, .select_bench - ld [hl], $ff ; terminating byte - ret - -.start_selection -; has more than 3 Bench cards, proceed to sort them -; by lowest remaining HP to highest, and pick first 3. - call SwapTurn - dec a - ld c, a - ld b, PLAY_AREA_BENCH_1 - -; first select all of the Bench Pokemon and write to list - ld hl, hTempList -.loop_all - ld [hl], b - inc hl - inc b - dec c - jr nz, .loop_all - ld [hl], $00 ; end list with $00 - -; then check each of the Bench Pokemon HP -; sort them from lowest remaining HP to highest. - ld de, hTempList -.loop_outer - ld a, [de] - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - ld c, a - ld l, e - ld h, d - inc hl - -.loop_inner - ld a, [hli] - or a - jr z, .next ; reaching $00 means it's end of list - - push hl - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - pop hl - cp c - jr c, .loop_inner - ; a Bench Pokemon was found with less HP - ld c, a ; store its HP - -; switch the two - dec hl - ld b, [hl] - ld a, [de] - ld [hli], a - ld a, b - ld [de], a - jr .loop_inner - -.next - inc de - ld a, [de] - or a - jr nz, .loop_outer - -; done - ld a, $ff ; terminating byte - ldh [hTempList + 3], a - call SwapTurn - ret - -Gigashock_BenchDamageEffect: ; 2e71f (b:671f) - call SwapTurn - ld hl, hTempList -.loop_selection - ld a, [hli] - cp $ff - jr z, .done - push hl - ld b, a - ld de, 10 - call DealDamageToPlayAreaPokemon_RegularAnim - pop hl - jr .loop_selection -.done - call SwapTurn - ret - -Magneton1SelfdestructEffect: ; 2e739 (b:6739) - ld a, 80 - call DealRecoilDamageToSelf - -; own bench - ld a, $01 - ld [wIsDamageToSelf], a - ld a, 20 - call DealDamageToAllBenchedPokemon - -; opponent's bench - call SwapTurn - xor a - ld [wIsDamageToSelf], a - ld a, 20 - call DealDamageToAllBenchedPokemon - call SwapTurn - ret - -MagnetonSonicboom_UnaffectedByColorEffect: ; 2e758 (b:6758) - ld hl, wDamage + 1 - set UNAFFECTED_BY_WEAKNESS_RESISTANCE_F, [hl] - ret - -MagnetonSonicboom_NullEffect: ; 2e75e (b:675e) - ret - -Magneton2SelfdestructEffect: ; 2e75f (b:675f) - ld a, 100 - call DealRecoilDamageToSelf - -; own bench - ld a, $01 - ld [wIsDamageToSelf], a - ld a, 20 - call DealDamageToAllBenchedPokemon - -; opponent's bench - call SwapTurn - xor a - ld [wIsDamageToSelf], a - ld a, 20 - call DealDamageToAllBenchedPokemon - call SwapTurn - ret - -PealOfThunder_InitialEffect: ; 2e77e (b:677e) - scf - ret - -PealOfThunder_RandomlyDamageEffect: ; 2e780 (b:6780) - call ExchangeRNG - ld de, 30 ; damage to inflict - call RandomlyDamagePlayAreaPokemon - bank1call Func_6e49 - ret - -; randomly damages a Pokemon in play, except -; card that is in [hTempPlayAreaLocation_ff9d]. -; plays thunder animation when Play Area is shown. -; input: -; de = amount of damage to deal -RandomlyDamagePlayAreaPokemon: ; 2e78d (b:678d) - xor a - ld [wNoDamageOrEffect], a - -; choose randomly which Play Area to attack - call UpdateRNGSources - and 1 - jr nz, .opp_play_area - -; own Play Area - ld a, $01 - ld [wIsDamageToSelf], a - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - call Random - ld b, a - ; can't select Zapdos - ldh a, [hTempPlayAreaLocation_ff9d] - cp b - jr z, RandomlyDamagePlayAreaPokemon ; re-roll Pokemon to attack - -.damage - ld a, ATK_ANIM_THUNDER_PLAY_AREA - ld [wLoadedAttackAnimation], a - call DealDamageToPlayAreaPokemon - ret - -.opp_play_area - xor a - ld [wIsDamageToSelf], a - call SwapTurn - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - call Random - ld b, a - call .damage - call SwapTurn - ret - -BigThunderEffect: ; 2e7cb (b:67cb) - call ExchangeRNG - ld de, 70 ; damage to inflict - call RandomlyDamagePlayAreaPokemon - ret - -MagneticStormEffect: ; 2e7d5 (b:67d5) - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable - -; writes in wDuelTempList all deck indices -; of Energy cards attached to Pokemon -; in the Turn Duelist's Play Area. - ld de, wDuelTempList - ld c, 0 -.loop_card_locations - ld a, [hl] - and CARD_LOCATION_PLAY_AREA - jr z, .next_card_location - -; is a card that is in the Play Area - push hl - push de - push bc - ld a, l - call GetCardIDFromDeckIndex - call GetCardType - pop bc - pop de - pop hl - and TYPE_ENERGY - jr z, .next_card_location -; is an Energy card attached to Pokemon in Play Area - ld a, l - ld [de], a - inc de - inc c -.next_card_location - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_card_locations - ld a, $ff ; terminating byte - ld [de], a - -; divide number of energy cards -; by number of Pokemon in Play Area - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld b, a - ld a, c - ld c, -1 -.loop_division - inc c - sub b - jr nc, .loop_division - ; c = floor(a / b) - -; evenly divides the Energy cards randomly -; to every Pokemon in the Play Area. - push bc - ld hl, wDuelTempList - call CountCardsInDuelTempList - call ShuffleCards - ld d, c - ld e, PLAY_AREA_ARENA -.start_attach - ld c, d - inc c - jr .check_done -.attach_energy - ld a, [hli] - push hl - push de - push bc - call AddCardToHand - call PutHandCardInPlayArea - pop bc - pop de - pop hl -.check_done - dec c - jr nz, .attach_energy -; go to next Pokemon in Play Area - inc e ; next in Play Area - dec b - jr nz, .start_attach - pop bc - - push hl - ld hl, hTempList - -; fill hTempList with PLAY_AREA_* locations -; that have Pokemon in them. - push hl - xor a -.loop_init - ld [hli], a - inc a - cp b - jr nz, .loop_init - pop hl - -; shuffle them and distribute -; the remaining cards in random order. - ld a, b - call ShuffleCards - pop hl - ld de, hTempList -.next_random_pokemon - ld a, [hl] - cp $ff - jr z, .done - push hl - push de - ld a, [de] - ld e, a - ld a, [hl] - call AddCardToHand - call PutHandCardInPlayArea - pop de - pop hl - inc hl - inc de - jr .next_random_pokemon - -.done - bank1call DrawDuelMainScene - bank1call DrawDuelHUDs - ldtx hl, TheEnergyCardFromPlayAreaWasMovedText - call DrawWideTextBox_WaitForInput - xor a - call Func_2c10b - ret - -ElectrodeSonicboom_UnaffectedByColorEffect: ; 2e870 (b:6870) - ld hl, wDamage + 1 - set UNAFFECTED_BY_WEAKNESS_RESISTANCE_F, [hl] - ret - -ElectrodeSonicboom_NullEffect: ; 2e876 (b:6876) - ret - -; return carry if no cards in Deck -EnergySpike_DeckCheck: ; 2e877 (b:6877) - call CheckIfDeckIsEmpty - ret - -EnergySpike_PlayerSelectEffect: ; 2e87b (b:687b) - ld a, $ff - ldh [hTemp_ffa0], a - -; search cards in Deck - call CreateDeckCardList - ldtx hl, Choose1BasicEnergyCardFromDeckText - ldtx bc, BasicEnergyText - lb de, SEARCHEFFECT_BASIC_ENERGY, 0 - call LookForCardsInDeck - ret c - - bank1call Func_5591 - ldtx hl, ChooseBasicEnergyCardText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText -.select_card - bank1call DisplayCardList - jr c, .try_cancel - call GetCardIDFromDeckIndex - call GetCardType - cp TYPE_ENERGY_DOUBLE_COLORLESS - jr nc, .select_card ; not a Basic Energy card - and TYPE_ENERGY - jr z, .select_card ; not a Basic Energy card - ; Energy card selected - - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - call EmptyScreen - ldtx hl, ChoosePokemonToAttachEnergyCardText - call DrawWideTextBox_WaitForInput - -; choose a Pokemon in Play Area to attach card - bank1call HasAlivePokemonInPlayArea -.loop_input - bank1call OpenPlayAreaScreenForSelection - jr c, .loop_input - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTempPlayAreaLocation_ffa1], a - ret - -.play_sfx - call Func_3794 - jr .select_card - -.try_cancel -; Player tried exiting screen, if there are -; any Basic Energy cards, Player is forced to select them. -; otherwise, they can safely exit. - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop_deck - ld a, [hl] - cp CARD_LOCATION_DECK - jr nz, .next_card - ld a, l - call GetCardIDFromDeckIndex - call GetCardType - and TYPE_ENERGY - jr z, .next_card - cp TYPE_ENERGY_DOUBLE_COLORLESS - jr c, .play_sfx -.next_card - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_deck - ; can exit - - ld a, $ff - ldh [hTemp_ffa0], a - ret - -EnergySpike_AISelectEffect: ; 2e8f1 (b:68f1) -; AI doesn't select any card - ld a, $ff - ldh [hTemp_ffa0], a - ret - -EnergySpike_AttachEnergyEffect: ; 2e8f6 (b:68f6) - ldh a, [hTemp_ffa0] - cp $ff - jr z, .done - -; add card to hand and attach it to the selected Pokemon - call SearchCardInDeckAndAddToHand - call AddCardToHand - ldh a, [hTempPlayAreaLocation_ffa1] - ld e, a - ldh a, [hTemp_ffa0] - call PutHandCardInPlayArea - call IsPlayerTurn - jr c, .done - -; not Player, so show detail screen -; and which Pokemon was chosen to attach Energy. - ldh a, [hTempPlayAreaLocation_ffa1] - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - ld hl, wLoadedCard1Name - ld de, wTxRam2_b - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - ldh a, [hTemp_ffa0] - ldtx hl, AttachedEnergyToPokemonText - bank1call DisplayCardDetailScreen - -.done - call Func_2c0bd - ret - -JolteonDoubleKick_AIEffect: ; 2e930 (b:6930) - ld a, 40 / 2 - lb de, 0, 40 - jp SetExpectedAIDamage - -JolteonDoubleKick_MultiplierEffect: ; 2e938 (b:6938) - ld hl, 20 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 2 - call TossCoinATimes_BankB - add a ; a = 2 * heads - call ATimes10 - call SetDefiniteDamage - ret - -TailWagEffect: ; 2e94e (b:694e) - ldtx de, IfHeadsOpponentCannotAttackText - call TossCoin_BankB - jp nc, SetWasUnsuccessful - ld a, ATK_ANIM_LURE - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS2_TAIL_WAG - call ApplySubstatus2ToDefendingCard - ret - -EeveeQuickAttack_AIEffect: ; 2e962 (b:5962) - ld a, (10 + 30) / 2 - lb de, 10, 30 - jp SetExpectedAIDamage - -EeveeQuickAttack_DamageBoostEffect: ; 2e96a (b:596a) - ld hl, 20 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsPlusDamageText - call TossCoin_BankB - ret nc ; return if tails - ld a, 20 - call AddToDamage - ret - -SpearowMirrorMove_AIEffect: ; 2e97d (b:697d) - jr MirrorMoveEffects.AIEffect - -SpearowMirrorMove_InitialEffect1: ; 2e97f (b:697f) - jr MirrorMoveEffects.InitialEffect1 - -SpearowMirrorMove_InitialEffect2: ; 2e981 (b:6981) - jr MirrorMoveEffects.InitialEffect2 - -SpearowMirrorMove_PlayerSelection: ; 2e983 (b:6983) - jr MirrorMoveEffects.PlayerSelection - -SpearowMirrorMove_AISelection: ; 2e985 (b:6985) - jr MirrorMoveEffects.AISelection - -SpearowMirrorMove_BeforeDamage: ; 2e987 (b:6987) - jr MirrorMoveEffects.BeforeDamage - -SpearowMirrorMove_AfterDamage: ; 2e989 (b:6989) - jp MirrorMoveEffects.AfterDamage - -; these are effect commands that Mirror Move uses -; in order to mimic last turn's attack. -; it covers all possible effect steps to perform its commands -; (i.e. selection for Amnesia and Energy discarding attacks, etc) -MirrorMoveEffects: ; 2e98c (b:698c) -.AIEffect - ld a, DUELVARS_ARENA_CARD_LAST_TURN_DAMAGE - call GetTurnDuelistVariable - ld a, [hl] - ld [wAIMinDamage], a - ld [wAIMaxDamage], a - ret - -.InitialEffect1 - ld a, DUELVARS_ARENA_CARD_LAST_TURN_DAMAGE - call GetTurnDuelistVariable - ld a, [hli] - or [hl] - inc hl - or [hl] - inc hl - ret nz ; return if has last turn damage - ld a, [hli] - or a - ret nz ; return if has last turn status - ; no attack received last turn - ldtx hl, YouDidNotReceiveAnAttackToMirrorMoveText - scf - ret - -.InitialEffect2 - ld a, $ff - ldh [hTemp_ffa0], a - ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT - call GetTurnDuelistVariable - or a - ret z ; no effect - cp LAST_TURN_EFFECT_AMNESIA - jp z, PlayerPickAttackForAmnesia - or a - ret - -.PlayerSelection - ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT - call GetTurnDuelistVariable - or a - ret z ; no effect -; handle Energy card discard effect - cp LAST_TURN_EFFECT_DISCARD_ENERGY - jp z, HandleEnergyDiscardEffectSelection - ret - -.AISelection - ld a, $ff - ldh [hTemp_ffa0], a - ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT - call GetTurnDuelistVariable - or a - ret z ; no effect - cp LAST_TURN_EFFECT_DISCARD_ENERGY - jr z, .discard_energy - cp LAST_TURN_EFFECT_AMNESIA - jr z, .pick_amnesia_attack - ret - -.discard_energy - call AIPickEnergyCardToDiscardFromDefendingPokemon - ldh [hTemp_ffa0], a - ret - -.pick_amnesia_attack - call AIPickAttackForAmnesia - ldh [hTemp_ffa0], a - ret - -.BeforeDamage -; if was attacked with Amnesia, apply it to the selected attack - ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT - call GetTurnDuelistVariable - cp LAST_TURN_EFFECT_AMNESIA - jr z, .apply_amnesia - -; otherwise, check if there was last turn damage, -; and write it to wDamage. - ld a, DUELVARS_ARENA_CARD_LAST_TURN_DAMAGE - call GetTurnDuelistVariable - ld de, wDamage - ld a, [hli] - ld [de], a - inc de - ld a, [hld] - ld [de], a - or [hl] - jr z, .no_damage - ld a, ATK_ANIM_HIT - ld [wLoadedAttackAnimation], a -.no_damage - inc hl - inc hl ; DUELVARS_ARENA_CARD_LAST_TURN_STATUS -; check if there was a status applied to Defending Pokemon -; from the attack it used. - push hl - ld a, DUELVARS_ARENA_CARD_STATUS - call GetNonTurnDuelistVariable - ld e, l - ld d, h - pop hl - ld a, [hli] - or a - jr z, .no_status - push hl - push de - call .ExecuteStatusEffect - pop de - pop hl -.no_status -; hl is at DUELVARS_ARENA_CARD_LAST_TURN_SUBSTATUS2 -; apply substatus2 to self - ld e, DUELVARS_ARENA_CARD_SUBSTATUS2 - ld a, [hli] - ld [de], a - ret - -.apply_amnesia - call ApplyAmnesiaToAttack - ret - -.AfterDamage: ; 2ea28 (b:6a28) - ld a, [wNoDamageOrEffect] - or a - ret nz ; is unaffected - ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT - call GetTurnDuelistVariable - cp LAST_TURN_EFFECT_DISCARD_ENERGY - jr nz, .change_weakness - -; execute Energy discard effect for card chosen - call SwapTurn - ldh a, [hTemp_ffa0] - call PutCardInDiscardPile - ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT - call GetTurnDuelistVariable - ld [hl], LAST_TURN_EFFECT_DISCARD_ENERGY - call SwapTurn - -.change_weakness - ld a, DUELVARS_ARENA_CARD_LAST_TURN_CHANGE_WEAK - call GetTurnDuelistVariable - ld a, [hl] - or a - ret z ; weakness wasn't changed last turn - - push hl - call SwapTurn - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer2_FromDeckIndex - call SwapTurn - pop hl - - ld a, [wLoadedCard2Weakness] - or a - ret z ; defending Pokemon has no weakness to change - -; apply same color weakness to Defending Pokemon - ld a, [hl] - push af - ld a, DUELVARS_ARENA_CARD_CHANGED_WEAKNESS - call GetNonTurnDuelistVariable - pop af - ld [hl], a - -; print message of weakness color change - ld c, -1 -.loop_color - inc c - rla - jr nc, .loop_color - ld a, c - call SwapTurn - push af - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - pop af - call LoadCardNameAndInputColor - ldtx hl, ChangedTheWeaknessOfPokemonToColorText - call DrawWideTextBox_PrintText - call SwapTurn - ret - -.ExecuteStatusEffect: ; 2ea8f (b:6a8f) - ld c, a - and PSN_DBLPSN - jr z, .cnf_slp_prz - ld b, a - cp DOUBLE_POISONED - push bc - call z, DoublePoisonEffect - pop bc - ld a, b - cp POISONED - push bc - call z, PoisonEffect - pop bc -.cnf_slp_prz - ld a, c - and CNF_SLP_PRZ - ret z - cp CONFUSED - jp z, ConfusionEffect - cp ASLEEP - jp z, SleepEffect - cp PARALYZED - jp z, ParalysisEffect - ret - -FearowAgilityEffect: ; 2eab8 (b:6ab8) - ldtx de, IfHeadsDoNotReceiveDamageOrEffectText - call TossCoin_BankB - ret nc - ld a, ATK_ANIM_AGILITY_PROTECT - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS1_AGILITY - call ApplySubstatus1ToDefendingCard - ret - -; return carry if cannot use Step In -StepIn_BenchCheck: ; 2eaca (b:6aca) - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ldtx hl, CanOnlyBeUsedOnTheBenchText - or a - jr z, .set_carry - - add DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - ldtx hl, OnlyOncePerTurnText - and USED_PKMN_POWER_THIS_TURN - jr nz, .set_carry - - ldh a, [hTempPlayAreaLocation_ff9d] - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - ret - -.set_carry - scf - ret - -StepIn_SwitchEffect: ; 2eae8 (b:6ae8) - ldh a, [hTemp_ffa0] - ld e, a - call SwapArenaWithBenchPokemon - ld a, DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - set USED_PKMN_POWER_THIS_TURN_F, [hl] - ret - -Dragonite2Slam_AIEffect: ; 2eaf6 (b:6af6) - ld a, (40 * 2) / 2 - lb de, 0, 80 - jp SetExpectedAIDamage - -Dragonite2Slam_MultiplierEffect: ; 2eafe (b:6afe) - ld hl, 40 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 2 - call TossCoinATimes_BankB - add a - add a - call ATimes10 - call SetDefiniteDamage - ret - -ThickSkinnedEffect: ; 2eb15 (b:6b15) - scf - ret - -LeekSlap_AIEffect: ; 2eb17 (b:6b17) - ld a, 30 / 2 - lb de, 0, 30 - jp SetExpectedAIDamage - -; return carry if already used attack in this duel -LeekSlap_OncePerDuelCheck: ; 2eb1f (b:6b1f) -; can only use attack if it was never used before this duel - ld a, DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - and USED_LEEK_SLAP_THIS_DUEL - ret z - ldtx hl, ThisAttackCannotBeUsedTwiceText - scf - ret - -LeekSlap_SetUsedThisDuelFlag: ; 2eb2c (b:6b2c) - ld a, DUELVARS_ARENA_CARD_FLAGS - call GetTurnDuelistVariable - set USED_LEEK_SLAP_THIS_DUEL_F, [hl] - ret - -LeekSlap_NoDamage50PercentEffect: ; 2eb34 (b:6b34) - ldtx de, DamageCheckIfTailsNoDamageText - call TossCoin_BankB - ret c - xor a ; 0 damage - call SetDefiniteDamage - ret - -FetchEffect: ; 2eb40 (b:6b40) - ldtx hl, Draw1CardFromTheDeckText - call DrawWideTextBox_WaitForInput - bank1call DisplayDrawOneCardScreen - call DrawCardFromDeck - ret c ; return if deck is empty - call AddCardToHand - call LoadCardDataToBuffer1_FromDeckIndex - ld a, [wDuelistType] - cp DUELIST_TYPE_PLAYER - ret nz - ; show card on screen if it was Player - bank1call OpenCardPage_FromHand - ret - -CometPunch_AIEffect: ; 2eb5d (b:6b5d) - ld a, (20 * 4) / 2 - lb de, 0, 80 - jp SetExpectedAIDamage - -CometPunch_MultiplierEffect: ; 2eb65 (b:6b65) - ld hl, 20 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 4 - call TossCoinATimes_BankB - add a - call ATimes10 - call SetDefiniteDamage - ret - -TaurosStomp_AIEffect: ; 2eb7b (b:6b7b) - ld a, (20 + 30) / 2 - lb de, 20, 30 - jp SetExpectedAIDamage - -TaurosStomp_DamageBoostEffect: ; 2eb83 (b:6b83) - ld hl, 10 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsPlusDamageText - call TossCoin_BankB - ret nc ; tails - ld a, 10 - call AddToDamage - ret - -Rampage_AIEffect: ; 2eb96 (b:6b96) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - call AddToDamage - jp SetDefiniteAIDamage - -Rampage_Confusion50PercentEffect: ; 2eba1 (b:6ba1) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - call AddToDamage - ldtx de, IfTailsYourPokemonBecomesConfusedText - call TossCoin_BankB - ret c ; heads - call SwapTurn - call ConfusionEffect - call SwapTurn - ret - -FuryAttack_AIEffect: ; 2ebba (b:6bba) - ld a, (10 * 2) / 2 - lb de, 0, 20 - jp SetExpectedAIDamage - -FuryAttack_MultiplierEffect: ; 2ebc2 (b:6bc2) - ld hl, 10 - call LoadTxRam3 - ld a, 2 - ldtx de, DamageCheckIfHeadsXDamageText - call TossCoinATimes_BankB - call ATimes10 - call SetDefiniteDamage - ret - -RetreatAidEffect: ; 2ebd7 (b:6bd7) - scf - ret - -DodrioRage_AIEffect: ; 2ebd9 (b:6bd9) - call DodrioRage_DamageBoostEffect - jp SetDefiniteAIDamage - -DodrioRage_DamageBoostEffect: ; 2ebdf (b:6bdf) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - call AddToDamage - ret - -PayDayEffect: ; 2ebe8 (b:6be8) - ldtx de, IfHeadsDraw1CardFromDeckText - call TossCoin_BankB - ret nc ; tails - ldtx hl, Draw1CardFromTheDeckText - call DrawWideTextBox_WaitForInput - bank1call DisplayDrawOneCardScreen - call DrawCardFromDeck - ret c ; empty deck - call AddCardToHand - call LoadCardDataToBuffer1_FromDeckIndex - ld a, [wDuelistType] - cp DUELIST_TYPE_PLAYER - ret nz - ; show card on screen if it was Player - bank1call OpenCardPage_FromHand - ret - -DragonairSlam_AIEffect: ; 2ec0c (b:6c0c) - ld a, (30 * 2) / 2 - lb de, 0, 60 - jp SetExpectedAIDamage - -DragonairSlam_MultiplierEffect: ; 2ec14 (b:6c14) - ld hl, 30 - call LoadTxRam3 - ld a, 2 - ldtx de, DamageCheckIfHeadsXDamageText - call TossCoinATimes_BankB - ld e, a - add a - add e - call ATimes10 - call SetDefiniteDamage - ret - -DragonairHyperBeam_PlayerSelectEffect: ; 2ec2c (b:6c2c) - jp HandleEnergyDiscardEffectSelection - -DragonairHyperBeam_AISelectEffect: ; 2ec2f (b:6c2f) - call AIPickEnergyCardToDiscardFromDefendingPokemon - ldh [hTemp_ffa0], a - ret - -DragonairHyperBeam_DiscardEffect: ; 2ec35 (b:6c35) - call HandleNoDamageOrEffect - ret c ; is unaffected - ldh a, [hTemp_ffa0] - cp $ff - ret z ; no energy card chosen - call SwapTurn - call PutCardInDiscardPile - ld a, DUELVARS_ARENA_CARD_LAST_TURN_EFFECT - call GetTurnDuelistVariable - ld [hl], LAST_TURN_EFFECT_DISCARD_ENERGY - call SwapTurn - ret - -; handles screen for selecting an Energy card to discard -; that is attached to Defending Pokemon, -; and store the Player selection in [hTemp_ffa0]. -HandleEnergyDiscardEffectSelection: ; 2ec4f (b:6c4f) - call SwapTurn - xor a ; PLAY_AREA_ARENA - call CreateArenaOrBenchEnergyCardList - jr c, .no_energy - ldtx hl, ChooseDiscardEnergyCardFromOpponentText - call DrawWideTextBox_WaitForInput - xor a ; PLAY_AREA_ARENA - bank1call DisplayEnergyDiscardScreen - -.loop_input - bank1call HandleEnergyDiscardMenuInput - jr c, .loop_input - - call SwapTurn - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a ; store selected card to discard - ret - -.no_energy - call SwapTurn - ld a, $ff - ldh [hTemp_ffa0], a - ret - -; return carry if Defending Pokemon has no attacks -ClefableMetronome_CheckAttacks: ; 2ec77 (b:6c77) - call CheckIfDefendingPokemonHasAnyAttack - ldtx hl, NoAttackMayBeChoosenText - ret - -ClefableMetronome_AISelectEffect: ; 2ec7e (b:6c7e) - call HandleAIMetronomeEffect - ret - -ClefableMetronome_UseAttackEffect: ; 2ec82 (b:6c82) - ld a, 1 ; energy cost of this attack - call HandlePlayerMetronomeEffect - ret - -ClefableMinimizeEffect: ; 2ec88 (b:6c88) - ld a, SUBSTATUS1_REDUCE_BY_20 - call ApplySubstatus1ToDefendingCard - ret - -HurricaneEffect: ; 2ec8e (b:6c8e) - call HandleNoDamageOrEffect - ret c ; is unaffected - - ld a, DUELVARS_ARENA_CARD_HP - call GetNonTurnDuelistVariable - or a - ret z ; return if Pokemon was KO'd - -; look at all the card locations and put all cards -; that are in the Arena in the hand. - call SwapTurn - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop_locations - ld a, [hl] - cp CARD_LOCATION_ARENA - jr nz, .next_card - ; card in Arena found, put in hand - ld a, l - call AddCardToHand -.next_card - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_locations - -; empty the Arena card slot - ld l, DUELVARS_ARENA_CARD - ld a, [hl] - ld [hl], $ff - ld l, DUELVARS_ARENA_CARD_HP - ld [hl], 0 - call LoadCardDataToBuffer1_FromDeckIndex - ld hl, wLoadedCard1Name - ld a, [hli] - ld h, [hl] - ld l, a - call LoadTxRam2 - ldtx hl, PokemonAndAllAttachedCardsReturnedToHandText - call DrawWideTextBox_WaitForInput - xor a - ld [wDuelDisplayedScreen], a - call SwapTurn - ret - -PidgeottoWhirlwind_SelectEffect: ; 2ecd3 (b:6cd3) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp 2 - jr nc, .switch - ; no Bench Pokemon - ld a, $ff - ldh [hTemp_ffa0], a - ret -.switch - call DuelistSelectForcedSwitch - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ret - -PidgeottoWhirlwind_SwitchEffect: ; 2ece9 (b:6ce9) - ldh a, [hTemp_ffa0] - call HandleSwitchDefendingPokemonEffect - ret - -PidgeottoMirrorMove_AIEffect: ; 2ecef (b:6cef) - jp MirrorMoveEffects.AIEffect - -PidgeottoMirrorMove_InitialEffect1: ; 2ecf2 (b:6cf2) - jp MirrorMoveEffects.InitialEffect1 - -PidgeottoMirrorMove_InitialEffect2: ; 2ecf5 (b:6cf5) - jp MirrorMoveEffects.InitialEffect2 - -PidgeottoMirrorMove_PlayerSelection: ; 2ecf8 (b:6cf8) - jp MirrorMoveEffects.PlayerSelection - -PidgeottoMirrorMove_AISelection: ; 2ecfb (b:6cfb) - jp MirrorMoveEffects.AISelection - -PidgeottoMirrorMove_BeforeDamage: ; 2ecfe (b:6cfe) - jp MirrorMoveEffects.BeforeDamage - -PidgeottoMirrorMove_AfterDamage: ; 2ed01 (b:6d01) - jp MirrorMoveEffects.AfterDamage - -SingEffect: ; 2ed04 (b:6d04) - call Sleep50PercentEffect - call nc, SetNoEffectFromStatus - ret - -; return carry if Defending Pokemon has no attacks -ClefairyMetronome_CheckAttacks: ; 2ed0b (b:6d0b) - call CheckIfDefendingPokemonHasAnyAttack - ldtx hl, NoAttackMayBeChoosenText - ret - -ClefairyMetronome_AISelectEffect: ; 2ed12 (b:6d12) - call HandleAIMetronomeEffect - ret - -ClefairyMetronome_UseAttackEffect: ; 2ed16 (b:6d16) - ld a, 3 ; energy cost of this attack -; fallthrough - -; handles Metronome selection, and validates -; whether it can use the selected attack. -; if unsuccessful, returns carry. -; input: -; a = amount of colorless energy needed for Metronome -HandlePlayerMetronomeEffect: ; 2ed18 (b:6d18) - ld [wMetronomeEnergyCost], a - ldtx hl, ChooseOppAttackToBeUsedWithMetronomeText - call DrawWideTextBox_WaitForInput - - call HandleDefendingPokemonAttackSelection - ret c ; return if operation cancelled - -; store this attack as selected attack to use - ld hl, wMetronomeSelectedAttack - ld [hl], d - inc hl - ld [hl], e - -; compare selected attack's name with -; the attack that is loaded, which is Metronome. -; if equal, then cannot select it. -; (i.e. cannot use Metronome with Metronome.) - ld hl, wLoadedAttackName - ld a, [hli] - ld h, [hl] - ld l, a - push hl - call SwapTurn - call CopyAttackDataAndDamage_FromDeckIndex - call SwapTurn - pop de - ld hl, wLoadedAttackName - ld a, e - cp [hl] - jr nz, .try_use - inc hl - ld a, d - cp [hl] - jr nz, .try_use - ; cannot select Metronome - ldtx hl, UnableToSelectText -.failed - call DrawWideTextBox_WaitForInput -.set_carry - scf - ret - -.try_use -; run the attack checks to determine -; whether it can be used. - ld a, EFFECTCMDTYPE_INITIAL_EFFECT_1 - call TryExecuteEffectCommandFunction - jr c, .failed - ld a, EFFECTCMDTYPE_INITIAL_EFFECT_2 - call TryExecuteEffectCommandFunction - jr c, .set_carry - ; successful - -; send data to link opponent - bank1call SendAttackDataToLinkOpponent - ld a, OPPACTION_USE_METRONOME_ATTACK - call SetOppAction_SerialSendDuelData - ld hl, wMetronomeSelectedAttack - ld d, [hl] - inc hl - ld e, [hl] - ld a, [wMetronomeEnergyCost] - ld c, a - call SerialSend8Bytes - - ldh a, [hTempCardIndex_ff9f] - ld [wPlayerAttackingCardIndex], a - ld a, [wSelectedAttack] - ld [wPlayerAttackingAttackIndex], a - ld a, [wTempCardID_ccc2] - ld [wPlayerAttackingCardID], a - or a - ret - -; does nothing for AI. -HandleAIMetronomeEffect: ; 2ed86 (b:6d86) - ret - -DoTheWaveEffect: ; 2ed87 (b:6d87) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - dec a ; don't count arena card - call ATimes10 - call AddToDamage - ret - -; return carry if no damage counters -FirstAid_DamageCheck: ; 2ed94 (b:6d94) - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - ldtx hl, NoDamageCountersText - cp 10 - ret - -FirstAid_HealEffect: ; 2ed9f (b:6d9f) - lb de, 0, 10 - call ApplyAndAnimateHPRecovery - ret - -JigglypuffDoubleEdgeEffect: ; 2eda6 (b:6da6) - ld a, 20 - call DealRecoilDamageToSelf - ret - -PounceEffect: ; 2edac (b:6dac) - ld a, SUBSTATUS2_POUNCE - call ApplySubstatus2ToDefendingCard - ret - -LickitungSupersonicEffect: ; 2edb2 (b:6db2) - call Confusion50PercentEffect - call nc, SetNoEffectFromStatus - ret - -PidgeyWhirlwind_SelectEffect: ; 2edb9 (b:6db9) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - cp 2 - jr nc, .switch - ; no Bench Pokemon - ld a, $ff - ldh [hTemp_ffa0], a - ret -.switch - call DuelistSelectForcedSwitch - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ret - -PidgeyWhirlwind_SwitchEffect: ; 2edcf (b:6dcf) - ldh a, [hTemp_ffa0] - call HandleSwitchDefendingPokemonEffect - ret - -; return carry if Defending card has no weakness -Conversion1_WeaknessCheck: ; 2edd5 (b:6dd5) - call SwapTurn - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer2_FromDeckIndex - call SwapTurn - ld a, [wLoadedCard2Weakness] - or a - ret nz - ldtx hl, NoWeaknessText - scf - ret - -Conversion1_PlayerSelectEffect: ; 2eded (b:6ded) - ldtx hl, ChooseWeaknessYouWishToChangeText - xor a ; PLAY_AREA_ARENA - call HandleColorChangeScreen - ldh [hTemp_ffa0], a - ret - -Conversion1_AISelectEffect: ; 2edf7 (b:6df7) - call AISelectConversionColor - ret - -Conversion1_ChangeWeaknessEffect: ; 2edfb (b:6dfb) - call HandleNoDamageOrEffect - ret c ; is unaffected - -; apply changed weakness - ld a, DUELVARS_ARENA_CARD_CHANGED_WEAKNESS - call GetNonTurnDuelistVariable - ldh a, [hTemp_ffa0] - call TranslateColorToWR - ld [hl], a - ld l, DUELVARS_ARENA_CARD_LAST_TURN_CHANGE_WEAK - ld [hl], a - -; print text box - call SwapTurn - ldtx hl, ChangedTheWeaknessOfPokemonToColorText - call PrintArenaCardNameAndColorText - call SwapTurn - -; apply substatus - ld a, SUBSTATUS2_CONVERSION2 - call ApplySubstatus2ToDefendingCard - ret - -; returns carry if Active Pokemon has no Resistance. -Conversion2_ResistanceCheck: ; 2ee1f (b:6e1f) - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Resistance] - or a - ret nz - ldtx hl, NoResistanceText - scf - ret - -Conversion2_PlayerSelectEffect: ; 2ee31 (b:6e31) - ldtx hl, ChooseResistanceYouWishToChangeText - ld a, $80 - call HandleColorChangeScreen - ldh [hTemp_ffa0], a - ret - -Conversion2_AISelectEffect: ; 2ee3c (b:6e3c) -; AI will choose Defending Pokemon's color -; unless it is colorless. - call SwapTurn - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - call SwapTurn - ld a, [wLoadedCard1Type] - cp COLORLESS - jr z, .is_colorless - ldh [hTemp_ffa0], a - ret - -.is_colorless - call SwapTurn - call AISelectConversionColor - call SwapTurn - ret - -Conversion2_ChangeResistanceEffect: ; 2ee5e (b:6e5e) -; apply changed resistance - ld a, DUELVARS_ARENA_CARD_CHANGED_RESISTANCE - call GetTurnDuelistVariable - ldh a, [hTemp_ffa0] - call TranslateColorToWR - ld [hl], a - ldtx hl, ChangedTheResistanceOfPokemonToColorText -; fallthrough - -; prints text that requires card name and color, -; with the card name of the Turn Duelist's Arena Pokemon -; and color in [hTemp_ffa0]. -; input: -; hl = text to print -PrintArenaCardNameAndColorText: ; 2ee6c (b:6e6c) - push hl - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - ldh a, [hTemp_ffa0] - call LoadCardNameAndInputColor - pop hl - call DrawWideTextBox_PrintText - ret - -; handles AI logic for selecting a new color -; for weakness/resistance. -; - if within the context of Conversion1, looks -; in own Bench for a non-colorless card that can attack. -; - if within the context of Conversion2, looks -; in Player's Bench for a non-colorless card that can attack. -AISelectConversionColor: ; 2ee7f (b:6e7f) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld d, a - ld e, PLAY_AREA_ARENA - jr .next_pkmn_atk - -; look for a non-colorless Bench Pokemon -; that has enough energy to use an attack. -.loop_atk - push de - call GetPlayAreaCardAttachedEnergies - ld a, e - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - ld d, a - call LoadCardDataToBuffer1_FromDeckIndex - ld a, [wLoadedCard1Type] - cp COLORLESS - jr z, .skip_pkmn_atk ; skip colorless Pokemon - ld e, FIRST_ATTACK_OR_PKMN_POWER - bank1call _CheckIfEnoughEnergiesToAttack - jr nc, .found - ld e, SECOND_ATTACK - bank1call _CheckIfEnoughEnergiesToAttack - jr nc, .found -.skip_pkmn_atk - pop de -.next_pkmn_atk - inc e - dec d - jr nz, .loop_atk - -; none found in Bench. -; next, look for a non-colorless Bench Pokemon -; that has any Energy cards attached. - ld d, e ; number of Play Area Pokemon - ld e, PLAY_AREA_ARENA - jr .next_pkmn_energy - -.loop_energy - push de - call GetPlayAreaCardAttachedEnergies - ld a, [wTotalAttachedEnergies] - or a - jr z, .skip_pkmn_energy - ld a, e - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - ld d, a - call LoadCardDataToBuffer1_FromDeckIndex - ld a, [wLoadedCard1Type] - cp COLORLESS - jr nz, .found -.skip_pkmn_energy - pop de -.next_pkmn_energy - inc e - dec d - jr nz, .loop_energy - -; otherwise, just select a random energy. - ld a, NUM_COLORED_TYPES - call Random - ldh [hTemp_ffa0], a - ret - -.found - pop de - ld a, [wLoadedCard1Type] - and TYPE_PKMN - ldh [hTemp_ffa0], a - ret - -ScrunchEffect: ; 2eee7 (b:6ee7) - ldtx de, IfHeadsNoDamageNextTurnText - call TossCoin_BankB - jp nc, SetWasUnsuccessful - ld a, ATK_ANIM_SCRUNCH - ld [wLoadedAttackAnimation], a - ld a, SUBSTATUS1_NO_DAMAGE_17 - call ApplySubstatus1ToDefendingCard - ret - -ChanseyDoubleEdgeEffect: ; 2eefb (b:6efb) - ld a, 80 - call DealRecoilDamageToSelf - ret - -SuperFang_AIEffect: ; 2ef01 (b:6f01) - call SuperFang_HalfHPEffect - jp SetDefiniteAIDamage - -SuperFang_HalfHPEffect: ; 2ef07 (b:6f07) - ld a, DUELVARS_ARENA_CARD_HP - call GetNonTurnDuelistVariable - srl a - bit 0, a - jr z, .rounded - ; round up - add 5 -.rounded - call SetDefiniteDamage - ret - -; return carry if no Pokemon in Bench -TrainerCardAsPokemon_BenchCheck: ; 2ef18 (b:6f18) - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, EffectNoPokemonOnTheBenchText - cp 2 - ret - -TrainerCardAsPokemon_PlayerSelectSwitch: ; 2ef27 (b:6f27) - ldh a, [hTemp_ffa0] - or a - ret nz ; no need to switch if it's not Arena card - - ldtx hl, SelectPokemonToPlaceInTheArenaText - call DrawWideTextBox_WaitForInput - bank1call HasAlivePokemonInBench - bank1call OpenPlayAreaScreenForSelection - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTempPlayAreaLocation_ffa1], a - ret - -TrainerCardAsPokemon_DiscardEffect: ; 2ef3c (b:6f3c) - ldh a, [hTemp_ffa0] - ld e, a - call MovePlayAreaCardToDiscardPile - ldh a, [hTemp_ffa0] - or a - jr nz, .shift_cards - ldh a, [hTempPlayAreaLocation_ffa1] - ld e, a - call SwapArenaWithBenchPokemon -.shift_cards - call ShiftAllPokemonToFirstPlayAreaSlots - ret - -HealingWind_InitialEffect: ; 2ef51 (b:6f51) - scf - ret - -HealingWind_PlayAreaHealEffect: ; 2ef53 (b:6f53) -; play initial animation - ldh a, [hTempPlayAreaLocation_ff9d] - ld b, a - ld c, $00 - ldh a, [hWhoseTurn] - ld h, a - bank1call PlayAttackAnimation - bank1call WaitAttackAnimation - ld a, ATK_ANIM_HEALING_WIND_PLAY_AREA - ld [wLoadedAttackAnimation], a - - - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld d, a - ld e, PLAY_AREA_ARENA -.loop_play_area - push de - ld a, e - ldh [hTempPlayAreaLocation_ff9d], a - call GetCardDamageAndMaxHP - or a - jr z, .next_pkmn ; skip if no damage - -; if less than 20 damage, cap recovery at 10 damage - ld de, 20 - cp e - jr nc, .heal - ld e, a - -.heal -; add HP to this card - ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - add e - ld [hl], a - -; play heal animation - ldh a, [hTempPlayAreaLocation_ff9d] - ld b, a - ld c, $01 - ldh a, [hWhoseTurn] - ld h, a - bank1call PlayAttackAnimation - bank1call WaitAttackAnimation -.next_pkmn - pop de - inc e - dec d - jr nz, .loop_play_area - - ret - -Dragonite1Slam_AIEffect: ; 2ef9c (b:6f9c) - ld a, (30 * 2) / 2 - lb de, 0, 60 - jp SetExpectedAIDamage - -Dragonite1Slam_MultiplierEffect: ; 2efa4 (b:6fa4) - ld hl, 30 - call LoadTxRam3 - ldtx de, DamageCheckIfHeadsXDamageText - ld a, 2 - call TossCoinATimes_BankB - ld c, a - add a - add c - call ATimes10 - call SetDefiniteDamage - ret - -; possibly unreferenced -Func_2efbc: ; 2efbc (b:6fbc) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld c, a - ld l, DUELVARS_ARENA_CARD_HP - ld de, wce76 -.asm_2efc7 - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .asm_2efc7 - ret - -; possibly unreferenced -Func_2efce: ; 2efce (b:6fce) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld c, a - ld l, DUELVARS_ARENA_CARD_HP - ld de, wce76 -.asm_2efd9 - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .asm_2efd9 - ret - -CatPunchEffect: ; 2efe0 (b:6fe0) - call SwapTurn - call PickRandomPlayAreaCard - ld b, a - ld a, ATK_ANIM_CAT_PUNCH_PLAY_AREA - ld [wLoadedAttackAnimation], a - ld de, 20 - call DealDamageToPlayAreaPokemon - call SwapTurn - ret - -MorphEffect: ; 2eff6 (b:6ff6) - call ExchangeRNG - call .PickRandomBasicPokemonFromDeck - jr nc, .successful - ldtx hl, AttackUnsuccessfulText - call DrawWideTextBox_WaitForInput - ret - -.successful - ld a, DUELVARS_ARENA_CARD_STAGE - call GetTurnDuelistVariable - or a - jr z, .skip_discard_stage_below - -; if this is a stage 1 Pokemon (in case it's used -; by Clefable's Metronome attack) then first discard -; the lower stage card. - push hl - xor a - ldh [hTempPlayAreaLocation_ff9d], a - bank1call GetCardOneStageBelow - ld a, d - call PutCardInDiscardPile - pop hl - ld [hl], BASIC - -.skip_discard_stage_below -; overwrite card ID - ldh a, [hTempCardIndex_ff98] - call GetCardIDFromDeckIndex - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - ldh [hTempCardIndex_ff98], a - call _GetCardIDFromDeckIndex - ld [hl], e - -; overwrite HP to new card's maximum HP - ld e, PLAY_AREA_ARENA - call GetCardDamageAndMaxHP - ld a, DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - ld [hl], c - -; clear changed color and status - ld l, DUELVARS_ARENA_CARD_CHANGED_TYPE - ld [hl], $00 - call ClearAllStatusConditions - -; load both card's names for printing text - ld a, [wTempTurnDuelistCardID] - ld e, a - ld d, $00 - call LoadCardDataToBuffer2_FromCardID - ld hl, wLoadedCard2Name - ld de, wTxRam2 - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - inc de - ldh a, [hTempCardIndex_ff98] - call LoadCardDataToBuffer2_FromDeckIndex - ld hl, wLoadedCard2Name - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - ldtx hl, MetamorphsToText - call DrawWideTextBox_WaitForInput - - xor a - ld [wDuelDisplayedScreen], a - ret - -; picks a random Pokemon in the Deck to morph. -; needs to be a Basic Pokemon that doesn't have -; the same ID as the Arena card. -; returns carry if no Pokemon were found. -.PickRandomBasicPokemonFromDeck ; 2f06a (b:706a) - call CreateDeckCardList - ret c ; empty deck - ld hl, wDuelTempList - call ShuffleCards -.loop_deck - ld a, [hli] - ldh [hTempCardIndex_ff98], a - cp $ff - jr z, .set_carry - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - jr nc, .loop_deck ; skip non-Pokemon cards - ld a, [wLoadedCard2Stage] - or a - jr nz, .loop_deck ; skip non-Basic cards - ld a, [wLoadedCard2ID] - cp DUELVARS_ARENA_CARD - jr z, .loop_deck ; skip cards with same ID as Arena card - ldh a, [hTempCardIndex_ff98] - or a - ret -.set_carry - scf - ret - -; returns in a and [hTempCardIndex_ff98] the deck index -; of random Basic Pokemon card in deck. -; if none are found, return carry. -PickRandomBasicCardFromDeck: ; 2f098 (b:7098) - call CreateDeckCardList - ret c ; return if empty deck - ld hl, wDuelTempList - call ShuffleCards -.loop_deck - ld a, [hli] - ldh [hTempCardIndex_ff98], a - cp $ff - jr z, .set_carry - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - jr nc, .loop_deck ; skip if not Pokemon card - ld a, [wLoadedCard2Stage] - or a - jr nz, .loop_deck ; skip if not Basic stage - ldh a, [hTempCardIndex_ff98] - or a - ret -.set_carry - scf - ret - -SlicingWindEffect: ; 2f0bf (b:70bf) - call SwapTurn - call PickRandomPlayAreaCard - ld b, a - ld de, 30 - call DealDamageToPlayAreaPokemon_RegularAnim - call SwapTurn - ret - -Gale_LoadAnimation: ; 2f0d0 (b:70d0) - ld a, ATK_ANIM_GALE - ld [wLoadedAttackAnimation], a - ret - -Gale_SwitchEffect: ; 2f0d6 (b:70d6) -; if Defending card is unaffected by attack -; jump directly to switching this card only. - call HandleNoDamageOrEffect - jr c, .SwitchWithRandomBenchPokemon - -; handle switching Defending card - ld a, DUELVARS_ARENA_CARD_HP - call GetNonTurnDuelistVariable - or a - jr nz, .skip_destiny_bond - bank1call HandleDestinyBondSubstatus -.skip_destiny_bond - call SwapTurn - call .SwitchWithRandomBenchPokemon - jr c, .skip_clear_damage -; clear dealt damage because Pokemon was switched - xor a - ld hl, wDealtDamage - ld [hli], a - ld [hl], a -.skip_clear_damage - call SwapTurn -; fallthrough for attacking card switch - -.SwitchWithRandomBenchPokemon - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - cp 2 - ret c ; return if no Bench Pokemon - -; get random Bench location and swap - dec a - call Random - inc a - ld e, a - call SwapArenaWithBenchPokemon - - xor a - ld [wDuelDisplayedScreen], a - ret - -; return carry if Bench is full -FriendshipSong_BenchCheck: ; 2f10d (b:710d) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, NoSpaceOnTheBenchText - cp MAX_PLAY_AREA_POKEMON - ccf - ret - -FriendshipSong_AddToBench50PercentEffect: ; 2f119 (b:7119) - ldtx de, SuccessCheckIfHeadsAttackIsSuccessfulText - call TossCoin_BankB - jr c, .successful - -.none_came_text - ldtx hl, NoneCameText - call DrawWideTextBox_WaitForInput - ret - -.successful - call PickRandomBasicCardFromDeck - jr nc, .put_in_bench - ld a, ATK_ANIM_FRIENDSHIP_SONG - call Func_2c12e - call .none_came_text - call Func_2c0bd - ret - -.put_in_bench - call SearchCardInDeckAndAddToHand - call AddCardToHand - call PutHandPokemonCardInPlayArea - ld a, ATK_ANIM_FRIENDSHIP_SONG - call Func_2c12e - ldh a, [hTempCardIndex_ff98] - ldtx hl, CameToTheBenchText - bank1call DisplayCardDetailScreen - call Func_2c0bd - ret - -ExpandEffect: ; 2f153 (b:7153) - ld a, SUBSTATUS1_REDUCE_BY_10 - call ApplySubstatus1ToDefendingCard - ret - -; returns carry if either there are no damage counters -; or no Energy cards attached in the Play Area. -SuperPotion_DamageEnergyCheck: ; 2f159 (b:7159) - call CheckIfPlayAreaHasAnyDamage - ldtx hl, NoPokemonWithDamageCountersText - ret c ; no damage counters - call CheckIfThereAreAnyEnergyCardsAttached - ldtx hl, ThereIsNoEnergyCardAttachedText - ret - -SuperPotion_PlayerSelectEffect: ; 2f167 (b:7167) - ldtx hl, ChoosePokemonToRemoveDamageCounterFromText - call DrawWideTextBox_WaitForInput -.start - bank1call HasAlivePokemonInPlayArea -.read_input - bank1call OpenPlayAreaScreenForSelection - ret c ; exit if B is pressed - ld e, a - call GetCardDamageAndMaxHP - or a - jr z, .read_input ; Pokemon has no damage? - ldh a, [hCurMenuItem] - ld e, a - call GetPlayAreaCardAttachedEnergies - ld a, [wTotalAttachedEnergies] - or a - jr nz, .got_pkmn - ; no energy cards attached - ldtx hl, NoEnergyCardsText - call DrawWideTextBox_WaitForInput - jr .start - -.got_pkmn -; Pokemon has damage and Energy cards attached, -; prompt the Player for Energy selection to discard. - ldh a, [hCurMenuItem] - bank1call CreateArenaOrBenchEnergyCardList - ldh a, [hCurMenuItem] - bank1call DisplayEnergyDiscardScreen - bank1call HandleEnergyDiscardMenuInput - ret c ; exit if B was pressed - - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTempPlayAreaLocation_ffa1], a - ld e, a - -; cap the healing damage if -; it would make it exceed max HP. - call GetCardDamageAndMaxHP - ld c, 40 - cp 40 - jr nc, .heal - ld c, a -.heal - ld a, c - ldh [hPlayAreaEffectTarget], a - or a - ret - -SuperPotion_HealEffect: ; 2f1b5 (b:71b5) - ldh a, [hTemp_ffa0] - call PutCardInDiscardPile - ldh a, [hTempPlayAreaLocation_ffa1] - ldh [hTempPlayAreaLocation_ff9d], a - ldh a, [hPlayAreaEffectTarget] - call HealPlayAreaCardHP - ret - -; checks if there is at least one Energy card -; attached to some card in the Turn Duelist's Play Area. -; return no carry if one is found, -; and returns carry set if none is found. -CheckIfThereAreAnyEnergyCardsAttached: ; 2f1c4 (b:71c4) - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop_deck - ld a, [hl] - bit CARD_LOCATION_PLAY_AREA_F, a - jr z, .next_card ; skip if not in Play Area - ld a, l - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_TRAINER - jr z, .next_card ; skip if it's a Trainer card - cp TYPE_ENERGY - jr nc, .found -.next_card - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_deck - scf - ret -.found - or a - ret - -; handles Player selection for Pokemon in Play Area, -; then opens screen to choose one of the energy cards -; attached to that selected Pokemon. -; outputs the selection in: -; [hTemp_ffa0] = play area location -; [hTempPlayAreaLocation_ffa1] = index of energy card -HandlePokemonAndEnergySelectionScreen: ; 2f1e7 (b:71e7) - bank1call HasAlivePokemonInPlayArea - bank1call OpenPlayAreaScreenForSelection - ret c ; exit if B is pressed - ld e, a - call GetPlayAreaCardAttachedEnergies - ld a, [wTotalAttachedEnergies] - or a - jr nz, .has_energy - ldtx hl, NoEnergyCardsText - call DrawWideTextBox_WaitForInput - jr HandlePokemonAndEnergySelectionScreen ; loop back to start - -.has_energy - ldh a, [hCurMenuItem] - bank1call CreateArenaOrBenchEnergyCardList - ldh a, [hCurMenuItem] - bank1call DisplayEnergyDiscardScreen - bank1call HandleEnergyDiscardMenuInput - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ldh a, [hTempCardIndex_ff98] - ldh [hTempPlayAreaLocation_ffa1], a - ret - -ImakuniEffect: ; 2f216 (b:7216) - ld a, DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - ld a, [wLoadedCard1ID] - -; cannot confuse Clefairy Doll and Mysterious Fossil - cp CLEFAIRY_DOLL - jr z, .failed - cp MYSTERIOUS_FOSSIL - jr z, .failed - -; cannot confuse Snorlax if its Pkmn Power is active - cp SNORLAX - jr nz, .success - xor a - call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0 - jr c, .success - ; fallthrough if Thick Skinned is active - -.failed -; play confusion animation and print failure text - ld a, ATK_ANIM_IMAKUNI_CONFUSION - call Func_2fea9 - ldtx hl, ThereWasNoEffectText - call DrawWideTextBox_WaitForInput - ret - -.success -; play confusion animation and confuse card - ld a, ATK_ANIM_IMAKUNI_CONFUSION - call Func_2fea9 - ld a, DUELVARS_ARENA_CARD_STATUS - call GetTurnDuelistVariable - and PSN_DBLPSN - or CONFUSED - ld [hl], a - bank1call DrawDuelHUDs - ret - -; returns carry if opponent has no energy cards attached -EnergyRemoval_EnergyCheck: ; 2f252 (b:7252) - call SwapTurn - call CheckIfThereAreAnyEnergyCardsAttached - ldtx hl, NoEnergyAttachedToOpponentsActiveText - call SwapTurn - ret - -EnergyRemoval_PlayerSelection: ; 2f25f (b:725f) - ldtx hl, ChoosePokemonToRemoveEnergyFromText - call DrawWideTextBox_WaitForInput - call SwapTurn - call HandlePokemonAndEnergySelectionScreen - call SwapTurn - ret - -EnergyRemoval_AISelection: ; 2f26f (b:726f) - call AIPickEnergyCardToDiscardFromDefendingPokemon - ret - -EnergyRemoval_DiscardEffect: ; 2f273 (b:7273) - call SwapTurn - ldh a, [hTempPlayAreaLocation_ffa1] - call PutCardInDiscardPile - call SwapTurn - call IsPlayerTurn - ret c - -; show Player which Pokemon was affected - call SwapTurn - ldh a, [hTemp_ffa0] - call Func_2c10b - call SwapTurn - ret - -; return carry if no other card in hand to discard -; or if there are no Basic Energy cards in Discard Pile. -EnergyRetrieval_HandEnergyCheck: ; 2f28e (b:728e) - ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND - call GetTurnDuelistVariable - cp 2 - ldtx hl, NotEnoughCardsInHandText - ret c ; return if doesn't have another card to discard - call CreateEnergyCardListFromDiscardPile_OnlyBasic - ldtx hl, ThereAreNoBasicEnergyCardsInDiscardPileText - ret - -EnergyRetrieval_PlayerHandSelection: ; 2f2a0 (b:72a0) - ldtx hl, ChooseCardToDiscardFromHandText - call DrawWideTextBox_WaitForInput - call CreateHandCardList - ldh a, [hTempCardIndex_ff9f] - call RemoveCardFromDuelTempList - bank1call Func_5591 - bank1call DisplayCardList - ldh a, [hTempCardIndex_ff98] - ldh [hTempList], a - ret - -EnergyRetrieval_PlayerDiscardPileSelection: ; 2f2b9 (b:72b9) - ld a, 1 ; start at 1 due to card selected from hand - ldh [hCurSelectionItem], a - ldtx hl, Choose2BasicEnergyCardsFromDiscardPileText - call DrawWideTextBox_WaitForInput - call CreateEnergyCardListFromDiscardPile_OnlyBasic - -.select_card - bank1call InitAndDrawCardListScreenLayout - ldtx hl, PleaseSelectCardText - ldtx de, PlayerDiscardPileText - bank1call SetCardListHeaderText - bank1call DisplayCardList - jr nc, .selected - ; B was pressed - ld a, 2 + 1 ; includes the card selected from hand - call AskWhetherToQuitSelectingCards - jr c, .select_card ; player selected No - jr .done - -.selected - call GetNextPositionInTempList_TrainerEffects - ldh a, [hTempCardIndex_ff98] - ld [hl], a - call RemoveCardFromDuelTempList - jr c, .done - ldh a, [hCurSelectionItem] - cp 2 + 1 ; includes the card selected from hand - jr c, .select_card - -.done - call GetNextPositionInTempList_TrainerEffects - ld [hl], $ff ; terminating byte - or a - ret - -EnergyRetrieval_DiscardAndAddToHandEffect: ; 2f2f8 (b:72f8) - ld hl, hTempList - ld a, [hli] - call RemoveCardFromHand - call PutCardInDiscardPile - ld de, wDuelTempList -.loop - ld a, [hli] - ld [de], a - inc de - cp $ff - jr z, .done - call MoveDiscardPileCardToHand - call AddCardToHand - jr .loop -.done - call IsPlayerTurn - ret c - bank1call Func_4b38 - ret - -; return carry if no cards left in Deck. -EnergySearch_DeckCheck: ; 2f31c (b:731c) - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetTurnDuelistVariable - cp DECK_SIZE - ccf - ldtx hl, NoCardsLeftInTheDeckText - ret - -EnergySearch_PlayerSelection: ; 2f328 (b:7328) - ld a, $ff - ldh [hTemp_ffa0], a - call CreateDeckCardList - ldtx hl, Choose1BasicEnergyCardFromDeckText - lb de, SEARCHEFFECT_BASIC_ENERGY, 0 - ldtx bc, BasicEnergyText - call LookForCardsInDeck - ret c ; skip showing deck - - bank1call Func_5591 - ldtx hl, ChooseBasicEnergyCardText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText -.read_input - bank1call DisplayCardList - jr c, .try_exit ; B pressed? - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - call CheckIfCardIsBasicEnergy - jr c, .play_sfx - or a - ret -.play_sfx - call Func_3794 - jr .read_input - -.try_exit -; check if Player can exit without selecting anything - ld hl, wDuelTempList -.next_card - ld a, [hli] - cp $ff - jr z, .exit - call CheckIfCardIsBasicEnergy - jr c, .next_card - jr .read_input ; no, has to select Energy card -.exit - ld a, $ff - ldh [hTemp_ffa0], a - or a - ret - -EnergySearch_AddToHandEffect: ; 2f372 (b:7372) - ldh a, [hTemp_ffa0] - cp $ff - jr z, .done -; add to hand - call SearchCardInDeckAndAddToHand - call AddCardToHand - call IsPlayerTurn - jr c, .done ; done if Player played card -; display card in screen - ldh a, [hTemp_ffa0] - ldtx hl, WasPlacedInTheHandText - bank1call DisplayCardDetailScreen -.done - call Func_2c0bd - ret - -; check if card index in a is a Basic Energy card. -; returns carry in case it's not. -CheckIfCardIsBasicEnergy: ; 2f38f (b:738f) - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - jr c, .not_basic_energy - cp TYPE_ENERGY_DOUBLE_COLORLESS - jr nc, .not_basic_energy -; is basic energy - or a - ret -.not_basic_energy - scf - ret - -ProfessorOakEffect: ; 2f3a1 (b:73a1) -; discard hand - call CreateHandCardList - call SortCardsInDuelTempListByID - ld hl, wDuelTempList -.discard_loop - ld a, [hli] - cp $ff - jr z, .draw_cards - call RemoveCardFromHand - call PutCardInDiscardPile - jr .discard_loop - -.draw_cards - ld a, 7 - bank1call DisplayDrawNCardsScreen - ld c, 7 -.draw_loop - call DrawCardFromDeck - jr c, .done - call AddCardToHand - dec c - jr nz, .draw_loop -.done - ret - -Potion_DamageCheck: ; 2f3ca (b:73ca) - call CheckIfPlayAreaHasAnyDamage - ldtx hl, NoPokemonWithDamageCountersText - ret - -Potion_PlayerSelection: ; 2f3d1 (b:73d1) - bank1call HasAlivePokemonInPlayArea -.read_input - bank1call OpenPlayAreaScreenForSelection - ret c ; exit is B was pressed - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ld e, a - call GetCardDamageAndMaxHP - or a - jr z, .read_input ; no damage, loop back to start -; cap damage - ld c, 20 - cp 20 - jr nc, .skip_cap - ld c, a -.skip_cap - ld a, c - ldh [hTempPlayAreaLocation_ffa1], a - or a - ret - -Potion_HealEffect: ; 2f3ef (b:73ef) - ldh a, [hTemp_ffa0] - ldh [hTempPlayAreaLocation_ff9d], a - ldh a, [hTempPlayAreaLocation_ffa1] - call HealPlayAreaCardHP - ret - -GamblerEffect: ; 2f3f9 (b:73f9) - ldtx de, CardCheckIfHeads8CardsIfTails1CardText - call TossCoin_BankB - ldh [hTemp_ffa0], a -; discard Gambler card from hand - ldh a, [hTempCardIndex_ff9f] - call RemoveCardFromHand - call PutCardInDiscardPile - -; shuffle cards into deck - call CreateHandCardList - call SortCardsInDuelTempListByID - ld hl, wDuelTempList -.loop_return_deck - ld a, [hli] - cp $ff - jr z, .check_coin_toss - call RemoveCardFromHand - call ReturnCardToDeck - jr .loop_return_deck - -.check_coin_toss - call Func_2c0bd - ld c, 8 - ldh a, [hTemp_ffa0] - or a - jr nz, .draw_cards ; coin toss was heads? - ; if tails, number of cards to draw is 1 - ld c, 1 - -; correct number of cards to draw is in c -.draw_cards - ld a, c - bank1call DisplayDrawNCardsScreen -.draw_loop - call DrawCardFromDeck - jr c, .done - call AddCardToHand - dec c - jr nz, .draw_loop -.done - ret - -; return carry if not enough cards in hand to discard -; or if there are no cards in the Discard Pile -ItemFinder_HandDiscardPileCheck: ; 2f43b (b:743b) - ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND - call GetTurnDuelistVariable - ldtx hl, NotEnoughCardsInHandText - cp 3 - ret c - call CreateTrainerCardListFromDiscardPile - ret - -ItemFinder_PlayerSelection: ; 2f44a (b:744a) - call HandlePlayerSelection2HandCardsToDiscard - ret c ; was operation cancelled? - -; cards were selected to discard from hand. -; now to choose a Trainer card from Discard Pile. - call CreateTrainerCardListFromDiscardPile - bank1call Func_5591 - ldtx hl, ChooseCardToPlaceInHandText - ldtx de, PlayerDiscardPileText - bank1call SetCardListHeaderText - bank1call DisplayCardList - ldh [hTempList + 2], a ; placed after the 2 cards selected to discard - ret - -ItemFinder_DiscardAddToHandEffect: ; 2f463 (b:7463) -; discard cards from hand - ld hl, hTempList - ld a, [hli] - call RemoveCardFromHand - call PutCardInDiscardPile - ld a, [hli] - call RemoveCardFromHand - call PutCardInDiscardPile - -; place card from Discard Pile to hand - ld a, [hl] - call MoveDiscardPileCardToHand - call AddCardToHand - call IsPlayerTurn - ret c -; display card in screen - ldh a, [hTempList + 2] - ldtx hl, WasPlacedInTheHandText - bank1call DisplayCardDetailScreen - ret - -Defender_PlayerSelection: ; 2f488 (b:7488) - ldtx hl, ChoosePokemonToAttachDefenderToText - call DrawWideTextBox_WaitForInput - bank1call HasAlivePokemonInPlayArea - bank1call OpenPlayAreaScreenForSelection - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ret - -Defender_AttachDefenderEffect: ; 2f499 (b:7499) -; attach Trainer card to Play Area Pokemon - ldh a, [hTemp_ffa0] - ld e, a - ldh a, [hTempCardIndex_ff9f] - call PutHandCardInPlayArea - -; increase number of Defender cards of this location by 1 - ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD_ATTACHED_DEFENDER - call GetTurnDuelistVariable - inc [hl] - call IsPlayerTurn - ret c - - ldh a, [hTemp_ffa0] - call Func_2c10b - ret - -; return carry if Bench is full. -MysteriousFossil_BenchCheck: ; 2f4b3 (b:74b3) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - cp MAX_PLAY_AREA_POKEMON - ccf - ldtx hl, NoSpaceOnTheBenchText - ret - -MysteriousFossil_PlaceInPlayAreaEffect: ; 2f4bf (b:74bf) - ldh a, [hTempCardIndex_ff9f] - call PutHandPokemonCardInPlayArea - ret - -; return carry if Arena card has no status to heal. -FullHeal_StatusCheck: ; 2f4c5 (b:74c5) - ld a, DUELVARS_ARENA_CARD_STATUS - call GetTurnDuelistVariable - or a - ret nz - ldtx hl, NotAffectedByPoisonSleepParalysisOrConfusionText - scf - ret - -FullHeal_ClearStatusEffect: ; 2f4d1 (b:74d1) - ld a, ATK_ANIM_FULL_HEAL - call Func_2fea9 - ld a, DUELVARS_ARENA_CARD_STATUS - call GetTurnDuelistVariable - ld [hl], NO_STATUS - bank1call DrawDuelHUDs - ret - -ImposterProfessorOakEffect: ; 2f4e1 (b:74e1) - call SwapTurn - call CreateHandCardList - call SortCardsInDuelTempListByID - -; first return all cards in hand to the deck. - ld hl, wDuelTempList -.loop_return_deck - ld a, [hli] - cp $ff - jr z, .done_return - call RemoveCardFromHand - call ReturnCardToDeck - jr .loop_return_deck - -; then draw 7 cards from the deck. -.done_return - call Func_2c0bd - ld a, 7 - bank1call DisplayDrawNCardsScreen - ld c, 7 -.loop_draw - call DrawCardFromDeck - jr c, .done - call AddCardToHand - dec c - jr nz, .loop_draw -.done - call SwapTurn - ret - -; return carry if not enough cards in hand to discard -; or if there are no cards left in the deck. -ComputerSearch_HandDeckCheck: ; 2f513 (b:7513) - ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND - call GetTurnDuelistVariable - ldtx hl, NotEnoughCardsInHandText - cp 3 - ret c - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetTurnDuelistVariable - ldtx hl, NoCardsLeftInTheDeckText - cp DECK_SIZE - ccf - ret - -ComputerSearch_PlayerDiscardHandSelection: ; 2f52a (b:752a) - call HandlePlayerSelection2HandCardsToDiscard - ret - -ComputerSearch_PlayerDeckSelection: ; 2f52e (b:752e) - call CreateDeckCardList - bank1call Func_5591 - ldtx hl, ChooseCardToPlaceInHandText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText -.loop_input - bank1call DisplayCardList - jr c, .loop_input ; can't exit with B button - ldh [hTempList + 2], a - ret - -ComputerSearch_DiscardAddToHandEffect: ; 2f545 (b:7545) -; discard cards from hand - ld hl, hTempList - ld a, [hli] - call RemoveCardFromHand - call PutCardInDiscardPile - ld a, [hli] - call RemoveCardFromHand - call PutCardInDiscardPile - -; add card from deck to hand - ld a, [hl] - call SearchCardInDeckAndAddToHand - call AddCardToHand - call Func_2c0bd - ret - -; return carry if Bench is full. -ClefairyDoll_BenchCheck: ; 2f561 (b:7561) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, NoSpaceOnTheBenchText - cp MAX_PLAY_AREA_POKEMON - ccf - ret - -ClefairyDoll_PlaceInPlayAreaEffect: ; 2f56d (b:756d) - ldh a, [hTempCardIndex_ff9f] - call PutHandPokemonCardInPlayArea - ret - -; return carry if no Pokemon in the Bench. -MrFuji_BenchCheck: ; 2f573 (b:7573) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, EffectNoPokemonOnTheBenchText - cp 2 - ret - -MrFuji_PlayerSelection: ; 2f57e (b:757e) - ldtx hl, ChoosePokemonToReturnToTheDeckText - call DrawWideTextBox_WaitForInput - bank1call HasAlivePokemonInBench - bank1call OpenPlayAreaScreenForSelection - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ret - -MrFuji_ReturnToDeckEffect: ; 2f58f (b:758f) -; get Play Area location's card index - ldh a, [hTemp_ffa0] - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - ldh [hTempCardIndex_ff98], a - -; find all cards that are in the same location -; (previous evolutions and energy cards attached) -; and return them all to the deck. - ldh a, [hTemp_ffa0] - or CARD_LOCATION_PLAY_AREA - ld e, a - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop_cards - push de - push hl - ld a, [hl] - cp e - jr nz, .next_card - ld a, l - call ReturnCardToDeck -.next_card - pop hl - pop de - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_cards - -; clear Play Area location of card - ldh a, [hTemp_ffa0] - ld e, a - call EmptyPlayAreaSlot - ld l, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - dec [hl] - call ShiftAllPokemonToFirstPlayAreaSlots - -; if Trainer card wasn't played by the Player, -; print the selected Pokemon's name and show card on screen. - call IsPlayerTurn - jr c, .done - ldh a, [hTempCardIndex_ff98] - call LoadCardDataToBuffer1_FromDeckIndex - ld hl, wLoadedCard1Name - ld a, [hli] - ld h, [hl] - ld l, a - call LoadTxRam2 - bank1call DrawLargePictureOfCard - ldtx hl, PokemonAndAllAttachedCardsWereReturnedToDeckText - call DrawWideTextBox_WaitForInput -.done - call Func_2c0bd - ret - -PlusPowerEffect: ; 2f5e0 (b:75e0) -; attach Trainer card to Arena Pokemon - ld e, PLAY_AREA_ARENA - ldh a, [hTempCardIndex_ff9f] - call PutHandCardInPlayArea - -; increase number of Defender cards of this location by 1 - ld a, DUELVARS_ARENA_CARD_ATTACHED_PLUSPOWER - call GetTurnDuelistVariable - inc [hl] - ret - -; return carry if no Pokemon in the Bench. -Switch_BenchCheck: ; 2f5ee (b:75ee) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, EffectNoPokemonOnTheBenchText - cp 2 - ret - -Switch_PlayerSelection: ; 2f5f9 (b:75f9) - ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText - call DrawWideTextBox_WaitForInput - bank1call HasAlivePokemonInBench - bank1call OpenPlayAreaScreenForSelection - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - ret - -Switch_SwitchEffect: ; 2f60a (b:760a) - ldh a, [hTemp_ffa0] - ld e, a - call SwapArenaWithBenchPokemon - ret - -PokemonCenter_DamageCheck: ; 2f611 (b:7611) - call CheckIfPlayAreaHasAnyDamage - ldtx hl, NoPokemonWithDamageCountersText - ret - -PokemonCenter_HealDiscardEnergyEffect: ; 2f618 (b:7618) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld d, a - ld e, PLAY_AREA_ARENA - -; go through every Pokemon in the Play Area -; and heal all damage & discard their Energy cards. -.loop_play_area -; check its damage - ld a, e - ldh [hTempPlayAreaLocation_ff9d], a - call GetCardDamageAndMaxHP - or a - jr z, .next_pkmn ; if no damage, skip Pokemon - -; heal all its damage - push de - ld e, a - ld d, $00 - call HealPlayAreaCardHP - -; loop all cards in deck and for all the Energy cards -; that are attached to this Play Area location Pokemon, -; place them in the Discard Pile. - ldh a, [hTempPlayAreaLocation_ff9d] - or CARD_LOCATION_PLAY_AREA - ld e, a - ld a, $00 - call GetTurnDuelistVariable -.loop_deck - ld a, [hl] - cp e - jr nz, .next_card_deck ; not attached to card, skip - ld a, l - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - and TYPE_ENERGY - jr z, .next_card_deck ; not Energy, skip - ld a, l - call PutCardInDiscardPile -.next_card_deck - inc l - ld a, l - cp DECK_SIZE - jr c, .loop_deck - - pop de -.next_pkmn - inc e - dec d - jr nz, .loop_play_area - ret - -; return carry if non-Turn Duelist has full Bench -; or if they have no Basic Pokemon cards in Discard Pile. -PokemonFlute_BenchCheck: ; 2f659 (b:7659) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - ldtx hl, NoSpaceOnTheBenchText - cp MAX_PLAY_AREA_POKEMON - ccf - ret c ; not enough space in Bench - ; check Discard Pile - call SwapTurn - call CreateBasicPokemonCardListFromDiscardPile - ldtx hl, ThereAreNoPokemonInDiscardPileText - call SwapTurn - ret - -PokemonFlute_PlayerSelection: ; 2f672 (b:7672) -; create Discard Pile list - call SwapTurn - call CreateBasicPokemonCardListFromDiscardPile - -; display selection screen and store Player's selection - bank1call Func_5591 - ldtx hl, ChoosePokemonToPlaceInPlayText - ldtx de, PlayerDiscardPileText - bank1call SetCardListHeaderText - bank1call DisplayCardList - call SwapTurn - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - ret - -PokemonFlute_PlaceInPlayAreaText: ; 2f68f (b:768f) -; place selected card in non-Turn Duelist's Bench - call SwapTurn - ldh a, [hTemp_ffa0] - call MoveDiscardPileCardToHand - call AddCardToHand - call PutHandPokemonCardInPlayArea - call SwapTurn - -; unless it was the Player who played the card, -; display the Pokemon card on screen. - call IsPlayerTurn - ret c - call SwapTurn - ldh a, [hTemp_ffa0] - ldtx hl, CardWasChosenText - bank1call DisplayCardDetailScreen - call SwapTurn - ret - -PokemonBreeder_HandPlayAreaCheck: ; 2f6b3 (b:76b3) - call CreatePlayableStage2PokemonCardListFromHand - jr c, .cannot_evolve - bank1call IsPrehistoricPowerActive - ret -.cannot_evolve - ldtx hl, ConditionsForEvolvingToStage2NotFulfilledText - scf - ret - -PokemonBreeder_PlayerSelection: ; 2f6c1 (b:76c1) -; create hand list of playable Stage2 cards - call CreatePlayableStage2PokemonCardListFromHand - bank1call Func_5591 - -; handle Player selection of Stage2 card - ldtx hl, PleaseSelectCardText - ldtx de, DuelistHandText - bank1call SetCardListHeaderText - bank1call DisplayCardList - ret c ; exit if B was pressed - - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - ldtx hl, ChooseBasicPokemonToEvolveText - call DrawWideTextBox_WaitForInput - -; handle Player selection of Basic card to evolve - bank1call HasAlivePokemonInPlayArea -.read_input - bank1call OpenPlayAreaScreenForSelection - ret c ; exit if B was pressed - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTempPlayAreaLocation_ffa1], a - ld e, a - ldh a, [hTemp_ffa0] - ld d, a - call CheckIfCanEvolveInto_BasicToStage2 - jr c, .read_input ; loop back if cannot evolve this card - or a - ret - -PokemonBreeder_EvolveEffect: ; 2f6f4 (b:76f4) - ldh a, [hTempCardIndex_ff9f] - push af - ld hl, hTemp_ffa0 - ld a, [hli] - ldh [hTempCardIndex_ff98], a - ld a, [hl] ; hTempPlayAreaLocation_ffa1 - ldh [hTempPlayAreaLocation_ff9d], a - -; load the Basic Pokemon card name to RAM - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - ld hl, wLoadedCard1Name - ld a, [hli] - ld h, [hl] - ld l, a - call LoadTxRam2 - -; evolve card and overwrite its stage as STAGE2_WITHOUT_STAGE1 - ldh a, [hTempCardIndex_ff98] - call EvolvePokemonCard - ld [hl], STAGE2_WITHOUT_STAGE1 - -; load Stage2 Pokemon card name to RAM - ldh a, [hTempCardIndex_ff98] - call LoadCardDataToBuffer1_FromDeckIndex - ld a, 18 - call CopyCardNameAndLevel - xor a - ld [hl], a ; $0 character - ld hl, wTxRam2_b - ld [hli], a - ld [hl], a - -; display Pokemon picture and play sfx, -; print the corresponding card names. - bank1call DrawLargePictureOfCard - ld a, $5e - call PlaySFX - ldtx hl, PokemonEvolvedIntoPokemonText - call DrawWideTextBox_WaitForInput - bank1call Func_161e - pop af - ldh [hTempCardIndex_ff9f], a - ret - -; creates list in wDuelTempList of all Stage2 Pokemon cards -; in the hand that can evolve a Basic Pokemon card in Play Area -; through use of Pokemon Breeder. -; returns carry if that list is empty. -CreatePlayableStage2PokemonCardListFromHand: ; 2f73e (b:773e) - call CreateHandCardList - ret c ; return if no hand cards - -; check if hand Stage2 Pokemon cards can be made -; to evolve a Basic Pokemon in the Play Area and, if so, -; add it to the wDuelTempList. - ld hl, wDuelTempList - ld e, l - ld d, h -.loop_hand - ld a, [hl] - cp $ff - jr z, .done - call .CheckIfCanEvolveAnyPlayAreaBasicCard - jr c, .next_hand_card - ld a, [hl] - ld [de], a - inc de -.next_hand_card - inc hl - jr .loop_hand - -.done - ld a, $ff ; terminating byte - ld [de], a - ld a, [wDuelTempList] - cp $ff - scf - ret z ; return carry if empty - ; not empty - or a - ret - -; return carry if Stage2 card in a cannot evolve any -; of the Basic Pokemon in Play Area through Pokemon Breeder. -.CheckIfCanEvolveAnyPlayAreaBasicCard - push de - ld d, a - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - jr nc, .set_carry ; skip if not Pokemon card - ld a, [wLoadedCard2Stage] - cp STAGE2 - jr nz, .set_carry ; skip if not Stage2 - -; check if can evolve any Play Area cards - push hl - push bc - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld c, a - ld e, PLAY_AREA_ARENA -.loop_play_area - push bc - push de - call CheckIfCanEvolveInto_BasicToStage2 - pop de - pop bc - jr nc, .done_play_area - inc e - dec c - jr nz, .loop_play_area -; set carry - scf -.done_play_area - pop bc - pop hl - pop de - ret -.set_carry - pop de - scf - ret - -; return carry if no cards in the Bench. -ScoopUp_BenchCheck: ; 2f795 (b:7795) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, EffectNoPokemonOnTheBenchText - cp 2 - ret - -ScoopUp_PlayerSelection: ; 2f7a0 (b:77a0) -; print text box - ldtx hl, ChoosePokemonToScoopUpText - call DrawWideTextBox_WaitForInput - -; handle Player selection - bank1call HasAlivePokemonInPlayArea - bank1call OpenPlayAreaScreenForSelection - ret c ; exit if B was pressed - - ldh [hTemp_ffa0], a - or a - ret nz ; if it wasn't the Active Pokemon, we are done - -; handle switching to a Pokemon in Bench and store location selected. - call EmptyScreen - ldtx hl, SelectPokemonToPlaceInTheArenaText - call DrawWideTextBox_WaitForInput - bank1call HasAlivePokemonInBench - bank1call OpenPlayAreaScreenForSelection - ldh [hTempPlayAreaLocation_ffa1], a - ret - -ScoopUp_ReturnToHandEffect: ; 2f7c3 (b:77c3) -; store chosen card location to Scoop Up - ldh a, [hTemp_ffa0] - or CARD_LOCATION_PLAY_AREA - ld e, a - -; find Basic Pokemon card that is in the selected Play Area location -; and add it to the hand, discarding all cards attached. - ld a, DUELVARS_CARD_LOCATIONS - call GetTurnDuelistVariable -.loop - ld a, [hl] - cp e - jr nz, .next_card ; skip if not in selected location - ld a, l - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - jr nc, .next_card ; skip if not Pokemon card - ld a, [wLoadedCard2Stage] - or a - jr nz, .next_card ; skip if not Basic stage -; found - ld a, l - ldh [hTempCardIndex_ff98], a - call AddCardToHand - ; optimization: break loop here, since - ; no two Basic Pokemon cards may occupy - ; the same Play Area location. -.next_card - inc l - ld a, l - cp DECK_SIZE - jr c, .loop - -; since the card has been moved to hand, -; MovePlayAreaCardToDiscardPile will take care -; of discarding every higher stage cards and other cards attached. - ldh a, [hTemp_ffa0] - ld e, a - call MovePlayAreaCardToDiscardPile - -; if the Pokemon was in the Arena, clear status - ldh a, [hTemp_ffa0] - or a - jr nz, .skip_clear_status - call ClearAllStatusConditions -.skip_clear_status - -; if card was not played by Player, show detail screen -; and print corresponding text. - call IsPlayerTurn - jr c, .shift_or_switch - ldtx hl, PokemonWasReturnedFromArenaToHandText - ldh a, [hTemp_ffa0] - or a - jr z, .display_detail_screen - ldtx hl, PokemonWasReturnedFromBenchToHandText -.display_detail_screen - ldh a, [hTempCardIndex_ff98] - bank1call DisplayCardDetailScreen - -.shift_or_switch -; if card was in Bench, simply shift Pokemon slots... - ldh a, [hTemp_ffa0] - or a - jr z, .switch - call ShiftAllPokemonToFirstPlayAreaSlots - ret - -.switch -; ...if Pokemon was in Arena, then switch it with the selected Bench card. - ldh a, [hTempPlayAreaLocation_ffa1] - ld d, a - ld e, PLAY_AREA_ARENA - call SwapPlayAreaPokemon - call ShiftAllPokemonToFirstPlayAreaSlots - ret - -; return carry if no other cards in hand, -; or if there are no Pokemon cards in hand. -PokemonTrader_HandDeckCheck: ; 2f826 (b:7826) - ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND - call GetTurnDuelistVariable - ldtx hl, ThereAreNoCardsInHandThatYouCanChangeText - cp 2 - ret c ; return if no other cards in hand - call CreatePokemonCardListFromHand - ldtx hl, ThereAreNoCardsInHandThatYouCanChangeText - ret - -PokemonTrader_PlayerHandSelection: ; 2f838 (b:7838) -; print text box - ldtx hl, ChooseCardFromYourHandToSwitchText - call DrawWideTextBox_WaitForInput - -; create list with all Pokemon cards in hand - call CreatePokemonCardListFromHand - bank1call Func_5591 - -; handle Player selection - ldtx hl, ChooseCardToSwitchText - ldtx de, DuelistHandText - bank1call SetCardListHeaderText - bank1call DisplayCardList - ldh [hTemp_ffa0], a - ret - -PokemonTrader_PlayerDeckSelection: ; 2f853 (b:7853) -; temporarily place chosen hand card in deck -; so it can be potentially chosen to be traded. - ldh a, [hTemp_ffa0] - call RemoveCardFromHand - call ReturnCardToDeck - -; display deck card list screen - ldtx hl, ChooseBasicOrEvolutionPokemonCardFromDeckText - call DrawWideTextBox_WaitForInput - call CreateDeckCardList - bank1call Func_5591 - ldtx hl, ChoosePokemonCardText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText - -; handle Player selection -.read_input - bank1call DisplayCardList - jr c, .read_input ; pressing B loops back to selection - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - jr nc, .read_input ; can't select non-Pokemon cards - -; a valid card was selected, store its card index and -; place the selected hand card back to the hand. - ldh a, [hTempCardIndex_ff98] - ldh [hTempPlayAreaLocation_ffa1], a - ldh a, [hTemp_ffa0] - call SearchCardInDeckAndAddToHand - call AddCardToHand - or a - ret - -PokemonTrader_TradeCardsEffect: ; 2f88d (b:788d) -; place hand card in deck - ldh a, [hTemp_ffa0] - call RemoveCardFromHand - call ReturnCardToDeck - -; place deck card in hand - ldh a, [hTempPlayAreaLocation_ffa1] - call SearchCardInDeckAndAddToHand - call AddCardToHand - -; display cards if the Pokemon Trader wasn't played by Player - call IsPlayerTurn - jr c, .done - ldh a, [hTemp_ffa0] - ldtx hl, PokemonWasReturnedToDeckText - bank1call DisplayCardDetailScreen - ldh a, [hTempPlayAreaLocation_ffa1] - ldtx hl, WasPlacedInTheHandText - bank1call DisplayCardDetailScreen -.done - call Func_2c0bd - ret - -; makes list in wDuelTempList with all Pokemon cards -; that are in Turn Duelist's hand. -; if list turns out empty, return carry. -CreatePokemonCardListFromHand: ; 2f8b6 (b:78b6) - ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND - call GetTurnDuelistVariable - ld c, a - ld l, DUELVARS_HAND - ld de, wDuelTempList -.loop - ld a, [hl] - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - jr nc, .next_hand_card - ld a, [hl] - ld [de], a - inc de -.next_hand_card - inc l - dec c - jr nz, .loop - ld a, $ff ; terminating byte - ld [de], a - ld a, [wDuelTempList] - cp $ff - jr z, .set_carry - or a - ret -.set_carry - scf - ret - -; return carry if no cards in deck -Pokedex_DeckCheck: ; 2f8e1 (b:78e1) - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetTurnDuelistVariable - ldtx hl, NoCardsLeftInTheDeckText - cp DECK_SIZE - ccf - ret - -Pokedex_PlayerSelection: ; 2f8ed (b:78ed) -; print text box - ldtx hl, RearrangeThe5CardsAtTopOfDeckText - call DrawWideTextBox_WaitForInput - -; cap the number of cards to reorder up to -; number of cards left in the deck (maximum of 5) - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetTurnDuelistVariable - ld b, a - ld a, DECK_SIZE - sub [hl] - ld c, 5 - cp c - jr nc, .no_cap - ld c, a -.no_cap - -; fill wDuelTempList with cards that are going to be sorted - ld a, c - inc a - ld [wNumberOfCardsToOrder], a - ld a, b - add DUELVARS_DECK_CARDS - ld l, a - ld de, wDuelTempList -.loop_cards_to_order - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop_cards_to_order - ld a, $ff ; terminating byte - ld [de], a - -.clear_list -; wDuelTempList + 10 will be filled with numbers from 1 -; to 5 (or whatever the maximum order card is). -; so that the first item in that list corresponds to the first card -; the second item corresponds to the second card, etc. -; and the number in the list corresponds to the ordering number. - call CountCardsInDuelTempList - ld b, a - ld a, 1 -; fill order list with zeroes - ldh [hCurSelectionItem], a - ld hl, wDuelTempList + 10 - xor a -.loop_init - ld [hli], a - dec b - jr nz, .loop_init - ld [hl], $ff ; terminating byte - -; display card list to order - bank1call InitAndDrawCardListScreenLayout - ldtx hl, ChooseTheOrderOfTheCardsText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText - bank1call Func_5735 - -.read_input - bank1call DisplayCardList - jr c, .undo ; if B is pressed, undo last order selection - -; a card was selected, check if it's already been selected - ldh a, [hCurMenuItem] - ld e, a - ld d, $00 - ld hl, wDuelTempList + 10 - add hl, de - ld a, [hl] - or a - jr nz, .read_input ; already has an ordering number - -; hasn't been ordered yet, apply to it current ordering number -; and increase it by 1. - ldh a, [hCurSelectionItem] - ld [hl], a - inc a - ldh [hCurSelectionItem], a - -; refresh screen - push af - bank1call Func_5744 - pop af - -; check if we're done ordering - ldh a, [hCurSelectionItem] - ld hl, wNumberOfCardsToOrder - cp [hl] - jr c, .read_input ; if still more cards to select, loop back up - -; we're done selecting cards - call EraseCursor - ldtx hl, IsThisOKText - call YesOrNoMenuWithText_LeftAligned - jr c, .clear_list ; "No" was selected, start over - ; selection was confirmed - -; now wDuelTempList + 10 will be overwritten with the -; card indices in order of selection. - ld hl, wDuelTempList + 10 - ld de, wDuelTempList - ld c, 0 -.loop_write_indices - ld a, [hli] - cp $ff - jr z, .done_write_indices - push hl - push bc - ld c, a - ld b, $00 - ld hl, hTempCardIndex_ff9f - add hl, bc - ld a, [de] - ld [hl], a - pop bc - pop hl - inc de - inc c - jr .loop_write_indices - -.done_write_indices - ld b, $00 - ld hl, hTempList - add hl, bc - ld [hl], $ff ; terminating byte - or a - ret - -.undo -; undo last selection and get previous order number - ld hl, hCurSelectionItem - ld a, [hl] - cp 1 - jr z, .read_input ; already at first input, nothing to undo - dec a - ld [hl], a - ld c, a - ld hl, wDuelTempList + 10 -.asm_2f99e - ld a, [hli] - cp c - jr nz, .asm_2f99e - dec hl - ld [hl], $00 ; overwrite order number with 0 - bank1call Func_5744 - jr .read_input - -Pokedex_OrderDeckCardsEffect: ; 2f9aa (b:79aa) -; place cards in order to the hand. - ld hl, hTempList - ld c, 0 -.loop_place_hand - ld a, [hli] - cp $ff - jr z, .place_top_deck - call SearchCardInDeckAndAddToHand - inc c - jr .loop_place_hand - -.place_top_deck -; go to last card in list and iterate in decreasing order -; placing each card in top of deck. - dec hl - dec hl -.loop_place_deck - ld a, [hld] - call ReturnCardToDeck - dec c - jr nz, .loop_place_deck - ret - -BillEffect: ; 2f9c4 (b:79c4) - ld a, 2 - bank1call DisplayDrawNCardsScreen - ld c, 2 -.loop_draw - call DrawCardFromDeck - jr c, .done - ldh [hTempCardIndex_ff98], a - call AddCardToHand - call IsPlayerTurn - jr nc, .skip_display_screen - push bc - bank1call DisplayPlayerDrawCardScreen - pop bc -.skip_display_screen - dec c - jr nz, .loop_draw -.done - ret - -LassEffect: ; 2f9e3 (b:79e3) -; first discard Lass card that was used - ldh a, [hTempCardIndex_ff9f] - call RemoveCardFromHand - call PutCardInDiscardPile - - ldtx hl, PleaseCheckTheOpponentsHandText - call DrawWideTextBox_WaitForInput - - call .DisplayLinkOrCPUHand - ; do for non-Turn Duelist - call SwapTurn - call .ShuffleDuelistHandTrainerCardsInDeck - call SwapTurn - ; do for Turn Duelist -; fallthrough - -.ShuffleDuelistHandTrainerCardsInDeck - call CreateHandCardList - call SortCardsInDuelTempListByID - xor a - ldh [hCurSelectionItem], a - ld hl, wDuelTempList - -; go through all cards in hand -; and any Trainer card is returned to deck. -.loop_hand - ld a, [hli] - ldh [hTempCardIndex_ff98], a - cp $ff - jr z, .done - call GetCardIDFromDeckIndex - call GetCardType - cp TYPE_TRAINER - jr nz, .loop_hand - ldh a, [hTempCardIndex_ff98] - call RemoveCardFromHand - call ReturnCardToDeck - push hl - ld hl, hCurSelectionItem - inc [hl] - pop hl - jr .loop_hand -.done -; show card list - ldh a, [hCurSelectionItem] - or a - call nz, Func_2c0bd ; only show list if there were any Trainer cards - ret - -.DisplayLinkOrCPUHand ; 2fa31 (b:7a31) - ld a, [wDuelType] - or a - jr z, .cpu_opp - -; link duel - ldh a, [hWhoseTurn] - push af - ld a, OPPONENT_TURN - ldh [hWhoseTurn], a - call .DisplayOppHand - pop af - ldh [hWhoseTurn], a - ret - -.cpu_opp - call SwapTurn - call .DisplayOppHand - call SwapTurn - ret - -.DisplayOppHand ; 2fa4f (b:7a4f) - call CreateHandCardList - jr c, .no_cards - bank1call InitAndDrawCardListScreenLayout - ldtx hl, ChooseTheCardYouWishToExamineText - ldtx de, DuelistHandText - bank1call SetCardListHeaderText - ld a, A_BUTTON | START - ld [wNoItemSelectionMenuKeys], a - bank1call DisplayCardList - ret -.no_cards - ldtx hl, DuelistHasNoCardsInHandText - call DrawWideTextBox_WaitForInput - ret - -; return carry if not enough cards in hand for effect -Maintenance_HandCheck: ; 2fa70 (b:7a70) - ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND - call GetTurnDuelistVariable - ldtx hl, NotEnoughCardsInHandText - cp 3 - ret - -Maintenance_PlayerSelection: ; 2fa7b (b:7a7b) - ldtx hl, Choose2HandCardsFromHandToReturnToDeckText - ldtx de, ChooseTheCardToPutBackText - call HandlePlayerSelection2HandCards - ret - -Maintenance_ReturnToDeckAndDrawEffect: ; 2fa85 (b:7a85) -; return both selected cards to the deck - ldh a, [hTempList] - call RemoveCardFromHand - call ReturnCardToDeck - ldh a, [hTempList + 1] - call RemoveCardFromHand - call ReturnCardToDeck - call Func_2c0bd - -; draw one card - ld a, 1 - bank1call DisplayDrawNCardsScreen - call DrawCardFromDeck - ldh [hTempCardIndex_ff98], a - call AddCardToHand - call IsPlayerTurn - ret nc - ; show card on screen if played by Player - bank1call DisplayPlayerDrawCardScreen - ret - -; return carry if no cards in deck -PokeBall_DeckCheck: ; 2faad (b:7aad) - ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK - call GetTurnDuelistVariable - ldtx hl, NoCardsLeftInTheDeckText - cp DECK_SIZE - ccf - ret - -PokeBall_PlayerSelection: ; 2fab9 (b:7ab9) - ld de, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call Func_2c08a - ldh [hTempList], a ; store coin result - ret nc - -; create list of all Pokemon cards in deck to search for - call CreateDeckCardList - ldtx hl, ChooseBasicOrEvolutionPokemonCardFromDeckText - ldtx bc, EvolutionCardText - lb de, SEARCHEFFECT_POKEMON, 0 - call LookForCardsInDeck - jr c, .no_pkmn ; return if Player chose not to check deck - -; handle input - bank1call Func_5591 - ldtx hl, ChoosePokemonCardText - ldtx de, DuelistDeckText - bank1call SetCardListHeaderText -.read_input - bank1call DisplayCardList - jr c, .try_exit ; B was pressed, check if Player can cancel operation - ldh a, [hTempCardIndex_ff98] - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - jr nc, .play_sfx ; can't select non-Pokemon card - ldh a, [hTempCardIndex_ff98] - ldh [hTempList + 1], a - or a - ret - -.no_pkmn - ld a, $ff - ldh [hTempList + 1], a - or a - ret - -.play_sfx - call Func_3794 - jr .read_input - -.try_exit -; Player can only exit screen if there are no cards to choose - ld hl, wDuelTempList -.loop - ld a, [hli] - cp $ff - jr z, .no_pkmn - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - jr nc, .loop - jr .read_input - -PokeBall_AddToHandEffect: ; 2fb15 (b:7b15) - ldh a, [hTempList] - or a - ret z ; return if coin toss was tails - - ldh a, [hTempList + 1] - cp $ff - jr z, .done ; skip if no Pokemon was chosen - -; add Pokemon card to hand and show in screen if -; it wasn't the Player who played the Trainer card. - call SearchCardInDeckAndAddToHand - call AddCardToHand - call IsPlayerTurn - jr c, .done - ldh a, [hTempList + 1] - ldtx hl, WasPlacedInTheHandText - bank1call DisplayCardDetailScreen -.done - call Func_2c0bd - ret - -; return carry if no cards in the Discard Pile -Recycle_DiscardPileCheck: ; 2fb36 (b:7b36) - ld a, DUELVARS_NUMBER_OF_CARDS_IN_DISCARD_PILE - call GetTurnDuelistVariable - ldtx hl, ThereAreNoCardsInTheDiscardPileText - cp 1 - ret - -Recycle_PlayerSelection: ; 2fb41 (b:7b41) - ld de, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call Func_2c08a - jr nc, .tails - - call CreateDiscardPileCardList - bank1call Func_5591 - ldtx hl, PleaseSelectCardText - ldtx de, PlayerDiscardPileText - bank1call SetCardListHeaderText -.read_input - bank1call DisplayCardList - jr c, .read_input ; can't cancel with B button - -; Discard Pile card was chosen - ldh a, [hTempCardIndex_ff98] - ldh [hTempList], a - ret - -.tails - ld a, $ff - ldh [hTempList], a - or a - ret - -Recycle_AddToHandEffect: ; 2fb68 (b:7b68) - ldh a, [hTempList] - cp $ff - ret z ; return if no card was selected - -; add card to hand and show in screen if -; it wasn't the Player who played the Trainer card. - call MoveDiscardPileCardToHand - call ReturnCardToDeck - call IsPlayerTurn - ret c - ldh a, [hTempList] - ldtx hl, CardWasChosenText - bank1call DisplayCardDetailScreen - ret - -; return carry if Bench is full or -; if no Basic Pokemon cards in Discard Pile. -Revive_BenchCheck: ; 2fb80 (b:7b80) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ldtx hl, NoSpaceOnTheBenchText - cp MAX_PLAY_AREA_POKEMON - ccf - ret c - call CreateBasicPokemonCardListFromDiscardPile - ldtx hl, ThereAreNoPokemonInDiscardPileText - ret - -Revive_PlayerSelection: ; 2fb93 (b:7b93) -; create Basic Pokemon card list from Discard Pile - ldtx hl, ChooseBasicPokemonToPlaceOnBenchText - call DrawWideTextBox_WaitForInput - call CreateBasicPokemonCardListFromDiscardPile - bank1call Func_5591 - -; display screen to select Pokemon - ldtx hl, PleaseSelectCardText - ldtx de, PlayerDiscardPileText - bank1call SetCardListHeaderText - bank1call DisplayCardList - -; store selection - ldh a, [hTempCardIndex_ff98] - ldh [hTemp_ffa0], a - ret - -Revive_PlaceInPlayAreaEffect: ; 2fbb0 (b:7bb0) -; place selected Pokemon in the Bench - ldh a, [hTemp_ffa0] - call MoveDiscardPileCardToHand - call AddCardToHand - call PutHandPokemonCardInPlayArea - -; set HP to half, rounded up - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - srl a - bit 0, a - jr z, .rounded - add 5 ; round up HP to nearest 10 -.rounded - ld [hl], a - call IsPlayerTurn - ret c ; done if Player played Revive - -; display card - ldh a, [hTemp_ffa0] - ldtx hl, PlacedOnTheBenchText - bank1call DisplayCardDetailScreen - ret - -; makes list in wDuelTempList with all Basic Pokemon cards -; that are in Turn Duelist's Discard Pile. -; if list turns out empty, return carry. -CreateBasicPokemonCardListFromDiscardPile: ; 2fbd6 (b:7bd6) -; gets hl to point at end of Discard Pile cards -; and iterates the cards in reverse order. - ld a, DUELVARS_NUMBER_OF_CARDS_IN_DISCARD_PILE - call GetTurnDuelistVariable - ld b, a - add DUELVARS_DECK_CARDS - ld l, a - ld de, wDuelTempList - inc b - jr .next_discard_pile_card - -.check_card - ld a, [hl] - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Type] - cp TYPE_ENERGY - jr nc, .next_discard_pile_card ; if not Pokemon card, skip - ld a, [wLoadedCard2Stage] - or a - jr nz, .next_discard_pile_card ; if not Basic stage, skip - -; write this card's index to wDuelTempList - ld a, [hl] - ld [de], a - inc de -.next_discard_pile_card - dec l - dec b - jr nz, .check_card - -; done with the loop. - ld a, $ff ; terminating byte - ld [de], a - ld a, [wDuelTempList] - cp $ff - jr z, .set_carry - or a - ret -.set_carry - scf - ret - -; return carry if Turn Duelist has no Evolution cards in Play Area -DevolutionSpray_PlayAreaEvolutionCheck: ; 2fc0b (b:7c0b) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - ld c, a - ld l, DUELVARS_ARENA_CARD -.loop - ld a, [hli] - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Stage] - or a - ret nz ; found an Evolution card - dec c - jr nz, .loop - - ldtx hl, ThereAreNoStage1PokemonText - scf - ret - -DevolutionSpray_PlayerSelection: ; 2fc24 (b:7c24) -; display textbox - ldtx hl, ChooseEvolutionCardAndPressAButtonToDevolveText - call DrawWideTextBox_WaitForInput - -; have Player select an Evolution card in Play Area - ld a, 1 - ldh [hCurSelectionItem], a - bank1call HasAlivePokemonInPlayArea -.read_input - bank1call OpenPlayAreaScreenForSelection - ret c ; exit if B was pressed - bank1call GetCardOneStageBelow - jr c, .read_input ; can't select Basic cards - -; get pre-evolution card data - ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - push hl - push af - ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_STAGE - ld l, a - ld a, [hl] - push hl - push af - ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD - ld l, a - ld a, [hl] - push hl - push af - jr .update_data - -.repeat_devolution -; show Play Area screen with static cursor -; so that the Player either presses A to do one more devolution -; or presses B to finish selection. - bank1call Func_6194 - jr c, .done_selection ; if B pressed, end selection instead - ; do one more devolution - bank1call GetCardOneStageBelow - -.update_data -; overwrite the card data to new devolved stats - ld a, d - call UpdateDevolvedCardHPAndStage - call GetNextPositionInTempList_TrainerEffects - ld [hl], e - ld a, d - call LoadCardDataToBuffer2_FromDeckIndex - ld a, [wLoadedCard2Stage] - or a - jr nz, .repeat_devolution ; can do one more devolution - -.done_selection - call GetNextPositionInTempList_TrainerEffects - ld [hl], $ff ; terminating byte - -; store this Play Area location in first item of temp list - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTempList], a - -; update Play Area location display of this Pokemon - call EmptyScreen - ldh a, [hTempPlayAreaLocation_ff9d] - ld hl, wHUDEnergyAndHPBarsX - ld [hli], a - ld [hl], $00 - bank1call PrintPlayAreaCardInformationAndLocation - call EnableLCD - pop bc - pop hl - -; rewrite all duelvars from before the selection was done -; this is so that if "No" is selected in confirmation menu, -; then the Pokemon isn't devolved and remains unchanged. - ld [hl], b - ldtx hl, IsThisOKText - call YesOrNoMenuWithText - pop bc - pop hl - - ld [hl], b - pop bc - pop hl - - ld [hl], b - ret - -DevolutionSpray_DevolutionEffect: ; 2fc99 (b:7c99) -; first byte in list is Play Area location chosen - ld hl, hTempList - ld a, [hli] - ldh [hTempPlayAreaLocation_ff9d], a - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - push hl - push af - -; loop through devolutions selected - ld hl, hTempList + 1 -.loop_devolutions - ld a, [hl] - cp $ff - jr z, .check_ko ; list is over - ; devolve card to its stage below - push hl - bank1call GetCardOneStageBelow - ld a, d - call UpdateDevolvedCardHPAndStage - call ResetDevolvedCardStatus - pop hl - ld a, [hli] - call PutCardInDiscardPile - jr .loop_devolutions - -.check_ko - pop af - ld e, a - pop hl - ld d, [hl] - call PrintDevolvedCardNameAndLevelText - ldh a, [hTempList] - call PrintPlayAreaCardKnockedOutIfNoHP - bank1call Func_6e49 - ret - -; returns carry if neither duelist has any energy cards attached -SuperEnergyRemoval_EnergyCheck: ; 2fcd0 (b:7cd0) - call CheckIfThereAreAnyEnergyCardsAttached - ldtx hl, NoEnergyCardsAttachedToPokemonInYourPlayAreaText - ret c - call SwapTurn - call CheckIfThereAreAnyEnergyCardsAttached - ldtx hl, NoEnergyCardsAttachedToPokemonInOppPlayAreaText - call SwapTurn - ret - -SuperEnergyRemoval_PlayerSelection: ; 2fce4 (b:7ce4) -; handle selection of Energy to discard in own Play Area - ldtx hl, ChoosePokemonInYourAreaThenPokemonInYourOppText - call DrawWideTextBox_WaitForInput - call HandlePokemonAndEnergySelectionScreen - ret c ; return if operation was cancelled - - ldtx hl, ChoosePokemonToRemoveEnergyFromText - call DrawWideTextBox_WaitForInput - - call SwapTurn - ld a, 3 - ldh [hCurSelectionItem], a -.select_opp_pkmn - bank1call HasAlivePokemonInPlayArea - bank1call OpenPlayAreaScreenForSelection - jr nc, .opp_pkmn_selected - ; B was pressed - call SwapTurn - ret ; return if operation was cancelled -.opp_pkmn_selected - ld e, a - call GetPlayAreaCardAttachedEnergies - ld a, [wTotalAttachedEnergies] - or a - jr nz, .has_energy ; has any energy cards attached? - ; no energy, loop back - ldtx hl, NoEnergyCardsText - call DrawWideTextBox_WaitForInput - jr .select_opp_pkmn - -.has_energy -; store this Pokemon's Play Area location - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hPlayAreaEffectTarget], a -; store which energy card to discard from it - bank1call CreateArenaOrBenchEnergyCardList - ldh a, [hTempPlayAreaLocation_ff9d] - bank1call DisplayEnergyDiscardScreen - ld a, 2 - ld [wEnergyDiscardMenuDenominator], a - -.loop_discard_energy_selection - bank1call HandleEnergyDiscardMenuInput - jr nc, .energy_selected - ; B pressed - ld a, 5 - call AskWhetherToQuitSelectingCards - jr nc, .done ; finish operation - ; player selected to continue selection - ld a, [wEnergyDiscardMenuNumerator] - push af - ldh a, [hTempPlayAreaLocation_ff9d] - bank1call DisplayEnergyDiscardScreen - ld a, 2 - ld [wEnergyDiscardMenuDenominator], a - pop af - ld [wEnergyDiscardMenuNumerator], a - jr .loop_discard_energy_selection - -.energy_selected -; store energy cards to discard from opponent - call GetNextPositionInTempList_TrainerEffects - ldh a, [hTempCardIndex_ff98] - ld [hl], a - call RemoveCardFromDuelTempList - ld hl, wEnergyDiscardMenuNumerator - inc [hl] - ldh a, [hCurSelectionItem] - cp 5 - jr nc, .done ; no more energy cards to select - ld a, [wDuelTempList] - cp $ff - jr z, .done ; no more energy cards to select - bank1call DisplayEnergyDiscardMenu - jr .loop_discard_energy_selection - -.done - call GetNextPositionInTempList_TrainerEffects - ld [hl], $ff - call SwapTurn - or a - ret - -SuperEnergyRemoval_DiscardEffect: ; 2fd73 (b:7d73) - ld hl, hTempList + 1 - -; discard energy card of own Play Area - ld a, [hli] - call PutCardInDiscardPile - -; iterate and discard opponent's energy cards - inc hl - call SwapTurn -.loop - ld a, [hli] - cp $ff - jr z, .done_discard - call PutCardInDiscardPile - jr .loop - -.done_discard -; if it's Player's turn, return... - call SwapTurn - call IsPlayerTurn - ret c -; ...otherwise show Play Area of affected Pokemon -; in opponent's Play Area - ldh a, [hTemp_ffa0] - call Func_2c10b -; in player's Play Area - xor a - ld [wDuelDisplayedScreen], a - call SwapTurn - ldh a, [hPlayAreaEffectTarget] - call Func_2c10b - call SwapTurn - ret - -; return carry if not enough cards in hand to -; discard for Super Energy Retrieval effect -; or if the Discard Pile has no basic Energy cards -SuperEnergyRetrieval_HandEnergyCheck: ; 2fda4 (b:7da4) - ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND - call GetTurnDuelistVariable - ldtx hl, NotEnoughCardsInHandText - cp 3 - ret c - call CreateEnergyCardListFromDiscardPile_OnlyBasic - ldtx hl, ThereAreNoBasicEnergyCardsInDiscardPileText - ret - -SuperEnergyRetrieval_PlayerHandSelection: ; 2fdb6 (b:7db6) - call HandlePlayerSelection2HandCardsToDiscard - ret - -SuperEnergyRetrieval_PlayerDiscardPileSelection: ; 2fdba (b:7dba) - ldtx hl, ChooseUpTo4FromDiscardPileText - call DrawWideTextBox_WaitForInput - call CreateEnergyCardListFromDiscardPile_OnlyBasic - -.loop_discard_pile_selection - bank1call InitAndDrawCardListScreenLayout - ldtx hl, PleaseSelectCardText - ldtx de, PlayerDiscardPileText - bank1call SetCardListHeaderText - bank1call DisplayCardList - jr nc, .store_selected_card - ; B pressed - ld a, 6 - call AskWhetherToQuitSelectingCards - jr c, .loop_discard_pile_selection ; player selected to continue - jr .done - -.store_selected_card - ldh a, [hTempCardIndex_ff98] - call GetTurnDuelistVariable - call GetNextPositionInTempList_TrainerEffects - ldh a, [hTempCardIndex_ff98] - ld [hl], a ; store selected energy card - call RemoveCardFromDuelTempList - jr c, .done - ; this shouldn't happen - ldh a, [hCurSelectionItem] - cp 6 - jr c, .loop_discard_pile_selection - -.done -; insert terminating byte - call GetNextPositionInTempList_TrainerEffects - ld [hl], $ff - or a - ret - -SuperEnergyRetrieval_DiscardAndAddToHandEffect: ; 2fdfa (b:7dfa) -; discard 2 cards selected from the hand - ld hl, hTemp_ffa0 - ld a, [hli] - call RemoveCardFromHand - call PutCardInDiscardPile - ld a, [hli] - call RemoveCardFromHand - call PutCardInDiscardPile - -; put selected cards in hand - ld de, wDuelTempList -.loop - ld a, [hli] - ld [de], a - inc de - cp $ff - jr z, .done - call MoveDiscardPileCardToHand - call AddCardToHand - jr .loop - -.done -; if Player played the card, exit - call IsPlayerTurn - ret c -; if not, show card list selected by Opponent - bank1call Func_4b38 - ret - -; outputs in hl the next position -; in hTempList to place a new card, -; and increments hCurSelectionItem. -; identical to GetNextPositionInTempList. -GetNextPositionInTempList_TrainerEffects: ; 2fe25 (b:7e25) - push de - ld hl, hCurSelectionItem - ld a, [hl] - inc [hl] - ld e, a - ld d, $00 - ld hl, hTempList - add hl, de - pop de - ret - -; handles screen for Player to select 2 cards from the hand to discard. -; first prints text informing Player to choose cards to discard -; then runs HandlePlayerSelection2HandCards routine. -HandlePlayerSelection2HandCardsToDiscard: ; 2fe34 (b:7e34) - ldtx hl, Choose2CardsFromHandToDiscardText - ldtx de, ChooseTheCardToDiscardText -; fallthrough - -; handles screen for Player to select 2 cards from the hand -; to activate some Trainer card effect. -; assumes Trainer card index being used is in [hTempCardIndex_ff9f]. -; stores selection of cards in hTempList. -; returns carry if Player cancels operation. -; input: -; hl = text to print in text box; -; de = text to print in screen header. -HandlePlayerSelection2HandCards: ; 2fe3a (b:7e3a) - push de - call DrawWideTextBox_WaitForInput - -; remove the Trainer card being used from list -; of cards to select from hand. - call CreateHandCardList - ldh a, [hTempCardIndex_ff9f] - call RemoveCardFromDuelTempList - - xor a - ldh [hCurSelectionItem], a - pop hl -.loop - push hl - bank1call Func_5591 - pop hl - bank1call SetCardListInfoBoxText - push hl - bank1call DisplayCardList - pop hl - jr c, .set_carry ; was B pressed? - push hl - call GetNextPositionInTempList_TrainerEffects - ldh a, [hTempCardIndex_ff98] - ld [hl], a - call RemoveCardFromDuelTempList - pop hl - ldh a, [hCurSelectionItem] - cp 2 - jr c, .loop ; is selection over? - or a - ret -.set_carry - scf - ret - -; return carry if non-turn duelist has no benched Pokemon -GustOfWind_BenchCheck: ; 2fe6e (b:7e6e) - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - ldtx hl, EffectNoPokemonOnTheBenchText - cp 2 - ret - -GustOfWind_PlayerSelection: ; 2fe79 (b:7e79) - ldtx hl, ChooseAPokemonToSwitchWithActivePokemonText - call DrawWideTextBox_WaitForInput - call SwapTurn - bank1call HasAlivePokemonInBench - bank1call OpenPlayAreaScreenForSelection - ldh a, [hTempPlayAreaLocation_ff9d] - ldh [hTemp_ffa0], a - call SwapTurn - ret - -GustOfWind_SwitchEffect: ; 2fe90 (b:7e90) -; play whirlwind animation - ld a, ATK_ANIM_GUST_OF_WIND - call Func_2fea9 - -; switch Arena card - call SwapTurn - ldh a, [hTemp_ffa0] - ld e, a - call SwapArenaWithBenchPokemon - call SwapTurn - call ClearDamageReductionSubstatus2 - xor a - ld [wDuelDisplayedScreen], a - ret - -; input: -; a = attack animation to play -Func_2fea9: ; 2fea9 (b:7ea9) - ld [wLoadedAttackAnimation], a - bank1call Func_7415 - ld bc, $0 - ldh a, [hWhoseTurn] - ld h, a - bank1call PlayAttackAnimation - bank1call WaitAttackAnimation - ret - -; heals amount of damage in register e for card in -; Play Area location in [hTempPlayAreaLocation_ff9d]. -; plays healing animation and prints text with card's name. -; input: -; e = amount of HP to heal -; [hTempPlayAreaLocation_ff9d] = Play Area location of card to heal -HealPlayAreaCardHP: ; 2febc (b:7ebc) - ld e, a - ld d, $00 - -; play heal animation - push de - bank1call Func_7415 - ld a, ATK_ANIM_HEALING_WIND_PLAY_AREA - ld [wLoadedAttackAnimation], a - ldh a, [hTempPlayAreaLocation_ff9d] - ld b, a - ld c, $01 - ldh a, [hWhoseTurn] - ld h, a - bank1call PlayAttackAnimation - bank1call WaitAttackAnimation - pop hl - -; print Pokemon card name and damage healed - push hl - call LoadTxRam3 - ld hl, $0000 - call LoadTxRam2 - ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - call LoadCardDataToBuffer1_FromDeckIndex - ld a, 18 - call CopyCardNameAndLevel - ld [hl], $00 ; terminating character on end of the name - ldtx hl, PokemonHealedDamageText - call DrawWideTextBox_WaitForInput - pop de - -; heal the target Pokemon - ldh a, [hTempPlayAreaLocation_ff9d] - add DUELVARS_ARENA_CARD_HP - call GetTurnDuelistVariable - add e - ld [hl], a - ret |