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