From c4183f69cd8cb0fe1482cac8487efaf68160a411 Mon Sep 17 00:00:00 2001 From: ElectroDeoxys Date: Thu, 7 May 2020 15:42:13 +0100 Subject: Deck AI macros and tidying --- src/constants/duel_constants.asm | 17 +- src/data/deck_ai_pointers.asm | 106 +-- src/engine/bank05.asm | 238 ++--- src/engine/bank08.asm | 15 +- src/engine/deck_ai.asm | 1956 ++++++++++++++++---------------------- src/wram.asm | 9 +- 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 -- cgit v1.2.3