summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorElectroDeoxys <ElectroDeoxys@gmail.com>2019-08-07 23:20:06 +0100
committerElectroDeoxys <ElectroDeoxys@gmail.com>2019-08-09 12:32:51 +0100
commite1f303a32ab71ae5710ea5ad57b95cd357bf7796 (patch)
tree0fe6627a59d0e5b8389a607a3c5188c52c11a0a2 /src
parent8787f87a970e6fb69f0291585440ae86bbaf65d0 (diff)
Disassemble Func_164e8
Diffstat (limited to 'src')
-rw-r--r--src/engine/bank05.asm439
-rw-r--r--src/wram.asm27
2 files changed, 458 insertions, 8 deletions
diff --git a/src/engine/bank05.asm b/src/engine/bank05.asm
index 6f48aa5..1ff8c6d 100644
--- a/src/engine/bank05.asm
+++ b/src/engine/bank05.asm
@@ -1205,7 +1205,71 @@ Func_1468b: ; 1468b (5:468b)
ret
; 0x14786
- INCROM $14786, $1514f
+Func_14786: ; 14786 (5:4786)
+ INCROM $14786, $14c91
+
+Func_14c91: ; 14c91 (5:4c91)
+ call SwapTurn
+ call CountPrizes
+ call SwapTurn
+ cp 3
+ ret c
+
+; player prizes >= 3
+ ld a, $59
+ call Func_17474
+ jr c, .asm_14ccb
+ ld a, $5e
+ call Func_17474
+ jr c, .asm_14cb4
+ ld a, $4c
+ call Func_17474
+ jr c, .asm_14cb4
+ jr .asm_14ccb
+
+.asm_14cb4
+ ld a, $59
+ ld b, $01
+ call Func_155ef
+ jr nc, .asm_14ccb
+ ld e, a
+ call CountNumberOfEnergyCardsAttached
+ cp 3
+ jr nc, .asm_14ccb
+ ld a, $59
+ call Func_174cd
+ ret
+
+.asm_14ccb
+ ld a, $5e
+ ld b, $01
+ call Func_155ef
+ jr nc, .asm_14cda
+ ld a, $5e
+ call Func_174cd
+ ret
+
+.asm_14cda
+ ld a, $4c
+ ld b, $01
+ call Func_155ef
+ jr nc, .asm_14ce9
+ ld a, $4c
+ call Func_174cd
+ ret
+
+.asm_14ce9
+ ld a, $4b
+ ld b, $01
+ call Func_155ef
+ ret nc
+ ld a, $4b
+ call Func_174cd
+ ret
+; 0x14cf7
+
+Func_14cf7: ; 14cf7 (5:4cf7)
+ INCROM $14cf7, $1514f
; these seem to be lists of card IDs
; for the AI to look up in their hand
@@ -3570,10 +3634,295 @@ CheckForEvolutionInDeck: ; 16451 (5:6451)
; 0x16488
Func_16488 ; 16488 (5:6488)
- INCROM $16488, $164e8
+ INCROM $16488, $164d3
+
+; copies bench AI score to wcddd
+; and loads in wAIscore value in wcde3
+Func_164d3: ; 164d3 (5:64d3)
+ push af
+ ld de, wBenchAIScore
+ ld hl, wcddd
+ ld b, MAX_PLAY_AREA_POKEMON
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .loop
+ ld a, [hl]
+ ld [wAIScore], a
+ pop af
+ ret
+; 0x164e8
+
+Func_164e8: ; 164e8 (5:64e8)
+ xor a
+ ld [wcdd8], a
+ call CreateEnergyCardListFromHand
+ jr nc, .has_energy
+
+; no energy
+ ld a, [wcdd8]
+ or a
+ jr z, .exit
+ ; can this even be reached?
+ jp Func_164d3
+.exit
+ or a
+ ret
+
+.has_energy
+ ld a, $80
+ ld b, MAX_PLAY_AREA_POKEMON
+ ld hl, wcde4
+.loop
+ ld [hli], a
+ dec b
+ jr nz, .loop
+
+ call Func_175bd
+ ld b, PLAY_AREA_ARENA
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
+ call GetTurnDuelistVariable
+ ld c, a
+
+.asm_16512
+ push bc
+ ld a, b
+ ldh [hTempPlayAreaLocation_ff9d], a
+ ld a, $80
+ ld [wAIScore], a
+ ld a, $ff
+ ld [wCurCardPlayAreaLocation], a
+ ld a, [wcdd8]
+ and $02
+ jr nz, .check_venusaur
+
+ call CreateHandCardList
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ add DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ ld [wCurCardCanAttack], a
+ call GetMovesEnergyCostBits
+ ld hl, wDuelTempList
+ call CheckEnergyFlagsNeededInList
+ jp nc, .asm_16661
+ ld a, [wCurCardCanAttack]
+ call CheckForEvolutionInList
+ jr nc, .asm_16552
+ ld [wCurCardPlayAreaLocation], a
+ ld a, 2
+ call AddToAIScore
+ jr .check_venusaur
+.asm_16552
+ ld a, [wCurCardCanAttack]
+ call CheckForEvolutionInDeck
+ jr nc, .check_venusaur
+ ld a, 1
+ call AddToAIScore
+
+; if there's no Muk in Play Area
+; and there's Venusaur1, add to AI score
+.check_venusaur
+ ld a, MUK
+ call CountPokemonIDInBothPlayAreas
+ jr c, .asm_16572
+ ld a, VENUSAUR2
+ call CountPokemonIDInPlayArea
+ jr nc, .asm_16572
+ ld a, 1
+ call AddToAIScore
+
+.asm_16572
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ or a
+ jr nz, .bench
+
+; arena
+ ld a, [wcda7]
+ bit 7, a
+ jr z, .check_arena_hp
+ ld a, 5
+ call SubFromAIScore
+ jr .check_defending_can_ko
+
+; lower AI score if poison/double poison
+; will KO Pokémon between turns
+; or if the defending Pokémon can KO
+.check_arena_hp
+ ld a, 4
+ call AddToAIScore
+
+ ld a, DUELVARS_ARENA_CARD_HP
+ call GetTurnDuelistVariable
+ call CalculateTensDigit
+ cp 3
+ jr nc, .check_defending_can_ko
+; hp < 30
+ cp 2
+ jr z, .has_20_hp
+; hp = 10
+ ld a, DUELVARS_ARENA_CARD_STATUS
+ call GetTurnDuelistVariable
+ and POISONED
+ jr z, .check_defending_can_ko
+ jr .poison_will_ko
+.has_20_hp
+ ld a, DUELVARS_ARENA_CARD_STATUS
+ call GetTurnDuelistVariable
+ and DOUBLE_POISONED
+ jr z, .check_defending_can_ko
+.poison_will_ko
+ ld a, 10
+ call SubFromAIScore
+ jr .check_bench
+.check_defending_can_ko
+ call CheckIfDefendingPokemonCanKnockOut
+ jr nc, .asm_165e1
+ ld a, 10
+ call SubFromAIScore
+
+; if either poison will KO or
+; defending Pokémon can KO,
+; check if there are bench Pokémon
+; if there are not, add AI score
+.check_bench
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
+ call GetTurnDuelistVariable
+ dec a
+ jr nz, .asm_165e1
+ ld a, 6
+ call AddToAIScore
+ jr .asm_165e1
+
+; lower AI score by 3 - (bench HP)/10
+; if bench HP < 30
+.bench
+ add DUELVARS_ARENA_CARD_HP
+ call GetTurnDuelistVariable
+ call CalculateTensDigit
+ cp 3
+ jr nc, .asm_165e1
+; hp < 30
+ ld b, a
+ ld a, 3
+ sub b
+ call SubFromAIScore
+
+.asm_165e1
+ ld a, [wcdb3]
+ or a
+ jr z, .asm_1662f
+ ld h, a
+ ld a, [wcdb2]
+ ld l, a
+
+ push hl
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ add DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ call GetCardIDFromDeckIndex
+ pop hl
+.asm_165f8
+ ld a, [hli]
+ or a
+ jr z, .asm_1662f
+ cp e
+ jr nz, .asm_1662b
+ ld a, [hli]
+ ld d, a
+ push de
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ ld e, a
+ call GetPlayAreaCardAttachedEnergies
+ ld a, [wTotalAttachedEnergies]
+ pop de
+ cp d
+ jr c, .asm_16616
+ ld a, $0a
+ call SubFromAIScore
+ jr .asm_16661
+.asm_16616
+ ld a, [hli]
+ cp $80
+ jr c, .asm_16622
+ sub $80
+ call AddToAIScore
+ jr .asm_1662f
+.asm_16622
+ ld d, a
+ ld a, $80
+ sub d
+ call SubFromAIScore
+ jr .asm_1662f
+.asm_1662b
+ inc hl
+ inc hl
+ jr .asm_165f8
+
+.asm_1662f
+ call CheckIfNotABossDeckID
+ jr c, .asm_16653
+ call Func_174f2
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ ld c, a
+ ld b, $00
+ ld hl, wcde4
+ add hl, bc
+ ld a, [hl]
+ cp $80
+ jr c, .asm_1664c
+ sub $80
+ call AddToAIScore
+ jr .asm_16653
+.asm_1664c
+ ld b, a
+ ld a, $80
+ sub b
+ call SubFromAIScore
+.asm_16653
+ ld a, 1
+ call AddToAIScore
+
+ xor a
+ call Func_16695
+ ld a, $01
+ call Func_16695
+.asm_16661
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ ld c, a
+ ld b, $00
+ ld hl, wBenchAIScore
+ add hl, bc
+ ld a, [wAIScore]
+ ld [hl], a
+ pop bc
+ inc b
+ dec c
+ jp nz, .asm_16512
+ call Func_167b5
+ jp nc, Func_1668a
+ ld a, [wcdd8]
+ or a
+ jr z, .asm_16684
+ scf
+ jp Func_164d3
+.asm_16684
+ call CreateEnergyCardListFromHand
+ jp Func_1689f
+; 0x1668a
+
+Func_1668a ; 1668a (5:668a)
+ INCROM $1668a, $16695
-Func_164e8 ; 164e8 (5:64e8)
- INCROM $164e8, $169f8
+Func_16695 ; 16695 (5:6695)
+ INCROM $16695, $167b5
+
+Func_167b5 ; 167b5 (5:67b5)
+ INCROM $167b5, $1689f
+
+Func_1689f ; 1689f (5:689f)
+ INCROM $1689f, $169f8
Func_169f8 ; 169f8 (5:69f8)
INCROM $169f8, $170c9
@@ -3915,4 +4264,84 @@ CheckIfNotABossDeckID: ; 17426 (5:7426)
; 0x1743b
Func_1743b ; 1743b (5:743b)
- INCROM $1743b, $18000 \ No newline at end of file
+ INCROM $1743b, $17474
+
+Func_17474: ; 17474 (5:7474)
+ ld [wcdf9], a
+ ldh a, [hTempPlayAreaLocation_ff9d]
+ ld d, a
+ ld a, [wSelectedMoveIndex]
+ ld e, a
+ push de
+ ld a, DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ lb bc, 0, 0
+ push hl
+
+.loop
+ inc c
+ pop hl
+ ld a, [hli]
+ push hl
+ cp $ff
+ jr z, .asm_174bf
+ ld d, a
+ push de
+ push bc
+ call LoadCardDataToBuffer1_FromDeckIndex
+ pop bc
+ ld a, c
+ add DUELVARS_ARENA_CARD_HP
+ call GetTurnDuelistVariable
+ ld d, a
+ ld a, [wLoadedCard1HP]
+ rrca
+ cp d
+ pop de
+ jr nc, .loop
+ ld a, [wLoadedCard1ID]
+ ld hl, wcdf9
+ cp [hl]
+ jr nz, .loop
+
+ ld a, c
+ ldh [hTempPlayAreaLocation_ff9d], a
+ ld a, $01
+ ld [wSelectedMoveIndex], a
+ push bc
+ call CheckIfCardCanUseSelectedMove
+ pop bc
+ jr c, .loop
+ inc b
+.asm_174bf
+ pop hl
+ pop de
+ ld a, e
+ ld [wSelectedMoveIndex], a
+ ld a, d
+ ldh [hTempPlayAreaLocation_ff9d], a
+ ld a, b
+ or a
+ ret z
+ scf
+ ret
+; 0x174cd
+
+Func_174cd ; 174cd (5:74cd)
+ INCROM $174cd, $174f2
+
+Func_174f2 ; 174f2 (5:74f2)
+ INCROM $174f2, $175bd
+
+Func_175bd: ; 175bd (5:75bd)
+ ld a, [wOpponentDeckID]
+ cp LEGENDARY_ARTICUNO_DECK_ID
+ jr z, .articuno_deck
+ ret
+.articuno_deck
+ call Func_14c91
+ ret
+; 0x175c9
+
+Func_175c9 ; 175c9 (5:75c9)
+ INCROM $175c9, $18000 \ No newline at end of file
diff --git a/src/wram.asm b/src/wram.asm
index 63df6dc..0ef674e 100644
--- a/src/wram.asm
+++ b/src/wram.asm
@@ -1190,7 +1190,14 @@ wcda7:: ; cda7
wcdae:: ; cdae
ds $2
- ds $5
+ ds $2
+
+wcdb2:: ; cdb2
+ ds $1
+wcdb3:: ; cdb3
+ ds $1
+
+ ds $1
; information about various properties of
; loaded move for AI calculations
@@ -1271,7 +1278,16 @@ wcddb:: ; cddb
wcddc:: ; cddc
ds $1
- ds $14
+wcddd:: ; cddd
+ ds MAX_PLAY_AREA_POKEMON
+
+wcde3:: ; cde3
+ ds $1
+
+wcde4:: ; cde4
+ ds MAX_PLAY_AREA_POKEMON
+
+ ds $7
; a PLAY_AREA_* constant (0: arena card, 1-5: bench card)
; used by the AI to temporarily store card location
@@ -1296,7 +1312,12 @@ wTempAIPokemonCard:: ; cdf3
wCurCardCanKO:: ; cdf4
ds $1
- ds $b
+ ds $4
+
+wcdf9:: ; cdf9
+ ds $1
+
+ ds $6
wce00:: ; ce00
ds $1