diff options
author | Remy Oukaour <remy.oukaour@gmail.com> | 2017-12-26 17:47:05 -0500 |
---|---|---|
committer | Remy Oukaour <remy.oukaour@gmail.com> | 2017-12-26 17:47:05 -0500 |
commit | b5417fafec7dd37cb4be391f3bd3d4541a2a381e (patch) | |
tree | a4e7d08afb2e862186a138e82c8ef4785d82786d /battle/ai/scoring.asm | |
parent | 2f98c2032fd47ada3484bfc37d590992f286d3d4 (diff) |
Split battle/ into data/ and engine/ components
Diffstat (limited to 'battle/ai/scoring.asm')
-rw-r--r-- | battle/ai/scoring.asm | 3598 |
1 files changed, 0 insertions, 3598 deletions
diff --git a/battle/ai/scoring.asm b/battle/ai/scoring.asm deleted file mode 100644 index 44194d6f7..000000000 --- a/battle/ai/scoring.asm +++ /dev/null @@ -1,3598 +0,0 @@ -AIScoring: ; 38591 - -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 - farcall 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 12 percent - 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 - callfar 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_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 - 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 - callfar 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 39 percent + 1 - 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 - farcall 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_Selfdestruct: ; 388a6 -; Selfdestruct, Explosion - -; Unless this is the enemy's last Pokemon... - push hl - farcall 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 9 percent - 2 - 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 10 percent - 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 70 percent - 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 4 percent - 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. -; 70% chance to greatly encourage this move. -; This would counter any previous discouragement. -.asm_38938 - call Random - cp 31 percent + 1 - 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, [LastPlayerCounterMove] - 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 10 percent - 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 70 percent - 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 4 percent - 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. -; 70% chance to greatly encourage this move. -; This would counter any previous discouragement. -.asm_389e6 - call Random - cp 31 percent + 1 - 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_ResetStats: ; 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 16 percent - 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 10 percent - ret c - inc [hl] - ret -; 38a2a - - -AI_Smart_ForceSwitch: ; 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 - callfar 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 10 percent - 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 8 percent - 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_TrapTarget: ; 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<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ROLLOUT | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE - jr nz, .asm_38a91 - -; Else, 50% chance to greatly encourage this move if it's the player's Pokemon first turn. - ld a, [PlayerTurnsTaken] - and a - jr z, .asm_38a91 - -; 50% chance to discourage this move otherwise. -.asm_38a8b - call AI_50_50 - ret c - inc [hl] - ret - -.asm_38a91 - call AICheckEnemyQuarterHP - ret nc - call AI_50_50 - ret c - dec [hl] - dec [hl] - ret -; 38a9c - - -AI_Smart_RazorWind: -AI_Smart_Unused2B: ; 38a9c - ld a, [EnemySubStatus1] - bit SUBSTATUS_PERISH, a - jr z, .asm_38aaa - - ld a, [EnemyPerishCount] - cp 3 - jr c, .asm_38ad3 - -.asm_38aaa - push hl - ld hl, PlayerUsedMoves - ld c, 4 - -.asm_38ab0 - ld a, [hli] - and a - jr z, .asm_38ac1 - - call AIGetEnemyMove - - ld a, [wEnemyMoveStruct + MOVE_EFFECT] - cp EFFECT_PROTECT - jr z, .asm_38ad5 - dec c - jr nz, .asm_38ab0 - -.asm_38ac1 - pop hl - ld a, [EnemySubStatus3] - bit SUBSTATUS_CONFUSED, a - jr nz, .asm_38acd - - call AICheckEnemyHalfHP - ret c - -.asm_38acd - call Random - cp 79 percent - 1 - ret c - -.asm_38ad3 - inc [hl] - ret - -.asm_38ad5 - pop hl - ld a, [hl] - add 6 - ld [hl], a - ret -; 38adb - - -AI_Smart_Confuse: ; 38adb - -; 90% chance to discourage this move if player's HP is between 25% and 50%. - call AICheckPlayerHalfHP - ret c - call Random - cp 10 percent - jr c, .asm_38ae7 - inc [hl] - -.asm_38ae7 -; Discourage again if player's HP is below 25%. - call AICheckPlayerQuarterHP - ret c - inc [hl] - ret -; 38aed - - -AI_Smart_SpDefenseUp2: ; 38aed - -; Discourage this move if enemy's HP is lower than 50%. - call AICheckEnemyHalfHP - jr nc, .asm_38b10 - -; Discourage this move if enemy's special defense level is higher than +3. - ld a, [EnemySDefLevel] - cp $b - jr nc, .asm_38b10 - -; 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. - cp $9 - ret nc - - ld a, [BattleMonType1] - cp SPECIAL - jr nc, .asm_38b09 - ld a, [BattleMonType2] - cp SPECIAL - ret c - -.asm_38b09 - call AI_80_20 - ret c - dec [hl] - dec [hl] - ret - -.asm_38b10 - inc [hl] - ret -; 38b12 - - -AI_Smart_Fly: ; 38b12 -; Fly, Dig - -; Greatly encourage this move if the player is -; flying or underground, and slower than the enemy. - - ld a, [PlayerSubStatus3] - and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND - ret z - - call AICompareSpeed - ret nc - - dec [hl] - dec [hl] - dec [hl] - ret -; 38b20 - - -AI_Smart_SuperFang: ; 38b20 -; Discourage this move if player's HP is below 25%. - - call AICheckPlayerQuarterHP - ret c - inc [hl] - ret -; 38b26 - - -AI_Smart_Paralyze: ; 38b26 - -; 50% chance to discourage this move if player's HP is below 25%. - call AICheckPlayerQuarterHP - jr nc, .asm_38b3a - -; 80% chance to greatly encourage this move -; if enemy is slower than player and its HP is above 25%. - call AICompareSpeed - ret c - call AICheckEnemyQuarterHP - ret nc - call AI_80_20 - ret c - dec [hl] - dec [hl] - ret - -.asm_38b3a - call AI_50_50 - ret c - inc [hl] - ret -; 38b40 - - -AI_Smart_SpeedDownHit: ; 38b40 -; 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] - cp ICY_WIND - ret nz - call AICheckEnemyQuarterHP - ret nc - ld a, [PlayerTurnsTaken] - and a - ret nz - call AICompareSpeed - ret c - call Random - cp 12 percent - ret c - dec [hl] - dec [hl] - ret -; 38b5c - - -AI_Smart_Substitute: ; 38b5c -; Dismiss this move if enemy's HP is below 50%. - - call AICheckEnemyHalfHP - ret c - jp AIDiscourageMove -; 38b63 - - -AI_Smart_HyperBeam: ; 38b63 - call AICheckEnemyHalfHP - jr c, .asm_38b72 - -; 50% chance to encourage this move if enemy's HP is below 25%. - call AICheckEnemyQuarterHP - ret c - call AI_50_50 - ret c - dec [hl] - ret - -.asm_38b72 -; If enemy's HP is above 50%, discourage this move at random - call Random - cp 16 percent - ret c - inc [hl] - call AI_50_50 - ret c - inc [hl] - ret -; 38b7f - - -AI_Smart_Rage: ; 38b7f - ld a, [EnemySubStatus4] - bit SUBSTATUS_RAGE, a - jr z, .asm_38b9b - -; If enemy's Rage is building, 50% chance to encourage this move. - call AI_50_50 - jr c, .asm_38b8c - - dec [hl] - -; Encourage this move based on Rage's counter. -.asm_38b8c - ld a, [wEnemyRageCounter] - cp $2 - ret c - dec [hl] - ld a, [wEnemyRageCounter] - cp $3 - ret c - dec [hl] - ret - -.asm_38b9b -; If enemy's Rage is not building, discourage this move if enemy's HP is below 50%. - call AICheckEnemyHalfHP - jr nc, .asm_38ba6 - -; 50% chance to encourage this move otherwise. - call AI_80_20 - ret nc - dec [hl] - ret - -.asm_38ba6 - inc [hl] - ret -; 38ba8 - - -AI_Smart_Mimic: ; 38ba8 - ld a, [LastPlayerCounterMove] - and a - jr z, .asm_38be9 - - call AICheckEnemyHalfHP - jr nc, .asm_38bef - - push hl - ld a, [LastPlayerCounterMove] - call AIGetEnemyMove - - ld a, $1 - ld [hBattleTurn], a - callfar BattleCheckTypeMatchup - - ld a, [wd265] - cp $a - pop hl - jr c, .asm_38bef - jr z, .asm_38bd4 - - call AI_50_50 - jr c, .asm_38bd4 - - dec [hl] - -.asm_38bd4 - ld a, [LastPlayerCounterMove] - push hl - ld hl, UsefulMoves - ld de, 1 - call IsInArray - - pop hl - ret nc - call AI_50_50 - ret c - dec [hl] - ret - -.asm_38be9 - call AICompareSpeed - jp c, AIDiscourageMove - -.asm_38bef - inc [hl] - ret -; 38bf1 - - -AI_Smart_Counter: ; 38bf1 - push hl - ld hl, PlayerUsedMoves - ld c, 4 - ld b, 0 - -.asm_38bf9 - ld a, [hli] - and a - jr z, .asm_38c0e - - call AIGetEnemyMove - - ld a, [wEnemyMoveStruct + MOVE_POWER] - and a - jr z, .asm_38c0e - - ld a, [wEnemyMoveStruct + MOVE_TYPE] - cp SPECIAL - jr nc, .asm_38c0e - - inc b - -.asm_38c0e - dec c - jr nz, .asm_38bf9 - - pop hl - ld a, b - and a - jr z, .asm_38c39 - - cp $3 - jr nc, .asm_38c30 - - ld a, [LastPlayerCounterMove] - and a - jr z, .asm_38c38 - - call AIGetEnemyMove - - ld a, [wEnemyMoveStruct + MOVE_POWER] - and a - jr z, .asm_38c38 - - ld a, [wEnemyMoveStruct + MOVE_TYPE] - cp SPECIAL - jr nc, .asm_38c38 - - -.asm_38c30 - call Random - cp 39 percent + 1 - jr c, .asm_38c38 - - dec [hl] - -.asm_38c38 - ret - -.asm_38c39 - inc [hl] - ret -; 38c3b - - -AI_Smart_Encore: ; 38c3b - call AICompareSpeed - jr nc, .asm_38c81 - - ld a, [LastPlayerMove] - and a - jp z, AIDiscourageMove - - call AIGetEnemyMove - - ld a, [wEnemyMoveStruct + MOVE_POWER] - and a - jr z, .asm_38c68 - - push hl - ld a, [wEnemyMoveStruct + MOVE_TYPE] - ld hl, EnemyMonType1 - predef CheckTypeMatchup - - pop hl - ld a, [wd265] - cp $a - jr nc, .asm_38c68 - - and a - ret nz - jr .asm_38c78 - -.asm_38c68 - push hl - ld a, [LastPlayerCounterMove] - ld hl, .EncoreMoves - ld de, 1 - call IsInArray - pop hl - jr nc, .asm_38c81 - -.asm_38c78 - call Random - cp 28 percent - 1 - ret c - dec [hl] - dec [hl] - ret - -.asm_38c81 - inc [hl] - inc [hl] - inc [hl] - ret - -.EncoreMoves: - 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 - - -AI_Smart_PainSplit: ; 38ca4 -; Discourage this move if [enemy's current HP * 2 > 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, [LastPlayerCounterMove] - 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 39 percent + 1 - ret nc - -.asm_38d0b - inc [hl] - ret - -.asm_38d0d - call Random - cp 39 percent + 1 - 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 - callfar EnemyAttackDamage - callfar BattleCommand_DamageCalc - callfar 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 - - callfar 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 10 percent - ret c - inc [hl] - ret -; 38dd1 - - -AI_Smart_Disable: ; 38dd1 - call AICompareSpeed - jr nc, .asm_38df3 - - push hl - ld a, [LastPlayerCounterMove] - ld hl, UsefulMoves - ld de, 1 - call IsInArray - - pop hl - jr nc, .asm_38dee - - call Random - cp 39 percent + 1 - ret c - dec [hl] - ret - -.asm_38dee - ld a, [wEnemyMoveStruct + MOVE_POWER] - and a - ret nz - -.asm_38df3 - call Random - cp 8 percent - 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 (buggy). -; Should check PlayerSubStatus5 instead. - 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<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ROLLOUT | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE - jr nz, .asm_38e26 - -; Otherwise, discourage this move unless the player only has not very effective moves against the enemy. - push hl - callfar CheckPlayerMoveTypeMatchups - ld a, [wEnemyAISwitchScore] - cp $b ; not very effective - pop hl - ret nc - -.asm_38e24 - inc [hl] - ret - -.asm_38e26 - call AI_80_20 - ret c - dec [hl] - dec [hl] - dec [hl] - ret -; 38e2e - - -AICheckLastPlayerMon: ; 38e2e - ld a, [PartyCount] - ld b, a - ld c, 0 - ld hl, PartyMon1HP - ld de, PARTYMON_STRUCT_LENGTH - -.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 - - -AI_Smart_Nightmare: ; 38e4a -; 50% chance to encourage this move. -; The AI_Basic layer will make sure that -; Dream Eater is only used against sleeping targets. - - call AI_50_50 - ret c - dec [hl] - ret -; 38e50 - - -AI_Smart_FlameWheel: ; 38e50 -; Use this move if the enemy is frozen. - - ld a, [EnemyMonStatus] - bit FRZ, a - ret z -rept 5 - dec [hl] -endr - ret -; 38e5c - - -AI_Smart_Curse: ; 38e5c - ld a, [EnemyMonType1] - cp GHOST - jr z, .ghostcurse - ld a, [EnemyMonType2] - cp GHOST - jr z, .ghostcurse - - call AICheckEnemyHalfHP - jr nc, .asm_38e93 - - ld a, [EnemyAtkLevel] - cp $b - jr nc, .asm_38e93 - cp $9 - ret nc - - ld a, [BattleMonType1] - cp GHOST - jr z, .asm_38e92 - cp SPECIAL - ret nc - ld a, [BattleMonType2] - cp SPECIAL - ret nc - call AI_80_20 - 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 - farcall FindAliveEnemyMons - 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 AI_50_50 - ret c - - dec [hl] - dec [hl] - ret -; 38ed2 - - -AI_Smart_Protect: ; 38ed2 - ld a, [EnemyProtectCount] - 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_ROLLOUT, a - jr z, .asm_38f14 - - ld a, [PlayerRolloutCount] - cp 3 - jr c, .asm_38f14 - -.asm_38f0d - call AI_80_20 - ret c - dec [hl] - ret - -.asm_38f13 - inc [hl] - -.asm_38f14 - call Random - cp 8 percent - ret c - inc [hl] - inc [hl] - ret -; 38f1d - - -AI_Smart_Foresight: ; 38f1d - ld a, [EnemyAccLevel] - cp $5 - jr c, .asm_38f41 - ld a, [PlayerEvaLevel] - cp $a - jr nc, .asm_38f41 - - ld a, [BattleMonType1] - cp GHOST - jr z, .asm_38f41 - ld a, [BattleMonType2] - cp GHOST - jr z, .asm_38f41 - - call Random - cp 8 percent - ret c - inc [hl] - ret - -.asm_38f41 - call Random - cp 39 percent + 1 - ret c - dec [hl] - dec [hl] - ret -; 38f4a - - -AI_Smart_PerishSong: ; 38f4a - push hl - callfar FindAliveEnemyMons - pop hl - jr c, .no - - ld a, [PlayerSubStatus5] - bit SUBSTATUS_CANT_RUN, a - jr nz, .yes - - push hl - callfar CheckPlayerMoveTypeMatchups - ld a, [wEnemyAISwitchScore] - cp 10 ; 1.0 - pop hl - ret c - - call AI_50_50 - ret c - - inc [hl] - ret - -.yes - call AI_50_50 - ret c - - dec [hl] - ret - -.no - ld a, [hl] - add 5 - ld [hl], a - ret -; 38f7a - - -AI_Smart_Sandstorm: ; 38f7a - -; Greatly discourage this move if the player is immune to Sandstorm damage. - 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 - -; Discourage this move if player's HP is below 50%. - call AICheckPlayerHalfHP - jr nc, .asm_38fa6 - -; 50% chance to encourage this move otherwise. - call AI_50_50 - ret c - - dec [hl] - ret - -.asm_38fa5 - inc [hl] - -.asm_38fa6 - inc [hl] - ret - -.SandstormImmuneTypes: - db ROCK - db GROUND - db STEEL - db $ff -; 38fac - - -AI_Smart_Endure: ; 38fac - ld a, [EnemyProtectCount] - and a - jr nz, .asm_38fd8 - - call AICheckEnemyMaxHP - jr c, .asm_38fd8 - - call AICheckEnemyQuarterHP - jr c, .asm_38fd9 - - ld b, EFFECT_REVERSAL - call AIHasMoveEffect - jr nc, .asm_38fcb - - call AI_80_20 - ret c - - dec [hl] - dec [hl] - dec [hl] - ret - -.asm_38fcb - ld a, [EnemySubStatus5] - bit SUBSTATUS_LOCK_ON, a - ret z - - call AI_50_50 - ret c - - dec [hl] - dec [hl] - ret - -.asm_38fd8 - inc [hl] - -.asm_38fd9 - inc [hl] - ret -; 38fdb - - -AI_Smart_FuryCutter: ; 38fdb -; Encourage this move based on Fury Cutter's count. - - 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 - - -AI_Smart_Rollout: ; 38fef -; Rollout, Fury Cutter - -; 80% chance to discourage this move if the enemy is in love, confused, or paralyzed. - 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 - -; 80% chance to discourage this move if the enemy's HP is below 25%, -; or if accuracy or evasion modifiers favour the player. - call AICheckEnemyQuarterHP - jr nc, .asm_39020 - - ld a, [EnemyAccLevel] - cp 7 - jr c, .asm_39020 - ld a, [PlayerEvaLevel] - cp 8 - jr nc, .asm_39020 - -; Otherwise, 80% chance to greatly encourage this move. - call Random - cp 79 percent - 1 - ret nc - dec [hl] - dec [hl] - ret - -.asm_39020 - call AI_80_20 - ret c - inc [hl] - ret -; 39026 - - -AI_Smart_Swagger: -AI_Smart_Attract: ; 39026 -; 80% chance to encourage this move during the first turn of player's Pokemon. -; 80% chance to discourage this move otherwise. - - ld a, [PlayerTurnsTaken] - and a - jr z, .first_turn - - call AI_80_20 - ret c - inc [hl] - ret - -.first_turn - call Random - cp 79 percent - 1 - ret nc - dec [hl] - ret -; 3903a - - -AI_Smart_Safeguard: ; 3903a -; 80% chance to discourage this move if player's HP is below 50%. - - call AICheckPlayerHalfHP - ret c - call AI_80_20 - ret c - inc [hl] - ret -; 39044 - - -AI_Smart_Magnitude: -AI_Smart_Earthquake: ; 39044 - -; Greatly encourage this move if the player is underground and the enemy is faster. - ld a, [LastPlayerCounterMove] - cp DIG - ret nz - - ld a, [PlayerSubStatus3] - bit SUBSTATUS_UNDERGROUND, a - jr z, .could_dig - - call AICompareSpeed - ret nc - dec [hl] - dec [hl] - ret - -.could_dig - ; Try to predict if the player will use Dig this turn. - - ; 50% chance to encourage this move if the enemy is slower than the player. - call AICompareSpeed - ret c - - call AI_50_50 - ret c - - dec [hl] - ret -; 39062 - - -AI_Smart_BatonPass: ; 39062 -; Discourage this move if the player hasn't shown super-effective moves against the enemy. -; Consider player's type(s) if its moves are unknown. - - push hl - callfar CheckPlayerMoveTypeMatchups - ld a, [wEnemyAISwitchScore] - cp 10 ; neutral - pop hl - ret c - inc [hl] - ret -; 39072 - - -AI_Smart_Pursuit: ; 39072 -; 50% chance to greatly encourage this move if player's HP is below 25%. -; 80% chance to discourage this move otherwise. - - call AICheckPlayerQuarterHP - jr nc, .asm_3907d - call AI_80_20 - ret c - inc [hl] - ret - -.asm_3907d - call AI_50_50 - ret c - dec [hl] - dec [hl] - ret -; 39084 - - -AI_Smart_RapidSpin: ; 39084 -; 80% chance to greatly encourage this move if the enemy is -; trapped (Bind effect), seeded, or scattered with spikes. - - ld a, [wEnemyWrapCount] - 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 AI_80_20 - ret c - - dec [hl] - dec [hl] - ret -; 3909e - - -AI_Smart_HiddenPower: ; 3909e - push hl - ld a, 1 - ld [hBattleTurn], a - -; Calculate Hidden Power's type and base power based on enemy's DVs. - callfar HiddenPowerDamage - callfar BattleCheckTypeMatchup - pop hl - -; Discourage Hidden Power if not very effective. - ld a, [wd265] - cp 10 - jr c, .bad - -; Discourage Hidden Power if its base power is lower than 50. - ld a, d - cp 50 - jr c, .bad - -; Encourage Hidden Power if super-effective. - ld a, [wd265] - cp 11 - jr nc, .good - -; Encourage Hidden Power if its base power is 70. - ld a, d - cp 70 - ret c - -.good - dec [hl] - ret - -.bad - inc [hl] - ret -; 390cb - - -AI_Smart_RainDance: ; 390cb - -; Greatly discourage this move if it would favour the player type-wise. -; Particularly, if the player is a Water-type. - 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 AI_Smart_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 - - -AI_Smart_SunnyDay: ; 390f3 - -; Greatly discourage this move if it would favour the player type-wise. -; Particularly, if the player is a Fire-type. - 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 - - -AI_Smart_WeatherMove: ; 3910d -; Rain Dance, Sunny Day - -; Greatly discourage this move if the enemy doesn't have -; one of the useful Rain Dance or Sunny Day moves. - call AIHasMoveInArray - pop hl - jr nc, AIBadWeatherType - -; Greatly discourage this move if player's HP is below 50%. - call AICheckPlayerHalfHP - jr nc, AIBadWeatherType - -; 50% chance to encourage this move otherwise. - call AI_50_50 - ret c - - dec [hl] - ret -; 3911e - -AIBadWeatherType: ; 3911e - inc [hl] - inc [hl] - inc [hl] - ret -; 39122 - -AIGoodWeatherType: ; 39122 -; Rain Dance, Sunny Day - -; Greatly encourage this move if it would disfavour the player type-wise and player's HP is above 50%... - call AICheckPlayerHalfHP - ret nc - -; ...as long as one of the following conditions meet: -; It's the first turn of the player's Pokemon. - ld a, [PlayerTurnsTaken] - and a - jr z, .good - -; Or it's the first turn of the enemy's Pokemon. - 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 - - -AI_Smart_BellyDrum: ; 3913d -; 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. - - 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 - - -AI_Smart_PsychUp: ; 39152 - push hl - ld hl, EnemyAtkLevel - ld b, $8 - ld c, 100 - -; 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. -.asm_3915a - ld a, [hli] - sub $7 - add c - ld c, a - dec b - jr nz, .asm_3915a - -; 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. - ld hl, PlayerAtkLevel - ld b, $8 - ld d, 100 - -.asm_39169 - ld a, [hli] - sub $7 - add d - ld d, a - dec b - jr nz, .asm_39169 - -; Greatly discourage this move if enemy's stat levels are higher than player's (if c>=d). - ld a, c - sub d - pop hl - jr nc, .asm_39188 - -; Else, 80% chance to encourage this move unless player's accuracy level is lower than -1... - ld a, [PlayerAccLevel] - cp $6 - ret c - -; ...or enemy's evasion level is higher than +0. - ld a, [EnemyEvaLevel] - cp $8 - ret nc - - call AI_80_20 - ret c - - dec [hl] - ret - -.asm_39188 - inc [hl] - inc [hl] - ret -; 3918b - - -AI_Smart_MirrorCoat: ; 3918b - push hl - ld hl, PlayerUsedMoves - ld c, $4 - ld b, $0 - -.asm_39193 - ld a, [hli] - and a - jr z, .asm_391a8 - - call AIGetEnemyMove - - ld a, [wEnemyMoveStruct + MOVE_POWER] - and a - jr z, .asm_391a8 - - ld a, [wEnemyMoveStruct + MOVE_TYPE] - cp SPECIAL - jr c, .asm_391a8 - - inc b - -.asm_391a8 - dec c - jr nz, .asm_39193 - - pop hl - ld a, b - and a - jr z, .asm_391d3 - - cp $3 - jr nc, .asm_391ca - - ld a, [LastPlayerCounterMove] - and a - jr z, .asm_391d2 - - call AIGetEnemyMove - - ld a, [wEnemyMoveStruct + MOVE_POWER] - and a - jr z, .asm_391d2 - - ld a, [wEnemyMoveStruct + MOVE_TYPE] - cp SPECIAL - jr c, .asm_391d2 - - -.asm_391ca - call Random - cp 100 - jr c, .asm_391d2 - dec [hl] - -.asm_391d2 - ret - -.asm_391d3 - inc [hl] - ret -; 391d5 - - -AI_Smart_Twister: -AI_Smart_Gust: ; 391d5 - -; Greatly encourage this move if the player is flying and the enemy is faster. - ld a, [LastPlayerCounterMove] - cp FLY - ret nz - - ld a, [PlayerSubStatus3] - bit SUBSTATUS_FLYING, a - jr z, .couldFly - - call AICompareSpeed - ret nc - - dec [hl] - dec [hl] - ret - -; Try to predict if the player will use Fly this turn. -.couldFly - -; 50% chance to encourage this move if the enemy is slower than the player. - call AICompareSpeed - ret c - call AI_50_50 - ret c - dec [hl] - ret -; 391f3 - - -AI_Smart_FutureSight: ; 391f3 -; Greatly encourage this move if the player is -; flying or underground, and slower than the enemy. - - call AICompareSpeed - ret nc - - ld a, [PlayerSubStatus3] - and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND - ret z - - dec [hl] - dec [hl] - ret -; 39200 - - -AI_Smart_Stomp: ; 39200 -; 80% chance to encourage this move if the player has used Minimize. - - ld a, [wPlayerMinimized] - and a - ret z - - call AI_80_20 - ret c - - dec [hl] - ret -; 3920b - - -AI_Smart_Solarbeam: ; 3920b -; 80% chance to encourage this move when it's sunny. -; 90% chance to discourage this move when it's raining. - - ld a, [Weather] - cp WEATHER_SUN - jr z, .asm_3921e - - cp WEATHER_RAIN - ret nz - - call Random - cp 10 percent - ret c - - inc [hl] - inc [hl] - ret - -.asm_3921e - call AI_80_20 - ret c - - dec [hl] - dec [hl] - ret -; 39225 - - -AI_Smart_Thunder: ; 39225 -; 90% chance to discourage this move when it's sunny. - - ld a, [Weather] - cp WEATHER_SUN - ret nz - - call Random - cp 10 percent - ret c - - inc [hl] - ret -; 39233 - - -AICompareSpeed: ; 39233 -; Return carry if enemy is faster than player. - - push bc - ld a, [EnemyMonSpeed + 1] - ld b, a - ld a, [BattleMonSpeed + 1] - cp b - ld a, [EnemyMonSpeed] - ld b, a - ld a, [BattleMonSpeed] - sbc b - pop bc - ret -; 39246 - - -AICheckPlayerMaxHP: ; 39246 - push hl - push de - push bc - ld de, BattleMonHP - ld hl, BattleMonMaxHP - jr AICheckMaxHP -; 39251 - - -AICheckEnemyMaxHP: ; 39251 - push hl - push de - push bc - ld de, EnemyMonHP - ld hl, EnemyMonMaxHP - ; fallthrough -; 3925a - - -AICheckMaxHP: ; 3925a -; Return carry if hp at de matches max hp at hl. - - ld a, [de] - inc de - cp [hl] - jr nz, .asm_39269 - - inc hl - ld a, [de] - cp [hl] - jr nz, .asm_39269 - - pop bc - pop de - pop hl - scf - ret - -.asm_39269 - pop bc - pop de - pop hl - and a - ret -; 3926e - - -AICheckPlayerHalfHP: ; 3926e - push hl - ld hl, BattleMonHP - ld b, [hl] - inc hl - ld c, [hl] - sla c - rl b - inc hl - inc hl - ld a, [hld] - cp c - ld a, [hl] - sbc b - pop hl - ret -; 39281 - - -AICheckEnemyHalfHP: ; 39281 - push hl - push de - push bc - ld hl, EnemyMonHP - ld b, [hl] - inc hl - ld c, [hl] - sla c - rl b - inc hl - inc hl - ld a, [hld] - cp c - ld a, [hl] - sbc b - pop bc - pop de - pop hl - ret -; 39298 - - -AICheckEnemyQuarterHP: ; 39298 - push hl - push de - push bc - ld hl, EnemyMonHP - ld b, [hl] - inc hl - ld c, [hl] - sla c - rl b - sla c - rl b - inc hl - inc hl - ld a, [hld] - cp c - ld a, [hl] - sbc b - pop bc - pop de - pop hl - ret -; 392b3 - - -AICheckPlayerQuarterHP: ; 392b3 - push hl - ld hl, BattleMonHP - ld b, [hl] - inc hl - ld c, [hl] - sla c - rl b - sla c - rl b - inc hl - inc hl - ld a, [hld] - cp c - ld a, [hl] - sbc b - pop hl - ret -; 392ca - - -AIHasMoveEffect: ; 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, .no - - call AIGetEnemyMove - - ld a, [wEnemyMoveStruct + MOVE_EFFECT] - cp b - jr z, .yes - - dec c - jr nz, .checkmove - -.no - pop hl - and a - ret - -.yes - pop hl - scf - ret -; 392e6 - - -AIHasMoveInArray: ; 392e6 -; Return carry if the enemy has a move in array hl. - - push hl - push de - push bc - -.next - ld a, [hli] - cp $ff - jr z, .done - - ld b, a - ld c, EnemyMonMovesEnd - EnemyMonMoves + 1 - ld de, EnemyMonMoves - -.check - dec c - jr z, .next - - ld a, [de] - inc de - cp b - jr nz, .check - - scf - -.done - pop bc - pop de - pop hl - ret -; 39301 - - -UsefulMoves: ; 39301 -; Moves that are usable all-around. - 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 - - -AI_Opportunist: ; 39315 -; Discourage stall moves when the enemy's HP is low. - -; Do nothing if enemy's HP is above 50%. - call AICheckEnemyHalfHP - ret c - -; Discourage stall moves if enemy's HP is below 25%. - call AICheckEnemyQuarterHP - jr nc, .asm_39322 - -; 50% chance to discourage stall moves if enemy's HP is between 25% and 50%. - call AI_50_50 - 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 - - - -AI_Aggressive: ; 39369 -; 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 - -; Figure out which attack does the most damage and put it in c. - ld hl, EnemyMonMoves - ld bc, 0 - ld de, 0 -.checkmove - inc b - ld a, b - cp EnemyMonMovesEnd - EnemyMonMoves + 1 - jr z, .gotstrongestmove - - ld a, [hli] - and a - jr z, .gotstrongestmove - - push hl - push de - push bc - call AIGetEnemyMove - ld a, [wEnemyMoveStruct + MOVE_POWER] - and a - jr z, .nodamage - call AIDamageCalc - pop bc - pop de - pop hl - -; Update current move if damage is highest so far - 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 - -; Ignore this move if it is the highest damaging one. - cp c - ld a, [de] - inc de - inc hl - jr z, .checkmove2 - - call AIGetEnemyMove - -; 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] - cp 2 - jr c, .checkmove2 - -; Ignore this move if it is reckless. - push hl - push de - push bc - ld a, [wEnemyMoveStruct + MOVE_EFFECT] - ld hl, .RecklessMoves - ld de, 1 - call IsInArray - pop bc - pop de - pop hl - jr c, .checkmove2 - -; If we made it this far, discourage this move. - inc [hl] - jr .checkmove2 - -.done - ret - -.RecklessMoves: - db EFFECT_SELFDESTRUCT - db EFFECT_RAMPAGE - db EFFECT_MULTI_HIT - db EFFECT_DOUBLE_HIT - db $ff -; 393e7 - - -AIDamageCalc: ; 393e7 - ld a, 1 - ld [hBattleTurn], a - ld a, [wEnemyMoveStruct + MOVE_EFFECT] - ld de, 1 - ld hl, .ConstantDamageEffects - call IsInArray - jr nc, .asm_39400 - callfar BattleCommand_ConstantDamage - ret - -.asm_39400 - callfar EnemyAttackDamage - callfar BattleCommand_DamageCalc - callfar BattleCommand_Stab - ret - -.ConstantDamageEffects: - db EFFECT_SUPER_FANG - db EFFECT_STATIC_DAMAGE - db EFFECT_LEVEL_DAMAGE - db EFFECT_PSYWAVE - db $ff -; 39418 - - -AI_Cautious: ; 39418 -; 90% chance to discourage moves with residual effects after the first turn. - - ld a, [EnemyTurnsTaken] - and a - ret z - - ld hl, Buffer1 - 1 - ld de, EnemyMonMoves - ld c, EnemyMonMovesEnd - EnemyMonMoves + 1 -.asm_39425 - inc hl - dec c - ret z - - ld a, [de] - inc de - and a - ret z - - push hl - push de - push bc - ld hl, .residualmoves - ld de, 1 - call IsInArray - - pop bc - pop de - pop hl - jr nc, .asm_39425 - - call Random - cp 90 percent + 1 - 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 - - - -AI_Status: ; 39453 -; Dismiss status moves that don't affect the player. - - ld hl, Buffer1 - 1 - ld de, EnemyMonMoves - ld b, EnemyMonMovesEnd - EnemyMonMoves + 1 -.checkmove - dec b - ret z - - inc hl - ld a, [de] - and a - ret z - - inc de - call AIGetEnemyMove - - ld a, [wEnemyMoveStruct + MOVE_EFFECT] - cp EFFECT_TOXIC - jr z, .poisonimmunity - cp EFFECT_POISON - jr z, .poisonimmunity - cp EFFECT_SLEEP - jr z, .typeimmunity - cp EFFECT_PARALYZE - jr z, .typeimmunity - - ld a, [wEnemyMoveStruct + MOVE_POWER] - and a - jr z, .checkmove - - jr .typeimmunity - -.poisonimmunity - ld a, [BattleMonType1] - cp POISON - jr z, .immune - ld a, [BattleMonType2] - cp POISON - jr z, .immune - -.typeimmunity - push hl - push bc - push de - ld a, 1 - ld [hBattleTurn], a - callfar BattleCheckTypeMatchup - pop de - pop bc - pop hl - - ld a, [wd265] - and a - jr nz, .checkmove - -.immune - call AIDiscourageMove - jr .checkmove -; 394a9 - - - -AI_Risky: ; 394a9 -; Use any move that will KO the target. -; Risky moves will often be an exception (see below). - - ld hl, Buffer1 - 1 - ld de, EnemyMonMoves - ld c, EnemyMonMovesEnd - EnemyMonMoves + 1 -.checkmove - inc hl - dec c - ret z - - ld a, [de] - inc de - and a - ret z - - push de - push bc - push hl - call AIGetEnemyMove - - ld a, [wEnemyMoveStruct + MOVE_POWER] - and a - jr z, .nextmove - -; Don't use risky moves at max hp. - ld a, [wEnemyMoveStruct + MOVE_EFFECT] - ld de, 1 - ld hl, .RiskyMoves - call IsInArray - jr nc, .checkko - - call AICheckEnemyMaxHP - jr c, .nextmove - -; Else, 80% chance to exclude them. - call Random - cp 79 percent - 1 - 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 -rept 5 - dec [hl] -endr - push hl - -.nextmove - pop hl - pop bc - pop de - jr .checkmove - -.RiskyMoves: - db EFFECT_SELFDESTRUCT - db EFFECT_OHKO - db $ff -; 39502 - - - -AI_None: ; 39502 - ret -; 39503 - - -AIDiscourageMove: ; 39503 - ld a, [hl] - add 10 - ld [hl], a - ret -; 39508 - - -AIGetEnemyMove: ; 39508 -; Load attributes of move a into ram - - push hl - push de - push bc - dec a - ld hl, Moves - ld bc, MOVE_LENGTH - call AddNTimes - - ld de, wEnemyMoveStruct - ld a, BANK(Moves) - call FarCopyBytes - - pop bc - pop de - pop hl - ret -; 39521 - - -AI_80_20: ; 39521 - call Random - cp 20 percent - 1 - ret -; 39527 - - -AI_50_50: ; 39527 - call Random - cp 50 percent + 1 - ret -; 3952d |