; AI logic used by general decks AIActionTable_GeneralDecks: dw .do_turn ; unused dw .do_turn dw .start_duel dw .forced_switch dw .ko_switch dw .take_prize .do_turn call AIMainTurnLogic ret .start_duel call InitAIDuelVars call AIPlayInitialBasicCards ret .forced_switch call AIDecideBenchPokemonToSwitchTo ret .ko_switch call AIDecideBenchPokemonToSwitchTo ret .take_prize: call AIPickPrizeCards ret ; handle AI routines for a whole turn AIMainTurnLogic: ; 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 ; 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 ; 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 call AIProcessHandTrainerCards ld a, AI_TRAINER_CARD_PHASE_07 call AIProcessHandTrainerCards ld a, AI_TRAINER_CARD_PHASE_08 call AIProcessHandTrainerCards 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, .skip_energy_attach_1 call AIProcessAndTryToPlayEnergy .skip_energy_attach_1 ; play Pokemon from hand again call AIDecidePlayPokemonCard ; handle Pkmn Powers again farcall HandleAIDamageSwap farcall HandleAIPkmnPowers ret c ; return if turn ended farcall HandleAIGoGoRainDanceEnergy 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 ld a, AI_TRAINER_CARD_PHASE_01 call AIProcessHandTrainerCards 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 call AIDecidePlayPokemonCard ret c ; return if turn ended ld a, AI_TRAINER_CARD_PHASE_05 call AIProcessHandTrainerCards ld a, AI_TRAINER_CARD_PHASE_06 call AIProcessHandTrainerCards ld a, AI_TRAINER_CARD_PHASE_07 call AIProcessHandTrainerCards ld a, AI_TRAINER_CARD_PHASE_08 call AIProcessHandTrainerCards 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, .skip_energy_attach_2 call AIProcessAndTryToPlayEnergy .skip_energy_attach_2 call AIDecidePlayPokemonCard farcall HandleAIDamageSwap farcall HandleAIPkmnPowers ret c ; return if turn ended farcall HandleAIGoGoRainDanceEnergy 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, 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 bank1call AIMakeDecision ret ; handles AI retreating logic AIProcessRetreat: ld a, [wAIRetreatedThisTurn] or a ret nz ; return, already retreated this turn call AIDecideWhetherToRetreat ret nc ; return if not retreating call AIDecideBenchPokemonToSwitchTo ret c ; return if no Bench Pokemon ; store Play Area to retreat to and ; set wAIRetreatedThisTurn to true ld [wAIPlayAreaCardToSwitch], a ld a, $01 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 ; ... 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 ; 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