mirror of
https://github.com/pret/poketcg2.git
synced 2026-09-10 02:36:12 -05:00
Mirror poketcg #187 in-duel action hRAM refactor; sync Imakuni AI name
Adopt the duel-action hRAM scheme from poketcg (tcg1) draft PR #187 so the shared duel engine's documentation stays synchronised across both repos. - Add src/constants/duel_action_constants.asm verbatim from #187 (DUEL_ACTION_* struct offsets + per-action arg constants). The offsets are relative, so they apply unchanged despite tcg2's hRAM being shifted +2 vs tcg1. - hram.asm: replace hTempCardIndex_ff9f / hTemp_ffa0 / hTempPlayAreaLocation_ffa1 / hTempRetreatCostCards / hAIPkmnPowerEffectParam / hAIEnergyTrans* / hPlayAreaEffectTarget with hDuelAction / hDuelActionCardIndex / hDuelActionArgs. This also retires tcg2's stale "_ffNN" suffixes, which were wrong (tcg2's were copied from tcg1 but sit +2 higher). hOppActionTableIndex and the 15-byte hTempList are kept as tcg2-specific union members (tcg2 has hCurSelectionItem at $ffb2; tcg1's hTempList was only 8 bytes and was folded away). - Sweep 1263 call sites across 14 engine/home files to the new names; serial send/recv buffer base -> hDuelAction; wram pointer comment updated. - Rename AIDecide_ImakuniCard / AIPlay_ImakuniCard -> AIDecide_Imakuni / AIPlay_Imakuni to match tcg1. make compare: OK (byte-identical to baserom). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -9,6 +9,7 @@ INCLUDE "constants/coin_constants.asm"
|
||||
INCLUDE "constants/credits_constants.asm"
|
||||
INCLUDE "constants/deck_ai_constants.asm"
|
||||
INCLUDE "constants/deck_constants.asm"
|
||||
INCLUDE "constants/duel_action_constants.asm"
|
||||
INCLUDE "constants/duel_constants.asm"
|
||||
INCLUDE "constants/duel_interface_constants.asm"
|
||||
INCLUDE "constants/game_center_constants.asm"
|
||||
|
||||
69
src/constants/duel_action_constants.asm
Normal file
69
src/constants/duel_action_constants.asm
Normal file
@@ -0,0 +1,69 @@
|
||||
; in-duel action structs
|
||||
RSRESET
|
||||
DEF DUEL_ACTION_STRUCT_ACTION_INDEX RB ; $0
|
||||
DEF DUEL_ACTION_STRUCT_CARD_INDEX RB ; $1
|
||||
DEF DUEL_ACTION_STRUCT_ARGS RB 7 ; $2
|
||||
DEF DUEL_ACTION_STRUCT_TERMINATOR RB ; $9
|
||||
|
||||
DEF DUEL_ACTION_ARGS_SIZE EQU DUEL_ACTION_STRUCT_TERMINATOR - DUEL_ACTION_STRUCT_ARGS ; 7
|
||||
DEF DUEL_ACTION_STRUCT_SIZE EQU _RS ; 10
|
||||
|
||||
; common sets of argument offset in DUEL_ACTION_STRUCT_ARGS
|
||||
; play pkmn/energy card from hand
|
||||
RSRESET
|
||||
DEF PLAYCARD_ARGS_CARD_INDEX RB ; $0
|
||||
DEF PLAYCARD_ARGS_TO_PLAY_AREA RB ; $1
|
||||
|
||||
; retreat
|
||||
RSRESET
|
||||
DEF RETREAT_ARGS_STATUS RB ; $0
|
||||
DEF RETREAT_ARGS_BENCH RB ; $1
|
||||
DEF RETREAT_ARGS_COST_LIST RB 5 ; $2
|
||||
|
||||
; pkmn powers
|
||||
RSRESET
|
||||
DEF PKMNPOWER_ARGS_PLAY_AREA RB ; $0
|
||||
|
||||
; choose-1-pkmn effect
|
||||
DEF PKMNPOWER_TARGET_ARGS_TO_PLAY_AREA RB ; $1
|
||||
|
||||
; coin flip + choose-1-pkmn effect
|
||||
RSSET PKMNPOWER_ARGS_PLAY_AREA + 1
|
||||
DEF PKMNPOWER_COIN_ARGS_COIN_RESULT RB ; $1
|
||||
DEF PKMNPOWER_COIN_ARGS_TO_PLAY_AREA RB ; $2
|
||||
|
||||
; move from-to effect
|
||||
RSSET PKMNPOWER_ARGS_PLAY_AREA + 1
|
||||
DEF PKMNPOWER_MOVE_ARGS_FROM_PLAY_AREA RB ; $1
|
||||
DEF PKMNPOWER_MOVE_ARGS_TO_PLAY_AREA RB ; $2
|
||||
|
||||
; energy trans
|
||||
RSSET PKMNPOWER_ARGS_PLAY_AREA + 1
|
||||
DEF ENERGYTRANS_ARGS_FROM_PLAY_AREA RB ; $1
|
||||
DEF ENERGYTRANS_ARGS_ENERGY_INDEX RB ; $2
|
||||
DEF ENERGYTRANS_ARGS_TO_PLAY_AREA RB ; $3
|
||||
|
||||
; shift
|
||||
RSSET PKMNPOWER_ARGS_PLAY_AREA + 1
|
||||
DEF VENOMOTH_SHIFT_ARGS_TARGET_COLOR RB ; $1
|
||||
|
||||
; peek
|
||||
RSSET PKMNPOWER_ARGS_PLAY_AREA + 1
|
||||
DEF MANKEY_PEEK_ARGS_TARGET RB ; $1
|
||||
|
||||
; trainers
|
||||
; potion
|
||||
RSRESET
|
||||
DEF POTION_ARGS_TO_PLAY_AREA RB ; $0
|
||||
DEF POTION_ARGS_HEAL_AMOUNT RB ; $1
|
||||
|
||||
; super potion
|
||||
RSRESET
|
||||
DEF SUPERPOTION_ARGS_DISCARD_ENERGY_INDEX RB ; $0
|
||||
DEF SUPERPOTION_ARGS_TO_PLAY_AREA RB ; $1
|
||||
DEF SUPERPOTION_ARGS_HEAL_AMOUNT RB ; $2
|
||||
|
||||
; prize cards
|
||||
RSRESET
|
||||
DEF SELECTPRIZE_ARGS_BITFIELD RB ; $0
|
||||
DEF SELECTPRIZE_ARGS_SELECTED_CARD_INDICES RB 6 ; $1
|
||||
@@ -560,7 +560,7 @@ DuelMenu_Retreat:
|
||||
get_turn_duelist_var
|
||||
and CNF_SLP_PRZ
|
||||
cp CONFUSED
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
jr nz, .not_confused
|
||||
ld a, [wGotHeadsFromConfusionCheckDuringRetreat]
|
||||
or a
|
||||
@@ -575,7 +575,7 @@ DuelMenu_Retreat:
|
||||
jr c, .done
|
||||
ld [wBenchSelectedPokemon], a
|
||||
ld a, [wBenchSelectedPokemon] ; unnecessary
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_ATTEMPT_RETREAT
|
||||
call SetOppAction_SerialSendDuelData
|
||||
call AttemptRetreat
|
||||
@@ -603,7 +603,7 @@ DuelMenu_Retreat:
|
||||
call DrawWideTextBox_WaitForInput
|
||||
call OpenPlayAreaScreenForSelection
|
||||
ld [wBenchSelectedPokemon], a
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
push af
|
||||
call ReturnRetreatCostCardsToArena
|
||||
pop af
|
||||
@@ -685,10 +685,10 @@ PlayEnergyCard:
|
||||
ld [wAlreadyPlayedEnergy], a
|
||||
.play_energy
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld e, a
|
||||
ldh a, [hTempCardIndex_ff98]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
call PutHandCardInPlayArea
|
||||
call PrintPlayAreaCardList_EnableLCD
|
||||
ld a, OPPACTION_PLAY_ENERGY
|
||||
@@ -736,10 +736,10 @@ PlayPokemonCard:
|
||||
cp [hl]
|
||||
jr nc, .no_space
|
||||
ldh a, [hTempCardIndex_ff98]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
call PutHandPokemonCardInPlayArea
|
||||
ldh [hTempPlayAreaLocation_ff9d], a
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
add DUELVARS_ARENA_CARD_STAGE
|
||||
get_turn_duelist_var
|
||||
ld [hl], BASIC
|
||||
@@ -809,9 +809,9 @@ PlayPokemonCard:
|
||||
call OpenPlayAreaScreenForSelection
|
||||
jr c, .done
|
||||
ldh a, [hTempCardIndex_ff98]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
call EvolvePokemonCardIfPossible
|
||||
jr c, .try_evolve_loop ; jump if evolution wasn't successful somehow
|
||||
ld a, OPPACTION_EVOLVE_PKMN
|
||||
@@ -919,14 +919,14 @@ CheckIfEnoughEnergiesToRetreat:
|
||||
; energy cards have been selected or if the player declines to retreat.
|
||||
DisplayRetreatScreen:
|
||||
ld a, $ff
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
ld a, [wEnergyCardsRequiredToRetreat]
|
||||
or a
|
||||
ret z ; return if no energy cards are required at all
|
||||
xor a
|
||||
ld [wNumRetreatEnergiesSelected], a
|
||||
call CreateArenaOrBenchEnergyCardList
|
||||
ld a, LOW(hTempRetreatCostCards)
|
||||
ld a, LOW(hDuelActionArgs + RETREAT_ARGS_COST_LIST)
|
||||
ld [wTempRetreatCostCardsPos], a
|
||||
xor a
|
||||
call DisplayEnergyDiscardMenu
|
||||
@@ -939,7 +939,7 @@ DisplayRetreatScreen:
|
||||
ret c
|
||||
ldh a, [hTempCardIndex_ff98]
|
||||
call LoadCardDataToBuffer2_FromDeckIndex
|
||||
; append selected energy card to hTempRetreatCostCards
|
||||
; append selected energy card to hDuelActionArgs + RETREAT_ARGS_COST_LIST
|
||||
ld hl, wTempRetreatCostCardsPos
|
||||
ld c, [hl]
|
||||
inc [hl]
|
||||
@@ -965,7 +965,7 @@ DisplayRetreatScreen:
|
||||
call UpdateAttachedEnergyMenu
|
||||
jr .select_energies_loop
|
||||
.enough
|
||||
; terminate hTempRetreatCostCards array with $ff
|
||||
; terminate hDuelActionArgs + RETREAT_ARGS_COST_LIST array with $ff
|
||||
ld a, [wTempRetreatCostCardsPos]
|
||||
ld c, a
|
||||
ld a, $ff
|
||||
@@ -1515,14 +1515,14 @@ HandleDuelSetup:
|
||||
call SwapTurn
|
||||
farcall PlayShuffleAndDrawCardsAnimation_BothDuelists
|
||||
call ShuffleDeckAndDrawSevenCards
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
call SwapTurn
|
||||
call ShuffleDeckAndDrawSevenCards
|
||||
call SwapTurn
|
||||
ld c, a
|
||||
|
||||
; check if any Basic Pokémon cards were drawn
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ld b, a
|
||||
and c
|
||||
jr nz, .hand_cards_ok
|
||||
@@ -3061,7 +3061,7 @@ TurnDuelistTakePrizes:
|
||||
call DrawWideTextBox_WaitForInput
|
||||
ld a, [wNumberPrizeCardsToTake]
|
||||
call SelectPrizeCards
|
||||
ld hl, hTemp_ffa0
|
||||
ld hl, hDuelActionArgs + 0
|
||||
ld d, [hl]
|
||||
inc hl
|
||||
ld e, [hl]
|
||||
@@ -4957,7 +4957,7 @@ DisplayPlayAreaScreenToUsePkmnPower:
|
||||
call YesOrNoMenu
|
||||
jp c, .start
|
||||
ldh a, [hTempCardIndex_ff98]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
or a
|
||||
ret
|
||||
.cancel
|
||||
@@ -5042,9 +5042,9 @@ PrintAttackOrCardDescription:
|
||||
call SetOneLineSeparation
|
||||
ret
|
||||
|
||||
; moves the cards loaded by deck index at hTempRetreatCostCards to the discard pile
|
||||
; moves the cards loaded by deck index at hDuelActionArgs + RETREAT_ARGS_COST_LIST to the discard pile
|
||||
DiscardRetreatCostCards:
|
||||
ld hl, hTempRetreatCostCards
|
||||
ld hl, hDuelActionArgs + RETREAT_ARGS_COST_LIST
|
||||
.discard_loop
|
||||
ld a, [hli]
|
||||
cp $ff
|
||||
@@ -5052,11 +5052,11 @@ DiscardRetreatCostCards:
|
||||
call PutCardInDiscardPile
|
||||
jr .discard_loop
|
||||
|
||||
; moves the discard pile cards that were loaded to hTempRetreatCostCards back to the active Pokemon.
|
||||
; moves the discard pile cards that were loaded to hDuelActionArgs + RETREAT_ARGS_COST_LIST back to the active Pokemon.
|
||||
; this exists because they will be discarded again during the call to AttemptRetreat, so
|
||||
; it prevents the energy cards from being discarded twice.
|
||||
ReturnRetreatCostCardsToArena:
|
||||
ld hl, hTempRetreatCostCards
|
||||
ld hl, hDuelActionArgs + RETREAT_ARGS_COST_LIST
|
||||
.loop
|
||||
ld a, [hli]
|
||||
cp $ff
|
||||
@@ -5073,7 +5073,7 @@ ReturnRetreatCostCardsToArena:
|
||||
; return carry if unable to retreat this turn due to unsuccessful confusion check
|
||||
; if successful, the retreated card is replaced with a bench Pokemon card
|
||||
AttemptRetreat:
|
||||
ld hl, hTempRetreatCostCards
|
||||
ld hl, hDuelActionArgs + RETREAT_ARGS_COST_LIST
|
||||
.discard_loop
|
||||
ld a, [hli]
|
||||
cp $ff
|
||||
@@ -5082,7 +5082,7 @@ AttemptRetreat:
|
||||
jr .discard_loop
|
||||
|
||||
.asm_6033
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
and CNF_SLP_PRZ
|
||||
cp CONFUSED
|
||||
jr nz, .success
|
||||
@@ -5102,7 +5102,7 @@ AttemptRetreat:
|
||||
get_turn_duelist_var
|
||||
|
||||
push af
|
||||
ldh a, [hTempPlayAreaLocation_ffa1]
|
||||
ldh a, [hDuelActionArgs + 1]
|
||||
ld e, a
|
||||
call SwapArenaWithBenchPokemon
|
||||
call HandleDestinyBondAndBetweenTurnKnockOuts
|
||||
@@ -5368,9 +5368,9 @@ LoadPlayAreaCardID:
|
||||
; the player, and possibly to use it if it triggers when the card is played.
|
||||
ProcessPlayedPokemonCard:
|
||||
ldh a, [hTempCardIndex_ff98]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_PROCESS_PLAYED_PKMN
|
||||
call SetOppAction_SerialSendDuelData
|
||||
call .Process
|
||||
@@ -5383,15 +5383,15 @@ ProcessPlayedPokemonCard:
|
||||
ret
|
||||
|
||||
.Process:
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
ldh [hTempCardIndex_ff98], a
|
||||
call ClearChangedTypesIfMuk
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
ld d, a
|
||||
ld e, FIRST_ATTACK_OR_PKMN_POWER
|
||||
call CopyAttackDataAndDamage_FromDeckIndex
|
||||
call ClearTwoTurnDuelVars
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
call GetCardIDFromDeckIndex
|
||||
ld hl, wTempTurnDuelistCardID
|
||||
ld [hl], e
|
||||
@@ -5440,7 +5440,7 @@ ProcessPlayedPokemonCard:
|
||||
call CheckMatchingCommand
|
||||
jr c, .not_using_pkmn_power
|
||||
call DrawDuelMainScene
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
call LoadCardDataToBuffer1_FromDeckIndex
|
||||
ld de, wLoadedCard1Name
|
||||
ld hl, wTxRam2
|
||||
@@ -6129,7 +6129,7 @@ ReplaceKnockedOutPokemon:
|
||||
cp DUELIST_TYPE_LINK_OPP
|
||||
jr z, .link_opponent
|
||||
call AIDoAction_KOSwitch
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ldh [hTempPlayAreaLocation_ff9d], a
|
||||
jr .replace_pokemon
|
||||
|
||||
@@ -6669,7 +6669,7 @@ PlayTrainerCard:
|
||||
ldh a, [hWhoseTurn]
|
||||
ld h, a
|
||||
ldh a, [hTempCardIndex_ff98]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
call LoadNonPokemonCardEffectCommands
|
||||
ld a, EFFECTCMDTYPE_INITIAL_EFFECT_1
|
||||
call TryExecuteEffectCommandFunction
|
||||
@@ -6694,7 +6694,7 @@ PlayTrainerCard:
|
||||
call SetOppAction_SerialSendDuelData
|
||||
ld a, EFFECTCMDTYPE_BEFORE_DAMAGE
|
||||
call TryExecuteEffectCommandFunction
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
call MoveHandCardToDiscardPile
|
||||
call ExchangeRNG
|
||||
ld a, [wcd15]
|
||||
@@ -6706,10 +6706,10 @@ PlayTrainerCard:
|
||||
or a
|
||||
ret
|
||||
|
||||
; loads the effect commands of a (trainer or energy) card with deck index (0-59) at hTempCardIndex_ff9f
|
||||
; loads the effect commands of a (trainer or energy) card with deck index (0-59) at hDuelActionCardIndex
|
||||
; into wLoadedAttackEffectCommands. in practice, only used for trainer cards
|
||||
LoadNonPokemonCardEffectCommands:
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
call LoadCardDataToBuffer1_FromDeckIndex
|
||||
ld hl, wLoadedCard1EffectCommands
|
||||
ld de, wLoadedAttackEffectCommands
|
||||
@@ -6727,7 +6727,7 @@ LoadNonPokemonCardEffectCommands:
|
||||
|
||||
Func_6986:
|
||||
ldh a, [hTempCardIndex_ff98]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
call LoadNonPokemonCardEffectCommands
|
||||
ld hl, wLoadedAttackEffectCommands
|
||||
ld a, [hli]
|
||||
|
||||
@@ -1999,7 +1999,7 @@ _SelectPrizeCards::
|
||||
xor a
|
||||
call GetFirstSetPrizeCard
|
||||
ld [wMultiDirectionalMenuCursorPosition], a
|
||||
ld de, hTempPlayAreaLocation_ffa1
|
||||
ld de, hDuelActionArgs + 1
|
||||
ld hl, wSelectedPrizeCardListPtr
|
||||
ld [hl], e
|
||||
inc hl
|
||||
@@ -2017,7 +2017,7 @@ _SelectPrizeCards::
|
||||
.selection_made
|
||||
ld a, DUELVARS_PRIZES
|
||||
get_turn_duelist_var
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wSelectedPrizeCardListPtr]
|
||||
ld l, a
|
||||
ld a, [wSelectedPrizeCardListPtr + 1]
|
||||
|
||||
@@ -6431,9 +6431,9 @@ Func_167e5:
|
||||
jr c, .dont_play_energy_card
|
||||
.asm_1682a
|
||||
ld a, [wDuelTempList]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_PLAY_ENERGY
|
||||
farcall AIMakeDecision
|
||||
|
||||
@@ -6447,9 +6447,9 @@ Func_167e5:
|
||||
jp z, .mysterious_fossil_or_clefairy_doll
|
||||
|
||||
; if card is Asleep or Paralyzed, set carry and exit
|
||||
; else, load the status in hTemp_ffa0
|
||||
; else, load the status in hDuelActionArgs + 0
|
||||
pop af
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, DUELVARS_ARENA_CARD_STATUS
|
||||
get_turn_duelist_var
|
||||
ld b, a
|
||||
@@ -6459,9 +6459,9 @@ Func_167e5:
|
||||
cp PARALYZED
|
||||
jp z, .set_carry
|
||||
ld a, b
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, $ff
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
|
||||
; check energy required to retreat
|
||||
; if the cost is 0, retreat right away
|
||||
@@ -6484,7 +6484,7 @@ Func_167e5:
|
||||
cp c
|
||||
jr nz, .choose_energy_discard
|
||||
|
||||
ld hl, hTempRetreatCostCards
|
||||
ld hl, hDuelActionArgs + RETREAT_ARGS_COST_LIST
|
||||
ld de, wDuelTempList
|
||||
.loop_select_all_cards
|
||||
ld a, [de]
|
||||
@@ -6513,7 +6513,7 @@ Func_167e5:
|
||||
|
||||
; first, look for and discard any Recycle energy cards
|
||||
ld hl, wDuelTempList
|
||||
ld de, hTempRetreatCostCards
|
||||
ld de, hDuelActionArgs + RETREAT_ARGS_COST_LIST
|
||||
.loop_select_recycle_energy
|
||||
ld a, [hli]
|
||||
cp $ff
|
||||
@@ -6633,13 +6633,13 @@ Func_167e5:
|
||||
.has_bench
|
||||
ld a, DUELVARS_ARENA_CARD
|
||||
get_turn_duelist_var
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
pop af
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_DUEL_MAIN_SCENE
|
||||
@@ -6761,15 +6761,15 @@ AIDecidePlayPokemonCard:
|
||||
cp 180
|
||||
jr c, .skip
|
||||
ld a, [wTempAIPokemonCard]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
call CheckIfCardCanBePlayed
|
||||
jr c, .skip
|
||||
ld a, OPPACTION_PLAY_BASIC_PKMN
|
||||
farcall AIMakeDecision
|
||||
ld a, [wTempAIPokemonCard]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_PROCESS_PLAYED_PKMN
|
||||
farcall AIMakeDecision
|
||||
ld a, [wcd18]
|
||||
@@ -6838,15 +6838,15 @@ AIDecideEvolution:
|
||||
jr nc, .done_bench_pokemon
|
||||
|
||||
ld a, [wTempAI]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wTempAIPokemonCard]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_EVOLVE_PKMN
|
||||
farcall AIMakeDecision
|
||||
ld a, [wTempAIPokemonCard]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_PROCESS_PLAYED_PKMN
|
||||
farcall AIMakeDecision
|
||||
ld a, [wcd18]
|
||||
@@ -8008,7 +8008,7 @@ AITryToPlayEnergyCard:
|
||||
; in this case, Pokémon needs a specific basic energy card.
|
||||
; look for basic energy card needed in hand and play it.
|
||||
call LookForCardIDInHand
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
jp nc, .play_energy_card
|
||||
|
||||
; it might be that there's no basic energy is not in hand,
|
||||
@@ -8020,7 +8020,7 @@ AITryToPlayEnergyCard:
|
||||
jr c, .colorless_energy
|
||||
ld de, RAINBOW_ENERGY
|
||||
call LookForCardIDInHand
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
jr nc, .play_energy_card
|
||||
|
||||
; in this case Pokémon just needs colorless (any basic energy card).
|
||||
@@ -8040,7 +8040,7 @@ AITryToPlayEnergyCard:
|
||||
ld a, [hli]
|
||||
cp $ff
|
||||
jr z, .check_recycle_energy
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
call GetCardIDFromDeckIndex
|
||||
cp16 DOUBLE_COLORLESS_ENERGY
|
||||
jr nz, .loop_1
|
||||
@@ -8050,7 +8050,7 @@ AITryToPlayEnergyCard:
|
||||
.check_recycle_energy
|
||||
ld de, RECYCLE_ENERGY
|
||||
call LookForCardIDInHand
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
jr nc, .play_energy_card
|
||||
|
||||
; otherwise, try to play any Basic Energy card
|
||||
@@ -8058,7 +8058,7 @@ AITryToPlayEnergyCard:
|
||||
ld a, [wDuelTempList]
|
||||
cp $ff
|
||||
jr z, .no_basic_energy
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
jr .play_energy_card
|
||||
|
||||
.no_basic_energy
|
||||
@@ -8083,7 +8083,7 @@ AITryToPlayEnergyCard:
|
||||
ld a, [hli]
|
||||
cp $ff
|
||||
jr z, .check_if_done
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
push hl
|
||||
farcall Func_4c25c
|
||||
pop hl
|
||||
@@ -8091,10 +8091,10 @@ AITryToPlayEnergyCard:
|
||||
cp -1
|
||||
jr nz, .asm_171d6
|
||||
|
||||
; plays energy card loaded in hTemp_ffa0 and sets carry flag.
|
||||
; plays energy card loaded in hDuelActionArgs + 0 and sets carry flag.
|
||||
.play_energy_card
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_PLAY_ENERGY
|
||||
farcall AIMakeDecision
|
||||
scf
|
||||
@@ -8168,7 +8168,7 @@ AICheckSpecialColorlessEnergyCards:
|
||||
ld de, POTION_ENERGY
|
||||
call LookForCardIDInHand
|
||||
jr c, .done
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
pop hl
|
||||
pop de
|
||||
pop bc
|
||||
@@ -8197,7 +8197,7 @@ AICheckSpecialColorlessEnergyCards:
|
||||
ld de, FULLHEAL_ENERGY
|
||||
call LookForCardIDInHand
|
||||
jr c, .done
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
pop hl
|
||||
pop de
|
||||
pop bc
|
||||
@@ -8261,7 +8261,7 @@ AICheckSpecialColorlessEnergyCards:
|
||||
bank1call CreateEnergyCardListFromHand
|
||||
ld a, [wDuelTempList]
|
||||
.has_double_colorless_in_hand
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
pop hl
|
||||
pop de
|
||||
pop bc
|
||||
@@ -8281,7 +8281,7 @@ AICheckSpecialColorlessEnergyCards:
|
||||
call LookForCardIDInHand
|
||||
jp c, .done ; has no Double Colorless in hand
|
||||
; pick double colorless
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
pop hl
|
||||
pop de
|
||||
pop bc
|
||||
@@ -9454,11 +9454,11 @@ LoadDefendingPokemonColorWRAndPrizeCards:
|
||||
; handles AI choosing parameters for certain attacks as well.
|
||||
AITryUseAttack:
|
||||
ld a, [wSelectedAttack]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld e, a
|
||||
ld a, DUELVARS_ARENA_CARD
|
||||
get_turn_duelist_var
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld d, a
|
||||
call CopyAttackDataAndDamage_FromDeckIndex
|
||||
ld a, OPPACTION_BEGIN_ATTACK
|
||||
@@ -9914,7 +9914,7 @@ ConvertColorToEnergyCardID:
|
||||
; input:
|
||||
; a = card index to check
|
||||
CheckIfCardCanBePlayed:
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
call LoadCardDataToBuffer1_FromDeckIndex
|
||||
ld a, [wLoadedCard1Type]
|
||||
cp TYPE_ENERGY
|
||||
@@ -9950,7 +9950,7 @@ CheckIfCardCanBePlayed:
|
||||
.loop
|
||||
push bc
|
||||
ld e, b
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
ld d, a
|
||||
call CheckIfCanEvolveInto
|
||||
pop bc
|
||||
|
||||
@@ -46,7 +46,7 @@ AITrainerCardLogic:
|
||||
ai_trainer_card_logic AI_TRAINER_CARD_PHASE_03, RECYCLE, AIDecide_Recycle, AIPlay_Recycle
|
||||
ai_trainer_card_logic AI_TRAINER_CARD_PHASE_13, LASS, AIDecide_Lass, AIPlay_Lass
|
||||
ai_trainer_card_logic AI_TRAINER_CARD_PHASE_04, ITEMFINDER, AIDecide_ItemFinder, AIPlay_ItemFinder
|
||||
ai_trainer_card_logic AI_TRAINER_CARD_PHASE_01, IMAKUNI_CARD, AIDecide_ImakuniCard, AIPlay_ImakuniCard
|
||||
ai_trainer_card_logic AI_TRAINER_CARD_PHASE_01, IMAKUNI_CARD, AIDecide_Imakuni, AIPlay_Imakuni
|
||||
ai_trainer_card_logic AI_TRAINER_CARD_PHASE_01, GAMBLER, AIDecide_Gambler, AIPlay_Gambler
|
||||
ai_trainer_card_logic AI_TRAINER_CARD_PHASE_05, REVIVE, AIDecide_Revive, AIPlay_Revive
|
||||
ai_trainer_card_logic AI_TRAINER_CARD_PHASE_06, POKEMON_FLUTE, AIDecide_PokemonFlute, AIPlay_PokemonFlute
|
||||
@@ -129,7 +129,7 @@ AIProcessHandTrainerCards:
|
||||
push hl
|
||||
push de
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
|
||||
; if Headache effects prevent playing card
|
||||
; move on to the next item in list.
|
||||
@@ -162,7 +162,7 @@ AIProcessHandTrainerCards:
|
||||
push de
|
||||
push hl
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_PLAY_TRAINER
|
||||
farcall AIMakeDecision
|
||||
pop hl
|
||||
@@ -274,16 +274,16 @@ CalculateBDividedByA_Bank08:
|
||||
; makes AI use Potion card.
|
||||
AIPlay_Potion:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld e, a
|
||||
call GetCardDamageAndMaxHP
|
||||
cp 20
|
||||
jr c, .play_card
|
||||
ld a, 20
|
||||
.play_card
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -486,11 +486,11 @@ AIDecide_Potion_Phase11_Deck74:
|
||||
; never overheals.
|
||||
AIPlay_SuperPotion:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
farcall AIPickEnergyCardToDiscard
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ld e, a
|
||||
call GetCardDamageAndMaxHP
|
||||
@@ -498,7 +498,7 @@ AIPlay_SuperPotion:
|
||||
jr c, .heal_amount ; heal min(damage, 40)
|
||||
ld a, $28
|
||||
.heal_amount
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -699,13 +699,13 @@ AIDecide_SuperPotion_Phase13:
|
||||
farcall BigThunderDeckAIDecideSuperPotion
|
||||
ret
|
||||
|
||||
; Shared by Phase_13 and Phase_14. Forwards hTemp_ffa0 = 0 since
|
||||
; Shared by Phase_13 and Phase_14. Forwards hDuelActionArgs + 0 = 0 since
|
||||
; Defender doesn't need a target parameter beyond the active slot.
|
||||
AIPlay_Defender:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
xor a
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -952,7 +952,7 @@ AIPlay_PlusPower:
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ld [wAIPlusPowerAttack], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -1225,9 +1225,9 @@ AIPlay_Switch:
|
||||
or AI_FLAG_USED_SWITCH
|
||||
ld [wCurrentAIFlags], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
xor a
|
||||
@@ -1488,9 +1488,9 @@ AIPlay_GustOfWind:
|
||||
or AI_FLAG_USED_GUST_OF_WIND
|
||||
ld [wCurrentAIFlags], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -1858,7 +1858,7 @@ CheckIfCanDamageBenchedPokemon:
|
||||
|
||||
AIPlay_Bill:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -1875,11 +1875,11 @@ AIDecide_Bill:
|
||||
|
||||
AIPlay_EnergyRemoval:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -2339,15 +2339,15 @@ AIDecide_EnergyRemoval_Deck74:
|
||||
; the list.
|
||||
AIPlay_SuperEnergyRemoval:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex2]
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex3]
|
||||
ldh [hAIEnergyTransPlayAreaLocation], a
|
||||
ldh [hDuelActionArgs + ENERGYTRANS_ARGS_TO_PLAY_AREA], a
|
||||
ld a, [$d09a]
|
||||
ldh [$ffa6], a
|
||||
ld a, $ff
|
||||
@@ -2584,20 +2584,20 @@ ScoreSuperEnergyRemovalTarget:
|
||||
; bail out cleanly if the prior step rejected the choice.
|
||||
AIPlay_PokemonBreeder:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ld a, [wcd15]
|
||||
cp $ff
|
||||
ret z
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld [wTempAIPokemonCard], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, $18
|
||||
farcall AIMakeDecision
|
||||
ld a, [wcd18]
|
||||
@@ -3055,7 +3055,7 @@ AIPlay_ProfessorOak:
|
||||
or AI_FLAG_USED_PROFESSOR_OAK | AI_FLAG_MODIFIED_HAND
|
||||
ld [wCurrentAIFlags], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -3492,17 +3492,17 @@ AIPlay_EnergyRetrieval:
|
||||
or AI_FLAG_MODIFIED_HAND
|
||||
ld [wCurrentAIFlags], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex2]
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
cp $ff
|
||||
jr z, .single_target
|
||||
ld a, $ff
|
||||
ldh [hAIEnergyTransPlayAreaLocation], a
|
||||
ldh [hDuelActionArgs + ENERGYTRANS_ARGS_TO_PLAY_AREA], a
|
||||
.single_target
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
@@ -4145,15 +4145,15 @@ AIPlay_SuperEnergyRetrieval:
|
||||
or AI_FLAG_MODIFIED_HAND
|
||||
ld [wCurrentAIFlags], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex2]
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex3]
|
||||
ldh [hAIEnergyTransPlayAreaLocation], a
|
||||
ldh [hDuelActionArgs + ENERGYTRANS_ARGS_TO_PLAY_AREA], a
|
||||
cp $ff
|
||||
jr z, .done
|
||||
ld a, [$d09a]
|
||||
@@ -4384,7 +4384,7 @@ RemoveCardFromListByValue:
|
||||
; Energy attached to them.
|
||||
AIPlay_PokemonCenter:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -4461,7 +4461,7 @@ AIDecide_PokemonCenter:
|
||||
|
||||
AIPlay_ImposterProfessorOak:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -4514,9 +4514,9 @@ AIDecide_ImposterProfessorOak:
|
||||
|
||||
AIPlay_EnergySearch:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -4762,15 +4762,15 @@ LookForUsefulEnergyForGrassPokemon:
|
||||
; The play wrapper forwards the chosen ordering (slots 1-3 plus $d09a/$d09b).
|
||||
AIPlay_Pokedex:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex2]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex3]
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
ld a, [$d09a]
|
||||
ldh [hAIEnergyTransPlayAreaLocation], a
|
||||
ldh [hDuelActionArgs + ENERGYTRANS_ARGS_TO_PLAY_AREA], a
|
||||
ld a, [$d09b]
|
||||
ldh [$ffa6], a
|
||||
ld a, $ff
|
||||
@@ -4897,7 +4897,7 @@ GetCardTypeFromDeckIndex:
|
||||
|
||||
AIPlay_FullHeal:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -5028,9 +5028,9 @@ AIDecide_FullHeal_Deck53:
|
||||
|
||||
AIPlay_MrFuji:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -5141,11 +5141,11 @@ AIDecide_MrFuji_Deck6D:
|
||||
|
||||
AIPlay_ScoopUp:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -5395,11 +5395,11 @@ AIPlay_Maintenance:
|
||||
or AI_FLAG_MODIFIED_HAND
|
||||
ld [wCurrentAIFlags], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex2]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -5434,16 +5434,16 @@ AIDecide_Maintenance:
|
||||
; (the parameter picks which), tails does nothing.
|
||||
AIPlay_Recycle:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld de, $10e
|
||||
bank1call TossCoin
|
||||
jr nc, .tails
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
jr .decide
|
||||
.tails
|
||||
ld a, $ff
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
.decide
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
@@ -5514,7 +5514,7 @@ AIPlay_Lass:
|
||||
or AI_FLAG_MODIFIED_HAND
|
||||
ld [wCurrentAIFlags], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -5561,13 +5561,13 @@ AIPlay_ItemFinder:
|
||||
or AI_FLAG_MODIFIED_HAND
|
||||
ld [wCurrentAIFlags], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex2]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -5896,9 +5896,9 @@ StoreItemFinderDiscardTarget:
|
||||
scf
|
||||
ret
|
||||
|
||||
AIPlay_ImakuniCard:
|
||||
AIPlay_Imakuni:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -5909,7 +5909,7 @@ AIPlay_ImakuniCard:
|
||||
; confusion is desirable -- but only if our Dark Primeape has 2+
|
||||
; energy attached (so its "Fury Swipes" benefits) and isn't
|
||||
; already confused.
|
||||
AIDecide_ImakuniCard:
|
||||
AIDecide_Imakuni:
|
||||
ld a, [wOpponentDeckID]
|
||||
cp RUNNING_WILD_DECK_ID
|
||||
jr z, .deck_50_dark_primeape
|
||||
@@ -5970,7 +5970,7 @@ AIPlay_Gambler:
|
||||
ld [hld], a
|
||||
ld [hl], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ld hl, wRNGVars
|
||||
@@ -5984,7 +5984,7 @@ AIPlay_Gambler:
|
||||
ret
|
||||
.play_honestly
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -6036,9 +6036,9 @@ AIDecide_Gambler:
|
||||
|
||||
AIPlay_Revive:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -6115,9 +6115,9 @@ AIDecide_Revive_Deck40:
|
||||
|
||||
AIPlay_PokemonFlute:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -6219,7 +6219,7 @@ AIDecide_PokemonFlute:
|
||||
; both (their PHASE_05 table rows point here).
|
||||
AIPlay_ClefairyDollOrMysteriousFossil:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -6280,17 +6280,17 @@ AIDecide_ClefairyDollOrMysteriousFossil:
|
||||
; tails it forwards $ff so AIMakeDecision treats it as "no target".
|
||||
AIPlay_Pokeball:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ldtx de, TrainerCardSuccessCheckText
|
||||
bank1call TossCoin
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
jr nc, .tails
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jr .commit
|
||||
.tails
|
||||
ld a, $ff
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
.commit
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
@@ -6826,13 +6826,13 @@ AIPlay_ComputerSearch:
|
||||
or AI_FLAG_MODIFIED_HAND
|
||||
ld [wCurrentAIFlags], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex2]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -6997,11 +6997,11 @@ AIDecide_ComputerSearch_Deck70:
|
||||
; tell the AI has already traded this turn.
|
||||
AIPlay_PokemonTrader:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ld a, $01
|
||||
@@ -7774,11 +7774,11 @@ AIDecide_PokemonTrader_Deck74:
|
||||
|
||||
AIPlay_TheBosssWay:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, $ff
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -7965,15 +7965,15 @@ AIDecide_TheBosssWay_Deck73:
|
||||
|
||||
AIPlay_NightlyGarbageRun:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex2]
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
ld a, $ff
|
||||
ldh [hAIEnergyTransPlayAreaLocation], a
|
||||
ldh [hDuelActionArgs + ENERGYTRANS_ARGS_TO_PLAY_AREA], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -8520,11 +8520,11 @@ AIPlay_FossilExcavation:
|
||||
or AI_FLAG_MODIFIED_HAND
|
||||
ld [wCurrentAIFlags], a
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -8563,7 +8563,7 @@ AIDecide_FossilExcavation_Deck3BOr63:
|
||||
|
||||
AIPlay_Sleep:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -8620,11 +8620,11 @@ AIDecide_Sleep_Deck53:
|
||||
; let the effect pick).
|
||||
AIPlay_PokemonRecall:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, $ff
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -8676,11 +8676,11 @@ AIDecide_PokemonRecall:
|
||||
|
||||
AIPlay_MasterBall:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, $ff
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -9041,7 +9041,7 @@ AIDecide_MasterBall_Deck74:
|
||||
; Bill's Teleporter has no targeting -- just execute the trainer effect.
|
||||
AIPlay_BillsTeleporter:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -9057,12 +9057,12 @@ AIDecide_BillsTeleporter:
|
||||
|
||||
; Moon Stone evolves a Pokemon already in play. Stash the chosen
|
||||
; play-area position (wAITrainerCardParameter, set by the decider) into
|
||||
; hTemp_ffa0, then execute the trainer effect.
|
||||
; hDuelActionArgs + 0, then execute the trainer effect.
|
||||
AIPlay_MoonStone:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -9129,7 +9129,7 @@ AIDecide_MoonStone:
|
||||
; The Rocket's Trap has no targeting -- just execute the trainer effect.
|
||||
AIPlay_TheRocketsTrap:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -9156,7 +9156,7 @@ AIDecide_TheRocketsTrap:
|
||||
|
||||
AIPlay_GoopGasAttack:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -9185,9 +9185,9 @@ AIDecide_GoopGasAttack:
|
||||
; and draw 7 -- a disruption when their hand is large.
|
||||
AIPlay_ImposterOaksRevenge:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -9247,7 +9247,7 @@ AIDecide_ImposterOaksRevenge:
|
||||
; Digger discards a card to draw 2 -- the AI always plays it when able.
|
||||
AIPlay_Digger:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -9259,17 +9259,17 @@ AIDecide_Digger:
|
||||
; Computer Error's play has its own pre-step: SwapTurn so the
|
||||
; trainer effect picks a card from the *player's* hand to swap,
|
||||
; then SwapTurn back, store the chosen index in
|
||||
; hTempPlayAreaLocation_ffa1, fire the effect, and bump wd033 to
|
||||
; hDuelActionArgs + 1, fire the effect, and bump wd033 to
|
||||
; signal "AI used Computer Error this turn".
|
||||
AIPlay_ComputerError:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
call SwapTurn
|
||||
farcall HandleComputerErrorPlayerSelection
|
||||
call SwapTurn
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ld a, $02
|
||||
@@ -9320,19 +9320,19 @@ AIDecide_ComputerError:
|
||||
; On tails the trainer effect treats $ff as "no target."
|
||||
AIPlay_SuperScoopUp:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ldtx de, TrainerCardSuccessCheckText
|
||||
bank1call TossCoin
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
jr nc, .tails
|
||||
ld a, [wAITrainerCardParameter]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wTempAIMultiTargetCardDeckIndex1]
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
jr .commit
|
||||
.tails
|
||||
ld a, $ff
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
.commit
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
|
||||
@@ -258,7 +258,7 @@ DisplayOpponentUsedAttackScreen:
|
||||
call EmptyScreen
|
||||
call LoadDuelCardSymbolTiles
|
||||
call LoadDuelFaceDownCardTiles
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
call LoadCardDataToBuffer1_FromDeckIndex
|
||||
ld a, CARDPAGE_POKEMON_OVERVIEW
|
||||
ld [wCardPageNumber], a
|
||||
@@ -395,9 +395,9 @@ PrintTextToDescriptionScreenTextBox:
|
||||
jp PrintTextNoDelay
|
||||
|
||||
; display card detail when a trainer card is used, and print "Used xxx"
|
||||
; hTempCardIndex_ff9f contains the card's deck index
|
||||
; hDuelActionCardIndex contains the card's deck index
|
||||
DisplayUsedTrainerCardDetailScreen:
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
ldtx hl, UsedText
|
||||
bank1call DisplayCardDetailScreen
|
||||
ret
|
||||
@@ -570,13 +570,13 @@ OppAction_FinishTurnWithoutAttacking:
|
||||
ret
|
||||
|
||||
OppAction_PlayEnergyCard:
|
||||
ldh a, [hTempPlayAreaLocation_ffa1]
|
||||
ldh a, [hDuelActionArgs + 1]
|
||||
ldh [hTempPlayAreaLocation_ff9d], a
|
||||
ld e, a
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ldh [hTempCardIndex_ff98], a
|
||||
call PutHandCardInPlayArea
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
call LoadCardDataToBuffer1_FromDeckIndex
|
||||
call DrawLargePictureOfCard
|
||||
call PrintAttachedEnergyToPokemon
|
||||
@@ -587,9 +587,9 @@ OppAction_PlayEnergyCard:
|
||||
ret
|
||||
|
||||
OppAction_EvolvePokemonCard:
|
||||
ldh a, [hTempPlayAreaLocation_ffa1]
|
||||
ldh a, [hDuelActionArgs + 1]
|
||||
ldh [hTempPlayAreaLocation_ff9d], a
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ldh [hTempCardIndex_ff98], a
|
||||
call LoadCardDataToBuffer1_FromDeckIndex
|
||||
call DrawLargePictureOfCard
|
||||
@@ -600,14 +600,14 @@ OppAction_EvolvePokemonCard:
|
||||
ret
|
||||
|
||||
OppAction_PlayBasicPokemonCard:
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ldh [hTempCardIndex_ff98], a
|
||||
call PutHandPokemonCardInPlayArea
|
||||
ldh [hTempPlayAreaLocation_ff9d], a
|
||||
add DUELVARS_ARENA_CARD_STAGE
|
||||
get_turn_duelist_var
|
||||
ld [hl], BASIC
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ldtx hl, PlacedOnBenchText
|
||||
bank1call DisplayCardDetailScreen
|
||||
ld a, TRUE
|
||||
@@ -657,16 +657,16 @@ OppAction_ExecuteTrainerCardEffectCommands:
|
||||
ld a, EFFECTCMDTYPE_BEFORE_DAMAGE
|
||||
call TryExecuteEffectCommandFunction
|
||||
bank1call DrawDuelMainScene
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
call MoveHandCardToDiscardPile
|
||||
call ExchangeRNG
|
||||
bank1call DrawDuelMainScene
|
||||
ret
|
||||
|
||||
OppAction_BeginUseAttack:
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
ld d, a
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ld e, a
|
||||
call CopyAttackDataAndDamage_FromDeckIndex
|
||||
call UpdateTempDuelistCardIDsAndClearTwoTurnDuelVars
|
||||
@@ -698,7 +698,7 @@ OppAction_UseAttack:
|
||||
|
||||
; now handle EFFECTCMDTYPE_DISCARD_ENERGY here
|
||||
OppAction_PlayAttackAnimationDealAttackDamage:
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
cp -1
|
||||
jr z, .metronome_unsuccessful
|
||||
ld a, EFFECTCMDTYPE_DISCARD_ENERGY
|
||||
@@ -727,14 +727,14 @@ OppAction_ForceSwitchActive:
|
||||
ret
|
||||
|
||||
OppAction_UsePokemonPower_NoEffect2:
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
ld d, a
|
||||
ld e, FIRST_ATTACK_OR_PKMN_POWER
|
||||
call CopyAttackDataAndDamage_FromDeckIndex
|
||||
call ClearTwoTurnDuelVars
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ldh [hTempPlayAreaLocation_ff9d], a
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
call LoadCardNameToTxRam2
|
||||
ld hl, wLoadedAttackName
|
||||
ld a, [hli]
|
||||
@@ -747,19 +747,19 @@ OppAction_UsePokemonPower_NoEffect2:
|
||||
ret
|
||||
|
||||
OppAction_UsePokemonPower:
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
ld d, a
|
||||
ld e, FIRST_ATTACK_OR_PKMN_POWER
|
||||
call CopyAttackDataAndDamage_FromDeckIndex
|
||||
call ClearTwoTurnDuelVars
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ldh [hTempPlayAreaLocation_ff9d], a
|
||||
ld a, EFFECTCMDTYPE_INITIAL_EFFECT_2
|
||||
call TryExecuteEffectCommandFunction
|
||||
ld a, [wcd0d]
|
||||
or a
|
||||
jr nz, .exit
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
call LoadCardNameToTxRam2
|
||||
ld hl, wLoadedAttackName
|
||||
ld a, [hli]
|
||||
@@ -809,7 +809,7 @@ OppAction_TossCoinATimes:
|
||||
OppAction_6b30:
|
||||
ldh a, [hWhoseTurn]
|
||||
push af
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ldh [hWhoseTurn], a
|
||||
call PlayDeckShuffleAnimation
|
||||
pop af
|
||||
@@ -824,7 +824,7 @@ OppAction_UseMetronomeAttack:
|
||||
call SwapTurn
|
||||
call CopyAttackDataAndDamage_FromDeckIndex
|
||||
call SwapTurn
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
ld [wPlayerAttackingCardIndex], a
|
||||
ld a, [wSelectedAttack]
|
||||
ld [wPlayerAttackingAttackIndex], a
|
||||
@@ -841,7 +841,7 @@ OppAction_UseMetronomeAttack:
|
||||
ret
|
||||
|
||||
OppAction_ProcessPlayedPokemonCard:
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ldh [hTempPlayAreaLocation_ff9d], a
|
||||
bank1call ProcessPlayedPokemonCard.Process
|
||||
ret nc
|
||||
@@ -855,7 +855,7 @@ OppAction_ProcessTriggeredPokemonPower:
|
||||
ret
|
||||
|
||||
OppAction_ComputerErrorPrompt:
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ld l, a
|
||||
ld h, 0
|
||||
call LoadTxRam3
|
||||
@@ -1459,7 +1459,7 @@ HandleComputerErrorPlayerSelection:
|
||||
; handles player selection when opponent
|
||||
; accepts challenge due to the effects of Challenge! card
|
||||
HandleChallengeCardPlayerSelection:
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ldh [hCurSelectionItem], a
|
||||
call CreateDeckCardList
|
||||
jr nc, .has_deck_cards
|
||||
@@ -1526,7 +1526,7 @@ HandleChallengeCardPlayerSelection:
|
||||
call GetNextPositionInTempList
|
||||
ld [hl], $ff ; terminating byte
|
||||
ldh a, [hCurSelectionItem]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ret
|
||||
|
||||
.try_cancel
|
||||
@@ -1542,7 +1542,7 @@ HandleChallengeCardPlayerSelection:
|
||||
jr .done_selection
|
||||
|
||||
PrintHowManyCardsLinkOpponentChoseDueToChallenge:
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
sub $02
|
||||
ld hl, wTxRam3
|
||||
ld [hli], a
|
||||
|
||||
@@ -115,9 +115,9 @@ AIAttachEnergyInHandToCardInPlayArea:
|
||||
|
||||
.attach
|
||||
call FindCardIDInTurnDuelistsPlayArea
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
pop af
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_PLAY_ENERGY
|
||||
farcall AIMakeDecision
|
||||
ret
|
||||
@@ -811,9 +811,9 @@ AISelectSpecialAttackParameters:
|
||||
|
||||
.devolve_to_ko
|
||||
ld a, $01 ; player's Play Area
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
call LookForCardThatIsKnockedOutOnDevolution
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -826,11 +826,11 @@ AISelectSpecialAttackParameters:
|
||||
; in own Play Area to devolve so it can reuse
|
||||
; Power of Darkness on next turn
|
||||
xor a ; AI's Play Area
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, GENGAR_LV40
|
||||
ld b, PLAY_AREA_BENCH_1
|
||||
call FindCardIDInTurnDuelistsPlayArea
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -842,20 +842,20 @@ AISelectSpecialAttackParameters:
|
||||
jp nz, .no_carry
|
||||
|
||||
ld a, $ff
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
|
||||
; search for Psychic energy cards in Discard Pile
|
||||
ld de, PSYCHIC_ENERGY
|
||||
ld a, CARD_LOCATION_DISCARD_PILE
|
||||
call FindCardIDInLocation
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
farcall CreateEnergyCardListFromDiscardPile_OnlyBasic
|
||||
|
||||
; find any energy card different from
|
||||
; the one found by FindCardIDInLocation.
|
||||
; since using this attack requires a Psychic energy card,
|
||||
; and another one is in hTemp_ffa0,
|
||||
; and another one is in hDuelActionArgs + 0,
|
||||
; then any other energy card would account
|
||||
; for the Energy Cost of Psyburn.
|
||||
ld hl, wDuelTempList
|
||||
@@ -864,13 +864,13 @@ AISelectSpecialAttackParameters:
|
||||
cp $ff
|
||||
jr z, .set_carry
|
||||
ld b, a
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
cp b
|
||||
jr z, .loop_energy_cards ; same card, keep looking
|
||||
|
||||
; store the deck index of energy card found
|
||||
ld a, b
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
|
||||
.set_carry
|
||||
scf
|
||||
@@ -884,7 +884,7 @@ AISelectSpecialAttackParameters:
|
||||
jp nz, .no_carry
|
||||
farcall AIDecideBenchPokemonToSwitchTo
|
||||
jr c, .no_carry
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -899,7 +899,7 @@ AISelectSpecialAttackParameters:
|
||||
ld a, CARD_LOCATION_DECK
|
||||
ld de, LIGHTNING_ENERGY
|
||||
call FindCardIDInLocation
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
jp nc, .no_carry
|
||||
|
||||
; ...else find a suitable Play Area Pokemon to
|
||||
@@ -907,7 +907,7 @@ AISelectSpecialAttackParameters:
|
||||
farcall AIProcessButDontPlayEnergy_SkipEvolution
|
||||
jp nc, .no_carry
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -919,7 +919,7 @@ AISelectSpecialAttackParameters:
|
||||
; toss coin
|
||||
ldtx de, IfHeadsAttachUpTo3WaterEnergyFromDeckText
|
||||
farcall Serial_TossCoin
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
|
||||
; check number of Water energies attached to Kingler
|
||||
ld e, PLAY_AREA_ARENA
|
||||
@@ -931,7 +931,7 @@ AISelectSpecialAttackParameters:
|
||||
|
||||
; a = number of Water energies still needed
|
||||
; for Double-Edged Claw
|
||||
ld hl, hTempPlayAreaLocation_ffa1
|
||||
ld hl, hDuelActionArgs + 1
|
||||
jr c, .kingler_no_energy_required
|
||||
jr z, .kingler_no_energy_required
|
||||
ld de, WATER_ENERGY
|
||||
@@ -943,7 +943,7 @@ AISelectSpecialAttackParameters:
|
||||
|
||||
.WaterBomb:
|
||||
ld a, MAX_PLAY_AREA_POKEMON + 1
|
||||
ld hl, hTemp_ffa0
|
||||
ld hl, hDuelActionArgs + 0
|
||||
farcall ClearNBytesFromHL
|
||||
ld e, PLAY_AREA_ARENA
|
||||
call GetPlayAreaCardAttachedEnergies
|
||||
@@ -960,12 +960,12 @@ AISelectSpecialAttackParameters:
|
||||
; can KO, store this location
|
||||
ld c, a
|
||||
ld b, $00
|
||||
ld hl, hTempPlayAreaLocation_ffa1
|
||||
ld hl, hDuelActionArgs + 1
|
||||
add hl, bc
|
||||
ld [hl], 1
|
||||
ld b, a
|
||||
ld a, 1
|
||||
ldh [hTemp_ffa0], a ; number of selected targets
|
||||
ldh [hDuelActionArgs + 0], a ; number of selected targets
|
||||
|
||||
; look for another card to KO,
|
||||
; other than the one already checked
|
||||
@@ -983,13 +983,13 @@ AISelectSpecialAttackParameters:
|
||||
.can_ko_both
|
||||
ld c, a
|
||||
ld b, $00
|
||||
ld hl, hTempPlayAreaLocation_ffa1
|
||||
ld hl, hDuelActionArgs + 1
|
||||
add hl, bc
|
||||
ld a, [hl]
|
||||
inc a
|
||||
ld [hl], a
|
||||
ld a, 2
|
||||
ldh [hTemp_ffa0], a ; number of selected targets
|
||||
ldh [hDuelActionArgs + 0], a ; number of selected targets
|
||||
.made_water_bomb_selection
|
||||
scf
|
||||
ret
|
||||
@@ -1003,11 +1003,11 @@ AISelectSpecialAttackParameters:
|
||||
jr nc, .made_water_bomb_selection
|
||||
ld c, a
|
||||
ld b, $00
|
||||
ld hl, hTempPlayAreaLocation_ffa1
|
||||
ld hl, hDuelActionArgs + 1
|
||||
add hl, bc
|
||||
ld [hl], 2
|
||||
ld a, 2
|
||||
ldh [hTemp_ffa0], a ; number of selected targets
|
||||
ldh [hDuelActionArgs + 0], a ; number of selected targets
|
||||
jr .made_water_bomb_selection
|
||||
|
||||
.one_water_bomb_target
|
||||
@@ -1018,11 +1018,11 @@ AISelectSpecialAttackParameters:
|
||||
jr nc, .made_water_bomb_selection
|
||||
ld c, a
|
||||
ld b, $00
|
||||
ld hl, hTempPlayAreaLocation_ffa1
|
||||
ld hl, hDuelActionArgs + 1
|
||||
add hl, bc
|
||||
ld [hl], 1
|
||||
ld a, 1
|
||||
ldh [hTemp_ffa0], a ; number of selected targets
|
||||
ldh [hDuelActionArgs + 0], a ; number of selected targets
|
||||
jr .made_water_bomb_selection
|
||||
|
||||
.Foxfire:
|
||||
@@ -1035,7 +1035,7 @@ AISelectSpecialAttackParameters:
|
||||
jr c, .asm_285ff
|
||||
farcall FindBenchCardThatCanBeDamaged
|
||||
.asm_285ff
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1043,13 +1043,13 @@ AISelectSpecialAttackParameters:
|
||||
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
|
||||
call GetNonTurnDuelistVariable
|
||||
call Random
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
.select_foxfire_based_on_energies
|
||||
farcall AIDecideFoxfireTarget
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1072,12 +1072,12 @@ AISelectSpecialAttackParameters:
|
||||
farcall AIProcessButDontPlayEnergy_SkipEvolutionAndArena
|
||||
jr nc, .asm_28661
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
call CreateArenaOrBenchEnergyCardList
|
||||
jr c, .energy_bomb_no_more_energies ; no energies
|
||||
ld a, [wDuelTempList + 0] ; first energy card
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld b, 60
|
||||
.asm_2864a
|
||||
call DoFrame
|
||||
@@ -1093,10 +1093,10 @@ AISelectSpecialAttackParameters:
|
||||
jr .asm_28633
|
||||
.asm_28661
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
.asm_28664
|
||||
ld a, DUELVARS_BENCH
|
||||
ld hl, hTempPlayAreaLocation_ffa1
|
||||
ld hl, hDuelActionArgs + 1
|
||||
add [hl]
|
||||
get_turn_duelist_var
|
||||
cp $ff
|
||||
@@ -1105,7 +1105,7 @@ AISelectSpecialAttackParameters:
|
||||
call CreateArenaOrBenchEnergyCardList
|
||||
jr c, .energy_bomb_no_more_energies
|
||||
ld a, [wDuelTempList + 0] ; first energy card
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld b, 60
|
||||
.asm_2867b
|
||||
call DoFrame
|
||||
@@ -1118,7 +1118,7 @@ AISelectSpecialAttackParameters:
|
||||
call CopyAttackDataAndDamage_FromDeckIndex
|
||||
ld a, OPPACTION_6B15
|
||||
farcall AIMakeDecision
|
||||
ld hl, hTempPlayAreaLocation_ffa1
|
||||
ld hl, hDuelActionArgs + 1
|
||||
inc [hl]
|
||||
jr .asm_28664
|
||||
.energy_bomb_no_more_energies
|
||||
@@ -1144,11 +1144,11 @@ AISelectSpecialAttackParameters:
|
||||
jp nz, .no_carry
|
||||
ldtx de, IfTails30DamageTo1OfYourPokemonText
|
||||
farcall Serial_TossCoin
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
or a
|
||||
jr nz, .asm_286c7
|
||||
call AIChooseRagingThunderTarget
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
.asm_286c7
|
||||
scf
|
||||
ret
|
||||
@@ -1161,7 +1161,7 @@ AISelectSpecialAttackParameters:
|
||||
ld de, LIGHTNING_ENERGY
|
||||
ld a, CARD_LOCATION_DECK
|
||||
call FindCardIDInLocation
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1172,7 +1172,7 @@ AISelectSpecialAttackParameters:
|
||||
; ...if not, then choose a target based on damage
|
||||
call AIChooseShortCircuitTarget
|
||||
.got_short_circuit_target
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1184,13 +1184,13 @@ AISelectSpecialAttackParameters:
|
||||
call CreateArenaOrBenchEnergyCardList
|
||||
jp c, .no_carry ; no energies
|
||||
ld a, [wDuelTempList + 0] ; first energy in list
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
; fetch a Clefairy Doll from the Discard Pile
|
||||
ld de, CLEFAIRY_DOLL
|
||||
ld a, CARD_LOCATION_DISCARD_PILE
|
||||
call FindCardIDInLocation
|
||||
jp nc, .no_carry
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1200,7 +1200,7 @@ AISelectSpecialAttackParameters:
|
||||
jp nz, .no_carry
|
||||
ldtx de, AttackSuccessCheckText
|
||||
farcall Serial_TossCoin
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
or a
|
||||
jr z, .errand_running_tails
|
||||
; find a Bill first
|
||||
@@ -1217,7 +1217,7 @@ AISelectSpecialAttackParameters:
|
||||
.errand_running_tails
|
||||
ld a, $ff
|
||||
.found_target_for_errand_running
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1236,7 +1236,7 @@ AISelectSpecialAttackParameters:
|
||||
; discard as many as possible
|
||||
ld b, a ; number of energies available to discard
|
||||
ld hl, wDuelTempList
|
||||
ld de, hTemp_ffa0
|
||||
ld de, hDuelActionArgs + 0
|
||||
ld [de], a ; number of energies
|
||||
inc de
|
||||
.loop_fill_flame_inferno_list
|
||||
@@ -1254,10 +1254,10 @@ AISelectSpecialAttackParameters:
|
||||
ret
|
||||
.dont_discard_for_flame_inferno
|
||||
xor a ; 0 energies
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
; empty list
|
||||
ld a, $ff
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1269,7 +1269,7 @@ AISelectSpecialAttackParameters:
|
||||
ld a, CARD_LOCATION_DISCARD_PILE ; bug, should be CARD_LOCATION_DISCARD_DECK
|
||||
call FindCardIDInLocation
|
||||
jp nc, .no_carry
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1279,10 +1279,10 @@ AISelectSpecialAttackParameters:
|
||||
jp nz, .no_carry
|
||||
farcall AIDecide_GustOfWind
|
||||
jp nc, .no_carry
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ldtx de, AttackSuccessCheckText
|
||||
farcall Serial_TossCoin
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1294,9 +1294,9 @@ AISelectSpecialAttackParameters:
|
||||
; no Play Area Pokémon has damage
|
||||
ldtx de, DamageCheckIfTailsNoDamageText
|
||||
farcall Serial_TossCoin
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
xor a ; choose Arena card
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1306,12 +1306,12 @@ AISelectSpecialAttackParameters:
|
||||
jp nz, .no_carry
|
||||
farcall HandleMandatorySwitchSelection
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
farcall AIDecideBenchPokemonToSwitchTo
|
||||
jr nc, .got_stir_up_twister_decision
|
||||
ld a, $ff ; no switch
|
||||
.got_stir_up_twister_decision
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1337,7 +1337,7 @@ AISelectSpecialAttackParameters:
|
||||
.got_stare_target_to_ko
|
||||
ld a, b
|
||||
.got_stare_target
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1409,7 +1409,7 @@ AISelectSpecialAttackParameters:
|
||||
get_turn_duelist_var
|
||||
dec a
|
||||
.got_num_food_counters_to_remove
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1425,11 +1425,11 @@ AISelectSpecialAttackParameters:
|
||||
jp c, .no_carry
|
||||
; attach it to Pokémon with least amount of HP remaining in Bench
|
||||
ld a, [wDuelTempList + 0]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, PLAY_AREA_BENCH_1
|
||||
ld d, 10
|
||||
call AIFindPlayAreaPkmnWithMinimumLeastRemainingHP
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ret
|
||||
|
||||
.FlamePillar:
|
||||
@@ -1437,7 +1437,7 @@ AISelectSpecialAttackParameters:
|
||||
ld d, 10
|
||||
call AIFindPlayAreaPkmnWithMinimumLeastRemainingHP
|
||||
jr nc, .dont_discard_for_flame_pillar
|
||||
ldh [hPlayAreaEffectTarget], a
|
||||
ldh [hDuelActionArgs + 2], a
|
||||
; discard if will KO bench card
|
||||
ld a, 10
|
||||
cp d
|
||||
@@ -1447,7 +1447,7 @@ AISelectSpecialAttackParameters:
|
||||
jr c, .discard_energy_for_flame_pillar
|
||||
.dont_discard_for_flame_pillar
|
||||
ld a, $01
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
.discard_energy_for_flame_pillar
|
||||
@@ -1456,9 +1456,9 @@ AISelectSpecialAttackParameters:
|
||||
jr c, .dont_discard_for_flame_pillar
|
||||
; choose first energy card
|
||||
ld a, [wDuelTempList + 0]
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
xor a
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1469,9 +1469,9 @@ AISelectSpecialAttackParameters:
|
||||
farcall CheckIfDefendingPokemonCanKnockOut
|
||||
jp nc, .no_carry
|
||||
ld a, $ff
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hPlayAreaEffectTarget], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ldh [hDuelActionArgs + 2], a
|
||||
ldh [$ffa5], a
|
||||
farcall CheckIfDefendingCardIsWeakToArenaCard
|
||||
ld c, 10
|
||||
@@ -1529,7 +1529,7 @@ AISelectSpecialAttackParameters:
|
||||
.got_cards_to_discard_for_burning_fire
|
||||
ld b, a
|
||||
ld hl, wDuelTempList
|
||||
ld de, hTemp_ffa0
|
||||
ld de, hDuelActionArgs + 0
|
||||
.loop_fill_burning_fire_list
|
||||
ld a, [hli]
|
||||
ld [de], a
|
||||
@@ -1554,9 +1554,9 @@ AISelectSpecialAttackParameters:
|
||||
jr c, .got_num_energy_discard_for_rock_blast
|
||||
ld a, 5 ; maximum 5 energies
|
||||
.got_num_energy_discard_for_rock_blast
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld b, a
|
||||
ld hl, hTempPlayAreaLocation_ffa1
|
||||
ld hl, hDuelActionArgs + 1
|
||||
ld de, wDuelTempList
|
||||
.loop_fill_rock_blast_energy_list
|
||||
ld a, [de]
|
||||
@@ -1571,7 +1571,7 @@ AISelectSpecialAttackParameters:
|
||||
pop hl
|
||||
jr c, .defending_is_invulnerable_to_rock_blast
|
||||
; choose all of them on the Defending card
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ld [hli], a ; PLAY_AREA_ARENA
|
||||
xor a
|
||||
ld [hli], a ; PLAY_AREA_BENCH_1
|
||||
@@ -1598,11 +1598,11 @@ AISelectSpecialAttackParameters:
|
||||
ret z ; no Bench
|
||||
dec a
|
||||
ld c, a ; number of benched Pokémon
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
or a
|
||||
jr z, .asm_28984 ; no energy cards to discard
|
||||
; choose randomly from player's Bench,
|
||||
; up to [hTemp_ffa0] number of cards
|
||||
; up to [hDuelActionArgs + 0] number of cards
|
||||
ld b, a
|
||||
ld d, $00
|
||||
.loop_rock_blast_random_selection
|
||||
@@ -1632,7 +1632,7 @@ AISelectSpecialAttackParameters:
|
||||
call FindPlayAreaCardWithLeastRemainingHP
|
||||
call SwapTurn
|
||||
.got_drag_off_target
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1650,7 +1650,7 @@ AISelectSpecialAttackParameters:
|
||||
.dont_switch_teleport_blast
|
||||
ld a, $ff
|
||||
.got_teleport_blast_target
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1683,13 +1683,13 @@ AISelectSpecialAttackParameters:
|
||||
ld a, e
|
||||
ldh [$ffa5], a
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
farcall GetFirstBasicEnergyAttachedToPlayAreaCard
|
||||
ldh [hPlayAreaEffectTarget], a
|
||||
ldh [hDuelActionArgs + 2], a
|
||||
call SwapTurn
|
||||
ldtx de, AttackSuccessCheckText
|
||||
farcall TossCoin_Bank1a
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ret c
|
||||
farcall SetWasUnsuccessful
|
||||
scf
|
||||
@@ -1720,7 +1720,7 @@ AISelectSpecialAttackParameters:
|
||||
ld a, PLAY_AREA_ARENA
|
||||
.got_telekinesis_target
|
||||
farcall FindReplacementPkmnIfMrMime
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ret
|
||||
|
||||
.TextureMagic:
|
||||
@@ -1731,7 +1731,7 @@ AISelectSpecialAttackParameters:
|
||||
cp VERY_RARE_CARD_DECK_ID
|
||||
jr z, .choose_color_of_strongest_pkmn
|
||||
ld a, $ff
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
call SwapTurn
|
||||
bank1call GetArenaCardWeakness
|
||||
call SwapTurn
|
||||
@@ -1739,7 +1739,7 @@ AISelectSpecialAttackParameters:
|
||||
jr z, .choose_texture_magic_resistance
|
||||
; always choose Grass as player's Arena card weakness
|
||||
ld a, GRASS
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
.choose_texture_magic_resistance
|
||||
; choose arena card's color for Porygon's resistance
|
||||
call SwapTurn
|
||||
@@ -1750,7 +1750,7 @@ AISelectSpecialAttackParameters:
|
||||
jr nz, .got_texture_magic_color
|
||||
ld a, PSYCHIC
|
||||
.got_texture_magic_color
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1764,7 +1764,7 @@ AISelectSpecialAttackParameters:
|
||||
jr c, .strongest_pkmn_is_valid_color
|
||||
ld a, $ff
|
||||
.strongest_pkmn_is_valid_color
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jr .choose_texture_magic_resistance
|
||||
|
||||
.Lure:
|
||||
@@ -1773,7 +1773,7 @@ AISelectSpecialAttackParameters:
|
||||
jp nz, .no_carry
|
||||
farcall AIChoosePlayerBenchPkmnWithNotEnoughEnergiesOrHighRetreatCost
|
||||
ret nc
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1784,7 +1784,7 @@ AISelectSpecialAttackParameters:
|
||||
ld a, FIGHTING
|
||||
farcall AIChooseFollowMeTarget
|
||||
ret nc ; no target
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1797,7 +1797,7 @@ AISelectSpecialAttackParameters:
|
||||
jp z, .no_carry
|
||||
; always choose Grass
|
||||
ld a, GRASS
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
@@ -1816,10 +1816,10 @@ AISelectSpecialAttackParameters:
|
||||
; default to Arena card
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
.got_focus_blast_target
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ldtx de, IfHeads20DamageTo1OfOppPokemonText
|
||||
farcall Serial_TossCoin
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
scf
|
||||
ret
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ HandleAIEnergyTrans:
|
||||
ld a, DUELVARS_ARENA_CARD
|
||||
add b
|
||||
get_turn_duelist_var
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
call GetCardIDFromDeckIndex
|
||||
cp16 VENUSAUR_LV67
|
||||
jr z, .use_pkmn_power
|
||||
@@ -70,14 +70,14 @@ HandleAIEnergyTrans:
|
||||
|
||||
.use_pkmn_power
|
||||
ld a, b
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
farcall AIMakeDecision
|
||||
|
||||
xor a
|
||||
ldh [hAIEnergyTransPlayAreaLocation], a
|
||||
ldh [hDuelActionArgs + ENERGYTRANS_ARGS_TO_PLAY_AREA], a
|
||||
ld a, [wd082]
|
||||
ld d, a
|
||||
|
||||
@@ -91,7 +91,7 @@ HandleAIEnergyTrans:
|
||||
jr c, .next_card
|
||||
|
||||
and %00001111
|
||||
ldh [hAIPkmnPowerEffectParam], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
|
||||
ld a, e
|
||||
push de
|
||||
@@ -102,7 +102,7 @@ HandleAIEnergyTrans:
|
||||
|
||||
; store the deck index of energy card
|
||||
ld a, e
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
|
||||
push de
|
||||
ld d, 30
|
||||
@@ -292,7 +292,7 @@ AIEnergyTransTransferEnergyToBench:
|
||||
ld a, DUELVARS_ARENA_CARD
|
||||
add b
|
||||
get_turn_duelist_var
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld [wAIVenusaurLv67DeckIndex], a
|
||||
call GetCardIDFromDeckIndex
|
||||
cp16 VENUSAUR_LV67
|
||||
@@ -308,7 +308,7 @@ AIEnergyTransTransferEnergyToBench:
|
||||
; use Energy Trans Pkmn Power
|
||||
.use_pkmn_power
|
||||
ld a, b
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld [wd07f], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
@@ -318,9 +318,9 @@ AIEnergyTransTransferEnergyToBench:
|
||||
; loop for each energy cards that are going to be transferred.
|
||||
.loop_energy
|
||||
xor a
|
||||
ldh [hAIPkmnPowerEffectParam], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wd07f]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
|
||||
; returns when Arena card has no Grass energy cards attached.
|
||||
ld e, PLAY_AREA_ARENA
|
||||
@@ -348,7 +348,7 @@ AIEnergyTransTransferEnergyToBench:
|
||||
|
||||
; store the deck index of energy card
|
||||
ld a, e
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
jr .transfer
|
||||
|
||||
.next_card
|
||||
@@ -363,7 +363,7 @@ AIEnergyTransTransferEnergyToBench:
|
||||
farcall AIProcessButDontPlayEnergy_SkipEvolutionAndArena
|
||||
jr nc, .done_transfer
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hAIEnergyTransPlayAreaLocation], a
|
||||
ldh [hDuelActionArgs + ENERGYTRANS_ARGS_TO_PLAY_AREA], a
|
||||
|
||||
ld d, 30
|
||||
.small_delay_loop
|
||||
@@ -372,7 +372,7 @@ AIEnergyTransTransferEnergyToBench:
|
||||
jr nz, .small_delay_loop
|
||||
|
||||
ld a, [wAIVenusaurLv67DeckIndex]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld d, a
|
||||
ld e, FIRST_ATTACK_OR_PKMN_POWER
|
||||
call CopyAttackDataAndDamage_FromDeckIndex
|
||||
@@ -571,16 +571,16 @@ HandleAIPkmnPowers:
|
||||
; c = Play Area location (PLAY_AREA_*) of Vileplume.
|
||||
HandleAIHeal:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
call .CheckHealTarget
|
||||
ret nc ; return if no target to heal
|
||||
push af
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
pop af
|
||||
ldh [hPlayAreaEffectTarget], a
|
||||
ldh [hDuelActionArgs + 2], a
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_DUEL_MAIN_SCENE
|
||||
@@ -679,7 +679,7 @@ HandleAIShift:
|
||||
or a
|
||||
ret nz ; return if Venomoth is not Arena card
|
||||
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
bank1call GetArenaCardColor
|
||||
call TranslateColorToWR
|
||||
ld b, a
|
||||
@@ -703,7 +703,7 @@ HandleAIShift:
|
||||
|
||||
.found
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
|
||||
@@ -720,7 +720,7 @@ HandleAIShift:
|
||||
; use Pkmn Power effect
|
||||
.done
|
||||
ld a, b
|
||||
ldh [hAIPkmnPowerEffectParam], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_DUEL_MAIN_SCENE
|
||||
@@ -837,7 +837,7 @@ HandleAIShift:
|
||||
; c = Play Area location (PLAY_AREA_*) of Mankey.
|
||||
HandleAIPeek:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, 50
|
||||
call Random
|
||||
cp 3
|
||||
@@ -904,11 +904,11 @@ HandleAIPeek:
|
||||
.use_peek
|
||||
push af
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
pop af
|
||||
ldh [hAIPkmnPowerEffectParam], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_DUEL_MAIN_SCENE
|
||||
@@ -923,14 +923,14 @@ HandleAIStrangeBehavior:
|
||||
or a
|
||||
ret z ; return if Slowbro is Arena card
|
||||
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld e, PLAY_AREA_ARENA
|
||||
call GetCardDamageAndMaxHP
|
||||
or a
|
||||
ret z ; return if Arena card has no damage counters
|
||||
|
||||
ld [wd082], a
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
add DUELVARS_ARENA_CARD_HP
|
||||
get_turn_duelist_var
|
||||
sub 10
|
||||
@@ -946,11 +946,11 @@ HandleAIStrangeBehavior:
|
||||
.use_strange_behavior
|
||||
push af
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
xor a
|
||||
ldh [hAIPkmnPowerEffectParam], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
farcall AIMakeDecision
|
||||
pop af
|
||||
@@ -986,7 +986,7 @@ HandleAIStrangeBehavior:
|
||||
; c = Play Area location (PLAY_AREA_*) of Gengar.
|
||||
HandleAICurse:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
|
||||
; loop Player's Play Area and checks their damage.
|
||||
; finds the card with lowest remaining HP and
|
||||
@@ -1030,7 +1030,7 @@ HandleAICurse:
|
||||
; card in Play Area with lowest HP remaining was found.
|
||||
; look for another card to take damage counter from.
|
||||
ld a, h
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
ld b, a
|
||||
ld a, 10
|
||||
cp c
|
||||
@@ -1072,10 +1072,10 @@ HandleAICurse:
|
||||
|
||||
.use_curse
|
||||
ld a, e
|
||||
ldh [hAIPkmnPowerEffectParam], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
call SwapTurn
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -1089,7 +1089,7 @@ HandleAICurse:
|
||||
; c = Play Area location (PLAY_AREA_*) of Drowzee.
|
||||
HandleAILongDistanceHypnosis:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
|
||||
call CheckIfArenaCardCanKnockOutDefendingCard
|
||||
ccf
|
||||
@@ -1144,7 +1144,7 @@ HandleAILongDistanceHypnosis:
|
||||
ret c ; difference is less than 4
|
||||
.use_long_distance_hypnosis
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -1167,7 +1167,7 @@ HandleAILongDistanceHypnosis:
|
||||
; c = Play Area location (PLAY_AREA_*) of Dark Gloom.
|
||||
HandleAIPollenStench:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
|
||||
ld a, DUELVARS_ARENA_CARD_STATUS
|
||||
call GetNonTurnDuelistVariable
|
||||
@@ -1251,7 +1251,7 @@ HandleAIPollenStench:
|
||||
ret z
|
||||
.use_pollen_stench
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -1360,9 +1360,9 @@ HandleAIGatherFire:
|
||||
inc c
|
||||
jr nc, .loop_bench
|
||||
.use_gather_fire
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -1429,7 +1429,7 @@ HandleAIGatherFire:
|
||||
; c = Play Area location (PLAY_AREA_*) of Dark Dragonair.
|
||||
HandleAIEvolutionaryLight:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wOpponentDeckID]
|
||||
cp GREAT_DRAGON_DECK_ID
|
||||
jr z, .great_dragon_deck
|
||||
@@ -1448,9 +1448,9 @@ HandleAIEvolutionaryLight:
|
||||
ret
|
||||
|
||||
.use_evolutionary_light
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -1639,7 +1639,7 @@ HandleAIEvolutionaryLight:
|
||||
; c = Play Area location (PLAY_AREA_*) of Dark Kadabra.
|
||||
HandleAIMatterExchange:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
|
||||
; only use Pkmn Power if there are no Energy cards in Hand
|
||||
; and there's duplicates of certain cards to discard
|
||||
@@ -1661,9 +1661,9 @@ HandleAIMatterExchange:
|
||||
call CheckIfHandHasRepeatedCard
|
||||
ret nc
|
||||
.use_matter_exchange
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -1680,7 +1680,7 @@ HandleAIPlayTricks:
|
||||
or a
|
||||
ret z ; Dark Gengar is Arena card
|
||||
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, [wOpponentDeckID]
|
||||
cp DAMAGE_CHAOS_DECK_ID
|
||||
jr z, .damage_chaos_deck
|
||||
@@ -1689,7 +1689,7 @@ HandleAIPlayTricks:
|
||||
ret nc
|
||||
.use_play_tricks
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -1747,7 +1747,7 @@ HandleAIPlayTricks:
|
||||
; c = Play Area location (PLAY_AREA_*) of Kabuto.
|
||||
HandleAIFossilize:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
|
||||
call CheckIfArenaCardCanKnockOutDefendingCard
|
||||
ccf
|
||||
@@ -1794,11 +1794,11 @@ HandleAIFossilize:
|
||||
|
||||
.use_fossilize
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER_NO_EFF2
|
||||
farcall AIMakeDecision
|
||||
ld a, -1
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ldtx de, FossilizeCheckText
|
||||
farcall Serial_TossCoin
|
||||
jr c, .got_heads
|
||||
@@ -1808,7 +1808,7 @@ HandleAIFossilize:
|
||||
jr .got_tails
|
||||
.got_heads
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
.got_tails
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
@@ -1825,12 +1825,12 @@ HandleAISpecialDelivery:
|
||||
; chooses an evolution card in Hand that doesn't
|
||||
; evolve any Pokémon in the Play Area to place on Deck
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
farcall FindUnusableEvolutionCardInHand
|
||||
ret nc ; not found
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -1844,12 +1844,12 @@ HandleAISpecialDelivery:
|
||||
; c = Play Area location (PLAY_AREA_*) of Dragonite.
|
||||
HandleAIStepIn:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
ldh [hTempPlayAreaLocation_ff9d], a
|
||||
call CheckIfDefendingPokemonCanKnockOut
|
||||
ret nc ; defending can't KO
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ld e, a
|
||||
call GetPlayAreaCardAttachedEnergies
|
||||
ld a, [wTotalAttachedEnergies]
|
||||
@@ -1857,7 +1857,7 @@ HandleAIStepIn:
|
||||
ccf
|
||||
ret nc ; Dragonite doesn't have enough energy to attack
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -1918,7 +1918,7 @@ HandleAIMagnet:
|
||||
|
||||
; check if there's space in the Bench
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
|
||||
get_turn_duelist_var
|
||||
inc a
|
||||
@@ -1938,18 +1938,18 @@ HandleAIMagnet:
|
||||
ld a, [hli]
|
||||
cp $ff
|
||||
ret z
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
farcall ExecuteCardSearchFunc
|
||||
jr nc, .loop_deck
|
||||
|
||||
; a Magnemite is found in the Deck
|
||||
ld a, [wAIPkmnPowerUserCardIndex]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER_NO_EFF2
|
||||
farcall AIMakeDecision
|
||||
ldtx de, MagnetCheckText
|
||||
farcall Serial_TossCoin
|
||||
ldh [hAIPkmnPowerEffectParam], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jr c, .heads
|
||||
farcall SetWasUnsuccessful
|
||||
call PrintFailedEffectText
|
||||
@@ -2015,20 +2015,20 @@ HandleAICowardice:
|
||||
; c = Play Area location (PLAY_AREA_*) of Tentacool.
|
||||
.CheckWhetherToUseCowardice:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
|
||||
bank1call CheckIsIncapableOfUsingPkmnPower
|
||||
ccf
|
||||
ret nc ; can't use Cowardice
|
||||
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ld e, a
|
||||
call GetCardDamageAndMaxHP
|
||||
or a
|
||||
ret z ; return if has no damage counters
|
||||
|
||||
.try
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
ldh [hTempPlayAreaLocation_ff9d], a
|
||||
ld a, [wd084]
|
||||
ld d, a
|
||||
@@ -2038,7 +2038,7 @@ HandleAICowardice:
|
||||
call TryExecuteEffectCommandFunction
|
||||
jr c, .dont_use_cowardice
|
||||
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
or a
|
||||
jr nz, .is_benched
|
||||
farcall AIDecideBenchPokemonToSwitchTo
|
||||
@@ -2050,11 +2050,11 @@ HandleAICowardice:
|
||||
.use_cowardice
|
||||
push af
|
||||
ld a, [wd084]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
pop af
|
||||
ldh [hAIPkmnPowerEffectParam], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_DUEL_MAIN_SCENE
|
||||
@@ -2111,7 +2111,7 @@ HandleAICowardice:
|
||||
|
||||
.CheckWhetherToUseCowardice_SkipDamageCheck:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
bank1call CheckIsIncapableOfUsingPkmnPower
|
||||
ccf
|
||||
ret nc
|
||||
@@ -2125,7 +2125,7 @@ HandleAITrickery:
|
||||
ld b, PLAY_AREA_ARENA
|
||||
farcall FindCardIDInTurnDuelistsPlayArea
|
||||
ret nc ; no Rattata in Play Area
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
|
||||
bank1call CheckIsIncapableOfUsingPkmnPower
|
||||
ret c ; incapable of using Trickery
|
||||
@@ -2136,10 +2136,10 @@ HandleAITrickery:
|
||||
or a
|
||||
ret z
|
||||
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
add DUELVARS_ARENA_CARD
|
||||
get_turn_duelist_var
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
|
||||
; sample random prize cards
|
||||
; until we get one that hasn't been picked yet
|
||||
@@ -2163,7 +2163,7 @@ HandleAITrickery:
|
||||
; use Trickery with selected prize card
|
||||
ld a, c
|
||||
or $40
|
||||
ldh [hAIPkmnPowerEffectParam], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -2217,7 +2217,7 @@ HandleAIRebirth:
|
||||
; - c = Dark Starmie's PLAY_AREA_* location
|
||||
.TryUseRebirth:
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
bank1call CheckIsIncapableOfUsingPkmnPower
|
||||
ret c ; incapable of using Pkmn Power
|
||||
|
||||
@@ -2227,7 +2227,7 @@ HandleAIRebirth:
|
||||
farcall FindCardIDInLocation
|
||||
ret nc ; no Staryu in deck
|
||||
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
or a
|
||||
jr nz, .is_on_bench
|
||||
ldh [hTempPlayAreaLocation_ff9d], a
|
||||
@@ -2235,7 +2235,7 @@ HandleAIRebirth:
|
||||
ret nc ; player cannot KO
|
||||
; player can KO next turn
|
||||
; use Rebirth if has <= 20 HP remaining
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
add DUELVARS_ARENA_CARD_HP
|
||||
get_turn_duelist_var
|
||||
cp 20 + 1
|
||||
@@ -2253,7 +2253,7 @@ HandleAIRebirth:
|
||||
.is_on_bench
|
||||
; Dark Starmie is on the Bench, use Rebirth
|
||||
; if remaining HP is <= 20
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
add DUELVARS_ARENA_CARD_HP
|
||||
get_turn_duelist_var
|
||||
cp 20 + 1
|
||||
@@ -2261,7 +2261,7 @@ HandleAIRebirth:
|
||||
|
||||
.use_rebirth
|
||||
ld a, [wAIPkmnPowerUserCardIndex]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -2303,9 +2303,9 @@ HandleAIDamageSwap:
|
||||
ld a, [wd084]
|
||||
add DUELVARS_ARENA_CARD
|
||||
get_turn_duelist_var
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wd084]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -2324,9 +2324,9 @@ HandleAIDamageSwap:
|
||||
call .FindTargets
|
||||
jr c, .no_more_targets
|
||||
|
||||
ldh [hTempRetreatCostCards], a
|
||||
ldh [hDuelActionArgs + RETREAT_ARGS_COST_LIST], a
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
ldh [hAIPkmnPowerEffectParam], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_6B15
|
||||
farcall AIMakeDecision
|
||||
pop de
|
||||
@@ -2674,7 +2674,7 @@ HandleAIPrehistoricDreamAndPoisonMist:
|
||||
|
||||
; use Prehistoric Dream
|
||||
ld a, [wAIPkmnPowerUserCardIndex]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -2773,7 +2773,7 @@ HandleAIPrehistoricDreamAndPoisonMist:
|
||||
|
||||
.use_poison_mist
|
||||
ld a, [wAIPkmnPowerUserCardIndex]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
@@ -2788,9 +2788,9 @@ AIChooseSummonMinionsCards:
|
||||
push af
|
||||
ld b, a
|
||||
ld a, $ff
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hPlayAreaEffectTarget], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ldh [hDuelActionArgs + 2], a
|
||||
ld a, b
|
||||
or a
|
||||
jr z, .zero
|
||||
@@ -2844,21 +2844,21 @@ AIChooseSummonMinionsCards:
|
||||
|
||||
.AddCardToList:
|
||||
push af
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
cp $ff
|
||||
jr nz, .second_pkmn
|
||||
pop af
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ret
|
||||
.second_pkmn
|
||||
pop af
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
add sp, $02
|
||||
.asm_391e1
|
||||
pop af
|
||||
ld c, a
|
||||
ld b, $00
|
||||
ld hl, hTemp_ffa0
|
||||
ld hl, hDuelActionArgs + 0
|
||||
add hl, bc
|
||||
ld [hl], $ff
|
||||
ret
|
||||
@@ -5360,12 +5360,12 @@ BadGuysDeckAIDecideReelIn:
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_psyduck_and_golduck
|
||||
; got an Oddish, try a Dark Gloom next
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, DARK_GLOOM
|
||||
ld a, CARD_LOCATION_DISCARD_PILE
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_psyduck_and_golduck
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jr .find_third_card
|
||||
|
||||
.try_psyduck_and_golduck
|
||||
@@ -5374,12 +5374,12 @@ BadGuysDeckAIDecideReelIn:
|
||||
ld a, CARD_LOCATION_DISCARD_PILE
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_charmander_and_charmeleon
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, DARK_GOLDUCK
|
||||
ld a, CARD_LOCATION_DISCARD_PILE
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_charmander_and_charmeleon
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jr .find_third_card
|
||||
|
||||
.try_charmander_and_charmeleon
|
||||
@@ -5388,12 +5388,12 @@ BadGuysDeckAIDecideReelIn:
|
||||
ld a, CARD_LOCATION_DISCARD_PILE
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_slowpoke_and_slowbro
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, DARK_CHARMELEON
|
||||
ld a, CARD_LOCATION_DISCARD_PILE
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_slowpoke_and_slowbro
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jr .find_third_card
|
||||
|
||||
.try_slowpoke_and_slowbro
|
||||
@@ -5401,12 +5401,12 @@ BadGuysDeckAIDecideReelIn:
|
||||
ld a, CARD_LOCATION_DISCARD_PILE
|
||||
farcall FindCardIDInLocation
|
||||
ret nc
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, DARK_SLOWBRO
|
||||
ld a, CARD_LOCATION_DISCARD_PILE
|
||||
farcall FindCardIDInLocation
|
||||
ret nc
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
|
||||
.find_third_card
|
||||
ld de, ODDISH_LV21
|
||||
@@ -5445,7 +5445,7 @@ BadGuysDeckAIDecideReelIn:
|
||||
ret
|
||||
|
||||
.AddCardIfNotInListAlready:
|
||||
ld hl, hTemp_ffa0
|
||||
ld hl, hDuelActionArgs + 0
|
||||
cp [hl]
|
||||
ret z ; equal to first card
|
||||
inc hl
|
||||
|
||||
@@ -124,13 +124,13 @@ AISamPerformScriptedTurn:
|
||||
.turn_2
|
||||
ld de, POTION
|
||||
farcall LookForCardIDInHandList
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_PLAY_TRAINER
|
||||
farcall AIMakeDecision
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, 20
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ld de, GOLDEEN
|
||||
@@ -143,15 +143,15 @@ AISamPerformScriptedTurn:
|
||||
ld de, GOLDEEN
|
||||
ld b, PLAY_AREA_ARENA
|
||||
farcall FindCardIDInTurnDuelistsPlayArea
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld de, SEAKING
|
||||
farcall LookForCardIDInHandList
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_EVOLVE_PKMN
|
||||
farcall AIMakeDecision
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_PROCESS_PLAYED_PKMN
|
||||
farcall AIMakeDecision
|
||||
ld de, SEAKING
|
||||
@@ -163,13 +163,13 @@ AISamPerformScriptedTurn:
|
||||
.turn_4
|
||||
ld de, POTION
|
||||
farcall LookForCardIDInHandList
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_PLAY_TRAINER
|
||||
farcall AIMakeDecision
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, 20
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ld a, SECOND_ATTACK
|
||||
@@ -178,12 +178,12 @@ AISamPerformScriptedTurn:
|
||||
.turn_5
|
||||
ld de, STARYU_LV15
|
||||
farcall LookForCardIDInHandList
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_PLAY_BASIC_PKMN
|
||||
farcall AIMakeDecision
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_PROCESS_PLAYED_PKMN
|
||||
farcall AIMakeDecision
|
||||
ld de, STARYU_LV15
|
||||
@@ -280,12 +280,12 @@ AIAaronStep2PerformScriptedTurn:
|
||||
.turn_2
|
||||
ld de, ODDISH_LV8
|
||||
farcall LookForCardIDInHandList
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_PLAY_BASIC_PKMN
|
||||
farcall AIMakeDecision
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_PROCESS_PLAYED_PKMN
|
||||
farcall AIMakeDecision
|
||||
ld de, GRIMER_LV10
|
||||
@@ -351,33 +351,33 @@ AIAaronStep3PerformScriptedTurn:
|
||||
.turn_2
|
||||
ld de, CHANSEY_LV55
|
||||
farcall LookForCardIDInHandList
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_PLAY_BASIC_PKMN
|
||||
farcall AIMakeDecision
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_PROCESS_PLAYED_PKMN
|
||||
farcall AIMakeDecision
|
||||
ld de, POKEMON_BREEDER
|
||||
farcall LookForCardIDInHandList
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_PLAY_TRAINER
|
||||
farcall AIMakeDecision
|
||||
ld de, ALAKAZAM_LV42
|
||||
farcall LookForCardIDInHandList
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, ABRA_LV10
|
||||
ld b, PLAY_AREA_BENCH_1
|
||||
farcall FindCardIDInTurnDuelistsPlayArea
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
push af
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ld a, [wcd15]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
pop af
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld [wTempAIPokemonCard], a
|
||||
ld a, OPPACTION_PROCESS_PLAYED_PKMN
|
||||
farcall AIMakeDecision
|
||||
@@ -400,7 +400,7 @@ AIAaronStep3PerformScriptedTurn:
|
||||
farcall HandleAIDamageSwap
|
||||
ld de, POKEMON_CENTER
|
||||
farcall LookForCardIDInHandList
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_PLAY_TRAINER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
@@ -439,24 +439,24 @@ AIAaronStep3PerformScriptedTurn:
|
||||
jr nc, .asm_4839b
|
||||
ld de, SCOOP_UP
|
||||
farcall LookForCardIDInHandList
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld de, CHANSEY_LV55
|
||||
ld b, PLAY_AREA_BENCH_1
|
||||
farcall FindCardIDInTurnDuelistsPlayArea
|
||||
jr nc, .unscripted
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_PLAY_TRAINER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_TRAINER_EFFECTS
|
||||
farcall AIMakeDecision
|
||||
ld de, CHANSEY_LV55
|
||||
farcall LookForCardIDInHandList
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_PLAY_BASIC_PKMN
|
||||
farcall AIMakeDecision
|
||||
ldh a, [hTempPlayAreaLocation_ff9d]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_PROCESS_PLAYED_PKMN
|
||||
farcall AIMakeDecision
|
||||
farcall HandleAIDamageSwap
|
||||
@@ -2028,12 +2028,12 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
ret c ; couldn't use The Boss' Way
|
||||
ld a, b
|
||||
.trade_with_dratini
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, DRATINI_LV10
|
||||
ld a, CARD_LOCATION_DECK
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_search_for_bulbasaur ; no Dratini in Deck
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jp AITryUsePokemonTraderToSearchCard_GotCardToTrade
|
||||
|
||||
.try_search_for_bulbasaur
|
||||
@@ -2068,12 +2068,12 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
ret c ; couldn't use The Boss' Way
|
||||
ld a, b
|
||||
.trade_with_bulbasaur
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, BULBASAUR_LV12
|
||||
ld a, CARD_LOCATION_DECK
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_search_for_kangaskhan_or_scyther ; no Bulbasaur in Deck
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jp AITryUsePokemonTraderToSearchCard_GotCardToTrade
|
||||
|
||||
.try_search_for_kangaskhan_or_scyther
|
||||
@@ -2098,7 +2098,7 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
ret c
|
||||
ld a, b
|
||||
.trade_with_kangaskhan_or_scyther
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, KANGASKHAN_LV40
|
||||
ld a, CARD_LOCATION_DECK
|
||||
farcall FindCardIDInLocation
|
||||
@@ -2108,7 +2108,7 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_search_for_evolutions_1
|
||||
.asm_490ff
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jp AITryUsePokemonTraderToSearchCard_GotCardToTrade
|
||||
|
||||
.try_search_for_evolutions_1
|
||||
@@ -2204,12 +2204,12 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
ret c ; couldn't use The Boss' Way
|
||||
ld a, b
|
||||
.trade_with_charmander
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, CHARMANDER_LV9
|
||||
ld a, CARD_LOCATION_DECK
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_search_for_kangaskhan_magmar_or_mr_mime ; no Charmander in Deck
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jp AITryUsePokemonTraderToSearchCard_GotCardToTrade
|
||||
|
||||
.try_search_for_kangaskhan_magmar_or_mr_mime
|
||||
@@ -2232,7 +2232,7 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
ret c
|
||||
ld a, b
|
||||
.trade_with_kangaskhan_magmar_or_mr_mime
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, KANGASKHAN_LV40
|
||||
ld a, CARD_LOCATION_DECK
|
||||
farcall FindCardIDInLocation
|
||||
@@ -2246,7 +2246,7 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_search_for_evolutions_2
|
||||
.asm_49219
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jp AITryUsePokemonTraderToSearchCard_GotCardToTrade
|
||||
|
||||
.try_search_for_evolutions_2
|
||||
@@ -2336,12 +2336,12 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
ret c ; couldn't use The Boss' Way
|
||||
ld a, b
|
||||
.trade_with_squirtle
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, SQUIRTLE_LV8
|
||||
ld a, CARD_LOCATION_DECK
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_search_for_scyther_mr_mime_or_lapras ; no Squirtle in Deck
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jp AITryUsePokemonTraderToSearchCard_GotCardToTrade
|
||||
|
||||
.try_search_for_scyther_mr_mime_or_lapras
|
||||
@@ -2364,7 +2364,7 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
ret c
|
||||
ld a, b
|
||||
.trade_with_scyther_mr_mime_or_lapras
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, SCYTHER_LV25
|
||||
ld a, CARD_LOCATION_DECK
|
||||
farcall FindCardIDInLocation
|
||||
@@ -2378,7 +2378,7 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_search_for_evolutions_3
|
||||
.asm_49329
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jp AITryUsePokemonTraderToSearchCard_GotCardToTrade
|
||||
|
||||
.try_search_for_evolutions_3
|
||||
@@ -2472,12 +2472,12 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
ret c ; couldn't use The Boss' Way
|
||||
ld a, b
|
||||
.trade_with_machop
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, MACHOP_LV20
|
||||
ld a, CARD_LOCATION_DECK
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_search_for_kangaskhan_magmar_or_chansey ; no Machop in Deck
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jp AITryUsePokemonTraderToSearchCard_GotCardToTrade
|
||||
|
||||
.try_search_for_kangaskhan_magmar_or_chansey
|
||||
@@ -2500,7 +2500,7 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
ret c
|
||||
ld a, b
|
||||
.trade_with_kangaskhan_magmar_or_chansey
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, KANGASKHAN_LV40
|
||||
ld a, CARD_LOCATION_DECK
|
||||
farcall FindCardIDInLocation
|
||||
@@ -2510,7 +2510,7 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_search_for_evolutions_4
|
||||
.asm_49436
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jp AITryUsePokemonTraderToSearchCard_GotCardToTrade
|
||||
|
||||
.try_search_for_evolutions_4
|
||||
@@ -2583,7 +2583,7 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
call CanUseEvolutionaryLight
|
||||
pop bc
|
||||
ld a, b
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
jr nc, .asm_49508
|
||||
ld de, GRS_MEWTWO
|
||||
ld a, CARD_LOCATION_DECK
|
||||
@@ -2621,7 +2621,7 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
farcall FindCardIDInLocation
|
||||
jr nc, .try_search_for_evolutions_5
|
||||
.asm_49534
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
jp AITryUsePokemonTraderToSearchCard_GotCardToTrade
|
||||
|
||||
.try_search_for_evolutions_5
|
||||
@@ -2666,7 +2666,7 @@ HandleAIDarkPokemonSearchStrategies:
|
||||
; input:
|
||||
; - a = deck index of card to search in Deck
|
||||
AITryUseTheBossWayToSearchCard:
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld de, THE_BOSSS_WAY
|
||||
farcall LookForCardIDInHandList
|
||||
ccf
|
||||
@@ -2681,11 +2681,11 @@ AITryUseTheBossWayToSearchCard:
|
||||
; - a = deck index of card to search in Deck
|
||||
; - de = card ID in Hand to avoid trading
|
||||
AITryUsePokemonTraderToSearchCard:
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
call FindDifferentPokemonCardInHand
|
||||
ccf
|
||||
ret c ; card in hand to trade not found
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
AITryUsePokemonTraderToSearchCard_GotCardToTrade:
|
||||
ld de, POKEMON_TRADER
|
||||
farcall LookForCardIDInHandList
|
||||
@@ -2698,7 +2698,7 @@ AITryUsePokemonTraderToSearchCard_GotCardToTrade:
|
||||
; expects the Trainer card index to be in [wAITrainerCardToPlay]
|
||||
AIUseTrainerCardToSearchCard:
|
||||
ld a, [wAITrainerCardToPlay]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
bank1call LoadNonPokemonCardEffectCommands
|
||||
ld a, EFFECTCMDTYPE_INITIAL_EFFECT_1
|
||||
call TryExecuteEffectCommandFunction
|
||||
@@ -2715,20 +2715,20 @@ Func_495dd:
|
||||
call CanUseEvolutionaryLight
|
||||
ccf
|
||||
ret c
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, c
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
call FindAnyEvolutionCardInDeck
|
||||
ccf
|
||||
ret c ; evolution card not found
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ld a, OPPACTION_USE_PKMN_POWER
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_EXECUTE_PKMN_POWER_EFFECT
|
||||
farcall AIMakeDecision
|
||||
ld a, OPPACTION_DUEL_MAIN_SCENE
|
||||
farcall AIMakeDecision
|
||||
ldh a, [hTempPlayAreaLocation_ffa1]
|
||||
ldh a, [hDuelActionArgs + 1]
|
||||
ret
|
||||
|
||||
StopLifeDeckAIDecideGustOfWind:
|
||||
@@ -4800,19 +4800,19 @@ AIHandlePkmnPowersWhenPlayingPkmnFromHand:
|
||||
.power_of_darkness
|
||||
ldtx de, PowerOfDarknessCheckText
|
||||
farcall Serial_TossCoin
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
call SwapTurn
|
||||
ld e, PLAY_AREA_ARENA
|
||||
call Func_4a3dc
|
||||
call SwapTurn
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ret
|
||||
|
||||
.sneak_attack
|
||||
xor a
|
||||
ld d, 10
|
||||
farcall AIFindPlayAreaPkmnWithMinimumLeastRemainingHP
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, 10
|
||||
cp d
|
||||
ret z ; will ko
|
||||
@@ -4828,7 +4828,7 @@ AIHandlePkmnPowersWhenPlayingPkmnFromHand:
|
||||
srl a
|
||||
ret c ; odd number
|
||||
xor a ; PLAY_AREA_ARENA
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ret
|
||||
|
||||
.summon_minions
|
||||
@@ -4851,9 +4851,9 @@ AIHandlePkmnPowersWhenPlayingPkmnFromHand:
|
||||
|
||||
.reel_in
|
||||
ld a, $ff
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hTempPlayAreaLocation_ffa1], a
|
||||
ldh [hPlayAreaEffectTarget], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ldh [hDuelActionArgs + 1], a
|
||||
ldh [hDuelActionArgs + 2], a
|
||||
ldh [$ffa5], a
|
||||
ld a, [wOpponentDeckID]
|
||||
cp BAD_GUYS_DECK_ID
|
||||
@@ -4900,7 +4900,7 @@ AIHandlePkmnPowersWhenPlayingPkmnFromHand:
|
||||
.TryAddCardToList:
|
||||
ld b, a
|
||||
ld c, 0
|
||||
ld hl, hTemp_ffa0
|
||||
ld hl, hDuelActionArgs + 0
|
||||
.asm_4a3bf
|
||||
ld a, [hl]
|
||||
cp $ff
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1537,7 +1537,7 @@ HandleSpecialAIAttacks:
|
||||
jr nc, .is_cool_porygon_already_resistant
|
||||
|
||||
call AISelectSpecialAttackParameters.SelectAttackParameters
|
||||
ldh a, [hTempPlayAreaLocation_ffa1]
|
||||
ldh a, [hDuelActionArgs + 1]
|
||||
cp $ff
|
||||
jr z, .is_cool_porygon_already_resistant
|
||||
call TranslateColorToWR
|
||||
|
||||
@@ -80,7 +80,7 @@ AIDoAction_ForcedSwitch::
|
||||
AIDoAction_KOSwitch::
|
||||
ld a, AIACTION_KO_SWITCH
|
||||
call AIDoAction
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ret
|
||||
|
||||
AIDoAction_TakePrize::
|
||||
@@ -119,7 +119,7 @@ AIAcceptOrDeclineChallenge::
|
||||
; AI always declines challenge, which
|
||||
; corresponds to an output of TRUE
|
||||
ld a, TRUE
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ret
|
||||
|
||||
; looks like scrapped code to select Pokémon in the deck for AI
|
||||
|
||||
@@ -1231,7 +1231,7 @@ GetNonTurnDuelistVariable::
|
||||
ret
|
||||
|
||||
; copies, given a card identified by register hl (card ID):
|
||||
; - e into wSelectedAttack and d into hTempCardIndex_ff9f
|
||||
; - e into wSelectedAttack and d into hDuelActionCardIndex
|
||||
; - Attack1 (if e == 0) or Attack2 (if e == 1) data into wLoadedAttack
|
||||
; - Also from that attack, its Damage field into wDamage
|
||||
; finally, clears wNoDamageOrEffect and wDealtDamage
|
||||
@@ -1241,14 +1241,14 @@ CopyAttackDataAndDamage_FromCardID::
|
||||
ld a, e
|
||||
ld [wSelectedAttack], a
|
||||
ld a, d
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
pop de
|
||||
call LoadCardDataToBuffer1_FromCardID
|
||||
pop de
|
||||
jr CopyAttackDataAndDamage
|
||||
|
||||
; copies, given a card identified by register d (0-59 deck index):
|
||||
; - e into wSelectedAttack and d into hTempCardIndex_ff9f
|
||||
; - e into wSelectedAttack and d into hDuelActionCardIndex
|
||||
; - Attack1 (if e == 0) or Attack2 (if e == 1) data into wLoadedAttack
|
||||
; - Also from that attack, its Damage field into wDamage
|
||||
; finally, clears wNoDamageOrEffect and wDealtDamage
|
||||
@@ -1256,7 +1256,7 @@ CopyAttackDataAndDamage_FromDeckIndex::
|
||||
ld a, e
|
||||
ld [wSelectedAttack], a
|
||||
ld a, d
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
call LoadCardDataToBuffer1_FromDeckIndex
|
||||
; fallthrough
|
||||
|
||||
@@ -1292,7 +1292,7 @@ CopyAttackDataAndDamage:
|
||||
UpdateTempDuelistCardIDsAndClearTwoTurnDuelVars::
|
||||
ld a, DUELVARS_ARENA_CARD
|
||||
get_turn_duelist_var
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
call UpdateTempDuelistCardIDs
|
||||
call ClearTwoTurnDuelVars
|
||||
ret
|
||||
@@ -1336,7 +1336,7 @@ ClearTwoTurnDuelVars::
|
||||
UseAttackOrPokemonPower::
|
||||
ld a, [wSelectedAttack]
|
||||
ld [wPlayerAttackingAttackIndex], a
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
ld [wPlayerAttackingCardIndex], a
|
||||
ld a, [wTempCardID_ccc2]
|
||||
ld [wPlayerAttackingCardID], a
|
||||
@@ -1371,7 +1371,7 @@ UseAttackOrPokemonPower::
|
||||
; if we're here then it means that the Metronome attack
|
||||
; does not have its requirements met to be used
|
||||
ld a, $ff
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, OPPACTION_ATTACK_ANIM_AND_DAMAGE
|
||||
call SetOppAction_SerialSendDuelData
|
||||
call ShowMetronomeUnsuccessfulText
|
||||
@@ -1536,23 +1536,23 @@ SendAttackDataToLinkOpponent::
|
||||
ld a, [wccec]
|
||||
or a
|
||||
ret nz
|
||||
ldh a, [hTemp_ffa0]
|
||||
ldh a, [hDuelActionArgs + 0]
|
||||
push af
|
||||
ldh a, [hTempCardIndex_ff9f]
|
||||
ldh a, [hDuelActionCardIndex]
|
||||
push af
|
||||
ld a, $1
|
||||
ld [wccec], a
|
||||
ld a, [wPlayerAttackingCardIndex]
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
ld a, [wPlayerAttackingAttackIndex]
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ld a, OPPACTION_BEGIN_ATTACK
|
||||
call SetOppAction_SerialSendDuelData
|
||||
call ExchangeRNG
|
||||
pop af
|
||||
ldh [hTempCardIndex_ff9f], a
|
||||
ldh [hDuelActionCardIndex], a
|
||||
pop af
|
||||
ldh [hTemp_ffa0], a
|
||||
ldh [hDuelActionArgs + 0], a
|
||||
ret
|
||||
|
||||
Func_189d:
|
||||
|
||||
@@ -547,8 +547,8 @@ ExchangeRNG::
|
||||
ret
|
||||
|
||||
; sets hOppActionTableIndex to an AI action specified in register a.
|
||||
; send 18 bytes of data to the other game from hOppActionTableIndex, hTempCardIndex_ff9f,
|
||||
; hTemp_ffa0, and hTempPlayAreaLocation_ffa1, and hTempRetreatCostCards.
|
||||
; send 18 bytes of data to the other game from hOppActionTableIndex, hDuelActionCardIndex,
|
||||
; hDuelActionArgs + 0, and hDuelActionArgs + 1, and hDuelActionArgs + RETREAT_ARGS_COST_LIST.
|
||||
; finally exchange RNG data.
|
||||
; the receiving side will use this data to read the OPPACTION_* value in
|
||||
; [hOppActionTableIndex] and match it by calling the corresponding OppAction* function
|
||||
@@ -559,7 +559,7 @@ SetOppAction_SerialSendDuelData::
|
||||
ld a, [wDuelType]
|
||||
cp DUELIST_TYPE_LINK_OPP
|
||||
jr nz, .not_link
|
||||
ld hl, hOppActionTableIndex
|
||||
ld hl, hDuelAction
|
||||
ld bc, 18
|
||||
call SerialSendBytes
|
||||
call ExchangeRNG
|
||||
@@ -569,12 +569,12 @@ SetOppAction_SerialSendDuelData::
|
||||
ret
|
||||
|
||||
; receive 18 bytes of data from wSerialRecvBuf and store them into hOppActionTableIndex,
|
||||
; hTempCardIndex_ff9f, hTemp_ffa0, and hTempPlayAreaLocation_ffa1,
|
||||
; and hTempRetreatCostCards. also exchange RNG data.
|
||||
; hDuelActionCardIndex, hDuelActionArgs + 0, and hDuelActionArgs + 1,
|
||||
; and hDuelActionArgs + RETREAT_ARGS_COST_LIST. also exchange RNG data.
|
||||
SerialRecvDuelData::
|
||||
push hl
|
||||
push bc
|
||||
ld hl, hOppActionTableIndex
|
||||
ld hl, hDuelAction
|
||||
ld bc, 18
|
||||
call SerialRecvBytes
|
||||
call ExchangeRNG
|
||||
|
||||
51
src/hram.asm
51
src/hram.asm
@@ -1,3 +1,6 @@
|
||||
INCLUDE "macros.asm"
|
||||
INCLUDE "constants.asm"
|
||||
|
||||
SECTION "HRAM", HRAM[$ff80]
|
||||
|
||||
hBankROM:: ; ff80
|
||||
@@ -74,54 +77,32 @@ hTempCardID_ff9b:: ; ff9d
|
||||
hTempPlayAreaLocation_ff9d:: ; ff9f
|
||||
ds $1
|
||||
|
||||
; $ff-terminated 10-byte buffer for the current in-duel action,
|
||||
; structured as DUEL_ACTION_STRUCT_* (action index, card index, 7 args, terminator).
|
||||
; mirrors poketcg (tcg1) PR #187; NOTE tcg2's addresses are shifted +2 vs tcg1.
|
||||
hDuelAction:: ; ffa0
|
||||
|
||||
; index for AIActionTable
|
||||
hOppActionTableIndex:: ; ffa0
|
||||
ds $1
|
||||
|
||||
; deck index of a card (0-59)
|
||||
hTempCardIndex_ff9f:: ; ffa1
|
||||
hDuelActionCardIndex:: ; ffa1
|
||||
ds $1
|
||||
|
||||
UNION
|
||||
|
||||
; multipurpose temp storage (card's deck index, selected attack index, status condition...)
|
||||
hTemp_ffa0:: ; ffa2
|
||||
ds $1
|
||||
|
||||
; a PLAY_AREA_* constant (0: arena card, 1-5: bench card)
|
||||
hTempPlayAreaLocation_ffa1:: ; ffa3
|
||||
ds $1
|
||||
|
||||
; $ff-terminated list of cards to be discarded upon retreat
|
||||
hTempRetreatCostCards:: ; ffa4
|
||||
ds $6
|
||||
; $ff-terminated list of arguments of the current in-duel action.
|
||||
; indexed by the *_ARGS_* offset constants in duel_action_constants.asm.
|
||||
hDuelActionArgs:: ; ffa2
|
||||
ds DUEL_ACTION_ARGS_SIZE + 1
|
||||
|
||||
NEXTU
|
||||
|
||||
ds $1
|
||||
|
||||
; parameter to be used by the AI's Pkmn Power effect
|
||||
hAIPkmnPowerEffectParam:: ; ffa3
|
||||
ds $1
|
||||
|
||||
; parameters chosen by AI in Energy Trans routine.
|
||||
; the deck index (0-59) of the energy card to transfer
|
||||
; and the Play Area location (PLAY_AREA_*) of card to receive that energy card.
|
||||
hAIEnergyTransEnergyCard:: ; ffa4
|
||||
|
||||
; PLAY_AREA_* of target selected for some Pkmn Powers,
|
||||
; (e.g. Curse, Damage Swap) and for trainer card effect.
|
||||
hPlayAreaEffectTarget:: ; ffa4
|
||||
ds $1
|
||||
|
||||
hAIEnergyTransPlayAreaLocation:: ; ffa5
|
||||
ds $1
|
||||
|
||||
NEXTU
|
||||
|
||||
; list of various items, such as
|
||||
; cards selected for various effects,
|
||||
; list of various items, such as cards selected for various effects,
|
||||
; Play Area locations, etc.
|
||||
; tcg2-specific: 15 bytes (vs tcg1's 8), kept as a separate union member
|
||||
; because tcg2's hCurSelectionItem follows the union at $ffb2.
|
||||
hTempList:: ; ffa2
|
||||
ds 15
|
||||
|
||||
|
||||
@@ -444,7 +444,7 @@ wPlayAreaScreenLoaded:: ; cbcc
|
||||
wPlayAreaSelectAction:: ; cbcd
|
||||
ds $1
|
||||
|
||||
; low byte of the address of the next slot in the hTempRetreatCostCards array to be used
|
||||
; low byte of the address of the next slot in the hDuelActionArgs[2-] array to be used
|
||||
wTempRetreatCostCardsPos:: ; cbce
|
||||
ds $1
|
||||
|
||||
|
||||
Reference in New Issue
Block a user