summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/engine/bank05.asm362
-rw-r--r--src/engine/bank08.asm24
-rw-r--r--src/wram.asm10
3 files changed, 374 insertions, 22 deletions
diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm
index 3193140..13c0286 100644
--- a/src/engine/bank05.asm
+++ b/src/engine/bank05.asm
@@ -110,7 +110,34 @@ CheckIfMoveKnocksOutDefendingCard: ; 140b5 (5:40b5)
ret
; 0x140c5
- INCROM $140c5, $140fe
+ INCROM $140c5, $140df
+
+Func_140df: ; 140df (5:40df)
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
+ call GetTurnDuelistVariable
+ ld b, a
+ ld c, 0
+ ld e, c
+ ld d, c
+ ld hl, wcdbf + 1
+ jp .next
+
+.loop
+ ld a, [hli]
+ cp e
+ jr c, .next
+ ld e, a
+ ld d, c
+.next
+ inc c
+ dec b
+ jr nz, .loop
+
+ ld a, d
+ ldh [hTempPlayAreaLocation_ff9d], a
+ or a
+ ret
+; 0x140fe
; adds a to wAIScore
; if there's overflow, it's capped at $ff
@@ -1264,7 +1291,21 @@ CalculateTensDigit: ; 1576b (5:576b)
; 0x15778
Func_15778: ; 15778 (5:5778)
- INCROM $15778, $15787
+ push bc
+ ld c, a
+ ld a, b
+ ld b, c
+ ld c, $00
+.loop
+ sub b
+ jr c, .done
+ inc c
+ jr .loop
+.done
+ ld a, c
+ pop bc
+ ret
+; 0x15787
; returns in a the number of energy cards attached
; to Pokémon in location held by e
@@ -1737,10 +1778,293 @@ Func_158b2: ; 158b2 (5:58b2)
jr .set_carry
; 0x15b54
- INCROM $15b54, $15b72
+Func_15b54: ; 15b54 (5:5b54)
+ xor a
+ ld [wcdda], a
+ ld a, [wWhoseTurn]
+ cp OPPONENT_TURN
+ jr z, .opponent
+ ld a, [wLoadedMoveCategory]
+ cp POKEMON_POWER
+ ret z
+ jr .asm_15b6c
+
+.opponent
+ ld a, [wcddb]
+ or a
+ ret nz
+
+.asm_15b6c
+ ld a, $80
+ ld [wcdda], a
+ ret
+; 0x15b72
+
+Func_15b72: ; 15b72 (5:5b72)
+ xor a
+ ldh [hTempPlayAreaLocation_ff9d], a
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
+ call GetTurnDuelistVariable
+ cp 2
+ ret c
+
+; has at least 2 Pokémon in Play Area
+ call Func_15b54
+ call StoreDefendingPokemonColorWRAndPrizeCards
+ ld a, 50
+ ld [wAIScore], a
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
+ call GetTurnDuelistVariable
+ ld b, a
+ ld c, $00
+ push bc
+ jp .asm_15d35
+; 0x15b94
+
+.asm_15b94
+ push bc
+ ld a, c
+ ldh [hTempPlayAreaLocation_ff9d], a
+ ld a, 50
+ ld [wAIScore], a
-Func_15b72 ; 15b72 (5:5b72)
- INCROM $15b72, $15d4f
+ call CheckIfAnyMoveKnocksOutDefendingCard
+ jr nc, .asm_15bc1
+ call CheckIfCardCanUseSelectedMove
+ jr c, .asm_15bc1
+ ld a, 10
+ call AddToAIScore
+ ld a, [wcdda]
+ or $01
+ ld [wcdda], a
+ call CountPrizes
+ cp 2
+ jp nc, .asm_15c3c
+ ld a, 10
+ call AddToAIScore
+
+.asm_15bc1
+ xor a
+ ld [wSelectedMoveIndex], a
+ call CheckIfCardCanUseSelectedMove
+ call nc, .asm_15bd8
+ ld a, $01
+ ld [wSelectedMoveIndex], a
+ call CheckIfCardCanUseSelectedMove
+ call nc, .asm_15bd8
+ jr .asm_15be9
+
+.asm_15bd8
+ ld a, [wSelectedMoveIndex]
+ call CalculateMoveDamage_VersusDefendingCard
+ ld a, [wDamage]
+ call CalculateTensDigit
+ inc a
+ call AddToAIScore
+ ret
+
+.asm_15be9
+ call LookForEnergyNeededInHand
+ jr nc, .asm_15bff
+ ld a, [wSelectedMoveIndex]
+ call CalculateMoveDamage_VersusDefendingCard
+ ld a, [wDamage]
+ call CalculateTensDigit
+ srl a
+ call AddToAIScore
+
+.asm_15bff
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ ld e, a
+ call GetPlayAreaCardAttachedEnergies
+ ld a, [wTotalAttachedEnergies]
+ or a
+ jr nz, .asm_15c10
+ ld a, 1
+ call SubFromAIScore
+
+.asm_15c10
+ ld a, DUELVARS_ARENA_CARD
+ call GetNonTurnDuelistVariable
+ call SwapTurn
+ call LoadCardDataToBuffer2_FromDeckIndex
+ call SwapTurn
+ cp MR_MIME
+ jr nz, .asm_15c3c
+ xor a
+ call CalculateMoveDamage_VersusDefendingCard
+ ld a, [wDamage]
+ or a
+ jr nz, .asm_15c37
+ ld a, $01
+ call CalculateMoveDamage_VersusDefendingCard
+ ld a, [wDamage]
+ or a
+ jr z, .asm_15c3c
+.asm_15c37
+ ld a, 5
+ call AddToAIScore
+
+.asm_15c3c
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ add DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ call LoadCardDataToBuffer1_FromDeckIndex
+ ld a, [wLoadedCard1Type]
+ call TranslateColorToWR
+ ld c, a
+ ld hl, wAIPlayerWeakness
+ and [hl]
+ jr z, .asm_15c58
+ ld a, 3
+ call AddToAIScore
+
+.asm_15c58
+ ld a, c
+ ld hl, wAIPlayerResistance
+ and [hl]
+ jr z, .asm_15c64
+ ld a, 2
+ call SubFromAIScore
+
+.asm_15c64
+ ld a, [wAIPlayerColor]
+ ld hl, wLoadedCard1Resistance
+ and [hl]
+ jr z, .asm_15c72
+ ld a, 2
+ call AddToAIScore
+.asm_15c72
+ ld a, [wAIPlayerColor]
+ ld hl, wLoadedCard1Weakness
+ and [hl]
+ jr z, .asm_15c80
+ ld a, 3
+ call SubFromAIScore
+
+.asm_15c80
+ call GetPlayAreaCardRetreatCost
+ cp 2
+ jr c, .asm_15c90
+ jr z, .asm_15c95
+ ld a, 1
+ call SubFromAIScore
+ jr .asm_15c95
+.asm_15c90
+ ld a, 1
+ call AddToAIScore
+
+.asm_15c95
+ ld a, [wcdda]
+ cp $81
+ jr z, .asm_15cb0
+ call CheckIfDefendingPokemonCanKnockOut
+ jr nc, .asm_15cb0
+ ld e, 3
+ ld a, [wAIPlayerPrizeCount]
+ cp 1
+ jr nz, .asm_15cac
+ ld e, 10
+.asm_15cac
+ ld a, e
+ call SubFromAIScore
+
+.asm_15cb0
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ add DUELVARS_ARENA_CARD_HP
+ call GetTurnDuelistVariable
+ or a
+ jr nz, .asm_15cbf
+ ld [wAIScore], a
+ jr .asm_15d35
+
+.asm_15cbf
+ ld b, a
+ ld a, $04
+ call Func_15778
+ call CalculateTensDigit
+ call AddToAIScore
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ add DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ call LoadCardDataToBuffer1_FromDeckIndex
+ cp MR_MIME
+ jr z, .asm_15ceb
+ cp MEW1
+ jr nz, .asm_15cf0
+ ld a, DUELVARS_ARENA_CARD
+ call GetNonTurnDuelistVariable
+ call LoadCardDataToBuffer2_FromDeckIndex
+ ld a, [wLoadedCard2Stage]
+ or a
+ jr z, .asm_15cf0
+.asm_15ceb
+ ld a, 5
+ call AddToAIScore
+
+.asm_15cf0
+ ld a, [wLoadedCard1Unknown2]
+ cp $01
+ jr nz, .asm_15cfc
+ ld a, 2
+ call SubFromAIScore
+.asm_15cfc
+ ld a, [wLoadedCard1ID]
+ cp MYSTERIOUS_FOSSIL
+ jr z, .asm_15d07
+ cp CLEFAIRY_DOLL
+ jr nz, .asm_15d0c
+.asm_15d07
+ ld a, 10
+ call SubFromAIScore
+
+.asm_15d0c
+ ld b, a
+ ld a, [$cdb1]
+ or a
+ jr z, .asm_15d35
+ ld h, a
+ ld a, [$cdb0]
+ ld l, a
+.asm_15d18
+ ld a, [hli]
+ or a
+ jr z, .asm_15d35
+ cp b
+ jr nz, .asm_15d32
+ ld a, [hl]
+ cp $80
+ jr c, .asm_15d2b
+ sub $80
+ call AddToAIScore
+ jr .asm_15d32
+
+.asm_15d2b
+ ld c, a
+ ld a, $80
+ sub c
+ call SubFromAIScore
+.asm_15d32
+ inc hl
+ jr .asm_15d18
+; 0x15d35
+
+.asm_15d35
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ ld c, a
+ ld b, $00
+ ld hl, wcdbf
+ add hl, bc
+ ld a, [wAIScore]
+ ld [hl], a
+ pop bc
+ inc c
+ dec b
+ jp nz, .asm_15b94
+ xor a
+ ld [$cdb4], a
+ jp Func_140df
+; 0x15d4f
Func_15d4f ; 15d4f (5:5d4f)
INCROM $15d4f, $15ea6
@@ -2165,24 +2489,24 @@ Func_16120: ; 16120 (5:6120)
jr z, .dragonair
ret
-; check if Charmeleon has at least 3 energy cards attached
-; and checks output of Func_22990
+; check if number of energy cards attached to Charmeleon are at least 3
+; and if adding the energy cards in hand makes at least 6 energy cards
.charmeleon
ldh a, [hTempPlayAreaLocation_ff9d]
ld e, a
call CountNumberOfEnergyCardsAttached
cp 3
- jr c, .asm_1615b
+ jr c, .not_enough_energy
push af
- farcall Func_22990
+ farcall CountEnergyCardsInHand
pop bc
add b
- cp $06
- jr c, .asm_1615b
+ cp 6
+ jr c, .not_enough_energy
ld a, 3
call AddToAIScore
ret
-.asm_1615b
+.not_enough_energy
ld a, 10
call SubFromAIScore
ret
@@ -2249,32 +2573,34 @@ Func_16120: ; 16120 (5:6120)
ld a, 70
cp c
jr c, .check_muk
-.asm_161ab
+.subtract_score
ld a, 10
call SubFromAIScore
ret
+; if there's no Muk, raise score
.check_muk
ld a, MUK
call CountPokemonIDInBothPlayAreas
- jr c, .asm_161ab
+ jr c, .subtract_score
ld a, 10
call AddToAIScore
ret
; if Dragonair is active, check its damage in HP
-; if this result is >= 50, check if there's
-; a Muk in any duelist's Play Area
+; if this result is >= 50,
+; and if at least 3 energy cards attached,
+; check if there's a Muk in any duelist's Play Area
.is_active
ld e, 0
call GetCardDamage
cp 50
- jr c, .asm_161ab
+ jr c, .subtract_score
ld e, PLAY_AREA_ARENA
call GetPlayAreaCardAttachedEnergies
ld a, [wTotalAttachedEnergies]
cp 3
- jr c, .asm_161ab
+ jr c, .subtract_score
jr .check_muk
; 0x161d5
diff --git a/src/engine/bank08.asm b/src/engine/bank08.asm
index b3c2a3a..15ff62a 100644
--- a/src/engine/bank08.asm
+++ b/src/engine/bank08.asm
@@ -131,5 +131,25 @@ CopyBuffer: ; 2297b (8:697b)
INCROM $22983, $22990
-Func_22990 ; 22990 (8:6990)
- INCROM $22990, $24000
+; counts number of energy cards found in hand
+; and outputs result in a
+; sets carry if none are found
+; output:
+; a = number of energy cards found
+CountEnergyCardsInHand: ; 22990 (8:6990)
+ farcall CreateEnergyCardListFromHand
+ ret c
+ ld b, -1
+ ld hl, wDuelTempList
+.loop
+ inc b
+ ld a, [hli]
+ cp $ff
+ jr nz, .loop
+ ld a, b
+ or a
+ ret
+; 0x229a3
+
+Func_229a3 ; 229a3 (8:69a3)
+ INCROM $229a3, $24000
diff --git a/src/wram.asm b/src/wram.asm
index 12184e6..b72d83d 100644
--- a/src/wram.asm
+++ b/src/wram.asm
@@ -1199,7 +1199,10 @@ wTempLoadedMoveEnergyNeededAmount:: ; cdb7
wAIScore:: ; cdbe
ds $1
- ds $10
+wcdbf:: ; cdbf
+ ds MAX_PLAY_AREA_POKEMON
+
+ ds $0a
; information about the defending Pokémon and
; the prize card count on both sides for AI:
@@ -1223,7 +1226,10 @@ wAIOpponentPrizeCount:: ; cdd3
wTempCardIDToLook:: ; cdd4
ds $1
- ds $6
+ ds $5
+
+wcdda:: ; cdda
+ ds $1
wcddb:: ; cddb
ds $1