pokecrystal-board/battle/ai/scoring.asm
yenatch 023cfdbb05 Consolidate monster structs in wram and sram.
The PartyMon struct is really the box struct with volatile variables like status added.

Some other labels have been reworked.
Move structs no longer have explicit labels since their location is arbitrary and usually shared.
2014-06-12 18:32:42 -07:00

3320 lines
41 KiB
NASM

AIScoring_RedStatus: ; 38591
; Don't use status-only moves if the player can't be statused.
ld hl, Buffer1 - 1
ld de, EnemyMonMoves
ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
.checkmove
dec b
ret z
inc hl
ld a, [de]
and a
ret z
inc de
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
ld c, a
push hl
push de
push bc
callba Function2c41a
pop bc
pop de
pop hl
jr nz, .discourage
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
push hl
push de
push bc
ld hl, .statusonlyeffects
ld de, 1
call IsInArray
pop bc
pop de
pop hl
jr nc, .checkmove
ld a, [BattleMonStatus]
and a
jr nz, .discourage
ld a, [PlayerScreens]
bit SCREENS_SAFEGUARD, a
jr z, .checkmove
.discourage
call AIDiscourageMove
jr .checkmove
; 385db
.statusonlyeffects
db EFFECT_SLEEP
db EFFECT_TOXIC
db EFFECT_POISON
db EFFECT_PARALYZE
db $ff
; 385e0
AIScoring_RedStatMods: ; 385e0
; Use stat-modifying moves on turn 1.
ld hl, Buffer1 - 1
ld de, EnemyMonMoves
ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
.checkmove
dec b
ret z
inc hl
ld a, [de]
and a
ret z
inc de
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
cp EFFECT_ATTACK_UP
jr c, .checkmove
cp EFFECT_EVASION_UP + 1
jr c, .statup
; cp EFFECT_ATTACK_DOWN - 1
jr z, .checkmove
cp EFFECT_EVASION_DOWN + 1
jr c, .statdown
cp EFFECT_ATTACK_UP_2
jr c, .checkmove
cp EFFECT_EVASION_UP_2 + 1
jr c, .statup
; cp EFFECT_ATTACK_DOWN_2 - 1
jr z, .checkmove
cp EFFECT_EVASION_DOWN_2 + 1
jr c, .statdown
jr .checkmove
.statup
ld a, [EnemyTurnsTaken]
and a
jr nz, .discourage
jr .encourage
.statdown
ld a, [PlayerTurnsTaken]
and a
jr nz, .discourage
.encourage
call Function39527
jr c, .checkmove
dec [hl]
dec [hl]
jr .checkmove
.discourage
call Random
cp 30
jr c, .checkmove
inc [hl]
inc [hl]
jr .checkmove
; 38635
AIScoring_RedSuperEffective: ; 38635
; Use super-effective moves.
ld hl, Buffer1 - 1
ld de, EnemyMonMoves
ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
.checkmove
dec b
ret z
inc hl
ld a, [de]
and a
ret z
inc de
call AIGetEnemyMove
push hl
push bc
push de
ld a, 1
ld [hBattleTurn], a
callab Function347c8
pop de
pop bc
pop hl
ld a, [$d265]
and a
jr z, .immune
cp 10 ; 1.0
jr z, .checkmove
jr c, .noteffective
; effective
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
jr z, .checkmove
dec [hl]
jr .checkmove
.noteffective
; Discourage this move if there are any moves
; that do damage of a different type.
push hl
push de
push bc
ld a, [wEnemyMoveStruct + MOVE_TYPE]
ld d, a
ld hl, EnemyMonMoves
ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
ld c, 0
.checkmove2
dec b
jr z, .asm_38693
ld a, [hli]
and a
jr z, .asm_38693
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_TYPE]
cp d
jr z, .checkmove2
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
jr nz, .asm_38692
jr .checkmove2
.asm_38692
ld c, a
.asm_38693
ld a, c
pop bc
pop de
pop hl
and a
jr z, .checkmove
inc [hl]
jr .checkmove
.immune
call AIDiscourageMove
jr .checkmove
; 386a2
AIScoring_Offensive: ; 386a2
; Discourage non-damaging moves.
ld hl, Buffer1 - 1
ld de, EnemyMonMoves
ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
.checkmove
dec b
ret z
inc hl
ld a, [de]
and a
ret z
inc de
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
jr nz, .checkmove
inc [hl]
inc [hl]
jr .checkmove
; 386be
AIScoring_Smart: ; 386be
; Context-specific scoring.
ld hl, Buffer1
ld de, EnemyMonMoves
ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
.checkmove
dec b
ret z
ld a, [de]
inc de
and a
ret z
push de
push bc
push hl
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
ld hl, .table_386f2
ld de, 3
call IsInArray
inc hl
jr nc, .nextmove
ld a, [hli]
ld e, a
ld d, [hl]
pop hl
push hl
ld bc, .nextmove
push bc
push de
ret
.nextmove
pop hl
pop bc
pop de
inc hl
jr .checkmove
.table_386f2
dbw EFFECT_SLEEP, AIScoring_Sleep
dbw EFFECT_LEECH_HIT, AIScoring_LeechHit
dbw EFFECT_EXPLOSION, AIScoring_Explosion
dbw EFFECT_DREAM_EATER, AIScoring_DreamEater
dbw EFFECT_MIRROR_MOVE, AIScoring_MirrorMove
dbw EFFECT_EVASION_UP, AIScoring_EvasionUp
dbw EFFECT_ALWAYS_HIT, AIScoring_AlwaysHit
dbw EFFECT_ACCURACY_DOWN, AIScoring_AccuracyDown
dbw EFFECT_HAZE, AIScoring_Haze
dbw EFFECT_BIDE, AIScoring_Bide
dbw EFFECT_WHIRLWIND, AIScoring_Whirlwind
dbw EFFECT_HEAL, AIScoring_Heal
dbw EFFECT_TOXIC, AIScoring_Toxic
dbw EFFECT_LIGHT_SCREEN, AIScoring_LightScreen
dbw EFFECT_OHKO, AIScoring_Ohko
dbw EFFECT_RAZOR_WIND, AIScoring_RazorWind
dbw EFFECT_SUPER_FANG, AIScoring_SuperFang
dbw EFFECT_BIND, AIScoring_Bind
dbw EFFECT_UNUSED_2B, AIScoring_Unused2B
dbw EFFECT_CONFUSE, AIScoring_Confuse
dbw EFFECT_SP_DEF_UP_2, AIScoring_SpDefenseUp2
dbw EFFECT_REFLECT, AIScoring_Reflect
dbw EFFECT_PARALYZE, AIScoring_Paralyze
dbw EFFECT_SPEED_DOWN_HIT, AIScoring_SpeedDownHit
dbw EFFECT_SUBSTITUTE, AIScoring_Substitute
dbw EFFECT_HYPER_BEAM, AIScoring_HyperBeam
dbw EFFECT_RAGE, AIScoring_Rage
dbw EFFECT_MIMIC, AIScoring_Mimic
dbw EFFECT_LEECH_SEED, AIScoring_LeechSeed
dbw EFFECT_DISABLE, AIScoring_Disable
dbw EFFECT_COUNTER, AIScoring_Counter
dbw EFFECT_ENCORE, AIScoring_Encore
dbw EFFECT_PAIN_SPLIT, AIScoring_PainSplit
dbw EFFECT_SNORE, AIScoring_Snore
dbw EFFECT_CONVERSION2, AIScoring_Conversion2
dbw EFFECT_LOCK_ON, AIScoring_LockOn
dbw EFFECT_DEFROST_OPPONENT, AIScoring_DefrostOpponent
dbw EFFECT_SLEEP_TALK, AIScoring_SleepTalk
dbw EFFECT_DESTINY_BOND, AIScoring_DestinyBond
dbw EFFECT_REVERSAL, AIScoring_Reversal
dbw EFFECT_SPITE, AIScoring_Spite
dbw EFFECT_HEAL_BELL, AIScoring_HealBell
dbw EFFECT_PRIORITY_HIT, AIScoring_PriorityHit
dbw EFFECT_THIEF, AIScoring_Thief
dbw EFFECT_MEAN_LOOK, AIScoring_MeanLook
dbw EFFECT_NIGHTMARE, AIScoring_Nightmare
dbw EFFECT_FLAME_WHEEL, AIScoring_FlameWheel
dbw EFFECT_CURSE, AIScoring_Curse
dbw EFFECT_PROTECT, AIScoring_Protect
dbw EFFECT_FORESIGHT, AIScoring_Foresight
dbw EFFECT_PERISH_SONG, AIScoring_PerishSong
dbw EFFECT_SANDSTORM, AIScoring_Sandstorm
dbw EFFECT_ENDURE, AIScoring_Endure
dbw EFFECT_ROLLOUT, AIScoring_Rollout
dbw EFFECT_SWAGGER, AIScoring_Swagger
dbw EFFECT_FURY_CUTTER, AIScoring_FuryCutter
dbw EFFECT_ATTRACT, AIScoring_Attract
dbw EFFECT_SAFEGUARD, AIScoring_Safeguard
dbw EFFECT_MAGNITUDE, AIScoring_Magnitude
dbw EFFECT_BATON_PASS, AIScoring_BatonPass
dbw EFFECT_PURSUIT, AIScoring_Pursuit
dbw EFFECT_RAPID_SPIN, AIScoring_RapidSpin
dbw EFFECT_MORNING_SUN, AIScoring_MorningSun
dbw EFFECT_SYNTHESIS, AIScoring_Synthesis
dbw EFFECT_MOONLIGHT, AIScoring_Moonlight
dbw EFFECT_HIDDEN_POWER, AIScoring_HiddenPower
dbw EFFECT_RAIN_DANCE, AIScoring_RainDance
dbw EFFECT_SUNNY_DAY, AIScoring_SunnyDay
dbw EFFECT_BELLY_DRUM, AIScoring_BellyDrum
dbw EFFECT_PSYCH_UP, AIScoring_PsychUp
dbw EFFECT_MIRROR_COAT, AIScoring_MirrorCoat
dbw EFFECT_SKULL_BASH, AIScoring_SkullBash
dbw EFFECT_TWISTER, AIScoring_Twister
dbw EFFECT_EARTHQUAKE, AIScoring_Earthquake
dbw EFFECT_FUTURE_SIGHT, AIScoring_FutureSight
dbw EFFECT_GUST, AIScoring_Gust
dbw EFFECT_STOMP, AIScoring_Stomp
dbw EFFECT_SOLARBEAM, AIScoring_Solarbeam
dbw EFFECT_THUNDER, AIScoring_Thunder
dbw EFFECT_FLY, AIScoring_Fly
db $ff
; 387e3
AIScoring_Sleep: ; 387e3
ld b, EFFECT_DREAM_EATER
call AIHasMove
jr c, .asm_387f0
ld b, EFFECT_NIGHTMARE
call AIHasMove
ret nc
.asm_387f0
call Function39527
ret c
dec [hl]
dec [hl]
ret
; 387f7
AIScoring_LeechHit: ; 387f7
push hl
ld a, 1
ld [hBattleTurn], a
callab Function347c8
pop hl
ld a, [$d265]
cp 10 ; 1.0
jr c, .asm_38815
ret z
call AICheckEnemyMaxHP
ret c
call Function39521
ret c
dec [hl]
ret
.asm_38815
call Random
cp $64
ret c
inc [hl]
ret
; 3881d
AIScoring_LockOn: ; 3881d
ld a, [PlayerSubStatus5]
bit 5, a
jr nz, .asm_38882
push hl
call AICheckEnemyQuarterHP
jr nc, .asm_38877
call AICheckEnemyHalfHP
jr c, .asm_38834
call AICompareSpeed
jr nc, .asm_38877
.asm_38834
ld a, [PlayerEvaLevel]
cp $a
jr nc, .asm_3887a
cp $8
jr nc, .asm_38875
ld a, [EnemyAccLevel]
cp $5
jr c, .asm_3887a
cp $7
jr c, .asm_38875
ld hl, EnemyMonMoves
ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
.asm_3884f
dec c
jr z, .asm_38877
ld a, [hli]
and a
jr z, .asm_38877
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_ACC]
cp 180
jr nc, .asm_3884f
ld a, $1
ld [hBattleTurn], a
push hl
push bc
callba Function347c8
ld a, [$d265]
cp $a
pop bc
pop hl
jr c, .asm_3884f
.asm_38875
pop hl
ret
.asm_38877
pop hl
inc [hl]
ret
.asm_3887a
pop hl
call Function39527
ret c
dec [hl]
dec [hl]
ret
.asm_38882
push hl
ld hl, Buffer1 - 1
ld de, EnemyMonMoves
ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
.asm_3888b
inc hl
dec c
jr z, .asm_388a2
ld a, [de]
and a
jr z, .asm_388a2
inc de
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_ACC]
cp 180
jr nc, .asm_3888b
dec [hl]
dec [hl]
jr .asm_3888b
.asm_388a2
pop hl
jp AIDiscourageMove
; 388a6
AIScoring_Explosion: ; 388a6
push hl
callba Function349f4
pop hl
jr nc, .asm_388b7
push hl
call AICheckLastPlayerMon
pop hl
jr nz, .asm_388c6
.asm_388b7
call AICheckEnemyHalfHP
jr c, .asm_388c6
call AICheckEnemyQuarterHP
ret nc
call Random
cp 20
ret c
.asm_388c6
inc [hl]
inc [hl]
inc [hl]
ret
; 388ca
AIScoring_DreamEater: ; 388ca
call Random
cp $19
ret c
dec [hl]
dec [hl]
dec [hl]
ret
; 388d4
AIScoring_EvasionUp: ; 388d4
ld a, [EnemyEvaLevel]
cp $d
jp nc, AIDiscourageMove
call AICheckEnemyMaxHP
jr nc, .asm_388f2
ld a, [PlayerSubStatus5]
bit SUBSTATUS_TOXIC, a
jr nz, .asm_388ef
call Random
cp $b2
jr nc, .asm_38911
.asm_388ef
dec [hl]
dec [hl]
ret
.asm_388f2
call AICheckEnemyQuarterHP
jr nc, .asm_3890f
call Random
cp $a
jr c, .asm_388ef
call AICheckEnemyHalfHP
jr nc, .asm_3890a
call Function39521
jr c, .asm_388ef
jr .asm_38911
.asm_3890a
call Function39527
jr c, .asm_38911
.asm_3890f
inc [hl]
inc [hl]
.asm_38911
ld a, [PlayerSubStatus5]
bit SUBSTATUS_TOXIC, a
jr nz, .asm_38938
ld a, [PlayerSubStatus4]
bit SUBSTATUS_LEECH_SEED, a
jr nz, .asm_38941
ld a, [EnemyEvaLevel]
ld b, a
ld a, [PlayerAccLevel]
cp b
jr c, .asm_38936
ld a, [PlayerFuryCutterCount]
and a
jr nz, .asm_388ef
ld a, [PlayerSubStatus1]
bit SUBSTATUS_ENCORED, a
jr nz, .asm_388ef
.asm_38936
inc [hl]
ret
.asm_38938
call Random
cp $50
ret c
dec [hl]
dec [hl]
ret
.asm_38941
call Function39527
ret c
dec [hl]
ret
; 38947
AIScoring_AlwaysHit: ; 38947
ld a, [EnemyAccLevel]
cp $5
jr c, .asm_38954
ld a, [PlayerEvaLevel]
cp $a
ret c
.asm_38954
call Function39521
ret c
dec [hl]
dec [hl]
ret
; 3895b
AIScoring_MirrorMove: ; 3895b
ld a, [LastEnemyCounterMove]
and a
jr nz, .asm_38968
call AICompareSpeed
ret nc
jp AIDiscourageMove
.asm_38968
push hl
ld hl, Table_0x39301
ld de, 1
call IsInArray
pop hl
ret nc
call Function39527
ret c
dec [hl]
call AICompareSpeed
ret nc
call Random
cp $19
ret c
dec [hl]
ret
; 38985
AIScoring_AccuracyDown: ; 38985
call AICheckPlayerMaxHP
jr nc, .asm_389a0
call AICheckEnemyHalfHP
jr nc, .asm_389a0
ld a, [PlayerSubStatus5]
bit SUBSTATUS_TOXIC, a
jr nz, .asm_3899d
call Random
cp $b2
jr nc, .asm_389bf
.asm_3899d
dec [hl]
dec [hl]
ret
.asm_389a0
call AICheckPlayerQuarterHP
jr nc, .asm_389bd
call Random
cp $a
jr c, .asm_3899d
call AICheckPlayerHalfHP
jr nc, .asm_389b8
call Function39521
jr c, .asm_3899d
jr .asm_389bf
.asm_389b8
call Function39527
jr c, .asm_389bf
.asm_389bd
inc [hl]
inc [hl]
.asm_389bf
ld a, [PlayerSubStatus5]
bit SUBSTATUS_TOXIC, a
jr nz, .asm_389e6
ld a, [PlayerSubStatus4]
bit SUBSTATUS_LEECH_SEED, a
jr nz, .asm_389ef
ld a, [EnemyEvaLevel]
ld b, a
ld a, [PlayerAccLevel]
cp b
jr c, .asm_389e4
ld a, [PlayerFuryCutterCount]
and a
jr nz, .asm_3899d
ld a, [PlayerSubStatus1]
bit SUBSTATUS_ENCORED, a
jr nz, .asm_3899d
.asm_389e4
inc [hl]
ret
.asm_389e6
call Random
cp $50
ret c
dec [hl]
dec [hl]
ret
.asm_389ef
call Function39527
ret c
dec [hl]
ret
; 389f5
AIScoring_Haze: ; 389f5
push hl
ld hl, EnemyAtkLevel
ld c, $8
.asm_389fb
dec c
jr z, .asm_38a05
ld a, [hli]
cp $5
jr c, .asm_38a12
jr .asm_389fb
.asm_38a05
ld hl, PlayerAtkLevel
ld c, $8
.asm_38a0a
dec c
jr z, .asm_38a1b
ld a, [hli]
cp $a
jr c, .asm_38a0a
.asm_38a12
pop hl
call Random
cp $28
ret c
dec [hl]
ret
.asm_38a1b
pop hl
inc [hl]
ret
; 38a1e
AIScoring_Bide: ; 38a1e
call AICheckEnemyMaxHP
ret c
call Random
cp $19
ret c
inc [hl]
ret
; 38a2a
AIScoring_Whirlwind: ; 38a2a
push hl
callab Function3484e
ld a, [$c716]
cp $a
pop hl
ret c
inc [hl]
ret
; 38a3a
AIScoring_Heal:
AIScoring_MorningSun:
AIScoring_Synthesis:
AIScoring_Moonlight: ; 38a3a
call AICheckEnemyQuarterHP
jr nc, .asm_38a45
call AICheckEnemyHalfHP
ret nc
inc [hl]
ret
.asm_38a45
call Random
cp $19
ret c
dec [hl]
dec [hl]
ret
; 38a4e
AIScoring_Toxic:
AIScoring_LeechSeed: ; 38a4e
call AICheckPlayerHalfHP
ret c
inc [hl]
ret
; 38a54
AIScoring_LightScreen:
AIScoring_Reflect: ; 38a54
call AICheckEnemyMaxHP
ret c
call Random
cp $14
ret c
inc [hl]
ret
; 38a60
AIScoring_Ohko: ; 38a60
ld a, [BattleMonLevel]
ld b, a
ld a, [EnemyMonLevel]
cp b
jp c, AIDiscourageMove
call AICheckPlayerHalfHP
ret c
inc [hl]
ret
; 38a71
AIScoring_Bind: ; 38a71
ld a, [$c730]
and a
jr nz, .asm_38a8b
ld a, [PlayerSubStatus5]
bit SUBSTATUS_TOXIC, a
jr nz, .asm_38a91
ld a, [PlayerSubStatus1]
and 1<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ENCORED | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE
jr nz, .asm_38a91
ld a, [PlayerTurnsTaken]
and a
jr z, .asm_38a91
.asm_38a8b
call Function39527
ret c
inc [hl]
ret
.asm_38a91
call AICheckEnemyQuarterHP
ret nc
call Function39527
ret c
dec [hl]
dec [hl]
ret
; 38a9c
AIScoring_RazorWind:
AIScoring_Unused2B: ; 38a9c
ld a, [EnemySubStatus1]
bit SUBSTATUS_PERISH, a
jr z, .asm_38aaa
ld a, [EnemyPerishCount]
cp 3
jr c, .asm_38ad3
.asm_38aaa
push hl
ld hl, PlayerUsedMoves
ld c, 4
.asm_38ab0
ld a, [hli]
and a
jr z, .asm_38ac1
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
cp EFFECT_PROTECT
jr z, .asm_38ad5
dec c
jr nz, .asm_38ab0
.asm_38ac1
pop hl
ld a, [EnemySubStatus3]
bit SUBSTATUS_CONFUSED, a
jr nz, .asm_38acd
call AICheckEnemyHalfHP
ret c
.asm_38acd
call Random
cp $c8
ret c
.asm_38ad3
inc [hl]
ret
.asm_38ad5
pop hl
ld a, [hl]
add 6
ld [hl], a
ret
; 38adb
AIScoring_Confuse: ; 38adb
call AICheckPlayerHalfHP
ret c
call Random
cp $19
jr c, .asm_38ae7
inc [hl]
.asm_38ae7
call AICheckPlayerQuarterHP
ret c
inc [hl]
ret
; 38aed
AIScoring_SpDefenseUp2: ; 38aed
call AICheckEnemyHalfHP
jr nc, .asm_38b10
ld a, [EnemySDefLevel]
cp $b
jr nc, .asm_38b10
cp $9
ret nc
ld a, [BattleMonType1]
cp SPECIAL
jr nc, .asm_38b09
ld a, [BattleMonType2]
cp SPECIAL
ret c
.asm_38b09
call Function39521
ret c
dec [hl]
dec [hl]
ret
.asm_38b10
inc [hl]
ret
; 38b12
AIScoring_Fly: ; 38b12
ld a, [PlayerSubStatus3]
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
ret z
call AICompareSpeed
ret nc
dec [hl]
dec [hl]
dec [hl]
ret
; 38b20
AIScoring_SuperFang: ; 38b20
call AICheckPlayerQuarterHP
ret c
inc [hl]
ret
; 38b26
AIScoring_Paralyze: ; 38b26
call AICheckPlayerQuarterHP
jr nc, .asm_38b3a
call AICompareSpeed
ret c
call AICheckEnemyQuarterHP
ret nc
call Function39521
ret c
dec [hl]
dec [hl]
ret
.asm_38b3a
call Function39527
ret c
inc [hl]
ret
; 38b40
AIScoring_SpeedDownHit: ; 38b40
ld a, [wEnemyMoveStruct + MOVE_ANIM]
cp ICY_WIND
ret nz
call AICheckEnemyQuarterHP
ret nc
ld a, [PlayerTurnsTaken]
and a
ret nz
call AICompareSpeed
ret c
call Random
cp 30
ret c
dec [hl]
dec [hl]
ret
; 38b5c
AIScoring_Substitute: ; 38b5c
call AICheckEnemyHalfHP
ret c
jp AIDiscourageMove
; 38b63
AIScoring_HyperBeam: ; 38b63
call AICheckEnemyHalfHP
jr c, .asm_38b72
call AICheckEnemyQuarterHP
ret c
call Function39527
ret c
dec [hl]
ret
.asm_38b72
call Random
cp 40
ret c
inc [hl]
call Function39527
ret c
inc [hl]
ret
; 38b7f
AIScoring_Rage: ; 38b7f
ld a, [EnemySubStatus4]
bit 6, a
jr z, .asm_38b9b
call Function39527
jr c, .asm_38b8c
dec [hl]
.asm_38b8c
ld a, [$c72c]
cp $2
ret c
dec [hl]
ld a, [$c72c]
cp $3
ret c
dec [hl]
ret
.asm_38b9b
call AICheckEnemyHalfHP
jr nc, .asm_38ba6
call Function39521
ret nc
dec [hl]
ret
.asm_38ba6
inc [hl]
ret
; 38ba8
AIScoring_Mimic: ; 38ba8
ld a, [LastEnemyCounterMove]
and a
jr z, .asm_38be9
call AICheckEnemyHalfHP
jr nc, .asm_38bef
push hl
ld a, [LastEnemyCounterMove]
call AIGetEnemyMove
ld a, $1
ld [hBattleTurn], a
callab Function347c8
ld a, [$d265]
cp $a
pop hl
jr c, .asm_38bef
jr z, .asm_38bd4
call Function39527
jr c, .asm_38bd4
dec [hl]
.asm_38bd4
ld a, [LastEnemyCounterMove]
push hl
ld hl, Table_0x39301
ld de, 1
call IsInArray
pop hl
ret nc
call Function39527
ret c
dec [hl]
ret
.asm_38be9
call AICompareSpeed
jp c, AIDiscourageMove
.asm_38bef
inc [hl]
ret
; 38bf1
AIScoring_Counter: ; 38bf1
push hl
ld hl, PlayerUsedMoves
ld c, 4
ld b, 0
.asm_38bf9
ld a, [hli]
and a
jr z, .asm_38c0e
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
jr z, .asm_38c0e
ld a, [wEnemyMoveStruct + MOVE_TYPE]
cp SPECIAL
jr nc, .asm_38c0e
inc b
.asm_38c0e
dec c
jr nz, .asm_38bf9
pop hl
ld a, b
and a
jr z, .asm_38c39
cp $3
jr nc, .asm_38c30
ld a, [LastEnemyCounterMove]
and a
jr z, .asm_38c38
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
jr z, .asm_38c38
ld a, [wEnemyMoveStruct + MOVE_TYPE]
cp SPECIAL
jr nc, .asm_38c38
.asm_38c30
call Random
cp $64
jr c, .asm_38c38
dec [hl]
.asm_38c38
ret
.asm_38c39
inc [hl]
ret
; 38c3b
AIScoring_Encore: ; 38c3b
call AICompareSpeed
jr nc, .asm_38c81
ld a, [LastPlayerMove]
and a
jp z, AIDiscourageMove
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
jr z, .asm_38c68
push hl
ld a, [wEnemyMoveStruct + MOVE_TYPE]
ld hl, EnemyMonType1
ld a, $41
call Predef
pop hl
ld a, [$d265]
cp $a
jr nc, .asm_38c68
and a
ret nz
jr .asm_38c78
.asm_38c68
push hl
ld a, [LastEnemyCounterMove]
ld hl, .table_38c85
ld de, 1
call IsInArray
pop hl
jr nc, .asm_38c81
.asm_38c78
call Random
cp $46
ret c
dec [hl]
dec [hl]
ret
.asm_38c81
inc [hl]
inc [hl]
inc [hl]
ret
.table_38c85
db SWORDS_DANCE
db WHIRLWIND
db LEER
db ROAR
db DISABLE
db MIST
db LEECH_SEED
db GROWTH
db POISONPOWDER
db STRING_SHOT
db MEDITATE
db AGILITY
db TELEPORT
db SCREECH
db HAZE
db FOCUS_ENERGY
db DREAM_EATER
db POISON_GAS
db SPLASH
db SHARPEN
db CONVERSION
db SUPER_FANG
db SUBSTITUTE
db TRIPLE_KICK
db SPIDER_WEB
db MIND_READER
db FLAME_WHEEL
db AEROBLAST
db COTTON_SPORE
db POWDER_SNOW
db $ff
; 38ca4
AIScoring_PainSplit: ; 38ca4
push hl
ld hl, EnemyMonHP
ld b, [hl]
inc hl
ld c, [hl]
sla c
rl b
ld hl, BattleMonHP + 1
ld a, [hld]
cp c
ld a, [hl]
sbc b
pop hl
ret nc
inc [hl]
ret
; 38cba
AIScoring_Snore:
AIScoring_SleepTalk: ; 38cba
ld a, [EnemyMonStatus]
and $7
cp $1
jr z, .asm_38cc7
dec [hl]
dec [hl]
dec [hl]
ret
.asm_38cc7
inc [hl]
inc [hl]
inc [hl]
ret
; 38ccb
AIScoring_DefrostOpponent: ; 38ccb
ld a, [EnemyMonStatus]
and $20
ret z
dec [hl]
dec [hl]
dec [hl]
ret
; 38cd5
AIScoring_Spite: ; 38cd5
ld a, [LastEnemyCounterMove]
and a
jr nz, .asm_38ce7
call AICompareSpeed
jp c, AIDiscourageMove
call Function39527
ret c
inc [hl]
ret
.asm_38ce7
push hl
ld b, a
ld c, 4
ld hl, BattleMonMoves
ld de, BattleMonPP
.asm_38cf1
ld a, [hli]
cp b
jr z, .asm_38cfb
inc de
dec c
jr nz, .asm_38cf1
pop hl
ret
.asm_38cfb
pop hl
ld a, [de]
cp $6
jr c, .asm_38d0d
cp $f
jr nc, .asm_38d0b
call Random
cp $64
ret nc
.asm_38d0b
inc [hl]
ret
.asm_38d0d
call Random
cp $64
ret c
dec [hl]
dec [hl]
ret
; 38d16
Function_0x38d16; 38d16
jp AIDiscourageMove
; 38d19
AIScoring_DestinyBond:
AIScoring_Reversal:
AIScoring_SkullBash: ; 38d19
call AICheckEnemyQuarterHP
ret nc
inc [hl]
ret
; 38d1f
AIScoring_HealBell: ; 38d1f
push hl
ld a, [OTPartyCount]
ld b, a
ld c, 0
ld hl, OTPartyMon1HP
ld de, $0030
.asm_38d2c
push hl
ld a, [hli]
or [hl]
jr z, .asm_38d37
dec hl
dec hl
dec hl
ld a, [hl]
or c
ld c, a
.asm_38d37
pop hl
add hl, de
dec b
jr nz, .asm_38d2c
pop hl
ld a, c
and a
jr z, .asm_38d52
ld a, [EnemyMonStatus]
and a
jr z, .asm_38d48
dec [hl]
.asm_38d48
and $27
ret z
call Function39527
ret c
dec [hl]
dec [hl]
ret
.asm_38d52
ld a, [EnemyMonStatus]
and a
ret nz
jp AIDiscourageMove
; 38d5a
AIScoring_PriorityHit: ; 38d5a
call AICompareSpeed
ret c
ld a, [PlayerSubStatus3]
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
jp nz, AIDiscourageMove
ld a, $1
ld [hBattleTurn], a
push hl
callab EnemyAttackDamage
callab BattleCommand62
callab BattleCommand07
pop hl
ld a, [CurDamage + 1]
ld c, a
ld a, [CurDamage]
ld b, a
ld a, [BattleMonHP + 1]
cp c
ld a, [BattleMonHP]
sbc b
ret nc
dec [hl]
dec [hl]
dec [hl]
ret
; 38d93
AIScoring_Thief: ; 38d93
ld a, [hl]
add $1e
ld [hl], a
ret
; 38d98
AIScoring_Conversion2: ; 38d98
ld a, [LastPlayerMove]
and a
jr nz, .asm_38dc9
push hl
dec a
ld hl, Moves + MOVE_TYPE
ld bc, MOVE_LENGTH
call AddNTimes
ld a, BANK(Moves)
call GetFarByte
ld [wPlayerMoveStruct + MOVE_TYPE], a
xor a
ld [hBattleTurn], a
callab Function347c8
ld a, [$d265]
cp $a
pop hl
jr c, .asm_38dc9
ret z
call Function39527
ret c
dec [hl]
ret
.asm_38dc9
call Random
cp $19
ret c
inc [hl]
ret
; 38dd1
AIScoring_Disable: ; 38dd1
call AICompareSpeed
jr nc, .asm_38df3
push hl
ld a, [LastEnemyCounterMove]
ld hl, Table_0x39301
ld de, 1
call IsInArray
pop hl
jr nc, .asm_38dee
call Random
cp 100
ret c
dec [hl]
ret
.asm_38dee
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
ret nz
.asm_38df3
call Random
cp 20
ret c
inc [hl]
ret
; 38dfb
AIScoring_MeanLook: ; 38dfb
call AICheckEnemyHalfHP
jr nc, .asm_38e24
push hl
call AICheckLastPlayerMon
pop hl
jp z, AIDiscourageMove
ld a, [EnemySubStatus5]
bit SUBSTATUS_TOXIC, a
jr nz, .asm_38e26
ld a, [PlayerSubStatus1]
and 1<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ENCORED | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE
jr nz, .asm_38e26
push hl
callab Function3484e
ld a, [$c716]
cp $b
pop hl
ret nc
.asm_38e24
inc [hl]
ret
.asm_38e26
call Function39521
ret c
dec [hl]
dec [hl]
dec [hl]
ret
; 38e2e
AICheckLastPlayerMon: ; 38e2e
ld a, [PartyCount]
ld b, a
ld c, 0
ld hl, PartyMon1HP
ld de, PartyMon2 - PartyMon1
.loop
ld a, [CurBattleMon]
cp c
jr z, .asm_38e44
ld a, [hli]
or [hl]
ret nz
dec hl
.asm_38e44
add hl, de
inc c
dec b
jr nz, .loop
ret
; 38e4a
AIScoring_Nightmare: ; 38e4a
call Function39527
ret c
dec [hl]
ret
; 38e50
AIScoring_FlameWheel: ; 38e50
ld a, [EnemyMonStatus]
bit FRZ, a
ret z
dec [hl]
dec [hl]
dec [hl]
dec [hl]
dec [hl]
ret
; 38e5c
AIScoring_Curse: ; 38e5c
ld a, [EnemyMonType1]
cp GHOST
jr z, .ghostcurse
ld a, [EnemyMonType2]
cp GHOST
jr z, .ghostcurse
call AICheckEnemyHalfHP
jr nc, .asm_38e93
ld a, [EnemyAtkLevel]
cp $b
jr nc, .asm_38e93
cp $9
ret nc
ld a, [BattleMonType1]
cp GHOST
jr z, .asm_38e92
cp SPECIAL
ret nc
ld a, [BattleMonType2]
cp SPECIAL
ret nc
call Function39521
ret c
dec [hl]
dec [hl]
ret
.asm_38e90
inc [hl]
inc [hl]
.asm_38e92
inc [hl]
.asm_38e93
inc [hl]
ret
.ghostcurse
ld a, [PlayerSubStatus1]
bit SUBSTATUS_CURSE, a
jp nz, AIDiscourageMove
push hl
callba Function349f4
pop hl
jr nc, .asm_38eb0
push hl
call AICheckLastPlayerMon
pop hl
jr nz, .asm_38e90
jr .asm_38eb7
.asm_38eb0
push hl
call AICheckLastPlayerMon
pop hl
jr z, .asm_38ecb
.asm_38eb7
call AICheckEnemyQuarterHP
jp nc, .asm_38e90
call AICheckEnemyHalfHP
jr nc, .asm_38e92
call AICheckEnemyMaxHP
ret nc
ld a, [PlayerTurnsTaken]
and a
ret nz
.asm_38ecb
call Function39527
ret c
dec [hl]
dec [hl]
ret
; 38ed2
AIScoring_Protect: ; 38ed2
ld a, [$c681]
and a
jr nz, .asm_38f13
ld a, [PlayerSubStatus5]
bit SUBSTATUS_LOCK_ON, a
jr nz, .asm_38f14
ld a, [PlayerFuryCutterCount]
cp 3
jr nc, .asm_38f0d
ld a, [PlayerSubStatus3]
bit SUBSTATUS_CHARGED, a
jr nz, .asm_38f0d
ld a, [PlayerSubStatus5]
bit SUBSTATUS_TOXIC, a
jr nz, .asm_38f0d
ld a, [PlayerSubStatus4]
bit SUBSTATUS_LEECH_SEED, a
jr nz, .asm_38f0d
ld a, [PlayerSubStatus1]
bit SUBSTATUS_CURSE, a
jr nz, .asm_38f0d
bit SUBSTATUS_ENCORED, a
jr z, .asm_38f14
ld a, [PlayerRolloutCount]
cp 3
jr c, .asm_38f14
.asm_38f0d
call Function39521
ret c
dec [hl]
ret
.asm_38f13
inc [hl]
.asm_38f14
call Random
cp 20
ret c
inc [hl]
inc [hl]
ret
; 38f1d
AIScoring_Foresight: ; 38f1d
ld a, [EnemyAccLevel]
cp $5
jr c, .asm_38f41
ld a, [PlayerEvaLevel]
cp $a
jr nc, .asm_38f41
ld a, [BattleMonType1]
cp GHOST
jr z, .asm_38f41
ld a, [BattleMonType2]
cp GHOST
jr z, .asm_38f41
call Random
cp 20
ret c
inc [hl]
ret
.asm_38f41
call Random
cp 100
ret c
dec [hl]
dec [hl]
ret
; 38f4a
AIScoring_PerishSong: ; 38f4a
push hl
callab Function349f4
pop hl
jr c, .asm_38f75
ld a, [PlayerSubStatus5]
bit 7, a
jr nz, .asm_38f6f
push hl
callab Function3484e
ld a, [$c716]
cp 10 ; 1.0
pop hl
ret c
call Function39527
ret c
inc [hl]
ret
.asm_38f6f
call Function39527
ret c
dec [hl]
ret
.asm_38f75
ld a, [hl]
add 5
ld [hl], a
ret
; 38f7a
AIScoring_Sandstorm: ; 38f7a
ld a, [BattleMonType1]
push hl
ld hl, .SandstormImmuneTypes
ld de, 1
call IsInArray
pop hl
jr c, .asm_38fa5
ld a, [BattleMonType2]
push hl
ld hl, .SandstormImmuneTypes
ld de, 1
call IsInArray
pop hl
jr c, .asm_38fa5
call AICheckPlayerHalfHP
jr nc, .asm_38fa6
call Function39527
ret c
dec [hl]
ret
.asm_38fa5
inc [hl]
.asm_38fa6
inc [hl]
ret
.SandstormImmuneTypes
db ROCK
db GROUND
db STEEL
db $ff
; 38fac
AIScoring_Endure: ; 38fac
ld a, [$c681]
and a
jr nz, .asm_38fd8
call AICheckEnemyMaxHP
jr c, .asm_38fd8
call AICheckEnemyQuarterHP
jr c, .asm_38fd9
ld b, EFFECT_REVERSAL
call AIHasMove
jr nc, .asm_38fcb
call Function39521
ret c
dec [hl]
dec [hl]
dec [hl]
ret
.asm_38fcb
ld a, [EnemySubStatus5]
bit SUBSTATUS_LOCK_ON, a
ret z
call Function39527
ret c
dec [hl]
dec [hl]
ret
.asm_38fd8
inc [hl]
.asm_38fd9
inc [hl]
ret
; 38fdb
AIScoring_FuryCutter: ; 38fdb
ld a, [EnemyFuryCutterCount]
and a
jr z, .end
dec [hl]
cp 2
jr c, .end
dec [hl]
dec [hl]
cp 3
jr c, .end
dec [hl]
dec [hl]
dec [hl]
.end
; fallthrough
; 38fef
AIScoring_Rollout: ; 38fef
ld a, [EnemySubStatus1]
bit SUBSTATUS_IN_LOVE, a
jr nz, .asm_39020
ld a, [EnemySubStatus3]
bit SUBSTATUS_CONFUSED, a
jr nz, .asm_39020
ld a, [EnemyMonStatus]
bit PAR, a
jr nz, .asm_39020
call AICheckEnemyQuarterHP
jr nc, .asm_39020
ld a, [EnemyAccLevel]
cp 7
jr c, .asm_39020
ld a, [PlayerEvaLevel]
cp 8
jr nc, .asm_39020
call Random
cp 200
ret nc
dec [hl]
dec [hl]
ret
.asm_39020
call Function39521
ret c
inc [hl]
ret
; 39026
AIScoring_Swagger:
AIScoring_Attract: ; 39026
ld a, [PlayerTurnsTaken]
and a
jr z, .asm_39032
call Function39521
ret c
inc [hl]
ret
.asm_39032
call Random
cp 200
ret nc
dec [hl]
ret
; 3903a
AIScoring_Safeguard: ; 3903a
call AICheckPlayerHalfHP
ret c
call Function39521
ret c
inc [hl]
ret
; 39044
AIScoring_Magnitude:
AIScoring_Earthquake: ; 39044
ld a, [LastEnemyCounterMove]
cp DIG
ret nz
ld a, [PlayerSubStatus3]
bit SUBSTATUS_UNDERGROUND, a
jr z, .asm_39058
call AICompareSpeed
ret nc
dec [hl]
dec [hl]
ret
.asm_39058
call AICompareSpeed
ret c
call Function39527
ret c
dec [hl]
ret
; 39062
AIScoring_BatonPass: ; 39062
push hl
callab Function3484e
ld a, [$c716]
cp 10 ; 1.0
pop hl
ret c
inc [hl]
ret
; 39072
AIScoring_Pursuit: ; 39072
call AICheckPlayerQuarterHP
jr nc, .asm_3907d
call Function39521
ret c
inc [hl]
ret
.asm_3907d
call Function39527
ret c
dec [hl]
dec [hl]
ret
; 39084
AIScoring_RapidSpin: ; 39084
ld a, [$c731]
and a
jr nz, .asm_39097
ld a, [EnemySubStatus4]
bit SUBSTATUS_LEECH_SEED, a
jr nz, .asm_39097
ld a, [EnemyScreens]
bit SCREENS_SPIKES, a
ret z
.asm_39097
call Function39521
ret c
dec [hl]
dec [hl]
ret
; 3909e
AIScoring_HiddenPower: ; 3909e
push hl
ld a, 1
ld [hBattleTurn], a
callab HiddenPowerDamage
callab Function347c8
pop hl
ld a, [$d265]
cp $a
jr c, .asm_390c9
ld a, d
cp $32
jr c, .asm_390c9
ld a, [$d265]
cp $b
jr nc, .asm_390c7
ld a, d
cp $46
ret c
.asm_390c7
dec [hl]
ret
.asm_390c9
inc [hl]
ret
; 390cb
AIScoring_RainDance: ; 390cb
ld a, [BattleMonType1]
cp WATER
jr z, AIBadWeatherType
cp FIRE
jr z, AIGoodWeatherType
ld a, [BattleMonType2]
cp WATER
jr z, AIBadWeatherType
cp FIRE
jr z, AIGoodWeatherType
push hl
ld hl, RainDanceMoves
jr AIScoring_WeatherMove
; 390e7
RainDanceMoves: ; 390e7
db WATER_GUN
db HYDRO_PUMP
db SURF
db BUBBLEBEAM
db THUNDER
db WATERFALL
db CLAMP
db BUBBLE
db CRABHAMMER
db OCTAZOOKA
db WHIRLPOOL
db $ff
; 390f3
AIScoring_SunnyDay: ; 390f3
ld a, [BattleMonType1]
cp FIRE
jr z, AIBadWeatherType
cp WATER
jr z, AIGoodWeatherType
ld a, [BattleMonType2]
cp FIRE
jr z, AIBadWeatherType
cp WATER
jr z, AIGoodWeatherType
push hl
ld hl, SunnyDayMoves
; fallthrough
; 3910d
AIScoring_WeatherMove: ; 3910d
call AIHasMoveInArray
pop hl
jr nc, AIBadWeatherType
call AICheckPlayerHalfHP
jr nc, AIBadWeatherType
call Function39527
ret c
dec [hl]
ret
; 3911e
AIBadWeatherType: ; 3911e
inc [hl]
inc [hl]
inc [hl]
ret
; 39122
AIGoodWeatherType: ; 39122
call AICheckPlayerHalfHP
ret nc
ld a, [PlayerTurnsTaken]
and a
jr z, .good
ld a, [EnemyTurnsTaken]
and a
ret nz
.good
dec [hl]
dec [hl]
ret
; 39134
SunnyDayMoves: ; 39134
db FIRE_PUNCH
db EMBER
db FLAMETHROWER
db FIRE_SPIN
db FIRE_BLAST
db SACRED_FIRE
db MORNING_SUN
db SYNTHESIS
db $ff
; 3913d
AIScoring_BellyDrum: ; 3913d
ld a, [EnemyAtkLevel]
cp $a
jr nc, .asm_3914d
call AICheckEnemyMaxHP
ret c
inc [hl]
call AICheckEnemyHalfHP
ret c
.asm_3914d
ld a, [hl]
add $5
ld [hl], a
ret
; 39152
AIScoring_PsychUp: ; 39152
push hl
ld hl, EnemyAtkLevel
ld b, $8
ld c, $64
.asm_3915a
ld a, [hli]
sub $7
add c
ld c, a
dec b
jr nz, .asm_3915a
ld hl, PlayerAtkLevel
ld b, $8
ld d, $64
.asm_39169
ld a, [hli]
sub $7
add d
ld d, a
dec b
jr nz, .asm_39169
ld a, c
sub d
pop hl
jr nc, .asm_39188
ld a, [PlayerAccLevel]
cp $6
ret c
ld a, [EnemyEvaLevel]
cp $8
ret nc
call Function39521
ret c
dec [hl]
ret
.asm_39188
inc [hl]
inc [hl]
ret
; 3918b
AIScoring_MirrorCoat: ; 3918b
push hl
ld hl, PlayerUsedMoves
ld c, $4
ld b, $0
.asm_39193
ld a, [hli]
and a
jr z, .asm_391a8
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
jr z, .asm_391a8
ld a, [wEnemyMoveStruct + MOVE_TYPE]
cp SPECIAL
jr c, .asm_391a8
inc b
.asm_391a8
dec c
jr nz, .asm_39193
pop hl
ld a, b
and a
jr z, .asm_391d3
cp $3
jr nc, .asm_391ca
ld a, [LastEnemyCounterMove]
and a
jr z, .asm_391d2
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
jr z, .asm_391d2
ld a, [wEnemyMoveStruct + MOVE_TYPE]
cp SPECIAL
jr c, .asm_391d2
.asm_391ca
call Random
cp 100
jr c, .asm_391d2
dec [hl]
.asm_391d2
ret
.asm_391d3
inc [hl]
ret
; 391d5
AIScoring_Twister:
AIScoring_Gust: ; 391d5
ld a, [LastEnemyCounterMove]
cp FLY
ret nz
ld a, [PlayerSubStatus3]
bit SUBSTATUS_FLYING, a
jr z, .asm_391e9
call AICompareSpeed
ret nc
dec [hl]
dec [hl]
ret
.asm_391e9
call AICompareSpeed
ret c
call Function39527
ret c
dec [hl]
ret
; 391f3
AIScoring_FutureSight: ; 391f3
call AICompareSpeed
ret nc
ld a, [PlayerSubStatus3]
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
ret z
dec [hl]
dec [hl]
ret
; 39200
AIScoring_Stomp: ; 39200
ld a, [$c6fe]
and a
ret z
call Function39521
ret c
dec [hl]
ret
; 3920b
AIScoring_Solarbeam: ; 3920b
ld a, [Weather]
cp WEATHER_SUN
jr z, .asm_3921e
cp WEATHER_RAIN
ret nz
call Random
cp 25 ; 1/10
ret c
inc [hl]
inc [hl]
ret
.asm_3921e
call Function39521
ret c
dec [hl]
dec [hl]
ret
; 39225
AIScoring_Thunder: ; 39225
ld a, [Weather]
cp WEATHER_SUN
ret nz
call Random
cp 25 ; 1/10
ret c
inc [hl]
ret
; 39233
AICompareSpeed: ; 39233
push bc
ld a, [EnemyMonSpeed + 1]
ld b, a
ld a, [BattleMonSpeed + 1]
cp b
ld a, [EnemyMonSpeed]
ld b, a
ld a, [BattleMonSpeed]
sbc b
pop bc
ret
; 39246
AICheckPlayerMaxHP: ; 39246
push hl
push de
push bc
ld de, BattleMonHP
ld hl, BattleMonMaxHP
jr AICheckMaxHP
; 39251
AICheckEnemyMaxHP: ; 39251
push hl
push de
push bc
ld de, EnemyMonHP
ld hl, EnemyMonMaxHP
; fallthrough
; 3925a
AICheckMaxHP: ; 3925a
; Return carry if hp at de matches max hp at hl.
ld a, [de]
inc de
cp [hl]
jr nz, .asm_39269
inc hl
ld a, [de]
cp [hl]
jr nz, .asm_39269
pop bc
pop de
pop hl
scf
ret
.asm_39269
pop bc
pop de
pop hl
and a
ret
; 3926e
AICheckPlayerHalfHP: ; 3926e
push hl
ld hl, BattleMonHP
ld b, [hl]
inc hl
ld c, [hl]
sla c
rl b
inc hl
inc hl
ld a, [hld]
cp c
ld a, [hl]
sbc b
pop hl
ret
; 39281
AICheckEnemyHalfHP: ; 39281
push hl
push de
push bc
ld hl, EnemyMonHP
ld b, [hl]
inc hl
ld c, [hl]
sla c
rl b
inc hl
inc hl
ld a, [hld]
cp c
ld a, [hl]
sbc b
pop bc
pop de
pop hl
ret
; 39298
AICheckEnemyQuarterHP: ; 39298
push hl
push de
push bc
ld hl, EnemyMonHP
ld b, [hl]
inc hl
ld c, [hl]
sla c
rl b
sla c
rl b
inc hl
inc hl
ld a, [hld]
cp c
ld a, [hl]
sbc b
pop bc
pop de
pop hl
ret
; 392b3
AICheckPlayerQuarterHP: ; 392b3
push hl
ld hl, BattleMonHP
ld b, [hl]
inc hl
ld c, [hl]
sla c
rl b
sla c
rl b
inc hl
inc hl
ld a, [hld]
cp c
ld a, [hl]
sbc b
pop hl
ret
; 392ca
AIHasMove: ; 392ca
; Return carry if the enemy has move b.
push hl
ld hl, EnemyMonMoves
ld c, EnemyMonMovesEnd - EnemyMonMoves
.checkmove
ld a, [hli]
and a
jr z, .asm_392e0
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
cp b
jr z, .asm_392e3
dec c
jr nz, .checkmove
.asm_392e0
pop hl
and a
ret
.asm_392e3
pop hl
scf
ret
; 392e6
AIHasMoveInArray: ; 392e6
; Return carry if the enemy has a move in array hl.
push hl
push de
push bc
.asm_392e9
ld a, [hli]
cp $ff
jr z, .asm_392fd
ld b, a
ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
ld de, EnemyMonMoves
.asm_392f4
dec c
jr z, .asm_392e9
ld a, [de]
inc de
cp b
jr nz, .asm_392f4
scf
.asm_392fd
pop bc
pop de
pop hl
ret
; 39301
Table_0x39301: ; 39301
db DOUBLE_EDGE
db SING
db FLAMETHROWER
db HYDRO_PUMP
db SURF
db ICE_BEAM
db BLIZZARD
db HYPER_BEAM
db SLEEP_POWDER
db THUNDERBOLT
db THUNDER
db EARTHQUAKE
db TOXIC
db PSYCHIC_M
db HYPNOSIS
db RECOVER
db FIRE_BLAST
db SOFTBOILED
db SUPER_FANG
db $ff
; 39315
AIScoring_Opportunist: ; 39315
; Don't use stall moves when the player's HP is low.
call AICheckEnemyHalfHP
ret c
call AICheckEnemyQuarterHP
jr nc, .asm_39322
call Function39527
ret c
.asm_39322
ld hl, Buffer1 - 1
ld de, EnemyMonMoves
ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
.checkmove
inc hl
dec c
jr z, .asm_39347
ld a, [de]
inc de
and a
jr z, .asm_39347
push hl
push de
push bc
ld hl, .stallmoves
ld de, 1
call IsInArray
pop bc
pop de
pop hl
jr nc, .checkmove
inc [hl]
jr .checkmove
.asm_39347
ret
.stallmoves
db SWORDS_DANCE
db TAIL_WHIP
db LEER
db GROWL
db DISABLE
db MIST
db COUNTER
db LEECH_SEED
db GROWTH
db STRING_SHOT
db MEDITATE
db AGILITY
db RAGE
db MIMIC
db SCREECH
db HARDEN
db WITHDRAW
db DEFENSE_CURL
db BARRIER
db LIGHT_SCREEN
db HAZE
db REFLECT
db FOCUS_ENERGY
db BIDE
db AMNESIA
db TRANSFORM
db SPLASH
db ACID_ARMOR
db SHARPEN
db CONVERSION
db SUBSTITUTE
db FLAME_WHEEL
db $ff
; 39369
AIScoring_Aggressive: ; 39369
; Use whatever does the most damage.
; Figure out which attack does the most damage and put it in c.
ld hl, EnemyMonMoves
ld bc, 0
ld de, 0
.checkmove
inc b
ld a, b
cp EnemyMonMovesEnd - EnemyMonMoves + 1
jr z, .gotstrongestmove
ld a, [hli]
and a
jr z, .gotstrongestmove
push hl
push de
push bc
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
jr z, .nodamage
call AIDamageCalc
pop bc
pop de
pop hl
ld a, [CurDamage + 1]
cp e
ld a, [CurDamage]
sbc d
jr c, .checkmove
ld a, [CurDamage + 1]
ld e, a
ld a, [CurDamage]
ld d, a
ld c, b
jr .checkmove
.nodamage
pop bc
pop de
pop hl
jr .checkmove
.gotstrongestmove
; Nothing we can do if no attacks did damage.
ld a, c
and a
jr z, .done
; Discourage moves that do less damage unless they're reckless too.
ld hl, Buffer1 - 1
ld de, EnemyMonMoves
ld b, 0
.checkmove2
inc b
ld a, b
cp EnemyMonMovesEnd - EnemyMonMoves + 1
jr z, .done
cp c
ld a, [de]
inc de
inc hl
jr z, .checkmove2
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_POWER]
cp 2
jr c, .checkmove2
push hl
push de
push bc
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
ld hl, .aggressivemoves
ld de, 1
call IsInArray
pop bc
pop de
pop hl
jr c, .checkmove2
inc [hl]
jr .checkmove2
.done
ret
.aggressivemoves
db EFFECT_EXPLOSION
db EFFECT_RAMPAGE
db EFFECT_MULTI_HIT
db EFFECT_DOUBLE_HIT
db $ff
; 393e7
AIDamageCalc: ; 393e7
ld a, 1
ld [hBattleTurn], a
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
ld de, 1
ld hl, .ConstantDamageEffects
call IsInArray
jr nc, .asm_39400
callab BattleCommand3f
ret
.asm_39400
callab EnemyAttackDamage
callab BattleCommand62
callab BattleCommand07
ret
.ConstantDamageEffects
db EFFECT_SUPER_FANG
db EFFECT_STATIC_DAMAGE
db EFFECT_LEVEL_DAMAGE
db EFFECT_PSYWAVE
db $ff
; 39418
AIScoring_Cautious: ; 39418
; Don't use moves with residual effects after turn 1.
ld a, [EnemyTurnsTaken]
and a
ret z
ld hl, Buffer1 - 1
ld de, EnemyMonMoves
ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
.asm_39425
inc hl
dec c
ret z
ld a, [de]
inc de
and a
ret z
push hl
push de
push bc
ld hl, .residualmoves
ld de, 1
call IsInArray
pop bc
pop de
pop hl
jr nc, .asm_39425
call Random
cp 230
ret nc
inc [hl]
jr .asm_39425
.residualmoves
db MIST
db LEECH_SEED
db POISONPOWDER
db STUN_SPORE
db THUNDER_WAVE
db FOCUS_ENERGY
db BIDE
db POISON_GAS
db TRANSFORM
db CONVERSION
db SUBSTITUTE
db SPIKES
db $ff
; 39453
AIScoring_StatusImmunity: ; 39453
; Don't use status moves that don't affect the player.
ld hl, Buffer1 - 1
ld de, EnemyMonMoves
ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
.checkmove
dec b
ret z
inc hl
ld a, [de]
and a
ret z
inc de
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
cp EFFECT_TOXIC
jr z, .poisonimmunity
cp EFFECT_POISON
jr z, .poisonimmunity
cp EFFECT_SLEEP
jr z, .typeimmunity
cp EFFECT_PARALYZE
jr z, .typeimmunity
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
jr z, .checkmove
jr .typeimmunity
.poisonimmunity
ld a, [BattleMonType1]
cp POISON
jr z, .immune
ld a, [BattleMonType2]
cp POISON
jr z, .immune
.typeimmunity
push hl
push bc
push de
ld a, 1
ld [hBattleTurn], a
callab Function347c8
pop de
pop bc
pop hl
ld a, [$d265]
and a
jr nz, .checkmove
.immune
call AIDiscourageMove
jr .checkmove
; 394a9
AIScoring_Risky: ; 394a9
; Use any move that will KO the opponent.
ld hl, Buffer1 - 1
ld de, EnemyMonMoves
ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
.checkmove
inc hl
dec c
ret z
ld a, [de]
inc de
and a
ret z
push de
push bc
push hl
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_POWER]
and a
jr z, .nextmove
; Don't use risky moves at max hp.
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
ld de, 1
ld hl, .riskymoves
call IsInArray
jr nc, .checkko
call AICheckEnemyMaxHP
jr c, .nextmove
call Random
cp 200 ; 1/5
jr c, .nextmove
.checkko
call AIDamageCalc
ld a, [CurDamage + 1]
ld e, a
ld a, [CurDamage]
ld d, a
ld a, [BattleMonHP + 1]
cp e
ld a, [BattleMonHP]
sbc d
jr nc, .nextmove
pop hl
dec [hl]
dec [hl]
dec [hl]
dec [hl]
dec [hl]
push hl
.nextmove
pop hl
pop bc
pop de
jr .checkmove
.riskymoves
db EFFECT_EXPLOSION
db EFFECT_OHKO
db $ff
; 39502
AIScoring_None: ; 39502
ret
; 39503
AIDiscourageMove: ; 39503
ld a, [hl]
add 10
ld [hl], a
ret
; 39508
AIGetEnemyMove: ; 39508
push hl
push de
push bc
dec a
ld hl, Moves
ld bc, MOVE_LENGTH
call AddNTimes
ld de, wEnemyMoveStruct
ld a, BANK(Moves)
call FarCopyBytes
pop bc
pop de
pop hl
ret
; 39521
Function39521: ; 39521
call Random
cp 50 ; 1/5
ret
; 39527
Function39527: ; 39527
call Random
cp $80 ; 1/2
ret
; 3952d