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:
Test User
2026-06-04 12:54:04 -04:00
parent 04bf65801c
commit d38e3eb5df
18 changed files with 1350 additions and 1299 deletions

View File

@@ -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"

View 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

View File

@@ -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]

View File

@@ -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]

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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