Files
poketcg/src/engine/effect_functions.asm
T
2020-12-16 00:13:21 +00:00

912 lines
18 KiB
NASM

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
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
ldtx de, SleepCheckText
call TossCoin_BankB
ret nc
SleepEffect: ; 2c030 (b:4030)
lb bc, PSN_DBLPSN, ASLEEP
jr ApplyStatusEffect
ApplyStatusEffect:
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 [wNoEffectFromStatus], 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:
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
Func_2c0c7: ; 2c0c7 (b:40c7)
ld a, DUELVARS_DUELIST_TYPE
call GetTurnDuelistVariable
cp DUELIST_TYPE_PLAYER
jr z, .player
or a
ret
.player
scf
ret
; Sets some flags for AI use
; if target poisoned
; [wAIMinDamage] <- [wDamage]
; [wAIMaxDamage] <- [wDamage]
; else
; [wAIMinDamage] <- [wDamage] + d
; [wAIMaxDamage] <- [wDamage] + e
; [wDamage] <- [wDamage] + a
Func_2c0d4: ; 2c0d4 (b:40d4)
push af
ld a, DUELVARS_ARENA_CARD_STATUS
call GetNonTurnDuelistVariable
and POISONED | DOUBLE_POISONED
jr z, Func_2c0e9.skip_push_af
pop af
ld a, [wDamage]
ld [wAIMinDamage], a
ld [wAIMaxDamage], a
ret
Func_2c0e9: ; 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
; Sets some flags for AI use
; [wDamage] <- a
; [wAIMinDamage] <- d
; [wAIMaxDamage] <- e
Func_2c0fb: ; 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
pop bc
.skip_to_bench
inc b
dec c
jr nz, .loop
ret
Func_2c12e: ; 2c12e (b:412e)
ld [wLoadedMoveAnimation], a
ldh a, [hTempPlayAreaLocation_ff9d]
ld b, a
ld c, $0 ; neither WEAKNESS nor RESISTANCE
ldh a, [hWhoseTurn]
ld h, a
bank1call PlayMoveAnimation
bank1call WaitMoveAnimation
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 $4f9d
pop hl
ld a, l
or h
call nz, DrawWideTextBox_PrintText
ret
; overwrites in wDamage, wAIMinDamage and wAIMaxDamage
; with the value in a.
StoreDamageInfo: ; 2c166 (b:4166)
ld [wDamage], a
ld [wAIMinDamage], a
ld [wAIMaxDamage], a
xor a
ld [wDamage + 1], a
ret
; 0x2c174
INCROM $2c174, $2c1ec
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
; 0x2c221
; applies HP recovery on Pokemon after HP drain attack
; and handles its animation.
; input:
; d = damage effectiveness
; e = damage dealt
ApplyAndAnimateHPDrain: ; 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, $79
ld [wLoadedMoveAnimation], a
ld bc, $01 ; arrow
bank1call PlayMoveAnimation
; compare HP to be restores 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 WaitMoveAnimation
ret
; 0x2c25b
INCROM $2c25b, $2c2a4
; makes a list in wDuelTempList with the deck indices
; of all the energy cards found in opponent's Discard Pile.
; if (c == 0), all energy cards are allowed;
; if (c != 0), double colorless energy cards are not counted.
; returns carry if no energy cards were found.
CreateEnergyCardListFromOpponentDiscardPile: ; 2c2a4 (b:42a4)
ld c, $00
; 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
; 0x2c2e0
INCROM $2c2e0, $2c487
; 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, [wPlayerAttackingMoveIndex]
ld e, a
ld a, [wPlayerAttackingCardIndex]
ld d, a
ld a, [wPlayerAttackingCardID]
call CopyMoveDataAndDamage_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
; 0x2c4da
INCROM $2c4da, $2c564
; outputs in a the Play Area location (PLAY_AREA_* constant)
; of lowest HP card in non-duelist's Bench.
AIFindBenchWithLowestHP: ; 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
; 0x2c588
INCROM $2c588, $2c6f0
SpitPoison_AIEffect: ; 2c6f0 (b:46f0)
ld a, 5
lb de, 0, 10
jp Func_2c0fb
; If heads, defending Pokemon becomes poisoned
SpitPoison_Poison50PercentEffect: ; 2c6f8 (b:46f8)
ldtx de, PoisonCheckText
call TossCoin_BankB
jp c, PoisonEffect
ld a, $8c
ld [wLoadedMoveAnimation], a
call SetNoEffectFromStatus
ret
; outputs in hTemp_ffa0 the result of the coin toss
; (0 = tails, 1 = heads) and, in case it was heads,
; stores in hTempPlayAreaLocation_ffa1 the 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 was heads and it's possible,
; switch 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 Func_2c0d4
WeepinbellPoisonPowder_AIEffect: ; 2c738 (b:4738)
ld a, 5
lb de, 0, 10
jp Func_2c0d4
; 0x2c740
; returns carry if non-duelist has no Bench Pokemon
VictreebelLure_CheckBenchPokemon: ; 2c740 (b:4740)
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetNonTurnDuelistVariable
ldtx hl, LureNoPokemonOnTheBenchText
cp 2
ret
; 0x2c74b
VictreebelLure_PlayerSelectBenchPokemon: ; 2c74b (b:474b)
ldtx hl, SelectPkmnOnBenchToSwitchWithActiveText
call DrawWideTextBox_WaitForInput
call SwapTurn
bank1call HasAlivePokemonInBench
.loop_selection
bank1call OpenPlayAreaScreenForSelection
jr c, .loop_selection
ldh a, [hTempPlayAreaLocation_ff9d]
ldh [hTemp_ffa0], a
call SwapTurn
ret
; 0x2c764
VictreebelLure_AISelectBenchPokemon: ; 2c764 (b:4764)
call AIFindBenchWithLowestHP
ldh [hTemp_ffa0], a
ret
; 0x2c76a
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 Func_2c0d4
; 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, $4f
ld [wLoadedMoveAnimation], a
ld a, SUBSTATUS1_NO_DAMAGE_STIFFEN
call ApplySubstatus1ToDefendingCard
ret
KakunaPoisonPowder_AIEffect: ; 2c7b4 (b:47b4)
ld a, 5
lb de, 0, 10
jp Func_2c0d4
; 0x2c7bc
GolbatLeechLifeEffect: ; 2c7bc (b:47bc)
ld hl, wDealtDamage
ld e, [hl]
inc hl ; wDamageEffectiveness
ld d, [hl]
call ApplyAndAnimateHPDrain
ret
; 0x2c7c6
VenonatLeechLifeEffect: ; 2c7c6 (b:47c6)
ld hl, wDealtDamage
ld e, [hl]
inc hl ; wDamageEffectiveness
ld d, [hl]
call ApplyAndAnimateHPDrain
ret
; 0x2c7d0
; 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
; 0x2c7e3
ZubatLeechLifeEffect: ; 2c7e3 (b:47e3)
ld hl, wDealtDamage
ld e, [hl]
inc hl
ld d, [hl]
call ApplyAndAnimateHPDrain
ret
; 0x2c7ed
INCROM $2c7ed, $2c7ed
Twineedle_AIEffect: ; 2c7ed (b:47ed)
ld a, 30
lb de, 0, 60
jp Func_2c0fb
; 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 StoreDamageInfo
ret
; 0x2c80d
INCROM $2c80d, $2c822
FoulGas_AIEffect: ; 2c822 (b:4822)
ld a, 5
lb de, 0, 10
jp Func_2c0e9
; 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, $4f
ld [wLoadedMoveAnimation], a
ld a, SUBSTATUS1_NO_DAMAGE_STIFFEN
call ApplySubstatus1ToDefendingCard
ret
; 0x2c84a
INCROM $2c84a, $2c925
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, 35
lb de, 30, 40
jp Func_2c0fb
; 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
Func_2c982: ; 2c982 (b:4982)
ldh a, [hTemp_ffa0]
or a
ret nz
ld a, 10
call Func_1955
ret
Toxic_AIEffect: ; 2c98c (b:498c)
ld a, 20
lb de, 20, 20
jp Func_2c0e9
; Defending Pokémon becomes poisoned, but takes 20 damage (double poisoned)
Toxic_DoublePoisonEffect: ; 2c994 (b:4994)
call DoublePoisonEffect
ret
; 0x2c998
INCROM $2c998, $2cbfb
Func_2cbfb: ; 2cbfb (b:4bfb)
ldh a, [hAIEnergyTransPlayAreaLocation]
ld e, a
ldh a, [hAIEnergyTransEnergyCard]
call AddCardToHand
call PutHandCardInPlayArea
bank1call PrintPlayAreaCardList_EnableLCD
ret
; 0x2cc0a
INCROM $2cc0a, $2f4e1
ImposterProfessorOakEffect: ; 2f4e1 (b:74e1)
call SwapTurn
call CreateHandCardList
call SortCardsInDuelTempListByID
ld hl, wDuelTempList
.return_hand_to_deck_loop
ld a, [hli]
cp $ff
jr z, .shuffle
call RemoveCardFromHand
call ReturnCardToDeck
jr .return_hand_to_deck_loop
.shuffle
call Func_2c0bd
ld a, $07
bank1call $4935
ld c, $07
.draw_loop
call DrawCardFromDeck
jr c, .revert_turn_to_user
call AddCardToHand
dec c
jr nz, .draw_loop
.revert_turn_to_user
call SwapTurn
ret
; 0x2f513
INCROM $2f513, $30000