AI_Basic: ; 38591 ; 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 ld hl, Buffer1 - 1 ld de, EnemyMonMoves ld b, EnemyMonMovesEnd - EnemyMonMoves + 1 .checkmove dec b ret z inc hl ld a, [de] and a ret z inc de call AIGetEnemyMove ld a, [wEnemyMoveStruct + MOVE_EFFECT] ld c, a ; Dismiss moves with special effects if they are ; useless or not a good choice right now. ; For example, healing moves, weather moves, Dream Eater... push hl push de push bc callba AI_Redundant pop bc pop de pop hl jr nz, .discourage ; Dismiss status-only moves if the player can't be statused. ld a, [wEnemyMoveStruct + MOVE_EFFECT] push hl push de push bc ld hl, .statusonlyeffects ld de, 1 call IsInArray pop bc pop de pop hl jr nc, .checkmove ld a, [BattleMonStatus] and a jr nz, .discourage ; Dismiss Safeguard if it's already active. 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 AI_Setup: ; 385e0 ; Use stat-modifying moves on turn 1. ; 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. ; Almost 90% chance to greatly discourage stat-modifying moves otherwise. ld hl, Buffer1 - 1 ld de, EnemyMonMoves ld b, EnemyMonMovesEnd - EnemyMonMoves + 1 .checkmove dec b ret z inc hl ld a, [de] and a ret z inc de call AIGetEnemyMove ld a, [wEnemyMoveStruct + MOVE_EFFECT] cp EFFECT_ATTACK_UP jr c, .checkmove cp EFFECT_EVASION_UP + 1 jr c, .statup ; cp EFFECT_ATTACK_DOWN - 1 jr z, .checkmove cp EFFECT_EVASION_DOWN + 1 jr c, .statdown cp EFFECT_ATTACK_UP_2 jr c, .checkmove cp EFFECT_EVASION_UP_2 + 1 jr c, .statup ; cp EFFECT_ATTACK_DOWN_2 - 1 jr z, .checkmove cp EFFECT_EVASION_DOWN_2 + 1 jr c, .statdown jr .checkmove .statup ld a, [EnemyTurnsTaken] and a jr nz, .discourage jr .encourage .statdown ld a, [PlayerTurnsTaken] and a jr nz, .discourage .encourage call AI_50_50 jr c, .checkmove dec [hl] dec [hl] jr .checkmove .discourage call Random cp 30 jr c, .checkmove inc [hl] inc [hl] jr .checkmove ; 38635 AI_Types: ; 38635 ; Dismiss any move that the player is immune to. ; Encourage super-effective moves. ; Discourage not very effective moves unless ; all damaging moves are of the same type. 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 BattleCheckTypeMatchup pop de pop bc pop hl ld a, [wd265] and a jr z, .immune cp 10 ; 1.0 jr z, .checkmove jr c, .noteffective ; effective ld a, [wEnemyMoveStruct + MOVE_POWER] and a jr z, .checkmove dec [hl] jr .checkmove .noteffective ; Discourage this move if there are any moves ; that do damage of a different type. push hl push de push bc ld a, [wEnemyMoveStruct + MOVE_TYPE] ld d, a ld hl, EnemyMonMoves ld b, EnemyMonMovesEnd - EnemyMonMoves + 1 ld c, 0 .checkmove2 dec b jr z, .asm_38693 ld a, [hli] and a jr z, .asm_38693 call AIGetEnemyMove ld a, [wEnemyMoveStruct + MOVE_TYPE] cp d jr z, .checkmove2 ld a, [wEnemyMoveStruct + MOVE_POWER] and a jr nz, .asm_38692 jr .checkmove2 .asm_38692 ld c, a .asm_38693 ld a, c pop bc pop de pop hl and a jr z, .checkmove inc [hl] jr .checkmove .immune call AIDiscourageMove jr .checkmove ; 386a2 AI_Offensive: ; 386a2 ; Greatly discourage non-damaging moves. ld hl, Buffer1 - 1 ld de, EnemyMonMoves ld b, EnemyMonMovesEnd - EnemyMonMoves + 1 .checkmove dec b ret z inc hl ld a, [de] and a ret z inc de call AIGetEnemyMove ld a, [wEnemyMoveStruct + MOVE_POWER] and a jr nz, .checkmove inc [hl] inc [hl] jr .checkmove ; 386be AI_Smart: ; 386be ; Context-specific scoring. ld hl, Buffer1 ld de, EnemyMonMoves ld b, EnemyMonMovesEnd - EnemyMonMoves + 1 .checkmove dec b ret z ld a, [de] inc de and a ret z push de push bc push hl call AIGetEnemyMove ld a, [wEnemyMoveStruct + MOVE_EFFECT] ld hl, .table_386f2 ld de, 3 call IsInArray inc hl jr nc, .nextmove ld a, [hli] ld e, a ld d, [hl] pop hl push hl ld bc, .nextmove push bc push de ret .nextmove pop hl pop bc pop de inc hl jr .checkmove .table_386f2 dbw EFFECT_SLEEP, AI_Smart_Sleep dbw EFFECT_LEECH_HIT, AI_Smart_LeechHit dbw EFFECT_EXPLOSION, AI_Smart_Explosion 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_HAZE, AI_Smart_Haze dbw EFFECT_BIDE, AI_Smart_Bide dbw EFFECT_WHIRLWIND, AI_Smart_Whirlwind 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_BIND, AI_Smart_Bind 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 db $ff ; 387e3 AI_Smart_Sleep: ; 387e3 ; Greatly encourage sleep inducing moves if the enemy has either Dream Eater or Nightmare. ; 50% chance to greatly encourage sleep inducing moves otherwise. ld b, EFFECT_DREAM_EATER call AIHasMoveEffect jr c, .asm_387f0 ld b, EFFECT_NIGHTMARE call AIHasMoveEffect ret nc .asm_387f0 call AI_50_50 ret c dec [hl] dec [hl] ret ; 387f7 AI_Smart_LeechHit: ; 387f7 push hl ld a, 1 ld [hBattleTurn], a callab BattleCheckTypeMatchup pop hl ; 60% chance to discourage this move if not very effective. ld a, [wd265] cp 10 ; 1.0 jr c, .asm_38815 ; Do nothing if effectiveness is neutral. ret z ; Do nothing if enemy's HP is full. call AICheckEnemyMaxHP ret c ; 80% chance to encourage this move otherwise. call AI_80_20 ret c dec [hl] ret .asm_38815 call Random cp 100 ret c inc [hl] ret ; 3881d AI_Smart_LockOn: ; 3881d ld a, [PlayerSubStatus5] bit SUBSTATUS_LOCK_ON, a jr nz, .asm_38882 push hl call AICheckEnemyQuarterHP jr nc, .asm_38877 call AICheckEnemyHalfHP jr c, .asm_38834 call AICompareSpeed jr nc, .asm_38877 .asm_38834 ld a, [PlayerEvaLevel] cp $a jr nc, .asm_3887a cp $8 jr nc, .asm_38875 ld a, [EnemyAccLevel] cp $5 jr c, .asm_3887a cp $7 jr c, .asm_38875 ld hl, EnemyMonMoves ld c, EnemyMonMovesEnd - EnemyMonMoves + 1 .asm_3884f dec c jr z, .asm_38877 ld a, [hli] and a jr z, .asm_38877 call AIGetEnemyMove ld a, [wEnemyMoveStruct + MOVE_ACC] cp 180 jr nc, .asm_3884f ld a, $1 ld [hBattleTurn], a push hl push bc callba BattleCheckTypeMatchup ld a, [wd265] 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 AI_50_50 ret c dec [hl] dec [hl] ret .asm_38882 push hl ld hl, Buffer1 - 1 ld de, EnemyMonMoves ld c, EnemyMonMovesEnd - EnemyMonMoves + 1 .asm_3888b inc hl dec c jr z, .asm_388a2 ld a, [de] and a jr z, .asm_388a2 inc de call AIGetEnemyMove ld a, [wEnemyMoveStruct + MOVE_ACC] cp 180 jr nc, .asm_3888b dec [hl] dec [hl] jr .asm_3888b .asm_388a2 pop hl jp AIDiscourageMove ; 388a6 AI_Smart_Explosion: ; 388a6 ; Selfdestruct, Explosion ; Unless this is the enemy's last Pokemon... push hl callba FindAliveEnemyMons pop hl jr nc, .asm_388b7 ; ...greatly discourage this move unless this is the player's last Pokemon too. push hl call AICheckLastPlayerMon pop hl jr nz, .asm_388c6 .asm_388b7 ; Greatly discourage this move if enemy's HP is above 50%. call AICheckEnemyHalfHP jr c, .asm_388c6 ; Do nothing if enemy's HP is below 25%. call AICheckEnemyQuarterHP ret nc ; If enemy's HP is between 25% and 50%, ; over 90% chance to greatly discourage this move. call Random cp 20 ret c .asm_388c6 inc [hl] inc [hl] inc [hl] ret ; 388ca AI_Smart_DreamEater: ; 388ca ; 90% chance to greatly encourage this move. ; The AI_Basic layer will make sure that ; Dream Eater is only used against sleeping targets. call Random cp 25 ret c dec [hl] dec [hl] dec [hl] ret ; 388d4 AI_Smart_EvasionUp: ; 388d4 ; Dismiss this move if enemy's evasion can't raise anymore. ld a, [EnemyEvaLevel] cp $d jp nc, AIDiscourageMove ; If enemy's HP is full... call AICheckEnemyMaxHP jr nc, .asm_388f2 ; ...greatly encourage this move if player is badly poisoned. ld a, [PlayerSubStatus5] bit SUBSTATUS_TOXIC, a jr nz, .asm_388ef ; ...70% chance to greatly encourage this move if player is not badly poisoned. call Random cp $b2 jr nc, .asm_38911 .asm_388ef dec [hl] dec [hl] ret .asm_388f2 ; Greatly discourage this move if enemy's HP is below 25%. call AICheckEnemyQuarterHP jr nc, .asm_3890f ; If enemy's HP is above 25% but not full, 4% chance to greatly encourage this move. call Random cp $a jr c, .asm_388ef ; If enemy's HP is between 25% and 50%,... call AICheckEnemyHalfHP jr nc, .asm_3890a ; If enemy's HP is above 50% but not full, 20% chance to greatly encourage this move. call AI_80_20 jr c, .asm_388ef jr .asm_38911 .asm_3890a ; ...50% chance to greatly discourage this move. call AI_50_50 jr c, .asm_38911 .asm_3890f inc [hl] inc [hl] ; 30% chance to end up here if enemy's HP is full and player is not badly poisoned. ; 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. .asm_38911 ld a, [PlayerSubStatus5] bit SUBSTATUS_TOXIC, a jr nz, .asm_38938 ld a, [PlayerSubStatus4] bit SUBSTATUS_LEECH_SEED, a jr nz, .asm_38941 ; Discourage this move if enemy's evasion level is higher than player's accuracy level. ld a, [EnemyEvaLevel] ld b, a ld a, [PlayerAccLevel] cp b jr c, .asm_38936 ; Greatly encourage this move if the player is in the middle of Fury Cutter or Rollout. ld a, [PlayerFuryCutterCount] and a jr nz, .asm_388ef ld a, [PlayerSubStatus1] bit SUBSTATUS_ROLLOUT, a jr nz, .asm_388ef .asm_38936 inc [hl] ret ; Player is badly poisoned. ; 80% chance to greatly encourage this move. ; This would counter any previous discouragement. .asm_38938 call Random cp $50 ret c dec [hl] dec [hl] ret ; Player is seeded. ; 50% chance to encourage this move. ; This would partly counter any previous discouragement. .asm_38941 call AI_50_50 ret c dec [hl] ret ; 38947 AI_Smart_AlwaysHit: ; 38947 ; 80% chance to greatly encourage this move if either... ; ...enemy's accuracy level has been lowered three or more stages ld a, [EnemyAccLevel] cp $5 jr c, .asm_38954 ; ...or player's evasion level has been raised three or more stages. ld a, [PlayerEvaLevel] cp $a ret c .asm_38954 call AI_80_20 ret c dec [hl] dec [hl] ret ; 3895b AI_Smart_MirrorMove: ; 3895b ; If the player did not use any move last turn... ld a, [LastEnemyCounterMove] and a jr nz, .asm_38968 ; ...do nothing if enemy is slower than player call AICompareSpeed ret nc ; ...or dismiss this move if enemy is faster than player. jp AIDiscourageMove ; If the player did use a move last turn... .asm_38968 push hl ld hl, UsefulMoves ld de, 1 call IsInArray pop hl ; ...do nothing if he didn't use a useful move. ret nc ; If he did, 50% chance to encourage this move... call AI_50_50 ret c dec [hl] ; ...and 90% chance to encourage this move again if the enemy is faster. call AICompareSpeed ret nc call Random cp $19 ret c dec [hl] ret ; 38985 AI_Smart_AccuracyDown: ; 38985 ; If player's HP is full... call AICheckPlayerMaxHP jr nc, .asm_389a0 ; ...and enemy's HP is above 50%... call AICheckEnemyHalfHP jr nc, .asm_389a0 ; ...greatly encourage this move if player is badly poisoned. ld a, [PlayerSubStatus5] bit SUBSTATUS_TOXIC, a jr nz, .asm_3899d ; ...70% chance to greatly encourage this move if player is not badly poisoned. call Random cp $b2 jr nc, .asm_389bf .asm_3899d dec [hl] dec [hl] ret .asm_389a0 ; Greatly discourage this move if player's HP is below 25%. call AICheckPlayerQuarterHP jr nc, .asm_389bd ; If player's HP is above 25% but not full, 4% chance to greatly encourage this move. call Random cp $a jr c, .asm_3899d ; If player's HP is between 25% and 50%,... call AICheckPlayerHalfHP jr nc, .asm_389b8 ; If player's HP is above 50% but not full, 20% chance to greatly encourage this move. call AI_80_20 jr c, .asm_3899d jr .asm_389bf ; ...50% chance to greatly discourage this move. .asm_389b8 call AI_50_50 jr c, .asm_389bf .asm_389bd inc [hl] inc [hl] ; We only end up here if the move has not been already encouraged. .asm_389bf ld a, [PlayerSubStatus5] bit SUBSTATUS_TOXIC, a jr nz, .asm_389e6 ld a, [PlayerSubStatus4] bit SUBSTATUS_LEECH_SEED, a jr nz, .asm_389ef ; Discourage this move if enemy's evasion level is higher than player's accuracy level. ld a, [EnemyEvaLevel] ld b, a ld a, [PlayerAccLevel] cp b jr c, .asm_389e4 ; Greatly encourage this move if the player is in the middle of Fury Cutter or Rollout. ld a, [PlayerFuryCutterCount] and a jr nz, .asm_3899d ld a, [PlayerSubStatus1] bit SUBSTATUS_ROLLOUT, a jr nz, .asm_3899d .asm_389e4 inc [hl] ret ; Player is badly poisoned. ; 80% chance to greatly encourage this move. ; This would counter any previous discouragement. .asm_389e6 call Random cp $50 ret c dec [hl] dec [hl] ret ; Player is seeded. ; 50% chance to encourage this move. ; This would partly counter any previous discouragement. .asm_389ef call AI_50_50 ret c dec [hl] ret ; 389f5 AI_Smart_Haze: ; 389f5 ; 85% chance to encourage this move if any of enemy's stat levels is lower than -2. 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 ; 85% chance to encourage this move if any of player's stat levels is higher than +2. .asm_38a05 ld hl, PlayerAtkLevel ld c, $8 .asm_38a0a dec c jr z, .asm_38a1b ld a, [hli] cp $a jr c, .asm_38a0a .asm_38a12 pop hl call Random cp $28 ret c dec [hl] ret ; Discourage this move if neither: ; Any of enemy's stat levels is lower than -2. ; Any of player's stat levels is higher than +2. .asm_38a1b pop hl inc [hl] ret ; 38a1e AI_Smart_Bide: ; 38a1e ; 90% chance to discourage this move unless enemy's HP is full. call AICheckEnemyMaxHP ret c call Random cp $19 ret c inc [hl] ret ; 38a2a AI_Smart_Whirlwind: ; 38a2a ; Whirlwind, Roar. ; Discourage this move if the player has not shown ; a super-effective move against the enemy. ; Consider player's type(s) if its moves are unknown. push hl callab CheckPlayerMoveTypeMatchups ld a, [wEnemyAISwitchScore] cp 10 ; neutral pop hl ret c inc [hl] ret ; 38a3a AI_Smart_Heal: AI_Smart_MorningSun: AI_Smart_Synthesis: AI_Smart_Moonlight: ; 38a3a ; 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. call AICheckEnemyQuarterHP jr nc, .asm_38a45 call AICheckEnemyHalfHP ret nc inc [hl] ret .asm_38a45 call Random cp $19 ret c dec [hl] dec [hl] ret ; 38a4e AI_Smart_Toxic: AI_Smart_LeechSeed: ; 38a4e ; Discourage this move if player's HP is below 50%. call AICheckPlayerHalfHP ret c inc [hl] ret ; 38a54 AI_Smart_LightScreen: AI_Smart_Reflect: ; 38a54 ; Over 90% chance to discourage this move unless enemy's HP is full. call AICheckEnemyMaxHP ret c call Random cp $14 ret c inc [hl] ret ; 38a60 AI_Smart_Ohko: ; 38a60 ; Dismiss this move if player's level is higher than enemy's level. ; Else, discourage this move is player's HP is below 50%. ld a, [BattleMonLevel] ld b, a ld a, [EnemyMonLevel] cp b jp c, AIDiscourageMove call AICheckPlayerHalfHP ret c inc [hl] ret ; 38a71 AI_Smart_Bind: ; 38a71 ; Bind, Wrap, Fire Spin, Clamp ; 50% chance to discourage this move if the player is already trapped. ld a, [wPlayerWrapCount] and a jr nz, .asm_38a8b ; 50% chance to greatly encourage this move if player is either ; badly poisoned, in love, identified, stuck in Rollout, or has a Nightmare. ld a, [PlayerSubStatus5] bit SUBSTATUS_TOXIC, a jr nz, .asm_38a91 ld a, [PlayerSubStatus1] and 1< player's current HP]. push hl ld hl, EnemyMonHP ld b, [hl] inc hl ld c, [hl] sla c rl b ld hl, BattleMonHP + 1 ld a, [hld] cp c ld a, [hl] sbc b pop hl ret nc inc [hl] ret ; 38cba AI_Smart_Snore: AI_Smart_SleepTalk: ; 38cba ; Greatly encourage this move if enemy is fast asleep. ; Greatly discourage this move otherwise. 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 AI_Smart_DefrostOpponent: ; 38ccb ; Greatly encourage this move if enemy is frozen. ; No move has EFFECT_DEFROST_OPPONENT, so this layer is unused. ld a, [EnemyMonStatus] and $20 ret z dec [hl] dec [hl] dec [hl] ret ; 38cd5 AI_Smart_Spite: ; 38cd5 ld a, [LastEnemyCounterMove] and a jr nz, .asm_38ce7 call AICompareSpeed jp c, AIDiscourageMove call AI_50_50 ret c inc [hl] ret .asm_38ce7 push hl ld b, a ld c, 4 ld hl, BattleMonMoves ld de, BattleMonPP .asm_38cf1 ld a, [hli] cp b jr z, .asm_38cfb inc de dec c jr nz, .asm_38cf1 pop hl ret .asm_38cfb pop hl ld a, [de] cp $6 jr c, .asm_38d0d cp $f jr nc, .asm_38d0b call Random cp $64 ret nc .asm_38d0b inc [hl] ret .asm_38d0d call Random cp $64 ret c dec [hl] dec [hl] ret ; 38d16 Function_0x38d16; 38d16 jp AIDiscourageMove ; 38d19 AI_Smart_DestinyBond: AI_Smart_Reversal: AI_Smart_SkullBash: ; 38d19 ; Discourage this move if enemy's HP is above 25%. call AICheckEnemyQuarterHP ret nc inc [hl] ret ; 38d1f AI_Smart_HealBell: ; 38d1f ; 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. push hl ld a, [OTPartyCount] ld b, a ld c, 0 ld hl, OTPartyMon1HP ld de, PARTYMON_STRUCT_LENGTH .loop push hl ld a, [hli] or [hl] jr z, .next ; status dec hl dec hl dec hl ld a, [hl] or c ld c, a .next pop hl add hl, de dec b jr nz, .loop pop hl ld a, c and a jr z, .no_status ld a, [EnemyMonStatus] and a jr z, .ok dec [hl] .ok and 1 << FRZ | SLP ret z call AI_50_50 ret c dec [hl] dec [hl] ret .no_status ld a, [EnemyMonStatus] and a ret nz jp AIDiscourageMove ; 38d5a AI_Smart_PriorityHit: ; 38d5a call AICompareSpeed ret c ; Dismiss this move if the player is flying or underground. ld a, [PlayerSubStatus3] and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND jp nz, AIDiscourageMove ; Greatly encourage this move if it will KO the player. ld a, $1 ld [hBattleTurn], a push hl callab EnemyAttackDamage callab BattleCommand_DamageCalc callab BattleCommand_Stab pop hl ld a, [CurDamage + 1] ld c, a ld a, [CurDamage] ld b, a ld a, [BattleMonHP + 1] cp c ld a, [BattleMonHP] sbc b ret nc dec [hl] dec [hl] dec [hl] ret ; 38d93 AI_Smart_Thief: ; 38d93 ; Don't use Thief unless it's the only move available. ld a, [hl] add $1e ld [hl], a ret ; 38d98 AI_Smart_Conversion2: ; 38d98 ld a, [LastPlayerMove] and a jr nz, .asm_38dc9 push hl dec a ld hl, Moves + MOVE_TYPE ld bc, MOVE_LENGTH call AddNTimes ld a, BANK(Moves) call GetFarByte ld [wPlayerMoveStruct + MOVE_TYPE], a xor a ld [hBattleTurn], a callab BattleCheckTypeMatchup ld a, [wd265] cp $a pop hl jr c, .asm_38dc9 ret z call AI_50_50 ret c dec [hl] ret .asm_38dc9 call Random cp 25 ret c inc [hl] ret ; 38dd1 AI_Smart_Disable: ; 38dd1 call AICompareSpeed jr nc, .asm_38df3 push hl ld a, [LastEnemyCounterMove] ld hl, UsefulMoves ld de, 1 call IsInArray pop hl jr nc, .asm_38dee call Random cp 100 ret c dec [hl] ret .asm_38dee ld a, [wEnemyMoveStruct + MOVE_POWER] and a ret nz .asm_38df3 call Random cp 20 ret c inc [hl] ret ; 38dfb AI_Smart_MeanLook: ; 38dfb call AICheckEnemyHalfHP jr nc, .asm_38e24 push hl call AICheckLastPlayerMon pop hl jp z, AIDiscourageMove ; 80% chance to greatly encourage this move if the enemy is badly poisoned (weird). ld a, [EnemySubStatus5] bit SUBSTATUS_TOXIC, a jr nz, .asm_38e26 ; 80% chance to greatly encourage this move if the player is either ; in love, identified, stuck in Rollout, or has a Nightmare. ld a, [PlayerSubStatus1] and 1<