summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/engine/bank05.asm294
1 files changed, 279 insertions, 15 deletions
diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm
index 210bc50..618762f 100644
--- a/src/engine/bank05.asm
+++ b/src/engine/bank05.asm
@@ -609,8 +609,53 @@ CreateEnergyCardListFromHand: ; 1438c (5:438c)
ret
; 0x143bf
-Func_143bf: ; 143bf (5:43bf)
- INCROM $143bf, $143e5
+; looks for card ID in hand and
+; sets carry if a card wasn't found
+; as opposed to LookForCardIDInHandList
+; this function doesn't create a list
+; and preserves hl, de and bc
+; input:
+; a = card ID
+; output:
+; a = card deck index, if found
+; carry set if NOT found
+LookForCardIDInHand: ; 143bf (5:43bf)
+ push hl
+ push de
+ push bc
+ ld b, a
+ ld a, DUELVARS_NUMBER_OF_CARDS_IN_HAND
+ call GetTurnDuelistVariable
+ ld c, a
+ inc c
+ ld l, DUELVARS_HAND
+ jr .next
+
+.loop
+ ld a, [hli]
+ call GetCardIDFromDeckIndex
+ ld a, e
+ cp b
+ jr z, .no_carry
+.next
+ dec c
+ jr nz, .loop
+
+ pop bc
+ pop de
+ pop hl
+ scf
+ ret
+
+.no_carry
+ dec hl
+ ld a, [hl]
+ pop bc
+ pop de
+ pop hl
+ or a
+ ret
+; 0x143e5
; stores in wDamage, wAIMinDamage and wAIMaxDamage the calculated damage
; done to the defending Pokémon by a given card and move
@@ -1305,12 +1350,14 @@ Data_1514f: ; 1514f (5:514f)
; return carry if card ID loaded in a is found in hand
; and outputs in a the deck index of that card
+; as opposed to LookForCardIDInHand, this function
+; creates a list in wDuelTempList
; input:
; a = card ID
; output:
; a = card deck index, if found
; carry set if found
-LookForCardInHand: ; 155d2 (5:55d2)
+LookForCardIDInHandList: ; 155d2 (5:55d2)
ld [wTempCardIDToLook], a
call CreateHandCardList
ld hl, wDuelTempList
@@ -3307,7 +3354,7 @@ LookForEnergyNeededInHand: ; 162c8 (5:62c8)
or a
jr z, .one_colorless
ld a, e
- call LookForCardInHand
+ call LookForCardIDInHandList
ret c
jr .no_carry
@@ -3319,7 +3366,7 @@ LookForEnergyNeededInHand: ; 162c8 (5:62c8)
.two_colorless
ld a, DOUBLE_COLORLESS_ENERGY
- call LookForCardInHand
+ call LookForCardIDInHandList
ret c
jr .no_carry
; 0x16311
@@ -3354,7 +3401,7 @@ LookForEnergyNeededForMoveInHand: ; 16311 (5:6311)
or a
jr z, .one_colorless
ld a, e
- call LookForCardInHand
+ call LookForCardIDInHandList
ret c
jr .done
@@ -3366,7 +3413,7 @@ LookForEnergyNeededForMoveInHand: ; 16311 (5:6311)
.two_colorless
ld a, DOUBLE_COLORLESS_ENERGY
- call LookForCardInHand
+ call LookForCardIDInHandList
ret c
jr .done
; 0x1633f
@@ -3921,9 +3968,11 @@ Func_164e8: ; 164e8 (5:64e8)
jr .loop_id_list
; if it's a boss deck, call Func_174f2
+; and apply to the AI score the values
+; determined for this card
.check_boss_deck
call CheckIfNotABossDeckID
- jr c, .asm_16653
+ jr c, .skip_boss_deck
call Func_174f2
ldh a, [hTempPlayAreaLocation_ff9d]
ld c, a
@@ -3935,19 +3984,19 @@ Func_164e8: ; 164e8 (5:64e8)
jr c, .asm_1664c
sub $80
call AddToAIScore
- jr .asm_16653
+ jr .skip_boss_deck
.asm_1664c
ld b, a
ld a, $80
sub b
call SubFromAIScore
-.asm_16653
+.skip_boss_deck
ld a, 1
call AddToAIScore
- xor a
+ xor a ; first move
call Func_16695
- ld a, $01
+ ld a, $01 ; second move
call Func_16695
.asm_16661
ldh a, [hTempPlayAreaLocation_ff9d]
@@ -3976,8 +4025,165 @@ Func_164e8: ; 164e8 (5:64e8)
Func_1668a ; 1668a (5:668a)
INCROM $1668a, $16695
-Func_16695 ; 16695 (5:6695)
- INCROM $16695, $167b5
+Func_16695: ; 16695 (5:6695)
+ ld [wSelectedMoveIndex], a
+ call CheckEnergyNeededForAttack
+ jp c, .asm_1671e
+ ld a, $0c
+ call CheckLoadedMoveFlag
+ jr c, .asm_166af
+ ld a, $0b
+ call CheckLoadedMoveFlag
+ jr c, .asm_16710
+ jp .asm_16775
+
+.asm_166af
+ ld a, [wLoadedMoveUnknown1]
+ cp $02
+ jr z, .asm_166bc
+ call AddToAIScore
+ jp .asm_16775
+
+.asm_166bc
+ call Func_171fb
+ jr c, .asm_166cd
+ cp $03
+ jr c, .asm_166cd
+.asm_166c5
+ ld a, 5
+ call SubFromAIScore
+ jp .asm_16775
+.asm_166cd
+ ld a, 2
+ call AddToAIScore
+
+ ld a, $0c
+ call CheckLoadedMoveFlag
+ jp nc, .asm_16775
+ ld a, [wSelectedMoveIndex]
+ call CalculateMoveDamage_VersusDefendingCard
+ ld a, DUELVARS_ARENA_CARD_HP
+ call GetNonTurnDuelistVariable
+ ld hl, wDamage
+ sub [hl]
+ jp c, .asm_16775
+ jp z, .asm_16775
+ ld a, [wDamage]
+ add 10
+ ld b, a
+ ld a, DUELVARS_ARENA_CARD_HP
+ call GetNonTurnDuelistVariable
+ sub b
+ jr c, .asm_166ff
+ jr nz, .asm_16775
+.asm_166ff
+ ld a, 20
+ call AddToAIScore
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ or a
+ jr nz, .asm_16775
+ ld a, 10
+ call AddToAIScore
+ jr .asm_16775
+
+.asm_16710
+ ld a, [wLoadedCard1ID]
+ cp ZAPDOS2
+ jr z, .asm_16775
+ call Func_171fb
+ jr c, .asm_166cd
+ jr .asm_166c5
+.asm_1671e
+ ld a, $0d
+ call CheckLoadedMoveFlag
+ jr nc, .asm_1672a
+ ld a, 5
+ call SubFromAIScore
+
+.asm_1672a
+ ld a, b
+ or a
+ jr z, .asm_1673b
+ ld a, e
+ call LookForCardIDInHand
+ jr c, .asm_1673b
+ ld a, 4
+ call AddToAIScore
+ jr .asm_16744
+.asm_1673b
+ ld a, c
+ or a
+ jr z, .asm_16775
+ ld a, 3
+ call AddToAIScore
+
+.asm_16744
+ ld a, b
+ add c
+ dec a
+ jr nz, .asm_16775
+ ld a, 3
+ call AddToAIScore
+
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ or a
+ jr nz, .asm_16775
+ ld a, [wSelectedMoveIndex]
+ call CalculateMoveDamage_VersusDefendingCard
+ ld a, DUELVARS_ARENA_CARD_HP
+ call GetNonTurnDuelistVariable
+ ld hl, wDamage
+ sub [hl]
+ jr z, .asm_16766
+ jr nc, .asm_16775
+.asm_16766
+ ld a, 20
+ call AddToAIScore
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ or a
+ jr nz, .asm_16775
+ ld a, 10
+ call AddToAIScore
+
+.asm_16775
+ ld a, [wCurCardPlayAreaLocation]
+ cp $ff
+ ret z
+ ld b, a
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ add DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ push af
+ ld [hl], b
+ call CheckEnergyNeededForAttack
+ jr nc, .asm_167ab
+ ld a, $0d
+ call CheckLoadedMoveFlag
+ jr c, .asm_167ab
+ ld a, b
+ or a
+ jr z, .asm_167a2
+ ld a, e
+ call LookForCardIDInHand
+ jr c, .asm_167a2
+ ld a, 2
+ call AddToAIScore
+ jr .asm_167ab
+.asm_167a2
+ ld a, c
+ or a
+ jr z, .asm_167ab
+ ld a, 1
+ call AddToAIScore
+
+.asm_167ab
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ add DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ pop af
+ ld [hl], a
+ ret
+; 0x167b5
Func_167b5 ; 167b5 (5:67b5)
INCROM $167b5, $1689f
@@ -4111,7 +4317,65 @@ CheckIfBenchCardsAreAtHalfHPCanEvolveAndUseSecondMove: ; 17101 (5:7101)
; 0x17161
Func_17161 ; 17161 (5:7161)
- INCROM $17161, $17274
+ INCROM $17161, $171fb
+
+Func_171fb: ; 171fb (5:71fb)
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ add $bb
+ call GetTurnDuelistVariable
+ ld d, a
+ ld a, [wSelectedMoveIndex]
+ ld e, a
+ call CopyMoveDataAndDamage_FromDeckIndex
+ ld hl, wLoadedMoveName
+ ld a, [hli]
+ or [hl]
+ jr z, .asm_17218
+ ld a, [wLoadedMoveCategory]
+ cp $04
+ jr nz, .asm_1721a
+.asm_17218
+ scf
+ ret
+.asm_1721a
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ ld e, a
+ call GetPlayAreaCardAttachedEnergies
+ bank1call HandleEnergyBurn
+ xor a
+ ld [wTempLoadedMoveEnergyCost], a
+ ld [wTempLoadedMoveEnergyNeededAmount], a
+ ld [wTempLoadedMoveEnergyNeededType], a
+ ld hl, wAttachedEnergies
+ ld de, wLoadedMoveEnergyCost
+ ld b, $00
+ ld c, $03
+.asm_17237
+ ld a, [de]
+ swap a
+ call Func_17258
+ ld a, [de]
+ call Func_17258
+ inc de
+ dec c
+ jr nz, .asm_17237
+ ld a, [de]
+ swap a
+ and $0f
+ ld b, a
+ ld hl, wTempLoadedMoveEnergyCost
+ ld a, [wTotalAttachedEnergies]
+ sub [hl]
+ sub b
+ ret c
+ or a
+ ret nz
+ scf
+ ret
+; 0x17258
+
+Func_17258 ; 17258 (5:7258)
+ INCROM $17258, $17274
; return carry if there is a card that
; can evolve a Pokémon in hand or deck