mirror of
https://github.com/pret/poketcg.git
synced 2026-09-29 22:09:26 -04:00
2100 lines
49 KiB
NASM
2100 lines
49 KiB
NASM
; AI card retreat score bonus
|
|
; when the AI retreat routine runs through the Bench to choose
|
|
; 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.
|
|
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 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.
|
|
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
|
|
|
|
; 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
|
|
|
|
; deck AIs are specialized to work on a given deck ID.
|
|
; they decide what happens during a turn, what Pokemon cards
|
|
; to pick during the start of the duel, etc.
|
|
; each of these have a pointer table with the following structure:
|
|
; dw .do_turn : never called;
|
|
;
|
|
; dw .do_turn : called to handle the main turn logic, from the beginning
|
|
; of the turn up to the attack (or lack thereof);
|
|
;
|
|
; dw .start_duel : called at the start of the duel to initialize some
|
|
; variables and optionally set up CPU hand and deck;
|
|
;
|
|
; dw .forced_switch : logic to determine what Pokemon to pick when there's
|
|
; an effect that forces AI to switch to Bench card;
|
|
;
|
|
; dw .ko_switch : logic for picking which card to use after a KO;
|
|
;
|
|
; dw .take_prize : logic to decide which prize card to pick.
|
|
|
|
; optionally, decks can also declare card lists that will add
|
|
; more specialized logic during various generic AI routines,
|
|
; and read during the .start_duel routines.
|
|
; the pointers to these lists are stored in memory:
|
|
; wAICardListAvoidPrize : list of cards to avoid being placed as prize;
|
|
; wAICardListArenaPriority : priority list of Arena card at duel start;
|
|
; wAICardListBenchPriority : priority list of Bench cards at duel start;
|
|
; wAICardListPlayFromHandPriority : priority list of cards to play from hand;
|
|
; wAICardListRetreatBonus : scores given to certain cards for retreat;
|
|
; wAICardListEnergyBonus : max number of energy cards and card scores.
|
|
|
|
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
|
|
|
|
.start_duel ; 148ec (5:48ec)
|
|
call InitAIDuelVars
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x148f3
|
|
|
|
.forced_switch ; 148f3 (5:48f3)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x148f7
|
|
|
|
.ko_switch ; 148f7 (5:48f7)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x148fb
|
|
|
|
.take_prize ; 148fb (5:48fb)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x148ff
|
|
|
|
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 ; 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
|
|
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
|
|
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_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 ; return if turn ended
|
|
ld a, OPPACTION_FINISH_NO_ATTACK
|
|
bank1call AIMakeDecision
|
|
ret
|
|
; 0x149e8
|
|
|
|
AIActionTable_LegendaryMoltres: ; 149e8 (05:49e8)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 149f4 (5:49f4)
|
|
call AIDoTurn_LegendaryMoltres
|
|
ret
|
|
; 0x149f8
|
|
|
|
.start_duel ; 149f8 (5:49f8)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc ; Play Area set up was successful
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x14a09
|
|
|
|
.forced_switch ; 14a09 (5:4a09)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14a0d
|
|
|
|
.ko_switch ; 14a0d (5:4a0d)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14a11
|
|
|
|
.take_prize ; 14a11 (5:4a11)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x14a15
|
|
|
|
.list_arena ; 14a15 (5:4a15)
|
|
db MAGMAR2
|
|
db GROWLITHE
|
|
db VULPIX
|
|
db MAGMAR1
|
|
db MOLTRES1
|
|
db MOLTRES2
|
|
db $00
|
|
|
|
.list_bench ; 14a1c (5:4a1c)
|
|
db MOLTRES1
|
|
db VULPIX
|
|
db GROWLITHE
|
|
db MAGMAR2
|
|
db MAGMAR1
|
|
db $00
|
|
|
|
.list_play_hand ; 14a22 (5:4a22)
|
|
db MOLTRES2
|
|
db MOLTRES1
|
|
db VULPIX
|
|
db GROWLITHE
|
|
db MAGMAR2
|
|
db MAGMAR1
|
|
db $00
|
|
|
|
.list_retreat ; 14a29 (5:4a29)
|
|
ai_retreat GROWLITHE, -5
|
|
ai_retreat VULPIX, -5
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 14a47 (5:4a47)
|
|
db ENERGY_REMOVAL
|
|
db MOLTRES2
|
|
db $00
|
|
|
|
.store_list_pointers ; 14a4a (5:4a4a)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_play_hand
|
|
store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x14a81
|
|
|
|
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 and if so, play it.
|
|
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
|
|
call GetTurnDuelistVariable
|
|
cp MAX_PLAY_AREA_POKEMON
|
|
jr nc, .skip_moltres ; skip if bench is full
|
|
ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
|
|
call GetTurnDuelistVariable
|
|
cp DECK_SIZE - 9
|
|
jr nc, .skip_moltres ; skip if cards in deck <= 9
|
|
ld a, MUK
|
|
call CountPokemonIDInBothPlayAreas
|
|
jr c, .skip_moltres ; skip if Muk in play
|
|
ld a, MOLTRES2
|
|
call LookForCardIDInHandList_Bank5
|
|
jr nc, .skip_moltres ; skip if no Moltres2 in hand
|
|
ldh [hTemp_ffa0], a
|
|
ld a, OPPACTION_PLAY_BASIC_PKMN
|
|
bank1call AIMakeDecision
|
|
|
|
.skip_moltres
|
|
; play Pokemon from hand
|
|
call AIDecidePlayPokemonCard
|
|
ret c ; return if turn ended
|
|
; process Trainer cards
|
|
ld a, AI_TRAINER_CARD_PHASE_05
|
|
call AIProcessHandTrainerCards
|
|
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, .skip_attach_energy
|
|
|
|
; if Magmar2 is the Arena card and has no energy attached,
|
|
; try attaching an energy card to it from the hand.
|
|
; otherwise, run normal AI energy attach routine.
|
|
ld a, DUELVARS_ARENA_CARD
|
|
call GetTurnDuelistVariable
|
|
call GetCardIDFromDeckIndex
|
|
ld a, MAGMAR2
|
|
cp e
|
|
jr nz, .attach_normally
|
|
; Magmar2 is the Arena card
|
|
call CreateEnergyCardListFromHand
|
|
jr c, .skip_attach_energy
|
|
ld e, PLAY_AREA_ARENA
|
|
call CountNumberOfEnergyCardsAttached
|
|
or a
|
|
jr nz, .attach_normally
|
|
xor a ; PLAY_AREA_ARENA
|
|
ldh [hTempPlayAreaLocation_ff9d], a
|
|
call AITryToPlayEnergyCard
|
|
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
|
|
ld a, AI_TRAINER_CARD_PHASE_13
|
|
call AIProcessHandTrainerCards
|
|
|
|
.try_attack
|
|
; attack if possible, if not,
|
|
; finish turn without attacking.
|
|
call AIProcessAndTryToUseAttack
|
|
ret c
|
|
ld a, OPPACTION_FINISH_NO_ATTACK
|
|
bank1call AIMakeDecision
|
|
ret
|
|
; 0x14b0f
|
|
|
|
AIActionTable_LegendaryZapdos: ; 14b0f (05:4b0f)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 14b1b (5:4b1b)
|
|
call AIDoTurn_LegendaryZapdos
|
|
ret
|
|
; 0x14b1f
|
|
|
|
.start_duel ; 14b1f (5:4b1f)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x14b30
|
|
|
|
.forced_switch ; 14b30 (5:4b30)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14b34
|
|
|
|
.ko_switch ; 14b34 (5:4b34)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14b38
|
|
|
|
.take_prize ; 14b38 (5:4b38)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x14b3c
|
|
|
|
.list_arena ; 14b3c (5:4b3c)
|
|
db ELECTABUZZ2
|
|
db VOLTORB
|
|
db EEVEE
|
|
db ZAPDOS1
|
|
db ZAPDOS2
|
|
db ZAPDOS3
|
|
db $00
|
|
|
|
.list_bench ; 14b43 (5:4b43)
|
|
db ZAPDOS2
|
|
db ZAPDOS1
|
|
db EEVEE
|
|
db VOLTORB
|
|
db ELECTABUZZ2
|
|
db $00
|
|
|
|
.list_retreat ; 14b49 (5:4b49)
|
|
ai_retreat EEVEE, -5
|
|
ai_retreat VOLTORB, -5
|
|
ai_retreat ELECTABUZZ2, -5
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 14b69 (5:4b69)
|
|
db GAMBLER
|
|
db ZAPDOS3
|
|
db $00
|
|
|
|
.store_list_pointers ; 14b6c (5:4b6c)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x14b9a
|
|
|
|
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 ; return if turn ended
|
|
ld a, AI_TRAINER_CARD_PHASE_07
|
|
call AIProcessHandTrainerCards
|
|
call AIProcessRetreat
|
|
ld a, AI_TRAINER_CARD_PHASE_10
|
|
call AIProcessHandTrainerCards
|
|
; play Energy card if possible.
|
|
ld a, [wAlreadyPlayedEnergy]
|
|
or a
|
|
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, VOLTORB
|
|
cp e
|
|
jr nz, .check_electabuzz
|
|
ld a, ELECTRODE1
|
|
call LookForCardIDInHandList_Bank5
|
|
jr nc, .attach_normally
|
|
jr .voltorb_or_electabuzz
|
|
.check_electabuzz
|
|
ld a, ELECTABUZZ2
|
|
cp e
|
|
jr nz, .attach_normally
|
|
|
|
.voltorb_or_electabuzz
|
|
call CreateEnergyCardListFromHand
|
|
jr c, .skip_energy_attach
|
|
ld e, PLAY_AREA_ARENA
|
|
call CountNumberOfEnergyCardsAttached
|
|
or a
|
|
jr nz, .attach_normally
|
|
xor a ; PLAY_AREA_ARENA
|
|
ldh [hTempPlayAreaLocation_ff9d], a
|
|
call AITryToPlayEnergyCard
|
|
jr c, .skip_energy_attach
|
|
|
|
.attach_normally
|
|
call AIProcessAndTryToPlayEnergy
|
|
|
|
.skip_energy_attach
|
|
; play Pokemon from hand again
|
|
call AIDecidePlayPokemonCard
|
|
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 ; return if turn ended
|
|
ld a, OPPACTION_FINISH_NO_ATTACK
|
|
bank1call AIMakeDecision
|
|
ret
|
|
; 0x14c0b
|
|
|
|
AIActionTable_LegendaryArticuno: ; 14c0b (5:4c0b)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 14c17 (5:4c17)
|
|
call AIDoTurn_LegendaryArticuno
|
|
ret
|
|
; 0x14c1b
|
|
|
|
.start_duel ; 14c1b (5:4c1b)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x14c2c
|
|
|
|
.forced_switch ; 14c2c (5:4c2c)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14c30
|
|
|
|
.ko_switch ; 14c30 (5:4c30)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14c34
|
|
|
|
.take_prize ; 14c34 (5:4c34)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x14c38
|
|
|
|
.list_arena ; 14c38 (5:4c38)
|
|
db CHANSEY
|
|
db LAPRAS
|
|
db DITTO
|
|
db SEEL
|
|
db ARTICUNO1
|
|
db ARTICUNO2
|
|
db $00
|
|
|
|
.list_bench ; 14c3f (5:4c3f)
|
|
db ARTICUNO1
|
|
db SEEL
|
|
db LAPRAS
|
|
db CHANSEY
|
|
db DITTO
|
|
db $00
|
|
|
|
.list_retreat ; 14c45 (5:4c45)
|
|
ai_retreat SEEL, -3
|
|
ai_retreat DITTO, -3
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 14c60 (5:4c60)
|
|
db GAMBLER
|
|
db ARTICUNO2
|
|
db $00
|
|
|
|
.store_list_pointers ; 14c63 (5:4c63)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x14c91
|
|
|
|
; this routine handles how Legendary Articuno
|
|
; prioritises playing energy cards to each Pokémon.
|
|
; first, it makes sure that all Lapras have at least
|
|
; 3 energy cards before moving on to Articuno,
|
|
; and then to Dewgong and Seel
|
|
ScoreLegendaryArticunoCards: ; 14c91 (5:4c91)
|
|
call SwapTurn
|
|
call CountPrizes
|
|
call SwapTurn
|
|
cp 3
|
|
ret c
|
|
|
|
; player prizes >= 3
|
|
; if Lapras has more than half HP and
|
|
; can use second move, check next for Articuno
|
|
; otherwise, check if Articuno or Dewgong
|
|
; have more than half HP and can use second move
|
|
; and if so, the next Pokémon to check is Lapras
|
|
ld a, LAPRAS
|
|
call CheckForBenchIDAtHalfHPAndCanUseSecondMove
|
|
jr c, .articuno
|
|
ld a, ARTICUNO1
|
|
call CheckForBenchIDAtHalfHPAndCanUseSecondMove
|
|
jr c, .lapras
|
|
ld a, DEWGONG
|
|
call CheckForBenchIDAtHalfHPAndCanUseSecondMove
|
|
jr c, .lapras
|
|
jr .articuno
|
|
|
|
; the following routines check for certain card IDs in bench
|
|
; and call RaiseAIScoreToAllMatchingIDsInBench if these are found.
|
|
; for Lapras, an additional check is made to its
|
|
; attached energy count, which skips calling the routine
|
|
; if this count is >= 3
|
|
.lapras
|
|
ld a, LAPRAS
|
|
ld b, PLAY_AREA_BENCH_1
|
|
call LookForCardIDInPlayArea_Bank5
|
|
jr nc, .articuno
|
|
ld e, a
|
|
call CountNumberOfEnergyCardsAttached
|
|
cp 3
|
|
jr nc, .articuno
|
|
ld a, LAPRAS
|
|
call RaiseAIScoreToAllMatchingIDsInBench
|
|
ret
|
|
|
|
.articuno
|
|
ld a, ARTICUNO1
|
|
ld b, PLAY_AREA_BENCH_1
|
|
call LookForCardIDInPlayArea_Bank5
|
|
jr nc, .dewgong
|
|
ld a, ARTICUNO1
|
|
call RaiseAIScoreToAllMatchingIDsInBench
|
|
ret
|
|
|
|
.dewgong
|
|
ld a, DEWGONG
|
|
ld b, PLAY_AREA_BENCH_1
|
|
call LookForCardIDInPlayArea_Bank5
|
|
jr nc, .seel
|
|
ld a, DEWGONG
|
|
call RaiseAIScoreToAllMatchingIDsInBench
|
|
ret
|
|
|
|
.seel
|
|
ld a, SEEL
|
|
ld b, PLAY_AREA_BENCH_1
|
|
call LookForCardIDInPlayArea_Bank5
|
|
ret nc
|
|
ld a, SEEL
|
|
call RaiseAIScoreToAllMatchingIDsInBench
|
|
ret
|
|
; 0x14cf7
|
|
|
|
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 ; 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, .skip_energy_attach_1
|
|
call AIProcessAndTryToPlayEnergy
|
|
.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
|
|
ld a, AI_TRAINER_CARD_PHASE_01
|
|
call AIProcessHandTrainerCards
|
|
ld a, AI_TRAINER_CARD_PHASE_02
|
|
call AIProcessHandTrainerCards
|
|
call AIDecidePlayPokemonCard
|
|
ret c ; return if turn ended
|
|
call AIProcessRetreat
|
|
ld a, AI_TRAINER_CARD_PHASE_10
|
|
call AIProcessHandTrainerCards
|
|
ld a, [wAlreadyPlayedEnergy]
|
|
or a
|
|
jr nz, .skip_energy_attach_2
|
|
call AIProcessAndTryToPlayEnergy
|
|
.skip_energy_attach_2
|
|
call AIDecidePlayPokemonCard
|
|
.try_attack
|
|
; attack if possible, if not,
|
|
; finish turn without attacking.
|
|
call AIProcessAndTryToUseAttack
|
|
ret c ; return if turn ended
|
|
ld a, OPPACTION_FINISH_NO_ATTACK
|
|
bank1call AIMakeDecision
|
|
ret
|
|
; 0x14d60
|
|
|
|
AIActionTable_LegendaryDragonite: ; 14d60 (05:4d60)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 14d6c (5:4d6c)
|
|
call AIDoTurn_LegendaryDragonite
|
|
ret
|
|
; 0x14d70
|
|
|
|
.start_duel ; 14d70 (5:4d70)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x14d81
|
|
|
|
.forced_switch ; 14d81 (5:4d81)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14d85
|
|
|
|
.ko_switch ; 14d85 (5:4d85)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14d89
|
|
|
|
.take_prize ; 14d89 (5:4d89)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x14d8d
|
|
|
|
.list_arena ; 14d8d (5:4d8d)
|
|
db KANGASKHAN
|
|
db LAPRAS
|
|
db CHARMANDER
|
|
db DRATINI
|
|
db MAGIKARP
|
|
db $00
|
|
|
|
.list_bench ; 14d93 (5:4d93)
|
|
db CHARMANDER
|
|
db MAGIKARP
|
|
db DRATINI
|
|
db LAPRAS
|
|
db KANGASKHAN
|
|
db $00
|
|
|
|
.list_retreat ; 14d99 (5:4d99)
|
|
ai_retreat CHARMANDER, -1
|
|
ai_retreat MAGIKARP, -5
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 14dbd (5:4dbd)
|
|
db GAMBLER
|
|
db DRAGONITE1
|
|
db KANGASKHAN
|
|
db $00
|
|
|
|
.store_list_pointers ; 14dc1 (5:4dc1)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x14def
|
|
|
|
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 ; return if turn ended
|
|
ld a, AI_TRAINER_CARD_PHASE_07
|
|
call AIProcessHandTrainerCards
|
|
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, .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, KANGASKHAN
|
|
cp e
|
|
jr nz, .attach_normally
|
|
call CreateEnergyCardListFromHand
|
|
jr c, .skip_energy_attach_1
|
|
ld e, PLAY_AREA_ARENA
|
|
call CountNumberOfEnergyCardsAttached
|
|
or a
|
|
jr nz, .attach_normally
|
|
xor a
|
|
ldh [hTempPlayAreaLocation_ff9d], a
|
|
call AITryToPlayEnergyCard
|
|
jr c, .skip_energy_attach_1
|
|
.attach_normally
|
|
call AIProcessAndTryToPlayEnergy
|
|
|
|
.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
|
|
ld a, AI_TRAINER_CARD_PHASE_01
|
|
call AIProcessHandTrainerCards
|
|
ld a, AI_TRAINER_CARD_PHASE_02
|
|
call AIProcessHandTrainerCards
|
|
call AIDecidePlayPokemonCard
|
|
ret c ; return if turn ended
|
|
ld a, AI_TRAINER_CARD_PHASE_07
|
|
call AIProcessHandTrainerCards
|
|
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, .skip_energy_attach_2
|
|
call AIProcessAndTryToPlayEnergy
|
|
.skip_energy_attach_2
|
|
call AIDecidePlayPokemonCard
|
|
.try_attack
|
|
; attack if possible, if not,
|
|
; finish turn without attacking.
|
|
call AIProcessAndTryToUseAttack
|
|
ret c ; return if turn ended
|
|
ld a, OPPACTION_FINISH_NO_ATTACK
|
|
bank1call AIMakeDecision
|
|
ret
|
|
; 0x14e89
|
|
|
|
AIActionTable_FirstStrike: ; 14e89 (5:4e89)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 14e95 (5:4e95)
|
|
call AIMainTurnLogic
|
|
ret
|
|
; 0x14e99
|
|
|
|
.start_duel ; 14e99 (5:4e99)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x14eaa
|
|
|
|
.forced_switch ; 14eaa (5:4eaa)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14eae
|
|
|
|
.ko_switch ; 14eae (5:4eae)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14eb2
|
|
|
|
.take_prize ; 14eb2 (5:4eb2)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x14eb6
|
|
|
|
.list_arena ; 14eb6 (5:1eb6)
|
|
db HITMONCHAN
|
|
db MACHOP
|
|
db HITMONLEE
|
|
db MANKEY
|
|
db $00
|
|
|
|
.list_bench ; 14ebb (5:1ebb)
|
|
db MACHOP
|
|
db HITMONLEE
|
|
db HITMONCHAN
|
|
db MANKEY
|
|
db $00
|
|
|
|
.list_retreat ; 14ec0 (5:1ec0)
|
|
ai_retreat MACHOP, - 1
|
|
ai_retreat MACHOKE, - 1
|
|
ai_retreat MANKEY, - 2
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 14edd (5:1edd)
|
|
db HITMONLEE
|
|
db HITMONCHAN
|
|
db $00
|
|
|
|
.store_list_pointers ; 14ee0 (5:4ee0)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x14f0e
|
|
|
|
AIActionTable_RockCrusher: ; 14f0e (5:4f0e)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 14f1a (5:4f1a)
|
|
call AIMainTurnLogic
|
|
ret
|
|
; 0x14f1e
|
|
|
|
.start_duel ; 14f1e (5:4f1e)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x14f2f
|
|
|
|
.forced_switch ; 14f2f (5:4f2f)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14f33
|
|
|
|
.ko_switch ; 14f33 (5:4f33)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14f37
|
|
|
|
.take_prize ; 14f37 (5:4f37)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x14f3b
|
|
|
|
.list_arena ; 14f3b (5:4f3b)
|
|
db RHYHORN
|
|
db ONIX
|
|
db GEODUDE
|
|
db DIGLETT
|
|
db $00
|
|
|
|
.list_bench ; 14f40 (5:4f40)
|
|
db DIGLETT
|
|
db GEODUDE
|
|
db RHYHORN
|
|
db ONIX
|
|
db $00
|
|
|
|
.list_retreat ; 14f45 (5:4f45)
|
|
ai_retreat DIGLETT, -1
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 14f5e (5:4f5e)
|
|
db ENERGY_REMOVAL
|
|
db RHYHORN
|
|
db $00
|
|
|
|
.store_list_pointers ; 14f61 (5:4f61)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x14f8f
|
|
|
|
AIActionTable_GoGoRainDance: ; 14f8f (5:4f8f)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 14f9b (5:4f9b)
|
|
call AIMainTurnLogic
|
|
ret
|
|
; 0x14f9f
|
|
|
|
.start_duel ; 14f9f (5:4f9f)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x14fb0
|
|
|
|
.forced_switch ; 14fb0 (5:4fb0)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14fb4
|
|
|
|
.ko_switch ; 14fb4 (5:4fb4)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x14fb8
|
|
|
|
.take_prize ; 14fb8 (5:4fb8)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x14fbc
|
|
|
|
.list_arena ; 14fbc (5:4fbc)
|
|
db LAPRAS
|
|
db HORSEA
|
|
db GOLDEEN
|
|
db SQUIRTLE
|
|
db $00
|
|
|
|
.list_bench ; 14fc1 (5:4fc1)
|
|
db SQUIRTLE
|
|
db HORSEA
|
|
db GOLDEEN
|
|
db LAPRAS
|
|
db $00
|
|
|
|
.list_retreat ; 14fc6 (5:4fc6)
|
|
ai_retreat SQUIRTLE, -3
|
|
ai_retreat WARTORTLE, -2
|
|
ai_retreat HORSEA, -1
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 14fe6 (5:4fe6)
|
|
db GAMBLER
|
|
db ENERGY_RETRIEVAL
|
|
db SUPER_ENERGY_RETRIEVAL
|
|
db BLASTOISE
|
|
db $00
|
|
|
|
.store_list_pointers ; 14feb (5:4feb)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x15019
|
|
|
|
AIActionTable_ZappingSelfdestruct: ; 15019 (5:5019)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 15025 (5:5025)
|
|
call AIMainTurnLogic
|
|
ret
|
|
; 0x15029
|
|
|
|
.start_duel ; 15029 (5:5029)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x1503a
|
|
|
|
.forced_switch ; 1503a (5:503a)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x1503e
|
|
|
|
.ko_switch ; 1503e (5:503e)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x15042
|
|
|
|
.take_prize ; 15042 (5:5042)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x15046
|
|
|
|
.list_arena ; 15046 (5:5046)
|
|
db KANGASKHAN
|
|
db ELECTABUZZ2
|
|
db TAUROS
|
|
db MAGNEMITE1
|
|
db VOLTORB
|
|
db $00
|
|
|
|
.list_bench ; 1504c (5:504c)
|
|
db MAGNEMITE1
|
|
db VOLTORB
|
|
db ELECTABUZZ2
|
|
db TAUROS
|
|
db KANGASKHAN
|
|
db $00
|
|
|
|
.list_retreat ; 15052 (5:5052)
|
|
ai_retreat VOLTORB, -1
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 1506b (5:506b)
|
|
db KANGASKHAN
|
|
db $00
|
|
|
|
.store_list_pointers ; 1506d (5:506d)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x1509b
|
|
|
|
AIActionTable_FlowerPower: ; 1509b (5:509b)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 150a7 (5:50a7)
|
|
call AIMainTurnLogic
|
|
ret
|
|
; 0x150ab
|
|
|
|
.start_duel ; 150ab (5:50ab)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x150bc
|
|
|
|
.forced_switch ; 150bc (5:50bc)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x150c0
|
|
|
|
.ko_switch ; 150c0 (5:50c0)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x150c4
|
|
|
|
.take_prize ; 150c4 (5:50c4)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x150c8
|
|
|
|
.list_arena ; 150c8 (5:50c8)
|
|
db ODDISH
|
|
db EXEGGCUTE
|
|
db BULBASAUR
|
|
db $00
|
|
|
|
.list_bench ; 150cc (5:50cc)
|
|
db BULBASAUR
|
|
db EXEGGCUTE
|
|
db ODDISH
|
|
db $00
|
|
|
|
.list_retreat ; 150cf (5:50cf)
|
|
ai_retreat GLOOM, -2
|
|
ai_retreat VILEPLUME, -2
|
|
ai_retreat BULBASAUR, -2
|
|
ai_retreat IVYSAUR, -2
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 150f2 (5:50f2)
|
|
db VENUSAUR2
|
|
db $00
|
|
|
|
.store_list_pointers ; 150f4 (5:50f4)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x15122
|
|
|
|
AIActionTable_StrangePsyshock: ; 15122 (5:5122)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 1512e (5:512e)
|
|
call AIMainTurnLogic
|
|
ret
|
|
; 0x15132
|
|
|
|
.start_duel ; 15132 (5:5132)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x15143
|
|
|
|
.forced_switch ; 15143 (5:5143)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x15147
|
|
|
|
.ko_switch ; 15147 (5:5147)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x1514b
|
|
|
|
.take_prize ; 1514b (5:514b)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x1514f
|
|
|
|
.list_arena ; 1514f (5:514f)
|
|
db KANGASKHAN
|
|
db CHANSEY
|
|
db SNORLAX
|
|
db MR_MIME
|
|
db ABRA
|
|
db $00
|
|
|
|
.list_bench ; 15155 (5:5155)
|
|
db ABRA
|
|
db MR_MIME
|
|
db KANGASKHAN
|
|
db SNORLAX
|
|
db CHANSEY
|
|
db $00
|
|
|
|
.list_retreat ; 1515b (5:515b)
|
|
ai_retreat ABRA, -3
|
|
ai_retreat SNORLAX, -3
|
|
ai_retreat KANGASKHAN, -1
|
|
ai_retreat CHANSEY, -1
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 1517a (5:517a)
|
|
db GAMBLER
|
|
db MR_MIME
|
|
db ALAKAZAM
|
|
db SWITCH
|
|
db $00
|
|
|
|
.store_list_pointers ; 1517f (5:517f)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x151ad
|
|
|
|
AIActionTable_WondersOfScience: ; 151ad (5:51ad)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 151b9 (5:51b9)
|
|
call AIMainTurnLogic
|
|
ret
|
|
; 0x151bd
|
|
|
|
.start_duel ; 151bd (5:51bd)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x151ce
|
|
|
|
.forced_switch ; 151ce (5:51ce)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x151d2
|
|
|
|
.ko_switch ; 151d2 (5:51d2)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x151d6
|
|
|
|
.take_prize ; 151d6 (5:51d6)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x151da
|
|
|
|
.list_arena ; 151da (5:51da)
|
|
db MEWTWO1
|
|
db MEWTWO3
|
|
db MEWTWO2
|
|
db GRIMER
|
|
db KOFFING
|
|
db PORYGON
|
|
db $00
|
|
|
|
.list_bench ; 151e1 (5:51e1)
|
|
db GRIMER
|
|
db KOFFING
|
|
db MEWTWO3
|
|
db MEWTWO2
|
|
db MEWTWO1
|
|
db PORYGON
|
|
db $00
|
|
|
|
.list_retreat ; 151e8 (5:51e8)
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 15202 (5:5202)
|
|
db MUK
|
|
db $00
|
|
|
|
.store_list_pointers ; 15204 (5:5204)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x15232
|
|
|
|
AIActionTable_FireCharge: ; 15232 (5:5232)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 1523e (5:523e)
|
|
call AIMainTurnLogic
|
|
ret
|
|
; 0x15242
|
|
|
|
.start_duel ; 15242 (5:5242)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x15253
|
|
|
|
.forced_switch ; 15253 (5:5253)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x15257
|
|
|
|
.ko_switch ; 15257 (5:5257)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x1525b
|
|
|
|
.take_prize ; 1525b (5:525b)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x1525f
|
|
|
|
.list_arena ; 1525f (5:525f)
|
|
db JIGGLYPUFF3
|
|
db CHANSEY
|
|
db TAUROS
|
|
db MAGMAR1
|
|
db JIGGLYPUFF1
|
|
db GROWLITHE
|
|
db $00
|
|
|
|
.list_bench ; 15266 (5:5266)
|
|
db JIGGLYPUFF3
|
|
db CHANSEY
|
|
db GROWLITHE
|
|
db MAGMAR1
|
|
db JIGGLYPUFF1
|
|
db TAUROS
|
|
db $00
|
|
|
|
.list_retreat ; 1526e (5:526e)
|
|
ai_retreat JIGGLYPUFF1, -1
|
|
ai_retreat CHANSEY, -1
|
|
ai_retreat GROWLITHE, -1
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 1528d (5:528d)
|
|
db GAMBLER
|
|
db $00
|
|
|
|
.store_list_pointers ; 1528f (5:528f)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x152bd
|
|
|
|
AIActionTable_ImRonald: ; 152bd (5:52bd)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 152c9 (5:52c9)
|
|
call AIMainTurnLogic
|
|
ret
|
|
; 0x152cd
|
|
|
|
.start_duel ; 152cd (5:52cd)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x152de
|
|
|
|
.forced_switch ; 152de (5:52de)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x152e2
|
|
|
|
.ko_switch ; 152e2 (5:52e2)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x152e6
|
|
|
|
.take_prize ; 152e6 (5:52e6)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x152ea
|
|
|
|
.list_arena ; 152ea (5:52ea)
|
|
db LAPRAS
|
|
db SEEL
|
|
db CHARMANDER
|
|
db CUBONE
|
|
db SQUIRTLE
|
|
db GROWLITHE
|
|
db $00
|
|
|
|
.list_bench ; 152f1 (5:52f1)
|
|
db CHARMANDER
|
|
db SQUIRTLE
|
|
db SEEL
|
|
db CUBONE
|
|
db GROWLITHE
|
|
db LAPRAS
|
|
db $00
|
|
|
|
.list_retreat ; 152f8 (5:52f8)
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 1531b (5:531b)
|
|
db LAPRAS
|
|
db $00
|
|
|
|
.store_list_pointers ; 1531d (5:531d)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x1534b
|
|
|
|
AIActionTable_PowerfulRonald: ; 1534b (5:534b)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 15357 (5:5357)
|
|
call AIMainTurnLogic
|
|
ret
|
|
; 0x1535b
|
|
|
|
.start_duel ; 1535b (5:535b)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x1536c
|
|
|
|
.forced_switch ; 1536c (5:536c)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x15370
|
|
|
|
.ko_switch ; 15370 (5:5370)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x15374
|
|
|
|
.take_prize ; 15374 (5:5374)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x15378
|
|
|
|
.list_arena ; 15378 (5:5378)
|
|
db KANGASKHAN
|
|
db ELECTABUZZ2
|
|
db HITMONCHAN
|
|
db MR_MIME
|
|
db LICKITUNG
|
|
db HITMONLEE
|
|
db TAUROS
|
|
db JYNX
|
|
db MEWTWO1
|
|
db DODUO
|
|
db $00
|
|
|
|
.list_bench ; 15383 (5:5383)
|
|
db KANGASKHAN
|
|
db HITMONLEE
|
|
db HITMONCHAN
|
|
db TAUROS
|
|
db DODUO
|
|
db JYNX
|
|
db MEWTWO1
|
|
db ELECTABUZZ2
|
|
db MR_MIME
|
|
db LICKITUNG
|
|
db $00
|
|
|
|
.list_retreat ; 1538e (5:538e)
|
|
ai_retreat KANGASKHAN, -1
|
|
ai_retreat DODUO, -1
|
|
ai_retreat DODRIO, -1
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 153b7 (5:53b7)
|
|
db GAMBLER
|
|
db ENERGY_REMOVAL
|
|
db $00
|
|
|
|
.store_list_pointers ; 153ba (5:53ba)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x153e8
|
|
|
|
AIActionTable_InvincibleRonald: ; 153e8 (5:53e8)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 153f4 (5:53f4)
|
|
call AIMainTurnLogic
|
|
ret
|
|
; 0x153f8
|
|
|
|
.start_duel ; 153f8 (5:53f8)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x15409
|
|
|
|
.forced_switch ; 15409 (5:5409)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x1540d
|
|
|
|
.ko_switch ; 1540d (5:540d)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x15411
|
|
|
|
.take_prize ; 15411 (5:5411)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x15415
|
|
|
|
.list_arena ; 15415 (5:5415)
|
|
db KANGASKHAN
|
|
db MAGMAR2
|
|
db CHANSEY
|
|
db GEODUDE
|
|
db SCYTHER
|
|
db GRIMER
|
|
db $00
|
|
|
|
.list_bench ; 1541c (5:541c)
|
|
db GRIMER
|
|
db SCYTHER
|
|
db GEODUDE
|
|
db CHANSEY
|
|
db MAGMAR2
|
|
db KANGASKHAN
|
|
db $00
|
|
|
|
.list_retreat ; 15423 (5:5423)
|
|
ai_retreat GRIMER, -1
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 1543f (5:543f)
|
|
db GAMBLER
|
|
db $00
|
|
|
|
.store_list_pointers ; 15441 (5:5441)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_bench
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x1546f
|
|
|
|
AIActionTable_LegendaryRonald: ; 1546f (5:546f)
|
|
dw .do_turn ; unused
|
|
dw .do_turn
|
|
dw .start_duel
|
|
dw .forced_switch
|
|
dw .ko_switch
|
|
dw .take_prize
|
|
|
|
.do_turn ; 1547b (5:547b)
|
|
call AIDoTurn_LegendaryRonald
|
|
ret
|
|
; 0x1547f
|
|
|
|
.start_duel ; 1547f (5:547f)
|
|
call InitAIDuelVars
|
|
call .store_list_pointers
|
|
call SetUpBossStartingHandAndDeck
|
|
call TrySetUpBossStartingPlayArea
|
|
ret nc
|
|
call AIPlayInitialBasicCards
|
|
ret
|
|
; 0x15490
|
|
|
|
.forced_switch ; 15490 (5:5490)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x15494
|
|
|
|
.ko_switch ; 15494 (5:5494)
|
|
call AIDecideBenchPokemonToSwitchTo
|
|
ret
|
|
; 0x15498
|
|
|
|
.take_prize ; 15498 (5:5498)
|
|
call AIPickPrizeCards
|
|
ret
|
|
; 0x1549c
|
|
|
|
.list_arena ; 1549c (5:549c)
|
|
db KANGASKHAN
|
|
db DRATINI
|
|
db EEVEE
|
|
db ZAPDOS3
|
|
db ARTICUNO2
|
|
db MOLTRES2
|
|
db $00
|
|
|
|
.list_bench ; 154a3 (5:54a3)
|
|
db KANGASKHAN
|
|
db DRATINI
|
|
db EEVEE
|
|
db $00
|
|
|
|
.list_play_hand ; 154a7 (5:54a7)
|
|
db MOLTRES2
|
|
db ZAPDOS3
|
|
db KANGASKHAN
|
|
db DRATINI
|
|
db EEVEE
|
|
db ARTICUNO2
|
|
db $00
|
|
|
|
.list_retreat ; 154ae (5:54ae)
|
|
ai_retreat EEVEE, -2
|
|
db $00
|
|
|
|
.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
|
|
|
|
.list_prize ; 154d3 (5:54d3)
|
|
db MOLTRES2
|
|
db ARTICUNO2
|
|
db ZAPDOS3
|
|
db DRAGONITE1
|
|
db GAMBLER
|
|
db $00
|
|
|
|
.store_list_pointers ; 154d9 (5:54d9)
|
|
store_list_pointer wAICardListAvoidPrize, .list_prize
|
|
store_list_pointer wAICardListArenaPriority, .list_arena
|
|
store_list_pointer wAICardListBenchPriority, .list_bench
|
|
store_list_pointer wAICardListPlayFromHandPriority, .list_play_hand
|
|
; missing store_list_pointer wAICardListRetreatBonus, .list_retreat
|
|
store_list_pointer wAICardListEnergyBonus, .list_energy
|
|
ret
|
|
; 0x15507
|
|
|
|
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
|
|
|
|
; 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
|
|
jr nc, .skip_moltres_1 ; skip if bench is full
|
|
ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
|
|
call GetTurnDuelistVariable
|
|
cp DECK_SIZE - 9
|
|
jr nc, .skip_moltres_1 ; skip if cards in deck <= 9
|
|
ld a, MUK
|
|
call CountPokemonIDInBothPlayAreas
|
|
jr c, .skip_moltres_1 ; skip if Muk in play
|
|
ld a, MOLTRES2
|
|
call LookForCardIDInHandList_Bank5
|
|
jr nc, .skip_moltres_1 ; skip if no Moltres2 in hand
|
|
ldh [hTemp_ffa0], a
|
|
ld a, OPPACTION_PLAY_BASIC_PKMN
|
|
bank1call AIMakeDecision
|
|
|
|
.skip_moltres_1
|
|
; play Pokemon from hand
|
|
call AIDecidePlayPokemonCard
|
|
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 AIProcessRetreat
|
|
ld a, AI_TRAINER_CARD_PHASE_10
|
|
call AIProcessHandTrainerCards
|
|
; play Energy card if possible
|
|
ld a, [wAlreadyPlayedEnergy]
|
|
or a
|
|
jr nz, .skip_attach_energy_1
|
|
call AIProcessAndTryToPlayEnergy
|
|
.skip_attach_energy_1
|
|
; try playing Pokemon cards from hand again
|
|
call AIDecidePlayPokemonCard
|
|
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
|
|
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_04
|
|
call AIProcessHandTrainerCards
|
|
|
|
; 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
|
|
jr nc, .skip_moltres_2 ; skip if bench is full
|
|
ld a, DUELVARS_NUMBER_OF_CARDS_NOT_IN_DECK
|
|
call GetTurnDuelistVariable
|
|
cp DECK_SIZE - 9
|
|
jr nc, .skip_moltres_2 ; skip if cards in deck <= 9
|
|
ld a, MUK
|
|
call CountPokemonIDInBothPlayAreas
|
|
jr c, .skip_moltres_2 ; skip if Muk in play
|
|
ld a, MOLTRES2
|
|
call LookForCardIDInHandList_Bank5
|
|
jr nc, .skip_moltres_2 ; skip if no Moltres2 in hand
|
|
ldh [hTemp_ffa0], a
|
|
ld a, OPPACTION_PLAY_BASIC_PKMN
|
|
bank1call AIMakeDecision
|
|
|
|
.skip_moltres_2
|
|
call AIDecidePlayPokemonCard
|
|
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 AIProcessRetreat
|
|
ld a, AI_TRAINER_CARD_PHASE_10
|
|
call AIProcessHandTrainerCards
|
|
ld a, [wAlreadyPlayedEnergy]
|
|
or a
|
|
jr nz, .skip_attach_energy_2
|
|
call AIProcessAndTryToPlayEnergy
|
|
.skip_attach_energy_2
|
|
call AIDecidePlayPokemonCard
|
|
ret c ; return if turn ended
|
|
.try_attack
|
|
; attack if possible, if not,
|
|
; finish turn without attacking.
|
|
call AIProcessAndTryToUseAttack
|
|
ret c ; return if turn ended
|
|
ld a, OPPACTION_FINISH_NO_ATTACK
|
|
bank1call AIMakeDecision
|
|
ret
|
|
; 0x155d2
|