mirror of
https://github.com/pret/poketcg.git
synced 2026-09-29 22:09:26 -04:00
912 lines
18 KiB
NASM
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
|