summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElectroDeoxys <ElectroDeoxys@gmail.com>2021-10-25 22:48:13 +0100
committerElectroDeoxys <ElectroDeoxys@gmail.com>2021-10-25 22:48:13 +0100
commita01b7ace15515290e7534cf5662ffc2d5bfbcb69 (patch)
tree22a3c20beb052aa92bb2b9e1952e6d8cca913def
parent3839500453ea0837c9b07ccb0bff6e8f29a59fd3 (diff)
Clean up AI related stuff
-rw-r--r--src/engine/duel/ai/attacks.asm17
-rw-r--r--src/engine/duel/ai/boss_deck_set_up.asm30
-rw-r--r--src/engine/duel/ai/common.asm2
-rw-r--r--src/engine/duel/ai/core.asm161
-rw-r--r--src/engine/duel/ai/damage_calculation.asm2
-rw-r--r--src/engine/duel/ai/decks/fire_charge.asm24
-rw-r--r--src/engine/duel/ai/decks/first_strike.asm24
-rw-r--r--src/engine/duel/ai/decks/flower_power.asm24
-rw-r--r--src/engine/duel/ai/decks/general.asm16
-rw-r--r--src/engine/duel/ai/decks/general_no_retreat.asm14
-rw-r--r--src/engine/duel/ai/decks/go_go_rain_dance.asm24
-rw-r--r--src/engine/duel/ai/decks/im_ronald.asm24
-rw-r--r--src/engine/duel/ai/decks/invincible_ronald.asm24
-rw-r--r--src/engine/duel/ai/decks/legendary_articuno.asm28
-rw-r--r--src/engine/duel/ai/decks/legendary_dragonite.asm26
-rw-r--r--src/engine/duel/ai/decks/legendary_moltres.asm28
-rw-r--r--src/engine/duel/ai/decks/legendary_ronald.asm28
-rw-r--r--src/engine/duel/ai/decks/legendary_zapdos.asm26
-rw-r--r--src/engine/duel/ai/decks/powerful_ronald.asm24
-rw-r--r--src/engine/duel/ai/decks/rock_crusher.asm24
-rw-r--r--src/engine/duel/ai/decks/sams_practice.asm36
-rw-r--r--src/engine/duel/ai/decks/strange_psyshock.asm24
-rw-r--r--src/engine/duel/ai/decks/unreferenced.asm2
-rw-r--r--src/engine/duel/ai/decks/wonders_of_science.asm24
-rw-r--r--src/engine/duel/ai/decks/zapping_selfdestruct.asm24
-rw-r--r--src/engine/duel/ai/energy.asm2
-rw-r--r--src/engine/duel/ai/hand_pokemon.asm8
-rw-r--r--src/engine/duel/ai/init.asm4
-rw-r--r--src/engine/duel/ai/pkmn_powers.asm22
-rw-r--r--src/engine/duel/ai/retreat.asm15
-rw-r--r--src/engine/duel/ai/special_attacks.asm38
-rw-r--r--src/engine/duel/ai/trainer_cards.asm244
-rw-r--r--src/wram.asm14
33 files changed, 518 insertions, 509 deletions
diff --git a/src/engine/duel/ai/attacks.asm b/src/engine/duel/ai/attacks.asm
index 69ae2e1..604d42e 100644
--- a/src/engine/duel/ai/attacks.asm
+++ b/src/engine/duel/ai/attacks.asm
@@ -1,6 +1,6 @@
; have AI choose an attack to use, but do not execute it.
; return carry if an attack is chosen.
-AIProcessButDontUseAttack: ; 169ca (5:69ca)
+AIProcessButDontUseAttack:
ld a, $01
ld [wAIExecuteProcessedAttack], a
@@ -23,7 +23,7 @@ AIProcessButDontUseAttack: ; 169ca (5:69ca)
; copies wTempPlayAreaAIScore to wPlayAreaAIScore
; and loads wAIScore with value in wTempAIScore.
; identical to RetrievePlayAreaAIScoreFromBackup1.
-RetrievePlayAreaAIScoreFromBackup2: ; 169e3 (5:69e3)
+RetrievePlayAreaAIScoreFromBackup2:
push af
ld de, wPlayAreaAIScore
ld hl, wTempPlayAreaAIScore
@@ -42,7 +42,7 @@ RetrievePlayAreaAIScoreFromBackup2: ; 169e3 (5:69e3)
; have AI choose and execute an attack.
; return carry if an attack was chosen and attempted.
-AIProcessAndTryToUseAttack: ; 169f8 (5:69f8)
+AIProcessAndTryToUseAttack:
xor a
ld [wAIExecuteProcessedAttack], a
; fallthrough
@@ -51,7 +51,7 @@ AIProcessAndTryToUseAttack: ; 169f8 (5:69f8)
; If any of the attacks has enough AI score to be used,
; AI will use it if wAIExecuteProcessedAttack is 0.
; in either case, return carry if an attack is chosen to be used.
-AIProcessAttacks: ; 169fc (5:69fc)
+AIProcessAttacks:
; if AI used Pluspower, load its attack index
ld a, [wPreviousAIFlags]
and AI_FLAG_USED_PLUSPOWER
@@ -131,7 +131,7 @@ AIProcessAttacks: ; 169fc (5:69fc)
.can_damage
xor a
- ld [wcdb4], a
+ ld [wAIRetreatScore], a
jr .use_attack
.check_damage_bench
@@ -141,7 +141,7 @@ AIProcessAttacks: ; 169fc (5:69fc)
jr c, .can_damage
; cannot damage either Defending Pokemon or Bench
- ld hl, wcdb4
+ ld hl, wAIRetreatScore
inc [hl]
; return carry if attack is chosen
@@ -157,21 +157,20 @@ AIProcessAttacks: ; 169fc (5:69fc)
ld a, [wAIExecuteProcessedAttack]
or a
jr z, .failed_to_use
-
; reset Play Area AI score
; to the previous values.
jp RetrievePlayAreaAIScoreFromBackup2
; return no carry if no viable attack.
.failed_to_use
- ld hl, wcdb4
+ ld hl, wAIRetreatScore
inc [hl]
or a
ret
; determines the AI score of attack index in a
; of card in Play Area location hTempPlayAreaLocation_ff9d.
-GetAIScoreOfAttack: ; 16a86 (5:6a86)
+GetAIScoreOfAttack:
; initialize AI score.
ld [wSelectedAttack], a
ld a, $50
diff --git a/src/engine/duel/ai/boss_deck_set_up.asm b/src/engine/duel/ai/boss_deck_set_up.asm
index ebcd2ea..5d0e8c8 100644
--- a/src/engine/duel/ai/boss_deck_set_up.asm
+++ b/src/engine/duel/ai/boss_deck_set_up.asm
@@ -2,7 +2,7 @@
; always draws at least 2 Basic Pokemon cards and 2 Energy cards.
; also sets up so that the next cards to be drawn have
; some minimum number of Basic Pokemon and Energy cards.
-SetUpBossStartingHandAndDeck: ; 172af (5:72af)
+SetUpBossStartingHandAndDeck:
; shuffle all hand cards in deck
ld a, DUELVARS_HAND
call GetTurnDuelistVariable
@@ -22,8 +22,8 @@ SetUpBossStartingHandAndDeck: ; 172af (5:72af)
; in the first STARTING_HAND_SIZE in deck.
.count_energy_basic
xor a
- ld [wce06], a
- ld [wce08], a
+ ld [wAISetupBasicPokemonCount], a
+ ld [wAISetupEnergyCount], a
ld a, DUELVARS_DECK_CARDS
call GetTurnDuelistVariable
@@ -40,18 +40,18 @@ SetUpBossStartingHandAndDeck: ; 172af (5:72af)
jr z, .next_card_deck_1
; energy card
- ld a, [wce08]
+ ld a, [wAISetupEnergyCount]
inc a
- ld [wce08], a
+ ld [wAISetupEnergyCount], a
jr .next_card_deck_1
.pokemon_card_1
ld a, [wLoadedCard1Stage]
or a
jr nz, .next_card_deck_1 ; not basic
- ld a, [wce06]
+ ld a, [wAISetupBasicPokemonCount]
inc a
- ld [wce06], a
+ ld [wAISetupBasicPokemonCount], a
.next_card_deck_1
dec b
@@ -59,10 +59,10 @@ SetUpBossStartingHandAndDeck: ; 172af (5:72af)
; tally the number of Energy and basic Pokemon cards
; and if any of them is smaller than 2, re-shuffle deck.
- ld a, [wce06]
+ ld a, [wAISetupBasicPokemonCount]
cp 2
jr c, .shuffle_deck
- ld a, [wce08]
+ ld a, [wAISetupEnergyCount]
cp 2
jr c, .shuffle_deck
@@ -95,27 +95,27 @@ SetUpBossStartingHandAndDeck: ; 172af (5:72af)
jr z, .next_card_deck_2
; energy card
- ld a, [wce08]
+ ld a, [wAISetupEnergyCount]
inc a
- ld [wce08], a
+ ld [wAISetupEnergyCount], a
jr .next_card_deck_2
.pokemon_card_2
ld a, [wLoadedCard1Stage]
or a
jr nz, .next_card_deck_2
- ld a, [wce06]
+ ld a, [wAISetupBasicPokemonCount]
inc a
- ld [wce06], a
+ ld [wAISetupBasicPokemonCount], a
.next_card_deck_2
dec b
jr nz, .loop_deck_2
- ld a, [wce06]
+ ld a, [wAISetupBasicPokemonCount]
cp 4
jp c, .shuffle_deck
- ld a, [wce08]
+ ld a, [wAISetupEnergyCount]
cp 4
jp c, .shuffle_deck
diff --git a/src/engine/duel/ai/common.asm b/src/engine/duel/ai/common.asm
index d4f1da4..7264170 100644
--- a/src/engine/duel/ai/common.asm
+++ b/src/engine/duel/ai/common.asm
@@ -1,7 +1,7 @@
; runs through Player's whole deck and
; sets carry if there's any Pokemon other
; than Mewtwo1.
-CheckIfPlayerHasPokemonOtherThanMewtwo1: ; 227a9 (8:67a9)
+CheckIfPlayerHasPokemonOtherThanMewtwo1:
call SwapTurn
ld e, 0
.loop_deck
diff --git a/src/engine/duel/ai/core.asm b/src/engine/duel/ai/core.asm
index 9604322..fb14747 100644
--- a/src/engine/duel/ai/core.asm
+++ b/src/engine/duel/ai/core.asm
@@ -7,14 +7,14 @@ INCLUDE "engine/duel/ai/decks/unreferenced.asm"
; [hTempPlayAreaLocation_ff9d] = location of attacking card to consider
; output:
; [wSelectedAttack] = attack index that KOs
-CheckIfAnyAttackKnocksOutDefendingCard: ; 140ae (5:40ae)
+CheckIfAnyAttackKnocksOutDefendingCard:
xor a ; first attack
call CheckIfAttackKnocksOutDefendingCard
ret c
ld a, SECOND_ATTACK
; fallthrough
-CheckIfAttackKnocksOutDefendingCard: ; 140b5 (5:40b5)
+CheckIfAttackKnocksOutDefendingCard:
call EstimateDamage_VersusDefendingCard
ld a, DUELVARS_ARENA_CARD_HP
call GetNonTurnDuelistVariable
@@ -29,7 +29,7 @@ CheckIfAttackKnocksOutDefendingCard: ; 140b5 (5:40b5)
; brings card at hTempPlayAreaLocation_ff9d down
; to exactly 0 HP.
; outputs that attack index in wSelectedAttack.
-CheckIfAnyDefendingPokemonAttackDealsSameDamageAsHP: ; 140c5 (5:40c5)
+CheckIfAnyDefendingPokemonAttackDealsSameDamageAsHP:
xor a ; FIRST_ATTACK_OR_PKMN_POWER
call .check_damage
ret c
@@ -51,7 +51,7 @@ CheckIfAnyDefendingPokemonAttackDealsSameDamageAsHP: ; 140c5 (5:40c5)
; checks AI scores for all benched Pokémon
; returns the location of the card with highest score
; in a and [hTempPlayAreaLocation_ff9d]
-FindHighestBenchScore: ; 140df (5:40df)
+FindHighestBenchScore:
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
ld b, a
@@ -81,7 +81,7 @@ FindHighestBenchScore: ; 140df (5:40df)
; if there's overflow, it's capped at $ff
; output:
; a = a + wAIScore (capped at $ff)
-AddToAIScore: ; 140fe (5:40fe)
+AddToAIScore:
push hl
ld hl, wAIScore
add [hl]
@@ -94,7 +94,7 @@ AddToAIScore: ; 140fe (5:40fe)
; subs a from wAIScore
; if there's underflow, it's capped at $00
-SubFromAIScore: ; 1410a (5:410a)
+SubFromAIScore:
push hl
push de
ld e, a
@@ -113,7 +113,7 @@ SubFromAIScore: ; 1410a (5:410a)
; loads defending Pokémon's weakness/resistance
; and the number of prize cards in both sides
-LoadDefendingPokemonColorWRAndPrizeCards: ; 1411d (5:411d)
+LoadDefendingPokemonColorWRAndPrizeCards:
call SwapTurn
call GetArenaCardColor
call TranslateColorToWR
@@ -132,7 +132,7 @@ LoadDefendingPokemonColorWRAndPrizeCards: ; 1411d (5:411d)
; called when AI has chosen its attack.
; executes all effects and damage.
; handles AI choosing parameters for certain attacks as well.
-AITryUseAttack: ; 14145 (5:4145)
+AITryUseAttack:
ld a, [wSelectedAttack]
ldh [hTemp_ffa0], a
ld e, a
@@ -182,7 +182,7 @@ AITryUseAttack: ; 14145 (5:4145)
; a = energy card attached to Pokémon to check
; [wTempCardType] = TYPE_ENERGY_* of given Pokémon
; [wTempCardID] = card index of Pokémon card to check
-CheckIfEnergyIsUseful: ; 14184 (5:4184)
+CheckIfEnergyIsUseful:
push de
call GetCardIDFromDeckIndex
ld a, e
@@ -242,7 +242,7 @@ CheckIfEnergyIsUseful: ; 14184 (5:4184)
; pick a random Pokemon in the bench.
; output:
; - a = PLAY_AREA_* of Bench Pokemon picked.
-PickRandomBenchPokemon: ; 141da (5:41da)
+PickRandomBenchPokemon:
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
dec a
@@ -250,7 +250,7 @@ PickRandomBenchPokemon: ; 141da (5:41da)
inc a
ret
-AIPickPrizeCards: ; 141e5 (5:41e5)
+AIPickPrizeCards:
ld a, [wNumberPrizeCardsToTake]
ld b, a
.loop
@@ -266,7 +266,7 @@ AIPickPrizeCards: ; 141e5 (5:41e5)
; picks a prize card at random
; and adds it to the hand.
-.PickPrizeCard: ; 141f8 (5:41f8)
+.PickPrizeCard:
ld a, DUELVARS_PRIZES
call GetTurnDuelistVariable
push hl
@@ -312,7 +312,7 @@ AIPickPrizeCards: ; 141e5 (5:41e5)
; routine for AI to play all Basic cards from its hand
; in the beginning of the Duel.
-AIPlayInitialBasicCards: ; 14226 (5:4226)
+AIPlayInitialBasicCards:
call CreateHandCardList
ld hl, wDuelTempList
.check_for_next_card
@@ -341,7 +341,7 @@ AIPlayInitialBasicCards: ; 14226 (5:4226)
; input:
; [hTempPlayAreaLocation_ff9d] = location of Pokémon card
; [wSelectedAttack] = selected attack to examine
-CheckIfSelectedAttackIsUnusable: ; 1424b (5:424b)
+CheckIfSelectedAttackIsUnusable:
ldh a, [hTempPlayAreaLocation_ff9d]
or a
jr nz, .bench
@@ -382,7 +382,7 @@ CheckIfSelectedAttackIsUnusable: ; 1424b (5:424b)
; carry set if no attack
; OR if it's a Pokémon Power
; OR if not enough energy for attack
-CheckEnergyNeededForAttack: ; 14279 (5:4279)
+CheckEnergyNeededForAttack:
ldh a, [hTempPlayAreaLocation_ff9d]
add DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
@@ -484,7 +484,7 @@ CheckEnergyNeededForAttack: ; 14279 (5:4279)
; [hl] = attached energy
; output:
; carry set if not enough of this energy type attached
-CheckIfEnoughParticularAttachedEnergy: ; 142f4 (5:42f4)
+CheckIfEnoughParticularAttachedEnergy:
and %00001111
jr nz, .check
.has_enough
@@ -512,7 +512,7 @@ CheckIfEnoughParticularAttachedEnergy: ; 142f4 (5:42f4)
; a = energy type
; output:
; a = energy card ID
-ConvertColorToEnergyCardID: ; 1430f (5:430f)
+ConvertColorToEnergyCardID:
push hl
push de
ld e, a
@@ -536,7 +536,7 @@ ConvertColorToEnergyCardID: ; 1430f (5:430f)
; returns carry if loaded attack effect has
; an "initial effect 2" or "require selection" command type
; unreferenced
-Func_14323: ; 14323 (5:4323)
+Func_14323:
ld hl, wLoadedAttackEffectCommands
ld a, [hli]
ld h, [hl]
@@ -563,7 +563,7 @@ Func_14323: ; 14323 (5:4323)
; - if trainer card, return carry if it can be used
; input:
; a = card index to check
-CheckIfCardCanBePlayed: ; 1433d (5:433d)
+CheckIfCardCanBePlayed:
ldh [hTempCardIndex_ff9f], a
call LoadCardDataToBuffer1_FromDeckIndex
ld a, [wLoadedCard1Type]
@@ -621,7 +621,7 @@ CheckIfCardCanBePlayed: ; 1433d (5:433d)
; loads all the energy cards
; in hand in wDuelTempList
; return carry if no energy cards found
-CreateEnergyCardListFromHand: ; 1438c (5:438c)
+CreateEnergyCardListFromHand:
push hl
push de
push bc
@@ -670,7 +670,7 @@ CreateEnergyCardListFromHand: ; 1438c (5:438c)
; output:
; a = card deck index, if found
; carry set if NOT found
-LookForCardIDInHand: ; 143bf (5:43bf)
+LookForCardIDInHand:
push hl
push de
push bc
@@ -709,7 +709,7 @@ LookForCardIDInHand: ; 143bf (5:43bf)
INCLUDE "engine/duel/ai/damage_calculation.asm"
-AIProcessHandTrainerCards: ; 14663 (5:4663)
+AIProcessHandTrainerCards:
farcall _AIProcessHandTrainerCards
ret
@@ -724,7 +724,7 @@ INCLUDE "engine/duel/ai/deck_ai.asm"
; output:
; a = card deck index, if found
; carry set if found
-LookForCardIDInHandList_Bank5: ; 155d2 (5:55d2)
+LookForCardIDInHandList_Bank5:
ld [wTempCardIDToLook], a
call CreateHandCardList
ld hl, wDuelTempList
@@ -753,7 +753,7 @@ LookForCardIDInHandList_Bank5: ; 155d2 (5:55d2)
; output:
; a = PLAY_AREA_* of found card
; carry set if found
-LookForCardIDInPlayArea_Bank5: ; 155ef (5:55ef)
+LookForCardIDInPlayArea_Bank5:
ld [wTempCardIDToLook], a
.loop
@@ -785,7 +785,7 @@ LookForCardIDInPlayArea_Bank5: ; 155ef (5:55ef)
; input:
; e = Energy card ID
; d = Pokemon card ID
-AIAttachEnergyInHandToCardInPlayArea: ; 15612 (5:5612)
+AIAttachEnergyInHandToCardInPlayArea:
ld a, e
push de
call LookForCardIDInHandList_Bank5
@@ -806,7 +806,7 @@ AIAttachEnergyInHandToCardInPlayArea: ; 15612 (5:5612)
; same as AIAttachEnergyInHandToCardInPlayArea but
; only look for card ID in the Bench.
-AIAttachEnergyInHandToCardInBench: ; 1562b (5:562b)
+AIAttachEnergyInHandToCardInBench:
ld a, e
push de
call LookForCardIDInHandList_Bank5
@@ -831,7 +831,7 @@ INCLUDE "engine/duel/ai/init.asm"
; carry set if no attack
; OR if it's a Pokémon Power
; OR if not enough energy for attack
-CheckEnergyNeededForAttackAfterDiscard: ; 156c3 (5:56c3)
+CheckEnergyNeededForAttackAfterDiscard:
ldh a, [hTempPlayAreaLocation_ff9d]
add DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
@@ -934,7 +934,7 @@ CheckEnergyNeededForAttackAfterDiscard: ; 156c3 (5:56c3)
ret
; zeroes a bytes starting at hl
-ClearMemory_Bank5: ; 1575e (5:575e)
+ClearMemory_Bank5:
push af
push bc
push hl
@@ -950,7 +950,7 @@ ClearMemory_Bank5: ; 1575e (5:575e)
ret
; returns in a the tens digit of value in a
-CalculateByteTensDigit: ; 1576b (5:576b)
+CalculateByteTensDigit:
push bc
ld c, 0
.loop
@@ -968,7 +968,7 @@ CalculateByteTensDigit: ; 1576b (5:576b)
; input:
; a = divisor
; b = dividend
-CalculateBDividedByA_Bank5: ; 15778 (5:5778)
+CalculateBDividedByA_Bank5:
push bc
ld c, a
ld a, b
@@ -992,7 +992,7 @@ CalculateBDividedByA_Bank5: ; 15778 (5:5778)
; e = location to check, i.e. PLAY_AREA_*
; output:
; a = number of energy cards attached
-CountNumberOfEnergyCardsAttached: ; 15787 (5:5787)
+CountNumberOfEnergyCardsAttached:
call GetPlayAreaCardAttachedEnergies
ld a, [wTotalAttachedEnergies]
or a
@@ -1025,7 +1025,7 @@ CountNumberOfEnergyCardsAttached: ; 15787 (5:5787)
; e = card ID to look for.
; output:
; a = deck index of card found, if any
-CheckIfAnyCardIDinLocation: ; 157a3 (5:57a3)
+CheckIfAnyCardIDinLocation:
ld b, a
ld c, e
lb de, 0, 0
@@ -1058,7 +1058,7 @@ CheckIfAnyCardIDinLocation: ; 157a3 (5:57a3)
; plus all the cards attached in Turn Duelist's Play Area.
; output:
; a and wTempAI = total number of energy cards.
-CountOppEnergyCardsInHandAndAttached: ; 157c6 (5:57c6)
+CountOppEnergyCardsInHandAndAttached:
xor a
ld [wTempAI], a
call CreateEnergyCardListFromHand
@@ -1098,7 +1098,7 @@ CountOppEnergyCardsInHandAndAttached: ; 157c6 (5:57c6)
; input:
; e = card ID to look for.
; hl = list to look in
-RemoveCardIDInList: ; 157f3 (5:57f3)
+RemoveCardIDInList:
push hl
push de
push bc
@@ -1149,7 +1149,7 @@ RemoveCardIDInList: ; 157f3 (5:57f3)
; one list is for the Arena card is the other is for the Bench cards.
; if Arena card could not be set (due to hand not having any card in its list)
; or if list is null, return carry and do not play any cards.
-TrySetUpBossStartingPlayArea: ; 1581b (5:581b)
+TrySetUpBossStartingPlayArea:
ld de, wAICardListArenaPriority
ld a, d
or a
@@ -1222,7 +1222,7 @@ TrySetUpBossStartingPlayArea: ; 1581b (5:581b)
; returns carry if a card ID is found in bench with at least the
; listed number of energy cards
; unreferenced
-Func_1585b: ; 1585b (5:585b)
+Func_1585b:
ld a, [hli]
or a
jr z, .no_carry
@@ -1271,7 +1271,7 @@ Func_1585b: ; 1585b (5:585b)
; with less than the number of energy cards corresponding to its entry
; then have AI try to play an energy card from the hand to it
; unreferenced
-Func_15886: ; 15886 (5:5886)
+Func_15886:
push hl
call CreateEnergyCardListFromHand
pop hl
@@ -1309,7 +1309,7 @@ Func_15886: ; 15886 (5:5886)
INCLUDE "engine/duel/ai/retreat.asm"
; Copy cards from wDuelTempList in hl to wHandTempList in de
-CopyHandCardList: ; 15ea6 (5:5ea6)
+CopyHandCardList:
ld a, [hli]
ld [de], a
cp $ff
@@ -1325,7 +1325,7 @@ INCLUDE "engine/duel/ai/hand_pokemon.asm"
; can damage it, and if it can, set carry
; input:
; a = location of Pokémon card
-CheckDamageToMrMime: ; 16270 (5:6270)
+CheckDamageToMrMime:
push af
ld a, DUELVARS_ARENA_CARD
call GetNonTurnDuelistVariable
@@ -1347,7 +1347,7 @@ CheckDamageToMrMime: ; 16270 (5:6270)
; returns carry if arena card
; can knock out defending Pokémon
-CheckIfActiveCardCanKnockOut: ; 1628f (5:628f)
+CheckIfActiveCardCanKnockOut:
xor a
ldh [hTempPlayAreaLocation_ff9d], a
call CheckIfAnyAttackKnocksOutDefendingCard
@@ -1363,7 +1363,7 @@ CheckIfActiveCardCanKnockOut: ; 1628f (5:628f)
; outputs carry if any of the active Pokémon attacks
; can be used and are not residual
-CheckIfActivePokemonCanUseAnyNonResidualAttack: ; 162a1 (5:62a1)
+CheckIfActivePokemonCanUseAnyNonResidualAttack:
xor a ; active card
ldh [hTempPlayAreaLocation_ff9d], a
; first atk
@@ -1400,7 +1400,7 @@ CheckIfActivePokemonCanUseAnyNonResidualAttack: ; 162a1 (5:62a1)
; return carry if successful in finding card
; input:
; [hTempPlayAreaLocation_ff9d] = location of Pokémon card
-LookForEnergyNeededInHand: ; 162c8 (5:62c8)
+LookForEnergyNeededInHand:
xor a ; first attack
ld [wSelectedAttack], a
call CheckEnergyNeededForAttack
@@ -1462,7 +1462,7 @@ LookForEnergyNeededInHand: ; 162c8 (5:62c8)
; input:
; [hTempPlayAreaLocation_ff9d] = location of Pokémon card
; [wSelectedAttack] = selected attack to examine
-LookForEnergyNeededForAttackInHand: ; 16311 (5:6311)
+LookForEnergyNeededForAttackInHand:
call CheckEnergyNeededForAttack
ld a, b
add c
@@ -1502,7 +1502,7 @@ LookForEnergyNeededForAttackInHand: ; 16311 (5:6311)
; by wAICardListPlayFromHandPriority and compares it to each card in hand.
; Sorts the hand in wDuelTempList so that the found card IDs
; are in the same order as the list pointed by de.
-SortTempHandByIDList: ; 1633f (5:633f)
+SortTempHandByIDList:
ld a, [wAICardListPlayFromHandPriority+1]
or a
ret z ; return if list is empty
@@ -1563,7 +1563,7 @@ SortTempHandByIDList: ; 1633f (5:633f)
; return carry if successful in finding card
; input:
; a = energy flags needed
-CheckEnergyFlagsNeededInList: ; 1637b (5:637b)
+CheckEnergyFlagsNeededInList:
ld e, a
ld hl, wDuelTempList
.next_card
@@ -1630,7 +1630,7 @@ CheckEnergyFlagsNeededInList: ; 1637b (5:637b)
; a = card index
; output:
; a = bits of each energy requirement
-GetAttacksEnergyCostBits: ; 163c9 (5:63c9)
+GetAttacksEnergyCostBits:
call LoadCardDataToBuffer2_FromDeckIndex
ld hl, wLoadedCard2Atk1EnergyCost
call GetEnergyCostBits
@@ -1651,7 +1651,7 @@ GetAttacksEnergyCostBits: ; 163c9 (5:63c9)
; [hl] = Loaded card attack energy cost
; output:
; a = bits of each energy requirement
-GetEnergyCostBits: ; 163dd (5:63dd)
+GetEnergyCostBits:
ld c, $00
ld a, [hli]
ld b, a
@@ -1716,7 +1716,7 @@ GetEnergyCostBits: ; 163dd (5:63dd)
; a = card index to check evolution
; output:
; a = card index of evolution found
-CheckForEvolutionInList: ; 16422 (5:6422)
+CheckForEvolutionInList:
ld b, a
ld a, DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
@@ -1760,7 +1760,7 @@ CheckForEvolutionInList: ; 16422 (5:6422)
; a = card index to check evolution
; output:
; a = card index of evolution found
-CheckForEvolutionInDeck: ; 16451 (5:6451)
+CheckForEvolutionInDeck:
ld b, a
ld a, DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
@@ -1818,7 +1818,7 @@ INCLUDE "engine/duel/ai/special_attacks.asm"
; output:
; a = card location of Pokémon card, if found;
; carry set if such a card is found.
-LookForCardThatIsKnockedOutOnDevolution: ; 17080 (5:7080)
+LookForCardThatIsKnockedOutOnDevolution:
ldh a, [hTempPlayAreaLocation_ff9d]
push af
call SwapTurn
@@ -1876,7 +1876,7 @@ LookForCardThatIsKnockedOutOnDevolution: ; 17080 (5:7080)
; - arena card Unknown2's 4 bit is not set or
; is set but there's no evolution of card in hand/deck
; - arena card can use second attack
-CheckIfArenaCardIsAtHalfHPCanEvolveAndUseSecondAttack: ; 170c9 (5:70c9)
+CheckIfArenaCardIsAtHalfHPCanEvolveAndUseSecondAttack:
ld a, DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
ld d, a
@@ -1922,7 +1922,7 @@ CheckIfArenaCardIsAtHalfHPCanEvolveAndUseSecondAttack: ; 170c9 (5:70c9)
; Outputs the number of Pokémon in bench
; that meet these requirements in a
; and returns carry if at least one is found
-CountNumberOfSetUpBenchPokemon: ; 17101 (5:7101)
+CountNumberOfSetUpBenchPokemon:
ldh a, [hTempPlayAreaLocation_ff9d]
ld d, a
ld a, [wSelectedAttack]
@@ -2004,7 +2004,7 @@ CountNumberOfSetUpBenchPokemon: ; 17101 (5:7101)
; returns carry if selection was successful,
; and no carry if unable to make one.
; outputs in hTempPlayAreaLocation_ffa1 the chosen parameter.
-AISelectSpecialAttackParameters: ; 17161 (5:7161)
+AISelectSpecialAttackParameters:
ld a, [wSelectedAttack]
push af
call .SelectAttackParameters
@@ -2013,7 +2013,7 @@ AISelectSpecialAttackParameters: ; 17161 (5:7161)
ld [wSelectedAttack], a
ret
-.SelectAttackParameters: ; 1716e (5:716e)
+.SelectAttackParameters:
ld a, DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
call GetCardIDFromDeckIndex
@@ -2139,7 +2139,7 @@ AISelectSpecialAttackParameters: ; 17161 (5:7161)
; [wSelectedAttack] = attack index to check
; output:
; a = number of extra energy cards attached
-CheckIfNoSurplusEnergyForAttack: ; 171fb (5:71fb)
+CheckIfNoSurplusEnergyForAttack:
ldh a, [hTempPlayAreaLocation_ff9d]
add DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
@@ -2211,7 +2211,7 @@ CheckIfNoSurplusEnergyForAttack: ; 171fb (5:71fb)
; [hl] = attached energy
; output:
; carry set if not enough of this energy type attached
-CalculateParticularAttachedEnergyNeeded: ; 17258 (5:7258)
+CalculateParticularAttachedEnergyNeeded:
and %00001111
jr nz, .check
.done
@@ -2240,7 +2240,7 @@ CalculateParticularAttachedEnergyNeeded: ; 17258 (5:7258)
; output:
; a = deck index of evolution in hand, if found;
; carry set if there's a card in hand that can evolve.
-CheckCardEvolutionInHandOrDeck: ; 17274 (5:7274)
+CheckCardEvolutionInHandOrDeck:
ld b, a
ld a, DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
@@ -2291,7 +2291,7 @@ INCLUDE "engine/duel/ai/boss_deck_set_up.asm"
; can damage defending Pokémon with any of its attacks
; input:
; a = location of card to check
-CheckIfCanDamageDefendingPokemon: ; 17383 (5:7383)
+CheckIfCanDamageDefendingPokemon:
ldh [hTempPlayAreaLocation_ff9d], a
xor a ; first attack
ld [wSelectedAttack], a
@@ -2323,7 +2323,7 @@ CheckIfCanDamageDefendingPokemon: ; 17383 (5:7383)
; checks if defending Pokémon can knock out
; card at hTempPlayAreaLocation_ff9d with any of its attacks
-; and if so, stores the damage to wce00 and wce01
+; and if so, stores the damage to wAIFirstAttackDamage and wAISecondAttackDamage
; sets carry if any on the attacks knocks out
; also outputs the largest damage dealt in a
; input:
@@ -2331,34 +2331,35 @@ CheckIfCanDamageDefendingPokemon: ; 17383 (5:7383)
; output:
; a = largest damage of both attacks
; carry set if can knock out
-CheckIfDefendingPokemonCanKnockOut: ; 173b1 (5:73b1)
- xor a ; first attack
- ld [wce00], a
- ld [wce01], a
+CheckIfDefendingPokemonCanKnockOut:
+ xor a
+ ld [wAIFirstAttackDamage], a
+ ld [wAISecondAttackDamage], a
+
+ ; first attack
call CheckIfDefendingPokemonCanKnockOutWithAttack
jr nc, .second_attack
ld a, [wDamage]
- ld [wce00], a
-
+ ld [wAIFirstAttackDamage], a
.second_attack
ld a, SECOND_ATTACK
call CheckIfDefendingPokemonCanKnockOutWithAttack
jr nc, .return_if_neither_kos
ld a, [wDamage]
- ld [wce01], a
+ ld [wAISecondAttackDamage], a
jr .compare
.return_if_neither_kos
- ld a, [wce00]
+ ld a, [wAIFirstAttackDamage]
or a
ret z
.compare
- ld a, [wce00]
+ ld a, [wAIFirstAttackDamage]
ld b, a
- ld a, [wce01]
+ ld a, [wAISecondAttackDamage]
cp b
- jr nc, .set_carry
+ jr nc, .set_carry ; wAIFirstAttackDamage < wAISecondAttackDamage
ld a, b
.set_carry
scf
@@ -2369,7 +2370,7 @@ CheckIfDefendingPokemonCanKnockOut: ; 173b1 (5:73b1)
; input:
; a = attack index
; [hTempPlayAreaLocation_ff9d] = location of card to check
-CheckIfDefendingPokemonCanKnockOutWithAttack: ; 173e4 (5:73e4)
+CheckIfDefendingPokemonCanKnockOutWithAttack:
ld [wSelectedAttack], a
ldh a, [hTempPlayAreaLocation_ff9d]
push af
@@ -2406,7 +2407,7 @@ CheckIfDefendingPokemonCanKnockOutWithAttack: ; 173e4 (5:73e4)
; is between LEGENDARY_MOLTRES_DECK_ID (inclusive)
; and MUSCLES_FOR_BRAINS_DECK_ID (exclusive)
; these are the decks for Grandmaster/Club Master/Ronald
-CheckIfOpponentHasBossDeckID: ; 17414 (5:7414)
+CheckIfOpponentHasBossDeckID:
push af
ld a, [wOpponentDeckID]
cp LEGENDARY_MOLTRES_DECK_ID
@@ -2424,7 +2425,7 @@ CheckIfOpponentHasBossDeckID: ; 17414 (5:7414)
; sets carry if not a boss fight
; and if hasn't received legendary cards yet
-CheckIfNotABossDeckID: ; 17426 (5:7426)
+CheckIfNotABossDeckID:
call EnableSRAM
ld a, [sReceivedLegendaryCards]
call DisableSRAM
@@ -2446,7 +2447,7 @@ CheckIfNotABossDeckID: ; 17426 (5:7426)
; - 0% for boss decks.
; used for certain decks to randomly choose
; not to play Trainer card or use PKMN Power
-AIChooseRandomlyNotToDoAction: ; 1743b (5:743b)
+AIChooseRandomlyNotToDoAction:
; boss decks always use Trainer cards.
push hl
push de
@@ -2494,7 +2495,7 @@ AIChooseRandomlyNotToDoAction: ; 1743b (5:743b)
; a = card ID to check for
; output:
; carry set if the above requirements are met
-CheckForBenchIDAtHalfHPAndCanUseSecondAttack: ; 17474 (5:7474)
+CheckForBenchIDAtHalfHPAndCanUseSecondAttack:
ld [wcdf9], a
ldh a, [hTempPlayAreaLocation_ff9d]
ld d, a
@@ -2559,7 +2560,7 @@ CheckForBenchIDAtHalfHPAndCanUseSecondAttack: ; 17474 (5:7474)
; in bench that have same ID as register a
; input:
; a = card ID to look for
-RaiseAIScoreToAllMatchingIDsInBench: ; 174cd (5:74cd)
+RaiseAIScoreToAllMatchingIDsInBench:
ld d, a
ld a, DUELVARS_BENCH
call GetTurnDuelistVariable
@@ -2591,7 +2592,7 @@ RaiseAIScoreToAllMatchingIDsInBench: ; 174cd (5:74cd)
; card has highest value calculated from Func_17583
; the card with highest value gets increased wPlayAreaEnergyAIScore
; while all others get decreased wPlayAreaEnergyAIScore
-Func_174f2: ; 174f2 (5:74f2)
+Func_174f2:
ld a, MAX_PLAY_AREA_POKEMON
ld hl, wcdfa
call ClearMemory_Bank5
@@ -2713,7 +2714,7 @@ Func_174f2: ; 174f2 (5:74f2)
; with energy * 2 + $80 - floor(dam / 10)
; loads wcdfa + play area location in e
; with $01
-Func_17583: ; 17583 (5:7583)
+Func_17583:
push hl
push de
call GetCardDamageAndMaxHP
@@ -2741,7 +2742,7 @@ Func_17583: ; 17583 (5:7583)
; counts how many play area locations in wcdea
; are != 0, and outputs result in a
; also returns carry if result is < 2
-Func_175a8: ; 175a8 (5:75a8)
+Func_175a8:
ld hl, wcdea
ld d, $00
ld e, MAX_PLAY_AREA_POKEMON + 1
@@ -2760,7 +2761,7 @@ Func_175a8: ; 175a8 (5:75a8)
; handle how AI scores giving out Energy Cards
; when using Legendary Articuno deck
-HandleLegendaryArticunoEnergyScoring: ; 175bd (5:75bd)
+HandleLegendaryArticunoEnergyScoring:
ld a, [wOpponentDeckID]
cp LEGENDARY_ARTICUNO_DECK_ID
jr z, .articuno_deck
diff --git a/src/engine/duel/ai/damage_calculation.asm b/src/engine/duel/ai/damage_calculation.asm
index 97c24b6..9660c9d 100644
--- a/src/engine/duel/ai/damage_calculation.asm
+++ b/src/engine/duel/ai/damage_calculation.asm
@@ -3,7 +3,7 @@
; input:
; a = attack index to take into account
; [hTempPlayAreaLocation_ff9d] = location of attacking card to consider
-EstimateDamage_VersusDefendingCard: ; 143e5 (5:43e5)
+EstimateDamage_VersusDefendingCard:
ld [wSelectedAttack], a
ld e, a
ldh a, [hTempPlayAreaLocation_ff9d]
diff --git a/src/engine/duel/ai/decks/fire_charge.asm b/src/engine/duel/ai/decks/fire_charge.asm
index f5b347b..ff8d11e 100644
--- a/src/engine/duel/ai/decks/fire_charge.asm
+++ b/src/engine/duel/ai/decks/fire_charge.asm
@@ -1,4 +1,4 @@
-AIActionTable_FireCharge: ; 15232 (5:5232)
+AIActionTable_FireCharge:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_FireCharge: ; 15232 (5:5232)
dw .ko_switch
dw .take_prize
-.do_turn ; 1523e (5:523e)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 15242 (5:5242)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_FireCharge: ; 15232 (5:5232)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 15253 (5:5253)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 15257 (5:5257)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 1525b (5:525b)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 1525f (5:525f)
+.list_arena
db JIGGLYPUFF3
db CHANSEY
db TAUROS
@@ -40,7 +40,7 @@ AIActionTable_FireCharge: ; 15232 (5:5232)
db GROWLITHE
db $00
-.list_bench ; 15266 (5:5266)
+.list_bench
db JIGGLYPUFF3
db CHANSEY
db GROWLITHE
@@ -49,13 +49,13 @@ AIActionTable_FireCharge: ; 15232 (5:5232)
db TAUROS
db $00
-.list_retreat ; 1526e (5:526e)
+.list_retreat
ai_retreat JIGGLYPUFF1, -1
ai_retreat CHANSEY, -1
ai_retreat GROWLITHE, -1
db $00
-.list_energy ; 15274 (5:5274)
+.list_energy
ai_energy GROWLITHE, 3, +0
ai_energy ARCANINE2, 4, +0
ai_energy MAGMAR1, 3, +0
@@ -66,11 +66,11 @@ AIActionTable_FireCharge: ; 15232 (5:5232)
ai_energy TAUROS, 3, +0
db $00
-.list_prize ; 1528d (5:528d)
+.list_prize
db GAMBLER
db $00
-.store_list_pointers ; 1528f (5:528f)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
diff --git a/src/engine/duel/ai/decks/first_strike.asm b/src/engine/duel/ai/decks/first_strike.asm
index 2e636e1..6d5d7c5 100644
--- a/src/engine/duel/ai/decks/first_strike.asm
+++ b/src/engine/duel/ai/decks/first_strike.asm
@@ -1,4 +1,4 @@
-AIActionTable_FirstStrike: ; 14e89 (5:4e89)
+AIActionTable_FirstStrike:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_FirstStrike: ; 14e89 (5:4e89)
dw .ko_switch
dw .take_prize
-.do_turn ; 14e95 (5:4e95)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 14e99 (5:4e99)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,39 +19,39 @@ AIActionTable_FirstStrike: ; 14e89 (5:4e89)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 14eaa (5:4eaa)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 14eae (5:4eae)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 14eb2 (5:4eb2)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 14eb6 (5:1eb6)
+.list_arena
db HITMONCHAN
db MACHOP
db HITMONLEE
db MANKEY
db $00
-.list_bench ; 14ebb (5:1ebb)
+.list_bench
db MACHOP
db HITMONLEE
db HITMONCHAN
db MANKEY
db $00
-.list_retreat ; 14ec0 (5:1ec0)
+.list_retreat
ai_retreat MACHOP, -1
ai_retreat MACHOKE, -1
ai_retreat MANKEY, -2
db $00
-.list_energy ; 14ec7 (5:1ec7)
+.list_energy
ai_energy MACHOP, 3, +0
ai_energy MACHOKE, 4, +0
ai_energy MACHAMP, 4, -1
@@ -61,12 +61,12 @@ AIActionTable_FirstStrike: ; 14e89 (5:4e89)
ai_energy PRIMEAPE, 3, -1
db $00
-.list_prize ; 14edd (5:1edd)
+.list_prize
db HITMONLEE
db HITMONCHAN
db $00
-.store_list_pointers ; 14ee0 (5:4ee0)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
diff --git a/src/engine/duel/ai/decks/flower_power.asm b/src/engine/duel/ai/decks/flower_power.asm
index 4d423a3..f513c2e 100644
--- a/src/engine/duel/ai/decks/flower_power.asm
+++ b/src/engine/duel/ai/decks/flower_power.asm
@@ -1,4 +1,4 @@
-AIActionTable_FlowerPower: ; 1509b (5:509b)
+AIActionTable_FlowerPower:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_FlowerPower: ; 1509b (5:509b)
dw .ko_switch
dw .take_prize
-.do_turn ; 150a7 (5:50a7)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 150ab (5:50ab)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,38 +19,38 @@ AIActionTable_FlowerPower: ; 1509b (5:509b)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 150bc (5:50bc)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 150c0 (5:50c0)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 150c4 (5:50c4)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 150c8 (5:50c8)
+.list_arena
db ODDISH
db EXEGGCUTE
db BULBASAUR
db $00
-.list_bench ; 150cc (5:50cc)
+.list_bench
db BULBASAUR
db EXEGGCUTE
db ODDISH
db $00
-.list_retreat ; 150cf (5:50cf)
+.list_retreat
ai_retreat GLOOM, -2
ai_retreat VILEPLUME, -2
ai_retreat BULBASAUR, -2
ai_retreat IVYSAUR, -2
db $00
-.list_energy ; 150d9 (5:50d9)
+.list_energy
ai_energy BULBASAUR, 3, +0
ai_energy IVYSAUR, 4, +0
ai_energy VENUSAUR2, 4, +0
@@ -61,11 +61,11 @@ AIActionTable_FlowerPower: ; 1509b (5:509b)
ai_energy EXEGGUTOR, 22, +0
db $00
-.list_prize ; 150f2 (5:50f2)
+.list_prize
db VENUSAUR2
db $00
-.store_list_pointers ; 150f4 (5:50f4)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
diff --git a/src/engine/duel/ai/decks/general.asm b/src/engine/duel/ai/decks/general.asm
index 039e101..eed4cdc 100644
--- a/src/engine/duel/ai/decks/general.asm
+++ b/src/engine/duel/ai/decks/general.asm
@@ -1,5 +1,5 @@
; AI logic used by general decks
-AIActionTable_GeneralDecks: ; 14668 (05:4668)
+AIActionTable_GeneralDecks:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -7,29 +7,29 @@ AIActionTable_GeneralDecks: ; 14668 (05:4668)
dw .ko_switch
dw .take_prize
-.do_turn ; 14674 (5:4674)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 14678 (5:4678)
+.start_duel
call InitAIDuelVars
call AIPlayInitialBasicCards
ret
-.forced_switch ; 1467f (5:467f)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 14683 (5:4683)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize: ; 14687 (5:4687)
+.take_prize:
call AIPickPrizeCards
ret
; handle AI routines for a whole turn
-AIMainTurnLogic: ; 1468b (5:468b)
+AIMainTurnLogic:
; initialize variables
call InitAITurnVars
ld a, AI_TRAINER_CARD_PHASE_01
@@ -147,7 +147,7 @@ AIMainTurnLogic: ; 1468b (5:468b)
ret
; handles AI retreating logic
-AIProcessRetreat: ; 14786 (5:4786)
+AIProcessRetreat:
ld a, [wAIRetreatedThisTurn]
or a
ret nz ; return, already retreated this turn
diff --git a/src/engine/duel/ai/decks/general_no_retreat.asm b/src/engine/duel/ai/decks/general_no_retreat.asm
index 20d84e3..a6e5cb3 100644
--- a/src/engine/duel/ai/decks/general_no_retreat.asm
+++ b/src/engine/duel/ai/decks/general_no_retreat.asm
@@ -1,5 +1,5 @@
; acts just like a general deck AI except never retreats
-AIActionTable_GeneralNoRetreat: ; 148dc (5:48dc)
+AIActionTable_GeneralNoRetreat:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -7,28 +7,28 @@ AIActionTable_GeneralNoRetreat: ; 148dc (5:48dc)
dw .ko_switch
dw .take_prize
-.do_turn ; 148e8 (5:48e8)
+.do_turn
call AIDoTurn_GeneralNoRetreat
ret
-.start_duel ; 148ec (5:48ec)
+.start_duel
call InitAIDuelVars
call AIPlayInitialBasicCards
ret
-.forced_switch ; 148f3 (5:48f3)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 148f7 (5:48f7)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 148fb (5:48fb)
+.take_prize
call AIPickPrizeCards
ret
-AIDoTurn_GeneralNoRetreat: ; 148ff (5:48ff)
+AIDoTurn_GeneralNoRetreat:
; initialize variables
call InitAITurnVars
ld a, AI_TRAINER_CARD_PHASE_01
diff --git a/src/engine/duel/ai/decks/go_go_rain_dance.asm b/src/engine/duel/ai/decks/go_go_rain_dance.asm
index 23547e2..ba0c5c5 100644
--- a/src/engine/duel/ai/decks/go_go_rain_dance.asm
+++ b/src/engine/duel/ai/decks/go_go_rain_dance.asm
@@ -1,4 +1,4 @@
-AIActionTable_GoGoRainDance: ; 14f8f (5:4f8f)
+AIActionTable_GoGoRainDance:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_GoGoRainDance: ; 14f8f (5:4f8f)
dw .ko_switch
dw .take_prize
-.do_turn ; 14f9b (5:4f9b)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 14f9f (5:4f9f)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,39 +19,39 @@ AIActionTable_GoGoRainDance: ; 14f8f (5:4f8f)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 14fb0 (5:4fb0)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 14fb4 (5:4fb4)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 14fb8 (5:4fb8)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 14fbc (5:4fbc)
+.list_arena
db LAPRAS
db HORSEA
db GOLDEEN
db SQUIRTLE
db $00
-.list_bench ; 14fc1 (5:4fc1)
+.list_bench
db SQUIRTLE
db HORSEA
db GOLDEEN
db LAPRAS
db $00
-.list_retreat ; 14fc6 (5:4fc6)
+.list_retreat
ai_retreat SQUIRTLE, -3
ai_retreat WARTORTLE, -2
ai_retreat HORSEA, -1
db $00
-.list_energy ; 14fcd (5:4fcd)
+.list_energy
ai_energy SQUIRTLE, 2, +0
ai_energy WARTORTLE, 3, +0
ai_energy BLASTOISE, 5, +0
@@ -62,14 +62,14 @@ AIActionTable_GoGoRainDance: ; 14f8f (5:4f8f)
ai_energy LAPRAS, 3, +0
db $00
-.list_prize ; 14fe6 (5:4fe6)
+.list_prize
db GAMBLER
db ENERGY_RETRIEVAL
db SUPER_ENERGY_RETRIEVAL
db BLASTOISE
db $00
-.store_list_pointers ; 14feb (5:4feb)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
diff --git a/src/engine/duel/ai/decks/im_ronald.asm b/src/engine/duel/ai/decks/im_ronald.asm
index b002d83..ad55c16 100644
--- a/src/engine/duel/ai/decks/im_ronald.asm
+++ b/src/engine/duel/ai/decks/im_ronald.asm
@@ -1,4 +1,4 @@
-AIActionTable_ImRonald: ; 152bd (5:52bd)
+AIActionTable_ImRonald:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_ImRonald: ; 152bd (5:52bd)
dw .ko_switch
dw .take_prize
-.do_turn ; 152c9 (5:52c9)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 152cd (5:52cd)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_ImRonald: ; 152bd (5:52bd)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 152de (5:52de)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 152e2 (5:52e2)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 152e6 (5:52e6)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 152ea (5:52ea)
+.list_arena
db LAPRAS
db SEEL
db CHARMANDER
@@ -40,7 +40,7 @@ AIActionTable_ImRonald: ; 152bd (5:52bd)
db GROWLITHE
db $00
-.list_bench ; 152f1 (5:52f1)
+.list_bench
db CHARMANDER
db SQUIRTLE
db SEEL
@@ -49,10 +49,10 @@ AIActionTable_ImRonald: ; 152bd (5:52bd)
db LAPRAS
db $00
-.list_retreat ; 152f8 (5:52f8)
+.list_retreat
db $00
-.list_energy ; 152f9 (5:52f9)
+.list_energy
ai_energy CHARMANDER, 3, +0
ai_energy CHARMELEON, 5, +0
ai_energy GROWLITHE, 2, +0
@@ -66,11 +66,11 @@ AIActionTable_ImRonald: ; 152bd (5:52bd)
ai_energy MAROWAK1, 3, +0
db $00
-.list_prize ; 1531b (5:531b)
+.list_prize
db LAPRAS
db $00
-.store_list_pointers ; 1531d (5:531d)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
diff --git a/src/engine/duel/ai/decks/invincible_ronald.asm b/src/engine/duel/ai/decks/invincible_ronald.asm
index 463560b..4095de6 100644
--- a/src/engine/duel/ai/decks/invincible_ronald.asm
+++ b/src/engine/duel/ai/decks/invincible_ronald.asm
@@ -1,4 +1,4 @@
-AIActionTable_InvincibleRonald: ; 153e8 (5:53e8)
+AIActionTable_InvincibleRonald:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_InvincibleRonald: ; 153e8 (5:53e8)
dw .ko_switch
dw .take_prize
-.do_turn ; 153f4 (5:53f4)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 153f8 (5:53f8)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_InvincibleRonald: ; 153e8 (5:53e8)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 15409 (5:5409)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 1540d (5:540d)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 15411 (5:5411)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 15415 (5:5415)
+.list_arena
db KANGASKHAN
db MAGMAR2
db CHANSEY
@@ -40,7 +40,7 @@ AIActionTable_InvincibleRonald: ; 153e8 (5:53e8)
db GRIMER
db $00
-.list_bench ; 1541c (5:541c)
+.list_bench
db GRIMER
db SCYTHER
db GEODUDE
@@ -49,11 +49,11 @@ AIActionTable_InvincibleRonald: ; 153e8 (5:53e8)
db KANGASKHAN
db $00
-.list_retreat ; 15423 (5:5423)
+.list_retreat
ai_retreat GRIMER, -1
db $00
-.list_energy ; 15426 (5:5426)
+.list_energy
ai_energy GRIMER, 1, -1
ai_energy MUK, 3, -1
ai_energy SCYTHER, 4, +1
@@ -64,11 +64,11 @@ AIActionTable_InvincibleRonald: ; 153e8 (5:53e8)
ai_energy KANGASKHAN, 4, -1
db $00
-.list_prize ; 1543f (5:543f)
+.list_prize
db GAMBLER
db $00
-.store_list_pointers ; 15441 (5:5441)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
diff --git a/src/engine/duel/ai/decks/legendary_articuno.asm b/src/engine/duel/ai/decks/legendary_articuno.asm
index 6409330..1070fc3 100644
--- a/src/engine/duel/ai/decks/legendary_articuno.asm
+++ b/src/engine/duel/ai/decks/legendary_articuno.asm
@@ -1,4 +1,4 @@
-AIActionTable_LegendaryArticuno: ; 14c0b (5:4c0b)
+AIActionTable_LegendaryArticuno:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_LegendaryArticuno: ; 14c0b (5:4c0b)
dw .ko_switch
dw .take_prize
-.do_turn ; 14c17 (5:4c17)
+.do_turn
call AIDoTurn_LegendaryArticuno
ret
-.start_duel ; 14c1b (5:4c1b)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_LegendaryArticuno: ; 14c0b (5:4c0b)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 14c2c (5:4c2c)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 14c30 (5:4c30)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 14c34 (5:4c34)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 14c38 (5:4c38)
+.list_arena
db CHANSEY
db LAPRAS
db DITTO
@@ -40,7 +40,7 @@ AIActionTable_LegendaryArticuno: ; 14c0b (5:4c0b)
db ARTICUNO2
db $00
-.list_bench ; 14c3f (5:4c3f)
+.list_bench
db ARTICUNO1
db SEEL
db LAPRAS
@@ -48,12 +48,12 @@ AIActionTable_LegendaryArticuno: ; 14c0b (5:4c0b)
db DITTO
db $00
-.list_retreat ; 14c45 (5:4c45)
+.list_retreat
ai_retreat SEEL, -3
ai_retreat DITTO, -3
db $00
-.list_energy ; 14c4a (5:4c4a)
+.list_energy
ai_energy SEEL, 3, +1
ai_energy DEWGONG, 4, +0
ai_energy LAPRAS, 3, +0
@@ -63,12 +63,12 @@ AIActionTable_LegendaryArticuno: ; 14c0b (5:4c0b)
ai_energy DITTO, 3, +0
db $00
-.list_prize ; 14c60 (5:4c60)
+.list_prize
db GAMBLER
db ARTICUNO2
db $00
-.store_list_pointers ; 14c63 (5:4c63)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
@@ -82,7 +82,7 @@ AIActionTable_LegendaryArticuno: ; 14c0b (5:4c0b)
; first, it makes sure that all Lapras have at least
; 3 energy cards before moving on to Articuno,
; and then to Dewgong and Seel
-ScoreLegendaryArticunoCards: ; 14c91 (5:4c91)
+ScoreLegendaryArticunoCards:
call SwapTurn
call CountPrizes
call SwapTurn
@@ -151,7 +151,7 @@ ScoreLegendaryArticunoCards: ; 14c91 (5:4c91)
call RaiseAIScoreToAllMatchingIDsInBench
ret
-AIDoTurn_LegendaryArticuno: ; 14cf7 (5:4cf7)
+AIDoTurn_LegendaryArticuno:
; initialize variables
call InitAITurnVars
ld a, AI_TRAINER_CARD_PHASE_01
diff --git a/src/engine/duel/ai/decks/legendary_dragonite.asm b/src/engine/duel/ai/decks/legendary_dragonite.asm
index 597f72c..7417287 100644
--- a/src/engine/duel/ai/decks/legendary_dragonite.asm
+++ b/src/engine/duel/ai/decks/legendary_dragonite.asm
@@ -1,4 +1,4 @@
-AIActionTable_LegendaryDragonite: ; 14d60 (05:4d60)
+AIActionTable_LegendaryDragonite:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_LegendaryDragonite: ; 14d60 (05:4d60)
dw .ko_switch
dw .take_prize
-.do_turn ; 14d6c (5:4d6c)
+.do_turn
call AIDoTurn_LegendaryDragonite
ret
-.start_duel ; 14d70 (5:4d70)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_LegendaryDragonite: ; 14d60 (05:4d60)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 14d81 (5:4d81)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 14d85 (5:4d85)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 14d89 (5:4d89)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 14d8d (5:4d8d)
+.list_arena
db KANGASKHAN
db LAPRAS
db CHARMANDER
@@ -39,7 +39,7 @@ AIActionTable_LegendaryDragonite: ; 14d60 (05:4d60)
db MAGIKARP
db $00
-.list_bench ; 14d93 (5:4d93)
+.list_bench
db CHARMANDER
db MAGIKARP
db DRATINI
@@ -47,12 +47,12 @@ AIActionTable_LegendaryDragonite: ; 14d60 (05:4d60)
db KANGASKHAN
db $00
-.list_retreat ; 14d99 (5:4d99)
+.list_retreat
ai_retreat CHARMANDER, -1
ai_retreat MAGIKARP, -5
db $00
-.list_energy ; 14d9e (5:4d9e)
+.list_energy
ai_energy CHARMANDER, 3, +1
ai_energy CHARMELEON, 4, +1
ai_energy CHARIZARD, 5, +0
@@ -65,13 +65,13 @@ AIActionTable_LegendaryDragonite: ; 14d60 (05:4d60)
ai_energy LAPRAS, 3, +0
db $00
-.list_prize ; 14dbd (5:4dbd)
+.list_prize
db GAMBLER
db DRAGONITE1
db KANGASKHAN
db $00
-.store_list_pointers ; 14dc1 (5:4dc1)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
@@ -80,7 +80,7 @@ AIActionTable_LegendaryDragonite: ; 14d60 (05:4d60)
store_list_pointer wAICardListEnergyBonus, .list_energy
ret
-AIDoTurn_LegendaryDragonite: ; 14def (5:4def)
+AIDoTurn_LegendaryDragonite:
; initialize variables
call InitAITurnVars
ld a, AI_TRAINER_CARD_PHASE_01
diff --git a/src/engine/duel/ai/decks/legendary_moltres.asm b/src/engine/duel/ai/decks/legendary_moltres.asm
index c2a3882..6e870c5 100644
--- a/src/engine/duel/ai/decks/legendary_moltres.asm
+++ b/src/engine/duel/ai/decks/legendary_moltres.asm
@@ -1,4 +1,4 @@
-AIActionTable_LegendaryMoltres: ; 149e8 (05:49e8)
+AIActionTable_LegendaryMoltres:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_LegendaryMoltres: ; 149e8 (05:49e8)
dw .ko_switch
dw .take_prize
-.do_turn ; 149f4 (5:49f4)
+.do_turn
call AIDoTurn_LegendaryMoltres
ret
-.start_duel ; 149f8 (5:49f8)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_LegendaryMoltres: ; 149e8 (05:49e8)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 14a09 (5:4a09)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 14a0d (5:4a0d)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 14a11 (5:4a11)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 14a15 (5:4a15)
+.list_arena
db MAGMAR2
db GROWLITHE
db VULPIX
@@ -40,7 +40,7 @@ AIActionTable_LegendaryMoltres: ; 149e8 (05:49e8)
db MOLTRES2
db $00
-.list_bench ; 14a1c (5:4a1c)
+.list_bench
db MOLTRES1
db VULPIX
db GROWLITHE
@@ -48,7 +48,7 @@ AIActionTable_LegendaryMoltres: ; 149e8 (05:49e8)
db MAGMAR1
db $00
-.list_play_hand ; 14a22 (5:4a22)
+.list_play_hand
db MOLTRES2
db MOLTRES1
db VULPIX
@@ -57,12 +57,12 @@ AIActionTable_LegendaryMoltres: ; 149e8 (05:49e8)
db MAGMAR1
db $00
-.list_retreat ; 14a29 (5:4a29)
+.list_retreat
ai_retreat GROWLITHE, -5
ai_retreat VULPIX, -5
db $00
-.list_energy ; 14a2e (5:4a2e)
+.list_energy
ai_energy VULPIX, 3, +0
ai_energy NINETALES2, 3, +1
ai_energy GROWLITHE, 3, +1
@@ -73,12 +73,12 @@ AIActionTable_LegendaryMoltres: ; 149e8 (05:49e8)
ai_energy MOLTRES1, 4, +2
db $00
-.list_prize ; 14a47 (5:4a47)
+.list_prize
db ENERGY_REMOVAL
db MOLTRES2
db $00
-.store_list_pointers ; 14a4a (5:4a4a)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
@@ -87,7 +87,7 @@ AIActionTable_LegendaryMoltres: ; 149e8 (05:49e8)
store_list_pointer wAICardListEnergyBonus, .list_energy
ret
-AIDoTurn_LegendaryMoltres: ; 14a81 (5:4a81)
+AIDoTurn_LegendaryMoltres:
; initialize variables
call InitAITurnVars
farcall HandleAIAntiMewtwoDeckStrategy
diff --git a/src/engine/duel/ai/decks/legendary_ronald.asm b/src/engine/duel/ai/decks/legendary_ronald.asm
index 3356838..1a2c8dd 100644
--- a/src/engine/duel/ai/decks/legendary_ronald.asm
+++ b/src/engine/duel/ai/decks/legendary_ronald.asm
@@ -1,4 +1,4 @@
-AIActionTable_LegendaryRonald: ; 1546f (5:546f)
+AIActionTable_LegendaryRonald:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_LegendaryRonald: ; 1546f (5:546f)
dw .ko_switch
dw .take_prize
-.do_turn ; 1547b (5:547b)
+.do_turn
call AIDoTurn_LegendaryRonald
ret
-.start_duel ; 1547f (5:547f)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_LegendaryRonald: ; 1546f (5:546f)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 15490 (5:5490)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 15494 (5:5494)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 15498 (5:5498)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 1549c (5:549c)
+.list_arena
db KANGASKHAN
db DRATINI
db EEVEE
@@ -40,13 +40,13 @@ AIActionTable_LegendaryRonald: ; 1546f (5:546f)
db MOLTRES2
db $00
-.list_bench ; 154a3 (5:54a3)
+.list_bench
db KANGASKHAN
db DRATINI
db EEVEE
db $00
-.list_play_hand ; 154a7 (5:54a7)
+.list_play_hand
db MOLTRES2
db ZAPDOS3
db KANGASKHAN
@@ -55,11 +55,11 @@ AIActionTable_LegendaryRonald: ; 1546f (5:546f)
db ARTICUNO2
db $00
-.list_retreat ; 154ae (5:54ae)
+.list_retreat
ai_retreat EEVEE, -2
db $00
-.list_energy ; 154b1 (5:54b1)
+.list_energy
ai_energy FLAREON1, 3, +0
ai_energy MOLTRES2, 3, +0
ai_energy VAPOREON1, 3, +0
@@ -73,7 +73,7 @@ AIActionTable_LegendaryRonald: ; 1546f (5:546f)
ai_energy DRAGONITE1, 3, +0
db $00
-.list_prize ; 154d3 (5:54d3)
+.list_prize
db MOLTRES2
db ARTICUNO2
db ZAPDOS3
@@ -81,7 +81,7 @@ AIActionTable_LegendaryRonald: ; 1546f (5:546f)
db GAMBLER
db $00
-.store_list_pointers ; 154d9 (5:54d9)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
@@ -90,7 +90,7 @@ AIActionTable_LegendaryRonald: ; 1546f (5:546f)
store_list_pointer wAICardListEnergyBonus, .list_energy
ret
-AIDoTurn_LegendaryRonald: ; 15507 (5:5507)
+AIDoTurn_LegendaryRonald:
; initialize variables
call InitAITurnVars
; process Trainer cards
diff --git a/src/engine/duel/ai/decks/legendary_zapdos.asm b/src/engine/duel/ai/decks/legendary_zapdos.asm
index cc99f0c..2298fe2 100644
--- a/src/engine/duel/ai/decks/legendary_zapdos.asm
+++ b/src/engine/duel/ai/decks/legendary_zapdos.asm
@@ -1,4 +1,4 @@
-AIActionTable_LegendaryZapdos: ; 14b0f (05:4b0f)
+AIActionTable_LegendaryZapdos:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_LegendaryZapdos: ; 14b0f (05:4b0f)
dw .ko_switch
dw .take_prize
-.do_turn ; 14b1b (5:4b1b)
+.do_turn
call AIDoTurn_LegendaryZapdos
ret
-.start_duel ; 14b1f (5:4b1f)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_LegendaryZapdos: ; 14b0f (05:4b0f)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 14b30 (5:4b30)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 14b34 (5:4b34)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 14b38 (5:4b38)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 14b3c (5:4b3c)
+.list_arena
db ELECTABUZZ2
db VOLTORB
db EEVEE
@@ -40,7 +40,7 @@ AIActionTable_LegendaryZapdos: ; 14b0f (05:4b0f)
db ZAPDOS3
db $00
-.list_bench ; 14b43 (5:4b43)
+.list_bench
db ZAPDOS2
db ZAPDOS1
db EEVEE
@@ -48,13 +48,13 @@ AIActionTable_LegendaryZapdos: ; 14b0f (05:4b0f)
db ELECTABUZZ2
db $00
-.list_retreat ; 14b49 (5:4b49)
+.list_retreat
ai_retreat EEVEE, -5
ai_retreat VOLTORB, -5
ai_retreat ELECTABUZZ2, -5
db $00
-.list_energy ; 14b50 (5:4b50)
+.list_energy
ai_energy VOLTORB, 1, -1
ai_energy ELECTRODE1, 3, +0
ai_energy ELECTABUZZ2, 2, -1
@@ -65,12 +65,12 @@ AIActionTable_LegendaryZapdos: ; 14b0f (05:4b0f)
ai_energy EEVEE, 3, +0
db $00
-.list_prize ; 14b69 (5:4b69)
+.list_prize
db GAMBLER
db ZAPDOS3
db $00
-.store_list_pointers ; 14b6c (5:4b6c)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
@@ -79,7 +79,7 @@ AIActionTable_LegendaryZapdos: ; 14b0f (05:4b0f)
store_list_pointer wAICardListEnergyBonus, .list_energy
ret
-AIDoTurn_LegendaryZapdos: ; 14b9a (5:4b9a)
+AIDoTurn_LegendaryZapdos:
; initialize variables
call InitAITurnVars
farcall HandleAIAntiMewtwoDeckStrategy
diff --git a/src/engine/duel/ai/decks/powerful_ronald.asm b/src/engine/duel/ai/decks/powerful_ronald.asm
index 096fbea..63ce1cd 100644
--- a/src/engine/duel/ai/decks/powerful_ronald.asm
+++ b/src/engine/duel/ai/decks/powerful_ronald.asm
@@ -1,4 +1,4 @@
-AIActionTable_PowerfulRonald: ; 1534b (5:534b)
+AIActionTable_PowerfulRonald:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_PowerfulRonald: ; 1534b (5:534b)
dw .ko_switch
dw .take_prize
-.do_turn ; 15357 (5:5357)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 1535b (5:535b)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_PowerfulRonald: ; 1534b (5:534b)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 1536c (5:536c)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 15370 (5:5370)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 15374 (5:5374)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 15378 (5:5378)
+.list_arena
db KANGASKHAN
db ELECTABUZZ2
db HITMONCHAN
@@ -44,7 +44,7 @@ AIActionTable_PowerfulRonald: ; 1534b (5:534b)
db DODUO
db $00
-.list_bench ; 15383 (5:5383)
+.list_bench
db KANGASKHAN
db HITMONLEE
db HITMONCHAN
@@ -57,13 +57,13 @@ AIActionTable_PowerfulRonald: ; 1534b (5:534b)
db LICKITUNG
db $00
-.list_retreat ; 1538e (5:538e)
+.list_retreat
ai_retreat KANGASKHAN, -1
ai_retreat DODUO, -1
ai_retreat DODRIO, -1
db $00
-.list_energy ; 15395 (5:5395)
+.list_energy
ai_energy ELECTABUZZ2, 2, +1
ai_energy HITMONLEE, 3, +1
ai_energy HITMONCHAN, 3, +1
@@ -77,12 +77,12 @@ AIActionTable_PowerfulRonald: ; 1534b (5:534b)
ai_energy TAUROS, 3, +0
db $00
-.list_prize ; 153b7 (5:53b7)
+.list_prize
db GAMBLER
db ENERGY_REMOVAL
db $00
-.store_list_pointers ; 153ba (5:53ba)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
diff --git a/src/engine/duel/ai/decks/rock_crusher.asm b/src/engine/duel/ai/decks/rock_crusher.asm
index 41a50fa..0fca721 100644
--- a/src/engine/duel/ai/decks/rock_crusher.asm
+++ b/src/engine/duel/ai/decks/rock_crusher.asm
@@ -1,4 +1,4 @@
-AIActionTable_RockCrusher: ; 14f0e (5:4f0e)
+AIActionTable_RockCrusher:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_RockCrusher: ; 14f0e (5:4f0e)
dw .ko_switch
dw .take_prize
-.do_turn ; 14f1a (5:4f1a)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 14f1e (5:4f1e)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,37 +19,37 @@ AIActionTable_RockCrusher: ; 14f0e (5:4f0e)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 14f2f (5:4f2f)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 14f33 (5:4f33)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 14f37 (5:4f37)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 14f3b (5:4f3b)
+.list_arena
db RHYHORN
db ONIX
db GEODUDE
db DIGLETT
db $00
-.list_bench ; 14f40 (5:4f40)
+.list_bench
db DIGLETT
db GEODUDE
db RHYHORN
db ONIX
db $00
-.list_retreat ; 14f45 (5:4f45)
+.list_retreat
ai_retreat DIGLETT, -1
db $00
-.list_energy ; 14f48 (5:4f48)
+.list_energy
ai_energy DIGLETT, 3, +1
ai_energy DUGTRIO, 4, +0
ai_energy GEODUDE, 2, +1
@@ -59,12 +59,12 @@ AIActionTable_RockCrusher: ; 14f0e (5:4f0e)
ai_energy RHYHORN, 3, +0
db $00
-.list_prize ; 14f5e (5:4f5e)
+.list_prize
db ENERGY_REMOVAL
db RHYHORN
db $00
-.store_list_pointers ; 14f61 (5:4f61)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
diff --git a/src/engine/duel/ai/decks/sams_practice.asm b/src/engine/duel/ai/decks/sams_practice.asm
index dddce61..cd12220 100644
--- a/src/engine/duel/ai/decks/sams_practice.asm
+++ b/src/engine/duel/ai/decks/sams_practice.asm
@@ -1,6 +1,6 @@
; AI for Sam's practice duel, which handles his scripted actions.
; will act as a normal duelist AI after turn 7.
-AIActionTable_SamPractice: ; 147bd (05:47bd)
+AIActionTable_SamPractice:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -8,7 +8,7 @@ AIActionTable_SamPractice: ; 147bd (05:47bd)
dw .ko_switch
dw .take_prize
-.do_turn ; 147c9 (5:47c9)
+.do_turn
call IsAIPracticeScriptedTurn
jr nc, .scripted_1
; not scripted, use AI main turn logic
@@ -18,11 +18,11 @@ AIActionTable_SamPractice: ; 147bd (05:47bd)
call AIPerformScriptedTurn
ret
-.start_duel ; 147d6 (5:47d6)
+.start_duel
call SetSamsStartingPlayArea
ret
-.forced_switch ; 147da (5:47da)
+.forced_switch
call IsAIPracticeScriptedTurn
jr nc, .scripted_2
call AIDecideBenchPokemonToSwitchTo
@@ -31,7 +31,7 @@ AIActionTable_SamPractice: ; 147bd (05:47bd)
call PickRandomBenchPokemon
ret
-.ko_switch: ; 147e7 (5:47e7)
+.ko_switch:
call IsAIPracticeScriptedTurn
jr nc, .scripted_3
call AIDecideBenchPokemonToSwitchTo
@@ -40,7 +40,7 @@ AIActionTable_SamPractice: ; 147bd (05:47bd)
call GetPlayAreaLocationOfRaticateOrRattata
ret
-.take_prize: ; 147f4 (5:47f4)
+.take_prize:
call AIPickPrizeCards
ret
@@ -48,7 +48,7 @@ AIActionTable_SamPractice: ; 147bd (05:47bd)
; the AI has taken >= 7.
; used to know whether AI Sam is still
; doing scripted turns.
-IsAIPracticeScriptedTurn: ; 147f8 (5:47f8)
+IsAIPracticeScriptedTurn:
ld a, [wDuelTurns]
srl a
cp 7
@@ -57,7 +57,7 @@ IsAIPracticeScriptedTurn: ; 147f8 (5:47f8)
; places one Machop from the hand to the Play Area
; and sets the number of prizes to 2.
-SetSamsStartingPlayArea: ; 14801 (5:4801)
+SetSamsStartingPlayArea:
call CreateHandCardList
ld hl, wDuelTempList
.loop_hand
@@ -76,7 +76,7 @@ SetSamsStartingPlayArea: ; 14801 (5:4801)
; outputs in a Play Area location of Raticate or Rattata
; in the Bench. If neither is found, just output PLAY_AREA_BENCH_1.
-GetPlayAreaLocationOfRaticateOrRattata: ; 1481f (5:481f)
+GetPlayAreaLocationOfRaticateOrRattata:
ld a, RATICATE
ld b, PLAY_AREA_BENCH_1
call LookForCardIDInPlayArea_Bank5
@@ -93,7 +93,7 @@ GetPlayAreaLocationOfRaticateOrRattata: ; 1481f (5:481f)
ret
; has AI execute some scripted actions depending on Duel turn.
-AIPerformScriptedTurn: ; 1483a (5:483a)
+AIPerformScriptedTurn:
ld a, [wDuelTurns]
srl a
ld hl, .scripted_actions_list
@@ -114,7 +114,7 @@ AIPerformScriptedTurn: ; 1483a (5:483a)
bank1call AIMakeDecision
ret
-.scripted_actions_list ; 1485a (05:485a)
+.scripted_actions_list
dw .turn_1
dw .turn_2
dw .turn_3
@@ -123,13 +123,13 @@ AIPerformScriptedTurn: ; 1483a (5:483a)
dw .turn_6
dw .turn_7
-.turn_1 ; 14868 (5:4868)
+.turn_1
ld d, MACHOP
ld e, FIGHTING_ENERGY
call AIAttachEnergyInHandToCardInPlayArea
ret
-.turn_2 ; 14870 (5:4870)
+.turn_2
ld a, RATTATA
call LookForCardIDInHandList_Bank5
ldh [hTemp_ffa0], a
@@ -140,7 +140,7 @@ AIPerformScriptedTurn: ; 1483a (5:483a)
call AIAttachEnergyInHandToCardInPlayArea
ret
-.turn_3 ; 14884 (5:4884)
+.turn_3
ld a, RATTATA
ld b, PLAY_AREA_ARENA
call LookForCardIDInPlayArea_Bank5
@@ -155,13 +155,13 @@ AIPerformScriptedTurn: ; 1483a (5:483a)
call AIAttachEnergyInHandToCardInPlayArea
ret
-.turn_4 ; 148a1 (5:48a1)
+.turn_4
ld d, RATICATE
ld e, LIGHTNING_ENERGY
call AIAttachEnergyInHandToCardInPlayArea
ret
-.turn_5 ; 148a9 (5:48a9)
+.turn_5
ld a, MACHOP
call LookForCardIDInHandList_Bank5
ldh [hTemp_ffa0], a
@@ -192,13 +192,13 @@ AIPerformScriptedTurn: ; 1483a (5:483a)
call AITryToRetreat
ret
-.turn_6 ; 148cc (5:48cc)
+.turn_6
ld d, MACHOP
ld e, FIGHTING_ENERGY
call AIAttachEnergyInHandToCardInPlayArea
ret
-.turn_7 ; 148d4 (5:48d4)
+.turn_7
ld d, MACHOP
ld e, FIGHTING_ENERGY
call AIAttachEnergyInHandToCardInPlayArea
diff --git a/src/engine/duel/ai/decks/strange_psyshock.asm b/src/engine/duel/ai/decks/strange_psyshock.asm
index ef378b0..b17d9e1 100644
--- a/src/engine/duel/ai/decks/strange_psyshock.asm
+++ b/src/engine/duel/ai/decks/strange_psyshock.asm
@@ -1,4 +1,4 @@
-AIActionTable_StrangePsyshock: ; 15122 (5:5122)
+AIActionTable_StrangePsyshock:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_StrangePsyshock: ; 15122 (5:5122)
dw .ko_switch
dw .take_prize
-.do_turn ; 1512e (5:512e)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 15132 (5:5132)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_StrangePsyshock: ; 15122 (5:5122)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 15143 (5:5143)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 15147 (5:5147)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 1514b (5:514b)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 1514f (5:514f)
+.list_arena
db KANGASKHAN
db CHANSEY
db SNORLAX
@@ -39,7 +39,7 @@ AIActionTable_StrangePsyshock: ; 15122 (5:5122)
db ABRA
db $00
-.list_bench ; 15155 (5:5155)
+.list_bench
db ABRA
db MR_MIME
db KANGASKHAN
@@ -47,14 +47,14 @@ AIActionTable_StrangePsyshock: ; 15122 (5:5122)
db CHANSEY
db $00
-.list_retreat ; 1515b (5:515b)
+.list_retreat
ai_retreat ABRA, -3
ai_retreat SNORLAX, -3
ai_retreat KANGASKHAN, -1
ai_retreat CHANSEY, -1
db $00
-.list_energy ; 15164 (5:5164)
+.list_energy
ai_energy ABRA, 3, +1
ai_energy KADABRA, 3, +0
ai_energy ALAKAZAM, 3, +0
@@ -64,14 +64,14 @@ AIActionTable_StrangePsyshock: ; 15122 (5:5122)
ai_energy SNORLAX, 0, -8
db $00
-.list_prize ; 1517a (5:517a)
+.list_prize
db GAMBLER
db MR_MIME
db ALAKAZAM
db SWITCH
db $00
-.store_list_pointers ; 1517f (5:517f)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
diff --git a/src/engine/duel/ai/decks/unreferenced.asm b/src/engine/duel/ai/decks/unreferenced.asm
index 8722a27..d4d8513 100644
--- a/src/engine/duel/ai/decks/unreferenced.asm
+++ b/src/engine/duel/ai/decks/unreferenced.asm
@@ -1,4 +1,4 @@
-AIActionTable_Unreferenced: ; 1406a (5:406a)
+AIActionTable_Unreferenced: ; unreferenced
dw $406c
dw .do_turn
dw .do_turn
diff --git a/src/engine/duel/ai/decks/wonders_of_science.asm b/src/engine/duel/ai/decks/wonders_of_science.asm
index 706a7e6..adc54ff 100644
--- a/src/engine/duel/ai/decks/wonders_of_science.asm
+++ b/src/engine/duel/ai/decks/wonders_of_science.asm
@@ -1,4 +1,4 @@
-AIActionTable_WondersOfScience: ; 151ad (5:51ad)
+AIActionTable_WondersOfScience:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_WondersOfScience: ; 151ad (5:51ad)
dw .ko_switch
dw .take_prize
-.do_turn ; 151b9 (5:51b9)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 151bd (5:51bd)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_WondersOfScience: ; 151ad (5:51ad)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 151ce (5:51ce)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 151d2 (5:51d2)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 151d6 (5:51d6)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 151da (5:51da)
+.list_arena
db MEWTWO1
db MEWTWO3
db MEWTWO2
@@ -40,7 +40,7 @@ AIActionTable_WondersOfScience: ; 151ad (5:51ad)
db PORYGON
db $00
-.list_bench ; 151e1 (5:51e1)
+.list_bench
db GRIMER
db KOFFING
db MEWTWO3
@@ -49,10 +49,10 @@ AIActionTable_WondersOfScience: ; 151ad (5:51ad)
db PORYGON
db $00
-.list_retreat ; 151e8 (5:51e8)
+.list_retreat
db $00
-.list_energy ; 151e9 (5:51e9)
+.list_energy
ai_energy GRIMER, 3, +0
ai_energy MUK, 4, +0
ai_energy KOFFING, 2, +0
@@ -63,11 +63,11 @@ AIActionTable_WondersOfScience: ; 151ad (5:51ad)
ai_energy PORYGON, 2, -1
db $00
-.list_prize ; 15202 (5:5202)
+.list_prize
db MUK
db $00
-.store_list_pointers ; 15204 (5:5204)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
diff --git a/src/engine/duel/ai/decks/zapping_selfdestruct.asm b/src/engine/duel/ai/decks/zapping_selfdestruct.asm
index da5e7c6..b283395 100644
--- a/src/engine/duel/ai/decks/zapping_selfdestruct.asm
+++ b/src/engine/duel/ai/decks/zapping_selfdestruct.asm
@@ -1,4 +1,4 @@
-AIActionTable_ZappingSelfdestruct: ; 15019 (5:5019)
+AIActionTable_ZappingSelfdestruct:
dw .do_turn ; unused
dw .do_turn
dw .start_duel
@@ -6,11 +6,11 @@ AIActionTable_ZappingSelfdestruct: ; 15019 (5:5019)
dw .ko_switch
dw .take_prize
-.do_turn ; 15025 (5:5025)
+.do_turn
call AIMainTurnLogic
ret
-.start_duel ; 15029 (5:5029)
+.start_duel
call InitAIDuelVars
call .store_list_pointers
call SetUpBossStartingHandAndDeck
@@ -19,19 +19,19 @@ AIActionTable_ZappingSelfdestruct: ; 15019 (5:5019)
call AIPlayInitialBasicCards
ret
-.forced_switch ; 1503a (5:503a)
+.forced_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.ko_switch ; 1503e (5:503e)
+.ko_switch
call AIDecideBenchPokemonToSwitchTo
ret
-.take_prize ; 15042 (5:5042)
+.take_prize
call AIPickPrizeCards
ret
-.list_arena ; 15046 (5:5046)
+.list_arena
db KANGASKHAN
db ELECTABUZZ2
db TAUROS
@@ -39,7 +39,7 @@ AIActionTable_ZappingSelfdestruct: ; 15019 (5:5019)
db VOLTORB
db $00
-.list_bench ; 1504c (5:504c)
+.list_bench
db MAGNEMITE1
db VOLTORB
db ELECTABUZZ2
@@ -47,11 +47,11 @@ AIActionTable_ZappingSelfdestruct: ; 15019 (5:5019)
db KANGASKHAN
db $00
-.list_retreat ; 15052 (5:5052)
+.list_retreat
ai_retreat VOLTORB, -1
db $00
-.list_energy ; 15055 (5:5055)
+.list_energy
ai_energy MAGNEMITE1, 3, +1
ai_energy MAGNETON1, 4, +0
ai_energy VOLTORB, 3, +1
@@ -61,11 +61,11 @@ AIActionTable_ZappingSelfdestruct: ; 15019 (5:5019)
ai_energy TAUROS, 3, +0
db $00
-.list_prize ; 1506b (5:506b)
+.list_prize
db KANGASKHAN
db $00
-.store_list_pointers ; 1506d (5:506d)
+.store_list_pointers
store_list_pointer wAICardListAvoidPrize, .list_prize
store_list_pointer wAICardListArenaPriority, .list_arena
store_list_pointer wAICardListBenchPriority, .list_bench
diff --git a/src/engine/duel/ai/energy.asm b/src/engine/duel/ai/energy.asm
index ce8c037..ff9c369 100644
--- a/src/engine/duel/ai/energy.asm
+++ b/src/engine/duel/ai/energy.asm
@@ -1,7 +1,7 @@
; processes AI energy card playing logic
; with AI_ENERGY_FLAG_DONT_PLAY flag on
; unreferenced
-Func_16488: ; 16488 (5:6488)
+Func_16488:
ld a, AI_ENERGY_FLAG_DONT_PLAY
ld [wAIEnergyAttachLogicFlags], a
ld de, wTempPlayAreaAIScore
diff --git a/src/engine/duel/ai/hand_pokemon.asm b/src/engine/duel/ai/hand_pokemon.asm
index 27a4176..d9728b2 100644
--- a/src/engine/duel/ai/hand_pokemon.asm
+++ b/src/engine/duel/ai/hand_pokemon.asm
@@ -1,6 +1,6 @@
; determine whether AI plays
; basic cards from hand
-AIDecidePlayPokemonCard: ; 15eae (5:5eae)
+AIDecidePlayPokemonCard:
call CreateHandCardList
call SortTempHandByIDList
ld hl, wDuelTempList
@@ -101,7 +101,7 @@ AIDecidePlayPokemonCard: ; 15eae (5:5eae)
; determine whether AI evolves
; Pokémon in the Play Area
-AIDecideEvolution: ; 15f4c (5:5f4c)
+AIDecideEvolution:
call CreateHandCardList
ld hl, wDuelTempList
ld de, wHandTempList
@@ -388,7 +388,7 @@ AIDecideEvolution: ; 15f4c (5:5f4c)
; determine AI score for evolving
; Charmeleon, Magikarp, Dragonair and Grimer
; in certain decks
-AIDecideSpecialEvolutions: ; 16120 (5:6120)
+AIDecideSpecialEvolutions:
; check if deck applies
ld a, [wOpponentDeckID]
cp LEGENDARY_DRAGONITE_DECK_ID
@@ -525,7 +525,7 @@ AIDecideSpecialEvolutions: ; 16120 (5:6120)
; determine AI score for the legendary cards
; Moltres, Zapdos and Articuno
-AIDecidePlayLegendaryBirds: ; 161d5 (5:61d5)
+AIDecidePlayLegendaryBirds:
; check if deck applies
ld a, [wOpponentDeckID]
cp LEGENDARY_ZAPDOS_DECK_ID
diff --git a/src/engine/duel/ai/init.asm b/src/engine/duel/ai/init.asm
index 33132cf..b4a14bd 100644
--- a/src/engine/duel/ai/init.asm
+++ b/src/engine/duel/ai/init.asm
@@ -1,4 +1,4 @@
-InitAIDuelVars: ; 15636 (5:5636)
+InitAIDuelVars:
ld a, wAIDuelVarsEnd - wAIDuelVars
ld hl, wAIDuelVars
call ClearMemory_Bank5
@@ -11,7 +11,7 @@ InitAIDuelVars: ; 15636 (5:5636)
; initializes some variables and sets value of wAIBarrierFlagCounter.
; if Player uses Barrier 3 times in a row, AI checks if Player's deck
; has only Mewtwo1 Pokemon cards (running a Mewtwo1 mill deck).
-InitAITurnVars: ; 15649 (5:5649)
+InitAITurnVars:
; increase Pokedex counter by 1
ld a, [wAIPokedexCounter]
inc a
diff --git a/src/engine/duel/ai/pkmn_powers.asm b/src/engine/duel/ai/pkmn_powers.asm
index 8ae629a..76135f1 100644
--- a/src/engine/duel/ai/pkmn_powers.asm
+++ b/src/engine/duel/ai/pkmn_powers.asm
@@ -6,7 +6,7 @@
; Arena Pokemon for it to be able to use its second attack;
; - AI_ENERGY_TRANS_TO_BENCH: transfers all Grass Energy cards from
; Arena Pokemon to Bench in case Arena card will be KO'd.
-HandleAIEnergyTrans: ; 2219b (8:619b)
+HandleAIEnergyTrans:
ld [wce06], a
; choose to randomly return
@@ -266,7 +266,7 @@ HandleAIEnergyTrans: ; 2219b (8:619b)
; AI logic to determine whether to use Energy Trans Pkmn Power
; to transfer energy cards attached from the Arena Pokemon to
; some card in the Bench.
-AIEnergyTransTransferEnergyToBench: ; 222ca (8:62ca)
+AIEnergyTransTransferEnergyToBench:
xor a ; PLAY_AREA_ARENA
ldh [hTempPlayAreaLocation_ff9d], a
farcall CheckIfDefendingPokemonCanKnockOut
@@ -409,7 +409,7 @@ AIEnergyTransTransferEnergyToBench: ; 222ca (8:62ca)
; - Strange Behavior;
; - Curse.
; returns carry if turn ended.
-HandleAIPkmnPowers: ; 2237f (8:637f)
+HandleAIPkmnPowers:
ld a, MUK
call CountPokemonIDInBothPlayAreas
ccf
@@ -506,7 +506,7 @@ HandleAIPkmnPowers: ; 2237f (8:637f)
; checks whether AI uses Heal on Pokemon in Play Area.
; input:
; c = Play Area location (PLAY_AREA_*) of Vileplume.
-HandleAIHeal: ; 22402 (8:6402)
+HandleAIHeal:
ld a, c
ldh [hTemp_ffa0], a
call .CheckHealTarget
@@ -611,7 +611,7 @@ HandleAIHeal: ; 22402 (8:6402)
; checks whether AI uses Shift.
; input:
; c = Play Area location (PLAY_AREA_*) of Venomoth
-HandleAIShift: ; 22476 (8:6476)
+HandleAIShift:
ld a, c
or a
ret nz ; return if Venomoth is not Arena card
@@ -700,7 +700,7 @@ HandleAIShift: ; 22476 (8:6476)
; checks whether AI uses Peek.
; input:
; c = Play Area location (PLAY_AREA_*) of Mankey.
-HandleAIPeek: ; 224e6 (8:64e6)
+HandleAIPeek:
ld a, c
ldh [hTemp_ffa0], a
ld a, 50
@@ -783,7 +783,7 @@ HandleAIPeek: ; 224e6 (8:64e6)
; checks whether AI uses Strange Behavior.
; input:
; c = Play Area location (PLAY_AREA_*) of Slowbro.
-HandleAIStrangeBehavior: ; 2255d (8:655d)
+HandleAIStrangeBehavior:
ld a, c
or a
ret z ; return if Slowbro is Arena card
@@ -849,7 +849,7 @@ HandleAIStrangeBehavior: ; 2255d (8:655d)
; checks whether AI uses Curse.
; input:
; c = Play Area location (PLAY_AREA_*) of Gengar.
-HandleAICurse: ; 225b5 (8:65b5)
+HandleAICurse:
ld a, c
ldh [hTemp_ffa0], a
@@ -950,7 +950,7 @@ HandleAICurse: ; 225b5 (8:65b5)
ret
; handles AI logic for Cowardice
-HandleAICowardice: ; 2262d (8:662d)
+HandleAICowardice:
ld a, MUK
call CountPokemonIDInBothPlayAreas
ret c ; return if there's Muk in play
@@ -1039,7 +1039,7 @@ HandleAICowardice: ; 2262d (8:662d)
; 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)
+HandleAIDamageSwap:
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
dec a
@@ -1209,7 +1209,7 @@ HandleAIDamageSwap: ; 226a3 (8:66a3)
; handles AI logic for attaching energy cards
; in Go Go Rain Dance deck.
-HandleAIGoGoRainDanceEnergy: ; 22790 (8:6790)
+HandleAIGoGoRainDanceEnergy:
ld a, [wOpponentDeckID]
cp GO_GO_RAIN_DANCE_DECK_ID
ret nz ; return if not Go Go Rain Dance deck
diff --git a/src/engine/duel/ai/retreat.asm b/src/engine/duel/ai/retreat.asm
index 768a48b..b7decbe 100644
--- a/src/engine/duel/ai/retreat.asm
+++ b/src/engine/duel/ai/retreat.asm
@@ -1,6 +1,6 @@
; determine AI score for retreating
; return carry if AI decides to retreat
-AIDecideWhetherToRetreat: ; 158b2 (5:58b2)
+AIDecideWhetherToRetreat:
ld a, [wGotHeadsFromConfusionCheckDuringRetreat]
or a
jp nz, .no_carry
@@ -9,12 +9,13 @@ AIDecideWhetherToRetreat: ; 158b2 (5:58b2)
call LoadDefendingPokemonColorWRAndPrizeCards
ld a, $80 ; initial retreat score
ld [wAIScore], a
- ld a, [wcdb4]
+ ld a, [wAIRetreatScore]
or a
jr z, .check_status
+ ; add wAIRetreatScore * 8 to score
srl a
srl a
- sla a
+ sla a ; *8
call AddToAIScore
.check_status
@@ -436,7 +437,7 @@ AIDecideWhetherToRetreat: ; 158b2 (5:58b2)
; if player's turn and loaded attack is not a Pokémon Power OR
; if opponent's turn and wAITriedAttack == 0
; set wcdda's bit 7 flag
-Func_15b54: ; 15b54 (5:5b54)
+Func_15b54:
xor a
ld [wcdda], a
ld a, [wWhoseTurn]
@@ -463,7 +464,7 @@ Func_15b54: ; 15b54 (5:5b54)
; 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)
+AIDecideBenchPokemonToSwitchTo:
xor a
ldh [hTempPlayAreaLocation_ff9d], a
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
@@ -759,7 +760,7 @@ AIDecideBenchPokemonToSwitchTo: ; 15b72 (5:5b72)
; done
xor a
- ld [wcdb4], a
+ ld [wAIRetreatScore], a
jp FindHighestBenchScore
; handles AI action of retreating Arena Pokémon
@@ -769,7 +770,7 @@ AIDecideBenchPokemonToSwitchTo: ; 15b72 (5:5b72)
; handle its effect to discard itself instead of retreating.
; input:
; - a = Play Area location (PLAY_AREA_*) of card to retreat to.
-AITryToRetreat: ; 15d4f (5:5d4f)
+AITryToRetreat:
push af
ld a, [wAIPlayEnergyCardForRetreat]
or a
diff --git a/src/engine/duel/ai/special_attacks.asm b/src/engine/duel/ai/special_attacks.asm
index 770324e..5491bdc 100644
--- a/src/engine/duel/ai/special_attacks.asm
+++ b/src/engine/duel/ai/special_attacks.asm
@@ -4,7 +4,7 @@
; or a negative score (value below $80).
; input:
; hTempPlayAreaLocation_ff9d = location of card with attack.
-HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
+HandleSpecialAIAttacks:
ldh a, [hTempPlayAreaLocation_ff9d]
add DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
@@ -61,7 +61,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; if any of card ID in a is found in deck,
; return a score of $80 + slots available in bench.
-.CallForFamily: ; 16e3e (5:6e3e)
+.CallForFamily:
ld a, CARD_LOCATION_DECK
call CheckIfAnyCardIDinLocation
jr nc, .zero_score
@@ -77,7 +77,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; if any of NidoranM or NidoranF is found in deck,
; return a score of $80 + slots available in bench.
-.NidoranFCallForFamily: ; 16e55 (5:6e55)
+.NidoranFCallForFamily:
ld e, NIDORANM
ld a, CARD_LOCATION_DECK
call CheckIfAnyCardIDinLocation
@@ -100,7 +100,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; checks for certain card IDs of Fighting color in deck.
; if any of them are found, return a score of
; $80 + slots available in bench.
-.CallForFriend: ; 16e77 (5:6e77)
+.CallForFriend:
ld e, GEODUDE
ld a, CARD_LOCATION_DECK
call CheckIfAnyCardIDinLocation
@@ -131,7 +131,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; if any basic cards are found in deck,
; return a score of $80 + slots available in bench.
-.FriendshipSong: ; 16ead (5:6ead)
+.FriendshipSong:
call CheckIfAnyBasicPokemonInDeck
jr nc, .zero_score
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
@@ -145,7 +145,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
ret
; if AI decides to retreat, return a score of $80 + 10.
-.Teleport: ; 16ec2 (5:6ec2)
+.Teleport:
call AIDecideWhetherToRetreat
jp nc, .zero_score
ld a, $8a
@@ -156,7 +156,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; - second attack is unusable;
; - second attack deals no damage;
; if any are true, returns score of $80 + 5.
-.SwordsDanceAndFocusEnergy: ; 16ecb (5:6ecb)
+.SwordsDanceAndFocusEnergy:
ld a, [wAICannotDamage]
or a
jr nz, .swords_dance_focus_energy_success
@@ -177,7 +177,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; loops through bench looking for a Pokémon
; with that same color.
; if none are found, returns score of $80 + 2.
-.ChainLightning: ; 16eea (5:6eea)
+.ChainLightning:
call SwapTurn
call GetArenaCardColor
call SwapTurn
@@ -199,7 +199,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
ld a, $82
ret
-.DevolutionBeam: ; 16f0f (5:6f0f)
+.DevolutionBeam:
call LookForCardThatIsKnockedOutOnDevolution
jp nc, .zero_score
ld a, $85
@@ -211,7 +211,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; - if that number is >= 2 and this attack is Conversion 2
; then return score of $80 + 2.
; otherwise return score of $80 + 1.
-.Conversion: ; 16f18 (5:6f18)
+.Conversion:
ld a, DUELVARS_ARENA_CARD_STATUS
call GetTurnDuelistVariable
and CNF_SLP_PRZ
@@ -242,7 +242,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; if any Psychic Energy is found in the Discard Pile,
; return a score of $80 + 2.
-.EnergyAbsorption: ; 16f41 (5:6f41)
+.EnergyAbsorption:
ld e, PSYCHIC_ENERGY
ld a, CARD_LOCATION_DISCARD_PILE
call CheckIfAnyCardIDinLocation
@@ -259,7 +259,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; otherwise, if it finds an evolution card in hand that
; can evolve a card in player's deck, encourage.
; if encouraged, returns a score of $80 + 3.
-.MixUp: ; 16f4e (5:6f4e)
+.MixUp:
ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND
call GetNonTurnDuelistVariable
or a
@@ -326,13 +326,13 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
ret
; return score of $80 + 3.
-.BigThunder: ; 16fb8 (5:6fb8)
+.BigThunder:
ld a, $83
ret
; dismiss attack if cards in deck <= 20.
; otherwise return a score of $80 + 0.
-.Fetch: ; 16fbb (5:6fbb)
+.Fetch:
ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
call GetTurnDuelistVariable
cp 41
@@ -343,7 +343,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; dismiss attack if number of own benched cards which would
; be KOd is greater than or equal to the number
; of prize cards left for player.
-.Earthquake: ; 16fc8 (5:6fc8)
+.Earthquake:
ld a, DUELVARS_BENCH
call GetTurnDuelistVariable
@@ -373,7 +373,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; if there's any lightning energy cards in deck,
; return a score of $80 + 3.
-.EnergySpike: ; 16ff2 (5:6ff2)
+.EnergySpike:
ld a, CARD_LOCATION_DECK
ld e, LIGHTNING_ENERGY
call CheckIfAnyCardIDinLocation
@@ -386,7 +386,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; only incentivize attack if player's active card,
; has any energy cards attached, and if so,
; return a score of $80 + 3.
-.HyperBeam: ; 17005 (5:7005)
+.HyperBeam:
call SwapTurn
ld e, PLAY_AREA_ARENA
call CountNumberOfEnergyCardsAttached
@@ -402,7 +402,7 @@ HandleSpecialAIAttacks: ; 16dcd (5:6dcd)
; called when second attack is determined by AI to have
; more AI score than the first attack, so that it checks
; whether the first attack is a better alternative.
-CheckWhetherToSwitchToFirstAttack: ; 17019 (5:7019)
+CheckWhetherToSwitchToFirstAttack:
; this checks whether the first attack is also viable
; (has more than minimum score to be used)
ld a, [wFirstAttackAIScore]
@@ -451,7 +451,7 @@ CheckWhetherToSwitchToFirstAttack: ; 17019 (5:7019)
; returns carry if there are
; any basic Pokémon cards in deck.
-CheckIfAnyBasicPokemonInDeck: ; 17057 (5:7057)
+CheckIfAnyBasicPokemonInDeck:
ld e, 0
.loop
ld a, DUELVARS_CARD_LOCATIONS
diff --git a/src/engine/duel/ai/trainer_cards.asm b/src/engine/duel/ai/trainer_cards.asm
index 4bee001..ce7e69e 100644
--- a/src/engine/duel/ai/trainer_cards.asm
+++ b/src/engine/duel/ai/trainer_cards.asm
@@ -1,6 +1,6 @@
INCLUDE "data/duel/ai_trainer_card_logic.asm"
-_AIProcessHandTrainerCards: ; 200e5 (8:40e5)
+_AIProcessHandTrainerCards:
ld [wAITrainerCardPhase], a
; create hand list in wDuelTempList and wTempHandCardList.
call CreateHandCardList
@@ -150,7 +150,7 @@ _AIProcessHandTrainerCards: ; 200e5 (8:40e5)
jp .loop_hand
; makes AI use Potion card.
-AIPlay_Potion: ; 201b5 (8:41b5)
+AIPlay_Potion:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wAITrainerCardParameter]
@@ -171,7 +171,7 @@ AIPlay_Potion: ; 201b5 (8:41b5)
; next turn after using Potion.
; if it cannot, return carry.
; also take into account whether attack is high recoil.
-AIDecide_Potion1: ; 201d1 (8:41d1)
+AIDecide_Potion1:
farcall AIDecideWhetherToRetreat
jr c, .no_carry
call AICheckIfAttackIsHighRecoil
@@ -213,7 +213,7 @@ AIDecide_Potion1: ; 201d1 (8:41d1)
; output:
; a = card to use Potion on;
; carry set if Potion should be used.
-AIDecide_Potion2: ; 20204 (8:4204)
+AIDecide_Potion2:
xor a
ldh [hTempPlayAreaLocation_ff9d], a
farcall CheckIfDefendingPokemonCanKnockOut
@@ -310,7 +310,7 @@ AIDecide_Potion2: ; 20204 (8:4204)
; return carry if either of the attacks are usable
; and have the BOOST_IF_TAKEN_DAMAGE effect.
-.check_boost_if_taken_damage ; 2027e (8:427e)
+.check_boost_if_taken_damage
push de
xor a ; FIRST_ATTACK_OR_PKMN_POWER
ld [wSelectedAttack], a
@@ -337,7 +337,7 @@ AIDecide_Potion2: ; 20204 (8:4204)
ret
; makes AI use Super Potion card.
-AIPlay_SuperPotion: ; 202a8 (8:42a8)
+AIPlay_SuperPotion:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wAITrainerCardParameter]
@@ -361,7 +361,7 @@ AIPlay_SuperPotion: ; 202a8 (8:42a8)
; active card next turn after using Super Potion.
; if it cannot, return carry.
; also take into account whether attack is high recoil.
-AIDecide_SuperPotion1: ; 202cc (8:42cc)
+AIDecide_SuperPotion1:
farcall AIDecideWhetherToRetreat
jr c, .no_carry
call AICheckIfAttackIsHighRecoil
@@ -401,7 +401,7 @@ AIDecide_SuperPotion1: ; 202cc (8:42cc)
ret
; returns carry if card has energies attached.
-.check_attached_energy ; 20305 (8:4305)
+.check_attached_energy
call GetPlayAreaCardAttachedEnergies
ld a, [wTotalAttachedEnergies]
or a
@@ -413,7 +413,7 @@ AIDecide_SuperPotion1: ; 202cc (8:42cc)
; output:
; a = card to use Super Potion on;
; carry set if Super Potion should be used.
-AIDecide_SuperPotion2: ; 2030f (8:430f)
+AIDecide_SuperPotion2:
xor a
ldh [hTempPlayAreaLocation_ff9d], a
farcall CheckIfDefendingPokemonCanKnockOut
@@ -516,7 +516,7 @@ AIDecide_SuperPotion2: ; 2030f (8:430f)
ret
; returns carry if card has energies attached.
-.check_attached_energy ; 20394 (8:4394)
+.check_attached_energy
call GetPlayAreaCardAttachedEnergies
ld a, [wTotalAttachedEnergies]
or a
@@ -526,7 +526,7 @@ AIDecide_SuperPotion2: ; 2030f (8:430f)
; return carry if either of the attacks are usable
; and have the BOOST_IF_TAKEN_DAMAGE effect.
-.check_boost_if_taken_damage ; 2039e (8:439e)
+.check_boost_if_taken_damage
push de
xor a ; FIRST_ATTACK_OR_PKMN_POWER
ld [wSelectedAttack], a
@@ -554,7 +554,7 @@ AIDecide_SuperPotion2: ; 2030f (8:430f)
; returns carry if discarding energy card renders any attack unusable,
; given that they have enough energy to be used before discarding.
-.check_energy_cost ; 203c8 (8:43c8)
+.check_energy_cost
push de
xor a ; FIRST_ATTACK_OR_PKMN_POWER
ld [wSelectedAttack], a
@@ -586,7 +586,7 @@ AIDecide_SuperPotion2: ; 2030f (8:430f)
scf
ret
-AIPlay_Defender: ; 203f8 (8:43f8)
+AIPlay_Defender:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
xor a
@@ -598,7 +598,7 @@ AIPlay_Defender: ; 203f8 (8:43f8)
; returns carry if using Defender can prevent a KO
; by the defending Pokémon.
; this takes into account both attacks and whether they're useable.
-AIDecide_Defender1: ; 20406 (8:4406)
+AIDecide_Defender1:
xor a ; PLAY_AREA_ARENA
ldh [hTempPlayAreaLocation_ff9d], a
farcall CheckIfAnyAttackKnocksOutDefendingCard
@@ -682,7 +682,7 @@ AIDecide_Defender1: ; 20406 (8:4406)
; return carry if using Defender prevents Pokémon
; from being knocked out by an attack with recoil.
-AIDecide_Defender2: ; 20486 (8:4486)
+AIDecide_Defender2:
ld a, ATTACK_FLAG1_ADDRESS | HIGH_RECOIL_F
call CheckLoadedAttackFlag
jr c, .recoil
@@ -754,7 +754,7 @@ AIDecide_Defender2: ; 20486 (8:4486)
or a
ret
-AIPlay_Pluspower: ; 204e8 (8:44e8)
+AIPlay_Pluspower:
ld a, [wCurrentAIFlags]
or AI_FLAG_USED_PLUSPOWER
ld [wCurrentAIFlags], a
@@ -769,7 +769,7 @@ AIPlay_Pluspower: ; 204e8 (8:44e8)
; returns carry if using a Pluspower can KO defending Pokémon
; if active card cannot KO without the boost.
; outputs in a the attack to use.
-AIDecide_Pluspower1: ; 20501 (8:4501)
+AIDecide_Pluspower1:
; this is mistakenly duplicated
xor a
ldh [hTempPlayAreaLocation_ff9d], a
@@ -842,7 +842,7 @@ AIDecide_Pluspower1: ; 20501 (8:4501)
; return carry if attack is useable and KOs
; defending Pokémon with Pluspower boost.
-.check_ko_with_pluspower ; 20562 (8:4562)
+.check_ko_with_pluspower
farcall CheckIfSelectedAttackIsUnusable
jr c, .unusable
ld a, [wSelectedAttack]
@@ -869,7 +869,7 @@ AIDecide_Pluspower1: ; 20501 (8:4501)
; returns carry if Pluspower boost does
; not exceed 30 damage when facing Mr. Mime.
-.check_mr_mime ; 20589 (8:4589)
+.check_mr_mime
ld a, [wDamage]
add 10 ; add Pluspower boost
cp 30 ; no danger in preventing damage
@@ -891,7 +891,7 @@ AIDecide_Pluspower1: ; 20501 (8:4501)
; can damage Mr. Mime even with Pluspower boost
; and has a minimum damage > 0.
; outputs in a the attack to use.
-AIDecide_Pluspower2: ; 205a5 (8:45a5)
+AIDecide_Pluspower2:
xor a
ldh [hTempPlayAreaLocation_ff9d], a
call .check_can_ko
@@ -908,7 +908,7 @@ AIDecide_Pluspower2: ; 205a5 (8:45a5)
; returns carry if Pluspower boost does
; not exceed 30 damage when facing Mr. Mime.
-.check_mr_mime ; 205bb (8:45bb)
+.check_mr_mime
ld a, [wDamage]
add 10 ; add Pluspower boost
cp 30 ; no danger in preventing damage
@@ -926,7 +926,7 @@ AIDecide_Pluspower2: ; 205a5 (8:45a5)
ret
; return carry if attack is useable but cannot KO.
-.check_can_ko ; 205d7 (8:45d7)
+.check_can_ko
farcall CheckIfSelectedAttackIsUnusable
jr c, .unusable
ld a, [wSelectedAttack]
@@ -947,7 +947,7 @@ AIDecide_Pluspower2: ; 205a5 (8:45a5)
; return carry 7/10 of the time if
; attack is useable and minimum damage > 0.
-.check_random ; 205f6 (8:45f6)
+.check_random
farcall CheckIfSelectedAttackIsUnusable
jr c, .unusable
ld a, [wSelectedAttack]
@@ -960,7 +960,7 @@ AIDecide_Pluspower2: ; 205a5 (8:45a5)
cp 3
ret
-AIPlay_Switch: ; 20612 (8:4612)
+AIPlay_Switch:
ld a, [wCurrentAIFlags]
or AI_FLAG_USED_SWITCH
ld [wCurrentAIFlags], a
@@ -971,13 +971,13 @@ AIPlay_Switch: ; 20612 (8:4612)
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
bank1call AIMakeDecision
xor a
- ld [wcdb4], a
+ ld [wAIRetreatScore], a
ret
; returns carry if the active card has less energy cards
; than the retreat cost and if AI can't play an energy
; card from the hand to fulfill the cost
-AIDecide_Switch: ; 2062e (8:462e)
+AIDecide_Switch:
; check if AI can already play an energy card from hand to retreat
ld a, [wAIPlayEnergyCardForRetreat]
or a
@@ -1023,7 +1023,7 @@ AIDecide_Switch: ; 2062e (8:462e)
ccf
ret
-AIPlay_GustOfWind: ; 20666 (8:4666)
+AIPlay_GustOfWind:
ld a, [wCurrentAIFlags]
or AI_FLAG_USED_GUST_OF_WIND
ld [wCurrentAIFlags], a
@@ -1035,7 +1035,7 @@ AIPlay_GustOfWind: ; 20666 (8:4666)
bank1call AIMakeDecision
ret
-AIDecide_GustOfWind: ; 2067e (8:467e)
+AIDecide_GustOfWind:
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetNonTurnDuelistVariable
dec a
@@ -1187,7 +1187,7 @@ AIDecide_GustOfWind: ; 2067e (8:467e)
; returns carry if any of the player's
; benched cards is weak to color in b
; and has a way to damage it
-.FindBenchCardWithWeakness ; 2074d (8:474d)
+.FindBenchCardWithWeakness
ld a, DUELVARS_BENCH
call GetNonTurnDuelistVariable
ld c, PLAY_AREA_ARENA
@@ -1205,7 +1205,7 @@ AIDecide_GustOfWind: ; 2067e (8:467e)
jr .loop_3
; returns carry if neither attack can deal damage
-.CheckIfNoAttackDealsDamage ; 2076b (8:476b)
+.CheckIfNoAttackDealsDamage
xor a ; FIRST_ATTACK_OR_PKMN_POWER
ld [wSelectedAttack], a
call .CheckIfAttackDealsNoDamage
@@ -1223,7 +1223,7 @@ AIDecide_GustOfWind: ; 2067e (8:467e)
; returns carry if attack is Pokemon Power
; or otherwise doesn't deal any damage
-.CheckIfAttackDealsNoDamage ; 20782 (8:4782)
+.CheckIfAttackDealsNoDamage
ld a, [wSelectedAttack]
ld e, a
ld a, DUELVARS_ARENA_CARD
@@ -1252,7 +1252,7 @@ AIDecide_GustOfWind: ; 2067e (8:467e)
; returns carry if there is a player's bench card that
; the opponent's current active card can KO
-.FindBenchCardToKnockOut ; 207a9 (8:47a9)
+.FindBenchCardToKnockOut
ld a, DUELVARS_BENCH
call GetNonTurnDuelistVariable
ld e, PLAY_AREA_BENCH_1
@@ -1323,7 +1323,7 @@ AIDecide_GustOfWind: ; 2067e (8:467e)
; returns carry if any of arena card's attacks
; KOs player card in location stored in e
-.CheckIfAnyAttackKnocksOut ; 20806 (8:4806)
+.CheckIfAnyAttackKnocksOut
xor a ; FIRST_ATTACK_OR_PKMN_POWER
call .CheckIfAttackKnocksOut
ret c
@@ -1348,7 +1348,7 @@ AIDecide_GustOfWind: ; 2067e (8:467e)
; returns carry if opponent's arena card can damage
; this benched card if it were switched with
; the player's arena card
-.CheckIfCanDamageBenchedCard ; 20821 (8:4821)
+.CheckIfCanDamageBenchedCard
push bc
push de
push hl
@@ -1410,7 +1410,7 @@ AIDecide_GustOfWind: ; 2067e (8:467e)
scf
ret
-AIPlay_Bill: ; 2086d (8:486d)
+AIPlay_Bill:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
@@ -1418,13 +1418,13 @@ AIPlay_Bill: ; 2086d (8:486d)
ret
; return carry if cards in deck > 9
-AIDecide_Bill: ; 20878 (8:4878)
+AIDecide_Bill:
ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
call GetTurnDuelistVariable
cp DECK_SIZE - 9
ret
-AIPlay_EnergyRemoval: ; 20880 (8:4880)
+AIPlay_EnergyRemoval:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wAITrainerCardParameter]
@@ -1436,7 +1436,7 @@ AIPlay_EnergyRemoval: ; 20880 (8:4880)
ret
; picks an energy card in the player's Play Area to remove
-AIDecide_EnergyRemoval: ; 20895 (8:4895)
+AIDecide_EnergyRemoval:
; check if the current active card can KO player's card
; if it's possible to KO, then do not consider the player's
; active card to remove its attached energy
@@ -1539,7 +1539,7 @@ AIDecide_EnergyRemoval: ; 20895 (8:4895)
ret
; returns carry if this card has any energy cards attached
-.CheckIfCardHasEnergyAttached ; 2091a (8:491a)
+.CheckIfCardHasEnergyAttached
call GetPlayAreaCardAttachedEnergies
ld a, [wTotalAttachedEnergies]
or a
@@ -1549,7 +1549,7 @@ AIDecide_EnergyRemoval: ; 20895 (8:4895)
; returns carry if this card does not
; have enough energy for either of its attacks
-.CheckIfNotEnoughEnergyToAttack ; 20924 (8:4924)
+.CheckIfNotEnoughEnergyToAttack
push de
xor a ; FIRST_ATTACK_OR_PKMN_POWER
ld [wSelectedAttack], a
@@ -1589,7 +1589,7 @@ AIDecide_EnergyRemoval: ; 20895 (8:4895)
; stores in wce06 the highest damaging attack
; for the card in play area location in e
; and stores this card's location in wce08
-.FindHighestDamagingAttack ; 2094f (8:494f)
+.FindHighestDamagingAttack
push de
ld a, e
ldh [hTempPlayAreaLocation_ff9d], a
@@ -1637,7 +1637,7 @@ AIDecide_EnergyRemoval: ; 20895 (8:4895)
pop de
ret
-AIPlay_SuperEnergyRemoval: ; 20994 (8:4994)
+AIPlay_SuperEnergyRemoval:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wAITrainerCardParameter]
@@ -1657,7 +1657,7 @@ AIPlay_SuperEnergyRemoval: ; 20994 (8:4994)
ret
; picks two energy cards in the player's Play Area to remove
-AIDecide_SuperEnergyRemoval: ; 209bc (8:49bc)
+AIDecide_SuperEnergyRemoval:
ld e, PLAY_AREA_BENCH_1
.loop_1
; first find an Arena card with a color energy card
@@ -1807,7 +1807,7 @@ AIDecide_SuperEnergyRemoval: ; 209bc (8:49bc)
; returns carry if the number of energy cards attached
; is fewer than 2, or if all energy combined yields
; fewer than 2 energy
-.CheckIfFewerThanTwoEnergyCards ; 20a77 (8:4a77)
+.CheckIfFewerThanTwoEnergyCards
call GetPlayAreaCardAttachedEnergies
ld a, [wTotalAttachedEnergies]
cp 2
@@ -1832,7 +1832,7 @@ AIDecide_SuperEnergyRemoval: ; 209bc (8:49bc)
; returns carry if this card does not
; have enough energy for either of its attacks
-.CheckIfNotEnoughEnergyToAttack ; 20a92 (8:4a92)
+.CheckIfNotEnoughEnergyToAttack
push de
xor a ; FIRST_ATTACK_OR_PKMN_POWER
ld [wSelectedAttack], a
@@ -1875,7 +1875,7 @@ AIDecide_SuperEnergyRemoval: ; 209bc (8:49bc)
; stores in wce06 the highest damaging attack
; for the card in play area location in e
; and stores this card's location in wce08
-.FindHighestDamagingAttack ; 20ac1 (8:4ac1)
+.FindHighestDamagingAttack
push de
ld a, e
ldh [hTempPlayAreaLocation_ff9d], a
@@ -1923,7 +1923,7 @@ AIDecide_SuperEnergyRemoval: ; 209bc (8:49bc)
pop de
ret
-AIPlay_PokemonBreeder: ; 20b06 (8:4b06)
+AIPlay_PokemonBreeder:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wAITrainerCardParameter]
@@ -1934,7 +1934,7 @@ AIPlay_PokemonBreeder: ; 20b06 (8:4b06)
bank1call AIMakeDecision
ret
-AIDecide_PokemonBreeder: ; 20b1b (8:4b1b)
+AIDecide_PokemonBreeder:
call IsPrehistoricPowerActive
jp c, .done
@@ -2197,7 +2197,7 @@ AIDecide_PokemonBreeder: ; 20b1b (8:4b1b)
; number of damage counters in Play Area is under 8;
; - the card that is evolving is Arena card and has under 5
; damage counters or has less than 3 energy cards attached.
-.HandleDragonite1Evolution ; 20c5c (8:4c5c)
+.HandleDragonite1Evolution
push af
push bc
push de
@@ -2277,7 +2277,7 @@ AIDecide_PokemonBreeder: ; 20b1b (8:4b1b)
scf
ret
-AIPlay_ProfessorOak: ; 20cae (8:4cae)
+AIPlay_ProfessorOak:
ld a, [wCurrentAIFlags]
or AI_FLAG_USED_PROFESSOR_OAK | AI_FLAG_MODIFIED_HAND
ld [wCurrentAIFlags], a
@@ -2289,7 +2289,7 @@ AIPlay_ProfessorOak: ; 20cae (8:4cae)
; sets carry if AI determines a score of playing
; Professor Oak is over a certain threshold.
-AIDecide_ProfessorOak: ; 20cc1 (8:4cc1)
+AIDecide_ProfessorOak:
; return if cards in deck <= 6
ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
call GetTurnDuelistVariable
@@ -2459,7 +2459,7 @@ AIDecide_ProfessorOak: ; 20cc1 (8:4cc1)
; can evolve the card in Play Area location in e.
; sets wce08 to $01 if any card is found that can
; evolve regardless of card location.
-.LookForEvolution ; 20d9d (8:4d9d)
+.LookForEvolution
xor a
ld [wce08], a
ld d, 0
@@ -2496,7 +2496,7 @@ AIDecide_ProfessorOak: ; 20cc1 (8:4cc1)
ret
; handles Legendary Articuno Deck AI logic.
-.HandleLegendaryArticunoDeck ; 20dc3 (8:4dc3)
+.HandleLegendaryArticunoDeck
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
cp 3
@@ -2565,7 +2565,7 @@ AIDecide_ProfessorOak: ; 20cc1 (8:4cc1)
; handles Excavation deck AI logic.
; sets score depending on whether there's no
; Mysterious Fossil in play and in hand.
-.HandleExcavationDeck ; 20e11 (8:4e11)
+.HandleExcavationDeck
; return no carry if cards in deck < 15
ld a, [hl]
cp 46
@@ -2586,7 +2586,7 @@ AIDecide_ProfessorOak: ; 20cc1 (8:4cc1)
; handles Wonders of Science AI logic.
; if there's either Grimer or Muk in hand,
; do not play Professor Oak.
-.HandleWondersOfScienceDeck ; 20e2c (8:4e2c)
+.HandleWondersOfScienceDeck
ld a, GRIMER
call LookForCardIDInHandList_Bank8
jr c, .found_grimer_or_muk
@@ -2602,7 +2602,7 @@ AIDecide_ProfessorOak: ; 20cc1 (8:4cc1)
or a
ret
-AIPlay_EnergyRetrieval: ; 20e44 (8:4e44)
+AIPlay_EnergyRetrieval:
ld a, [wCurrentAIFlags]
or AI_FLAG_MODIFIED_HAND
ld [wCurrentAIFlags], a
@@ -2626,7 +2626,7 @@ AIPlay_EnergyRetrieval: ; 20e44 (8:4e44)
; checks whether AI can play Energy Retrieval and
; picks the energy cards from the discard pile,
; and duplicate cards in hand to discard.
-AIDecide_EnergyRetrieval: ; 20e6e (8:4e6e)
+AIDecide_EnergyRetrieval:
; return no carry if no cards in hand
farcall CreateEnergyCardListFromHand
jp nc, .no_carry
@@ -2763,7 +2763,7 @@ AIDecide_EnergyRetrieval: ; 20e6e (8:4e6e)
; and shortens it accordingly
; input:
; hl = pointer to element after the one to remove
-RemoveCardFromList: ; 20f27 (8:4f27)
+RemoveCardFromList:
push de
ld d, h
ld e, l
@@ -2791,7 +2791,7 @@ RemoveCardFromList: ; 20f27 (8:4f27)
; hl = list to look in
; output:
; a = deck index of duplicate card
-FindDuplicateCards: ; 20f38 (8:4f38)
+FindDuplicateCards:
ld a, $ff
ld [wce0f], a
ld [wce0f + 1], a
@@ -2857,7 +2857,7 @@ FindDuplicateCards: ; 20f38 (8:4f38)
or a
ret
-AIPlay_SuperEnergyRetrieval: ; 20f80 (8:4f80)
+AIPlay_SuperEnergyRetrieval:
ld a, [wCurrentAIFlags]
or AI_FLAG_MODIFIED_HAND
ld [wCurrentAIFlags], a
@@ -2888,7 +2888,7 @@ AIPlay_SuperEnergyRetrieval: ; 20f80 (8:4f80)
bank1call AIMakeDecision
ret
-AIDecide_SuperEnergyRetrieval: ; 20fc1 (8:4fc1)
+AIDecide_SuperEnergyRetrieval:
; return no carry if no cards in hand
farcall CreateEnergyCardListFromHand
jp nc, .no_carry
@@ -3075,7 +3075,7 @@ AIDecide_SuperEnergyRetrieval: ; 20fc1 (8:4fc1)
; input:
; a = card deck index to look
; hl = pointer to list of cards
-FindAndRemoveCardFromList: ; 210d5 (8:50d5)
+FindAndRemoveCardFromList:
push hl
ld b, a
.loop_duplicate
@@ -3086,14 +3086,14 @@ FindAndRemoveCardFromList: ; 210d5 (8:50d5)
pop hl
ret
-AIPlay_PokemonCenter: ; 210e0 (8:50e0)
+AIPlay_PokemonCenter:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
bank1call AIMakeDecision
ret
-AIDecide_PokemonCenter: ; 210eb (8:50eb)
+AIDecide_PokemonCenter:
xor a
ldh [hTempPlayAreaLocation_ff9d], a
@@ -3185,7 +3185,7 @@ AIDecide_PokemonCenter: ; 210eb (8:50eb)
or a
ret
-AIPlay_ImposterProfessorOak: ; 21170 (8:5170)
+AIPlay_ImposterProfessorOak:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
@@ -3194,7 +3194,7 @@ AIPlay_ImposterProfessorOak: ; 21170 (8:5170)
; sets carry depending on player's number of cards
; in deck in in hand.
-AIDecide_ImposterProfessorOak: ; 2117b (8:517b)
+AIDecide_ImposterProfessorOak:
ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
call GetNonTurnDuelistVariable
cp DECK_SIZE - 14
@@ -3221,7 +3221,7 @@ AIDecide_ImposterProfessorOak: ; 2117b (8:517b)
scf
ret
-AIPlay_EnergySearch: ; 2119a (8:519a)
+AIPlay_EnergySearch:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wAITrainerCardParameter]
@@ -3231,7 +3231,7 @@ AIPlay_EnergySearch: ; 2119a (8:519a)
ret
; AI checks for playing Energy Search
-AIDecide_EnergySearch: ; 211aa (8:51aa)
+AIDecide_EnergySearch:
farcall CreateEnergyCardListFromHand
jr c, .start
call .CheckForUsefulEnergyCards
@@ -3293,7 +3293,7 @@ AIDecide_EnergySearch: ; 211aa (8:51aa)
; return carry if cards in wDuelTempList are not
; useful to any of the Play Area Pokemon
-.CheckForUsefulEnergyCards ; 211f1 (8:51f1)
+.CheckForUsefulEnergyCards
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
ld d, a
@@ -3344,7 +3344,7 @@ AIDecide_EnergySearch: ; 211aa (8:51aa)
; checks whether there are useful energies
; only for Fire and Lightning type Pokemon cards
; in Play Area. If none found, return carry.
-.CheckUsefulFireOrLightningEnergy ; 2122e (8:522e)
+.CheckUsefulFireOrLightningEnergy
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
ld d, a
@@ -3407,7 +3407,7 @@ AIDecide_EnergySearch: ; 211aa (8:51aa)
; checks whether there are useful energies
; only for Grass type Pokemon cards
; in Play Area. If none found, return carry.
-.CheckUsefulGrassEnergy ; 21273 (8:5273)
+.CheckUsefulGrassEnergy
; unreferenced
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
@@ -3464,7 +3464,7 @@ AIDecide_EnergySearch: ; 211aa (8:51aa)
scf
ret
-AIPlay_Pokedex: ; 212b4 (8:52b4)
+AIPlay_Pokedex:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wce1a]
@@ -3483,7 +3483,7 @@ AIPlay_Pokedex: ; 212b4 (8:52b4)
bank1call AIMakeDecision
ret
-AIDecide_Pokedex: ; 212dc (8:52dc)
+AIDecide_Pokedex:
ld a, [wAIPokedexCounter]
cp 5 + 1
jr c, .no_carry ; return if counter hasn't reached 6 yet
@@ -3515,7 +3515,7 @@ AIDecide_Pokedex: ; 212dc (8:52dc)
; picks order of the cards in deck from the effects of Pokedex.
; prioritizes Pokemon cards, then Trainer cards, then energy cards.
; stores the resulting order in wce1a.
-PickPokedexCards_Unreferenced: ; 212ff (8:52ff)
+PickPokedexCards_Unreferenced:
; unreferenced
xor a
ld [wAIPokedexCounter], a ; reset counter
@@ -3634,7 +3634,7 @@ PickPokedexCards_Unreferenced: ; 212ff (8:52ff)
scf
ret
-.GetCardType ; 21383 (8:5383)
+.GetCardType
push bc
push de
call GetCardIDFromDeckIndex
@@ -3646,7 +3646,7 @@ PickPokedexCards_Unreferenced: ; 212ff (8:52ff)
; picks order of the cards in deck from the effects of Pokedex.
; prioritizes energy cards, then Pokemon cards, then Trainer cards.
; stores the resulting order in wce1a.
-PickPokedexCards: ; 2138e (8:538e)
+PickPokedexCards:
xor a
ld [wAIPokedexCounter], a ; reset counter ; reset counter
@@ -3764,7 +3764,7 @@ PickPokedexCards: ; 2138e (8:538e)
scf
ret
-.GetCardType ; 21412 (8:5412)
+.GetCardType
push bc
push de
call GetCardIDFromDeckIndex
@@ -3773,14 +3773,14 @@ PickPokedexCards: ; 2138e (8:538e)
pop bc
ret
-AIPlay_FullHeal: ; 2141d (8:541d)
+AIPlay_FullHeal:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
bank1call AIMakeDecision
ret
-AIDecide_FullHeal: ; 21428 (8:5428)
+AIDecide_FullHeal:
ld a, DUELVARS_ARENA_CARD_STATUS
call GetTurnDuelistVariable
@@ -3866,7 +3866,7 @@ AIDecide_FullHeal: ; 21428 (8:5428)
; if not, return no carry.
jr .no_carry
-AIPlay_MrFuji: ; 21497 (8:5497)
+AIPlay_MrFuji:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wAITrainerCardParameter]
@@ -3876,7 +3876,7 @@ AIPlay_MrFuji: ; 21497 (8:5497)
ret
; AI logic for playing Mr Fuji
-AIDecide_MrFuji: ; 214a7 (8:54a7)
+AIDecide_MrFuji:
ld a, $ff
ld [wce06], a
ld [wce08], a
@@ -3938,7 +3938,7 @@ AIDecide_MrFuji: ; 214a7 (8:54a7)
scf
ret
-AIPlay_ScoopUp: ; 214f1 (8:54f1)
+AIPlay_ScoopUp:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wAITrainerCardParameter]
@@ -3949,7 +3949,7 @@ AIPlay_ScoopUp: ; 214f1 (8:54f1)
bank1call AIMakeDecision
ret
-AIDecide_ScoopUp: ; 21506 (8:5506)
+AIDecide_ScoopUp:
xor a
ldh [hTempPlayAreaLocation_ff9d], a
@@ -4124,7 +4124,7 @@ AIDecide_ScoopUp: ; 21506 (8:5506)
; this deck will use Scoop Up on a benched Articuno2, Zapdos3 or Moltres2.
; interestingly, does not check for Muk in both Play Areas.
-.HandleLegendaryRonald ; 215e7 (8:55e7)
+.HandleLegendaryRonald
; if less than 3 Play Area Pokemon cards, skip.
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
@@ -4145,7 +4145,7 @@ AIDecide_ScoopUp: ; 21506 (8:5506)
jr c, .check_attached_energy
jp .no_carry
-AIPlay_Maintenance: ; 2160f (8:560f)
+AIPlay_Maintenance:
ld a, [wCurrentAIFlags]
or AI_FLAG_MODIFIED_HAND
ld [wCurrentAIFlags], a
@@ -4160,7 +4160,7 @@ AIPlay_Maintenance: ; 2160f (8:560f)
ret
; AI logic for playing Maintenance
-AIDecide_Maintenance: ; 2162c (8:562c)
+AIDecide_Maintenance:
; Imakuni? has his own thing
ld a, [wOpponentDeckID]
cp IMAKUNI_DECK_ID
@@ -4242,7 +4242,7 @@ AIDecide_Maintenance: ; 2162c (8:562c)
scf
ret
-AIPlay_Recycle: ; 2169a (8:569a)
+AIPlay_Recycle:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ldtx de, TrainerCardSuccessCheckText
@@ -4263,7 +4263,7 @@ AIPlay_Recycle: ; 2169a (8:569a)
; has priorities for Ghost Deck, and a "default" priority list
; (which is the Fire Charge deck, since it's the only other
; deck that runs a Recycle card in it.)
-AIDecide_Recycle: ; 216b8 (8:56b8)
+AIDecide_Recycle:
; no use checking if no cards in Discard Pile
call CreateDiscardPileCardList
jr c, .no_carry
@@ -4381,7 +4381,7 @@ AIDecide_Recycle: ; 216b8 (8:56b8)
ld [wce08 + 4], a
jr .loop_2
-AIPlay_Lass: ; 21755 (8:5755)
+AIPlay_Lass:
ld a, [wCurrentAIFlags]
or AI_FLAG_MODIFIED_HAND
ld [wCurrentAIFlags], a
@@ -4391,7 +4391,7 @@ AIPlay_Lass: ; 21755 (8:5755)
bank1call AIMakeDecision
ret
-AIDecide_Lass: ; 21768 (8:5768)
+AIDecide_Lass:
; skip if player has less than 7 cards in hand
ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND
call GetNonTurnDuelistVariable
@@ -4421,7 +4421,7 @@ AIDecide_Lass: ; 21768 (8:5768)
scf
ret
-AIPlay_ItemFinder: ; 2178f (8:578f)
+AIPlay_ItemFinder:
ld a, [wCurrentAIFlags]
or AI_FLAG_MODIFIED_HAND
ld [wCurrentAIFlags], a
@@ -4441,7 +4441,7 @@ AIPlay_ItemFinder: ; 2178f (8:578f)
; if so, find duplicate cards in hand to discard
; that are not Mr Mime and Pokemon Trader cards.
; this logic is suitable only for Strange Psyshock deck.
-AIDecide_ItemFinder: ; 217b1 (8:57b1)
+AIDecide_ItemFinder:
; skip if no Discard Pile.
call CreateDiscardPileCardList
jr c, .no_carry
@@ -4512,7 +4512,7 @@ AIDecide_ItemFinder: ; 217b1 (8:57b1)
or a
ret
-AIPlay_Imakuni: ; 21813 (8:5813)
+AIPlay_Imakuni:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
@@ -4520,7 +4520,7 @@ AIPlay_Imakuni: ; 21813 (8:5813)
ret
; only sets carry if Active card is not confused.
-AIDecide_Imakuni: ; 2181e (8:581e)
+AIDecide_Imakuni:
ld a, DUELVARS_ARENA_CARD_STATUS
call GetTurnDuelistVariable
and CNF_SLP_PRZ
@@ -4532,7 +4532,7 @@ AIDecide_Imakuni: ; 2181e (8:581e)
or a
ret
-AIPlay_Gambler: ; 2182d (8:582d)
+AIPlay_Gambler:
ld a, [wCurrentAIFlags]
or AI_FLAG_MODIFIED_HAND
ld [wCurrentAIFlags], a
@@ -4572,7 +4572,7 @@ AIPlay_Gambler: ; 2182d (8:582d)
; checks whether to play Gambler.
; aside from Imakuni?, all other opponents only
; play this card if Player is running Mewtwo1-only deck.
-AIDecide_Gambler: ; 21875 (8:5875)
+AIDecide_Gambler:
; Imakuni? has his own routine
ld a, [wOpponentDeckID]
cp IMAKUNI_DECK_ID
@@ -4604,7 +4604,7 @@ AIDecide_Gambler: ; 21875 (8:5875)
scf
ret
-AIPlay_Revive: ; 21899 (8:5899)
+AIPlay_Revive:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wAITrainerCardParameter]
@@ -4615,7 +4615,7 @@ AIPlay_Revive: ; 21899 (8:5899)
; checks certain cards in Discard Pile to use Revive on.
; suitable for Muscle For Brains deck only.
-AIDecide_Revive: ; 218a9 (8:58a9)
+AIDecide_Revive:
; skip if no cards in Discard Pile
call CreateDiscardPileCardList
jr c, .no_carry
@@ -4660,7 +4660,7 @@ AIDecide_Revive: ; 218a9 (8:58a9)
or a
ret
-AIPlay_PokemonFlute: ; 218d8 (8:58d8)
+AIPlay_PokemonFlute:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wAITrainerCardParameter]
@@ -4669,7 +4669,7 @@ AIPlay_PokemonFlute: ; 218d8 (8:58d8)
bank1call AIMakeDecision
ret
-AIDecide_PokemonFlute: ; 218e8 (8:58e8)
+AIDecide_PokemonFlute:
; if player has no Discard Pile, skip.
call SwapTurn
call CreateDiscardPileCardList
@@ -4765,7 +4765,7 @@ AIDecide_PokemonFlute: ; 218e8 (8:58e8)
scf
ret
-AIPlay_ClefairyDollOrMysteriousFossil: ; 21977 (8:5977)
+AIPlay_ClefairyDollOrMysteriousFossil:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
@@ -4773,7 +4773,7 @@ AIPlay_ClefairyDollOrMysteriousFossil: ; 21977 (8:5977)
ret
; AI logic for playing Clefairy Doll
-AIDecide_ClefairyDollOrMysteriousFossil: ; 21982 (8:5982)
+AIDecide_ClefairyDollOrMysteriousFossil:
; if has max number of Play Area Pokemon, skip
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
@@ -4803,7 +4803,7 @@ AIDecide_ClefairyDollOrMysteriousFossil: ; 21982 (8:5982)
or a
ret
-AIPlay_Pokeball: ; 219a6 (8:59a6)
+AIPlay_Pokeball:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ldtx de, TrainerCardSuccessCheckText
@@ -4821,7 +4821,7 @@ AIPlay_Pokeball: ; 219a6 (8:59a6)
bank1call AIMakeDecision
ret
-AIDecide_Pokeball: ; 219c6 (8:59c6)
+AIDecide_Pokeball:
; go to the routines associated with deck ID
ld a, [wOpponentDeckID]
cp FIRE_CHARGE_DECK_ID
@@ -5022,7 +5022,7 @@ AIDecide_Pokeball: ; 219c6 (8:59c6)
ret c
ret
-AIPlay_ComputerSearch: ; 21b12 (8:5b12)
+AIPlay_ComputerSearch:
ld a, [wCurrentAIFlags]
or AI_FLAG_MODIFIED_HAND
ld [wCurrentAIFlags], a
@@ -5040,7 +5040,7 @@ AIPlay_ComputerSearch: ; 21b12 (8:5b12)
; checks what Deck ID AI is playing and handle
; them in their own routine.
-AIDecide_ComputerSearch: ; 21b34 (8:5b34)
+AIDecide_ComputerSearch:
; skip if number of cards in hand < 3
ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND
call GetTurnDuelistVariable
@@ -5061,7 +5061,7 @@ AIDecide_ComputerSearch: ; 21b34 (8:5b34)
or a
ret
-AIDecide_ComputerSearch_RockCrusher: ; 21b55 (8:5b55)
+AIDecide_ComputerSearch_RockCrusher:
; if number of cards in hand is equal to 3,
; target Professor Oak in deck
ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND
@@ -5239,7 +5239,7 @@ AIDecide_ComputerSearch_RockCrusher: ; 21b55 (8:5b55)
scf
ret
-AIDecide_ComputerSearch_WondersOfScience: ; 21c56 (8:5c56)
+AIDecide_ComputerSearch_WondersOfScience:
; if number of cards in hand < 5, target Professor Oak in deck
ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND
call GetTurnDuelistVariable
@@ -5312,7 +5312,7 @@ AIDecide_ComputerSearch_WondersOfScience: ; 21c56 (8:5c56)
scf
ret
-AIDecide_ComputerSearch_FireCharge: ; 21cbb (8:5cbb)
+AIDecide_ComputerSearch_FireCharge:
; pick target card in deck from highest to lowest priority.
; if not found in hand, go to corresponding branch.
ld a, CHANSEY
@@ -5377,7 +5377,7 @@ AIDecide_ComputerSearch_FireCharge: ; 21cbb (8:5cbb)
scf
ret
-AIDecide_ComputerSearch_Anger: ; 21d1e (8:5d1e)
+AIDecide_ComputerSearch_Anger:
; for each of the following cards,
; first run a check if there's a pre-evolution in
; Play Area or in the hand. If there is, choose it as target.
@@ -5437,7 +5437,7 @@ AIDecide_ComputerSearch_Anger: ; 21d1e (8:5d1e)
scf
ret
-AIPlay_PokemonTrader: ; 21d7a (8:5d7a)
+AIPlay_PokemonTrader:
ld a, [wAITrainerCardToPlay]
ldh [hTempCardIndex_ff9f], a
ld a, [wAITrainerCardParameter]
@@ -5448,7 +5448,7 @@ AIPlay_PokemonTrader: ; 21d7a (8:5d7a)
bank1call AIMakeDecision
ret
-AIDecide_PokemonTrader: ; 21d8f (8:5d8f)
+AIDecide_PokemonTrader:
; each deck has their own routine for picking
; what Pokemon to look for.
ld a, [wOpponentDeckID]
@@ -5475,7 +5475,7 @@ AIDecide_PokemonTrader: ; 21d8f (8:5d8f)
or a
ret
-AIDecide_PokemonTrader_LegendaryMoltres: ; 21dc4 (8:5dc4)
+AIDecide_PokemonTrader_LegendaryMoltres:
; look for Moltres2 card in deck to trade with a
; card in hand different from Moltres1.
ld a, MOLTRES2
@@ -5491,7 +5491,7 @@ AIDecide_PokemonTrader_LegendaryMoltres: ; 21dc4 (8:5dc4)
or a
ret
-AIDecide_PokemonTrader_LegendaryArticuno: ; 21dd5 (8:5dd5)
+AIDecide_PokemonTrader_LegendaryArticuno:
; if has none of these cards in Hand or Play Area, proceed
ld a, ARTICUNO1
call LookForCardIDInHandAndPlayArea
@@ -5546,7 +5546,7 @@ AIDecide_PokemonTrader_LegendaryArticuno: ; 21dd5 (8:5dd5)
scf
ret
-AIDecide_PokemonTrader_LegendaryDragonite: ; 21e24 (8:5e24)
+AIDecide_PokemonTrader_LegendaryDragonite:
; if has less than 5 cards of energy
; and of Pokemon in hand/Play Area,
; target a Kangaskhan in deck.
@@ -5643,7 +5643,7 @@ AIDecide_PokemonTrader_LegendaryDragonite: ; 21e24 (8:5e24)
scf
ret
-AIDecide_PokemonTrader_LegendaryRonald: ; 21ec9 (8:5ec9)
+AIDecide_PokemonTrader_LegendaryRonald:
; for each of the following cards,
; first run a check if there's a pre-evolution in
; Play Area or in the hand. If there is, choose it as target.
@@ -5713,7 +5713,7 @@ AIDecide_PokemonTrader_LegendaryRonald: ; 21ec9 (8:5ec9)
scf
ret
-AIDecide_PokemonTrader_BlisteringPokemon: ; 21f41 (8:5f41)
+AIDecide_PokemonTrader_BlisteringPokemon:
; for each of the following cards,
; first run a check if there's a pre-evolution in
; Play Area or in the hand. If there is, choose it as target.
@@ -5758,7 +5758,7 @@ AIDecide_PokemonTrader_BlisteringPokemon: ; 21f41 (8:5f41)
scf
ret
-AIDecide_PokemonTrader_SoundOfTheWaves: ; 21f85 (8:5f85)
+AIDecide_PokemonTrader_SoundOfTheWaves:
; for each of the following cards,
; first run a check if there's a pre-evolution in
; Play Area or in the hand. If there is, choose it as target.
@@ -5834,7 +5834,7 @@ AIDecide_PokemonTrader_SoundOfTheWaves: ; 21f85 (8:5f85)
scf
ret
-AIDecide_PokemonTrader_PowerGenerator: ; 2200b (8:600b)
+AIDecide_PokemonTrader_PowerGenerator:
; for each of the following cards,
; first run a check if there's a pre-evolution in
; Play Area or in the hand. If there is, choose it as target.
@@ -5925,7 +5925,7 @@ AIDecide_PokemonTrader_PowerGenerator: ; 2200b (8:600b)
scf
ret
-AIDecide_PokemonTrader_FlowerGarden: ; 220a8 (8:60a8)
+AIDecide_PokemonTrader_FlowerGarden:
; for each of the following cards,
; first run a check if there's a pre-evolution in
; Play Area or in the hand. If there is, choose it as target.
@@ -5994,7 +5994,7 @@ AIDecide_PokemonTrader_FlowerGarden: ; 220a8 (8:60a8)
scf
ret
-AIDecide_PokemonTrader_StrangePower: ; 22122 (8:6122)
+AIDecide_PokemonTrader_StrangePower:
; looks for a Pokemon in hand to trade with Mr Mime in deck.
; inputting Mr Mime in register e for the function is redundant
; since it already checks whether a Mr Mime exists in the hand.
@@ -6011,7 +6011,7 @@ AIDecide_PokemonTrader_StrangePower: ; 22122 (8:6122)
or a
ret
-AIDecide_PokemonTrader_Flamethrower: ; 22133 (8:6133)
+AIDecide_PokemonTrader_Flamethrower:
; for each of the following cards,
; first run a check if there's a pre-evolution in
; Play Area or in the hand. If there is, choose it as target.
diff --git a/src/wram.asm b/src/wram.asm
index 157bf0f..6c561b7 100644
--- a/src/wram.asm
+++ b/src/wram.asm
@@ -1394,7 +1394,9 @@ wAICardListRetreatBonus:: ; cdb0
wAICardListEnergyBonus:: ; cdb2
ds $2
-wcdb4:: ; cdb4
+; used by the AI to track how viable
+; retreating the current Active card is
+wAIRetreatScore:: ; cdb4
ds $1
wAIDuelVarsEnd::
@@ -1553,9 +1555,9 @@ wcdf9:: ; cdf9
wcdfa:: ; cdfa
ds MAX_PLAY_AREA_POKEMON
-wce00:: ; ce00
+wAIFirstAttackDamage:: ; ce00
ds $1
-wce01:: ; ce01
+wAISecondAttackDamage:: ; ce01
ds $1
; whether AI's attack is damaging or not
@@ -1584,12 +1586,18 @@ wAINumberOfEnergyTransCards:: ; ce06
; used for storing weakness of Player's Arena card
; in AI routine dealing with Shift Pkmn Power.
wAIDefendingPokemonWeakness:: ; ce06
+; number of Basic Pokemon cards when
+; setting up AI Boss deck
+wAISetupBasicPokemonCount:: ; ce06
ds $1
wce07:: ; ce07
ds $1
wce08:: ; ce08
+; number of Energy cards when
+; setting up AI Boss deck
+wAISetupEnergyCount:: ; ce06
ds $7
wce0f:: ; ce0f