summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorElectroDeoxys <ElectroDeoxys@gmail.com>2020-04-29 09:47:16 +0100
committerElectroDeoxys <ElectroDeoxys@gmail.com>2020-04-29 09:47:16 +0100
commitee139f3840b69878ca57acb2a2ecbd72a4375fc8 (patch)
tree2250569722364f900411acc14af895272950b3aa /src
parent7d9ea8a30d19fae6a39bb36981e27db6edbea5e7 (diff)
Disassemble AI Pkmn Power routine
Diffstat (limited to 'src')
-rw-r--r--src/engine/bank05.asm50
-rw-r--r--src/engine/bank08.asm363
-rw-r--r--src/wram.asm2
3 files changed, 376 insertions, 39 deletions
diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm
index ba0a565..1118699 100644
--- a/src/engine/bank05.asm
+++ b/src/engine/bank05.asm
@@ -1216,8 +1216,8 @@ Func_1468b: ; 1468b (5:468b)
farcall Func_227d3
jp nc, .asm_14776
- farcall Func_22790
- farcall Func_226a3
+ farcall HandleAIGoGoRainDanceEnergy
+ farcall HandleAIDamageSwap
farcall Func_2237f
ret c
@@ -1253,10 +1253,10 @@ Func_1468b: ; 1468b (5:468b)
call AIProcessAndTryToPlayEnergy
.asm_146ed
call AIDecidePlayPokemonCard
- farcall Func_226a3
+ farcall HandleAIDamageSwap
farcall Func_2237f
ret c
- farcall Func_22790
+ farcall HandleAIGoGoRainDanceEnergy
ld a, $0d
farcall HandleAIEnergyTrans
ld a, AI_TRAINER_CARD_PHASE_13
@@ -1297,10 +1297,10 @@ Func_1468b: ; 1468b (5:468b)
call AIProcessAndTryToPlayEnergy
.asm_1475b
call AIDecidePlayPokemonCard
- farcall Func_226a3
+ farcall HandleAIDamageSwap
farcall Func_2237f
ret c
- farcall Func_22790
+ farcall HandleAIGoGoRainDanceEnergy
ld a, $0d
farcall HandleAIEnergyTrans
ld a, AI_TRAINER_CARD_PHASE_13
@@ -1496,15 +1496,19 @@ Func_15636: ; 15636 (5:5636)
ld [wcda5], a
ret
+; initializes some variables and
+; sets value of wcda7.
Func_15649: ; 15649 (5:5649)
ld a, [wcda6]
inc a
ld [wcda6], a
+
xor a
ld [wPreviousAIFlags], a
ld [wcddb], a
ld [wcddc], a
ld [wce03], a
+
ld a, [wPlayerAttackingMoveIndex]
cp $ff
jr z, .asm_156b1
@@ -1513,19 +1517,22 @@ Func_15649: ; 15649 (5:5649)
ld a, [wPlayerAttackingCardIndex]
cp $ff
jr z, .asm_156b1
+
call SwapTurn
call GetCardIDFromDeckIndex
call SwapTurn
ld a, e
- cp MEWTWO1 ; I believe this is a check for Mewtwo1's Barrier move
+ cp MEWTWO1
jr nz, .asm_156b1
+
+; handle Mewtwo1-only deck
ld a, [wcda7]
bit 7, a
jr nz, .asm_156aa
inc a
ld [wcda7], a
- cp $3
- jr c, .asm_156c2
+ cp $03
+ jr c, .done
ld a, DUELVARS_ARENA_CARD
call GetNonTurnDuelistVariable
call SwapTurn
@@ -1534,18 +1541,17 @@ Func_15649: ; 15649 (5:5649)
ld a, e
cp MEWTWO1
jr nz, .asm_156a4
- farcall $8, $67a9
+ farcall CheckIfPlayerHasPokemonOtherThanMewtwo1
jr nc, .asm_156aa
-
.asm_156a4
+; reset wcda7
xor a
ld [wcda7], a
- jr .asm_156c2
-
+ jr .done
.asm_156aa
ld a, $80
ld [wcda7], a
- jr .asm_156c2
+ jr .done
.asm_156b1
ld a, [wcda7]
@@ -1553,13 +1559,13 @@ Func_15649: ; 15649 (5:5649)
jr z, .asm_156be
inc a
ld [wcda7], a
- jr .asm_156c2
+ jr .done
.asm_156be
+; reset wcda7
xor a
ld [wcda7], a
-
-.asm_156c2
+.done
ret
; 0x156c3
@@ -4214,12 +4220,14 @@ AIProcessEnergyCards: ; 164fc (5:64fc)
; arena
ld a, [wcda7]
bit 7, a
- jr z, .skip_subtracting_score
+ jr z, .add_to_score
+
+; subtract from score
ld a, 5
call SubFromAIScore
jr .check_defending_can_ko
-.skip_subtracting_score
+.add_to_score
ld a, 4
call AddToAIScore
@@ -6937,8 +6945,8 @@ CheckIfNotABossDeckID: ; 17426 (5:7426)
; - 25% for all other decks;
; - 0% for boss decks.
; used for certain decks to randomly choose
-; not to play Trainer card in hand.
-ChooseRandomlyNotToPlayTrainerCard: ; 1743b (5:743b)
+; not to play Trainer card or use PKMN Power
+AIChooseRandomlyNotToDoAction: ; 1743b (5:743b)
; boss decks always use Trainer cards.
push hl
push de
diff --git a/src/engine/bank08.asm b/src/engine/bank08.asm
index 6850b82..9ef590b 100644
--- a/src/engine/bank08.asm
+++ b/src/engine/bank08.asm
@@ -114,7 +114,7 @@ _AIProcessHandTrainerCards: ; 200e5 (8:40e5)
jp c, .next_in_data
; AI can randomly choose not to play card.
- farcall ChooseRandomlyNotToPlayTrainerCard
+ farcall AIChooseRandomlyNotToDoAction
jr c, .next_in_data
; call routine to decide whether to play Trainer card
@@ -6227,7 +6227,7 @@ HandleAIEnergyTrans: ; 2219b (8:619b)
ld [wce06], a
; choose to randomly return
- farcall ChooseRandomlyNotToPlayTrainerCard
+ farcall AIChooseRandomlyNotToDoAction
ret c
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
@@ -6328,10 +6328,10 @@ HandleAIEnergyTrans: ; 2219b (8:619b)
push de
ld d, 30
-.small_delay_1
+.small_delay_loop_1
call DoFrame
dec d
- jr nz, .small_delay_1
+ jr nz, .small_delay_loop_1
ld a, OPPACTION_6B15
bank1call AIMakeDecision
@@ -6349,10 +6349,10 @@ HandleAIEnergyTrans: ; 2219b (8:619b)
; and return to main scene.
.done_transfer_1
ld d, 60
-.big_delay_1
+.big_delay_loop_1
call DoFrame
dec d
- jr nz, .big_delay_1
+ jr nz, .big_delay_loop_1
ld a, OPPACTION_DUEL_MAIN_SCENE
bank1call AIMakeDecision
ret
@@ -6595,10 +6595,10 @@ HandleAIEnergyTrans: ; 2219b (8:619b)
ldh [hAIEnergyTransPlayAreaLocation], a
ld d, 30
-.small_delay_2
+.small_delay_loop_2
call DoFrame
dec d
- jr nz, .small_delay_2
+ jr nz, .small_delay_loop_2
ld a, [wAIVenusaur2DeckIndex]
ldh [hTempCardIndex_ff9f], a
@@ -6613,26 +6613,354 @@ HandleAIEnergyTrans: ; 2219b (8:619b)
; and return to main scene.
.done_transfer_2
ld d, 60
-.big_delay_2
+.big_delay_loop_2
call DoFrame
dec d
- jr nz, .big_delay_2
+ jr nz, .big_delay_loop_2
ld a, OPPACTION_DUEL_MAIN_SCENE
bank1call AIMakeDecision
ret
; 0x2237f
-Func_2237f: ; 2237f (8:237f)
- INCROM $2237f, $2262d
+Func_2237f: ; 2237f (8:637f)
+ ld a, MUK
+ call CountPokemonIDInBothPlayAreas
+ ccf
+ ret nc ; return no carry if Muk is in play
+
+ farcall AIChooseRandomlyNotToDoAction
+ ccf
+ ret nc ; return no carry if AI randomly decides to
+
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
+ call GetTurnDuelistVariable
+ ld b, a
+ ld c, PLAY_AREA_ARENA
+ ld a, DUELVARS_ARENA_CARD_STATUS
+ call GetTurnDuelistVariable
+ and CNF_SLP_PRZ
+ jr nz, .next_2
+
+.loop_play_area
+ ld a, DUELVARS_ARENA_CARD
+ add c
+ call GetTurnDuelistVariable
+ ld [wce08], a
+
+ push af
+ push bc
+ ld d, a
+ ld a, c
+ ldh [hTempPlayAreaLocation_ff9d], a
+ ld e, FIRST_ATTACK_OR_PKMN_POWER
+ call CopyMoveDataAndDamage_FromDeckIndex
+ ld a, [wLoadedMoveCategory]
+ cp POKEMON_POWER
+ jr z, .execute_effect
+ pop bc
+ jr .next_3
+
+.execute_effect
+ ld a, EFFECTCMDTYPE_INITIAL_EFFECT_2
+ bank1call TryExecuteEffectCommandFunction
+ pop bc
+ jr c, .next_3
+
+; TryExecuteEffectCommandFunction was successful,
+; so check what Pkmn Power this is through card's ID.
+ pop af
+ call GetCardIDFromDeckIndex
+ ld a, e
+ push bc
+
+; check heal
+ cp VILEPLUME
+ jr nz, .check_shift
+ call Func_22402
+ jr .next_1
+.check_shift
+ cp VENOMOTH
+ jr nz, .check_peek
+ call Func_22476
+ jr .next_1
+.check_peek
+ cp MANKEY
+ jr nz, .check_strange_behavior
+ call Func_224e6
+ jr .next_1
+.check_strange_behavior
+ cp SLOWBRO
+ jr nz, .check_curse
+ call Func_2255d
+ jr .next_1
+.check_curse
+ cp GENGAR
+ jr nz, .next_1
+ call z, Func_225b5
+ jr c, .done
+
+.next_1
+ pop bc
+.next_2
+ inc c
+ ld a, c
+ cp b
+ jr nz, .loop_play_area
+ ret
+
+.next_3
+ pop af
+ jr .next_2
-Func_2262d: ; 2262d (8:262d)
+.done
+ pop bc
+ ret
+; 0x22402
+
+Func_22402: ; 22402 (8:6402)
+ INCROM $22402, $22476
+
+Func_22476: ; 22476 (8:6476)
+ INCROM $22476, $224e6
+
+Func_224e6: ; 224e6 (8:64e6)
+ INCROM $224e6, $2255d
+
+Func_2255d: ; 2255d (8:655d)
+ INCROM $2255d, $225b5
+
+Func_225b5: ; 225b5 (8:65b5)
+ INCROM $225b5, $2262d
+
+Func_2262d: ; 2262d (8:662d)
INCROM $2262d, $226a3
-Func_226a3: ; 226a3 (8:26a3)
- INCROM $226a3, $22790
+; AI logic for Damage Swap to transfer damage from Arena card
+; to a card in Bench with more than 10 HP remaining
+; and with no energy cards attached.
+HandleAIDamageSwap: ; 226a3 (8:66a3)
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
+ call GetTurnDuelistVariable
+ dec a
+ ret z ; return if no Bench Pokemon
+
+ farcall AIChooseRandomlyNotToDoAction
+ ret c
+
+ ld a, ALAKAZAM
+ call CountPokemonIDInPlayArea
+ ret nc ; return if no Alakazam
+ ld a, MUK
+ call CountPokemonIDInBothPlayAreas
+ ret c ; return if there's Muk in play
+
+; only take damage off certain cards in Arena
+ ld a, DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ call GetCardIDFromDeckIndex
+ ld a, e
+ cp ALAKAZAM
+ jr z, .ok
+ cp KADABRA
+ jr z, .ok
+ cp ABRA
+ jr z, .ok
+ cp MR_MIME
+ ret nz
+
+.ok
+ ld e, PLAY_AREA_ARENA
+ call GetCardDamage
+ or a
+ ret z ; return if no damage
+
+ call ConvertHPToCounters
+ ld [wce06], a
+ ld a, ALAKAZAM
+ ld b, PLAY_AREA_BENCH_1
+ farcall LookForCardIDInPlayArea_Bank5
+ jr c, .is_in_bench
+
+; Alakazam is Arena card
+ xor a
+.is_in_bench
+ ld [wce08], a
+ call .CheckForDamageSwapTargetInBench
+ ret c ; return if not found
+
+; use Damage Swap
+ ld a, [wce08]
+ add DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ ldh [hTempCardIndex_ff9f], a
+ ld a, [wce08]
+ ldh [hTemp_ffa0], a
+ ld a, OPPACTION_USE_PKMN_POWER
+ bank1call AIMakeDecision
+ ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
+ bank1call AIMakeDecision
-Func_22790: ; 22790 (8:2790)
- INCROM $22790, $227d3
+ ld a, [wce06]
+ ld e, a
+.loop_damage
+ ld d, 30
+.small_delay_loop
+ call DoFrame
+ dec d
+ jr nz, .small_delay_loop
+
+ push de
+ call .CheckForDamageSwapTargetInBench
+ jr c, .no_more_target
+
+ ldh [hTempRetreatCostCards], a
+ xor a ; PLAY_AREA_ARENA
+ ldh [hTempPlayAreaLocation_ffa1], a
+ ld a, OPPACTION_6B15
+ bank1call AIMakeDecision
+ pop de
+ dec e
+ jr nz, .loop_damage
+
+.done
+ ld d, 60
+.big_delay_loop
+ call DoFrame
+ dec d
+ jr nz, .big_delay_loop
+ ld a, OPPACTION_DUEL_MAIN_SCENE
+ bank1call AIMakeDecision
+ ret
+
+.no_more_target
+ pop de
+ jr .done
+; 0x2273c
+
+; looks for a target in the bench to receive damage counters.
+; returns carry if one is found, and outputs remaining HP in a.
+.CheckForDamageSwapTargetInBench ; 2273c (8:673c)
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
+ call GetTurnDuelistVariable
+ ld b, a
+ ld c, PLAY_AREA_BENCH_1
+ lb de, $ff, $ff
+
+; look for candidates in bench to get the damage counters
+; only target specific card IDs.
+.loop_bench
+ ld a, c
+ add DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ push de
+ call GetCardIDFromDeckIndex
+ ld a, e
+ pop de
+ cp CHANSEY
+ jr z, .found_candidate
+ cp KANGASKHAN
+ jr z, .found_candidate
+ cp SNORLAX
+ jr z, .found_candidate
+ cp MR_MIME
+ jr z, .found_candidate
+
+.next_play_area
+ inc c
+ ld a, c
+ cp b
+ jr nz, .loop_bench
+
+; done
+ ld a, e
+ cp $ff
+ jr nz, .no_carry
+ ld a, d
+ cp $ff
+ jr z, .set_carry
+.no_carry
+ or a
+ ret
+
+.found_candidate
+; found a potential candidate to receive damage counters
+ ld a, DUELVARS_ARENA_CARD_HP
+ add c
+ call GetTurnDuelistVariable
+ cp 20
+ jr c, .next_play_area ; ignore cards with only 10 HP left
+
+ ld d, c ; store damage
+ push de
+ push bc
+ ld e, c
+ farcall CountNumberOfEnergyCardsAttached
+ pop bc
+ pop de
+ or a
+ jr nz, .next_play_area ; ignore cards with attached energy
+ ld e, c ; store deck index
+ jr .next_play_area
+
+.set_carry
+ scf
+ ret
+; 0x22790
+
+; handles AI logic for attaching energy cards
+; in Go Go Rain Dance deck.
+HandleAIGoGoRainDanceEnergy: ; 22790 (8:6790)
+ ld a, [wOpponentDeckID]
+ cp GO_GO_RAIN_DANCE_DECK_ID
+ ret nz ; return if not Go Go Rain Dance deck
+
+ ld a, BLASTOISE
+ call CountPokemonIDInPlayArea
+ ret nc ; return if no Blastoise
+ ld a, MUK
+ call CountPokemonIDInBothPlayAreas
+ ret c ; return if there's Muk in play
+
+; play all the energy cards that is needed.
+.loop
+ farcall AIProcessAndTryToPlayEnergy
+ jr c, .loop
+ ret
+; 0x227a9
+
+; runs through Player's whole deck and
+; sets carry if there's any Pokemon other
+; than Mewtwo1.
+CheckIfPlayerHasPokemonOtherThanMewtwo1: ; 227a9 (8:67a9)
+ call SwapTurn
+ ld e, 0
+.loop_deck
+ ld a, e
+ push de
+ call LoadCardDataToBuffer2_FromDeckIndex
+ pop de
+ ld a, [wLoadedCard2Type]
+ cp TYPE_ENERGY
+ jp nc, .next ; can be a jr
+ ld a, [wLoadedCard2ID]
+ cp MEWTWO1
+ jr nz, .not_mewtwo1
+.next
+ inc e
+ ld a, DECK_SIZE
+ cp e
+ jr nz, .loop_deck
+
+; no carry
+ call SwapTurn
+ or a
+ ret
+
+.not_mewtwo1
+ call SwapTurn
+ scf
+ ret
+; 0x227d3
; checks wcda7 and Pokemon in Play Area that are set up.
; if there's at least 4, goes to AI_TRAINER_CARD_PHASE_05.
@@ -6644,6 +6972,7 @@ Func_227d3: ; 227d3 (8:67d3)
cp %10000010
jr c, .asm_227e4
+; reset wcda7
xor a
ld [wcda7], a
jr .set_carry
diff --git a/src/wram.asm b/src/wram.asm
index 2a10fe2..9c20732 100644
--- a/src/wram.asm
+++ b/src/wram.asm
@@ -1380,9 +1380,9 @@ wAIVenusaur2DeckIndex:: ; ce04
wAIVenusaur2PlayAreaLocation:: ; ce05
ds $1
+wce06:: ; ce06
; number of cards to be transferred by AI using Energy Trans.
wAINumberOfEnergyTransCards::
-wce06:: ; ce06
ds $1
wce07:: ; ce07