summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/engine/bank05.asm89
-rw-r--r--src/engine/bank08.asm91
-rw-r--r--src/wram.asm1
3 files changed, 160 insertions, 21 deletions
diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm
index 349e7d3..d6a99b9 100644
--- a/src/engine/bank05.asm
+++ b/src/engine/bank05.asm
@@ -137,7 +137,7 @@ CheckIfAnyDefendingPokemonAttackDealsSameDamageAsHP: ; 140c5 (5:40c5)
; checks AI scores for all benched Pokémon
; returns the location of the card with highest score
-; in hTempPlayAreaLocation_ff9d
+; in a and [hTempPlayAreaLocation_ff9d]
FindHighestBenchScore: ; 140df (5:40df)
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
@@ -1214,14 +1214,14 @@ Func_1468b: ; 1468b (5:468b)
ld a, AI_TRAINER_CARD_PHASE_01
call AIProcessHandTrainerCards
farcall Func_227d3
- jp nc, .asm_14776
+ jp nc, .try_attack
farcall HandleAIGoGoRainDanceEnergy
farcall HandleAIDamageSwap
farcall HandleAIPkmnPowers
ret c
- farcall Func_2262d
+ farcall HandleAICowardice
ld a, AI_TRAINER_CARD_PHASE_02
call AIProcessHandTrainerCards
@@ -1247,25 +1247,32 @@ Func_1468b: ; 1468b (5:468b)
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_12
call AIProcessHandTrainerCards
+
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .asm_146ed
+ jr nz, .already_played_energy_1
call AIProcessAndTryToPlayEnergy
-.asm_146ed
+
+.already_played_energy_1
call AIDecidePlayPokemonCard
+
farcall HandleAIDamageSwap
farcall HandleAIPkmnPowers
ret c
farcall HandleAIGoGoRainDanceEnergy
- ld a, $0d
+ ld a, $0d ; attack
farcall HandleAIEnergyTrans
+
ld a, AI_TRAINER_CARD_PHASE_13
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_15
call AIProcessHandTrainerCards
+
ld a, [wPreviousAIFlags]
- and $04
- jr z, .asm_14776
+ and AI_FLAG_USED_PROFESSOR_OAK
+ jr z, .try_attack
+
+; used Professor Oak
ld a, AI_TRAINER_CARD_PHASE_01
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_02
@@ -1276,6 +1283,7 @@ Func_1468b: ; 1468b (5:468b)
call AIProcessHandTrainerCards
call AIDecidePlayPokemonCard
ret c
+
ld a, AI_TRAINER_CARD_PHASE_05
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_06
@@ -1290,34 +1298,72 @@ Func_1468b: ; 1468b (5:468b)
ld a, AI_TRAINER_CARD_PHASE_11
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_12
+
call AIProcessHandTrainerCards
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .asm_1475b
+ jr nz, .already_played_energy_2
call AIProcessAndTryToPlayEnergy
-.asm_1475b
+.already_played_energy_2
call AIDecidePlayPokemonCard
+
farcall HandleAIDamageSwap
farcall HandleAIPkmnPowers
ret c
farcall HandleAIGoGoRainDanceEnergy
- ld a, $0d
+ ld a, $0d ; attack
farcall HandleAIEnergyTrans
+
ld a, AI_TRAINER_CARD_PHASE_13
call AIProcessHandTrainerCards
-.asm_14776
+.try_attack
ld a, $0e
farcall HandleAIEnergyTrans
+
call AIProcessAndTryToUseAttack
- ret c
+ ret c ; return if AI attacked
ld a, OPPACTION_FINISH_NO_ATTACK
bank1call AIMakeDecision
ret
; 0x14786
+; handles retreating
Func_14786: ; 14786 (5:4786)
- INCROM $14786, $14c91
+ ld a, [wce03]
+ or a
+ ret nz
+
+ call AIDecideWhetherToRetreat
+ ret nc ; return if not retreating
+
+ call AIDecideBenchPokemonToSwitchTo
+ ret c ; return if no Bench Pokemon
+
+ ld [wcdd5], a
+ ld a, $01
+ ld [wce03], a
+
+ ld a, AI_TRAINER_CARD_PHASE_09
+ call AIProcessHandTrainerCards
+ ld a, [wPreviousAIFlags]
+ and AI_FLAG_USED_SWITCH
+ jr nz, .used_switch
+ ld a, [wcdd5]
+ call AIChooseEnergyToDiscardForRetreatCost
+ ret
+
+.used_switch
+ ld a, [wPreviousAIFlags]
+ and ~AI_FLAG_USED_SWITCH ; clear Switch flag
+ ld [wPreviousAIFlags], a
+ ld a, $09 ; retreat
+ farcall HandleAIEnergyTrans
+ ret
+; 0x147bd
+
+Func_147bd: ; 147bd (5:47bd)
+ INCROM $147bd, $14c91
; this routine handles how Legendary Articuno
; prioritises playing energy cards to each Pokémon.
@@ -2370,7 +2416,7 @@ Func_15b54: ; 15b54 (5:5b54)
; 0x15b72
; calculates AI score for bench Pokémon
-; returns in hTempPlayAreaLocation_ff9d the
+; returns in a and [hTempPlayAreaLocation_ff9d] the
; Play Area location of best card to switch to.
; returns carry if no Bench Pokemon.
AIDecideBenchPokemonToSwitchTo: ; 15b72 (5:5b72)
@@ -2626,11 +2672,11 @@ AIDecideBenchPokemonToSwitchTo: ; 15b72 (5:5b72)
.asm_15d0c
ld b, a
- ld a, [$cdb1]
+ ld a, [wcdb0 + 1]
or a
jr z, .store_score
ld h, a
- ld a, [$cdb0]
+ ld a, [wcdb0]
ld l, a
.loop
@@ -2675,7 +2721,12 @@ AIDecideBenchPokemonToSwitchTo: ; 15b72 (5:5b72)
; handles AI action of retreating Arena Pokémon
; and chooses which energy cards to discard
-; if card can't discard, return carry
+; if card can't discard, return carry.
+; in case it's Clefairy Doll or Mysterious Fossil,
+; handle its effect to discard itself instead of retreating.
+; input:
+; - a = Play Area location (PLAY_AREA_*) of card to retreat to
+; in case Clefairy Doll/Mysterious Fossil effect is used.
AIChooseEnergyToDiscardForRetreatCost: ; 15d4f (5:5d4f)
push af
ld a, [wAIPlayEnergyCardForRetreat]
@@ -2907,7 +2958,7 @@ AIChooseEnergyToDiscardForRetreatCost: ; 15d4f (5:5d4f)
ld a, OPPACTION_USE_PKMN_POWER
bank1call AIMakeDecision
pop af
- ldh [hTempPlayAreaLocation_ffa1], a
+ ldh [hAIPkmnPowerEffectParam], a
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
bank1call AIMakeDecision
ld a, OPPACTION_DUEL_MAIN_SCENE
diff --git a/src/engine/bank08.asm b/src/engine/bank08.asm
index b5a794b..1113dc9 100644
--- a/src/engine/bank08.asm
+++ b/src/engine/bank08.asm
@@ -6629,6 +6629,7 @@ HandleAIEnergyTrans: ; 2219b (8:619b)
; - Peek;
; - Strange Behavior;
; - Curse.
+; returns carry if turn ended.
HandleAIPkmnPowers: ; 2237f (8:637f)
ld a, MUK
call CountPokemonIDInBothPlayAreas
@@ -7169,8 +7170,94 @@ HandleAICurse: ; 225b5 (8:65b5)
ret
; 0x2262d
-Func_2262d: ; 2262d (8:662d)
- INCROM $2262d, $226a3
+; handles AI logic for Cowardice
+HandleAICowardice: ; 2262d (8:662d)
+ ld a, MUK
+ call CountPokemonIDInBothPlayAreas
+ ret c ; return if there's Muk in play
+
+ farcall AIChooseRandomlyNotToDoAction
+ ret c ; randomly return
+
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
+ call GetTurnDuelistVariable
+ cp 1
+ ret z ; return if only one Pokemon in Play Area
+
+ ld b, a
+ ld c, PLAY_AREA_ARENA
+ ld a, DUELVARS_ARENA_CARD_STATUS
+ call GetTurnDuelistVariable
+ and CNF_SLP_PRZ
+ jr nz, .next
+.loop
+ ld a, DUELVARS_ARENA_CARD
+ add c
+ call GetTurnDuelistVariable
+ ld [wce08], a
+ call GetCardIDFromDeckIndex
+ ld a, e
+ push bc
+ cp TENTACOOL
+ call z, .CheckWhetherToUseCowardice
+ pop bc
+ jr nc, .next
+
+ dec b ; subtract 1 from number of Pokemon in Play Area
+ ld a, 1
+ cp b
+ ret z ; return if no longer has Bench Pokemon
+ ld c, PLAY_AREA_ARENA ; reset back to Arena
+ jr .loop
+
+.next
+ inc c
+ ld a, c
+ cp b
+ jr nz, .loop
+ ret
+; 0x22671
+
+; checks whether AI uses Cowardice.
+; return carry if Pkmn Power was used.
+; input:
+; c = Play Area location (PLAY_AREA_*) of Tentacool.
+.CheckWhetherToUseCowardice ; 22671 (8:6671)
+ ld a, c
+ ldh [hTemp_ffa0], a
+ ld e, a
+ call GetCardDamage
+.asm_22678
+ or a
+ ret z ; return if has no damage counters
+
+ ldh a, [hTemp_ffa0]
+ or a
+ jr nz, .is_benched
+ farcall AIDecideBenchPokemonToSwitchTo
+; in case this routine is called with no Bench Pokemon,
+; this introduces a bug.
+; since it's only called in HandleAICowardice in case
+; there's more than 1 Pokemon in Play Area, this never sets carry.
+ jr c, .asm_22678
+ jr .use_cowardice
+.is_benched
+ ld a, $ff
+.use_cowardice
+ push af
+ ld a, [wce08]
+ ldh [hTempCardIndex_ff9f], a
+ ld a, OPPACTION_USE_PKMN_POWER
+ bank1call AIMakeDecision
+ pop af
+ ldh [hAIPkmnPowerEffectParam], a
+ ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
+ bank1call AIMakeDecision
+ ld a, OPPACTION_DUEL_MAIN_SCENE
+ bank1call AIMakeDecision
+ scf
+ ret
+; 0x226a3
; AI logic for Damage Swap to transfer damage from Arena card
; to a card in Bench with more than 10 HP remaining
diff --git a/src/wram.asm b/src/wram.asm
index c4536f6..cb97ddc 100644
--- a/src/wram.asm
+++ b/src/wram.asm
@@ -1194,6 +1194,7 @@ wcda7:: ; cda7
wcdae:: ; cdae
ds $2
+wcdb0:: ; cdb0
ds $2
; these seem to hold pointer to some kind of