summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorElectroDeoxys <ElectroDeoxys@gmail.com>2020-05-07 15:42:13 +0100
committerElectroDeoxys <ElectroDeoxys@gmail.com>2020-05-07 15:42:13 +0100
commitc4183f69cd8cb0fe1482cac8487efaf68160a411 (patch)
tree645a667d66a8f9f9227bbf35567528b0215d0bd8 /src
parent17b8a2fdc29ff221b18533f06966b02ad0883fb2 (diff)
Deck AI macros and tidying
Diffstat (limited to 'src')
-rw-r--r--src/constants/duel_constants.asm17
-rw-r--r--src/data/deck_ai_pointers.asm106
-rw-r--r--src/engine/bank05.asm238
-rw-r--r--src/engine/bank08.asm15
-rw-r--r--src/engine/deck_ai.asm1956
-rw-r--r--src/wram.asm9
6 files changed, 1028 insertions, 1313 deletions
diff --git a/src/constants/duel_constants.asm b/src/constants/duel_constants.asm
index 47ca1ad..dd692d0 100644
--- a/src/constants/duel_constants.asm
+++ b/src/constants/duel_constants.asm
@@ -246,7 +246,11 @@ AI_ENERGY_FLAG_SKIP_ARENA_CARD EQU 1 << 7 ; whether to include Arena card in det
; used to determine which Trainer cards for AI
; to process in AIProcessHandTrainerCards.
-; aside from a few exceptions, these go in chronological order.
+; these go in chronological order, except for
+; AI_TRAINER_CARD_PHASE_14 which happens just before AI attacks.
+; AI_TRAINER_CARD_PHASE_15 is reserved for Professor Oak card.
+; if Professor Oak is played, all other Trainer card phases
+; are processed again except AI_TRAINER_CARD_PHASE_15.
const_def 1
const AI_TRAINER_CARD_PHASE_01 ; $1
const AI_TRAINER_CARD_PHASE_02 ; $2
@@ -261,10 +265,17 @@ AI_ENERGY_FLAG_SKIP_ARENA_CARD EQU 1 << 7 ; whether to include Arena card in det
const AI_TRAINER_CARD_PHASE_11 ; $b
const AI_TRAINER_CARD_PHASE_12 ; $c
const AI_TRAINER_CARD_PHASE_13 ; $d
- const AI_TRAINER_CARD_PHASE_14 ; $e
- const AI_TRAINER_CARD_PHASE_15 ; $f
+ const AI_TRAINER_CARD_PHASE_14 ; $e, just before attack
+ const AI_TRAINER_CARD_PHASE_15 ; $f, for Professor Oak
; used by wAIBarrierFlagCounter to determine
; whether Player is running Mewtwo1 mill deck.
; flag set means true, flag not set means false.
AI_FLAG_MEWTWO_MILL EQU 1 << 7
+
+; defines the behaviour of HandleAIEnergyTrans, for determining
+; whether to move energy cards from the Bench to the Arena or vice-versa
+; and the number of energy cards needed for achieving that.
+AI_ENERGY_TRANS_RETREAT EQU $9 ; moves energy cards needed for Retreat Cost
+AI_ENERGY_TRANS_ATTACK EQU $d ; moves energy cards needed for second attack
+AI_ENERGY_TRANS_TO_BENCH EQU $e ; moves energy cards away from Arena card
diff --git a/src/data/deck_ai_pointers.asm b/src/data/deck_ai_pointers.asm
index 13f148b..72cbfb0 100644
--- a/src/data/deck_ai_pointers.asm
+++ b/src/data/deck_ai_pointers.asm
@@ -1,55 +1,55 @@
PointerTable_14000: ; 14000 (05:4000)
- dw PointerTable_147bd ; SAMS_PRACTICE_DECK
- dw PointerTable_14668 ; PRACTICE_PLAYER_DECK
- dw PointerTable_14668 ; SAMS_NORMAL_DECK
- dw PointerTable_14668 ; CHARMANDER_AND_FRIENDS_DECK
- dw PointerTable_14668 ; CHARMANDER_EXTRA_DECK
- dw PointerTable_14668 ; SQUIRTLE_AND_FRIENDS_DECK
- dw PointerTable_14668 ; SQUIRTLE_EXTRA_DECK
- dw PointerTable_14668 ; BULBASAUR_AND_FRIENDS_DECK
- dw PointerTable_14668 ; BULBASAUR_EXTRA_DECK
- dw PointerTable_14668 ; LIGHTNING_AND_FIRE_DECK
- dw PointerTable_14668 ; WATER_AND_FIGHTING_DECK
- dw PointerTable_14668 ; GRASS_AND_PSYCHIC_DECK
- dw PointerTable_149e8 ; LEGENDARY_MOLTRES_DECK
- dw PointerTable_14b0f ; LEGENDARY_ZAPDOS_DECK
- dw PointerTable_14c0b ; LEGENDARY_ARTICUNO_DECK
- dw PointerTable_14d60 ; LEGENDARY_DRAGONITE_DECK
- dw PointerTable_14e89 ; FIRST_STRIKE_DECK
- dw PointerTable_14f0e ; ROCK_CRUSHER_DECK
- dw PointerTable_14f8f ; GO_GO_RAIN_DANCE_DECK
- dw PointerTable_15019 ; ZAPPING_SELFDESTRUCT_DECK
- dw PointerTable_1509b ; FLOWER_POWER_DECK
- dw PointerTable_15122 ; STRANGE_PSYSHOCK_DECK
- dw PointerTable_151ad ; WONDERS_OF_SCIENCE_DECK
- dw PointerTable_15232 ; FIRE_CHARGE_DECK
- dw PointerTable_152bd ; IM_RONALD_DECK
- dw PointerTable_1534b ; POWERFUL_RONALD_DECK
- dw PointerTable_153e8 ; INVINCIBLE_RONALD_DECK
- dw PointerTable_1546f ; LEGENDARY_RONALD_DECK
- dw PointerTable_148dc ; MUSCLES_FOR_BRAINS_DECK
- dw PointerTable_14668 ; HEATED_BATTLE_DECK
- dw PointerTable_14668 ; LOVE_TO_BATTLE_DECK
- dw PointerTable_14668 ; EXCAVATION_DECK
- dw PointerTable_14668 ; BLISTERING_POKEMON_DECK
- dw PointerTable_14668 ; HARD_POKEMON_DECK
- dw PointerTable_14668 ; WATERFRONT_POKEMON_DECK
- dw PointerTable_14668 ; LONELY_FRIENDS_DECK
- dw PointerTable_14668 ; SOUND_OF_THE_WAVES_DECK
- dw PointerTable_14668 ; PIKACHU_DECK
- dw PointerTable_14668 ; BOOM_BOOM_SELFDESTRUCT_DECK
- dw PointerTable_14668 ; POWER_GENERATOR_DECK
- dw PointerTable_14668 ; ETCETERA_DECK
- dw PointerTable_14668 ; FLOWER_GARDEN_DECK
- dw PointerTable_14668 ; KALEIDOSCOPE_DECK
- dw PointerTable_14668 ; GHOST_DECK
- dw PointerTable_14668 ; NAP_TIME_DECK
- dw PointerTable_14668 ; STRANGE_POWER_DECK
- dw PointerTable_14668 ; FLYIN_POKEMON_DECK
- dw PointerTable_14668 ; LOVELY_NIDORAN_DECK
- dw PointerTable_14668 ; POISON_DECK
- dw PointerTable_14668 ; ANGER_DECK
- dw PointerTable_14668 ; FLAMETHROWER_DECK
- dw PointerTable_14668 ; RESHUFFLE_DECK
- dw PointerTable_148dc ; IMAKUNI_DECK
+ dw AIActionTable_SamPractice ; SAMS_PRACTICE_DECK
+ dw AIActionTable_GeneralDecks ; PRACTICE_PLAYER_DECK
+ dw AIActionTable_GeneralDecks ; SAMS_NORMAL_DECK
+ dw AIActionTable_GeneralDecks ; CHARMANDER_AND_FRIENDS_DECK
+ dw AIActionTable_GeneralDecks ; CHARMANDER_EXTRA_DECK
+ dw AIActionTable_GeneralDecks ; SQUIRTLE_AND_FRIENDS_DECK
+ dw AIActionTable_GeneralDecks ; SQUIRTLE_EXTRA_DECK
+ dw AIActionTable_GeneralDecks ; BULBASAUR_AND_FRIENDS_DECK
+ dw AIActionTable_GeneralDecks ; BULBASAUR_EXTRA_DECK
+ dw AIActionTable_GeneralDecks ; LIGHTNING_AND_FIRE_DECK
+ dw AIActionTable_GeneralDecks ; WATER_AND_FIGHTING_DECK
+ dw AIActionTable_GeneralDecks ; GRASS_AND_PSYCHIC_DECK
+ dw AIActionTable_LegendaryMoltres ; LEGENDARY_MOLTRES_DECK
+ dw AIActionTable_LegendaryZapdos ; LEGENDARY_ZAPDOS_DECK
+ dw AIActionTable_LegendaryArticuno ; LEGENDARY_ARTICUNO_DECK
+ dw AIActionTable_LegendaryDragonite ; LEGENDARY_DRAGONITE_DECK
+ dw AIActionTable_FirstStrike ; FIRST_STRIKE_DECK
+ dw AIActionTable_RockCrusher ; ROCK_CRUSHER_DECK
+ dw AIActionTable_GoGoRainDance ; GO_GO_RAIN_DANCE_DECK
+ dw AIActionTable_ZappingSelfdestruct ; ZAPPING_SELFDESTRUCT_DECK
+ dw AIActionTable_FlowerPower ; FLOWER_POWER_DECK
+ dw AIActionTable_StrangePsyshock ; STRANGE_PSYSHOCK_DECK
+ dw AIActionTable_WondersOfScience ; WONDERS_OF_SCIENCE_DECK
+ dw AIActionTable_FireCharge ; FIRE_CHARGE_DECK
+ dw AIActionTable_ImRonald ; IM_RONALD_DECK
+ dw AIActionTable_PowerfulRonald ; POWERFUL_RONALD_DECK
+ dw AIActionTable_InvincibleRonald ; INVINCIBLE_RONALD_DECK
+ dw AIActionTable_LegendaryRonald ; LEGENDARY_RONALD_DECK
+ dw AIActionTable_GeneralNoRetreat ; MUSCLES_FOR_BRAINS_DECK
+ dw AIActionTable_GeneralDecks ; HEATED_BATTLE_DECK
+ dw AIActionTable_GeneralDecks ; LOVE_TO_BATTLE_DECK
+ dw AIActionTable_GeneralDecks ; EXCAVATION_DECK
+ dw AIActionTable_GeneralDecks ; BLISTERING_POKEMON_DECK
+ dw AIActionTable_GeneralDecks ; HARD_POKEMON_DECK
+ dw AIActionTable_GeneralDecks ; WATERFRONT_POKEMON_DECK
+ dw AIActionTable_GeneralDecks ; LONELY_FRIENDS_DECK
+ dw AIActionTable_GeneralDecks ; SOUND_OF_THE_WAVES_DECK
+ dw AIActionTable_GeneralDecks ; PIKACHU_DECK
+ dw AIActionTable_GeneralDecks ; BOOM_BOOM_SELFDESTRUCT_DECK
+ dw AIActionTable_GeneralDecks ; POWER_GENERATOR_DECK
+ dw AIActionTable_GeneralDecks ; ETCETERA_DECK
+ dw AIActionTable_GeneralDecks ; FLOWER_GARDEN_DECK
+ dw AIActionTable_GeneralDecks ; KALEIDOSCOPE_DECK
+ dw AIActionTable_GeneralDecks ; GHOST_DECK
+ dw AIActionTable_GeneralDecks ; NAP_TIME_DECK
+ dw AIActionTable_GeneralDecks ; STRANGE_POWER_DECK
+ dw AIActionTable_GeneralDecks ; FLYIN_POKEMON_DECK
+ dw AIActionTable_GeneralDecks ; LOVELY_NIDORAN_DECK
+ dw AIActionTable_GeneralDecks ; POISON_DECK
+ dw AIActionTable_GeneralDecks ; ANGER_DECK
+ dw AIActionTable_GeneralDecks ; FLAMETHROWER_DECK
+ dw AIActionTable_GeneralDecks ; RESHUFFLE_DECK
+ dw AIActionTable_GeneralNoRetreat ; IMAKUNI_DECK
; 1406a
diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm
index 7162983..8943187 100644
--- a/src/engine/bank05.asm
+++ b/src/engine/bank05.asm
@@ -1,25 +1,25 @@
INCLUDE "data/deck_ai_pointers.asm"
-PointerTable_1406a: ; 1406a (5:406a)
+AIActionTable_Unreferenced: ; 1406a (5:406a)
dw $406c
- dw Func_14078
- dw Func_14078
- dw Func_1409e
- dw $40a2
- dw $40a6
- dw $40aa
-
-Func_14078: ; 14078 (5:4078)
+ dw .do_turn
+ dw .do_turn
+ dw .star_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
+
+.do_turn ; 14078 (5:4078)
call AIDecidePlayPokemonCard
call AIDecideWhetherToRetreat
- jr nc, .asm_14091
+ jr nc, .try_attack
call AIDecideBenchPokemonToSwitchTo
- call AIChooseEnergyToDiscardForRetreatCost
+ call AITryToRetreat
call AIDecideWhetherToRetreat
- jr nc, .asm_14091
+ jr nc, .try_attack
call AIDecideBenchPokemonToSwitchTo
- call AIChooseEnergyToDiscardForRetreatCost
-.asm_14091
+ call AITryToRetreat
+.try_attack
call AIProcessAndTryToPlayEnergy
call AIProcessAndTryToUseAttack
ret c
@@ -28,8 +28,25 @@ Func_14078: ; 14078 (5:4078)
ret
; 0x1409e
-Func_1409e: ; 1409e (5:409e)
- INCROM $1409e, $140ae
+.star_duel ; 1409e (5:409e)
+ call AIPlayInitialBasicCards
+ ret
+; 0x140a2
+
+.forced_switch ; 140a2 (5:40a2)
+ call AIDecideBenchPokemonToSwitchTo
+ ret
+; 0x140a6
+
+.ko_switch ; 140a6 (5:40a6)
+ call AIDecideBenchPokemonToSwitchTo
+ ret
+; 0x140aa
+
+.take_prize ; 140aa (5:40aa)
+ call AIPickPrizeCards
+ ret
+; 0x140ae
; returns carry if damage dealt from any of
; a card's moves KOs defending Pokémon
@@ -290,7 +307,7 @@ PickRandomBenchPokemon: ; 141da (5:41da)
ret
; 0x141e5
-_AIPickPrizeCards: ; 141e5 (5:41e5)
+AIPickPrizeCards: ; 141e5 (5:41e5)
ld a, [wNumberPrizeCardsToTake]
ld b, a
.loop
@@ -578,7 +595,7 @@ ConvertColorToEnergyCardID: ; 1430f (5:430f)
db FIGHTING_ENERGY
db PSYCHIC_ENERGY
db DOUBLE_COLORLESS_ENERGY
-
+
Func_14323: ; 14323 (5:4323)
INCROM $14323, $1433d
@@ -1060,13 +1077,13 @@ EstimateDamage_FromDefendingPokemon: ; 1450b (5:450b)
; damage as the receiver
CalculateDamage_FromDefendingPokemon: ; 1458c (5:458c)
ld hl, wAIMinDamage
- call _CalculateDamage_FromDefendingPokemon
+ call .CalculateDamage
ld hl, wAIMaxDamage
- call _CalculateDamage_FromDefendingPokemon
+ call .CalculateDamage
ld hl, wDamage
-; fallthrough
+ ; fallthrough
-_CalculateDamage_FromDefendingPokemon: ; 1459b (5:459b)
+.CalculateDamage ; 1459b (5:459b)
ld e, [hl]
ld d, $00
push hl
@@ -1196,62 +1213,62 @@ AIProcessHandTrainerCards: ; 14663 (5:4663)
farcall _AIProcessHandTrainerCards
ret
-; GENERAL DECK POINTER LIST - Not sure on all of these.
-; This is an example of an AI pointer table, there's one for each AI type.
-PointerTable_14668: ; 14668 (05:4668)
- dw AIMainTurnLogic ; not used
- dw AIMainTurnLogic ; general AI for battles
- dw AIDuelStart ; basic pokemon placement / cheater shuffling on better AI
- dw AIRetreatLogic ; deciding which Bench Pokemon to switch to
- dw Func_14683
- dw AIPickPrizeCards
+AIActionTable_GeneralDecks: ; 14668 (05:4668)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-AIMainTurnLogic: ; 14674 (5:4674)
- call _AIMainTurnLogic
+.do_turn ; 14674 (5:4674)
+ call AIMainTurnLogic
ret
-AIDuelStart: ; 14678 (5:4678)
+.start_duel ; 14678 (5:4678)
call InitAIDuelVars
call AIPlayInitialBasicCards
ret
-AIRetreatLogic: ; 1467f (5:467f)
+.forced_switch ; 1467f (5:467f)
call AIDecideBenchPokemonToSwitchTo
ret
-Func_14683: ; 14683 (5:4683)
+.ko_switch ; 14683 (5:4683)
call AIDecideBenchPokemonToSwitchTo
ret
-AIPickPrizeCards: ; 14687 (5:4687)
- call _AIPickPrizeCards
+.take_prize: ; 14687 (5:4687)
+ call AIPickPrizeCards
ret
; handle AI routines for a whole turn
-_AIMainTurnLogic: ; 1468b (5:468b)
+AIMainTurnLogic: ; 1468b (5:468b)
+; initialize variables
call InitAITurnVars
-
ld a, AI_TRAINER_CARD_PHASE_01
call AIProcessHandTrainerCards
farcall HandleAIAntiMewtwoDeckStrategy
jp nc, .try_attack
-
+; handle Pkmn Powers
farcall HandleAIGoGoRainDanceEnergy
farcall HandleAIDamageSwap
farcall HandleAIPkmnPowers
- ret c
-
+ ret c ; return if turn ended
farcall HandleAICowardice
-
+; process Trainer cards
+; phase 2 through 4.
ld a, AI_TRAINER_CARD_PHASE_02
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_03
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_04
call AIProcessHandTrainerCards
+; play Pokemon from hand
call AIDecidePlayPokemonCard
- ret c
-
+ ret c ; return if turn ended
+; process Trainer cards
+; phase 5 through 12.
ld a, AI_TRAINER_CARD_PHASE_05
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_06
@@ -1260,39 +1277,38 @@ _AIMainTurnLogic: ; 1468b (5:468b)
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_08
call AIProcessHandTrainerCards
- call Func_14786
+ call AIProcessRetreat
ld a, AI_TRAINER_CARD_PHASE_10
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_11
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_12
call AIProcessHandTrainerCards
-
+; play Energy card if possible
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .already_played_energy_1
+ jr nz, .skip_energy_attach_1
call AIProcessAndTryToPlayEnergy
-
-.already_played_energy_1
+.skip_energy_attach_1
+; play Pokemon from hand again
call AIDecidePlayPokemonCard
-
+; handle Pkmn Powers again
farcall HandleAIDamageSwap
farcall HandleAIPkmnPowers
- ret c
+ ret c ; return if turn ended
farcall HandleAIGoGoRainDanceEnergy
- ld a, $0d ; attack
+ ld a, AI_ENERGY_TRANS_ATTACK
farcall HandleAIEnergyTrans
-
+; process Trainer cards phases 13 and 15
ld a, AI_TRAINER_CARD_PHASE_13
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_15
call AIProcessHandTrainerCards
-
+; if used Professor Oak, process new hand
+; if not, then proceed to attack.
ld a, [wPreviousAIFlags]
and AI_FLAG_USED_PROFESSOR_OAK
jr z, .try_attack
-
-; used Professor Oak
ld a, AI_TRAINER_CARD_PHASE_01
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_02
@@ -1302,8 +1318,7 @@ _AIMainTurnLogic: ; 1468b (5:468b)
ld a, AI_TRAINER_CARD_PHASE_04
call AIProcessHandTrainerCards
call AIDecidePlayPokemonCard
- ret c
-
+ ret c ; return if turn ended
ld a, AI_TRAINER_CARD_PHASE_05
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_06
@@ -1312,35 +1327,33 @@ _AIMainTurnLogic: ; 1468b (5:468b)
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_08
call AIProcessHandTrainerCards
- call Func_14786
+ call AIProcessRetreat
ld a, AI_TRAINER_CARD_PHASE_10
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_11
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_12
-
call AIProcessHandTrainerCards
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .already_played_energy_2
+ jr nz, .skip_energy_attach_2
call AIProcessAndTryToPlayEnergy
-.already_played_energy_2
+.skip_energy_attach_2
call AIDecidePlayPokemonCard
-
farcall HandleAIDamageSwap
farcall HandleAIPkmnPowers
- ret c
+ ret c ; return if turn ended
farcall HandleAIGoGoRainDanceEnergy
- ld a, $0d ; attack
+ ld a, AI_ENERGY_TRANS_ATTACK
farcall HandleAIEnergyTrans
-
ld a, AI_TRAINER_CARD_PHASE_13
call AIProcessHandTrainerCards
-
+ ; skip AI_TRAINER_CARD_PHASE_15
.try_attack
- ld a, $0e
+ ld a, AI_ENERGY_TRANS_TO_BENCH
farcall HandleAIEnergyTrans
-
+; attack if possible, if not,
+; finish turn without attacking.
call AIProcessAndTryToUseAttack
ret c ; return if AI attacked
ld a, OPPACTION_FINISH_NO_ATTACK
@@ -1348,11 +1361,11 @@ _AIMainTurnLogic: ; 1468b (5:468b)
ret
; 0x14786
-; handles retreating
-Func_14786: ; 14786 (5:4786)
- ld a, [wce03]
+; handles AI retreating logic
+AIProcessRetreat: ; 14786 (5:4786)
+ ld a, [wAIRetreatedThisTurn]
or a
- ret nz
+ ret nz ; return, already retreated this turn
call AIDecideWhetherToRetreat
ret nc ; return if not retreating
@@ -1360,74 +1373,88 @@ Func_14786: ; 14786 (5:4786)
call AIDecideBenchPokemonToSwitchTo
ret c ; return if no Bench Pokemon
- ld [wcdd5], a
+; store Play Area to retreat to and
+; set wAIRetreatedThisTurn to true
+ ld [wAIPlayAreaCardToSwitch], a
ld a, $01
- ld [wce03], a
+ ld [wAIRetreatedThisTurn], a
+; if AI can use Switch from hand, use it instead...
ld a, AI_TRAINER_CARD_PHASE_09
call AIProcessHandTrainerCards
ld a, [wPreviousAIFlags]
and AI_FLAG_USED_SWITCH
jr nz, .used_switch
- ld a, [wcdd5]
- call AIChooseEnergyToDiscardForRetreatCost
+; ... else try retreating normally.
+ ld a, [wAIPlayAreaCardToSwitch]
+ call AITryToRetreat
ret
.used_switch
+; if AI used switch, unset its AI flag
ld a, [wPreviousAIFlags]
and ~AI_FLAG_USED_SWITCH ; clear Switch flag
ld [wPreviousAIFlags], a
- ld a, $09 ; retreat
+
+; bug, this doesn't make sense being here, since at this point
+; Switch Trainer card was already used to retreat the Pokemon.
+; what the routine will do is just transfer Energy cards to
+; the Arena Pokemon for the purpose of retreating, and
+; then not actually retreat, resulting in unusual behaviour.
+; this would only work placed right after the AI checks whether
+; they have Switch card in hand to use and doesn't have one.
+; (and probably that was the original intention.)
+ ld a, AI_ENERGY_TRANS_RETREAT ; retreat
farcall HandleAIEnergyTrans
ret
; 0x147bd
-PointerTable_147bd: ; 147bd (05:47bd)
- dw Func_147c9
- dw Func_147c9
- dw Func_147d6
- dw Func_147da
- dw Func_147e7
- dw Func_147f4
+AIActionTable_SamPractice: ; 147bd (05:47bd)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_147c9: ; 147c9 (5:47c9)
+.do_turn ; 147c9 (5:47c9)
call IsAIPracticeScriptedTurn
- jr nc, .scripted
+ jr nc, .scripted_1
; not scripted, use AI main turn logic
- call _AIMainTurnLogic
+ call AIMainTurnLogic
ret
-.scripted ; use scripted actions instead
+.scripted_1 ; use scripted actions instead
call AIPerformSciptedTurn
ret
; 0x147d6
-Func_147d6: ; 147d6 (5:47d6)
+.start_duel ; 147d6 (5:47d6)
call Func_14801
ret
; 0x147da
-Func_147da: ; 147da (5:47da)
+.forced_switch ; 147da (5:47da)
call IsAIPracticeScriptedTurn
- jr nc, .scripted
+ jr nc, .scripted_2
call AIDecideBenchPokemonToSwitchTo
ret
-.scripted
+.scripted_2
call PickRandomBenchPokemon
ret
; 0x147e7
-Func_147e7: ; 147e7 (5:47e7)
+.ko_switch: ; 147e7 (5:47e7)
call IsAIPracticeScriptedTurn
- jr nc, .scripted
+ jr nc, .scripted_3
call AIDecideBenchPokemonToSwitchTo
ret
-.scripted
+.scripted_3
call GetPlayAreaLocationOfRaticateOrRattata
ret
; 0x147f4
-Func_147f4: ; 147f4 (5:47f4)
- call _AIPickPrizeCards
+.take_prize: ; 147f4 (5:47f4)
+ call AIPickPrizeCards
ret
; 0x147f8
@@ -1585,7 +1612,7 @@ AIPerformSciptedTurn: ; 1483a (5:483a)
inc a ; PLAY_AREA_BENCH_2
.retreat
- call AIChooseEnergyToDiscardForRetreatCost
+ call AITryToRetreat
ret
; 0x148cc
@@ -1732,7 +1759,7 @@ InitAITurnVars: ; 15649 (5:5649)
ld [wPreviousAIFlags], a
ld [wcddb], a
ld [wcddc], a
- ld [wce03], a
+ ld [wAIRetreatedThisTurn], a
; checks if the Player used an attack last turn
; and if it was the second attack of their card.
@@ -2994,7 +3021,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.
-AIChooseEnergyToDiscardForRetreatCost: ; 15d4f (5:5d4f)
+AITryToRetreat: ; 15d4f (5:5d4f)
push af
ld a, [wAIPlayEnergyCardForRetreat]
or a
@@ -7104,8 +7131,7 @@ CheckCardEvolutionInHandOrDeck: ; 17274 (5:7274)
; sets up the inital hand of boss deck.
; 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
-; and avoids deck-specific list of cards.
+; some minimum number of Basic Pokemon and Energy cards.
SetUpBossStartingHandAndDeck: ; 172af (5:72af)
; shuffle all hand cards in deck
ld a, DUELVARS_HAND
@@ -7170,7 +7196,7 @@ SetUpBossStartingHandAndDeck: ; 172af (5:72af)
cp 2
jr c, .shuffle_deck
-; now check the following 6 cards.
+; now check the following 6 cards (prize cards).
; re-shuffle deck if any of these cards is listed in wcda8.
ld b, 6
.check_card_ids
diff --git a/src/engine/bank08.asm b/src/engine/bank08.asm
index 8d6d462..df8d7c5 100644
--- a/src/engine/bank08.asm
+++ b/src/engine/bank08.asm
@@ -6223,9 +6223,13 @@ AIDecide_PokemonTrader_Flamethrower: ; 22133 (8:6133)
; 0x2219b
; handle AI routines for Energy Trans.
-; depending on input, AI can use Energy Trans to
-; give Arena or Bench cards some Grass energy cards,
-; depending whether it's for attack, retreat, etc.
+; uses AI_ENERGY_TRANS_* constants as input:
+; - AI_ENERGY_TRANS_RETREAT: transfers enough Grass Energy cards to
+; Arena Pokemon for it to be able to pay the Retreat Cost;
+; - AI_ENERGY_TRANS_ATTACK: transfers enough Grass Energy cards to
+; 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)
ld [wce06], a
@@ -6247,12 +6251,13 @@ HandleAIEnergyTrans: ; 2219b (8:619b)
ret c ; return if Muk found in any Play Area
ld a, [wce06]
- cp $09
+ cp AI_ENERGY_TRANS_RETREAT
jr z, .check_retreat
- cp $0e
+ cp AI_ENERGY_TRANS_TO_BENCH
jp z, .TransferEnergyToBench
+ ; AI_ENERGY_TRANS_ATTACK
call .CheckEnoughGrassEnergyCardsForAttack
ret nc
jr .TransferEnergyToArena
diff --git a/src/engine/deck_ai.asm b/src/engine/deck_ai.asm
index c93b8ce..2a78848 100644
--- a/src/engine/deck_ai.asm
+++ b/src/engine/deck_ai.asm
@@ -3,76 +3,93 @@
; a Pokemon to switch to, it looks up in this list and if
; a card ID matches, applies a retreat score bonus to this card.
; positive (negative) means more (less) likely to switch to this card.
-airetreat: MACRO
+ai_retreat: MACRO
db \1 ; card ID
db $80 + \2 ; retreat score (ranges between -128 and 127)
ENDM
; AI card energy attach score bonus
-; when the AI energy attachment run through the Play Area to choose
+; when the AI energy attachment routine runs through the Play Area to choose
; a Pokemon to attach an energy card, it looks up in this list and if
; a card ID matches, skips this card if the maximum number of energy
; cards attached has been reached. If it hasn't been reached, additionally
; applies a positive (or negative) AI score to attach energy to this card.
-aienergy: MACRO
+ai_energy: MACRO
db \1 ; card ID
db \2 ; maximum number of attached cards
db $80 + \3 ; energy score (ranges between -128 and 127)
ENDM
-PointerTable_148dc: ; 148dc (5:48dc)
- dw Func_148e8
- dw Func_148e8
- dw Func_148ec
- dw Func_148f3
- dw Func_148f7
- dw Func_148fb
+; stores in WRAM pointer to data in argument
+; e.g. store_list_pointer wSomeListPointer, SomeData
+store_list_pointer: MACRO
+ ld hl, \1
+ ld de, \2
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ENDM
-Func_148e8: ; 148e8 (5:48e8)
- call Func_148ff
+AIActionTable_GeneralNoRetreat: ; 148dc (5:48dc)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
+
+.do_turn ; 148e8 (5:48e8)
+ call AIDoTurn_GeneralNoRetreat
ret
; 0x148ec
-Func_148ec: ; 148ec (5:48ec)
+.start_duel ; 148ec (5:48ec)
call InitAIDuelVars
call AIPlayInitialBasicCards
ret
; 0x148f3
-Func_148f3: ; 148f3 (5:48f3)
+.forced_switch ; 148f3 (5:48f3)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x148f7
-Func_148f7: ; 148f7 (5:48f7)
+.ko_switch ; 148f7 (5:48f7)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x148fb
-Func_148fb: ; 148fb (5:48fb)
- call _AIPickPrizeCards
+.take_prize ; 148fb (5:48fb)
+ call AIPickPrizeCards
ret
; 0x148ff
-Func_148ff: ; 148ff (5:48ff)
+AIDoTurn_GeneralNoRetreat: ; 148ff (5:48ff)
+; initialize variables
call InitAITurnVars
ld a, AI_TRAINER_CARD_PHASE_01
call AIProcessHandTrainerCards
farcall HandleAIAntiMewtwoDeckStrategy
jp nc, .try_attack
+; handle Pkmn Powers
farcall HandleAIGoGoRainDanceEnergy
farcall HandleAIDamageSwap
farcall HandleAIPkmnPowers
- ret c
+ ret c ; return if turn ended
farcall HandleAICowardice
+; process Trainer cards
+; phase 2 through 4.
ld a, AI_TRAINER_CARD_PHASE_02
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_03
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_04
call AIProcessHandTrainerCards
+; play Pokemon from hand
call AIDecidePlayPokemonCard
- ret c
+ ret c ; return if turn ended
+; process Trainer cards
+; phase 5 through 12.
ld a, AI_TRAINER_CARD_PHASE_05
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_06
@@ -87,22 +104,28 @@ Func_148ff: ; 148ff (5:48ff)
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_12
call AIProcessHandTrainerCards
+; play Energy card if possible
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .asm_1495e
+ jr nz, .skip_energy_attach_1
call AIProcessAndTryToPlayEnergy
-.asm_1495e
+.skip_energy_attach_1
+; play Pokemon from hand again
call AIDecidePlayPokemonCard
+; handle Pkmn Powers again
farcall HandleAIDamageSwap
farcall HandleAIPkmnPowers
- ret c
+ ret c ; return if turn ended
farcall HandleAIGoGoRainDanceEnergy
- ld a, $0d
+ ld a, AI_ENERGY_TRANS_ATTACK
farcall HandleAIEnergyTrans
+; process Trainer cards phases 13 and 15
ld a, AI_TRAINER_CARD_PHASE_13
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_15
call AIProcessHandTrainerCards
+; if used Professor Oak, process new hand
+; if not, then proceed to attack.
ld a, [wPreviousAIFlags]
and AI_FLAG_USED_PROFESSOR_OAK
jr z, .try_attack
@@ -115,7 +138,7 @@ Func_148ff: ; 148ff (5:48ff)
ld a, AI_TRAINER_CARD_PHASE_04
call AIProcessHandTrainerCards
call AIDecidePlayPokemonCard
- ret c
+ ret c ; return if turn ended
ld a, AI_TRAINER_CARD_PHASE_05
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_06
@@ -132,40 +155,43 @@ Func_148ff: ; 148ff (5:48ff)
call AIProcessHandTrainerCards
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .asm_149c9
+ jr nz, .skip_energy_attach_2
call AIProcessAndTryToPlayEnergy
-.asm_149c9
+.skip_energy_attach_2
call AIDecidePlayPokemonCard
farcall HandleAIDamageSwap
farcall HandleAIPkmnPowers
- ret c
+ ret c ; return if turn ended
farcall HandleAIGoGoRainDanceEnergy
ld a, AI_TRAINER_CARD_PHASE_13
call AIProcessHandTrainerCards
+ ; skip AI_TRAINER_CARD_PHASE_15
.try_attack
+; attack if possible, if not,
+; finish turn without attacking.
call AIProcessAndTryToUseAttack
- ret c
+ ret c ; return if turn ended
ld a, OPPACTION_FINISH_NO_ATTACK
bank1call AIMakeDecision
ret
; 0x149e8
-PointerTable_149e8: ; 149e8 (05:49e8)
- dw Func_149f4
- dw Func_149f4
- dw Func_149f8
- dw Func_14a09
- dw Func_14a0d
- dw Func_14a11
+AIActionTable_LegendaryMoltres: ; 149e8 (05:49e8)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_149f4: ; 149f4 (5:49f4)
- call Func_14a81
+.do_turn ; 149f4 (5:49f4)
+ call AIDoTurn_LegendaryMoltres
ret
; 0x149f8
-Func_149f8: ; 149f8 (5:49f8)
+.start_duel ; 149f8 (5:49f8)
call InitAIDuelVars
- call Func_14a4a
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc ; Play Area set up was successful
@@ -173,22 +199,22 @@ Func_149f8: ; 149f8 (5:49f8)
ret
; 0x14a09
-Func_14a09: ; 14a09 (5:4a09)
+.forced_switch ; 14a09 (5:4a09)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14a0d
-Func_14a0d: ; 14a0d (5:4a0d)
+.ko_switch ; 14a0d (5:4a0d)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14a11
-Func_14a11: ; 14a11 (5:4a11)
- call _AIPickPrizeCards
+.take_prize ; 14a11 (5:4a11)
+ call AIPickPrizeCards
ret
; 0x14a15
-Data_14a15: ; 14a15 (5:4a15)
+.list_arena ; 14a15 (5:4a15)
db MAGMAR2
db GROWLITHE
db VULPIX
@@ -197,7 +223,7 @@ Data_14a15: ; 14a15 (5:4a15)
db MOLTRES2
db $00
-Data_14a1c: ; 14a1c (5:4a1c)
+.list_bench ; 14a1c (5:4a1c)
db MOLTRES1
db VULPIX
db GROWLITHE
@@ -205,7 +231,7 @@ Data_14a1c: ; 14a1c (5:4a1c)
db MAGMAR1
db $00
-Data_14a22: ; 14a22 (5:4a22)
+.list_play_hand ; 14a22 (5:4a22)
db MOLTRES2
db MOLTRES1
db VULPIX
@@ -214,79 +240,51 @@ Data_14a22: ; 14a22 (5:4a22)
db MAGMAR1
db $00
-Data_14a29: ; 14a29 (5:4a29)
- airetreat GROWLITHE, -5
- airetreat VULPIX, -5
+.list_retreat ; 14a29 (5:4a29)
+ ai_retreat GROWLITHE, -5
+ ai_retreat VULPIX, -5
db $00
-Data_14a2e: ; 14a2e (5:4a2e)
- aienergy VULPIX, 3, +0
- aienergy NINETAILS2, 3, +1
- aienergy GROWLITHE, 3, +1
- aienergy ARCANINE2, 4, +1
- aienergy MAGMAR1, 4, -1
- aienergy MAGMAR2, 1, -1
- aienergy MOLTRES2, 3, +2
- aienergy MOLTRES1, 4, +2
+.list_energy ; 14a2e (5:4a2e)
+ ai_energy VULPIX, 3, +0
+ ai_energy NINETAILS2, 3, +1
+ ai_energy GROWLITHE, 3, +1
+ ai_energy ARCANINE2, 4, +1
+ ai_energy MAGMAR1, 4, -1
+ ai_energy MAGMAR2, 1, -1
+ ai_energy MOLTRES2, 3, +2
+ ai_energy MOLTRES1, 4, +2
db $00
-Data_14a47: ; 14a47 (5:4a47)
+.list_prize ; 14a47 (5:4a47)
db ENERGY_REMOVAL
db MOLTRES2
db $00
-Func_14a4a: ; 14a4a (5:4a4a)
- ld hl, wcda8
- ld de, Data_14a47
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_14a15
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_14a1c
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_14a22
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdb0
- ld de, Data_14a29
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdb2
- ld de, Data_14a2e
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 14a4a (5:4a4a)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_play_hand
+ store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x14a81
-Func_14a81: ; 14a81 (5:4a81)
+AIDoTurn_LegendaryMoltres: ; 14a81 (5:4a81)
+; initialize variables
call InitAITurnVars
farcall HandleAIAntiMewtwoDeckStrategy
jp nc, .try_attack
-
+; process Trainer cards
+; phase 2 through 4.
ld a, AI_TRAINER_CARD_PHASE_02
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_04
call AIProcessHandTrainerCards
-; check if AI can play Moltres2 from hand
-; if so, play it.
+; check if AI can play Moltres2
+; from hand and if so, play it.
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
cp MAX_PLAY_AREA_POKEMON
@@ -306,17 +304,18 @@ Func_14a81: ; 14a81 (5:4a81)
bank1call AIMakeDecision
.skip_moltres
+; play Pokemon from hand
call AIDecidePlayPokemonCard
- ret c
+ ret c ; return if turn ended
+; process Trainer cards
ld a, AI_TRAINER_CARD_PHASE_05
call AIProcessHandTrainerCards
- call Func_14786
+ call AIProcessRetreat
ld a, AI_TRAINER_CARD_PHASE_10
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_11
call AIProcessHandTrainerCards
-
-; handle attaching energy from hand
+; play Energy card if possible
ld a, [wAlreadyPlayedEnergy]
or a
jr nz, .skip_attach_energy
@@ -343,8 +342,8 @@ Func_14a81: ; 14a81 (5:4a81)
jr c, .skip_attach_energy
.attach_normally
+; play Energy card if possible
call AIProcessAndTryToPlayEnergy
-
.skip_attach_energy
; try playing Pokemon cards from hand again
call AIDecidePlayPokemonCard
@@ -352,6 +351,8 @@ Func_14a81: ; 14a81 (5:4a81)
call AIProcessHandTrainerCards
.try_attack
+; attack if possible, if not,
+; finish turn without attacking.
call AIProcessAndTryToUseAttack
ret c
ld a, OPPACTION_FINISH_NO_ATTACK
@@ -359,22 +360,22 @@ Func_14a81: ; 14a81 (5:4a81)
ret
; 0x14b0f
-PointerTable_14b0f: ; 14b0f (05:4b0f)
- dw Func_14b1b
- dw Func_14b1b
- dw Func_14b1f
- dw Func_14b30
- dw Func_14b34
- dw Func_14b38
+AIActionTable_LegendaryZapdos: ; 14b0f (05:4b0f)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_14b1b: ; 14b1b (5:4b1b)
- call Func_14b9a
+.do_turn ; 14b1b (5:4b1b)
+ call AIDoTurn_LegendaryZapdos
ret
; 0x14b1f
-Func_14b1f: ; 14b1f (5:4b1f)
+.start_duel ; 14b1f (5:4b1f)
call InitAIDuelVars
- call Func_14b6c
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -382,22 +383,22 @@ Func_14b1f: ; 14b1f (5:4b1f)
ret
; 0x14b30
-Func_14b30: ; 14b30 (5:4b30)
+.forced_switch ; 14b30 (5:4b30)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14b34
-Func_14b34: ; 14b34 (5:4b34)
+.ko_switch ; 14b34 (5:4b34)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14b38
-Func_14b38: ; 14b38 (5:4b38)
- call _AIPickPrizeCards
+.take_prize ; 14b38 (5:4b38)
+ call AIPickPrizeCards
ret
; 0x14b3c
-Data_14b3c: ; 14b3c (5:4b3c)
+.list_arena ; 14b3c (5:4b3c)
db ELECTABUZZ2
db VOLTORB
db EEVEE
@@ -406,7 +407,7 @@ Data_14b3c: ; 14b3c (5:4b3c)
db ZAPDOS3
db $00
-Data_14b43: ; 14b43 (5:4b43)
+.list_bench ; 14b43 (5:4b43)
db ZAPDOS2
db ZAPDOS1
db EEVEE
@@ -414,138 +415,128 @@ Data_14b43: ; 14b43 (5:4b43)
db ELECTABUZZ2
db $00
-Data_14b49: ; 14b49 (5:4b49)
- airetreat EEVEE, -5
- airetreat VOLTORB, -5
- airetreat ELECTABUZZ2, -5
+.list_retreat ; 14b49 (5:4b49)
+ ai_retreat EEVEE, -5
+ ai_retreat VOLTORB, -5
+ ai_retreat ELECTABUZZ2, -5
db $00
-Data_14b50: ; 14b50 (5:4b50)
- aienergy VOLTORB, 1, -1
- aienergy ELECTRODE1, 3, +0
- aienergy ELECTABUZZ2, 2, -1
- aienergy JOLTEON2, 3, +1
- aienergy ZAPDOS1, 4, +2
- aienergy ZAPDOS2, 4, +2
- aienergy ZAPDOS3, 3, +1
- aienergy EEVEE, 3, +0
+.list_energy ; 14b50 (5:4b50)
+ ai_energy VOLTORB, 1, -1
+ ai_energy ELECTRODE1, 3, +0
+ ai_energy ELECTABUZZ2, 2, -1
+ ai_energy JOLTEON2, 3, +1
+ ai_energy ZAPDOS1, 4, +2
+ ai_energy ZAPDOS2, 4, +2
+ ai_energy ZAPDOS3, 3, +1
+ ai_energy EEVEE, 3, +0
db $00
-Data_14b69: ; 14b69 (5:4b69)
+.list_prize ; 14b69 (5:4b69)
db GAMBLER
db ZAPDOS3
db $00
-Func_14b6c: ; 14b6c (5:4b6c)
- ld hl, wcda8
- ld de, Data_14b69
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_14b3c
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_14b43
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_14b43
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_14b50
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 14b6c (5:4b6c)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x14b9a
-Func_14b9a: ; 14b9a (5:4b9a)
+AIDoTurn_LegendaryZapdos: ; 14b9a (5:4b9a)
+; initialize variables
call InitAITurnVars
farcall HandleAIAntiMewtwoDeckStrategy
jp nc, .try_attack
+; process Trainer cards
ld a, AI_TRAINER_CARD_PHASE_01
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_04
call AIProcessHandTrainerCards
+; play Pokemon from hand
call AIDecidePlayPokemonCard
- ret c
+ ret c ; return if turn ended
ld a, AI_TRAINER_CARD_PHASE_07
call AIProcessHandTrainerCards
- call Func_14786
+ call AIProcessRetreat
ld a, AI_TRAINER_CARD_PHASE_10
call AIProcessHandTrainerCards
+; play Energy card if possible.
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .asm_14bf8
- ld a, $bb
+ jr nz, .skip_energy_attach
+
+; if Arena card is Voltorb and there's Electrode1 in hand,
+; or if it's Electabuzz, try attaching Energy card
+; to the Arena card if it doesn't have any energy attached.
+; Otherwise if Energy card is not needed,
+; go through normal AI energy attach routine.
+ ld a, DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
call GetCardIDFromDeckIndex
- ld a, $6d
+ ld a, VOLTORB
cp e
- jr nz, .asm_14bdb
- ld a, $6e
+ jr nz, .check_electabuzz
+ ld a, ELECTRODE1
call LookForCardIDInHandList_Bank5
- jr nc, .asm_14bf5
- jr .asm_14be0
-.asm_14bdb
- ld a, $71
+ jr nc, .attach_normally
+ jr .voltorb_or_electabuzz
+.check_electabuzz
+ ld a, ELECTABUZZ2
cp e
- jr nz, .asm_14bf5
-.asm_14be0
+ jr nz, .attach_normally
+
+.voltorb_or_electabuzz
call CreateEnergyCardListFromHand
- jr c, .asm_14bf8
- ld e, $00
+ jr c, .skip_energy_attach
+ ld e, PLAY_AREA_ARENA
call CountNumberOfEnergyCardsAttached
or a
- jr nz, .asm_14bf5
- xor a
+ jr nz, .attach_normally
+ xor a ; PLAY_AREA_ARENA
ldh [hTempPlayAreaLocation_ff9d], a
call AITryToPlayEnergyCard
- jr c, .asm_14bf8
-.asm_14bf5
+ jr c, .skip_energy_attach
+
+.attach_normally
call AIProcessAndTryToPlayEnergy
-.asm_14bf8
+
+.skip_energy_attach
+; play Pokemon from hand again
call AIDecidePlayPokemonCard
- ret c
+ ret c ; return if turn ended
ld a, AI_TRAINER_CARD_PHASE_13
call AIProcessHandTrainerCards
.try_attack
+; attack if possible, if not,
+; finish turn without attacking.
call AIProcessAndTryToUseAttack
- ret c
+ ret c ; return if turn ended
ld a, OPPACTION_FINISH_NO_ATTACK
bank1call AIMakeDecision
ret
; 0x14c0b
-PointerTable_14c0b: ; 14c0b (5:4c0b)
- dw Func_14c17
- dw Func_14c17
- dw Func_14c1b
- dw Func_14c2c
- dw Func_14c30
- dw Func_14c34
+AIActionTable_LegendaryArticuno: ; 14c0b (5:4c0b)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_14c17: ; 14c17 (5:4c17)
- call Func_14cf7
+.do_turn ; 14c17 (5:4c17)
+ call AIDoTurn_LegendaryArticuno
ret
; 0x14c1b
-Func_14c1b: ; 14c1b (5:4c1b)
+.start_duel ; 14c1b (5:4c1b)
call InitAIDuelVars
- call Func_14c63
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -553,22 +544,22 @@ Func_14c1b: ; 14c1b (5:4c1b)
ret
; 0x14c2c
-Func_14c2c: ; 14c2c (5:4c2c)
+.forced_switch ; 14c2c (5:4c2c)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14c30
-Func_14c30: ; 14c30 (5:4c30)
+.ko_switch ; 14c30 (5:4c30)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14c34
-Func_14c34: ; 14c34 (5:4c34)
- call _AIPickPrizeCards
+.take_prize ; 14c34 (5:4c34)
+ call AIPickPrizeCards
ret
; 0x14c38
-Data_14c38: ; 14c38 (5:4c38)
+.list_arena ; 14c38 (5:4c38)
db CHANSEY
db LAPRAS
db DITTO
@@ -577,7 +568,7 @@ Data_14c38: ; 14c38 (5:4c38)
db ARTICUNO2
db $00
-Data_14c3f: ; 14c3f (5:4c3f)
+.list_bench ; 14c3f (5:4c3f)
db ARTICUNO1
db SEEL
db LAPRAS
@@ -585,59 +576,33 @@ Data_14c3f: ; 14c3f (5:4c3f)
db DITTO
db $00
-Data_14c45: ; 14c45 (5:4c45)
- airetreat SEEL, -3
- airetreat DITTO, -3
+.list_retreat ; 14c45 (5:4c45)
+ ai_retreat SEEL, -3
+ ai_retreat DITTO, -3
db $00
-Data_14c4a: ; 14c4a (5:4c4a)
- aienergy SEEL, 3, +1
- aienergy DEWGONG, 4, +0
- aienergy LAPRAS, 3, +0
- aienergy ARTICUNO1, 4, +1
- aienergy ARTICUNO2, 3, +0
- aienergy CHANSEY, 0, -8
- aienergy DITTO, 3, +0
+.list_energy ; 14c4a (5:4c4a)
+ ai_energy SEEL, 3, +1
+ ai_energy DEWGONG, 4, +0
+ ai_energy LAPRAS, 3, +0
+ ai_energy ARTICUNO1, 4, +1
+ ai_energy ARTICUNO2, 3, +0
+ ai_energy CHANSEY, 0, -8
+ ai_energy DITTO, 3, +0
db $00
-Data_14c60: ; 14c60 (5:4c60)
+.list_prize ; 14c60 (5:4c60)
db GAMBLER
db ARTICUNO2
db $00
-Func_14c63: ; 14c63 (5:4c63)
- ld hl, wcda8
- ld de, Data_14c60
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_14c38
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_14c3f
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_14c3f
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_14c4a
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 14c63 (5:4c63)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x14c91
@@ -716,29 +681,36 @@ ScoreLegendaryArticunoCards: ; 14c91 (5:4c91)
ret
; 0x14cf7
-Func_14cf7: ; 14cf7 (5:4cf7)
+AIDoTurn_LegendaryArticuno: ; 14cf7 (5:4cf7)
+; initialize variables
call InitAITurnVars
ld a, AI_TRAINER_CARD_PHASE_01
call AIProcessHandTrainerCards
farcall HandleAIAntiMewtwoDeckStrategy
jp nc, .try_attack
+; process Trainer cards
ld a, AI_TRAINER_CARD_PHASE_02
call AIProcessHandTrainerCards
+; play Pokemon from hand
call AIDecidePlayPokemonCard
- ret c
- call Func_14786
+ ret c ; return if turn ended
+ call AIProcessRetreat
ld a, AI_TRAINER_CARD_PHASE_10
call AIProcessHandTrainerCards
+; play Energy card if possible
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .asm_14d20
+ jr nz, .skip_energy_attach_1
call AIProcessAndTryToPlayEnergy
-.asm_14d20
+.skip_energy_attach_1
+; play Pokemon from hand again
call AIDecidePlayPokemonCard
+; process Trainer cards phases 13 and 15
ld a, AI_TRAINER_CARD_PHASE_13
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_15
call AIProcessHandTrainerCards
+; if used Professor Oak, process new hand
ld a, [wPreviousAIFlags]
and AI_FLAG_USED_PROFESSOR_OAK
jr z, .try_attack
@@ -747,40 +719,42 @@ Func_14cf7: ; 14cf7 (5:4cf7)
ld a, AI_TRAINER_CARD_PHASE_02
call AIProcessHandTrainerCards
call AIDecidePlayPokemonCard
- ret c
- call Func_14786
+ ret c ; return if turn ended
+ call AIProcessRetreat
ld a, AI_TRAINER_CARD_PHASE_10
call AIProcessHandTrainerCards
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .asm_14d53
+ jr nz, .skip_energy_attach_2
call AIProcessAndTryToPlayEnergy
-.asm_14d53
+.skip_energy_attach_2
call AIDecidePlayPokemonCard
.try_attack
+; attack if possible, if not,
+; finish turn without attacking.
call AIProcessAndTryToUseAttack
- ret c
+ ret c ; return if turn ended
ld a, OPPACTION_FINISH_NO_ATTACK
bank1call AIMakeDecision
ret
; 0x14d60
-PointerTable_14d60: ; 14d60 (05:4d60)
- dw Func_14d6c
- dw Func_14d6c
- dw Func_14d70
- dw Func_14d81
- dw Func_14d85
- dw Func_14d89
+AIActionTable_LegendaryDragonite: ; 14d60 (05:4d60)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_14d6c: ; 14d6c (5:4d6c)
- call Func_14def
+.do_turn ; 14d6c (5:4d6c)
+ call AIDoTurn_LegendaryDragonite
ret
; 0x14d70
-Func_14d70: ; 14d70 (5:4d70)
+.start_duel ; 14d70 (5:4d70)
call InitAIDuelVars
- call Func_14dc1
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -788,22 +762,22 @@ Func_14d70: ; 14d70 (5:4d70)
ret
; 0x14d81
-Func_14d81: ; 14d81 (5:4d81)
+.forced_switch ; 14d81 (5:4d81)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14d85
-Func_14d85: ; 14d85 (5:4d85)
+.ko_switch ; 14d85 (5:4d85)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14d89
-Func_14d89: ; 14d89 (5:4d89)
- call _AIPickPrizeCards
+.take_prize ; 14d89 (5:4d89)
+ call AIPickPrizeCards
ret
; 0x14d8d
-Data_14d8d: ; 14d8d (5:4d8d)
+.list_arena ; 14d8d (5:4d8d)
db KANGASKHAN
db LAPRAS
db CHARMANDER
@@ -811,7 +785,7 @@ Data_14d8d: ; 14d8d (5:4d8d)
db MAGIKARP
db $00
-Data_14d93: ; 14d93 (5:4d93)
+.list_bench ; 14d93 (5:4d93)
db CHARMANDER
db MAGIKARP
db DRATINI
@@ -819,108 +793,94 @@ Data_14d93: ; 14d93 (5:4d93)
db KANGASKHAN
db $00
-Data_14d99: ; 14d99 (5:4d99)
- airetreat CHARMANDER, -1
- airetreat MAGIKARP, -5
+.list_retreat ; 14d99 (5:4d99)
+ ai_retreat CHARMANDER, -1
+ ai_retreat MAGIKARP, -5
db $00
-Data_14d9e: ; 14d9e (5:4d9e)
- aienergy CHARMANDER, 3, +1
- aienergy CHARMELEON, 4, +1
- aienergy CHARIZARD, 5, +0
- aienergy MAGIKARP, 3, +1
- aienergy GYARADOS, 4, -1
- aienergy DRATINI, 2, +0
- aienergy DRAGONAIR, 4, +0
- aienergy DRAGONITE1, 3, -1
- aienergy KANGASKHAN, 2, -2
- aienergy LAPRAS, 3, +0
+.list_energy ; 14d9e (5:4d9e)
+ ai_energy CHARMANDER, 3, +1
+ ai_energy CHARMELEON, 4, +1
+ ai_energy CHARIZARD, 5, +0
+ ai_energy MAGIKARP, 3, +1
+ ai_energy GYARADOS, 4, -1
+ ai_energy DRATINI, 2, +0
+ ai_energy DRAGONAIR, 4, +0
+ ai_energy DRAGONITE1, 3, -1
+ ai_energy KANGASKHAN, 2, -2
+ ai_energy LAPRAS, 3, +0
db $00
-Data_14dbd: ; 14dbd (5:4dbd)
+.list_prize ; 14dbd (5:4dbd)
db GAMBLER
db DRAGONITE1
db KANGASKHAN
db $00
-Func_14dc1: ; 14dc1 (5:4dc1)
- ld hl, wcda8
- ld de, Data_14dbd
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_14d8d
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_14d93
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_14d93
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_14d9e
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 14dc1 (5:4dc1)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x14def
-Func_14def: ; 14def (5:4def)
+AIDoTurn_LegendaryDragonite: ; 14def (5:4def)
+; initialize variables
call InitAITurnVars
ld a, AI_TRAINER_CARD_PHASE_01
call AIProcessHandTrainerCards
farcall HandleAIAntiMewtwoDeckStrategy
jp nc, .try_attack
+; process Trainer cards
ld a, AI_TRAINER_CARD_PHASE_02
call AIProcessHandTrainerCards
+; play Pokemon from hand
call AIDecidePlayPokemonCard
- ret c
+ ret c ; return if turn ended
ld a, AI_TRAINER_CARD_PHASE_07
call AIProcessHandTrainerCards
- call Func_14786
+ call AIProcessRetreat
ld a, AI_TRAINER_CARD_PHASE_10
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_11
call AIProcessHandTrainerCards
+; play Energy card if possible
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .asm_14e44
- ld a, $bb
+ jr nz, .skip_energy_attach_1
+
+; if Arena card is Kangaskhan and doens't
+; have Energy cards attached, try attaching from hand.
+; otherwise run normal AI energy attach routine.
+ ld a, DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
call GetCardIDFromDeckIndex
- ld a, $b9
+ ld a, KANGASKHAN
cp e
- jr nz, .asm_14e41
+ jr nz, .attach_normally
call CreateEnergyCardListFromHand
- jr c, .asm_14e44
- ld e, $00
+ jr c, .skip_energy_attach_1
+ ld e, PLAY_AREA_ARENA
call CountNumberOfEnergyCardsAttached
or a
- jr nz, .asm_14e41
+ jr nz, .attach_normally
xor a
ldh [hTempPlayAreaLocation_ff9d], a
call AITryToPlayEnergyCard
- jr c, .asm_14e44
-.asm_14e41
+ jr c, .skip_energy_attach_1
+.attach_normally
call AIProcessAndTryToPlayEnergy
-.asm_14e44
+
+.skip_energy_attach_1
+; play Pokemon from hand again
call AIDecidePlayPokemonCard
ld a, AI_TRAINER_CARD_PHASE_15
call AIProcessHandTrainerCards
+; if used Professor Oak, process new hand
+; if not, then proceed to attack.
ld a, [wPreviousAIFlags]
and AI_FLAG_USED_PROFESSOR_OAK
jr z, .try_attack
@@ -929,44 +889,46 @@ Func_14def: ; 14def (5:4def)
ld a, AI_TRAINER_CARD_PHASE_02
call AIProcessHandTrainerCards
call AIDecidePlayPokemonCard
- ret c
+ ret c ; return if turn ended
ld a, AI_TRAINER_CARD_PHASE_07
call AIProcessHandTrainerCards
- call Func_14786
+ call AIProcessRetreat
ld a, AI_TRAINER_CARD_PHASE_10
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_11
call AIProcessHandTrainerCards
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .asm_14e7c
+ jr nz, .skip_energy_attach_2
call AIProcessAndTryToPlayEnergy
-.asm_14e7c
+.skip_energy_attach_2
call AIDecidePlayPokemonCard
.try_attack
+; attack if possible, if not,
+; finish turn without attacking.
call AIProcessAndTryToUseAttack
- ret c
+ ret c ; return if turn ended
ld a, OPPACTION_FINISH_NO_ATTACK
bank1call AIMakeDecision
ret
; 0x14e89
-PointerTable_14e89: ; 14e89 (5:4e89)
- dw Func_14e95
- dw Func_14e95
- dw Func_14e99
- dw Func_14eaa
- dw Func_14eae
- dw Func_14eb2
+AIActionTable_FirstStrike: ; 14e89 (5:4e89)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_14e95: ; 14e95 (5:4e95)
- call _AIMainTurnLogic
+.do_turn ; 14e95 (5:4e95)
+ call AIMainTurnLogic
ret
; 0x14e99
-Func_14e99: ; 14e99 (5:4e99)
+.start_duel ; 14e99 (5:4e99)
call InitAIDuelVars
- call Func_14ee0
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -974,108 +936,82 @@ Func_14e99: ; 14e99 (5:4e99)
ret
; 0x14eaa
-Func_14eaa: ; 14eaa (5:4eaa)
+.forced_switch ; 14eaa (5:4eaa)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14eae
-Func_14eae: ; 14eae (5:4eae)
+.ko_switch ; 14eae (5:4eae)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14eb2
-Func_14eb2: ; 14eb2 (5:4eb2)
- call _AIPickPrizeCards
+.take_prize ; 14eb2 (5:4eb2)
+ call AIPickPrizeCards
ret
; 0x14eb6
-Data_14eb6: ; 14eb6 (5:1eb6)
+.list_arena ; 14eb6 (5:1eb6)
db HITMONCHAN
db MACHOP
db HITMONLEE
db MANKEY
db $00
-Data_14ebb: ; 14ebb (5:1ebb)
+.list_bench ; 14ebb (5:1ebb)
db MACHOP
db HITMONLEE
db HITMONCHAN
db MANKEY
db $00
-Data_14ec0: ; 14ec0 (5:1ec0)
- airetreat MACHOP, - 1
- airetreat MACHOKE, - 1
- airetreat MANKEY, - 2
+.list_retreat ; 14ec0 (5:1ec0)
+ ai_retreat MACHOP, - 1
+ ai_retreat MACHOKE, - 1
+ ai_retreat MANKEY, - 2
db $00
-Data_14ec7: ; 14ec7 (5:1ec7)
- aienergy MACHOP, 3, +0
- aienergy MACHOKE, 4, +0
- aienergy MACHAMP, 4, -1
- aienergy HITMONCHAN, 3, +0
- aienergy HITMONLEE, 3, +0
- aienergy MANKEY, 2, -1
- aienergy PRIMEAPE, 3, -1
+.list_energy ; 14ec7 (5:1ec7)
+ ai_energy MACHOP, 3, +0
+ ai_energy MACHOKE, 4, +0
+ ai_energy MACHAMP, 4, -1
+ ai_energy HITMONCHAN, 3, +0
+ ai_energy HITMONLEE, 3, +0
+ ai_energy MANKEY, 2, -1
+ ai_energy PRIMEAPE, 3, -1
db $00
-Data_14edd: ; 14edd (5:1edd)
+.list_prize ; 14edd (5:1edd)
db HITMONLEE
db HITMONCHAN
db $00
-Func_14ee0: ; 14ee0 (5:4ee0)
- ld hl, wcda8
- ld de, Data_14edd
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_14eb6
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_14ebb
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_14ebb
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_14ec7
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 14ee0 (5:4ee0)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x14f0e
-PointerTable_14f0e: ; 14f0e (5:4f0e)
- dw Func_14f1a
- dw Func_14f1a
- dw Func_14f1e
- dw Func_14f2f
- dw Func_14f33
- dw Func_14f37
+AIActionTable_RockCrusher: ; 14f0e (5:4f0e)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_14f1a: ; 14f1a (5:4f1a)
- call _AIMainTurnLogic
+.do_turn ; 14f1a (5:4f1a)
+ call AIMainTurnLogic
ret
; 0x14f1e
-Func_14f1e: ; 14f1e (5:4f1e)
+.start_duel ; 14f1e (5:4f1e)
call InitAIDuelVars
- call Func_14f61
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -1083,106 +1019,80 @@ Func_14f1e: ; 14f1e (5:4f1e)
ret
; 0x14f2f
-Func_14f2f: ; 14f2f (5:4f2f)
+.forced_switch ; 14f2f (5:4f2f)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14f33
-Func_14f33: ; 14f33 (5:4f33)
+.ko_switch ; 14f33 (5:4f33)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14f37
-Func_14f37: ; 14f37 (5:4f37)
- call _AIPickPrizeCards
+.take_prize ; 14f37 (5:4f37)
+ call AIPickPrizeCards
ret
; 0x14f3b
-Data_14f3b: ; 14f3b (5:4f3b)
+.list_arena ; 14f3b (5:4f3b)
db RHYHORN
db ONIX
db GEODUDE
db DIGLETT
db $00
-Data_14f40: ; 14f40 (5:4f40)
+.list_bench ; 14f40 (5:4f40)
db DIGLETT
db GEODUDE
db RHYHORN
db ONIX
db $00
-Data_14f45: ; 14f45 (5:4f45)
- airetreat DIGLETT, -1
+.list_retreat ; 14f45 (5:4f45)
+ ai_retreat DIGLETT, -1
db $00
-Data_14f48: ; 14f48 (5:4f48)
- aienergy DIGLETT, 3, +1
- aienergy DUGTRIO, 4, +0
- aienergy GEODUDE, 2, +1
- aienergy GRAVELER, 3, +0
- aienergy GOLEM, 4, +0
- aienergy ONIX, 2, -1
- aienergy RHYHORN, 3, +0
+.list_energy ; 14f48 (5:4f48)
+ ai_energy DIGLETT, 3, +1
+ ai_energy DUGTRIO, 4, +0
+ ai_energy GEODUDE, 2, +1
+ ai_energy GRAVELER, 3, +0
+ ai_energy GOLEM, 4, +0
+ ai_energy ONIX, 2, -1
+ ai_energy RHYHORN, 3, +0
db $00
-Data_14f5e: ; 14f5e (5:4f5e)
+.list_prize ; 14f5e (5:4f5e)
db ENERGY_REMOVAL
db RHYHORN
db $00
-Func_14f61: ; 14f61 (5:4f61)
- ld hl, wcda8
- ld de, Data_14f5e
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_14f3b
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_14f40
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_14f40
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_14f48
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 14f61 (5:4f61)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x14f8f
-PointerTable_14f8f: ; 14f8f (5:4f8f)
- dw Func_14f9b
- dw Func_14f9b
- dw Func_14f9f
- dw Func_14fb0
- dw Func_14fb4
- dw Func_14fb8
+AIActionTable_GoGoRainDance: ; 14f8f (5:4f8f)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_14f9b: ; 14f9b (5:4f9b)
- call _AIMainTurnLogic
+.do_turn ; 14f9b (5:4f9b)
+ call AIMainTurnLogic
ret
; 0x14f9f
-Func_14f9f: ; 14f9f (5:4f9f)
+.start_duel ; 14f9f (5:4f9f)
call InitAIDuelVars
- call Func_14feb
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -1190,111 +1100,85 @@ Func_14f9f: ; 14f9f (5:4f9f)
ret
; 0x14fb0
-Func_14fb0: ; 14fb0 (5:4fb0)
+.forced_switch ; 14fb0 (5:4fb0)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14fb4
-Func_14fb4: ; 14fb4 (5:4fb4)
+.ko_switch ; 14fb4 (5:4fb4)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x14fb8
-Func_14fb8: ; 14fb8 (5:4fb8)
- call _AIPickPrizeCards
+.take_prize ; 14fb8 (5:4fb8)
+ call AIPickPrizeCards
ret
; 0x14fbc
-Data_14fbc: ; 14fbc (5:4fbc)
+.list_arena ; 14fbc (5:4fbc)
db LAPRAS
db HORSEA
db GOLDEEN
db SQUIRTLE
db $00
-Data_14fc1: ; 14fc1 (5:4fc1)
+.list_bench ; 14fc1 (5:4fc1)
db SQUIRTLE
db HORSEA
db GOLDEEN
db LAPRAS
db $00
-Data_14fc6: ; 14fc6 (5:4fc6)
- airetreat SQUIRTLE, -3
- airetreat WARTORTLE, -2
- airetreat HORSEA, -1
+.list_retreat ; 14fc6 (5:4fc6)
+ ai_retreat SQUIRTLE, -3
+ ai_retreat WARTORTLE, -2
+ ai_retreat HORSEA, -1
db $00
-Data_14fcd: ; 14fcd (5:4fcd)
- aienergy SQUIRTLE, 2, +0
- aienergy WARTORTLE, 3, +0
- aienergy BLASTOISE, 5, +0
- aienergy GOLDEEN, 1, +0
- aienergy SEAKING, 2, +0
- aienergy HORSEA, 2, +0
- aienergy SEADRA, 3, +0
- aienergy LAPRAS, 3, +0
+.list_energy ; 14fcd (5:4fcd)
+ ai_energy SQUIRTLE, 2, +0
+ ai_energy WARTORTLE, 3, +0
+ ai_energy BLASTOISE, 5, +0
+ ai_energy GOLDEEN, 1, +0
+ ai_energy SEAKING, 2, +0
+ ai_energy HORSEA, 2, +0
+ ai_energy SEADRA, 3, +0
+ ai_energy LAPRAS, 3, +0
db $00
-Data_14fe6: ; 14fe6 (5:4fe6)
+.list_prize ; 14fe6 (5:4fe6)
db GAMBLER
db ENERGY_RETRIEVAL
db SUPER_ENERGY_RETRIEVAL
db BLASTOISE
db $00
-Func_14feb: ; 14feb (5:4feb)
- ld hl, wcda8
- ld de, Data_14fe6
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_14fbc
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_14fc1
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_14fc1
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_14fcd
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 14feb (5:4feb)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x15019
-PointerTable_15019: ; 15019 (5:5019)
- dw Func_15025
- dw Func_15025
- dw Func_15029
- dw Func_1503a
- dw Func_1503e
- dw Func_15042
+AIActionTable_ZappingSelfdestruct: ; 15019 (5:5019)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_15025: ; 15025 (5:5025)
- call _AIMainTurnLogic
+.do_turn ; 15025 (5:5025)
+ call AIMainTurnLogic
ret
; 0x15029
-Func_15029: ; 15029 (5:5029)
+.start_duel ; 15029 (5:5029)
call InitAIDuelVars
- call Func_1506d
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -1302,22 +1186,22 @@ Func_15029: ; 15029 (5:5029)
ret
; 0x1503a
-Func_1503a: ; 1503a (5:503a)
+.forced_switch ; 1503a (5:503a)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x1503e
-Func_1503e: ; 1503e (5:503e)
+.ko_switch ; 1503e (5:503e)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x15042
-Func_15042: ; 15042 (5:5042)
- call _AIPickPrizeCards
+.take_prize ; 15042 (5:5042)
+ call AIPickPrizeCards
ret
; 0x15046
-Data_15046: ; 15046 (5:5046)
+.list_arena ; 15046 (5:5046)
db KANGASKHAN
db ELECTABUZZ2
db TAUROS
@@ -1325,7 +1209,7 @@ Data_15046: ; 15046 (5:5046)
db VOLTORB
db $00
-Data_1504c: ; 1504c (5:504c)
+.list_bench ; 1504c (5:504c)
db MAGNEMITE1
db VOLTORB
db ELECTABUZZ2
@@ -1333,76 +1217,50 @@ Data_1504c: ; 1504c (5:504c)
db KANGASKHAN
db $00
-Data_15052: ; 15052 (5:5052)
- airetreat VOLTORB, -1
+.list_retreat ; 15052 (5:5052)
+ ai_retreat VOLTORB, -1
db $00
-Data_15055: ; 15055 (5:5055)
- aienergy MAGNEMITE1, 3, +1
- aienergy MAGNETON1, 4, +0
- aienergy VOLTORB, 3, +1
- aienergy ELECTRODE1, 3, +0
- aienergy ELECTABUZZ2, 1, +0
- aienergy KANGASKHAN, 2, -2
- aienergy TAUROS, 3, +0
+.list_energy ; 15055 (5:5055)
+ ai_energy MAGNEMITE1, 3, +1
+ ai_energy MAGNETON1, 4, +0
+ ai_energy VOLTORB, 3, +1
+ ai_energy ELECTRODE1, 3, +0
+ ai_energy ELECTABUZZ2, 1, +0
+ ai_energy KANGASKHAN, 2, -2
+ ai_energy TAUROS, 3, +0
db $00
-Data_1506b: ; 1506b (5:506b)
+.list_prize ; 1506b (5:506b)
db KANGASKHAN
db $00
-Func_1506d: ; 1506d (5:506d)
- ld hl, wcda8
- ld de, Data_1506b
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_15046
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_1504c
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_1504c
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_15055
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 1506d (5:506d)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x1509b
-PointerTable_1509b: ; 1509b (5:509b)
- dw Func_150a7
- dw Func_150a7
- dw Func_150ab
- dw Func_150bc
- dw Func_150c0
- dw Func_150c4
+AIActionTable_FlowerPower: ; 1509b (5:509b)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_150a7: ; 150a7 (5:50a7)
- call _AIMainTurnLogic
+.do_turn ; 150a7 (5:50a7)
+ call AIMainTurnLogic
ret
; 0x150ab
-Func_150ab: ; 150ab (5:50ab)
+.start_duel ; 150ab (5:50ab)
call InitAIDuelVars
- call Func_150f4
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -1410,107 +1268,81 @@ Func_150ab: ; 150ab (5:50ab)
ret
; 0x150bc
-Func_150bc: ; 150bc (5:50bc)
+.forced_switch ; 150bc (5:50bc)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x150c0
-Func_150c0: ; 150c0 (5:50c0)
+.ko_switch ; 150c0 (5:50c0)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x150c4
-Func_150c4: ; 150c4 (5:50c4)
- call _AIPickPrizeCards
+.take_prize ; 150c4 (5:50c4)
+ call AIPickPrizeCards
ret
; 0x150c8
-Data_150c8 ; 150c8 (5:50c8)
+.list_arena ; 150c8 (5:50c8)
db ODDISH
db EXEGGCUTE
db BULBASAUR
db $00
-Data_150cc ; 150cc (5:50cc)
+.list_bench ; 150cc (5:50cc)
db BULBASAUR
db EXEGGCUTE
db ODDISH
db $00
-Data_150cf ; 150cf (5:50cf)
- airetreat GLOOM, -2
- airetreat VILEPLUME, -2
- airetreat BULBASAUR, -2
- airetreat IVYSAUR, -2
+.list_retreat ; 150cf (5:50cf)
+ ai_retreat GLOOM, -2
+ ai_retreat VILEPLUME, -2
+ ai_retreat BULBASAUR, -2
+ ai_retreat IVYSAUR, -2
db $00
-Data_150d9 ; 150d9 (5:50d9)
- aienergy BULBASAUR, 3, +0
- aienergy IVYSAUR, 4, +0
- aienergy VENUSAUR2, 4, +0
- aienergy ODDISH, 2, +0
- aienergy GLOOM, 3, -1
- aienergy VILEPLUME, 3, -1
- aienergy EXEGGCUTE, 3, +0
- aienergy EXEGGUTOR, 22, +0
+.list_energy ; 150d9 (5:50d9)
+ ai_energy BULBASAUR, 3, +0
+ ai_energy IVYSAUR, 4, +0
+ ai_energy VENUSAUR2, 4, +0
+ ai_energy ODDISH, 2, +0
+ ai_energy GLOOM, 3, -1
+ ai_energy VILEPLUME, 3, -1
+ ai_energy EXEGGCUTE, 3, +0
+ ai_energy EXEGGUTOR, 22, +0
db $00
-Data_150f2 ; 150f2 (5:50f2)
+.list_prize ; 150f2 (5:50f2)
db VENUSAUR2
db $00
-Func_150f4: ; 150f4 (5:50f4)
- ld hl, wcda8
- ld de, Data_150f2
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_150c8
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_150cc
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_150cc
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_150d9
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 150f4 (5:50f4)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x15122
-PointerTable_15122: ; 15122 (5:5122)
- dw Func_1512e
- dw Func_1512e
- dw Func_15132
- dw Func_15143
- dw Func_15147
- dw Func_1514b
+AIActionTable_StrangePsyshock: ; 15122 (5:5122)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_1512e: ; 1512e (5:512e)
- call _AIMainTurnLogic
+.do_turn ; 1512e (5:512e)
+ call AIMainTurnLogic
ret
; 0x15132
-Func_15132: ; 15132 (5:5132)
+.start_duel ; 15132 (5:5132)
call InitAIDuelVars
- call Func_1517f
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -1518,22 +1350,22 @@ Func_15132: ; 15132 (5:5132)
ret
; 0x15143
-Func_15143: ; 15143 (5:5143)
+.forced_switch ; 15143 (5:5143)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x15147
-Func_15147: ; 15147 (5:5147)
+.ko_switch ; 15147 (5:5147)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x1514b
-Func_1514b: ; 1514b (5:514b)
- call _AIPickPrizeCards
+.take_prize ; 1514b (5:514b)
+ call AIPickPrizeCards
ret
; 0x1514f
-Data_1514f: ; 1514f (5:514f)
+.list_arena ; 1514f (5:514f)
db KANGASKHAN
db CHANSEY
db SNORLAX
@@ -1541,7 +1373,7 @@ Data_1514f: ; 1514f (5:514f)
db ABRA
db $00
-Data_15155: ; 15155 (5:5155)
+.list_bench ; 15155 (5:5155)
db ABRA
db MR_MIME
db KANGASKHAN
@@ -1549,82 +1381,56 @@ Data_15155: ; 15155 (5:5155)
db CHANSEY
db $00
-Data_1515b: ; 1515b (5:515b)
- airetreat ABRA, -3
- airetreat SNORLAX, -3
- airetreat KANGASKHAN, -1
- airetreat CHANSEY, -1
+.list_retreat ; 1515b (5:515b)
+ ai_retreat ABRA, -3
+ ai_retreat SNORLAX, -3
+ ai_retreat KANGASKHAN, -1
+ ai_retreat CHANSEY, -1
db $00
-Data_15164 ; 15164 (5:5164)
- aienergy ABRA, 3, +1
- aienergy KADABRA, 3, +0
- aienergy ALAKAZAM, 3, +0
- aienergy MR_MIME, 2, +0
- aienergy CHANSEY, 2, -2
- aienergy KANGASKHAN, 4, -2
- aienergy SNORLAX, 0, -8
+.list_energy ; 15164 (5:5164)
+ ai_energy ABRA, 3, +1
+ ai_energy KADABRA, 3, +0
+ ai_energy ALAKAZAM, 3, +0
+ ai_energy MR_MIME, 2, +0
+ ai_energy CHANSEY, 2, -2
+ ai_energy KANGASKHAN, 4, -2
+ ai_energy SNORLAX, 0, -8
db $00
-Data_1517a ; 1517a (5:517a)
+.list_prize ; 1517a (5:517a)
db GAMBLER
db MR_MIME
db ALAKAZAM
db SWITCH
db $00
-Func_1517f: ; 1517f (5:517f)
- ld hl, wcda8
- ld de, Data_1517a
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_1514f
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_15155
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_15155
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_15164
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 1517f (5:517f)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x151ad
-PointerTable_151ad: ; 151ad (5:51ad)
- dw Func_151b9
- dw Func_151b9
- dw Func_151bd
- dw Func_151ce
- dw Func_151d2
- dw Func_151d6
+AIActionTable_WondersOfScience: ; 151ad (5:51ad)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_151b9: ; 151b9 (5:51b9)
- call _AIMainTurnLogic
+.do_turn ; 151b9 (5:51b9)
+ call AIMainTurnLogic
ret
; 0x151bd
-Func_151bd: ; 151bd (5:51bd)
+.start_duel ; 151bd (5:51bd)
call InitAIDuelVars
- call Func_15204
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -1632,22 +1438,22 @@ Func_151bd: ; 151bd (5:51bd)
ret
; 0x151ce
-Func_151ce: ; 151ce (5:51ce)
+.forced_switch ; 151ce (5:51ce)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x151d2
-Func_151d2: ; 151d2 (5:51d2)
+.ko_switch ; 151d2 (5:51d2)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x151d6
-Func_151d6: ; 151d6 (5:51d6)
- call _AIPickPrizeCards
+.take_prize ; 151d6 (5:51d6)
+ call AIPickPrizeCards
ret
; 0x151da
-Data_151da: ; 151da (5:51da)
+.list_arena ; 151da (5:51da)
db MEWTWO1
db MEWTWO3
db MEWTWO2
@@ -1656,7 +1462,7 @@ Data_151da: ; 151da (5:51da)
db PORYGON
db $00
-Data_151e1: ; 151e1 (5:51e1)
+.list_bench ; 151e1 (5:51e1)
db GRIMER
db KOFFING
db MEWTWO3
@@ -1665,76 +1471,50 @@ Data_151e1: ; 151e1 (5:51e1)
db PORYGON
db $00
-Data_151e8: ; 151e8 (5:51e8)
+.list_retreat ; 151e8 (5:51e8)
db $00
-Data_151e9: ; 151e9 (5:51e9)
- aienergy GRIMER, 3, +0
- aienergy MUK, 4, +0
- aienergy KOFFING, 2, +0
- aienergy WEEZING, 3, +0
- aienergy MEWTWO1, 2, -1
- aienergy MEWTWO3, 2, -1
- aienergy MEWTWO2, 2, -1
- aienergy PORYGON, 2, -1
+.list_energy ; 151e9 (5:51e9)
+ ai_energy GRIMER, 3, +0
+ ai_energy MUK, 4, +0
+ ai_energy KOFFING, 2, +0
+ ai_energy WEEZING, 3, +0
+ ai_energy MEWTWO1, 2, -1
+ ai_energy MEWTWO3, 2, -1
+ ai_energy MEWTWO2, 2, -1
+ ai_energy PORYGON, 2, -1
db $00
-Data_15202: ; 15202 (5:5202)
+.list_prize ; 15202 (5:5202)
db MUK
db $00
-Func_15204: ; 15204 (5:5204)
- ld hl, wcda8
- ld de, Data_15202
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_151da
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_151e1
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_151e1
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_151e9
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 15204 (5:5204)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x15232
-PointerTable_15232: ; 15232 (5:52PointerTable_12)
- dw Func_1523e
- dw Func_1523e
- dw Func_15242
- dw Func_15253
- dw Func_15257
- dw Func_1525b
+AIActionTable_FireCharge: ; 15232 (5:5232)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_1523e: ; 1523e (5:523e)
- call _AIMainTurnLogic
+.do_turn ; 1523e (5:523e)
+ call AIMainTurnLogic
ret
; 0x15242
-Func_15242: ; 15242 (5:5242)
+.start_duel ; 15242 (5:5242)
call InitAIDuelVars
- call Func_1528f
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -1742,22 +1522,22 @@ Func_15242: ; 15242 (5:5242)
ret
; 0x15253
-Func_15253: ; 15253 (5:5253)
+.forced_switch ; 15253 (5:5253)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x15257
-Func_15257: ; 15257 (5:5257)
+.ko_switch ; 15257 (5:5257)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x1525b
-Func_1525b: ; 1525b (5:525b)
- call _AIPickPrizeCards
+.take_prize ; 1525b (5:525b)
+ call AIPickPrizeCards
ret
; 0x1525f
-Data_1525f: ; 1525f (5:525f)
+.list_arena ; 1525f (5:525f)
db JIGGLYPUFF3
db CHANSEY
db TAUROS
@@ -1766,7 +1546,7 @@ Data_1525f: ; 1525f (5:525f)
db GROWLITHE
db $00
-Data_15266: ; 15266 (5:5266)
+.list_bench ; 15266 (5:5266)
db JIGGLYPUFF3
db CHANSEY
db GROWLITHE
@@ -1775,79 +1555,53 @@ Data_15266: ; 15266 (5:5266)
db TAUROS
db $00
-Data_1526e: ; 1526e (5:526e)
- airetreat JIGGLYPUFF1, -1
- airetreat CHANSEY, -1
- airetreat GROWLITHE, -1
+.list_retreat ; 1526e (5:526e)
+ ai_retreat JIGGLYPUFF1, -1
+ ai_retreat CHANSEY, -1
+ ai_retreat GROWLITHE, -1
db $00
-Data_15274: ; 15274 (5:5274)
- aienergy GROWLITHE, 3, +0
- aienergy ARCANINE2, 4, +0
- aienergy MAGMAR1, 3, +0
- aienergy JIGGLYPUFF1, 3, +0
- aienergy JIGGLYPUFF3, 2, +0
- aienergy WIGGLYTUFF, 3, +0
- aienergy CHANSEY, 4, +0
- aienergy TAUROS, 3, +0
+.list_energy ; 15274 (5:5274)
+ ai_energy GROWLITHE, 3, +0
+ ai_energy ARCANINE2, 4, +0
+ ai_energy MAGMAR1, 3, +0
+ ai_energy JIGGLYPUFF1, 3, +0
+ ai_energy JIGGLYPUFF3, 2, +0
+ ai_energy WIGGLYTUFF, 3, +0
+ ai_energy CHANSEY, 4, +0
+ ai_energy TAUROS, 3, +0
db $00
-Data_1528d: ; 1528d (5:528d)
+.list_prize ; 1528d (5:528d)
db GAMBLER
db $00
-Func_1528f: ; 1528f (5:528f)
- ld hl, wcda8
- ld de, Data_1528d
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_1525f
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_15266
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_15266
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_15274
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 1528f (5:528f)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x152bd
-PointerTable_152bd: ; 152bd (5:52bd)
- dw Func_152c9
- dw Func_152c9
- dw Func_152cd
- dw Func_152de
- dw Func_152e2
- dw Func_152e6
+AIActionTable_ImRonald: ; 152bd (5:52bd)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_152c9: ; 152c9 (5:52c9)
- call _AIMainTurnLogic
+.do_turn ; 152c9 (5:52c9)
+ call AIMainTurnLogic
ret
; 0x152cd
-Func_152cd: ; 152cd (5:52cd)
+.start_duel ; 152cd (5:52cd)
call InitAIDuelVars
- call Func_1531d
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -1855,22 +1609,22 @@ Func_152cd: ; 152cd (5:52cd)
ret
; 0x152de
-Func_152de: ; 152de (5:52de)
+.forced_switch ; 152de (5:52de)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x152e2
-Func_152e2: ; 152e2 (5:52e2)
+.ko_switch ; 152e2 (5:52e2)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x152e6
-Func_152e6: ; 152e6 (5:52e6)
- call _AIPickPrizeCards
+.take_prize ; 152e6 (5:52e6)
+ call AIPickPrizeCards
ret
; 0x152ea
-Data_152ea: ; 152ea (5:52ea)
+.list_arena ; 152ea (5:52ea)
db LAPRAS
db SEEL
db CHARMANDER
@@ -1879,7 +1633,7 @@ Data_152ea: ; 152ea (5:52ea)
db GROWLITHE
db $00
-Data_152f1: ; 152f1 (5:52f1)
+.list_bench ; 152f1 (5:52f1)
db CHARMANDER
db SQUIRTLE
db SEEL
@@ -1888,79 +1642,53 @@ Data_152f1: ; 152f1 (5:52f1)
db LAPRAS
db $00
-Data_152f8: ; 152f8 (5:52f8)
+.list_retreat ; 152f8 (5:52f8)
db $00
-Data_152f9: ; 152f9 (5:52f9)
- aienergy CHARMANDER, 3, +0
- aienergy CHARMELEON, 5, +0
- aienergy GROWLITHE, 2, +0
- aienergy ARCANINE2, 4, +0
- aienergy SQUIRTLE, 2, +0
- aienergy WARTORTLE, 3, +0
- aienergy SEEL, 3, +0
- aienergy DEWGONG, 4, +0
- aienergy LAPRAS, 3, +0
- aienergy CUBONE, 3, +0
- aienergy MAROWAK1, 3, +0
+.list_energy ; 152f9 (5:52f9)
+ ai_energy CHARMANDER, 3, +0
+ ai_energy CHARMELEON, 5, +0
+ ai_energy GROWLITHE, 2, +0
+ ai_energy ARCANINE2, 4, +0
+ ai_energy SQUIRTLE, 2, +0
+ ai_energy WARTORTLE, 3, +0
+ ai_energy SEEL, 3, +0
+ ai_energy DEWGONG, 4, +0
+ ai_energy LAPRAS, 3, +0
+ ai_energy CUBONE, 3, +0
+ ai_energy MAROWAK1, 3, +0
db $00
-Data_1531b: ; 1531b (5:531b)
+.list_prize ; 1531b (5:531b)
db LAPRAS
db $00
-Func_1531d: ; 1531d (5:531d)
- ld hl, wcda8
- ld de, Data_1531b
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_152ea
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_152f1
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_152f1
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_152f9
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 1531d (5:531d)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x1534b
-PointerTable_1534b: ; 1534b (5:534b)
- dw Func_15357
- dw Func_15357
- dw Func_1535b
- dw Func_1536c
- dw Func_15370
- dw Func_15374
+AIActionTable_PowerfulRonald: ; 1534b (5:534b)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_15357: ; 15357 (5:5357)
- call _AIMainTurnLogic
+.do_turn ; 15357 (5:5357)
+ call AIMainTurnLogic
ret
; 0x1535b
-Func_1535b: ; 1535b (5:535b)
+.start_duel ; 1535b (5:535b)
call InitAIDuelVars
- call Func_153ba
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -1968,22 +1696,22 @@ Func_1535b: ; 1535b (5:535b)
ret
; 0x1536c
-Func_1536c: ; 1536c (5:536c)
+.forced_switch ; 1536c (5:536c)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x15370
-Func_15370: ; 15370 (5:5370)
+.ko_switch ; 15370 (5:5370)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x15374
-Func_15374: ; 15374 (5:5374)
- call _AIPickPrizeCards
+.take_prize ; 15374 (5:5374)
+ call AIPickPrizeCards
ret
; 0x15378
-Data_15378: ; 15378 (5:5378)
+.list_arena ; 15378 (5:5378)
db KANGASKHAN
db ELECTABUZZ2
db HITMONCHAN
@@ -1996,7 +1724,7 @@ Data_15378: ; 15378 (5:5378)
db DODUO
db $00
-Data_15383: ; 15383 (5:5383)
+.list_bench ; 15383 (5:5383)
db KANGASKHAN
db HITMONLEE
db HITMONCHAN
@@ -2009,83 +1737,57 @@ Data_15383: ; 15383 (5:5383)
db LICKITUNG
db $00
-Data_1538e: ; 1538e (5:538e)
- airetreat KANGASKHAN, -1
- airetreat DODUO, -1
- airetreat DODRIO, -1
+.list_retreat ; 1538e (5:538e)
+ ai_retreat KANGASKHAN, -1
+ ai_retreat DODUO, -1
+ ai_retreat DODRIO, -1
db $00
-Data_15395: ; 15395 (5:5395)
- aienergy ELECTABUZZ2, 2, +1
- aienergy HITMONLEE, 3, +1
- aienergy HITMONCHAN, 3, +1
- aienergy MR_MIME, 2, +0
- aienergy JYNX, 3, +0
- aienergy MEWTWO1, 2, +0
- aienergy DODUO, 3, -1
- aienergy DODRIO, 3, -1
- aienergy LICKITUNG, 2, +0
- aienergy KANGASKHAN, 4, -1
- aienergy TAUROS, 3, +0
+.list_energy ; 15395 (5:5395)
+ ai_energy ELECTABUZZ2, 2, +1
+ ai_energy HITMONLEE, 3, +1
+ ai_energy HITMONCHAN, 3, +1
+ ai_energy MR_MIME, 2, +0
+ ai_energy JYNX, 3, +0
+ ai_energy MEWTWO1, 2, +0
+ ai_energy DODUO, 3, -1
+ ai_energy DODRIO, 3, -1
+ ai_energy LICKITUNG, 2, +0
+ ai_energy KANGASKHAN, 4, -1
+ ai_energy TAUROS, 3, +0
db $00
-Data_153b7: ; 153b7 (5:53b7)
+.list_prize ; 153b7 (5:53b7)
db GAMBLER
db ENERGY_REMOVAL
db $00
-Func_153ba: ; 153ba (5:53ba)
- ld hl, wcda8
- ld de, Data_153b7
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_15378
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_15383
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_15383
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_15395
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 153ba (5:53ba)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x153e8
-PointerTable_153e8: ; 153e8 (5:53e8)
- dw Func_153f4
- dw Func_153f4
- dw Func_153f8
- dw Func_15409
- dw Func_1540d
- dw Func_15411
+AIActionTable_InvincibleRonald: ; 153e8 (5:53e8)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_153f4: ; 153f4 (5:53f4)
- call _AIMainTurnLogic
+.do_turn ; 153f4 (5:53f4)
+ call AIMainTurnLogic
ret
; 0x153f8
-Func_153f8: ; 153f8 (5:53f8)
+.start_duel ; 153f8 (5:53f8)
call InitAIDuelVars
- call Func_15441
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -2093,22 +1795,22 @@ Func_153f8: ; 153f8 (5:53f8)
ret
; 0x15409
-Func_15409: ; 15409 (5:5409)
+.forced_switch ; 15409 (5:5409)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x1540d
-Func_1540d: ; 1540d (5:540d)
+.ko_switch ; 1540d (5:540d)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x15411
-Func_15411: ; 15411 (5:5411)
- call _AIPickPrizeCards
+.take_prize ; 15411 (5:5411)
+ call AIPickPrizeCards
ret
; 0x15415
-Data_15415: ; 15415 (5:5415)
+.list_arena ; 15415 (5:5415)
db KANGASKHAN
db MAGMAR2
db CHANSEY
@@ -2117,7 +1819,7 @@ Data_15415: ; 15415 (5:5415)
db GRIMER
db $00
-Data_1541c: ; 1541c (5:541c)
+.list_bench ; 1541c (5:541c)
db GRIMER
db SCYTHER
db GEODUDE
@@ -2126,77 +1828,51 @@ Data_1541c: ; 1541c (5:541c)
db KANGASKHAN
db $00
-Data_15423: ; 15423 (5:5423)
- airetreat GRIMER, -1
+.list_retreat ; 15423 (5:5423)
+ ai_retreat GRIMER, -1
db $00
-Data_15426: ; 15426 (5:5426)
- aienergy GRIMER, 1, -1
- aienergy MUK, 3, -1
- aienergy SCYTHER, 4, +1
- aienergy MAGMAR2, 2, +0
- aienergy GEODUDE, 2, +0
- aienergy GRAVELER, 3, +0
- aienergy CHANSEY, 4, +0
- aienergy KANGASKHAN, 4, -1
+.list_energy ; 15426 (5:5426)
+ ai_energy GRIMER, 1, -1
+ ai_energy MUK, 3, -1
+ ai_energy SCYTHER, 4, +1
+ ai_energy MAGMAR2, 2, +0
+ ai_energy GEODUDE, 2, +0
+ ai_energy GRAVELER, 3, +0
+ ai_energy CHANSEY, 4, +0
+ ai_energy KANGASKHAN, 4, -1
db $00
-Data_1543f: ; 1543f (5:543f)
+.list_prize ; 1543f (5:543f)
db GAMBLER
db $00
-Func_15441: ; 15441 (5:5441)
- ld hl, wcda8
- ld de, Data_1543f
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_15415
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_1541c
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_1541c
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_15426
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 15441 (5:5441)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_bench
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x1546f
-PointerTable_1546f: ; 1546f (5:546f)
- dw Func_1547b
- dw Func_1547b
- dw Func_1547f
- dw Func_15490
- dw Func_15494
- dw Func_15498
+AIActionTable_LegendaryRonald: ; 1546f (5:546f)
+ dw .do_turn ; unused
+ dw .do_turn
+ dw .start_duel
+ dw .forced_switch
+ dw .ko_switch
+ dw .take_prize
-Func_1547b: ; 1547b (5:547b)
- call Func_15507
+.do_turn ; 1547b (5:547b)
+ call AIDoTurn_LegendaryRonald
ret
; 0x1547f
-Func_1547f: ; 1547f (5:547f)
+.start_duel ; 1547f (5:547f)
call InitAIDuelVars
- call Func_154d9
+ call .store_list_pointers
call SetUpBossStartingHandAndDeck
call TrySetUpBossStartingPlayArea
ret nc
@@ -2204,22 +1880,22 @@ Func_1547f: ; 1547f (5:547f)
ret
; 0x15490
-Func_15490: ; 15490 (5:5490)
+.forced_switch ; 15490 (5:5490)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x15494
-Func_15494: ; 15494 (5:5494)
+.ko_switch ; 15494 (5:5494)
call AIDecideBenchPokemonToSwitchTo
ret
; 0x15498
-Func_15498: ; 15498 (5:5498)
- call _AIPickPrizeCards
+.take_prize ; 15498 (5:5498)
+ call AIPickPrizeCards
ret
; 0x1549c
-Data_1549c: ; 1549c (5:549c)
+.list_arena ; 1549c (5:549c)
db KANGASKHAN
db DRATINI
db EEVEE
@@ -2228,13 +1904,13 @@ Data_1549c: ; 1549c (5:549c)
db MOLTRES2
db $00
-Data_154a3: ; 154a3 (5:54a3)
+.list_bench ; 154a3 (5:54a3)
db KANGASKHAN
db DRATINI
db EEVEE
db $00
-Data_154a7: ; 154a7 (5:54a7)
+.list_play_hand ; 154a7 (5:54a7)
db MOLTRES2
db ZAPDOS3
db KANGASKHAN
@@ -2243,25 +1919,25 @@ Data_154a7: ; 154a7 (5:54a7)
db ARTICUNO2
db $00
-Data_154ae: ; 154ae (5:54ae)
- airetreat EEVEE, -2
+.list_retreat ; 154ae (5:54ae)
+ ai_retreat EEVEE, -2
db $00
-Data_154b1: ; 154b1 (5:54b1)
- aienergy FLAREON1, 3, +0
- aienergy MOLTRES2, 3, +0
- aienergy VAPOREON1, 3, +0
- aienergy ARTICUNO2, 0, -8
- aienergy JOLTEON1, 4, +0
- aienergy ZAPDOS3, 0, -8
- aienergy KANGASKHAN, 4, -1
- aienergy EEVEE, 3, +0
- aienergy DRATINI, 3, +0
- aienergy DRAGONAIR, 4, +0
- aienergy DRAGONITE1, 3, +0
+.list_energy ; 154b1 (5:54b1)
+ ai_energy FLAREON1, 3, +0
+ ai_energy MOLTRES2, 3, +0
+ ai_energy VAPOREON1, 3, +0
+ ai_energy ARTICUNO2, 0, -8
+ ai_energy JOLTEON1, 4, +0
+ ai_energy ZAPDOS3, 0, -8
+ ai_energy KANGASKHAN, 4, -1
+ ai_energy EEVEE, 3, +0
+ ai_energy DRATINI, 3, +0
+ ai_energy DRAGONAIR, 4, +0
+ ai_energy DRAGONITE1, 3, +0
db $00
-Data_154d3: ; 154d3 (5:54d3)
+.list_prize ; 154d3 (5:54d3)
db MOLTRES2
db ARTICUNO2
db ZAPDOS3
@@ -2269,85 +1945,71 @@ Data_154d3: ; 154d3 (5:54d3)
db GAMBLER
db $00
-Func_154d9: ; 154d9 (5:54d9)
- ld hl, wcda8
- ld de, Data_154d3
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdaa
- ld de, Data_1549c
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdac
- ld de, Data_154a3
- ld [hl], e
- inc hl
- ld [hl], d
-
- ld hl, wcdae
- ld de, Data_154a7
- ld [hl], e
- inc hl
- ld [hl], d
-
-; missing wcdb0
-
- ld hl, wcdb2
- ld de, Data_154b1
- ld [hl], e
- inc hl
- ld [hl], d
-
+.store_list_pointers ; 154d9 (5:54d9)
+ store_list_pointer wcda8, .list_prize
+ store_list_pointer wcdaa, .list_arena
+ store_list_pointer wcdac, .list_bench
+ store_list_pointer wcdae, .list_play_hand
+ ; missing store_list_pointer wcdb0, .list_retreat
+ store_list_pointer wcdb2, .list_energy
ret
; 0x15507
-Func_15507: ; 15507 (5:5507)
+AIDoTurn_LegendaryRonald: ; 15507 (5:5507)
+; initialize variables
call InitAITurnVars
+; process Trainer cards
ld a, AI_TRAINER_CARD_PHASE_01
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_02
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_04
call AIProcessHandTrainerCards
- ld a, $ef
+
+; check if AI can play Moltres2
+; from hand and if so, play it.
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
- cp $06
- jr nc, .asm_15540
- ld a, $ba
+ cp MAX_PLAY_AREA_POKEMON
+ jr nc, .skip_moltres_1 ; skip if bench is full
+ ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
call GetTurnDuelistVariable
- cp $33
- jr nc, .asm_15540
- ld a, $27
+ cp DECK_SIZE - 9
+ jr nc, .skip_moltres_1 ; skip if cards in deck <= 9
+ ld a, MUK
call CountPokemonIDInBothPlayAreas
- jr c, .asm_15540
- ld a, $40
+ jr c, .skip_moltres_1 ; skip if Muk in play
+ ld a, MOLTRES2
call LookForCardIDInHandList_Bank5
- jr nc, .asm_15540
+ jr nc, .skip_moltres_1 ; skip if no Moltres2 in hand
ldh [hTemp_ffa0], a
ld a, OPPACTION_PLAY_BASIC_PKMN
bank1call AIMakeDecision
-.asm_15540
+
+.skip_moltres_1
+; play Pokemon from hand
call AIDecidePlayPokemonCard
- ret c
+ ret c ; return if turn ended
+; process Trainer cards
ld a, AI_TRAINER_CARD_PHASE_05
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_07
call AIProcessHandTrainerCards
- call Func_14786
+ call AIProcessRetreat
ld a, AI_TRAINER_CARD_PHASE_10
call AIProcessHandTrainerCards
+; play Energy card if possible
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .asm_1555f
+ jr nz, .skip_attach_energy_1
call AIProcessAndTryToPlayEnergy
-.asm_1555f
+.skip_attach_energy_1
+; try playing Pokemon cards from hand again
call AIDecidePlayPokemonCard
- ret c
+ ret c ; return if turn ended
ld a, AI_TRAINER_CARD_PHASE_15
+; if used Professor Oak, process new hand
+; if not, then proceed to attack.
call AIProcessHandTrainerCards
ld a, [wPreviousAIFlags]
and AI_FLAG_USED_PROFESSOR_OAK
@@ -2358,43 +2020,49 @@ Func_15507: ; 15507 (5:5507)
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_04
call AIProcessHandTrainerCards
- ld a, $ef
+
+; check if AI can play Moltres2
+; from hand and if so, play it.
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
call GetTurnDuelistVariable
- cp $06
- jr nc, .asm_155a5
- ld a, $ba
+ cp MAX_PLAY_AREA_POKEMON
+ jr nc, .skip_moltres_2 ; skip if bench is full
+ ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
call GetTurnDuelistVariable
- cp $33
- jr nc, .asm_155a5
- ld a, $27
+ cp DECK_SIZE - 9
+ jr nc, .skip_moltres_2 ; skip if cards in deck <= 9
+ ld a, MUK
call CountPokemonIDInBothPlayAreas
- jr c, .asm_155a5
- ld a, $40
+ jr c, .skip_moltres_2 ; skip if Muk in play
+ ld a, MOLTRES2
call LookForCardIDInHandList_Bank5
- jr nc, .asm_155a5
+ jr nc, .skip_moltres_2 ; skip if no Moltres2 in hand
ldh [hTemp_ffa0], a
ld a, OPPACTION_PLAY_BASIC_PKMN
bank1call AIMakeDecision
-.asm_155a5
+
+.skip_moltres_2
call AIDecidePlayPokemonCard
- ret c
+ ret c ; return if turn ended
ld a, AI_TRAINER_CARD_PHASE_05
call AIProcessHandTrainerCards
ld a, AI_TRAINER_CARD_PHASE_07
call AIProcessHandTrainerCards
- call Func_14786
+ call AIProcessRetreat
ld a, AI_TRAINER_CARD_PHASE_10
call AIProcessHandTrainerCards
ld a, [wAlreadyPlayedEnergy]
or a
- jr nz, .asm_155c4
+ jr nz, .skip_attach_energy_2
call AIProcessAndTryToPlayEnergy
-.asm_155c4
+.skip_attach_energy_2
call AIDecidePlayPokemonCard
- ret c
+ ret c ; return if turn ended
.try_attack
+; attack if possible, if not,
+; finish turn without attacking.
call AIProcessAndTryToUseAttack
- ret c
+ ret c ; return if turn ended
ld a, OPPACTION_FINISH_NO_ATTACK
bank1call AIMakeDecision
ret
diff --git a/src/wram.asm b/src/wram.asm
index 5614b54..e4bf0b2 100644
--- a/src/wram.asm
+++ b/src/wram.asm
@@ -1290,7 +1290,9 @@ wAIOpponentPrizeCount:: ; cdd3
wTempCardIDToLook:: ; cdd4
ds $1
-wcdd5:: ; cdd5
+; when AI decides which Bench Pokemon to switch to
+; it stores it Play Area location here.
+wAIPlayAreaCardToSwitch:: ; cdd5
ds $1
; the index of attack chosen by AI
@@ -1391,7 +1393,10 @@ wce01:: ; ce01
wAIMoveIsNonDamaging:: ; ce02
ds $1
-wce03:: ; ce03
+; whether AI already retreated this turn or not.
+; - $0 has not retreated;
+; - $1 has retreated.
+wAIRetreatedThisTurn:: ; ce03
ds $1
; used by AI to store information of Venusaur2