pokecrystal-board/engine/battle/ai/scoring.asm

3268 lines
52 KiB
NASM
Raw Normal View History

AIScoring: ; used only for BANK(AIScoring)
2020-05-07 08:09:41 -07:00
2018-06-24 07:09:41 -07:00
AI_Basic:
; Don't do anything redundant:
; -Using status-only moves if the player can't be statused
; -Using moves that fail if they've already been used
2013-05-06 11:33:19 -07:00
2020-11-03 16:53:07 -08:00
ld hl, wEnemyAIMoveScores - 1
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld b, NUM_MOVES + 1
2013-05-06 11:33:19 -07:00
.checkmove
2013-05-05 16:56:17 -07:00
dec b
ret z
inc hl
ld a, [de]
and a
ret z
inc de
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
2013-05-05 16:56:17 -07:00
ld c, a
; Dismiss moves with special effects if they are
; useless or not a good choice right now.
; For example, healing moves, weather moves, Dream Eater...
2013-05-05 16:56:17 -07:00
push hl
push de
push bc
2017-12-24 09:47:30 -08:00
farcall AI_Redundant
2013-05-05 16:56:17 -07:00
pop bc
pop de
pop hl
2013-05-06 11:33:19 -07:00
jr nz, .discourage
2013-05-05 16:56:17 -07:00
; Dismiss status-only moves if the player can't be statused.
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
2013-05-05 16:56:17 -07:00
push hl
push de
push bc
ld hl, StatusOnlyEffects
2013-05-05 16:56:17 -07:00
ld de, 1
call IsInArray
pop bc
pop de
pop hl
2013-05-06 11:33:19 -07:00
jr nc, .checkmove
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonStatus]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 11:33:19 -07:00
jr nz, .discourage
2013-05-05 16:56:17 -07:00
2014-10-21 11:44:42 -07:00
; Dismiss Safeguard if it's already active.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerScreens]
2013-05-06 11:33:19 -07:00
bit SCREENS_SAFEGUARD, a
jr z, .checkmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.discourage
call AIDiscourageMove
jr .checkmove
2013-05-05 16:56:17 -07:00
INCLUDE "data/battle/ai/status_only_effects.asm"
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Setup:
2013-05-06 11:33:19 -07:00
; Use stat-modifying moves on turn 1.
2014-10-22 08:36:42 -07:00
; 50% chance to greatly encourage stat-up moves during the first turn of enemy's Pokemon.
; 50% chance to greatly encourage stat-down moves during the first turn of player's Pokemon.
2014-10-21 11:44:42 -07:00
; Almost 90% chance to greatly discourage stat-modifying moves otherwise.
2013-05-06 11:33:19 -07:00
2020-11-03 16:53:07 -08:00
ld hl, wEnemyAIMoveScores - 1
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld b, NUM_MOVES + 1
2013-05-06 11:33:19 -07:00
.checkmove
2013-05-05 16:56:17 -07:00
dec b
ret z
inc hl
ld a, [de]
and a
ret z
inc de
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
2013-05-05 16:56:17 -07:00
cp EFFECT_ATTACK_UP
2013-05-06 11:33:19 -07:00
jr c, .checkmove
2013-05-05 16:56:17 -07:00
cp EFFECT_EVASION_UP + 1
jr c, .statup
; cp EFFECT_ATTACK_DOWN - 1
2013-05-06 11:33:19 -07:00
jr z, .checkmove
2013-05-05 16:56:17 -07:00
cp EFFECT_EVASION_DOWN + 1
jr c, .statdown
cp EFFECT_ATTACK_UP_2
2013-05-06 11:33:19 -07:00
jr c, .checkmove
2013-05-05 16:56:17 -07:00
cp EFFECT_EVASION_UP_2 + 1
jr c, .statup
; cp EFFECT_ATTACK_DOWN_2 - 1
2013-05-06 11:33:19 -07:00
jr z, .checkmove
2013-05-05 16:56:17 -07:00
cp EFFECT_EVASION_DOWN_2 + 1
jr c, .statdown
2013-05-06 11:33:19 -07:00
jr .checkmove
2013-05-05 16:56:17 -07:00
.statup
2018-01-23 14:39:09 -08:00
ld a, [wEnemyTurnsTaken]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 11:33:19 -07:00
jr nz, .discourage
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
jr .encourage
2013-05-05 16:56:17 -07:00
.statdown
2018-01-23 14:39:09 -08:00
ld a, [wPlayerTurnsTaken]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 11:33:19 -07:00
jr nz, .discourage
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.encourage
call AI_50_50
2013-05-06 11:33:19 -07:00
jr c, .checkmove
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-06 11:33:19 -07:00
jr .checkmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.discourage
call Random
cp 12 percent
2013-05-06 11:33:19 -07:00
jr c, .checkmove
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
2013-05-06 11:33:19 -07:00
jr .checkmove
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Types:
2014-10-21 11:44:42 -07:00
; Dismiss any move that the player is immune to.
; Encourage super-effective moves.
; Discourage not very effective moves unless
2014-10-21 11:44:42 -07:00
; all damaging moves are of the same type.
2013-05-06 11:33:19 -07:00
2020-11-03 16:53:07 -08:00
ld hl, wEnemyAIMoveScores - 1
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld b, NUM_MOVES + 1
2013-05-06 11:33:19 -07:00
.checkmove
2013-05-05 16:56:17 -07:00
dec b
ret z
inc hl
ld a, [de]
and a
ret z
inc de
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
push hl
push bc
push de
ld a, 1
ldh [hBattleTurn], a
2017-12-24 09:47:30 -08:00
callfar BattleCheckTypeMatchup
2013-05-05 16:56:17 -07:00
pop de
pop bc
pop hl
2013-05-06 11:33:19 -07:00
ld a, [wTypeMatchup]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 11:33:19 -07:00
jr z, .immune
cp EFFECTIVE
2013-05-06 11:33:19 -07:00
jr z, .checkmove
jr c, .noteffective
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
; effective
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 11:33:19 -07:00
jr z, .checkmove
2013-05-05 16:56:17 -07:00
dec [hl]
2013-05-06 11:33:19 -07:00
jr .checkmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.noteffective
; Discourage this move if there are any moves
; that do damage of a different type.
2013-05-05 16:56:17 -07:00
push hl
push de
push bc
ld a, [wEnemyMoveStruct + MOVE_TYPE]
2013-05-05 16:56:17 -07:00
ld d, a
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld b, NUM_MOVES + 1
2013-05-05 16:56:17 -07:00
ld c, 0
2013-05-06 11:33:19 -07:00
.checkmove2
2013-05-05 16:56:17 -07:00
dec b
2020-06-29 09:25:58 -07:00
jr z, .movesdone
2013-05-05 16:56:17 -07:00
ld a, [hli]
and a
2020-06-29 09:25:58 -07:00
jr z, .movesdone
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_TYPE]
2013-05-05 16:56:17 -07:00
cp d
2013-05-06 11:33:19 -07:00
jr z, .checkmove2
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr nz, .damaging
2013-05-06 11:33:19 -07:00
jr .checkmove2
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.damaging
2013-05-05 16:56:17 -07:00
ld c, a
2020-06-29 09:25:58 -07:00
.movesdone
2013-05-05 16:56:17 -07:00
ld a, c
pop bc
pop de
pop hl
and a
2013-05-06 11:33:19 -07:00
jr z, .checkmove
2013-05-05 16:56:17 -07:00
inc [hl]
2013-05-06 11:33:19 -07:00
jr .checkmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.immune
call AIDiscourageMove
jr .checkmove
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Offensive:
2014-10-21 11:44:42 -07:00
; Greatly discourage non-damaging moves.
2013-05-06 11:33:19 -07:00
2020-11-03 16:53:07 -08:00
ld hl, wEnemyAIMoveScores - 1
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld b, NUM_MOVES + 1
2013-05-06 11:33:19 -07:00
.checkmove
2013-05-05 16:56:17 -07:00
dec b
ret z
inc hl
ld a, [de]
and a
ret z
inc de
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 11:33:19 -07:00
jr nz, .checkmove
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
2013-05-06 11:33:19 -07:00
jr .checkmove
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Smart:
2013-05-06 11:33:19 -07:00
; Context-specific scoring.
2020-11-03 16:53:07 -08:00
ld hl, wEnemyAIMoveScores
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld b, NUM_MOVES + 1
2013-05-06 11:33:19 -07:00
.checkmove
2013-05-05 16:56:17 -07:00
dec b
ret z
ld a, [de]
inc de
and a
ret z
push de
push bc
push hl
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
2020-06-29 09:25:58 -07:00
ld hl, AI_Smart_EffectHandlers
2013-05-05 16:56:17 -07:00
ld de, 3
call IsInArray
inc hl
2013-05-06 11:33:19 -07:00
jr nc, .nextmove
2013-05-05 16:56:17 -07:00
ld a, [hli]
ld e, a
ld d, [hl]
2013-05-06 11:33:19 -07:00
2013-05-05 16:56:17 -07:00
pop hl
push hl
2013-05-06 11:33:19 -07:00
ld bc, .nextmove
2013-05-05 16:56:17 -07:00
push bc
2013-05-06 11:33:19 -07:00
2013-05-05 16:56:17 -07:00
push de
ret
2013-05-06 11:33:19 -07:00
.nextmove
2013-05-05 16:56:17 -07:00
pop hl
pop bc
pop de
inc hl
2013-05-06 11:33:19 -07:00
jr .checkmove
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
AI_Smart_EffectHandlers:
dbw EFFECT_SLEEP, AI_Smart_Sleep
dbw EFFECT_LEECH_HIT, AI_Smart_LeechHit
dbw EFFECT_SELFDESTRUCT, AI_Smart_Selfdestruct
dbw EFFECT_DREAM_EATER, AI_Smart_DreamEater
dbw EFFECT_MIRROR_MOVE, AI_Smart_MirrorMove
dbw EFFECT_EVASION_UP, AI_Smart_EvasionUp
dbw EFFECT_ALWAYS_HIT, AI_Smart_AlwaysHit
dbw EFFECT_ACCURACY_DOWN, AI_Smart_AccuracyDown
dbw EFFECT_RESET_STATS, AI_Smart_ResetStats
dbw EFFECT_BIDE, AI_Smart_Bide
dbw EFFECT_FORCE_SWITCH, AI_Smart_ForceSwitch
dbw EFFECT_HEAL, AI_Smart_Heal
dbw EFFECT_TOXIC, AI_Smart_Toxic
dbw EFFECT_LIGHT_SCREEN, AI_Smart_LightScreen
dbw EFFECT_OHKO, AI_Smart_Ohko
dbw EFFECT_RAZOR_WIND, AI_Smart_RazorWind
dbw EFFECT_SUPER_FANG, AI_Smart_SuperFang
dbw EFFECT_TRAP_TARGET, AI_Smart_TrapTarget
dbw EFFECT_UNUSED_2B, AI_Smart_Unused2B
dbw EFFECT_CONFUSE, AI_Smart_Confuse
dbw EFFECT_SP_DEF_UP_2, AI_Smart_SpDefenseUp2
dbw EFFECT_REFLECT, AI_Smart_Reflect
dbw EFFECT_PARALYZE, AI_Smart_Paralyze
dbw EFFECT_SPEED_DOWN_HIT, AI_Smart_SpeedDownHit
dbw EFFECT_SUBSTITUTE, AI_Smart_Substitute
dbw EFFECT_HYPER_BEAM, AI_Smart_HyperBeam
dbw EFFECT_RAGE, AI_Smart_Rage
dbw EFFECT_MIMIC, AI_Smart_Mimic
dbw EFFECT_LEECH_SEED, AI_Smart_LeechSeed
dbw EFFECT_DISABLE, AI_Smart_Disable
dbw EFFECT_COUNTER, AI_Smart_Counter
dbw EFFECT_ENCORE, AI_Smart_Encore
dbw EFFECT_PAIN_SPLIT, AI_Smart_PainSplit
dbw EFFECT_SNORE, AI_Smart_Snore
dbw EFFECT_CONVERSION2, AI_Smart_Conversion2
dbw EFFECT_LOCK_ON, AI_Smart_LockOn
dbw EFFECT_DEFROST_OPPONENT, AI_Smart_DefrostOpponent
dbw EFFECT_SLEEP_TALK, AI_Smart_SleepTalk
dbw EFFECT_DESTINY_BOND, AI_Smart_DestinyBond
dbw EFFECT_REVERSAL, AI_Smart_Reversal
dbw EFFECT_SPITE, AI_Smart_Spite
dbw EFFECT_HEAL_BELL, AI_Smart_HealBell
dbw EFFECT_PRIORITY_HIT, AI_Smart_PriorityHit
dbw EFFECT_THIEF, AI_Smart_Thief
dbw EFFECT_MEAN_LOOK, AI_Smart_MeanLook
dbw EFFECT_NIGHTMARE, AI_Smart_Nightmare
dbw EFFECT_FLAME_WHEEL, AI_Smart_FlameWheel
dbw EFFECT_CURSE, AI_Smart_Curse
dbw EFFECT_PROTECT, AI_Smart_Protect
dbw EFFECT_FORESIGHT, AI_Smart_Foresight
dbw EFFECT_PERISH_SONG, AI_Smart_PerishSong
dbw EFFECT_SANDSTORM, AI_Smart_Sandstorm
dbw EFFECT_ENDURE, AI_Smart_Endure
dbw EFFECT_ROLLOUT, AI_Smart_Rollout
dbw EFFECT_SWAGGER, AI_Smart_Swagger
dbw EFFECT_FURY_CUTTER, AI_Smart_FuryCutter
dbw EFFECT_ATTRACT, AI_Smart_Attract
dbw EFFECT_SAFEGUARD, AI_Smart_Safeguard
dbw EFFECT_MAGNITUDE, AI_Smart_Magnitude
dbw EFFECT_BATON_PASS, AI_Smart_BatonPass
dbw EFFECT_PURSUIT, AI_Smart_Pursuit
dbw EFFECT_RAPID_SPIN, AI_Smart_RapidSpin
dbw EFFECT_MORNING_SUN, AI_Smart_MorningSun
dbw EFFECT_SYNTHESIS, AI_Smart_Synthesis
dbw EFFECT_MOONLIGHT, AI_Smart_Moonlight
dbw EFFECT_HIDDEN_POWER, AI_Smart_HiddenPower
dbw EFFECT_RAIN_DANCE, AI_Smart_RainDance
dbw EFFECT_SUNNY_DAY, AI_Smart_SunnyDay
dbw EFFECT_BELLY_DRUM, AI_Smart_BellyDrum
dbw EFFECT_PSYCH_UP, AI_Smart_PsychUp
dbw EFFECT_MIRROR_COAT, AI_Smart_MirrorCoat
dbw EFFECT_SKULL_BASH, AI_Smart_SkullBash
dbw EFFECT_TWISTER, AI_Smart_Twister
dbw EFFECT_EARTHQUAKE, AI_Smart_Earthquake
dbw EFFECT_FUTURE_SIGHT, AI_Smart_FutureSight
dbw EFFECT_GUST, AI_Smart_Gust
dbw EFFECT_STOMP, AI_Smart_Stomp
dbw EFFECT_SOLARBEAM, AI_Smart_Solarbeam
dbw EFFECT_THUNDER, AI_Smart_Thunder
dbw EFFECT_FLY, AI_Smart_Fly
2018-01-10 19:53:42 -08:00
db -1 ; end
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Smart_Sleep:
2014-10-21 11:44:42 -07:00
; Greatly encourage sleep inducing moves if the enemy has either Dream Eater or Nightmare.
; 50% chance to greatly encourage sleep inducing moves otherwise.
2014-10-21 04:54:04 -07:00
2013-05-06 21:58:35 -07:00
ld b, EFFECT_DREAM_EATER
call AIHasMoveEffect
2020-06-29 09:25:58 -07:00
jr c, .encourage
2013-05-05 16:56:17 -07:00
2013-05-06 21:58:35 -07:00
ld b, EFFECT_NIGHTMARE
call AIHasMoveEffect
2013-05-05 16:56:17 -07:00
ret nc
2020-06-29 09:25:58 -07:00
.encourage
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_LeechHit:
2013-05-05 16:56:17 -07:00
push hl
2013-05-06 21:58:35 -07:00
ld a, 1
ldh [hBattleTurn], a
2017-12-24 09:47:30 -08:00
callfar BattleCheckTypeMatchup
2013-05-05 16:56:17 -07:00
pop hl
2013-05-06 21:58:35 -07:00
2014-10-21 11:44:42 -07:00
; 60% chance to discourage this move if not very effective.
ld a, [wTypeMatchup]
cp EFFECTIVE
2020-06-29 09:25:58 -07:00
jr c, .discourage
2013-05-05 16:56:17 -07:00
2014-10-21 11:44:42 -07:00
; Do nothing if effectiveness is neutral.
2013-05-05 16:56:17 -07:00
ret z
2014-10-21 11:44:42 -07:00
; Do nothing if enemy's HP is full.
call AICheckEnemyMaxHP
2013-05-05 16:56:17 -07:00
ret c
2014-10-21 15:28:51 -07:00
; 80% chance to encourage this move otherwise.
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
ret
2020-06-29 09:25:58 -07:00
.discourage
call Random
cp 39 percent + 1
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_LockOn:
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus5]
bit SUBSTATUS_LOCK_ON, a
2020-10-21 18:34:18 -07:00
jr nz, .player_locked_on
2013-05-05 16:56:17 -07:00
push hl
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2020-10-21 18:34:18 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2020-10-21 18:34:18 -07:00
jr c, .skip_speed_check
2013-05-05 16:56:17 -07:00
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2020-10-21 18:34:18 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.skip_speed_check
2018-01-23 14:39:09 -08:00
ld a, [wPlayerEvaLevel]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL + 3
2020-10-21 18:34:18 -07:00
jr nc, .maybe_encourage
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL + 1
2020-10-21 18:34:18 -07:00
jr nc, .do_nothing
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wEnemyAccLevel]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL - 2
2020-10-21 18:34:18 -07:00
jr c, .maybe_encourage
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL
2020-10-21 18:34:18 -07:00
jr c, .do_nothing
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld c, NUM_MOVES + 1
2020-10-21 18:34:18 -07:00
.checkmove
2013-05-05 16:56:17 -07:00
dec c
2020-10-21 18:34:18 -07:00
jr z, .discourage
2013-05-05 16:56:17 -07:00
ld a, [hli]
and a
2020-10-21 18:34:18 -07:00
jr z, .discourage
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_ACC]
2020-10-06 10:50:02 -07:00
cp 71 percent - 1
2020-10-21 18:34:18 -07:00
jr nc, .checkmove
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
ld a, 1
ldh [hBattleTurn], a
2013-05-05 16:56:17 -07:00
push hl
push bc
2017-12-24 09:47:30 -08:00
farcall BattleCheckTypeMatchup
ld a, [wTypeMatchup]
cp EFFECTIVE
2013-05-05 16:56:17 -07:00
pop bc
pop hl
2020-10-21 18:34:18 -07:00
jr c, .checkmove
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.do_nothing
2013-05-05 16:56:17 -07:00
pop hl
ret
2020-10-21 18:34:18 -07:00
.discourage
2013-05-05 16:56:17 -07:00
pop hl
inc [hl]
ret
2020-10-21 18:34:18 -07:00
.maybe_encourage
2013-05-05 16:56:17 -07:00
pop hl
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-10-21 18:34:18 -07:00
.player_locked_on
2013-05-05 16:56:17 -07:00
push hl
2020-11-03 16:53:07 -08:00
ld hl, wEnemyAIMoveScores - 1
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld c, NUM_MOVES + 1
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.checkmove2
2013-05-05 16:56:17 -07:00
inc hl
dec c
2020-10-21 18:34:18 -07:00
jr z, .dismiss
2013-05-05 16:56:17 -07:00
ld a, [de]
and a
2020-10-21 18:34:18 -07:00
jr z, .dismiss
2013-05-05 16:56:17 -07:00
inc de
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_ACC]
2020-10-06 10:50:02 -07:00
cp 71 percent - 1
2020-10-21 18:34:18 -07:00
jr nc, .checkmove2
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2020-10-21 18:34:18 -07:00
jr .checkmove2
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.dismiss
2013-05-05 16:56:17 -07:00
pop hl
2013-05-06 11:33:19 -07:00
jp AIDiscourageMove
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Smart_Selfdestruct:
2014-10-22 08:36:42 -07:00
; Selfdestruct, Explosion
2014-10-21 04:54:04 -07:00
; Unless this is the enemy's last Pokemon...
2013-05-05 16:56:17 -07:00
push hl
2017-12-24 09:47:30 -08:00
farcall FindAliveEnemyMons
2013-05-05 16:56:17 -07:00
pop hl
2020-06-29 09:25:58 -07:00
jr nc, .notlastmon
2013-05-05 16:56:17 -07:00
2014-10-21 11:44:42 -07:00
; ...greatly discourage this move unless this is the player's last Pokemon too.
2013-05-05 16:56:17 -07:00
push hl
2013-05-06 21:58:35 -07:00
call AICheckLastPlayerMon
2013-05-05 16:56:17 -07:00
pop hl
2020-06-29 09:25:58 -07:00
jr nz, .discourage
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.notlastmon
2014-10-21 11:44:42 -07:00
; Greatly discourage this move if enemy's HP is above 50%.
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2020-06-29 09:25:58 -07:00
jr c, .discourage
2013-05-05 16:56:17 -07:00
2014-10-21 11:44:42 -07:00
; Do nothing if enemy's HP is below 25%.
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2013-05-05 16:56:17 -07:00
ret nc
2014-10-21 05:17:55 -07:00
; If enemy's HP is between 25% and 50%,
2014-10-21 11:44:42 -07:00
; over 90% chance to greatly discourage this move.
call Random
2020-05-07 08:09:41 -07:00
cp 8 percent
2013-05-05 16:56:17 -07:00
ret c
2020-06-29 09:25:58 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
inc [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_DreamEater:
2014-10-21 11:44:42 -07:00
; 90% chance to greatly encourage this move.
; The AI_Basic layer will make sure that
2014-10-21 11:44:42 -07:00
; Dream Eater is only used against sleeping targets.
call Random
cp 10 percent
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_EvasionUp:
2014-10-22 05:47:33 -07:00
; Dismiss this move if enemy's evasion can't raise anymore.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyEvaLevel]
2020-05-07 08:09:41 -07:00
cp MAX_STAT_LEVEL
2013-05-06 11:33:19 -07:00
jp nc, AIDiscourageMove
2013-05-05 16:56:17 -07:00
2014-10-22 05:47:33 -07:00
; If enemy's HP is full...
2013-05-06 11:33:19 -07:00
call AICheckEnemyMaxHP
2020-10-21 18:34:18 -07:00
jr nc, .hp_mismatch_1
2013-05-05 16:56:17 -07:00
2014-10-22 05:47:33 -07:00
; ...greatly encourage this move if player is badly poisoned.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus5]
bit SUBSTATUS_TOXIC, a
2020-10-21 18:34:18 -07:00
jr nz, .greatly_encourage
2013-05-05 16:56:17 -07:00
2014-10-22 05:47:33 -07:00
; ...70% chance to greatly encourage this move if player is not badly poisoned.
call Random
cp 70 percent
2020-10-21 18:34:18 -07:00
jr nc, .not_encouraged
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.greatly_encourage
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-10-21 18:34:18 -07:00
.hp_mismatch_1
2014-10-22 05:47:33 -07:00
; Greatly discourage this move if enemy's HP is below 25%.
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2020-10-21 18:34:18 -07:00
jr nc, .hp_mismatch_2
2013-05-05 16:56:17 -07:00
2014-10-22 05:47:33 -07:00
; If enemy's HP is above 25% but not full, 4% chance to greatly encourage this move.
call Random
cp 4 percent
2020-10-21 18:34:18 -07:00
jr c, .greatly_encourage
2013-05-05 16:56:17 -07:00
2014-10-22 05:47:33 -07:00
; If enemy's HP is between 25% and 50%,...
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2020-10-21 18:34:18 -07:00
jr nc, .hp_mismatch_3
2013-05-05 16:56:17 -07:00
2014-10-22 05:47:33 -07:00
; If enemy's HP is above 50% but not full, 20% chance to greatly encourage this move.
call AI_80_20
2020-10-21 18:34:18 -07:00
jr c, .greatly_encourage
jr .not_encouraged
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.hp_mismatch_3
2014-10-22 05:47:33 -07:00
; ...50% chance to greatly discourage this move.
call AI_50_50
2020-10-21 18:34:18 -07:00
jr c, .not_encouraged
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.hp_mismatch_2
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
2013-05-05 16:56:17 -07:00
; 30% chance to end up here if enemy's HP is full and player is not badly poisoned.
2014-10-22 05:47:33 -07:00
; 77% chance to end up here if enemy's HP is above 50% but not full.
; 96% chance to end up here if enemy's HP is between 25% and 50%.
; 100% chance to end up here if enemy's HP is below 25%.
; In other words, we only end up here if the move has not been encouraged or dismissed.
2020-10-21 18:34:18 -07:00
.not_encouraged
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus5]
bit SUBSTATUS_TOXIC, a
2020-10-21 18:34:18 -07:00
jr nz, .maybe_greatly_encourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus4]
bit SUBSTATUS_LEECH_SEED, a
2020-10-21 18:34:18 -07:00
jr nz, .maybe_encourage
2013-05-05 16:56:17 -07:00
2014-10-22 05:47:33 -07:00
; Discourage this move if enemy's evasion level is higher than player's accuracy level.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyEvaLevel]
2013-05-05 16:56:17 -07:00
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wPlayerAccLevel]
2013-05-05 16:56:17 -07:00
cp b
2020-10-21 18:34:18 -07:00
jr c, .discourage
2013-05-05 16:56:17 -07:00
2014-10-22 05:47:33 -07:00
; Greatly encourage this move if the player is in the middle of Fury Cutter or Rollout.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerFuryCutterCount]
2013-05-05 16:56:17 -07:00
and a
2020-10-21 18:34:18 -07:00
jr nz, .greatly_encourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus1]
bit SUBSTATUS_ROLLOUT, a
2020-10-21 18:34:18 -07:00
jr nz, .greatly_encourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2014-10-22 05:47:33 -07:00
; Player is badly poisoned.
; 70% chance to greatly encourage this move.
2014-10-22 05:47:33 -07:00
; This would counter any previous discouragement.
2020-10-21 18:34:18 -07:00
.maybe_greatly_encourage
call Random
cp 31 percent + 1
2013-05-05 16:56:17 -07:00
ret c
2020-10-21 18:34:18 -07:00
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2014-10-22 05:47:33 -07:00
; Player is seeded.
; 50% chance to encourage this move.
; This would partly counter any previous discouragement.
2020-10-21 18:34:18 -07:00
.maybe_encourage
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_AlwaysHit:
2014-10-21 05:17:55 -07:00
; 80% chance to greatly encourage this move if either...
2014-10-21 15:28:51 -07:00
; ...enemy's accuracy level has been lowered three or more stages
2018-01-23 14:39:09 -08:00
ld a, [wEnemyAccLevel]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL - 2
2020-06-29 09:25:58 -07:00
jr c, .encourage
2013-05-05 16:56:17 -07:00
2014-10-21 15:28:51 -07:00
; ...or player's evasion level has been raised three or more stages.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerEvaLevel]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL + 3
2013-05-05 16:56:17 -07:00
ret c
2020-06-29 09:25:58 -07:00
.encourage
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_MirrorMove:
2014-10-21 15:28:51 -07:00
; If the player did not use any move last turn...
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerCounterMove]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr nz, .usedmove
2013-05-05 16:56:17 -07:00
2014-10-21 15:28:51 -07:00
; ...do nothing if enemy is slower than player
call AICompareSpeed
2013-05-05 16:56:17 -07:00
ret nc
2014-10-21 15:28:51 -07:00
; ...or dismiss this move if enemy is faster than player.
jp AIDiscourageMove
2013-05-05 16:56:17 -07:00
2014-10-21 15:28:51 -07:00
; If the player did use a move last turn...
2020-06-29 09:25:58 -07:00
.usedmove
2013-05-05 16:56:17 -07:00
push hl
2014-10-21 15:28:51 -07:00
ld hl, UsefulMoves
2013-05-05 23:39:01 -07:00
ld de, 1
2013-05-05 16:56:17 -07:00
call IsInArray
pop hl
2014-10-21 15:28:51 -07:00
; ...do nothing if he didn't use a useful move.
2013-05-05 16:56:17 -07:00
ret nc
2014-10-21 15:28:51 -07:00
; If he did, 50% chance to encourage this move...
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
2014-10-21 15:28:51 -07:00
; ...and 90% chance to encourage this move again if the enemy is faster.
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-05 16:56:17 -07:00
ret nc
call Random
cp 10 percent
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_AccuracyDown:
2014-10-22 05:47:33 -07:00
; If player's HP is full...
2013-05-06 11:33:19 -07:00
call AICheckPlayerMaxHP
2020-10-21 18:34:18 -07:00
jr nc, .hp_mismatch_1
2013-05-05 16:56:17 -07:00
; ...and enemy's HP is above 50%...
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2020-10-21 18:34:18 -07:00
jr nc, .hp_mismatch_1
2013-05-05 16:56:17 -07:00
; ...greatly encourage this move if player is badly poisoned.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus5]
bit SUBSTATUS_TOXIC, a
2020-10-21 18:34:18 -07:00
jr nz, .greatly_encourage
2013-05-05 16:56:17 -07:00
2014-10-22 05:47:33 -07:00
; ...70% chance to greatly encourage this move if player is not badly poisoned.
call Random
cp 70 percent
2020-10-21 18:34:18 -07:00
jr nc, .not_encouraged
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.greatly_encourage
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-10-21 18:34:18 -07:00
.hp_mismatch_1
2014-10-22 05:47:33 -07:00
; Greatly discourage this move if player's HP is below 25%.
2013-05-06 11:33:19 -07:00
call AICheckPlayerQuarterHP
2020-10-21 18:34:18 -07:00
jr nc, .hp_mismatch_2
2013-05-05 16:56:17 -07:00
; If player's HP is above 25% but not full, 4% chance to greatly encourage this move.
call Random
cp 4 percent
2020-10-21 18:34:18 -07:00
jr c, .greatly_encourage
2013-05-05 16:56:17 -07:00
; If player's HP is between 25% and 50%,...
2013-05-06 11:33:19 -07:00
call AICheckPlayerHalfHP
2020-10-21 18:34:18 -07:00
jr nc, .hp_mismatch_3
2013-05-05 16:56:17 -07:00
; If player's HP is above 50% but not full, 20% chance to greatly encourage this move.
call AI_80_20
2020-10-21 18:34:18 -07:00
jr c, .greatly_encourage
jr .not_encouraged
2013-05-05 16:56:17 -07:00
; ...50% chance to greatly discourage this move.
2020-10-21 18:34:18 -07:00
.hp_mismatch_3
call AI_50_50
2020-10-21 18:34:18 -07:00
jr c, .not_encouraged
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.hp_mismatch_2
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
2013-05-05 16:56:17 -07:00
; We only end up here if the move has not been already encouraged.
2020-10-21 18:34:18 -07:00
.not_encouraged
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus5]
bit SUBSTATUS_TOXIC, a
2020-10-21 18:34:18 -07:00
jr nz, .maybe_greatly_encourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus4]
bit SUBSTATUS_LEECH_SEED, a
2020-10-21 18:34:18 -07:00
jr nz, .encourage
2013-05-05 16:56:17 -07:00
; Discourage this move if enemy's evasion level is higher than player's accuracy level.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyEvaLevel]
2013-05-05 16:56:17 -07:00
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wPlayerAccLevel]
2013-05-05 16:56:17 -07:00
cp b
2020-10-21 18:34:18 -07:00
jr c, .discourage
2013-05-05 16:56:17 -07:00
; Greatly encourage this move if the player is in the middle of Fury Cutter or Rollout.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerFuryCutterCount]
2013-05-05 16:56:17 -07:00
and a
2020-10-21 18:34:18 -07:00
jr nz, .greatly_encourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus1]
bit SUBSTATUS_ROLLOUT, a
2020-10-21 18:34:18 -07:00
jr nz, .greatly_encourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2014-10-22 05:47:33 -07:00
; Player is badly poisoned.
; 70% chance to greatly encourage this move.
; This would counter any previous discouragement.
2020-10-21 18:34:18 -07:00
.maybe_greatly_encourage
call Random
cp 31 percent + 1
2013-05-05 16:56:17 -07:00
ret c
2020-10-21 18:34:18 -07:00
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2014-10-22 05:47:33 -07:00
; Player is seeded.
; 50% chance to encourage this move.
; This would partly counter any previous discouragement.
2020-10-21 18:34:18 -07:00
.encourage
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_ResetStats:
2014-10-22 05:47:33 -07:00
; 85% chance to encourage this move if any of enemy's stat levels is lower than -2.
2013-05-05 16:56:17 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld hl, wEnemyAtkLevel
2020-05-07 08:09:41 -07:00
ld c, NUM_LEVEL_STATS
2020-06-29 09:25:58 -07:00
.enemystatsloop
2013-05-05 16:56:17 -07:00
dec c
2020-06-29 09:25:58 -07:00
jr z, .enemystatsdone
2013-05-05 16:56:17 -07:00
ld a, [hli]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL - 2
2020-06-29 09:25:58 -07:00
jr c, .encourage
jr .enemystatsloop
2013-05-05 16:56:17 -07:00
; 85% chance to encourage this move if any of player's stat levels is higher than +2.
2020-06-29 09:25:58 -07:00
.enemystatsdone
2018-01-23 14:39:09 -08:00
ld hl, wPlayerAtkLevel
2020-06-29 09:25:58 -07:00
ld c, NUM_LEVEL_STATS
.playerstatsloop
2013-05-05 16:56:17 -07:00
dec c
2020-06-29 09:25:58 -07:00
jr z, .discourage
2013-05-05 16:56:17 -07:00
ld a, [hli]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL + 3
2020-06-29 09:25:58 -07:00
jr c, .playerstatsloop
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.encourage
2013-05-05 16:56:17 -07:00
pop hl
call Random
cp 16 percent
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
ret
2014-10-22 05:47:33 -07:00
; Discourage this move if neither:
2022-08-06 21:38:08 -07:00
; Any of enemy's stat levels is lower than -2.
2014-10-22 05:47:33 -07:00
; Any of player's stat levels is higher than +2.
2020-06-29 09:25:58 -07:00
.discourage
2013-05-05 16:56:17 -07:00
pop hl
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Bide:
2014-10-21 11:44:42 -07:00
; 90% chance to discourage this move unless enemy's HP is full.
2014-10-21 05:17:55 -07:00
2013-05-06 11:33:19 -07:00
call AICheckEnemyMaxHP
2013-05-05 16:56:17 -07:00
ret c
call Random
cp 10 percent
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_ForceSwitch:
2014-10-22 08:36:42 -07:00
; Whirlwind, Roar.
; Discourage this move if the player has not shown
2014-10-22 05:47:33 -07:00
; a super-effective move against the enemy.
; Consider player's type(s) if its moves are unknown.
2014-10-22 05:47:33 -07:00
2013-05-05 16:56:17 -07:00
push hl
2017-12-24 09:47:30 -08:00
callfar CheckPlayerMoveTypeMatchups
2016-01-12 09:46:18 -08:00
ld a, [wEnemyAISwitchScore]
2020-10-21 18:34:18 -07:00
cp BASE_AI_SWITCH_SCORE
2013-05-05 16:56:17 -07:00
pop hl
ret c
inc [hl]
ret
AI_Smart_Heal:
AI_Smart_MorningSun:
AI_Smart_Synthesis:
2018-06-24 07:09:41 -07:00
AI_Smart_Moonlight:
2014-10-21 15:28:51 -07:00
; 90% chance to greatly encourage this move if enemy's HP is below 25%.
; Discourage this move if enemy's HP is higher than 50%.
; Do nothing otherwise.
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2020-06-29 09:25:58 -07:00
jr nc, .encourage
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2013-05-05 16:56:17 -07:00
ret nc
inc [hl]
ret
2020-06-29 09:25:58 -07:00
.encourage
call Random
cp 10 percent
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
AI_Smart_Toxic:
2018-06-24 07:09:41 -07:00
AI_Smart_LeechSeed:
2014-10-21 11:44:42 -07:00
; Discourage this move if player's HP is below 50%.
2014-10-21 05:17:55 -07:00
2013-05-06 11:33:19 -07:00
call AICheckPlayerHalfHP
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
AI_Smart_LightScreen:
2018-06-24 07:09:41 -07:00
AI_Smart_Reflect:
2014-10-21 11:44:42 -07:00
; Over 90% chance to discourage this move unless enemy's HP is full.
2013-05-06 11:33:19 -07:00
call AICheckEnemyMaxHP
2013-05-05 16:56:17 -07:00
ret c
call Random
cp 8 percent
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Ohko:
2014-10-22 08:36:42 -07:00
; Dismiss this move if player's level is higher than enemy's level.
2014-10-22 14:08:51 -07:00
; Else, discourage this move is player's HP is below 50%.
2014-10-21 15:28:51 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonLevel]
2013-05-05 16:56:17 -07:00
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonLevel]
2013-05-05 16:56:17 -07:00
cp b
2013-05-06 11:33:19 -07:00
jp c, AIDiscourageMove
call AICheckPlayerHalfHP
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_TrapTarget:
2014-10-22 08:36:42 -07:00
; Bind, Wrap, Fire Spin, Clamp
2014-10-22 14:08:51 -07:00
; 50% chance to discourage this move if the player is already trapped.
2015-11-08 10:27:26 -08:00
ld a, [wPlayerWrapCount]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr nz, .discourage
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; 50% chance to greatly encourage this move if player is either
; badly poisoned, in love, identified, stuck in Rollout, or has a Nightmare.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus5]
2013-05-05 23:39:01 -07:00
bit SUBSTATUS_TOXIC, a
2020-06-29 09:25:58 -07:00
jr nz, .encourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus1]
and 1 << SUBSTATUS_IN_LOVE | 1 << SUBSTATUS_ROLLOUT | 1 << SUBSTATUS_IDENTIFIED | 1 << SUBSTATUS_NIGHTMARE
2020-06-29 09:25:58 -07:00
jr nz, .encourage
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; Else, 50% chance to greatly encourage this move if it's the player's Pokemon first turn.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerTurnsTaken]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr z, .encourage
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; 50% chance to discourage this move otherwise.
2020-06-29 09:25:58 -07:00
.discourage
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2020-06-29 09:25:58 -07:00
.encourage
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2013-05-05 16:56:17 -07:00
ret nc
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
AI_Smart_RazorWind:
2018-06-24 07:09:41 -07:00
AI_Smart_Unused2B:
2018-01-23 14:39:09 -08:00
ld a, [wEnemySubStatus1]
2013-05-05 23:39:01 -07:00
bit SUBSTATUS_PERISH, a
2020-10-21 18:34:18 -07:00
jr z, .no_perish_count
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wEnemyPerishCount]
2013-05-05 23:39:01 -07:00
cp 3
2020-10-21 18:34:18 -07:00
jr c, .discourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.no_perish_count
2013-05-05 16:56:17 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld hl, wPlayerUsedMoves
2020-05-17 17:59:15 -07:00
ld c, NUM_MOVES
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.checkmove
2013-05-05 16:56:17 -07:00
ld a, [hli]
and a
2020-10-21 18:34:18 -07:00
jr z, .movesdone
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
2013-05-05 23:39:01 -07:00
cp EFFECT_PROTECT
2020-10-21 18:34:18 -07:00
jr z, .dismiss
2013-05-05 16:56:17 -07:00
dec c
2020-10-21 18:34:18 -07:00
jr nz, .checkmove
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.movesdone
2013-05-05 16:56:17 -07:00
pop hl
2018-01-23 14:39:09 -08:00
ld a, [wEnemySubStatus3]
2013-05-05 23:39:01 -07:00
bit SUBSTATUS_CONFUSED, a
2020-10-21 18:34:18 -07:00
jr nz, .maybe_discourage
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2013-05-05 16:56:17 -07:00
ret c
2020-10-21 18:34:18 -07:00
.maybe_discourage
call Random
cp 79 percent - 1
2013-05-05 16:56:17 -07:00
ret c
2020-10-21 18:34:18 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2020-10-21 18:34:18 -07:00
.dismiss
2013-05-05 16:56:17 -07:00
pop hl
ld a, [hl]
2013-05-05 23:39:01 -07:00
add 6
2013-05-05 16:56:17 -07:00
ld [hl], a
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Confuse:
2014-10-21 15:28:51 -07:00
; 90% chance to discourage this move if player's HP is between 25% and 50%.
2013-05-06 11:33:19 -07:00
call AICheckPlayerHalfHP
2013-05-05 16:56:17 -07:00
ret c
call Random
cp 10 percent
2020-06-29 09:25:58 -07:00
jr c, .skipdiscourage
2013-05-05 16:56:17 -07:00
inc [hl]
2020-06-29 09:25:58 -07:00
.skipdiscourage
2014-10-21 15:28:51 -07:00
; Discourage again if player's HP is below 25%.
2013-05-06 11:33:19 -07:00
call AICheckPlayerQuarterHP
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_SpDefenseUp2:
2014-10-22 08:36:42 -07:00
; Discourage this move if enemy's HP is lower than 50%.
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2020-06-29 09:25:58 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
2014-10-22 08:36:42 -07:00
; Discourage this move if enemy's special defense level is higher than +3.
2018-01-23 14:39:09 -08:00
ld a, [wEnemySDefLevel]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL + 4
2020-06-29 09:25:58 -07:00
jr nc, .discourage
2014-10-22 08:36:42 -07:00
; 80% chance to greatly encourage this move if
; enemy's Special Defense level is lower than +2, and the player is of a special type.
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL + 2
2013-05-05 16:56:17 -07:00
ret nc
2013-05-05 23:39:01 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType1]
cp SPECIAL
2020-06-29 09:25:58 -07:00
jr nc, .encourage
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType2]
cp SPECIAL
2013-05-05 16:56:17 -07:00
ret c
2020-06-29 09:25:58 -07:00
.encourage
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-06-29 09:25:58 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Fly:
2014-10-22 14:08:51 -07:00
; Fly, Dig
2014-10-21 15:28:51 -07:00
; Greatly encourage this move if the player is
; flying or underground, and slower than the enemy.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus3]
2014-05-05 00:30:51 -07:00
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
2013-05-05 16:56:17 -07:00
ret z
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-05 16:56:17 -07:00
ret nc
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_SuperFang:
2014-10-21 15:28:51 -07:00
; Discourage this move if player's HP is below 25%.
2013-05-06 11:33:19 -07:00
call AICheckPlayerQuarterHP
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Paralyze:
2014-10-21 15:28:51 -07:00
; 50% chance to discourage this move if player's HP is below 25%.
2013-05-06 11:33:19 -07:00
call AICheckPlayerQuarterHP
2020-06-29 09:25:58 -07:00
jr nc, .discourage
; 80% chance to greatly encourage this move
; if enemy is slower than player and its HP is above 25%.
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-05 16:56:17 -07:00
ret c
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2013-05-05 16:56:17 -07:00
ret nc
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-06-29 09:25:58 -07:00
.discourage
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_SpeedDownHit:
2014-10-22 08:36:42 -07:00
; Icy Wind
; Almost 90% chance to greatly encourage this move if the following conditions all meet:
; Enemy's HP is higher than 25%.
; It's the first turn of player's Pokemon.
; Player is faster than enemy.
ld a, [wEnemyMoveStruct + MOVE_ANIM]
2013-05-06 17:51:07 -07:00
cp ICY_WIND
2013-05-05 16:56:17 -07:00
ret nz
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2013-05-05 16:56:17 -07:00
ret nc
2018-01-23 14:39:09 -08:00
ld a, [wPlayerTurnsTaken]
2013-05-05 16:56:17 -07:00
and a
ret nz
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-05 16:56:17 -07:00
ret c
call Random
cp 12 percent
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Substitute:
2014-10-21 15:28:51 -07:00
; Dismiss this move if enemy's HP is below 50%.
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2013-05-05 16:56:17 -07:00
ret c
2013-05-06 11:33:19 -07:00
jp AIDiscourageMove
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Smart_HyperBeam:
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2020-06-29 09:25:58 -07:00
jr c, .discourage
; 50% chance to encourage this move if enemy's HP is below 25%.
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2013-05-05 16:56:17 -07:00
ret c
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
ret
2020-06-29 09:25:58 -07:00
.discourage
2014-10-21 15:28:51 -07:00
; If enemy's HP is above 50%, discourage this move at random
call Random
cp 16 percent
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Rage:
2018-01-23 14:39:09 -08:00
ld a, [wEnemySubStatus4]
bit SUBSTATUS_RAGE, a
2020-06-29 09:25:58 -07:00
jr z, .notbuilding
2013-05-05 16:56:17 -07:00
; If enemy's Rage is building, 50% chance to encourage this move.
call AI_50_50
2020-06-29 09:25:58 -07:00
jr c, .skipencourage
2013-05-05 16:56:17 -07:00
dec [hl]
; Encourage this move based on Rage's counter.
2020-06-29 09:25:58 -07:00
.skipencourage
2015-11-05 16:13:09 -08:00
ld a, [wEnemyRageCounter]
2020-05-07 08:09:41 -07:00
cp 2
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
2015-11-05 16:13:09 -08:00
ld a, [wEnemyRageCounter]
2020-05-07 08:09:41 -07:00
cp 3
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
ret
2020-06-29 09:25:58 -07:00
.notbuilding
2014-10-22 08:36:42 -07:00
; If enemy's Rage is not building, discourage this move if enemy's HP is below 50%.
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2020-06-29 09:25:58 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
2022-08-21 20:39:08 -07:00
; 20% chance to encourage this move otherwise.
call AI_80_20
2013-05-05 16:56:17 -07:00
ret nc
dec [hl]
ret
2020-06-29 09:25:58 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Mimic:
2020-10-21 18:34:18 -07:00
; Discourage this move if the player did not use any move last turn.
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerCounterMove]
2013-05-05 16:56:17 -07:00
and a
2020-10-21 18:34:18 -07:00
jr z, .dismiss
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2020-10-21 18:34:18 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerCounterMove]
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
ld a, 1
ldh [hBattleTurn], a
2017-12-24 09:47:30 -08:00
callfar BattleCheckTypeMatchup
2013-05-05 16:56:17 -07:00
ld a, [wTypeMatchup]
cp EFFECTIVE
2013-05-05 16:56:17 -07:00
pop hl
2020-10-21 18:34:18 -07:00
jr c, .discourage
jr z, .skip_encourage
2013-05-05 16:56:17 -07:00
call AI_50_50
2020-10-21 18:34:18 -07:00
jr c, .skip_encourage
2013-05-05 16:56:17 -07:00
dec [hl]
2020-10-21 18:34:18 -07:00
.skip_encourage
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerCounterMove]
2013-05-05 16:56:17 -07:00
push hl
2014-10-21 15:28:51 -07:00
ld hl, UsefulMoves
2013-05-05 23:39:01 -07:00
ld de, 1
2013-05-05 16:56:17 -07:00
call IsInArray
pop hl
ret nc
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
ret
2020-10-21 18:34:18 -07:00
.dismiss
; Dismiss this move if the enemy is faster than the player.
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-06 11:33:19 -07:00
jp c, AIDiscourageMove
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Counter:
2013-05-05 16:56:17 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld hl, wPlayerUsedMoves
2020-05-07 08:09:41 -07:00
ld c, NUM_MOVES
2013-05-05 23:39:01 -07:00
ld b, 0
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.playermoveloop
2013-05-05 16:56:17 -07:00
ld a, [hli]
and a
2020-06-29 09:25:58 -07:00
jr z, .skipmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr z, .skipmove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_TYPE]
cp SPECIAL
2020-06-29 09:25:58 -07:00
jr nc, .skipmove
2013-05-05 16:56:17 -07:00
inc b
2020-06-29 09:25:58 -07:00
.skipmove
2013-05-05 16:56:17 -07:00
dec c
2020-06-29 09:25:58 -07:00
jr nz, .playermoveloop
2013-05-05 16:56:17 -07:00
pop hl
ld a, b
and a
2020-06-29 09:25:58 -07:00
jr z, .discourage
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
cp 3
jr nc, .encourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerCounterMove]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr z, .done
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr z, .done
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_TYPE]
cp SPECIAL
2020-06-29 09:25:58 -07:00
jr nc, .done
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.encourage
call Random
cp 39 percent + 1
2020-06-29 09:25:58 -07:00
jr c, .done
2013-05-05 16:56:17 -07:00
dec [hl]
2020-06-29 09:25:58 -07:00
.done
2013-05-05 16:56:17 -07:00
ret
2020-06-29 09:25:58 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Encore:
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2020-06-29 09:25:58 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerMove]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 11:33:19 -07:00
jp z, AIDiscourageMove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr z, .weakmove
2013-05-05 16:56:17 -07:00
push hl
ld a, [wEnemyMoveStruct + MOVE_TYPE]
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonType1
predef CheckTypeMatchup
2013-05-05 16:56:17 -07:00
pop hl
ld a, [wTypeMatchup]
cp EFFECTIVE
2020-06-29 09:25:58 -07:00
jr nc, .weakmove
2013-05-05 16:56:17 -07:00
and a
ret nz
2020-06-29 09:25:58 -07:00
jr .encourage
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.weakmove
2013-05-05 16:56:17 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerCounterMove]
ld hl, EncoreMoves
2013-05-05 23:39:01 -07:00
ld de, 1
2013-05-05 16:56:17 -07:00
call IsInArray
pop hl
2020-06-29 09:25:58 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.encourage
call Random
cp 28 percent - 1
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-06-29 09:25:58 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
inc [hl]
2013-05-05 16:56:17 -07:00
ret
INCLUDE "data/battle/ai/encore_moves.asm"
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Smart_PainSplit:
2014-10-22 08:36:42 -07:00
; Discourage this move if [enemy's current HP * 2 > player's current HP].
2013-05-05 16:56:17 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonHP
2013-05-05 16:56:17 -07:00
ld b, [hl]
inc hl
ld c, [hl]
sla c
rl b
2018-01-23 14:39:09 -08:00
ld hl, wBattleMonHP + 1
2013-05-05 16:56:17 -07:00
ld a, [hld]
cp c
ld a, [hl]
sbc b
pop hl
ret nc
inc [hl]
ret
AI_Smart_Snore:
2018-06-24 07:09:41 -07:00
AI_Smart_SleepTalk:
2014-10-22 08:36:42 -07:00
; Greatly encourage this move if enemy is fast asleep.
; Greatly discourage this move otherwise.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonStatus]
and SLP_MASK
2020-05-07 08:09:41 -07:00
cp 1
2020-06-29 09:25:58 -07:00
jr z, .discourage
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-06-29 09:25:58 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
inc [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_DefrostOpponent:
2014-10-22 08:36:42 -07:00
; Greatly encourage this move if enemy is frozen.
; No move has EFFECT_DEFROST_OPPONENT, so this layer is unused.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonStatus]
2018-05-19 10:11:50 -07:00
and 1 << FRZ
2013-05-05 16:56:17 -07:00
ret z
dec [hl]
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Spite:
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerCounterMove]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr nz, .usedmove
2013-05-05 16:56:17 -07:00
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-06 11:33:19 -07:00
jp c, AIDiscourageMove
2013-05-05 16:56:17 -07:00
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2020-06-29 09:25:58 -07:00
.usedmove
2013-05-05 16:56:17 -07:00
push hl
ld b, a
2020-05-17 17:59:15 -07:00
ld c, NUM_MOVES
2018-01-23 14:39:09 -08:00
ld hl, wBattleMonMoves
ld de, wBattleMonPP
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.moveloop
2013-05-05 16:56:17 -07:00
ld a, [hli]
cp b
2020-06-29 09:25:58 -07:00
jr z, .foundmove
2013-05-05 16:56:17 -07:00
inc de
dec c
2020-06-29 09:25:58 -07:00
jr nz, .moveloop
2013-05-05 16:56:17 -07:00
pop hl
ret
2020-06-29 09:25:58 -07:00
.foundmove
2013-05-05 16:56:17 -07:00
pop hl
ld a, [de]
2020-05-07 08:09:41 -07:00
cp 6
2020-06-29 09:25:58 -07:00
jr c, .encourage
2020-05-07 08:09:41 -07:00
cp 15
2020-06-29 09:25:58 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
call Random
cp 39 percent + 1
2013-05-05 16:56:17 -07:00
ret nc
2020-06-29 09:25:58 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2020-06-29 09:25:58 -07:00
.encourage
call Random
cp 39 percent + 1
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-10-21 18:34:18 -07:00
.dismiss ; unreferenced
2013-05-06 11:33:19 -07:00
jp AIDiscourageMove
2013-05-05 16:56:17 -07:00
AI_Smart_DestinyBond:
AI_Smart_Reversal:
2018-06-24 07:09:41 -07:00
AI_Smart_SkullBash:
2014-10-22 08:36:42 -07:00
; Discourage this move if enemy's HP is above 25%.
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2013-05-05 16:56:17 -07:00
ret nc
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_HealBell:
2014-10-22 08:36:42 -07:00
; Dismiss this move if none of the opponent's Pokemon is statused.
; Encourage this move if the enemy is statused.
; 50% chance to greatly encourage this move if the enemy is fast asleep or frozen.
2013-05-05 16:56:17 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld a, [wOTPartyCount]
2013-05-05 16:56:17 -07:00
ld b, a
2013-05-05 23:39:01 -07:00
ld c, 0
2018-01-23 14:39:09 -08:00
ld hl, wOTPartyMon1HP
ld de, PARTYMON_STRUCT_LENGTH
2013-05-05 16:56:17 -07:00
.loop
2013-05-05 16:56:17 -07:00
push hl
ld a, [hli]
or [hl]
jr z, .next
2013-05-05 16:56:17 -07:00
; status
2013-05-05 16:56:17 -07:00
dec hl
dec hl
dec hl
2013-05-05 16:56:17 -07:00
ld a, [hl]
or c
ld c, a
.next
2013-05-05 16:56:17 -07:00
pop hl
add hl, de
dec b
jr nz, .loop
2013-05-05 16:56:17 -07:00
pop hl
ld a, c
and a
jr z, .no_status
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonStatus]
2013-05-05 16:56:17 -07:00
and a
jr z, .ok
2013-05-05 16:56:17 -07:00
dec [hl]
.ok
and 1 << FRZ | SLP_MASK
2013-05-05 16:56:17 -07:00
ret z
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
.no_status
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonStatus]
2013-05-05 16:56:17 -07:00
and a
ret nz
2013-05-06 11:33:19 -07:00
jp AIDiscourageMove
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Smart_PriorityHit:
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-05 16:56:17 -07:00
ret c
; Dismiss this move if the player is flying or underground.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus3]
2014-05-05 00:30:51 -07:00
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
2013-05-06 11:33:19 -07:00
jp nz, AIDiscourageMove
2013-05-05 16:56:17 -07:00
; Greatly encourage this move if it will KO the player.
2020-10-21 18:34:18 -07:00
ld a, 1
ldh [hBattleTurn], a
2013-05-05 16:56:17 -07:00
push hl
2017-12-24 09:47:30 -08:00
callfar EnemyAttackDamage
callfar BattleCommand_DamageCalc
callfar BattleCommand_Stab
2013-05-05 16:56:17 -07:00
pop hl
2018-01-23 14:39:09 -08:00
ld a, [wCurDamage + 1]
2013-05-05 16:56:17 -07:00
ld c, a
2018-01-23 14:39:09 -08:00
ld a, [wCurDamage]
2013-05-05 16:56:17 -07:00
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonHP + 1]
2013-05-05 16:56:17 -07:00
cp c
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonHP]
2013-05-05 16:56:17 -07:00
sbc b
ret nc
dec [hl]
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Thief:
2014-10-21 11:44:42 -07:00
; Don't use Thief unless it's the only move available.
2014-10-21 15:28:51 -07:00
2013-05-05 16:56:17 -07:00
ld a, [hl]
add $1e
ld [hl], a
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Conversion2:
; BUG: "Smart" AI discourages Conversion2 after the first turn (see docs/bugs_and_glitches.md)
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerMove]
2013-05-05 16:56:17 -07:00
and a
jr nz, .discourage
2013-05-05 16:56:17 -07:00
push hl
dec a
ld hl, Moves + MOVE_TYPE
ld bc, MOVE_LENGTH
2013-05-05 16:56:17 -07:00
call AddNTimes
2013-05-05 23:39:01 -07:00
ld a, BANK(Moves)
2013-05-05 16:56:17 -07:00
call GetFarByte
ld [wPlayerMoveStruct + MOVE_TYPE], a
2013-05-05 23:39:01 -07:00
2013-05-05 16:56:17 -07:00
xor a
ldh [hBattleTurn], a
2013-05-05 23:39:01 -07:00
2017-12-24 09:47:30 -08:00
callfar BattleCheckTypeMatchup
2013-05-05 16:56:17 -07:00
ld a, [wTypeMatchup]
cp EFFECTIVE
2013-05-05 16:56:17 -07:00
pop hl
2020-06-29 09:25:58 -07:00
jr c, .discourage
2013-05-05 16:56:17 -07:00
ret z
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
ret
2020-06-29 09:25:58 -07:00
.discourage
call Random
cp 10 percent
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Disable:
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2020-06-29 09:25:58 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerCounterMove]
2014-10-21 15:28:51 -07:00
ld hl, UsefulMoves
2013-05-05 23:39:01 -07:00
ld de, 1
2013-05-05 16:56:17 -07:00
call IsInArray
pop hl
2020-06-29 09:25:58 -07:00
jr nc, .notencourage
2013-05-05 16:56:17 -07:00
call Random
cp 39 percent + 1
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
ret
2020-06-29 09:25:58 -07:00
.notencourage
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
ret nz
2020-06-29 09:25:58 -07:00
.discourage
call Random
cp 8 percent
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_MeanLook:
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2020-06-29 09:25:58 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
push hl
2013-05-06 21:58:35 -07:00
call AICheckLastPlayerMon
2013-05-05 16:56:17 -07:00
pop hl
2013-05-06 11:33:19 -07:00
jp z, AIDiscourageMove
2013-05-05 16:56:17 -07:00
; 80% chance to greatly encourage this move if the enemy is badly poisoned.
; BUG: "Smart" AI encourages Mean Look if its own Pokémon is badly poisoned (see docs/bugs_and_glitches.md)
2018-01-23 14:39:09 -08:00
ld a, [wEnemySubStatus5]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_TOXIC, a
2020-06-29 09:25:58 -07:00
jr nz, .encourage
2013-05-05 16:56:17 -07:00
; 80% chance to greatly encourage this move if the player is either
; in love, identified, stuck in Rollout, or has a Nightmare.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus1]
and 1 << SUBSTATUS_IN_LOVE | 1 << SUBSTATUS_ROLLOUT | 1 << SUBSTATUS_IDENTIFIED | 1 << SUBSTATUS_NIGHTMARE
2020-06-29 09:25:58 -07:00
jr nz, .encourage
2013-05-05 16:56:17 -07:00
; Otherwise, discourage this move unless the player only has not very effective moves against the enemy.
2013-05-05 16:56:17 -07:00
push hl
2017-12-24 09:47:30 -08:00
callfar CheckPlayerMoveTypeMatchups
2016-01-12 09:46:18 -08:00
ld a, [wEnemyAISwitchScore]
2020-10-21 18:34:18 -07:00
cp BASE_AI_SWITCH_SCORE + 1 ; not very effective
2013-05-05 16:56:17 -07:00
pop hl
ret nc
2020-06-29 09:25:58 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2020-06-29 09:25:58 -07:00
.encourage
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AICheckLastPlayerMon:
2018-01-23 14:39:09 -08:00
ld a, [wPartyCount]
2013-05-05 23:39:01 -07:00
ld b, a
ld c, 0
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1HP
ld de, PARTYMON_STRUCT_LENGTH
2013-05-05 23:39:01 -07:00
.loop
2018-01-23 14:39:09 -08:00
ld a, [wCurBattleMon]
2013-05-05 23:39:01 -07:00
cp c
2020-06-29 09:25:58 -07:00
jr z, .skip
2013-05-05 23:39:01 -07:00
ld a, [hli]
or [hl]
ret nz
dec hl
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.skip
2013-05-05 23:39:01 -07:00
add hl, de
inc c
dec b
jr nz, .loop
2013-05-05 16:56:17 -07:00
2013-05-05 23:39:01 -07:00
ret
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Smart_Nightmare:
2014-10-22 08:36:42 -07:00
; 50% chance to encourage this move.
; The AI_Basic layer will make sure that
2014-10-22 08:36:42 -07:00
; Dream Eater is only used against sleeping targets.
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_FlameWheel:
2014-10-22 14:08:51 -07:00
; Use this move if the enemy is frozen.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonStatus]
2013-05-06 21:58:35 -07:00
bit FRZ, a
2013-05-05 16:56:17 -07:00
ret z
2015-07-20 19:18:18 -07:00
rept 5
2013-05-05 16:56:17 -07:00
dec [hl]
2015-07-20 19:18:18 -07:00
endr
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Curse:
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonType1]
2013-05-06 21:58:35 -07:00
cp GHOST
2020-10-21 18:34:18 -07:00
jr z, .ghost_curse
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonType2]
2013-05-06 21:58:35 -07:00
cp GHOST
2020-10-21 18:34:18 -07:00
jr z, .ghost_curse
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2020-10-21 18:34:18 -07:00
jr nc, .encourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wEnemyAtkLevel]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL + 4
2020-10-21 18:34:18 -07:00
jr nc, .encourage
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL + 2
2013-05-05 16:56:17 -07:00
ret nc
2013-05-06 21:58:35 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType1]
2013-05-06 21:58:35 -07:00
cp GHOST
2020-10-21 18:34:18 -07:00
jr z, .greatly_encourage
cp SPECIAL
2013-05-05 16:56:17 -07:00
ret nc
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType2]
cp SPECIAL
2013-05-05 16:56:17 -07:00
ret nc
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-10-21 18:34:18 -07:00
.approve
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
2020-10-21 18:34:18 -07:00
.greatly_encourage
2013-05-05 16:56:17 -07:00
inc [hl]
2020-10-21 18:34:18 -07:00
.encourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2020-10-21 18:34:18 -07:00
.ghost_curse
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus1]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_CURSE, a
2013-05-06 11:33:19 -07:00
jp nz, AIDiscourageMove
2013-05-05 16:56:17 -07:00
push hl
2017-12-24 09:47:30 -08:00
farcall FindAliveEnemyMons
2013-05-05 16:56:17 -07:00
pop hl
2020-10-21 18:34:18 -07:00
jr nc, .notlastmon
2013-05-05 16:56:17 -07:00
push hl
2013-05-06 21:58:35 -07:00
call AICheckLastPlayerMon
2013-05-05 16:56:17 -07:00
pop hl
2020-10-21 18:34:18 -07:00
jr nz, .approve
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
jr .ghost_continue
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.notlastmon
2013-05-05 16:56:17 -07:00
push hl
2013-05-06 21:58:35 -07:00
call AICheckLastPlayerMon
2013-05-05 16:56:17 -07:00
pop hl
2020-10-21 18:34:18 -07:00
jr z, .maybe_greatly_encourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.ghost_continue
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2020-10-21 18:34:18 -07:00
jp nc, .approve
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2020-10-21 18:34:18 -07:00
jr nc, .greatly_encourage
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AICheckEnemyMaxHP
2013-05-05 16:56:17 -07:00
ret nc
2013-05-06 21:58:35 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wPlayerTurnsTaken]
2013-05-05 16:56:17 -07:00
and a
ret nz
2020-10-21 18:34:18 -07:00
.maybe_greatly_encourage
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Protect:
2020-10-21 18:34:18 -07:00
; Greatly discourage this move if the enemy already used Protect.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyProtectCount]
2013-05-05 16:56:17 -07:00
and a
2020-10-21 18:34:18 -07:00
jr nz, .greatly_discourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; Discourage this move if the player is locked on.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus5]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_LOCK_ON, a
2020-10-21 18:34:18 -07:00
jr nz, .discourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; Encourage this move if the player's Fury Cutter is boosted enough.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerFuryCutterCount]
2013-05-06 21:58:35 -07:00
cp 3
2020-10-21 18:34:18 -07:00
jr nc, .encourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; Encourage this move if the player has charged a two-turn move.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus3]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_CHARGED, a
2020-10-21 18:34:18 -07:00
jr nz, .encourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; Encourage this move if the player is affected by Toxic, Leech Seed, or Curse.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus5]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_TOXIC, a
2020-10-21 18:34:18 -07:00
jr nz, .encourage
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus4]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_LEECH_SEED, a
2020-10-21 18:34:18 -07:00
jr nz, .encourage
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus1]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_CURSE, a
2020-10-21 18:34:18 -07:00
jr nz, .encourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; Discourage this move if the player's Rollout count is not boosted enough.
bit SUBSTATUS_ROLLOUT, a
2020-10-21 18:34:18 -07:00
jr z, .discourage
2018-01-23 14:39:09 -08:00
ld a, [wPlayerRolloutCount]
2013-05-06 21:58:35 -07:00
cp 3
2020-10-21 18:34:18 -07:00
jr c, .discourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; 80% chance to encourage this move otherwise.
.encourage
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
2020-10-21 18:34:18 -07:00
2013-05-05 16:56:17 -07:00
dec [hl]
ret
2020-10-21 18:34:18 -07:00
.greatly_discourage
2013-05-05 16:56:17 -07:00
inc [hl]
2020-10-21 18:34:18 -07:00
.discourage
call Random
cp 8 percent
2013-05-05 16:56:17 -07:00
ret c
2020-10-21 18:34:18 -07:00
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Foresight:
2020-10-21 18:34:18 -07:00
; 60% chance to encourage this move if the enemy's accuracy is sharply lowered.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyAccLevel]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL - 2
2020-10-21 18:34:18 -07:00
jr c, .encourage
; 60% chance to encourage this move if the player's evasion is sharply raised.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerEvaLevel]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL + 3
2020-10-21 18:34:18 -07:00
jr nc, .encourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; 60% chance to encourage this move if the player is a Ghost type.
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType1]
2013-05-06 21:58:35 -07:00
cp GHOST
2020-10-21 18:34:18 -07:00
jr z, .encourage
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType2]
2013-05-06 21:58:35 -07:00
cp GHOST
2020-10-21 18:34:18 -07:00
jr z, .encourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; 92% chance to discourage this move otherwise.
call Random
cp 8 percent
2013-05-05 16:56:17 -07:00
ret c
2020-10-21 18:34:18 -07:00
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2020-10-21 18:34:18 -07:00
.encourage
call Random
cp 39 percent + 1
2013-05-05 16:56:17 -07:00
ret c
2020-10-21 18:34:18 -07:00
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_PerishSong:
2013-05-05 16:56:17 -07:00
push hl
2017-12-24 09:47:30 -08:00
callfar FindAliveEnemyMons
2013-05-05 16:56:17 -07:00
pop hl
jr c, .no
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus5]
bit SUBSTATUS_CANT_RUN, a
jr nz, .yes
2013-05-05 16:56:17 -07:00
push hl
2017-12-24 09:47:30 -08:00
callfar CheckPlayerMoveTypeMatchups
2016-01-12 09:46:18 -08:00
ld a, [wEnemyAISwitchScore]
2020-10-21 18:34:18 -07:00
cp BASE_AI_SWITCH_SCORE
2013-05-05 16:56:17 -07:00
pop hl
ret c
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-06 21:58:35 -07:00
2013-05-05 16:56:17 -07:00
inc [hl]
ret
.yes
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
ret
.no
2013-05-05 16:56:17 -07:00
ld a, [hl]
2013-05-06 21:58:35 -07:00
add 5
2013-05-05 16:56:17 -07:00
ld [hl], a
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Sandstorm:
2014-10-22 14:08:51 -07:00
; Greatly discourage this move if the player is immune to Sandstorm damage.
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType1]
2013-05-05 16:56:17 -07:00
push hl
2013-05-05 23:39:01 -07:00
ld hl, .SandstormImmuneTypes
ld de, 1
2013-05-05 16:56:17 -07:00
call IsInArray
pop hl
2020-10-21 18:34:18 -07:00
jr c, .greatly_discourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType2]
2013-05-05 16:56:17 -07:00
push hl
2013-05-05 23:39:01 -07:00
ld hl, .SandstormImmuneTypes
ld de, 1
2013-05-05 16:56:17 -07:00
call IsInArray
pop hl
2020-10-21 18:34:18 -07:00
jr c, .greatly_discourage
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; Discourage this move if player's HP is below 50%.
2013-05-06 11:33:19 -07:00
call AICheckPlayerHalfHP
2020-10-21 18:34:18 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; 50% chance to encourage this move otherwise.
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 23:39:01 -07:00
2013-05-05 16:56:17 -07:00
dec [hl]
ret
2020-10-21 18:34:18 -07:00
.greatly_discourage
2013-05-05 16:56:17 -07:00
inc [hl]
2020-10-21 18:34:18 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
.SandstormImmuneTypes:
2013-05-05 23:39:01 -07:00
db ROCK
db GROUND
db STEEL
2018-01-10 19:53:42 -08:00
db -1 ; end
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Smart_Endure:
2020-10-21 18:34:18 -07:00
; Greatly discourage this move if the enemy already used Protect.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyProtectCount]
2013-05-05 16:56:17 -07:00
and a
2020-10-21 18:34:18 -07:00
jr nz, .greatly_discourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; Greatly discourage this move if the enemy's HP is full.
2013-05-06 11:33:19 -07:00
call AICheckEnemyMaxHP
2020-10-21 18:34:18 -07:00
jr c, .greatly_discourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; Discourage this move if the enemy's HP is at least 25%.
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2020-10-21 18:34:18 -07:00
jr c, .discourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; If the enemy has Reversal...
2013-05-06 21:58:35 -07:00
ld b, EFFECT_REVERSAL
call AIHasMoveEffect
2020-10-21 18:34:18 -07:00
jr nc, .no_reversal
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; ...80% chance to greatly encourage this move.
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
2013-05-06 21:58:35 -07:00
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-10-21 18:34:18 -07:00
.no_reversal
; If the enemy is not locked on, do nothing.
2018-01-23 14:39:09 -08:00
ld a, [wEnemySubStatus5]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_LOCK_ON, a
2013-05-05 16:56:17 -07:00
ret z
2020-10-21 18:34:18 -07:00
; 50% chance to greatly encourage this move.
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-10-21 18:34:18 -07:00
.greatly_discourage
2013-05-05 16:56:17 -07:00
inc [hl]
2020-10-21 18:34:18 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_FuryCutter:
2014-10-22 08:36:42 -07:00
; Encourage this move based on Fury Cutter's count.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyFuryCutterCount]
2013-05-05 16:56:17 -07:00
and a
2020-10-21 18:34:18 -07:00
jr z, AI_Smart_Rollout
2013-05-05 16:56:17 -07:00
dec [hl]
2013-05-06 21:58:35 -07:00
cp 2
2020-10-21 18:34:18 -07:00
jr c, AI_Smart_Rollout
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
2013-05-06 21:58:35 -07:00
cp 3
2020-10-21 18:34:18 -07:00
jr c, AI_Smart_Rollout
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
; fallthrough
2018-06-24 07:09:41 -07:00
AI_Smart_Rollout:
2014-10-22 08:36:42 -07:00
; Rollout, Fury Cutter
; 80% chance to discourage this move if the enemy is in love, confused, or paralyzed.
2018-01-23 14:39:09 -08:00
ld a, [wEnemySubStatus1]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_IN_LOVE, a
2020-10-21 18:34:18 -07:00
jr nz, .maybe_discourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wEnemySubStatus3]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_CONFUSED, a
2020-10-21 18:34:18 -07:00
jr nz, .maybe_discourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonStatus]
2013-05-06 21:58:35 -07:00
bit PAR, a
2020-10-21 18:34:18 -07:00
jr nz, .maybe_discourage
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; 80% chance to discourage this move if the enemy's HP is below 25%,
; or if accuracy or evasion modifiers favour the player.
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2020-10-21 18:34:18 -07:00
jr nc, .maybe_discourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wEnemyAccLevel]
2020-05-17 17:59:15 -07:00
cp BASE_STAT_LEVEL
2020-10-21 18:34:18 -07:00
jr c, .maybe_discourage
2018-01-23 14:39:09 -08:00
ld a, [wPlayerEvaLevel]
2020-05-17 17:59:15 -07:00
cp BASE_STAT_LEVEL + 1
2020-10-21 18:34:18 -07:00
jr nc, .maybe_discourage
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
; 80% chance to greatly encourage this move otherwise.
call Random
cp 79 percent - 1
2013-05-05 16:56:17 -07:00
ret nc
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2020-10-21 18:34:18 -07:00
.maybe_discourage
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
AI_Smart_Swagger:
2018-06-24 07:09:41 -07:00
AI_Smart_Attract:
2014-10-22 08:36:42 -07:00
; 80% chance to encourage this move during the first turn of player's Pokemon.
; 80% chance to discourage this move otherwise.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerTurnsTaken]
2013-05-05 16:56:17 -07:00
and a
jr z, .first_turn
2013-05-05 16:56:17 -07:00
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
.first_turn
call Random
cp 79 percent - 1
2013-05-05 16:56:17 -07:00
ret nc
dec [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Safeguard:
2014-10-22 08:36:42 -07:00
; 80% chance to discourage this move if player's HP is below 50%.
2013-05-06 11:33:19 -07:00
call AICheckPlayerHalfHP
2013-05-05 16:56:17 -07:00
ret c
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
AI_Smart_Magnitude:
2018-06-24 07:09:41 -07:00
AI_Smart_Earthquake:
2014-10-22 14:08:51 -07:00
; Greatly encourage this move if the player is underground and the enemy is faster.
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerCounterMove]
2013-05-06 21:58:35 -07:00
cp DIG
2013-05-05 16:56:17 -07:00
ret nz
2013-05-06 21:58:35 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus3]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_UNDERGROUND, a
jr z, .could_dig
2013-05-05 16:56:17 -07:00
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-05 16:56:17 -07:00
ret nc
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
.could_dig
; Try to predict if the player will use Dig this turn.
2014-10-22 08:36:42 -07:00
; 50% chance to encourage this move if the enemy is slower than the player.
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-05 16:56:17 -07:00
ret c
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_BatonPass:
2014-10-22 08:36:42 -07:00
; Discourage this move if the player hasn't shown super-effective moves against the enemy.
2014-10-22 14:08:51 -07:00
; Consider player's type(s) if its moves are unknown.
2014-10-22 08:36:42 -07:00
2013-05-05 16:56:17 -07:00
push hl
2017-12-24 09:47:30 -08:00
callfar CheckPlayerMoveTypeMatchups
2016-01-12 09:46:18 -08:00
ld a, [wEnemyAISwitchScore]
2020-10-21 18:34:18 -07:00
cp BASE_AI_SWITCH_SCORE
2013-05-05 16:56:17 -07:00
pop hl
ret c
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Pursuit:
2014-10-22 14:08:51 -07:00
; 50% chance to greatly encourage this move if player's HP is below 25%.
; 80% chance to discourage this move otherwise.
2013-05-06 11:33:19 -07:00
call AICheckPlayerQuarterHP
2020-06-29 09:25:58 -07:00
jr nc, .encourage
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
inc [hl]
ret
2020-06-29 09:25:58 -07:00
.encourage
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_RapidSpin:
2014-10-22 14:08:51 -07:00
; 80% chance to greatly encourage this move if the enemy is
; trapped (Bind effect), seeded, or scattered with spikes.
2015-11-08 10:27:26 -08:00
ld a, [wEnemyWrapCount]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr nz, .encourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wEnemySubStatus4]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_LEECH_SEED, a
2020-06-29 09:25:58 -07:00
jr nz, .encourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wEnemyScreens]
2013-05-06 21:58:35 -07:00
bit SCREENS_SPIKES, a
2013-05-05 16:56:17 -07:00
ret z
2020-06-29 09:25:58 -07:00
.encourage
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_HiddenPower:
2013-05-05 16:56:17 -07:00
push hl
2013-05-06 21:58:35 -07:00
ld a, 1
ldh [hBattleTurn], a
2014-10-22 14:08:51 -07:00
; Calculate Hidden Power's type and base power based on enemy's DVs.
2017-12-24 09:47:30 -08:00
callfar HiddenPowerDamage
callfar BattleCheckTypeMatchup
2013-05-05 16:56:17 -07:00
pop hl
2013-05-06 21:58:35 -07:00
2014-10-22 14:08:51 -07:00
; Discourage Hidden Power if not very effective.
ld a, [wTypeMatchup]
cp EFFECTIVE
jr c, .bad
2013-05-05 16:56:17 -07:00
2022-08-06 21:38:08 -07:00
; Discourage Hidden Power if its base power is lower than 50.
2013-05-05 16:56:17 -07:00
ld a, d
cp 50
jr c, .bad
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; Encourage Hidden Power if super-effective.
ld a, [wTypeMatchup]
cp EFFECTIVE + 1
jr nc, .good
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; Encourage Hidden Power if its base power is 70.
2013-05-05 16:56:17 -07:00
ld a, d
cp 70
2013-05-05 16:56:17 -07:00
ret c
.good
2013-05-05 16:56:17 -07:00
dec [hl]
ret
.bad
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_RainDance:
2014-10-22 14:08:51 -07:00
; Greatly discourage this move if it would favour the player type-wise.
; Particularly, if the player is a Water-type.
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType1]
2013-05-05 23:39:01 -07:00
cp WATER
2013-05-06 21:58:35 -07:00
jr z, AIBadWeatherType
2013-05-05 23:39:01 -07:00
cp FIRE
2013-05-06 21:58:35 -07:00
jr z, AIGoodWeatherType
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType2]
2013-05-05 23:39:01 -07:00
cp WATER
2013-05-06 21:58:35 -07:00
jr z, AIBadWeatherType
2013-05-05 23:39:01 -07:00
cp FIRE
2013-05-06 21:58:35 -07:00
jr z, AIGoodWeatherType
2013-05-05 16:56:17 -07:00
push hl
2013-05-05 23:39:01 -07:00
ld hl, RainDanceMoves
jr AI_Smart_WeatherMove
2013-05-05 16:56:17 -07:00
INCLUDE "data/battle/ai/rain_dance_moves.asm"
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Smart_SunnyDay:
2014-10-22 14:08:51 -07:00
; Greatly discourage this move if it would favour the player type-wise.
; Particularly, if the player is a Fire-type.
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType1]
2013-05-05 23:39:01 -07:00
cp FIRE
2013-05-06 21:58:35 -07:00
jr z, AIBadWeatherType
2013-05-05 23:39:01 -07:00
cp WATER
2013-05-06 21:58:35 -07:00
jr z, AIGoodWeatherType
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType2]
2013-05-05 23:39:01 -07:00
cp FIRE
2013-05-06 21:58:35 -07:00
jr z, AIBadWeatherType
2013-05-05 23:39:01 -07:00
cp WATER
2013-05-06 21:58:35 -07:00
jr z, AIGoodWeatherType
2013-05-05 16:56:17 -07:00
push hl
2013-05-05 23:39:01 -07:00
ld hl, SunnyDayMoves
2013-05-05 16:56:17 -07:00
; fallthrough
2018-06-24 07:09:41 -07:00
AI_Smart_WeatherMove:
2014-10-22 14:08:51 -07:00
; Rain Dance, Sunny Day
; Greatly discourage this move if the enemy doesn't have
; one of the useful Rain Dance or Sunny Day moves.
2013-05-06 21:58:35 -07:00
call AIHasMoveInArray
2013-05-05 16:56:17 -07:00
pop hl
2013-05-06 21:58:35 -07:00
jr nc, AIBadWeatherType
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; Greatly discourage this move if player's HP is below 50%.
2013-05-06 11:33:19 -07:00
call AICheckPlayerHalfHP
2013-05-06 21:58:35 -07:00
jr nc, AIBadWeatherType
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; 50% chance to encourage this move otherwise.
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 23:39:01 -07:00
2013-05-05 16:56:17 -07:00
dec [hl]
ret
2018-06-24 07:09:41 -07:00
AIBadWeatherType:
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
inc [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AIGoodWeatherType:
2014-10-22 14:08:51 -07:00
; Rain Dance, Sunny Day
; Greatly encourage this move if it would disfavour the player type-wise and player's HP is above 50%...
2013-05-06 11:33:19 -07:00
call AICheckPlayerHalfHP
2013-05-05 16:56:17 -07:00
ret nc
2013-05-05 23:39:01 -07:00
2014-10-22 14:08:51 -07:00
; ...as long as one of the following conditions meet:
; It's the first turn of the player's Pokemon.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerTurnsTaken]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 21:58:35 -07:00
jr z, .good
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; Or it's the first turn of the enemy's Pokemon.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyTurnsTaken]
2013-05-05 16:56:17 -07:00
and a
ret nz
2013-05-06 21:58:35 -07:00
.good
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
INCLUDE "data/battle/ai/sunny_day_moves.asm"
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Smart_BellyDrum:
2014-10-22 14:08:51 -07:00
; Dismiss this move if enemy's attack is higher than +2 or if enemy's HP is below 50%.
; Else, discourage this move if enemy's HP is not full.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyAtkLevel]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL + 3
2020-06-29 09:25:58 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AICheckEnemyMaxHP
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
inc [hl]
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2013-05-05 16:56:17 -07:00
ret c
2020-06-29 09:25:58 -07:00
.discourage
2013-05-05 16:56:17 -07:00
ld a, [hl]
2020-06-29 09:25:58 -07:00
add 5
2013-05-05 16:56:17 -07:00
ld [hl], a
ret
2018-06-24 07:09:41 -07:00
AI_Smart_PsychUp:
2013-05-05 16:56:17 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld hl, wEnemyAtkLevel
2020-10-21 18:34:18 -07:00
ld b, NUM_LEVEL_STATS
2014-10-22 14:08:51 -07:00
ld c, 100
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; Calculate the sum of all enemy's stat level modifiers. Add 100 first to prevent underflow.
; Put the result in c. c will range between 58 and 142.
2020-10-21 18:34:18 -07:00
.enemy_loop
2013-05-05 16:56:17 -07:00
ld a, [hli]
2020-10-21 18:34:18 -07:00
sub BASE_STAT_LEVEL
2013-05-05 16:56:17 -07:00
add c
ld c, a
dec b
2020-10-21 18:34:18 -07:00
jr nz, .enemy_loop
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; Calculate the sum of all player's stat level modifiers. Add 100 first to prevent underflow.
; Put the result in d. d will range between 58 and 142.
2018-01-23 14:39:09 -08:00
ld hl, wPlayerAtkLevel
2020-10-21 18:34:18 -07:00
ld b, NUM_LEVEL_STATS
2014-10-22 14:08:51 -07:00
ld d, 100
2013-05-05 16:56:17 -07:00
2020-10-21 18:34:18 -07:00
.player_loop
2013-05-05 16:56:17 -07:00
ld a, [hli]
2020-10-21 18:34:18 -07:00
sub BASE_STAT_LEVEL
2013-05-05 16:56:17 -07:00
add d
ld d, a
dec b
2020-10-21 18:34:18 -07:00
jr nz, .player_loop
2013-05-05 16:56:17 -07:00
2014-10-22 14:08:51 -07:00
; Greatly discourage this move if enemy's stat levels are higher than player's (if c>=d).
2013-05-05 16:56:17 -07:00
ld a, c
sub d
pop hl
2020-10-21 18:34:18 -07:00
jr nc, .discourage
2013-05-05 16:56:17 -07:00
; Else, 80% chance to encourage this move unless player's accuracy level is lower than -1...
2018-01-23 14:39:09 -08:00
ld a, [wPlayerAccLevel]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL - 1
2013-05-05 16:56:17 -07:00
ret c
; ...or enemy's evasion level is higher than +0.
2018-01-23 14:39:09 -08:00
ld a, [wEnemyEvaLevel]
2020-05-07 08:09:41 -07:00
cp BASE_STAT_LEVEL + 1
2013-05-05 16:56:17 -07:00
ret nc
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 16:56:17 -07:00
dec [hl]
ret
2020-10-21 18:34:18 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_MirrorCoat:
2013-05-05 16:56:17 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld hl, wPlayerUsedMoves
2020-05-07 08:09:41 -07:00
ld c, NUM_MOVES
ld b, 0
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.playermoveloop
2013-05-05 16:56:17 -07:00
ld a, [hli]
and a
2020-06-29 09:25:58 -07:00
jr z, .skipmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr z, .skipmove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_TYPE]
cp SPECIAL
2020-06-29 09:25:58 -07:00
jr c, .skipmove
2013-05-05 16:56:17 -07:00
inc b
2020-06-29 09:25:58 -07:00
.skipmove
2013-05-05 16:56:17 -07:00
dec c
2020-06-29 09:25:58 -07:00
jr nz, .playermoveloop
2013-05-05 16:56:17 -07:00
pop hl
ld a, b
and a
2020-06-29 09:25:58 -07:00
jr z, .discourage
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
cp 3
jr nc, .encourage
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerCounterMove]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr z, .done
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
2020-06-29 09:25:58 -07:00
jr z, .done
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_TYPE]
cp SPECIAL
2020-06-29 09:25:58 -07:00
jr c, .done
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.encourage
call Random
2020-06-29 09:25:58 -07:00
cp 39 percent + 1
jr c, .done
2013-05-05 16:56:17 -07:00
dec [hl]
2020-06-29 09:25:58 -07:00
.done
2013-05-05 16:56:17 -07:00
ret
2020-06-29 09:25:58 -07:00
.discourage
2013-05-05 16:56:17 -07:00
inc [hl]
ret
AI_Smart_Twister:
2018-06-24 07:09:41 -07:00
AI_Smart_Gust:
2014-10-22 14:08:51 -07:00
; Greatly encourage this move if the player is flying and the enemy is faster.
2018-01-23 14:39:09 -08:00
ld a, [wLastPlayerCounterMove]
2013-05-06 21:58:35 -07:00
cp FLY
2013-05-05 16:56:17 -07:00
ret nz
2013-05-06 21:58:35 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus3]
2013-05-06 21:58:35 -07:00
bit SUBSTATUS_FLYING, a
2014-10-22 14:08:51 -07:00
jr z, .couldFly
2013-05-05 16:56:17 -07:00
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-05 16:56:17 -07:00
ret nc
2013-05-06 21:58:35 -07:00
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
; Try to predict if the player will use Fly this turn.
2014-10-22 14:08:51 -07:00
.couldFly
; 50% chance to encourage this move if the enemy is slower than the player.
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-05 16:56:17 -07:00
ret c
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
dec [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_FutureSight:
2014-10-22 14:08:51 -07:00
; Greatly encourage this move if the player is
; flying or underground, and slower than the enemy.
2013-05-06 17:51:07 -07:00
call AICompareSpeed
2013-05-05 16:56:17 -07:00
ret nc
2013-05-06 21:58:35 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus3]
2014-05-05 00:30:51 -07:00
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
2013-05-05 16:56:17 -07:00
ret z
2013-05-06 21:58:35 -07:00
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Stomp:
2014-10-22 14:08:51 -07:00
; 80% chance to encourage this move if the player has used Minimize.
ld a, [wPlayerMinimized]
2013-05-05 16:56:17 -07:00
and a
ret z
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
2013-05-06 21:58:35 -07:00
2013-05-05 16:56:17 -07:00
dec [hl]
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Solarbeam:
2014-10-22 14:08:51 -07:00
; 80% chance to encourage this move when it's sunny.
; 90% chance to discourage this move when it's raining.
ld a, [wBattleWeather]
2013-05-05 23:39:01 -07:00
cp WEATHER_SUN
2020-06-29 09:25:58 -07:00
jr z, .encourage
2013-05-05 16:56:17 -07:00
2013-05-05 23:39:01 -07:00
cp WEATHER_RAIN
2013-05-05 16:56:17 -07:00
ret nz
call Random
cp 10 percent
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 23:39:01 -07:00
2013-05-05 16:56:17 -07:00
inc [hl]
inc [hl]
2013-05-05 16:56:17 -07:00
ret
2020-06-29 09:25:58 -07:00
.encourage
call AI_80_20
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 23:39:01 -07:00
2013-05-05 16:56:17 -07:00
dec [hl]
dec [hl]
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_Smart_Thunder:
2014-10-22 14:08:51 -07:00
; 90% chance to discourage this move when it's sunny.
2014-10-21 15:28:51 -07:00
ld a, [wBattleWeather]
2013-05-05 23:39:01 -07:00
cp WEATHER_SUN
2013-05-05 16:56:17 -07:00
ret nz
call Random
cp 10 percent
2013-05-05 16:56:17 -07:00
ret c
2013-05-05 23:39:01 -07:00
2013-05-05 16:56:17 -07:00
inc [hl]
ret
2018-06-24 07:09:41 -07:00
AICompareSpeed:
2014-10-22 14:08:51 -07:00
; Return carry if enemy is faster than player.
2014-10-21 15:28:51 -07:00
2013-05-05 23:39:01 -07:00
push bc
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonSpeed + 1]
2013-05-05 23:39:01 -07:00
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonSpeed + 1]
2013-05-05 23:39:01 -07:00
cp b
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonSpeed]
2013-05-05 23:39:01 -07:00
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonSpeed]
2013-05-05 23:39:01 -07:00
sbc b
pop bc
ret
2018-06-24 07:09:41 -07:00
AICheckPlayerMaxHP:
2013-05-05 23:39:01 -07:00
push hl
push de
push bc
2018-01-23 14:39:09 -08:00
ld de, wBattleMonHP
ld hl, wBattleMonMaxHP
2013-05-06 11:33:19 -07:00
jr AICheckMaxHP
2013-05-05 23:39:01 -07:00
2018-06-24 07:09:41 -07:00
AICheckEnemyMaxHP:
2013-05-05 23:39:01 -07:00
push hl
push de
push bc
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonHP
ld hl, wEnemyMonMaxHP
2013-05-05 23:39:01 -07:00
; fallthrough
2018-06-24 07:09:41 -07:00
AICheckMaxHP:
2013-05-06 11:33:19 -07:00
; Return carry if hp at de matches max hp at hl.
2014-10-21 11:44:42 -07:00
2013-05-05 23:39:01 -07:00
ld a, [de]
inc de
cp [hl]
2020-06-29 09:25:58 -07:00
jr nz, .not_max
2013-05-05 23:39:01 -07:00
inc hl
ld a, [de]
cp [hl]
2020-06-29 09:25:58 -07:00
jr nz, .not_max
2013-05-05 23:39:01 -07:00
pop bc
pop de
pop hl
scf
ret
2020-06-29 09:25:58 -07:00
.not_max
2013-05-05 23:39:01 -07:00
pop bc
pop de
pop hl
and a
ret
2018-06-24 07:09:41 -07:00
AICheckPlayerHalfHP:
2013-05-05 23:39:01 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld hl, wBattleMonHP
2013-05-05 23:39:01 -07:00
ld b, [hl]
inc hl
ld c, [hl]
sla c
rl b
inc hl
inc hl
2013-05-05 23:39:01 -07:00
ld a, [hld]
cp c
ld a, [hl]
sbc b
pop hl
ret
2018-06-24 07:09:41 -07:00
AICheckEnemyHalfHP:
2013-05-05 23:39:01 -07:00
push hl
push de
push bc
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonHP
2013-05-05 23:39:01 -07:00
ld b, [hl]
inc hl
ld c, [hl]
sla c
rl b
inc hl
inc hl
2013-05-05 23:39:01 -07:00
ld a, [hld]
cp c
ld a, [hl]
sbc b
pop bc
pop de
pop hl
ret
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AICheckEnemyQuarterHP:
2013-05-05 23:39:01 -07:00
push hl
push de
push bc
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonHP
2013-05-05 23:39:01 -07:00
ld b, [hl]
inc hl
ld c, [hl]
sla c
rl b
sla c
rl b
inc hl
inc hl
2013-05-05 23:39:01 -07:00
ld a, [hld]
cp c
ld a, [hl]
sbc b
pop bc
pop de
pop hl
ret
2018-06-24 07:09:41 -07:00
AICheckPlayerQuarterHP:
2013-05-05 23:39:01 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld hl, wBattleMonHP
2013-05-05 23:39:01 -07:00
ld b, [hl]
inc hl
ld c, [hl]
sla c
rl b
sla c
rl b
inc hl
inc hl
2013-05-05 23:39:01 -07:00
ld a, [hld]
cp c
ld a, [hl]
sbc b
pop hl
ret
2018-06-24 07:09:41 -07:00
AIHasMoveEffect:
2013-05-06 21:58:35 -07:00
; Return carry if the enemy has move b.
2014-10-21 11:44:42 -07:00
2013-05-05 23:39:01 -07:00
push hl
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld c, NUM_MOVES
2013-05-05 23:39:01 -07:00
2013-05-06 21:58:35 -07:00
.checkmove
2013-05-05 23:39:01 -07:00
ld a, [hli]
and a
jr z, .no
2013-05-05 23:39:01 -07:00
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 23:39:01 -07:00
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
2013-05-05 23:39:01 -07:00
cp b
jr z, .yes
2013-05-05 23:39:01 -07:00
dec c
2013-05-06 21:58:35 -07:00
jr nz, .checkmove
2013-05-05 23:39:01 -07:00
.no
2013-05-05 23:39:01 -07:00
pop hl
and a
ret
.yes
2013-05-05 23:39:01 -07:00
pop hl
scf
ret
2018-06-24 07:09:41 -07:00
AIHasMoveInArray:
2013-05-06 21:58:35 -07:00
; Return carry if the enemy has a move in array hl.
2013-05-05 23:39:01 -07:00
push hl
push de
push bc
.next
2013-05-05 23:39:01 -07:00
ld a, [hli]
2020-05-07 08:09:41 -07:00
cp -1
jr z, .done
2013-05-05 23:39:01 -07:00
ld b, a
2020-06-29 09:25:58 -07:00
ld c, NUM_MOVES + 1
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2013-05-05 23:39:01 -07:00
.check
2013-05-05 23:39:01 -07:00
dec c
jr z, .next
2013-05-05 23:39:01 -07:00
ld a, [de]
inc de
cp b
jr nz, .check
2013-05-05 23:39:01 -07:00
scf
.done
2013-05-05 23:39:01 -07:00
pop bc
pop de
pop hl
ret
INCLUDE "data/battle/ai/useful_moves.asm"
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Opportunist:
2014-10-21 11:44:42 -07:00
; Discourage stall moves when the enemy's HP is low.
2013-05-06 11:33:19 -07:00
2014-10-21 11:44:42 -07:00
; Do nothing if enemy's HP is above 50%.
2013-05-06 11:33:19 -07:00
call AICheckEnemyHalfHP
2013-05-05 16:56:17 -07:00
ret c
; Discourage stall moves if enemy's HP is below 25%.
2013-05-06 11:33:19 -07:00
call AICheckEnemyQuarterHP
2020-06-29 09:25:58 -07:00
jr nc, .lowhp
2014-10-21 11:44:42 -07:00
; 50% chance to discourage stall moves if enemy's HP is between 25% and 50%.
call AI_50_50
2013-05-05 16:56:17 -07:00
ret c
2020-06-29 09:25:58 -07:00
.lowhp
2020-11-03 16:53:07 -08:00
ld hl, wEnemyAIMoveScores - 1
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld c, NUM_MOVES + 1
2013-05-06 11:33:19 -07:00
.checkmove
2013-05-05 16:56:17 -07:00
inc hl
dec c
2020-06-29 09:25:58 -07:00
jr z, .done
2013-05-05 16:56:17 -07:00
ld a, [de]
inc de
and a
2020-06-29 09:25:58 -07:00
jr z, .done
2013-05-05 16:56:17 -07:00
push hl
push de
push bc
ld hl, StallMoves
2013-05-05 16:56:17 -07:00
ld de, 1
call IsInArray
pop bc
pop de
pop hl
2013-05-06 11:33:19 -07:00
jr nc, .checkmove
2013-05-05 16:56:17 -07:00
inc [hl]
2013-05-06 11:33:19 -07:00
jr .checkmove
2013-05-05 16:56:17 -07:00
2020-06-29 09:25:58 -07:00
.done
2013-05-05 16:56:17 -07:00
ret
INCLUDE "data/battle/ai/stall_moves.asm"
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Aggressive:
2013-05-06 11:33:19 -07:00
; Use whatever does the most damage.
; Discourage all damaging moves but the one that does the most damage.
; If no damaging move deals damage to the player (immune),
; no move will be discouraged
2013-05-06 11:33:19 -07:00
; Figure out which attack does the most damage and put it in c.
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonMoves
2013-05-05 16:56:17 -07:00
ld bc, 0
ld de, 0
2013-05-06 11:33:19 -07:00
.checkmove
2013-05-05 16:56:17 -07:00
inc b
ld a, b
2020-06-29 09:25:58 -07:00
cp NUM_MOVES + 1
2013-05-06 11:33:19 -07:00
jr z, .gotstrongestmove
2013-05-05 16:56:17 -07:00
ld a, [hli]
and a
2013-05-06 11:33:19 -07:00
jr z, .gotstrongestmove
2013-05-05 16:56:17 -07:00
push hl
push de
push bc
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 11:33:19 -07:00
jr z, .nodamage
call AIDamageCalc
2013-05-05 16:56:17 -07:00
pop bc
pop de
pop hl
2013-05-06 11:33:19 -07:00
; Update current move if damage is highest so far
2018-01-23 14:39:09 -08:00
ld a, [wCurDamage + 1]
2013-05-05 16:56:17 -07:00
cp e
2018-01-23 14:39:09 -08:00
ld a, [wCurDamage]
2013-05-05 16:56:17 -07:00
sbc d
2013-05-06 11:33:19 -07:00
jr c, .checkmove
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wCurDamage + 1]
2013-05-05 16:56:17 -07:00
ld e, a
2018-01-23 14:39:09 -08:00
ld a, [wCurDamage]
2013-05-05 16:56:17 -07:00
ld d, a
ld c, b
2013-05-06 11:33:19 -07:00
jr .checkmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.nodamage
2013-05-05 16:56:17 -07:00
pop bc
pop de
pop hl
2013-05-06 11:33:19 -07:00
jr .checkmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.gotstrongestmove
; Nothing we can do if no attacks did damage.
2013-05-05 16:56:17 -07:00
ld a, c
and a
2013-05-06 11:33:19 -07:00
jr z, .done
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
; Discourage moves that do less damage unless they're reckless too.
2020-11-03 16:53:07 -08:00
ld hl, wEnemyAIMoveScores - 1
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2013-05-05 23:39:01 -07:00
ld b, 0
2013-05-06 11:33:19 -07:00
.checkmove2
2013-05-05 16:56:17 -07:00
inc b
ld a, b
2020-06-29 09:25:58 -07:00
cp NUM_MOVES + 1
2013-05-06 11:33:19 -07:00
jr z, .done
2013-05-05 16:56:17 -07:00
2014-10-21 11:44:42 -07:00
; Ignore this move if it is the highest damaging one.
2013-05-05 16:56:17 -07:00
cp c
ld a, [de]
inc de
inc hl
2013-05-06 11:33:19 -07:00
jr z, .checkmove2
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
2014-10-21 11:44:42 -07:00
; Ignore this move if its power is 0 or 1.
; Moves such as Seismic Toss, Hidden Power,
; Counter and Fissure have a base power of 1.
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-06 11:33:19 -07:00
cp 2
jr c, .checkmove2
2013-05-05 16:56:17 -07:00
; Ignore this move if it is reckless.
2013-05-05 16:56:17 -07:00
push hl
push de
push bc
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
ld hl, RecklessMoves
2013-05-05 16:56:17 -07:00
ld de, 1
call IsInArray
pop bc
pop de
pop hl
2013-05-06 11:33:19 -07:00
jr c, .checkmove2
2013-05-05 16:56:17 -07:00
; If we made it this far, discourage this move.
2013-05-05 16:56:17 -07:00
inc [hl]
2013-05-06 11:33:19 -07:00
jr .checkmove2
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.done
2013-05-05 16:56:17 -07:00
ret
INCLUDE "data/battle/ai/reckless_moves.asm"
2013-05-05 23:39:01 -07:00
2018-06-24 07:09:41 -07:00
AIDamageCalc:
2013-05-05 23:39:01 -07:00
ld a, 1
ldh [hBattleTurn], a
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
2013-05-05 23:39:01 -07:00
ld de, 1
ld hl, ConstantDamageEffects
2013-05-05 23:39:01 -07:00
call IsInArray
2020-06-29 09:25:58 -07:00
jr nc, .notconstant
2017-12-24 09:47:30 -08:00
callfar BattleCommand_ConstantDamage
2013-05-05 23:39:01 -07:00
ret
2020-06-29 09:25:58 -07:00
.notconstant
2017-12-24 09:47:30 -08:00
callfar EnemyAttackDamage
callfar BattleCommand_DamageCalc
callfar BattleCommand_Stab
2013-05-05 23:39:01 -07:00
ret
INCLUDE "data/battle/ai/constant_damage_effects.asm"
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Cautious:
; 90% chance to discourage moves with residual effects after the first turn.
2013-05-06 11:33:19 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wEnemyTurnsTaken]
2013-05-05 16:56:17 -07:00
and a
ret z
2020-11-03 16:53:07 -08:00
ld hl, wEnemyAIMoveScores - 1
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld c, NUM_MOVES + 1
.loop
2013-05-05 16:56:17 -07:00
inc hl
dec c
ret z
ld a, [de]
inc de
and a
ret z
push hl
push de
push bc
ld hl, ResidualMoves
2013-05-05 16:56:17 -07:00
ld de, 1
call IsInArray
pop bc
pop de
pop hl
2020-06-29 09:25:58 -07:00
jr nc, .loop
2013-05-05 16:56:17 -07:00
call Random
cp 90 percent + 1
2013-05-05 16:56:17 -07:00
ret nc
inc [hl]
2020-06-29 09:25:58 -07:00
jr .loop
2013-05-05 16:56:17 -07:00
INCLUDE "data/battle/ai/residual_moves.asm"
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Status:
2014-10-21 15:28:51 -07:00
; Dismiss status moves that don't affect the player.
2013-05-06 11:33:19 -07:00
2020-11-03 16:53:07 -08:00
ld hl, wEnemyAIMoveScores - 1
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld b, NUM_MOVES + 1
2013-05-06 11:33:19 -07:00
.checkmove
2013-05-05 16:56:17 -07:00
dec b
ret z
inc hl
ld a, [de]
and a
ret z
inc de
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
2013-05-05 16:56:17 -07:00
cp EFFECT_TOXIC
2013-05-06 11:33:19 -07:00
jr z, .poisonimmunity
2013-05-05 16:56:17 -07:00
cp EFFECT_POISON
2013-05-06 11:33:19 -07:00
jr z, .poisonimmunity
2013-05-05 16:56:17 -07:00
cp EFFECT_SLEEP
2013-05-06 11:33:19 -07:00
jr z, .typeimmunity
2013-05-05 16:56:17 -07:00
cp EFFECT_PARALYZE
2013-05-06 11:33:19 -07:00
jr z, .typeimmunity
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 11:33:19 -07:00
jr z, .checkmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
jr .typeimmunity
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.poisonimmunity
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType1]
2013-05-05 16:56:17 -07:00
cp POISON
2013-05-06 11:33:19 -07:00
jr z, .immune
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonType2]
2013-05-05 16:56:17 -07:00
cp POISON
2013-05-06 11:33:19 -07:00
jr z, .immune
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.typeimmunity
2013-05-05 16:56:17 -07:00
push hl
push bc
push de
ld a, 1
ldh [hBattleTurn], a
2017-12-24 09:47:30 -08:00
callfar BattleCheckTypeMatchup
2013-05-05 16:56:17 -07:00
pop de
pop bc
pop hl
ld a, [wTypeMatchup]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 11:33:19 -07:00
jr nz, .checkmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.immune
call AIDiscourageMove
jr .checkmove
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_Risky:
2014-10-21 15:28:51 -07:00
; Use any move that will KO the target.
; Risky moves will often be an exception (see below).
2013-05-06 11:33:19 -07:00
2020-11-03 16:53:07 -08:00
ld hl, wEnemyAIMoveScores - 1
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
2020-06-29 09:25:58 -07:00
ld c, NUM_MOVES + 1
2013-05-06 11:33:19 -07:00
.checkmove
2013-05-05 16:56:17 -07:00
inc hl
dec c
ret z
ld a, [de]
inc de
and a
ret z
push de
push bc
push hl
2013-05-06 11:33:19 -07:00
call AIGetEnemyMove
2013-05-05 16:56:17 -07:00
ld a, [wEnemyMoveStruct + MOVE_POWER]
2013-05-05 16:56:17 -07:00
and a
2013-05-06 11:33:19 -07:00
jr z, .nextmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
; Don't use risky moves at max hp.
ld a, [wEnemyMoveStruct + MOVE_EFFECT]
2013-05-05 16:56:17 -07:00
ld de, 1
ld hl, RiskyEffects
2013-05-05 16:56:17 -07:00
call IsInArray
2013-05-06 11:33:19 -07:00
jr nc, .checkko
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
call AICheckEnemyMaxHP
jr c, .nextmove
2013-05-05 16:56:17 -07:00
; Else, 80% chance to exclude them.
call Random
cp 79 percent - 1
2013-05-06 11:33:19 -07:00
jr c, .nextmove
2013-05-05 16:56:17 -07:00
2013-05-06 11:33:19 -07:00
.checkko
call AIDamageCalc
2013-05-05 16:56:17 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wCurDamage + 1]
2013-05-05 16:56:17 -07:00
ld e, a
2018-01-23 14:39:09 -08:00
ld a, [wCurDamage]
2013-05-05 16:56:17 -07:00
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonHP + 1]
2013-05-05 16:56:17 -07:00
cp e
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonHP]
2013-05-05 16:56:17 -07:00
sbc d
2013-05-06 11:33:19 -07:00
jr nc, .nextmove
2013-05-05 16:56:17 -07:00
pop hl
2015-07-20 19:18:18 -07:00
rept 5
2013-05-05 16:56:17 -07:00
dec [hl]
2015-07-20 19:18:18 -07:00
endr
2013-05-05 16:56:17 -07:00
push hl
2013-05-06 11:33:19 -07:00
.nextmove
2013-05-05 16:56:17 -07:00
pop hl
pop bc
pop de
2013-05-06 11:33:19 -07:00
jr .checkmove
2013-05-05 16:56:17 -07:00
INCLUDE "data/battle/ai/risky_effects.asm"
2013-05-05 16:56:17 -07:00
2018-06-24 07:09:41 -07:00
AI_None:
2013-05-05 16:56:17 -07:00
ret
2018-06-24 07:09:41 -07:00
AIDiscourageMove:
2013-05-05 23:39:01 -07:00
ld a, [hl]
add 10
ld [hl], a
ret
2018-06-24 07:09:41 -07:00
AIGetEnemyMove:
; Load attributes of move a into ram
2013-05-05 23:39:01 -07:00
push hl
push de
push bc
dec a
ld hl, Moves
ld bc, MOVE_LENGTH
2013-05-05 23:39:01 -07:00
call AddNTimes
ld de, wEnemyMoveStruct
2013-05-05 23:39:01 -07:00
ld a, BANK(Moves)
call FarCopyBytes
pop bc
pop de
pop hl
ret
2018-06-24 07:09:41 -07:00
AI_80_20:
call Random
cp 20 percent - 1
2013-05-05 23:39:01 -07:00
ret
2018-06-24 07:09:41 -07:00
AI_50_50:
call Random
cp 50 percent + 1
2013-05-05 23:39:01 -07:00
ret