summaryrefslogtreecommitdiff
path: root/src/engine/effect_functions.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/effect_functions.asm')
-rw-r--r--src/engine/effect_functions.asm295
1 files changed, 254 insertions, 41 deletions
diff --git a/src/engine/effect_functions.asm b/src/engine/effect_functions.asm
index b3c707b..116d545 100644
--- a/src/engine/effect_functions.asm
+++ b/src/engine/effect_functions.asm
@@ -7,6 +7,7 @@ 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
@@ -56,7 +57,7 @@ ApplyStatusEffect:
.cant_induce_status
ld a, c
- ld [wccf1], a
+ ld [wNoEffectFromStatus], a
call SetNoEffectFromStatus
or a
ret
@@ -108,8 +109,8 @@ Func_2c08a: ; 2c08a (b:408a)
Func_2c08c:
push de
push af
- ld a, $11
- call SetAIAction_SerialSendDuelData
+ ld a, OPPACTION_TOSS_COIN_A_TIMES
+ call SetOppAction_SerialSendDuelData
pop af
pop de
call SerialSend8Bytes
@@ -118,49 +119,82 @@ Func_2c08c:
; 0x2c09c
SetNoEffectFromStatus: ; 2c09c (b:409c)
- ld a, $1
- ld [wcced], a
+ ld a, EFFECT_FAILED_NO_EFFECT
+ ld [wEffectFailed], a
ret
; 0x2c0a2
SetWasUnsuccessful: ; 2c0a2 (b:40a2)
- ld a, $2
- ld [wcced], a
+ ld a, EFFECT_FAILED_UNSUCCESSFUL
+ ld [wEffectFailed], a
ret
; 0x2c0a8
- INCROM $2c0a8, $2c0d4
+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
+; 0x2c0bd
+
+Func_2c0bd: ; 2c0bd (b:40bd)
+ call ExchangeRNG
+ bank1call Func_4f2d
+ call ShuffleDeck
+ ret
+; 0x2c0c7
+
+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
+; 0x2c0d4
; Sets some flags for AI use
-; if target double poisoned
-; [wccbb] <- [wDamage]
-; [wccbc] <- [wDamage]
+; if target poisoned
+; [wAIMinDamage] <- [wDamage]
+; [wAIMaxDamage] <- [wDamage]
; else
-; [wccbb] <- [wDamage] + d
-; [wccbc] <- [wDamage] + e
-; [wDamage] <- [wDamage] + a
+; [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 DOUBLE_POISONED
- jr z, .not_double_poisoned
+ and POISONED | DOUBLE_POISONED
+ jr z, Func_2c0e9.skip_push_af
pop af
ld a, [wDamage]
- ld [wccbb], a
- ld [wccbc], a
+ ld [wAIMinDamage], a
+ ld [wAIMaxDamage], a
ret
+Func_2c0e9: ; 2c0e9 (b:40e9)
push af
-.not_double_poisoned
+.skip_push_af
ld hl, wDamage
ld a, [hl]
add d
- ld [wccbb], a
+ ld [wAIMinDamage], a
ld a, [hl]
add e
- ld [wccbc], a
+ ld [wAIMaxDamage], a
pop af
add [hl]
ld [hl], a
@@ -168,21 +202,60 @@ Func_2c0d4: ; 2c0d4 (b:40d4)
; 0x2c0fb
; Sets some flags for AI use
-; [wDamage] <- a
-; [wccbb] <- d
-; [wccbc] <- e
+; [wDamage] <- a
+; [wAIMinDamage] <- d
+; [wAIMaxDamage] <- e
Func_2c0fb: ; 2c0fb (b:40fb)
ld [wDamage], a
xor a
ld [wDamage + 1], a
ld a, d
- ld [wccbb], a
+ ld [wAIMinDamage], a
ld a, e
- ld [wccbc], a
+ ld [wAIMaxDamage], a
ret
; 0x2c10b
- INCROM $2c10b, $2c140
+Func_2c10b: ; 2c10b (b:410b)
+ ldh [hTempPlayAreaLocation_ff9d], a
+ bank1call Func_61a1
+ bank1call PrintPlayAreaCardList_EnableLCD
+ bank1call Func_6194
+ ret
+; 0x2c117
+
+; 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
+; 0x2c12e
+
+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
+; 0x2c140
; apply a status condition of type 1 identified by register a to the target
ApplySubstatus1ToDefendingCard: ; 2c140 (b:4140)
@@ -219,14 +292,24 @@ ApplySubstatus2ToDefendingCard: ; 2c149 (b:4149)
ret
; 0x2c166
- INCROM $2c166, $2c6f0
+Func_2c166: ; 2c166 (b:4166)
+ ld [wDamage], a
+ ld [wAIMinDamage], a
+ ld [wAIMaxDamage], a
+ xor a
+ ld [wDamage + 1], a
+ ret
+; 0x2c174
+
+ INCROM $2c174, $2c6f0
SpitPoison_AIEffect: ; 2c6f0 (b:46f0)
- ld a, $5
- lb de, $0, $a
+ ld a, 5
+ lb de, 0, 10
jp Func_2c0fb
; 0x2c6f8
+; If heads, defending Pokemon becomes poisoned
SpitPoison_Poison50PercentEffect: ; 2c6f8 (b:46f8)
ldtx de, PoisonCheckText
call TossCoin_BankB
@@ -240,19 +323,20 @@ SpitPoison_Poison50PercentEffect: ; 2c6f8 (b:46f8)
INCROM $2c70a, $2c730
PoisonFang_AIEffect: ; 2c730 (b:4730)
- ld a, $a
- lb de, $a, $a
+ ld a, 10
+ lb de, 10, 10
jp Func_2c0d4
; 0x2c738
WeepinbellPoisonPowder_AIEffect: ; 2c738 (b:4738)
- ld a, $5
- lb de, $0, $a
+ ld a, 5
+ lb de, 0, 10
jp Func_2c0d4
; 0x2c740
INCROM $2c740, $2c77e
+; If heads, defending Pokemon can't retreat next turn
AcidEffect: ; 2c77e (b:477e)
ldtx de, AcidCheckText
call TossCoin_BankB
@@ -263,12 +347,12 @@ AcidEffect: ; 2c77e (b:477e)
; 0x2c78b
GloomPoisonPowder_AIEffect: ; 2c78b (b:478b)
- ld a, $a
- lb de, $a, $a
+ ld a, 10
+ lb de, 10, 10
jp Func_2c0d4
; 0x2c793
-; confuses both the target and the user
+; Defending Pokemon and user become confused
FoulOdorEffect: ; 2c793 (b:4793)
call ConfusionEffect
call SwapTurn
@@ -277,6 +361,7 @@ FoulOdorEffect: ; 2c793 (b:4793)
ret
; 0x2c7a0
+; If heads, prevent all damage done to user next turn
KakunaStiffenEffect: ; 2c7a0 (b:47a0)
ldtx de, IfHeadsNoDamageNextTurnText
call TossCoin_BankB
@@ -289,13 +374,14 @@ KakunaStiffenEffect: ; 2c7a0 (b:47a0)
; 0x2c7b4
KakunaPoisonPowder_AIEffect: ; 2c7b4 (b:47b4)
- ld a, $5
- lb de, $0, $a
+ ld a, 5
+ lb de, 0, 10
jp Func_2c0d4
; 0x2c7bc
INCROM $2c7bc, $2c7d0
+; During your next turn, double damage
SwordsDanceEffect: ; 2c7d0 (b:47d0)
ld a, [wTempTurnDuelistCardID]
cp SCYTHER
@@ -305,15 +391,54 @@ SwordsDanceEffect: ; 2c7d0 (b:47d0)
ret
; 0x2c7dc
+; If heads, defending Pokemon becomes confused
ZubatSupersonicEffect: ; 2c7dc (b:47dc)
call Confusion50PercentEffect
call nc, SetNoEffectFromStatus
ret
; 0x2c7e3
- INCROM $2c7e3, $2c836
+ INCROM $2c7e3, $2c7ed
+
+Twineedle_AIEffect: ; 2c7ed (b:47ed)
+ ld a, 30
+ lb de, 0, 60
+ jp Func_2c0fb
+; 0x2c7f5
+
+; 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 Func_2c166
+ ret
+; 0x2c80d
+
+ INCROM $2c80d, $2c822
+
+FoulGas_AIEffect: ; 2c822 (b:4822)
+ ld a, 5
+ lb de, 0, 10
+ jp Func_2c0e9
+; 0x2c82a
+
+; 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
+; 0x2c836
; 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
@@ -325,4 +450,92 @@ MetapodStiffenEffect: ; 2c836 (b:4836)
ret
; 0x2c84a
- INCROM $2c84a, $30000
+ 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
+; 0x2c944
+
+; 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
+; 0x2c96b
+
+Thrash_AIEffect: ; 2c96b (b:496b)
+ ld a, 35
+ lb de, 30, 40
+ jp Func_2c0fb
+; 0x2c973
+
+; 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
+; 0x2c982
+
+Func_2c982: ; 2c982 (b:4982)
+ ldh a, [hTemp_ffa0]
+ or a
+ ret nz
+ ld a, 10
+ call Func_1955
+ ret
+; 0x2c98c
+
+Toxic_AIEffect: ; 2c98c (b:498c)
+ ld a, 20
+ lb de, 20, 20
+ jp Func_2c0e9
+; 0x2c994
+
+; Defending Pokémon becomes poisoned, but takes 20 damage (double poisoned)
+Toxic_DoublePoisonEffect: ; 2c994 (b:4994)
+ call DoublePoisonEffect
+ ret
+; 0x2c998
+
+ INCROM $2c998, $30000