diff options
author | GriffinR <griffin.g.richards@gmail.com> | 2020-01-22 16:38:27 -0500 |
---|---|---|
committer | GriffinR <griffin.g.richards@gmail.com> | 2020-01-22 19:21:40 -0500 |
commit | d084a5ca84ec7062b8e546293e67202f2d2f4732 (patch) | |
tree | af486891024318e0f2162044e18684a24e644bd0 | |
parent | 055e5d2bbff31a98bcdffec0d7392e7ce77bcd46 (diff) |
Sync AI scripts
-rw-r--r-- | asm/macros/battle_ai_script.inc | 397 | ||||
-rw-r--r-- | data/battle_ai_scripts.s | 4916 | ||||
-rw-r--r-- | include/constants/battle.h | 4 | ||||
-rw-r--r-- | include/constants/battle_ai.h | 6 | ||||
-rw-r--r-- | include/constants/pokemon.h | 4 | ||||
-rw-r--r-- | include/pokemon.h | 34 | ||||
-rw-r--r-- | src/battle_ai_script_commands.c | 1130 |
7 files changed, 3325 insertions, 3166 deletions
diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 679e30340..3aadc1e47 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -1,257 +1,257 @@ - .macro if_random_less_than percent, address + .macro if_random_less_than percent:req, ptr:req .byte 0x00 .byte \percent - .4byte \address + .4byte \ptr .endm @ unused - .macro if_random_greater_than percent, address + .macro if_random_greater_than percent:req, ptr:req .byte 0x01 .byte \percent - .4byte \address + .4byte \ptr .endm @ unused - .macro if_random_equal address + .macro if_random_equal ptr:req .byte 0x02 - .4byte \address + .4byte \ptr .endm @ unused - .macro if_random_not_equal address + .macro if_random_not_equal ptr:req .byte 0x03 - .4byte \address + .4byte \ptr .endm - .macro score score + .macro score score:req .byte 0x04 .byte \score .endm - .macro if_hp_less_than target, percent, address + .macro if_hp_less_than battler:req, percent:req, ptr:req .byte 0x05 - .byte \target + .byte \battler .byte \percent - .4byte \address + .4byte \ptr .endm - .macro if_hp_more_than target, percent, address + .macro if_hp_more_than battler:req, percent:req, ptr:req .byte 0x06 - .byte \target + .byte \battler .byte \percent - .4byte \address + .4byte \ptr .endm - .macro if_hp_equal target, percent, address + .macro if_hp_equal battler:req, percent:req, ptr:req .byte 0x07 - .byte \target + .byte \battler .byte \percent - .4byte \address + .4byte \ptr .endm - .macro if_hp_not_equal target, percent, address + .macro if_hp_not_equal battler:req, percent:req, ptr:req .byte 0x08 - .byte \target + .byte \battler .byte \percent - .4byte \address + .4byte \ptr .endm - .macro if_status target, status, address + .macro if_status battler:req, status:req, ptr:req .byte 0x09 - .byte \target + .byte \battler .4byte \status - .4byte \address + .4byte \ptr .endm - .macro if_not_status target, status, address + .macro if_not_status battler:req, status:req, ptr:req .byte 0x0a - .byte \target + .byte \battler .4byte \status - .4byte \address + .4byte \ptr .endm - .macro if_status2 target, status, address + .macro if_status2 battler:req, status:req, ptr:req .byte 0x0b - .byte \target + .byte \battler .4byte \status - .4byte \address + .4byte \ptr .endm - .macro if_not_status2 target, status, address + .macro if_not_status2 battler:req, status:req, ptr:req .byte 0x0c - .byte \target + .byte \battler .4byte \status - .4byte \address + .4byte \ptr .endm - .macro if_status3 target, status, address + .macro if_status3 battler:req, status:req, ptr:req .byte 0x0d - .byte \target + .byte \battler .4byte \status - .4byte \address + .4byte \ptr .endm - .macro if_not_status3 target, status, address + .macro if_not_status3 battler:req, status:req, ptr:req .byte 0x0e - .byte \target + .byte \battler .4byte \status - .4byte \address + .4byte \ptr .endm - .macro if_status4 target, status, address + .macro if_side_affecting battler:req, status:req, ptr:req .byte 0x0f - .byte \target + .byte \battler .4byte \status - .4byte \address + .4byte \ptr .endm - .macro if_not_status4 target, status, address + .macro if_not_side_affecting battler:req, status:req, ptr:req .byte 0x10 - .byte \target + .byte \battler .4byte \status - .4byte \address + .4byte \ptr .endm - .macro if_less_than value, address + .macro if_less_than value:req, ptr:req .byte 0x11 .byte \value - .4byte \address + .4byte \ptr .endm - .macro if_more_than value, address + .macro if_more_than value:req, ptr:req .byte 0x12 .byte \value - .4byte \address + .4byte \ptr .endm - .macro if_equal value, address + .macro if_equal value:req, ptr:req .byte 0x13 .byte \value - .4byte \address + .4byte \ptr .endm - .macro if_not_equal value, address + .macro if_not_equal value:req, ptr:req .byte 0x14 .byte \value - .4byte \address + .4byte \ptr .endm - .macro if_less_than_32 value, address + .macro if_less_than_ptr value:req, ptr:req .byte 0x15 .4byte \value - .4byte \address + .4byte \ptr .endm - .macro if_more_than_32 value, address + .macro if_more_than_ptr value:req, ptr:req .byte 0x16 .4byte \value - .4byte \address + .4byte \ptr .endm - .macro if_equal_32 value, address + .macro if_equal_ptr value:req, ptr:req .byte 0x17 .4byte \value - .4byte \address + .4byte \ptr .endm - .macro if_not_equal_32 value, address + .macro if_not_equal_ptr value:req, ptr:req .byte 0x18 .4byte \value - .4byte \address + .4byte \ptr .endm - .macro if_move move, address + .macro if_move move:req, ptr:req .byte 0x19 .2byte \move - .4byte \address + .4byte \ptr .endm - .macro if_not_move move, address + .macro if_not_move move:req, ptr:req .byte 0x1a .2byte \move - .4byte \address + .4byte \ptr .endm - .macro if_in_bytes list, address + .macro if_in_bytes list:req, ptr:req .byte 0x1b .4byte \list - .4byte \address + .4byte \ptr .endm - .macro if_not_in_bytes list, address + .macro if_not_in_bytes list:req, ptr:req .byte 0x1c .4byte \list - .4byte \address + .4byte \ptr .endm - .macro if_in_words list, address + .macro if_in_hwords list:req, ptr:req .byte 0x1d .4byte \list - .4byte \address + .4byte \ptr .endm - .macro if_not_in_words list, address + .macro if_not_in_hwords list:req, ptr:req .byte 0x1e .4byte \list - .4byte \address + .4byte \ptr .endm - .macro if_user_can_damage address + .macro if_user_has_attacking_move ptr:req .byte 0x1f - .4byte \address + .4byte \ptr .endm - .macro if_user_cant_damage address + .macro if_user_has_no_attacking_moves ptr:req .byte 0x20 - .4byte \address + .4byte \ptr .endm .macro get_turn_count .byte 0x21 .endm - .macro get_type byte + .macro get_type byte:req .byte 0x22 .byte \byte .endm @ unused - .macro get_move_power + .macro get_considered_move_power .byte 0x23 .endm - .macro is_most_powerful_move + .macro get_how_powerful_move_is .byte 0x24 .endm - .macro get_move target + .macro get_last_used_move battler:req .byte 0x25 - .byte \target + .byte \battler .endm - .macro if_arg_equal type, address + .macro if_equal_ type:req, ptr:req .byte 0x26 .byte \type - .4byte \address + .4byte \ptr .endm @ unused - .macro if_arg_not_equal type, address + .macro if_not_equal_ type:req, ptr:req .byte 0x27 .byte \type - .4byte \address + .4byte \ptr .endm - .macro if_would_go_first target, address + .macro if_would_go_first battler:req, ptr:req .byte 0x28 - .byte \target - .4byte \address + .byte \battler + .4byte \ptr .endm - .macro if_would_not_go_first target, address + .macro if_would_not_go_first battler:req, ptr:req .byte 0x29 - .byte \target - .4byte \address + .byte \battler + .4byte \ptr .endm @ nullsub @@ -264,9 +264,9 @@ .byte 0x2b .endm - .macro count_alive_pokemon target + .macro count_alive_pokemon battler:req .byte 0x2c - .byte \target + .byte \battler .endm @ unused @@ -274,24 +274,24 @@ .byte 0x2d .endm - .macro get_effect + .macro get_considered_move_effect .byte 0x2e .endm - .macro get_ability target + .macro get_ability battler:req .byte 0x2f - .byte \target + .byte \battler .endm @ unused - .macro get_highest_possible_damage + .macro get_highest_type_effectiveness .byte 0x30 .endm - .macro if_damage_bonus value, address + .macro if_type_effectiveness effectiveness:req, ptr:req .byte 0x31 - .byte \value - .4byte \address + .byte \effectiveness + .4byte \ptr .endm @ nullsub @@ -304,162 +304,162 @@ .byte 0x33 .endm - .macro if_status_in_party target, status, address + .macro if_status_in_party battler:req, status:req, ptr:req .byte 0x34 - .byte \target + .byte \battler .4byte \status - .4byte \address + .4byte \ptr .endm @ bugged - .macro if_status_not_in_party target, status, address + .macro if_status_not_in_party battler:req, status:req, ptr:req .byte 0x35 - .byte \target + .byte \battler .4byte \status - .4byte \address + .4byte \ptr .endm .macro get_weather .byte 0x36 .endm - .macro if_effect byte, address + .macro if_effect byte:req, ptr:req .byte 0x37 .byte \byte - .4byte \address + .4byte \ptr .endm - .macro if_not_effect byte, address + .macro if_not_effect byte:req, ptr:req .byte 0x38 .byte \byte - .4byte \address + .4byte \ptr .endm - .macro if_stat_level_less_than target, stat, level, address + .macro if_stat_level_less_than battler:req, stat:req, level:req, ptr:req .byte 0x39 - .byte \target + .byte \battler .byte \stat .byte \level - .4byte \address + .4byte \ptr .endm - .macro if_stat_level_more_than target, stat, level, address + .macro if_stat_level_more_than battler:req, stat:req, level:req, ptr:req .byte 0x3a - .byte \target + .byte \battler .byte \stat .byte \level - .4byte \address + .4byte \ptr .endm - .macro if_stat_level_equal target, stat, level, address + .macro if_stat_level_equal battler:req, stat:req, level:req, ptr:req .byte 0x3b - .byte \target + .byte \battler .byte \stat .byte \level - .4byte \address + .4byte \ptr .endm - .macro if_stat_level_not_equal target, stat, level, address + .macro if_stat_level_not_equal battler:req, stat:req, level:req, ptr:req .byte 0x3c - .byte \target + .byte \battler .byte \stat .byte \level - .4byte \address + .4byte \ptr .endm - .macro if_can_faint address + .macro if_can_faint ptr:req .byte 0x3d - .4byte \address + .4byte \ptr .endm - .macro if_cant_faint address + .macro if_cant_faint ptr:req .byte 0x3e - .4byte \address + .4byte \ptr .endm @ unused - .macro if_has_move, target, move, address + .macro if_has_move battler:req, move:req, ptr:req .byte 0x3f - .byte \target + .byte \battler .2byte \move - .4byte \address + .4byte \ptr .endm @ unused - .macro if_dont_have_move, target, move, address + .macro if_doesnt_have_move battler:req, move:req, ptr:req .byte 0x40 - .byte \target + .byte \battler .2byte \move - .4byte \address + .4byte \ptr .endm - .macro if_move_effect target, effect, address + .macro if_has_move_with_effect battler:req, effect:req, ptr:req .byte 0x41 - .byte \target + .byte \battler .byte \effect - .4byte \address + .4byte \ptr .endm - .macro if_not_move_effect target, effect, address + .macro if_doesnt_have_move_with_effect battler:req, effect:req, ptr:req .byte 0x42 - .byte \target + .byte \battler .byte \effect - .4byte \address + .4byte \ptr .endm - .macro if_last_move_did_damage target, byte, address + .macro if_any_move_disabled_or_encored battler:req, byte:req, ptr:req .byte 0x43 - .byte \target + .byte \battler .byte \byte - .4byte \address + .4byte \ptr .endm - .macro if_encored target, address + .macro if_curr_move_disabled_or_encored battler:req, ptr:req .byte 0x44 - .byte \target - .4byte \address + .byte \battler + .4byte \ptr .endm .macro flee .byte 0x45 .endm - .macro if_random_100 address + .macro if_random_safari_flee ptr:req .byte 0x46 - .4byte \address + .4byte \ptr .endm .macro watch .byte 0x47 .endm - .macro get_hold_effect target + .macro get_hold_effect battler:req .byte 0x48 - .byte \target + .byte \battler .endm - .macro get_gender target + .macro get_gender battler:req .byte 0x49 - .byte \target + .byte \battler .endm - .macro is_first_turn target + .macro is_first_turn_for battler:req .byte 0x4a - .byte \target + .byte \battler .endm - .macro get_stockpile_count target + .macro get_stockpile_count battler:req .byte 0x4b - .byte \target + .byte \battler .endm .macro is_double_battle .byte 0x4c .endm - .macro get_item target + .macro get_used_held_item battler:req .byte 0x4d - .byte \target + .byte \battler .endm .macro get_move_type_from_result @@ -474,9 +474,9 @@ .byte 0x50 .endm - .macro get_protect_count target + .macro get_protect_count battler:req .byte 0x51 - .byte \target + .byte \battler .endm @ nullsub @@ -510,45 +510,92 @@ .endm @ unused - .macro call address + .macro call ptr:req .byte 0x58 - .4byte \address + .4byte \ptr .endm - .macro jump address + .macro goto ptr:req .byte 0x59 - .4byte \address + .4byte \ptr .endm .macro end .byte 0x5a .endm - .macro if_level_cond cond, address + .macro if_level_cond cond:req, ptr:req .byte 0x5b .byte \cond - .4byte \address + .4byte \ptr .endm - .macro if_user_higher_level address - if_level_cond 0, \address + .macro if_user_higher_level ptr:req + if_level_cond 0, \ptr .endm - .macro if_target_higher_level address - if_level_cond 1, \address + .macro if_target_higher_level ptr:req + if_level_cond 1, \ptr .endm - .macro if_equal_levels address - if_level_cond 2, \address + .macro if_equal_levels ptr:req + if_level_cond 2, \ptr .endm @ unused - .macro if_taunted address + .macro if_target_taunted ptr:req .byte 0x5c - .4byte \address + .4byte \ptr .endm - .macro if_not_taunted address + .macro if_target_not_taunted ptr:req .byte 0x5d - .4byte \address + .4byte \ptr + .endm + +@ useful script macros + .macro get_curr_move_type + get_type AI_TYPE_MOVE + .endm + + .macro get_user_type1 + get_type AI_TYPE1_USER + .endm + + .macro get_user_type2 + get_type AI_TYPE2_USER + .endm + + .macro get_target_type1 + get_type AI_TYPE1_TARGET + .endm + + .macro get_target_type2 + get_type AI_TYPE2_TARGET + .endm + + .macro if_target_faster ptr:req + if_would_go_first 1, \ptr + .endm + + .macro if_user_faster ptr:req + if_would_go_first 0, \ptr + .endm + + .macro if_double_battle ptr:req + is_double_battle + if_equal 1, \ptr + .endm + + .macro if_not_double_battle ptr:req + is_double_battle + if_equal 0, \ptr + .endm + + .macro if_any_move_disabled battler:req, ptr:req + if_any_move_disabled_or_encored \battler, 0, \ptr + .endm + + .macro if_any_move_encored battler:req, ptr:req + if_any_move_disabled_or_encored \battler, 1, \ptr .endm diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 09cc3cfb2..cfbef4ec2 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -1,13 +1,23 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" +#include "constants/battle.h" +#include "constants/battle_ai.h" +#include "constants/abilities.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/battle_move_effects.h" +#include "constants/hold_effects.h" +#include "constants/pokemon.h" .include "asm/macros/battle_ai_script.inc" .section script_data, "aw", %progbits +@ The FRLG scripts are improved subtly by Emerald in a few places +@ To make adding these improvements easier they are commented and tagged with "Improvement in Emerald" +@ Emerald also adds a few entirely new AI commands (mostly to expand Double Battle AI), which are not included + gBattleAI_ScriptsTable:: @ 81D9BF4 .4byte AI_CheckBadMove - .4byte AI_TryToFaint .4byte AI_CheckViability + .4byte AI_TryToFaint .4byte AI_SetupFirstTurn .4byte AI_Risky .4byte AI_PreferStrongestMove @@ -39,3087 +49,3209 @@ gBattleAI_ScriptsTable:: @ 81D9BF4 .4byte AI_FirstBattle AI_CheckBadMove:: @ 81D9C74 - is_most_powerful_move - if_equal 0, AI_sub_81D9CE0 - if_damage_bonus 0, AI_sub_81DA433 - get_ability 0 - if_equal 10, AI_sub_81D9CA6 - if_equal 11, AI_sub_81D9CB3 - if_equal 18, AI_sub_81D9CC0 - if_equal 25, AI_sub_81D9CCD - if_equal 26, AI_sub_81D9CD8 - jump AI_sub_81D9CE0 - -AI_sub_81D9CA6:: @ 81D9CA6 - get_type 4 - if_arg_equal 13, AI_sub_81DA436 - jump AI_sub_81D9CE0 - -AI_sub_81D9CB3:: @ 81D9CB3 - get_type 4 - if_arg_equal 11, AI_sub_81DA436 - jump AI_sub_81D9CE0 - -AI_sub_81D9CC0:: @ 81D9CC0 - get_type 4 - if_arg_equal 10, AI_sub_81DA436 - jump AI_sub_81D9CE0 - -AI_sub_81D9CCD:: @ 81D9CCD - if_damage_bonus 80, AI_sub_81D9CE0 - jump AI_sub_81DA433 - -AI_sub_81D9CD8:: @ 81D9CD8 - get_type 4 - if_arg_equal 4, AI_sub_81DA433 - -AI_sub_81D9CE0:: @ 81D9CE0 - get_ability 0 - if_not_equal 43, AI_sub_81D9D27 - if_move 45, AI_sub_81DA433 - if_move 46, AI_sub_81DA433 - if_move 47, AI_sub_81DA433 - if_move 48, AI_sub_81DA433 - if_move 103, AI_sub_81DA433 - if_move 173, AI_sub_81DA433 - if_move 253, AI_sub_81DA433 - if_move 319, AI_sub_81DA433 - if_move 320, AI_sub_81DA433 - -AI_sub_81D9D27:: @ 81D9D27 - if_effect 1, AI_sub_81D9FB6 - if_effect 7, AI_sub_81D9FCF - if_effect 8, AI_sub_81DA008 - if_effect 10, AI_sub_81DA020 - if_effect 11, AI_sub_81DA029 - if_effect 12, AI_sub_81DA032 - if_effect 13, AI_sub_81DA03B - if_effect 14, AI_sub_81DA044 - if_effect 15, AI_sub_81DA04D - if_effect 16, AI_sub_81DA056 - if_effect 18, AI_sub_81DA05F - if_effect 19, AI_sub_81DA074 - if_effect 20, AI_sub_81DA081 - if_effect 21, AI_sub_81DA08E - if_effect 22, AI_sub_81DA09B - if_effect 23, AI_sub_81DA0A8 - if_effect 24, AI_sub_81DA0BD - if_effect 25, AI_sub_81DA0D4 - if_effect 26, AI_sub_81DA1B2 - if_effect 28, AI_sub_81DA14A - if_effect 33, AI_sub_81DA15B - if_effect 35, AI_sub_81DA18A - if_effect 38, AI_sub_81DA195 - if_effect 39, AI_sub_81DA1B2 - if_effect 40, AI_sub_81DA1B2 - if_effect 46, AI_sub_81DA1CC - if_effect 47, AI_sub_81DA1D7 - if_effect 49, AI_sub_81DA1E2 - if_effect 50, AI_sub_81DA020 - if_effect 51, AI_sub_81DA029 - if_effect 52, AI_sub_81DA032 - if_effect 53, AI_sub_81DA03B - if_effect 54, AI_sub_81DA044 - if_effect 55, AI_sub_81DA04D - if_effect 56, AI_sub_81DA056 - if_effect 58, AI_sub_81DA05F - if_effect 59, AI_sub_81DA074 - if_effect 60, AI_sub_81DA081 - if_effect 61, AI_sub_81DA08E - if_effect 62, AI_sub_81DA09B - if_effect 63, AI_sub_81DA0A8 - if_effect 64, AI_sub_81DA0BD - if_effect 65, AI_sub_81DA1F5 - if_effect 66, AI_sub_81DA15B - if_effect 67, AI_sub_81DA200 - if_effect 79, AI_sub_81DA219 - if_effect 80, AI_sub_81DA1B2 - if_effect 84, AI_sub_81DA22B - if_effect 86, AI_sub_81DA246 - if_effect 87, AI_sub_81DA1B2 - if_effect 88, AI_sub_81DA1B2 - if_effect 89, AI_sub_81DA1B2 - if_effect 90, AI_sub_81DA24E - if_effect 92, AI_sub_81DA256 - if_effect 97, AI_sub_81DA256 - if_effect 99, AI_sub_81DA1B2 - if_effect 106, AI_sub_81DA261 - if_effect 107, AI_sub_81D9FF3 - if_effect 108, AI_sub_81DA056 - if_effect 109, AI_sub_81DA26C - if_effect 112, AI_sub_81DA27D - if_effect 113, AI_sub_81DA288 - if_effect 114, AI_sub_81DA293 - if_effect 115, AI_sub_81DA29E - if_effect 118, AI_sub_81DA1E2 - if_effect 120, AI_sub_81DA2A6 - if_effect 121, AI_sub_81DA1B2 - if_effect 122, AI_sub_81DA1B2 - if_effect 123, AI_sub_81DA1B2 - if_effect 124, AI_sub_81DA2E6 - if_effect 126, AI_sub_81DA1AA - if_effect 127, AI_sub_81DA301 - if_effect -126, AI_sub_81DA1B2 - if_effect -120, AI_sub_81DA30A - if_effect -119, AI_sub_81DA312 - if_effect -114, AI_sub_81DA019 - if_effect -113, AI_sub_81DA0D4 - if_effect -112, AI_sub_81DA1B2 - if_effect -111, AI_sub_81DA1B2 - if_effect -108, AI_sub_81DA31A - if_effect -103, AI_sub_81DA433 - if_effect -100, AI_sub_81DA029 - if_effect -98, AI_sub_81DA325 - if_effect -96, AI_sub_81DA32E - if_effect -95, AI_sub_81DA337 - if_effect -94, AI_sub_81DA337 - if_effect -92, AI_sub_81DA346 - if_effect -91, AI_sub_81DA34E - if_effect -90, AI_sub_81DA1E2 - if_effect -89, AI_sub_81DA359 - if_effect -88, AI_sub_81DA2F1 - if_effect -86, AI_sub_81DA1B2 - if_effect -80, AI_sub_81DA37E - if_effect -79, AI_sub_81DA386 - if_effect -75, AI_sub_81DA38F - if_effect -74, AI_sub_81DA1B2 - if_effect -72, AI_sub_81DA39A - if_effect -68, AI_sub_81DA386 - if_effect -67, AI_sub_81DA1B2 - if_effect -64, AI_sub_81DA3A3 - if_effect -63, AI_sub_81DA3AE - if_effect -60, AI_sub_81DA1B2 - if_effect -55, AI_sub_81DA3B9 - if_effect -51, AI_sub_81DA3C4 - if_effect -50, AI_sub_81DA3D5 - if_effect -48, AI_sub_81DA3E6 - if_effect -46, AI_sub_81DA3F7 - if_effect -45, AI_sub_81DA402 - if_effect -44, AI_sub_81DA413 - end - -AI_sub_81D9FB6:: @ 81D9FB6 - get_ability 0 - if_equal 15, AI_sub_81DA433 - if_equal 72, AI_sub_81DA433 - if_status 0, 255, AI_sub_81DA433 - end - -AI_sub_81D9FCF:: @ 81D9FCF - if_damage_bonus 0, AI_sub_81DA433 - get_ability 0 - if_equal 6, AI_sub_81DA433 - count_alive_pokemon 1 - if_not_equal 0, AI_sub_81D9FF2 - count_alive_pokemon 0 - if_not_equal 0, AI_sub_81DA433 - jump AI_sub_81DA424 - -AI_sub_81D9FF2:: @ 81D9FF2 - end - -AI_sub_81D9FF3:: @ 81D9FF3 - if_status2 0, 0x8000000, AI_sub_81DA433 - if_not_status 0, 7, AI_sub_81DA430 - end - -AI_sub_81DA008:: @ 81DA008 - if_not_status 0, 7, AI_sub_81DA430 - if_damage_bonus 0, AI_sub_81DA433 - end - -AI_sub_81DA019:: @ 81DA019 - if_hp_less_than 1, 51, AI_sub_81DA433 - -AI_sub_81DA020:: @ 81DA020 - if_stat_level_equal 1, 1, 12, AI_sub_81DA433 - end - -AI_sub_81DA029:: @ 81DA029 - if_stat_level_equal 1, 2, 12, AI_sub_81DA433 - end - -AI_sub_81DA032:: @ 81DA032 - if_stat_level_equal 1, 3, 12, AI_sub_81DA433 - end - -AI_sub_81DA03B:: @ 81DA03B - if_stat_level_equal 1, 4, 12, AI_sub_81DA433 - end - -AI_sub_81DA044:: @ 81DA044 - if_stat_level_equal 1, 5, 12, AI_sub_81DA433 - end - -AI_sub_81DA04D:: @ 81DA04D - if_stat_level_equal 1, 6, 12, AI_sub_81DA433 - end - -AI_sub_81DA056:: @ 81DA056 - if_stat_level_equal 1, 7, 12, AI_sub_81DA433 - end - -AI_sub_81DA05F:: @ 81DA05F - if_stat_level_equal 0, 1, 0, AI_sub_81DA433 - get_ability 0 - if_equal 52, AI_sub_81DA433 - jump AI_sub_81DA0C5 +@ if_move MOVE_FISSURE, AI_CBM_CheckIfNegatesType @ Improvement in Emerald +@ if_move MOVE_HORN_DRILL, AI_CBM_CheckIfNegatesType + get_how_powerful_move_is + if_equal MOVE_POWER_DISCOURAGED, AI_CheckBadMove_CheckSoundproof + +AI_CBM_CheckIfNegatesType:: + if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 + get_ability AI_TARGET + if_equal ABILITY_VOLT_ABSORB, CheckIfVoltAbsorbCancelsElectric + if_equal ABILITY_WATER_ABSORB, CheckIfWaterAbsorbCancelsWater + if_equal ABILITY_FLASH_FIRE, CheckIfFlashFireCancelsFire + if_equal ABILITY_WONDER_GUARD, CheckIfWonderGuardCancelsMove + if_equal ABILITY_LEVITATE, CheckIfLevitateCancelsGroundMove + goto AI_CheckBadMove_CheckSoundproof + +CheckIfVoltAbsorbCancelsElectric:: @ 81D9CA6 + get_curr_move_type + if_equal_ TYPE_ELECTRIC, Score_Minus12 + goto AI_CheckBadMove_CheckSoundproof + +CheckIfWaterAbsorbCancelsWater:: @ 81D9CB3 + get_curr_move_type + if_equal_ TYPE_WATER, Score_Minus12 + goto AI_CheckBadMove_CheckSoundproof + +CheckIfFlashFireCancelsFire:: @ 81D9CC0 + get_curr_move_type + if_equal_ TYPE_FIRE, Score_Minus12 + goto AI_CheckBadMove_CheckSoundproof + +CheckIfWonderGuardCancelsMove:: @ 81D9CCD + if_type_effectiveness AI_EFFECTIVENESS_x2, AI_CheckBadMove_CheckSoundproof + goto Score_Minus10 + +CheckIfLevitateCancelsGroundMove:: @ 81D9CD8 + get_curr_move_type + if_equal_ TYPE_GROUND, Score_Minus10 + +AI_CheckBadMove_CheckSoundproof:: @ 81D9CE0 + get_ability AI_TARGET + if_not_equal ABILITY_SOUNDPROOF, AI_CheckBadMove_CheckEffect + if_move MOVE_GROWL, Score_Minus10 + if_move MOVE_ROAR, Score_Minus10 + if_move MOVE_SING, Score_Minus10 + if_move MOVE_SUPERSONIC, Score_Minus10 + if_move MOVE_SCREECH, Score_Minus10 + if_move MOVE_SNORE, Score_Minus10 + if_move MOVE_UPROAR, Score_Minus10 + if_move MOVE_METAL_SOUND, Score_Minus10 + if_move MOVE_GRASS_WHISTLE, Score_Minus10 + +AI_CheckBadMove_CheckEffect:: @ 81D9D27 + if_effect EFFECT_SLEEP, AI_CBM_Sleep + if_effect EFFECT_EXPLOSION, AI_CBM_Explosion + if_effect EFFECT_DREAM_EATER, AI_CBM_DreamEater + if_effect EFFECT_ATTACK_UP, AI_CBM_AttackUp + if_effect EFFECT_DEFENSE_UP, AI_CBM_DefenseUp + if_effect EFFECT_SPEED_UP, AI_CBM_SpeedUp + if_effect EFFECT_SPECIAL_ATTACK_UP, AI_CBM_SpAtkUp + if_effect EFFECT_SPECIAL_DEFENSE_UP, AI_CBM_SpDefUp + if_effect EFFECT_ACCURACY_UP, AI_CBM_AccUp + if_effect EFFECT_EVASION_UP, AI_CBM_EvasionUp + if_effect EFFECT_ATTACK_DOWN, AI_CBM_AttackDown + if_effect EFFECT_DEFENSE_DOWN, AI_CBM_DefenseDown + if_effect EFFECT_SPEED_DOWN, AI_CBM_SpeedDown + if_effect EFFECT_SPECIAL_ATTACK_DOWN, AI_CBM_SpAtkDown + if_effect EFFECT_SPECIAL_DEFENSE_DOWN, AI_CBM_SpDefDown + if_effect EFFECT_ACCURACY_DOWN, AI_CBM_AccDown + if_effect EFFECT_EVASION_DOWN, AI_CBM_EvasionDown + if_effect EFFECT_HAZE, AI_CBM_Haze + if_effect EFFECT_BIDE, AI_CBM_HighRiskForDamage + if_effect EFFECT_ROAR, AI_CBM_Roar + if_effect EFFECT_TOXIC, AI_CBM_Poison + if_effect EFFECT_LIGHT_SCREEN, AI_CBM_LightScreen + if_effect EFFECT_OHKO, AI_CBM_OneHitKO + if_effect EFFECT_RAZOR_WIND, AI_CBM_HighRiskForDamage + if_effect EFFECT_SUPER_FANG, AI_CBM_HighRiskForDamage + if_effect EFFECT_MIST, AI_CBM_Mist + if_effect EFFECT_FOCUS_ENERGY, AI_CBM_FocusEnergy + if_effect EFFECT_CONFUSE, AI_CBM_Confuse + if_effect EFFECT_ATTACK_UP_2, AI_CBM_AttackUp + if_effect EFFECT_DEFENSE_UP_2, AI_CBM_DefenseUp + if_effect EFFECT_SPEED_UP_2, AI_CBM_SpeedUp + if_effect EFFECT_SPECIAL_ATTACK_UP_2, AI_CBM_SpAtkUp + if_effect EFFECT_SPECIAL_DEFENSE_UP_2, AI_CBM_SpDefUp + if_effect EFFECT_ACCURACY_UP_2, AI_CBM_AccUp + if_effect EFFECT_EVASION_UP_2, AI_CBM_EvasionUp + if_effect EFFECT_ATTACK_DOWN_2, AI_CBM_AttackDown + if_effect EFFECT_DEFENSE_DOWN_2, AI_CBM_DefenseDown + if_effect EFFECT_SPEED_DOWN_2, AI_CBM_SpeedDown + if_effect EFFECT_SPECIAL_ATTACK_DOWN_2, AI_CBM_SpAtkDown + if_effect EFFECT_SPECIAL_DEFENSE_DOWN_2, AI_CBM_SpDefDown + if_effect EFFECT_ACCURACY_DOWN_2, AI_CBM_AccDown + if_effect EFFECT_EVASION_DOWN_2, AI_CBM_EvasionDown + if_effect EFFECT_REFLECT, AI_CBM_Reflect + if_effect EFFECT_POISON, AI_CBM_Poison + if_effect EFFECT_PARALYZE, AI_CBM_Paralyze + if_effect EFFECT_SUBSTITUTE, AI_CBM_Substitute + if_effect EFFECT_RECHARGE, AI_CBM_HighRiskForDamage + if_effect EFFECT_LEECH_SEED, AI_CBM_LeechSeed + if_effect EFFECT_DISABLE, AI_CBM_Disable + if_effect EFFECT_LEVEL_DAMAGE, AI_CBM_HighRiskForDamage + if_effect EFFECT_PSYWAVE, AI_CBM_HighRiskForDamage + if_effect EFFECT_COUNTER, AI_CBM_HighRiskForDamage + if_effect EFFECT_ENCORE, AI_CBM_Encore + if_effect EFFECT_SNORE, AI_CBM_DamageDuringSleep + if_effect EFFECT_SLEEP_TALK, AI_CBM_DamageDuringSleep + if_effect EFFECT_FLAIL, AI_CBM_HighRiskForDamage + if_effect EFFECT_MEAN_LOOK, AI_CBM_CantEscape + if_effect EFFECT_NIGHTMARE, AI_CBM_Nightmare + if_effect EFFECT_MINIMIZE, AI_CBM_EvasionUp + if_effect EFFECT_CURSE, AI_CBM_Curse + if_effect EFFECT_SPIKES, AI_CBM_Spikes + if_effect EFFECT_FORESIGHT, AI_CBM_Foresight + if_effect EFFECT_PERISH_SONG, AI_CBM_PerishSong + if_effect EFFECT_SANDSTORM, AI_CBM_Sandstorm + if_effect EFFECT_SWAGGER, AI_CBM_Confuse + if_effect EFFECT_ATTRACT, AI_CBM_Attract + if_effect EFFECT_RETURN, AI_CBM_HighRiskForDamage + if_effect EFFECT_PRESENT, AI_CBM_HighRiskForDamage + if_effect EFFECT_FRUSTRATION, AI_CBM_HighRiskForDamage + if_effect EFFECT_SAFEGUARD, AI_CBM_Safeguard + if_effect EFFECT_MAGNITUDE, AI_CBM_Magnitude + if_effect EFFECT_BATON_PASS, AI_CBM_BatonPass + if_effect EFFECT_SONICBOOM, AI_CBM_HighRiskForDamage + if_effect EFFECT_RAIN_DANCE, AI_CBM_RainDance + if_effect EFFECT_SUNNY_DAY, AI_CBM_SunnyDay + if_effect EFFECT_BELLY_DRUM, AI_CBM_BellyDrum + if_effect EFFECT_PSYCH_UP, AI_CBM_Haze + if_effect EFFECT_MIRROR_COAT, AI_CBM_HighRiskForDamage + if_effect EFFECT_SKULL_BASH, AI_CBM_HighRiskForDamage + if_effect EFFECT_FUTURE_SIGHT, AI_CBM_FutureSight + if_effect EFFECT_TELEPORT, Score_Minus10 + if_effect EFFECT_DEFENSE_CURL, AI_CBM_DefenseUp + if_effect EFFECT_FAKE_OUT, AI_CBM_FakeOut + if_effect EFFECT_STOCKPILE, AI_CBM_Stockpile + if_effect EFFECT_SPIT_UP, AI_CBM_SpitUpAndSwallow + if_effect EFFECT_SWALLOW, AI_CBM_SpitUpAndSwallow + if_effect EFFECT_HAIL, AI_CBM_Hail + if_effect EFFECT_TORMENT, AI_CBM_Torment + if_effect EFFECT_FLATTER, AI_CBM_Confuse + if_effect EFFECT_WILL_O_WISP, AI_CBM_WillOWisp + if_effect EFFECT_MEMENTO, AI_CBM_Memento + if_effect EFFECT_FOCUS_PUNCH, AI_CBM_HighRiskForDamage + if_effect EFFECT_HELPING_HAND, AI_CBM_HelpingHand + if_effect EFFECT_TRICK, AI_CBM_TrickAndKnockOff + if_effect EFFECT_INGRAIN, AI_CBM_Ingrain + if_effect EFFECT_SUPERPOWER, AI_CBM_HighRiskForDamage + if_effect EFFECT_RECYCLE, AI_CBM_Recycle + if_effect EFFECT_KNOCK_OFF, AI_CBM_TrickAndKnockOff + if_effect EFFECT_ENDEAVOR, AI_CBM_HighRiskForDamage + if_effect EFFECT_IMPRISON, AI_CBM_Imprison + if_effect EFFECT_REFRESH, AI_CBM_Refresh + if_effect EFFECT_LOW_KICK, AI_CBM_HighRiskForDamage + if_effect EFFECT_MUD_SPORT, AI_CBM_MudSport + if_effect EFFECT_TICKLE, AI_CBM_Tickle + if_effect EFFECT_COSMIC_POWER, AI_CBM_CosmicPower + if_effect EFFECT_BULK_UP, AI_CBM_BulkUp + if_effect EFFECT_WATER_SPORT, AI_CBM_WaterSport + if_effect EFFECT_CALM_MIND, AI_CBM_CalmMind + if_effect EFFECT_DRAGON_DANCE, AI_CBM_DragonDance + end + +AI_CBM_Sleep:: @ 81D9FB6 + get_ability AI_TARGET + if_equal ABILITY_INSOMNIA, Score_Minus10 + if_equal ABILITY_VITAL_SPIRIT, Score_Minus10 + if_status AI_TARGET, STATUS1_ANY, Score_Minus10 +@ if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 @ Improvement in Emerald + end + +AI_CBM_Explosion:: @ 81D9FCF + if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 + get_ability AI_TARGET + if_equal ABILITY_DAMP, Score_Minus10 + count_alive_pokemon AI_USER + if_not_equal 0, AI_CBM_Explosion_End + count_alive_pokemon AI_TARGET + if_not_equal 0, Score_Minus10 + goto Score_Minus1 + +AI_CBM_Explosion_End:: @ 81D9FF2 + end + +AI_CBM_Nightmare:: @ 81D9FF3 + if_status2 AI_TARGET, STATUS2_NIGHTMARE, Score_Minus10 + if_not_status AI_TARGET, STATUS1_SLEEP, Score_Minus8 + end + +AI_CBM_DreamEater:: @ 81DA008 + if_not_status AI_TARGET, STATUS1_SLEEP, Score_Minus8 + if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 + end + +AI_CBM_BellyDrum:: @ 81DA019 + if_hp_less_than AI_USER, 51, Score_Minus10 + +AI_CBM_AttackUp:: @ 81DA020 + if_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10 + end + +AI_CBM_DefenseUp:: @ 81DA029 + if_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus10 + end + +AI_CBM_SpeedUp:: @ 81DA032 + if_stat_level_equal AI_USER, STAT_SPEED, 12, Score_Minus10 + end + +AI_CBM_SpAtkUp:: @ 81DA03B + if_stat_level_equal AI_USER, STAT_SPATK, 12, Score_Minus10 + end + +AI_CBM_SpDefUp:: @ 81DA044 + if_stat_level_equal AI_USER, STAT_SPDEF, 12, Score_Minus10 + end + +AI_CBM_AccUp:: @ 81DA04D + if_stat_level_equal AI_USER, STAT_ACC, 12, Score_Minus10 + end + +AI_CBM_EvasionUp:: @ 81DA056 + if_stat_level_equal AI_USER, STAT_EVASION, 12, Score_Minus10 + end + +AI_CBM_AttackDown:: @ 81DA05F + if_stat_level_equal AI_TARGET, STAT_ATK, 0, Score_Minus10 + get_ability AI_TARGET + if_equal ABILITY_HYPER_CUTTER, Score_Minus10 + goto CheckIfAbilityBlocksStatChange -AI_sub_81DA074:: @ 81DA074 - if_stat_level_equal 0, 2, 0, AI_sub_81DA433 - jump AI_sub_81DA0C5 +AI_CBM_DefenseDown:: @ 81DA074 + if_stat_level_equal AI_TARGET, STAT_DEF, 0, Score_Minus10 + goto CheckIfAbilityBlocksStatChange -AI_sub_81DA081:: @ 81DA081 - if_stat_level_equal 0, 3, 0, AI_sub_81DA433 - jump AI_sub_81DA0C5 +AI_CBM_SpeedDown:: @ 81DA081 + if_stat_level_equal AI_TARGET, STAT_SPEED, 0, Score_Minus10 +@ get_ability AI_TARGET @ Improvement in Emerald +@ if_equal ABILITY_SPEED_BOOST, Score_Minus10 + goto CheckIfAbilityBlocksStatChange -AI_sub_81DA08E:: @ 81DA08E - if_stat_level_equal 0, 4, 0, AI_sub_81DA433 - jump AI_sub_81DA0C5 +AI_CBM_SpAtkDown:: @ 81DA08E + if_stat_level_equal AI_TARGET, STAT_SPATK, 0, Score_Minus10 + goto CheckIfAbilityBlocksStatChange -AI_sub_81DA09B:: @ 81DA09B - if_stat_level_equal 0, 5, 0, AI_sub_81DA433 - jump AI_sub_81DA0C5 +AI_CBM_SpDefDown:: @ 81DA09B + if_stat_level_equal AI_TARGET, STAT_SPDEF, 0, Score_Minus10 + goto CheckIfAbilityBlocksStatChange -AI_sub_81DA0A8:: @ 81DA0A8 - if_stat_level_equal 0, 6, 0, AI_sub_81DA433 - get_ability 0 - if_equal 51, AI_sub_81DA433 - jump AI_sub_81DA0C5 +AI_CBM_AccDown:: @ 81DA0A8 + if_stat_level_equal AI_TARGET, STAT_ACC, 0, Score_Minus10 + get_ability AI_TARGET + if_equal ABILITY_KEEN_EYE, Score_Minus10 + goto CheckIfAbilityBlocksStatChange -AI_sub_81DA0BD:: @ 81DA0BD - if_stat_level_equal 0, 7, 0, AI_sub_81DA433 +AI_CBM_EvasionDown:: @ 81DA0BD + if_stat_level_equal AI_TARGET, STAT_EVASION, 0, Score_Minus10 -AI_sub_81DA0C5:: @ 81DA0C5 - get_ability 0 - if_equal 29, AI_sub_81DA433 - if_equal 73, AI_sub_81DA433 +CheckIfAbilityBlocksStatChange:: @ 81DA0C5 + get_ability AI_TARGET + if_equal ABILITY_CLEAR_BODY, Score_Minus10 + if_equal ABILITY_WHITE_SMOKE, Score_Minus10 end -AI_sub_81DA0D4:: @ 81DA0D4 - if_stat_level_less_than 1, 1, 6, AI_sub_81DA149 - if_stat_level_less_than 1, 2, 6, AI_sub_81DA149 - if_stat_level_less_than 1, 3, 6, AI_sub_81DA149 - if_stat_level_less_than 1, 4, 6, AI_sub_81DA149 - if_stat_level_less_than 1, 5, 6, AI_sub_81DA149 - if_stat_level_less_than 1, 6, 6, AI_sub_81DA149 - if_stat_level_less_than 1, 7, 6, AI_sub_81DA149 - if_stat_level_more_than 0, 1, 6, AI_sub_81DA149 - if_stat_level_more_than 0, 2, 6, AI_sub_81DA149 - if_stat_level_more_than 0, 3, 6, AI_sub_81DA149 - if_stat_level_more_than 0, 4, 6, AI_sub_81DA149 - if_stat_level_more_than 0, 5, 6, AI_sub_81DA149 - if_stat_level_more_than 0, 6, 6, AI_sub_81DA149 - if_stat_level_more_than 0, 7, 6, AI_sub_81DA149 - jump AI_sub_81DA433 +AI_CBM_Haze:: @ 81DA0D4 + if_stat_level_less_than AI_USER, STAT_ATK, 6, AI_CBM_Haze_End + if_stat_level_less_than AI_USER, STAT_DEF, 6, AI_CBM_Haze_End + if_stat_level_less_than AI_USER, STAT_SPEED, 6, AI_CBM_Haze_End + if_stat_level_less_than AI_USER, STAT_SPATK, 6, AI_CBM_Haze_End + if_stat_level_less_than AI_USER, STAT_SPDEF, 6, AI_CBM_Haze_End + if_stat_level_less_than AI_USER, STAT_ACC, 6, AI_CBM_Haze_End + if_stat_level_less_than AI_USER, STAT_EVASION, 6, AI_CBM_Haze_End + if_stat_level_more_than AI_TARGET, STAT_ATK, 6, AI_CBM_Haze_End + if_stat_level_more_than AI_TARGET, STAT_DEF, 6, AI_CBM_Haze_End + if_stat_level_more_than AI_TARGET, STAT_SPEED, 6, AI_CBM_Haze_End + if_stat_level_more_than AI_TARGET, STAT_SPATK, 6, AI_CBM_Haze_End + if_stat_level_more_than AI_TARGET, STAT_SPDEF, 6, AI_CBM_Haze_End + if_stat_level_more_than AI_TARGET, STAT_ACC, 6, AI_CBM_Haze_End + if_stat_level_more_than AI_TARGET, STAT_EVASION, 6, AI_CBM_Haze_End + goto Score_Minus10 -AI_sub_81DA149:: @ 81DA149 +AI_CBM_Haze_End:: @ 81DA149 end -AI_sub_81DA14A:: @ 81DA14A - count_alive_pokemon 0 - if_equal 0, AI_sub_81DA433 - get_ability 0 - if_equal 21, AI_sub_81DA433 +AI_CBM_Roar:: @ 81DA14A + count_alive_pokemon AI_TARGET + if_equal 0, Score_Minus10 + get_ability AI_TARGET + if_equal ABILITY_SUCTION_CUPS, Score_Minus10 end -AI_sub_81DA15B:: @ 81DA15B - get_type 0 - if_equal 8, AI_sub_81DA433 - if_equal 3, AI_sub_81DA433 - get_type 2 - if_equal 8, AI_sub_81DA433 - if_equal 3, AI_sub_81DA433 - get_ability 0 - if_equal 17, AI_sub_81DA433 - if_status 0, 255, AI_sub_81DA433 +AI_CBM_Poison:: @ 81DA15B + get_target_type1 + if_equal TYPE_STEEL, Score_Minus10 + if_equal TYPE_POISON, Score_Minus10 + get_target_type2 + if_equal TYPE_STEEL, Score_Minus10 + if_equal TYPE_POISON, Score_Minus10 + get_ability AI_TARGET + if_equal ABILITY_IMMUNITY, Score_Minus10 + if_status AI_TARGET, STATUS1_ANY, Score_Minus10 +@ if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 @ Improvement in Emerald end -AI_sub_81DA18A:: @ 81DA18A - if_status4 1, 2, AI_sub_81DA430 +AI_CBM_LightScreen:: @ 81DA18A + if_side_affecting AI_USER, SIDE_STATUS_LIGHTSCREEN, Score_Minus8 end -AI_sub_81DA195:: @ 81DA195 - if_damage_bonus 0, AI_sub_81DA433 - get_ability 0 - if_equal 5, AI_sub_81DA433 - if_level_cond 1, AI_sub_81DA433 +AI_CBM_OneHitKO:: @ 81DA195 + if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 + get_ability AI_TARGET + if_equal ABILITY_STURDY, Score_Minus10 + if_level_cond 1, Score_Minus10 end -AI_sub_81DA1AA:: @ 81DA1AA - get_ability 0 - if_equal 26, AI_sub_81DA433 +AI_CBM_Magnitude:: @ 81DA1AA + get_ability AI_TARGET + if_equal ABILITY_LEVITATE, Score_Minus10 -AI_sub_81DA1B2:: @ 81DA1B2 - if_damage_bonus 0, AI_sub_81DA433 - get_ability 0 - if_not_equal 25, AI_sub_81DA1CB - if_damage_bonus 80, AI_sub_81DA1CB - jump AI_sub_81DA433 +AI_CBM_HighRiskForDamage:: @ 81DA1B2 + if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 + get_ability AI_TARGET + if_not_equal ABILITY_WONDER_GUARD, AI_CBM_HighRiskForDamage_End + if_type_effectiveness AI_EFFECTIVENESS_x2, AI_CBM_HighRiskForDamage_End + goto Score_Minus10 -AI_sub_81DA1CB:: @ 81DA1CB +AI_CBM_HighRiskForDamage_End:: @ 81DA1CB end -AI_sub_81DA1CC:: @ 81DA1CC - if_status4 1, 256, AI_sub_81DA430 +AI_CBM_Mist:: @ 81DA1CC + if_side_affecting AI_USER, SIDE_STATUS_MIST, Score_Minus8 end -AI_sub_81DA1D7:: @ 81DA1D7 - if_status2 1, 1048576, AI_sub_81DA433 +AI_CBM_FocusEnergy:: @ 81DA1D7 + if_status2 AI_USER, STATUS2_FOCUS_ENERGY, Score_Minus10 end -AI_sub_81DA1E2:: @ 81DA1E2 - if_status2 0, 7, AI_sub_81DA42D - get_ability 0 - if_equal 20, AI_sub_81DA433 +AI_CBM_Confuse:: @ 81DA1E2 + if_status2 AI_TARGET, STATUS2_CONFUSION, Score_Minus5 + get_ability AI_TARGET + if_equal ABILITY_OWN_TEMPO, Score_Minus10 +@ if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 @ Improvement in Emerald end -AI_sub_81DA1F5:: @ 81DA1F5 - if_status4 1, 1, AI_sub_81DA430 +AI_CBM_Reflect:: @ 81DA1F5 + if_side_affecting AI_USER, SIDE_STATUS_REFLECT, Score_Minus8 end -AI_sub_81DA200:: @ 81DA200 - if_damage_bonus 0, AI_sub_81DA433 - get_ability 0 - if_equal 7, AI_sub_81DA433 - if_status 0, 255, AI_sub_81DA433 +AI_CBM_Paralyze:: @ 81DA200 + if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 + get_ability AI_TARGET + if_equal ABILITY_LIMBER, Score_Minus10 + if_status AI_TARGET, STATUS1_ANY, Score_Minus10 +@ if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 @ Improvement in Emerald end -AI_sub_81DA219:: @ 81DA219 - if_status2 1, 16777216, AI_sub_81DA430 - if_hp_less_than 1, 26, AI_sub_81DA433 +AI_CBM_Substitute:: @ 81DA219 + if_status2 AI_USER, STATUS2_SUBSTITUTE, Score_Minus8 + if_hp_less_than AI_USER, 26, Score_Minus10 end -AI_sub_81DA22B:: @ 81DA22B - if_status3 0, 4, AI_sub_81DA433 - get_type 0 - if_equal 12, AI_sub_81DA433 - get_type 2 - if_equal 12, AI_sub_81DA433 +AI_CBM_LeechSeed:: @ 81DA22B + if_status3 AI_TARGET, STATUS3_LEECHSEED, Score_Minus10 + get_target_type1 + if_equal TYPE_GRASS, Score_Minus10 + get_target_type2 + if_equal TYPE_GRASS, Score_Minus10 end -AI_sub_81DA246:: @ 81DA246 - if_last_move_did_damage 0, 0, AI_sub_81DA430 +AI_CBM_Disable:: @ 81DA246 + if_any_move_disabled AI_TARGET, Score_Minus8 end -AI_sub_81DA24E:: @ 81DA24E - if_last_move_did_damage 0, 1, AI_sub_81DA430 +AI_CBM_Encore:: @ 81DA24E + if_any_move_encored AI_TARGET, Score_Minus8 end -AI_sub_81DA256:: @ 81DA256 - if_not_status 1, 7, AI_sub_81DA430 +AI_CBM_DamageDuringSleep:: @ 81DA256 + if_not_status AI_USER, STATUS1_SLEEP, Score_Minus8 end -AI_sub_81DA261:: @ 81DA261 - if_status2 0, 67108864, AI_sub_81DA433 +AI_CBM_CantEscape:: @ 81DA261 + if_status2 AI_TARGET, STATUS2_ESCAPE_PREVENTION, Score_Minus10 end -AI_sub_81DA26C:: @ 81DA26C - if_stat_level_equal 1, 1, 12, AI_sub_81DA433 - if_stat_level_equal 1, 2, 12, AI_sub_81DA430 +AI_CBM_Curse:: @ 81DA26C + if_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10 + if_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus8 end -AI_sub_81DA27D:: @ 81DA27D - if_status4 0, 16, AI_sub_81DA433 +AI_CBM_Spikes:: @ 81DA27D + if_side_affecting AI_TARGET, SIDE_STATUS_SPIKES, Score_Minus10 end -AI_sub_81DA288:: @ 81DA288 - if_status2 0, 536870912, AI_sub_81DA433 +AI_CBM_Foresight:: @ 81DA288 + if_status2 AI_TARGET, STATUS2_FORESIGHT, Score_Minus10 end -AI_sub_81DA293:: @ 81DA293 - if_status3 0, 32, AI_sub_81DA433 +AI_CBM_PerishSong:: @ 81DA293 + if_status3 AI_TARGET, STATUS3_PERISH_SONG, Score_Minus10 end -AI_sub_81DA29E:: @ 81DA29E +AI_CBM_Sandstorm:: @ 81DA29E get_weather - if_equal 2, AI_sub_81DA430 + if_equal AI_WEATHER_SANDSTORM, Score_Minus8 end -AI_sub_81DA2A6:: @ 81DA2A6 - if_status2 0, 983040, AI_sub_81DA433 - get_ability 0 - if_equal 12, AI_sub_81DA433 - get_gender 1 - if_equal 0, AI_sub_81DA2CB - if_equal -2, AI_sub_81DA2D8 - jump AI_sub_81DA433 +AI_CBM_Attract:: @ 81DA2A6 + if_status2 AI_TARGET, STATUS2_INFATUATION, Score_Minus10 + get_ability AI_TARGET + if_equal ABILITY_OBLIVIOUS, Score_Minus10 + get_gender AI_USER + if_equal MON_MALE, AI_CBM_Attract_CheckIfTargetIsFemale + if_equal MON_FEMALE, AI_CBM_Attract_CheckIfTargetIsMale + goto Score_Minus10 -AI_sub_81DA2CB:: @ 81DA2CB - get_gender 0 - if_equal -2, AI_sub_81DA2E5 - jump AI_sub_81DA433 +AI_CBM_Attract_CheckIfTargetIsFemale:: @ 81DA2CB + get_gender AI_TARGET + if_equal MON_FEMALE, AI_CBM_Attract_End + goto Score_Minus10 -AI_sub_81DA2D8:: @ 81DA2D8 - get_gender 0 - if_equal 0, AI_sub_81DA2E5 - jump AI_sub_81DA433 +AI_CBM_Attract_CheckIfTargetIsMale:: @ 81DA2D8 + get_gender AI_TARGET + if_equal MON_MALE, AI_CBM_Attract_End + goto Score_Minus10 -AI_sub_81DA2E5:: @ 81DA2E5 +AI_CBM_Attract_End:: @ 81DA2E5 end -AI_sub_81DA2E6:: @ 81DA2E6 - if_status4 1, 32, AI_sub_81DA430 +AI_CBM_Safeguard:: @ 81DA2E6 + if_side_affecting AI_USER, SIDE_STATUS_SAFEGUARD, Score_Minus8 end -AI_sub_81DA2F1:: @ 81DA2F1 - if_stat_level_equal 0, 1, 0, AI_sub_81DA433 - if_stat_level_equal 0, 4, 0, AI_sub_81DA430 +AI_CBM_Memento:: @ 81DA2F1 + if_stat_level_equal AI_TARGET, STAT_ATK, 0, Score_Minus10 + if_stat_level_equal AI_TARGET, STAT_SPATK, 0, Score_Minus8 -AI_sub_81DA301:: @ 81DA301 - count_alive_pokemon 1 - if_equal 0, AI_sub_81DA433 +AI_CBM_BatonPass:: @ 81DA301 + count_alive_pokemon AI_USER + if_equal 0, Score_Minus10 end -AI_sub_81DA30A:: @ 81DA30A +AI_CBM_RainDance:: @ 81DA30A get_weather - if_equal 1, AI_sub_81DA430 + if_equal AI_WEATHER_RAIN, Score_Minus8 end -AI_sub_81DA312:: @ 81DA312 +AI_CBM_SunnyDay:: @ 81DA312 get_weather - if_equal 0, AI_sub_81DA430 + if_equal AI_WEATHER_SUN, Score_Minus8 end -AI_sub_81DA31A:: @ 81DA31A - if_status4 0, 64, AI_sub_81DA433 +AI_CBM_FutureSight:: @ 81DA31A + if_side_affecting AI_TARGET, SIDE_STATUS_FUTUREATTACK, Score_Minus10 +@ if_side_affecting AI_USER, SIDE_STATUS_FUTUREATTACK, Score_Minus12 @ Improvement in Emerald end -AI_sub_81DA325:: @ 81DA325 - is_first_turn 1 - if_equal 0, AI_sub_81DA433 +AI_CBM_FakeOut:: @ 81DA325 + is_first_turn_for AI_USER + if_equal 0, Score_Minus10 end -AI_sub_81DA32E:: @ 81DA32E - get_stockpile_count 1 - if_equal 3, AI_sub_81DA433 +AI_CBM_Stockpile:: @ 81DA32E + get_stockpile_count AI_USER + if_equal 3, Score_Minus10 end -AI_sub_81DA337:: @ 81DA337 - if_damage_bonus 0, AI_sub_81DA433 - get_stockpile_count 1 - if_equal 0, AI_sub_81DA433 +AI_CBM_SpitUpAndSwallow:: @ 81DA337 + if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 + get_stockpile_count AI_USER + if_equal 0, Score_Minus10 end -AI_sub_81DA346:: @ 81DA346 +AI_CBM_Hail:: @ 81DA346 get_weather - if_equal 3, AI_sub_81DA430 + if_equal AI_WEATHER_HAIL, Score_Minus8 end -AI_sub_81DA34E:: @ 81DA34E - if_status2 0, -2147483648, AI_sub_81DA433 +AI_CBM_Torment:: @ 81DA34E + if_status2 AI_TARGET, STATUS2_TORMENT, Score_Minus10 end -AI_sub_81DA359:: @ 81DA359 - get_ability 0 - if_equal 41, AI_sub_81DA433 - if_status 0, 255, AI_sub_81DA433 - if_damage_bonus 0, AI_sub_81DA433 - if_damage_bonus 20, AI_sub_81DA433 - if_damage_bonus 10, AI_sub_81DA433 +AI_CBM_WillOWisp:: @ 81DA359 + get_ability AI_TARGET + if_equal ABILITY_WATER_VEIL, Score_Minus10 + if_status AI_TARGET, STATUS1_ANY, Score_Minus10 + if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 + if_type_effectiveness AI_EFFECTIVENESS_x0_5, Score_Minus10 + if_type_effectiveness AI_EFFECTIVENESS_x0_25, Score_Minus10 +@ if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 @ Improvement in Emerald end -AI_sub_81DA37E:: @ 81DA37E - is_double_battle - if_equal 0, AI_sub_81DA433 +AI_CBM_HelpingHand:: @ 81DA37E + if_not_double_battle Score_Minus10 end -AI_sub_81DA386:: @ 81DA386 - get_ability 0 - if_equal 60, AI_sub_81DA433 +AI_CBM_TrickAndKnockOff:: @ 81DA386 + get_ability AI_TARGET + if_equal ABILITY_STICKY_HOLD, Score_Minus10 end -AI_sub_81DA38F:: @ 81DA38F - if_status3 1, 1024, AI_sub_81DA433 +AI_CBM_Ingrain:: @ 81DA38F + if_status3 AI_USER, STATUS3_ROOTED, Score_Minus10 end -AI_sub_81DA39A:: @ 81DA39A - get_item 1 - if_equal 0, AI_sub_81DA433 +AI_CBM_Recycle:: @ 81DA39A + get_used_held_item AI_USER + if_equal ITEM_NONE, Score_Minus10 end -AI_sub_81DA3A3:: @ 81DA3A3 - if_status3 1, 8192, AI_sub_81DA433 +AI_CBM_Imprison:: @ 81DA3A3 + if_status3 AI_USER, STATUS3_IMPRISONED_OTHERS, Score_Minus10 end -AI_sub_81DA3AE:: @ 81DA3AE - if_not_status 1, 216, AI_sub_81DA433 +AI_CBM_Refresh:: @ 81DA3AE + if_not_status AI_USER, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, Score_Minus10 end -AI_sub_81DA3B9:: @ 81DA3B9 - if_status3 1, 65536, AI_sub_81DA433 +AI_CBM_MudSport:: @ 81DA3B9 + if_status3 AI_USER, STATUS3_MUDSPORT, Score_Minus10 end -AI_sub_81DA3C4:: @ 81DA3C4 - if_stat_level_equal 0, 1, 0, AI_sub_81DA433 - if_stat_level_equal 0, 2, 0, AI_sub_81DA430 +AI_CBM_Tickle:: @ 81DA3C4 + if_stat_level_equal AI_TARGET, STAT_ATK, 0, Score_Minus10 + if_stat_level_equal AI_TARGET, STAT_DEF, 0, Score_Minus8 end -AI_sub_81DA3D5:: @ 81DA3D5 - if_stat_level_equal 1, 2, 12, AI_sub_81DA433 - if_stat_level_equal 1, 5, 12, AI_sub_81DA430 +AI_CBM_CosmicPower:: @ 81DA3D5 + if_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus10 + if_stat_level_equal AI_USER, STAT_SPDEF, 12, Score_Minus8 end -AI_sub_81DA3E6:: @ 81DA3E6 - if_stat_level_equal 1, 1, 12, AI_sub_81DA433 - if_stat_level_equal 1, 2, 12, AI_sub_81DA430 +AI_CBM_BulkUp:: @ 81DA3E6 + if_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10 + if_stat_level_equal AI_USER, STAT_DEF, 12, Score_Minus8 end -AI_sub_81DA3F7:: @ 81DA3F7 - if_status3 1, 131072, AI_sub_81DA433 +AI_CBM_WaterSport:: @ 81DA3F7 + if_status3 AI_USER, STATUS3_WATERSPORT, Score_Minus10 end -AI_sub_81DA402:: @ 81DA402 - if_stat_level_equal 1, 4, 12, AI_sub_81DA433 - if_stat_level_equal 1, 5, 12, AI_sub_81DA430 +AI_CBM_CalmMind:: @ 81DA402 + if_stat_level_equal AI_USER, STAT_SPATK, 12, Score_Minus10 + if_stat_level_equal AI_USER, STAT_SPDEF, 12, Score_Minus8 end -AI_sub_81DA413:: @ 81DA413 - if_stat_level_equal 1, 1, 12, AI_sub_81DA433 - if_stat_level_equal 1, 3, 12, AI_sub_81DA430 +AI_CBM_DragonDance:: @ 81DA413 + if_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10 + if_stat_level_equal AI_USER, STAT_SPEED, 12, Score_Minus8 end -AI_sub_81DA424:: @ 81DA424 +Score_Minus1:: @ 81DA424 score -1 end -AI_sub_81DA427:: @ 81DA427 +Score_Minus2:: @ 81DA427 score -2 end -AI_sub_81DA42A:: @ 81DA42A +Score_Minus3:: @ 81DA42A score -3 end -AI_sub_81DA42D:: @ 81DA42D +Score_Minus5:: @ 81DA42D score -5 end -AI_sub_81DA430:: @ 81DA430 +Score_Minus8:: @ 81DA430 score -8 end -AI_sub_81DA433:: @ 81DA433 +Score_Minus10:: @ 81DA433 score -10 end -AI_sub_81DA436:: @ 81DA436 +Score_Minus12:: @ 81DA436 score -12 end - score 1 - end - score 2 - end - score 3 - end - score 5 - end - -AI_TryToFaint:: @ 81DA445 - if_effect 1, AI_sub_81DA71C - if_effect 3, AI_sub_81DA738 - if_effect 7, AI_sub_81DA752 - if_effect 8, AI_sub_81DA7B0 - if_effect 9, AI_sub_81DA7C4 - if_effect 10, AI_sub_81DA848 - if_effect 11, AI_sub_81DA883 - if_effect 12, AI_sub_81DA8E9 - if_effect 13, AI_sub_81DA8FF - if_effect 14, AI_sub_81DA93A - if_effect 15, AI_sub_81DA9A0 - if_effect 16, AI_sub_81DA9BA - if_effect 17, AI_sub_81DAA54 - if_effect 18, AI_sub_81DAA84 - if_effect 19, AI_sub_81DAAD6 - if_effect 20, AI_sub_81DAB0D - if_effect 21, AI_sub_81DAB23 - if_effect 22, AI_sub_81DAB77 - if_effect 23, AI_sub_81DAB98 - if_effect 24, AI_sub_81DAC2C - if_effect 25, AI_sub_81DAC4D - if_effect 26, AI_sub_81DAD10 - if_effect 28, AI_sub_81DAD1A - if_effect 30, AI_sub_81DAD52 - if_effect 32, AI_sub_81DAD83 - if_effect 33, AI_sub_81DADDC - if_effect 35, AI_sub_81DAE1B - if_effect 37, AI_sub_81DAE4A - if_effect 38, AI_sub_81DAEAA - if_effect 39, AI_sub_81DB645 - if_effect 40, AI_sub_81DAEAB - if_effect 42, AI_sub_81DAEB5 - if_effect 43, AI_sub_81DAEEB - if_effect 49, AI_sub_81DAF1A - if_effect 50, AI_sub_81DA848 - if_effect 51, AI_sub_81DA883 - if_effect 52, AI_sub_81DA8E9 - if_effect 53, AI_sub_81DA8FF - if_effect 54, AI_sub_81DA93A - if_effect 55, AI_sub_81DA9A0 - if_effect 56, AI_sub_81DA9BA - if_effect 58, AI_sub_81DAA84 - if_effect 59, AI_sub_81DAAD6 - if_effect 60, AI_sub_81DAB0D - if_effect 61, AI_sub_81DAB23 - if_effect 62, AI_sub_81DAB77 - if_effect 63, AI_sub_81DAB98 - if_effect 64, AI_sub_81DAC2C - if_effect 65, AI_sub_81DAF3C - if_effect 66, AI_sub_81DAF6C - if_effect 67, AI_sub_81DAF7D - if_effect 70, AI_sub_81DAAF7 - if_effect 75, AI_sub_81DB645 - if_effect 78, AI_sub_81DAF9A - if_effect 79, AI_sub_81DAFBD - if_effect 80, AI_sub_81DB053 - if_effect 84, AI_sub_81DADDC - if_effect 86, AI_sub_81DB07B - if_effect 89, AI_sub_81DB09A - if_effect 90, AI_sub_81DB13B - if_effect 91, AI_sub_81DB1A3 - if_effect 92, AI_sub_81DB1CF - if_effect 94, AI_sub_81DB1D2 - if_effect 97, AI_sub_81DB1DB - if_effect 98, AI_sub_81DB1DE - if_effect 99, AI_sub_81DB214 - if_effect 102, AI_sub_81DB259 - if_effect 105, AI_sub_81DB270 - if_effect 106, AI_sub_81DAEB5 - if_effect 108, AI_sub_81DA9BA - if_effect 109, AI_sub_81DB293 - if_effect 111, AI_sub_81DB2E2 - if_effect 113, AI_sub_81DB3A3 - if_effect 116, AI_sub_81DB3D1 - if_effect 127, AI_sub_81DB3EF - if_effect -128, AI_sub_81DB48B - if_effect -124, AI_sub_81DAD69 - if_effect -123, AI_sub_81DAD69 - if_effect -122, AI_sub_81DAD69 - if_effect -120, AI_sub_81DB4C1 - if_effect -119, AI_sub_81DB500 - if_effect -114, AI_sub_81DB529 - if_effect -113, AI_sub_81DB538 - if_effect -112, AI_sub_81DB5A5 - if_effect -111, AI_sub_81DB645 - if_effect -105, AI_sub_81DB645 - if_effect -101, AI_sub_81DB669 - if_effect -99, AI_sub_81DAD83 - if_effect -98, AI_sub_81DB6F3 - if_effect -95, AI_sub_81DB6F6 - if_effect -94, AI_sub_81DAD83 - if_effect -92, AI_sub_81DB707 - if_effect -90, AI_sub_81DAF12 - if_effect -88, AI_sub_81DA752 - if_effect -87, AI_sub_81DB730 - if_effect -86, AI_sub_81DB73D - if_effect -85, AI_sub_81DB78C - if_effect -79, AI_sub_81DB79E - if_effect -78, AI_sub_81DB7E9 - if_effect -74, AI_sub_81DB820 - if_effect -73, AI_sub_81DB850 - if_effect -72, AI_sub_81DB883 - if_effect -71, AI_sub_81DB8A2 - if_effect -70, AI_sub_81DB8D0 - if_effect -68, AI_sub_81DB8E2 - if_effect -67, AI_sub_81DB8FA - if_effect -66, AI_sub_81DB926 - if_effect -65, AI_sub_81DB7E9 - if_effect -64, AI_sub_81DB94E - if_effect -63, AI_sub_81DB95F - if_effect -61, AI_sub_81DB96E - if_effect -56, AI_sub_81DAEEB - if_effect -55, AI_sub_81DB9D8 - if_effect -52, AI_sub_81DB9FE - if_effect -51, AI_sub_81DAAD6 - if_effect -50, AI_sub_81DA93A - if_effect -48, AI_sub_81DA883 - if_effect -47, AI_sub_81DAEEB - if_effect -46, AI_sub_81DBA26 - if_effect -45, AI_sub_81DA93A - if_effect -44, AI_sub_81DBA4C - end - -AI_sub_81DA71C:: @ 81DA71C - if_move_effect 0, 8, AI_sub_81DA72F - if_move_effect 0, 107, AI_sub_81DA72F - jump AI_sub_81DA737 - -AI_sub_81DA72F:: @ 81DA72F - if_random_less_than -128, AI_sub_81DA737 - score 1 - -AI_sub_81DA737:: @ 81DA737 - end - -AI_sub_81DA738:: @ 81DA738 - if_damage_bonus 20, AI_sub_81DA749 - if_damage_bonus 10, AI_sub_81DA749 - jump AI_sub_81DA751 - -AI_sub_81DA749:: @ 81DA749 - if_random_less_than 50, AI_sub_81DA751 + +Score_Plus1:: + score +1 + end + +Score_Plus2:: + score +2 + end + +Score_Plus3:: + score +3 + end + +Score_Plus5:: + score +5 + end + +@ Improvement in Emerald +@Score_Plus10:: +@ score +10 +@ end + +AI_CheckViability:: @ 81DA445 + if_effect EFFECT_SLEEP, AI_CV_Sleep + if_effect EFFECT_ABSORB, AI_CV_Absorb + if_effect EFFECT_EXPLOSION, AI_CV_SelfKO + if_effect EFFECT_DREAM_EATER, AI_CV_DreamEater + if_effect EFFECT_MIRROR_MOVE, AI_CV_MirrorMove + if_effect EFFECT_ATTACK_UP, AI_CV_AttackUp + if_effect EFFECT_DEFENSE_UP, AI_CV_DefenseUp + if_effect EFFECT_SPEED_UP, AI_CV_SpeedUp + if_effect EFFECT_SPECIAL_ATTACK_UP, AI_CV_SpAtkUp + if_effect EFFECT_SPECIAL_DEFENSE_UP, AI_CV_SpDefUp + if_effect EFFECT_ACCURACY_UP, AI_CV_AccuracyUp + if_effect EFFECT_EVASION_UP, AI_CV_EvasionUp + if_effect EFFECT_ALWAYS_HIT, AI_CV_AlwaysHit + if_effect EFFECT_ATTACK_DOWN, AI_CV_AttackDown + if_effect EFFECT_DEFENSE_DOWN, AI_CV_DefenseDown + if_effect EFFECT_SPEED_DOWN, AI_CV_SpeedDown + if_effect EFFECT_SPECIAL_ATTACK_DOWN, AI_CV_SpAtkDown + if_effect EFFECT_SPECIAL_DEFENSE_DOWN, AI_CV_SpDefDown + if_effect EFFECT_ACCURACY_DOWN, AI_CV_AccuracyDown + if_effect EFFECT_EVASION_DOWN, AI_CV_EvasionDown + if_effect EFFECT_HAZE, AI_CV_Haze + if_effect EFFECT_BIDE, AI_CV_Bide + if_effect EFFECT_ROAR, AI_CV_Roar + if_effect EFFECT_CONVERSION, AI_CV_Conversion + if_effect EFFECT_RESTORE_HP, AI_CV_Heal + if_effect EFFECT_TOXIC, AI_CV_Toxic + if_effect EFFECT_LIGHT_SCREEN, AI_CV_LightScreen + if_effect EFFECT_REST, AI_CV_Rest + if_effect EFFECT_OHKO, AI_CV_OneHitKO + if_effect EFFECT_RAZOR_WIND, AI_CV_ChargeUpMove + if_effect EFFECT_SUPER_FANG, AI_CV_SuperFang + if_effect EFFECT_TRAP, AI_CV_Trap + if_effect EFFECT_HIGH_CRITICAL, AI_CV_HighCrit + if_effect EFFECT_CONFUSE, AI_CV_Confuse + if_effect EFFECT_ATTACK_UP_2, AI_CV_AttackUp + if_effect EFFECT_DEFENSE_UP_2, AI_CV_DefenseUp + if_effect EFFECT_SPEED_UP_2, AI_CV_SpeedUp + if_effect EFFECT_SPECIAL_ATTACK_UP_2, AI_CV_SpAtkUp + if_effect EFFECT_SPECIAL_DEFENSE_UP_2, AI_CV_SpDefUp + if_effect EFFECT_ACCURACY_UP_2, AI_CV_AccuracyUp + if_effect EFFECT_EVASION_UP_2, AI_CV_EvasionUp + if_effect EFFECT_ATTACK_DOWN_2, AI_CV_AttackDown + if_effect EFFECT_DEFENSE_DOWN_2, AI_CV_DefenseDown + if_effect EFFECT_SPEED_DOWN_2, AI_CV_SpeedDown + if_effect EFFECT_SPECIAL_ATTACK_DOWN_2, AI_CV_SpAtkDown + if_effect EFFECT_SPECIAL_DEFENSE_DOWN_2, AI_CV_SpDefDown + if_effect EFFECT_ACCURACY_DOWN_2, AI_CV_AccuracyDown + if_effect EFFECT_EVASION_DOWN_2, AI_CV_EvasionDown + if_effect EFFECT_REFLECT, AI_CV_Reflect + if_effect EFFECT_POISON, AI_CV_Poison + if_effect EFFECT_PARALYZE, AI_CV_Paralyze + @ if_effect EFFECT_SWAGGER, AI_CV_Swagger @ Improvement in Emerald + if_effect EFFECT_SPEED_DOWN_HIT, AI_CV_SpeedDownFromChance + if_effect EFFECT_SKY_ATTACK, AI_CV_ChargeUpMove + if_effect EFFECT_VITAL_THROW, AI_CV_VitalThrow + if_effect EFFECT_SUBSTITUTE, AI_CV_Substitute + if_effect EFFECT_RECHARGE, AI_CV_Recharge + if_effect EFFECT_LEECH_SEED, AI_CV_Toxic + if_effect EFFECT_DISABLE, AI_CV_Disable + if_effect EFFECT_COUNTER, AI_CV_Counter + if_effect EFFECT_ENCORE, AI_CV_Encore + if_effect EFFECT_PAIN_SPLIT, AI_CV_PainSplit + if_effect EFFECT_SNORE, AI_CV_Snore + if_effect EFFECT_LOCK_ON, AI_CV_LockOn + if_effect EFFECT_SLEEP_TALK, AI_CV_SleepTalk + if_effect EFFECT_DESTINY_BOND, AI_CV_DestinyBond + if_effect EFFECT_FLAIL, AI_CV_Flail + if_effect EFFECT_HEAL_BELL, AI_CV_HealBell + if_effect EFFECT_THIEF, AI_CV_Thief + if_effect EFFECT_MEAN_LOOK, AI_CV_Trap + if_effect EFFECT_MINIMIZE, AI_CV_EvasionUp + if_effect EFFECT_CURSE, AI_CV_Curse + if_effect EFFECT_PROTECT, AI_CV_Protect + if_effect EFFECT_FORESIGHT, AI_CV_Foresight + if_effect EFFECT_ENDURE, AI_CV_Endure + if_effect EFFECT_BATON_PASS, AI_CV_BatonPass + if_effect EFFECT_PURSUIT, AI_CV_Pursuit + if_effect EFFECT_MORNING_SUN, AI_CV_HealWeather + if_effect EFFECT_SYNTHESIS, AI_CV_HealWeather + if_effect EFFECT_MOONLIGHT, AI_CV_HealWeather + if_effect EFFECT_RAIN_DANCE, AI_CV_RainDance + if_effect EFFECT_SUNNY_DAY, AI_CV_SunnyDay + if_effect EFFECT_BELLY_DRUM, AI_CV_BellyDrum + if_effect EFFECT_PSYCH_UP, AI_CV_PsychUp + if_effect EFFECT_MIRROR_COAT, AI_CV_MirrorCoat + if_effect EFFECT_SKULL_BASH, AI_CV_ChargeUpMove + if_effect EFFECT_SOLARBEAM, AI_CV_ChargeUpMove + if_effect EFFECT_SEMI_INVULNERABLE, AI_CV_SemiInvulnerable + if_effect EFFECT_SOFTBOILED, AI_CV_Heal + if_effect EFFECT_FAKE_OUT, AI_CV_FakeOut + if_effect EFFECT_SPIT_UP, AI_CV_SpitUp + if_effect EFFECT_SWALLOW, AI_CV_Heal + if_effect EFFECT_HAIL, AI_CV_Hail + if_effect EFFECT_FLATTER, AI_CV_Flatter + if_effect EFFECT_MEMENTO, AI_CV_SelfKO + if_effect EFFECT_FACADE, AI_CV_Facade + if_effect EFFECT_FOCUS_PUNCH, AI_CV_FocusPunch + if_effect EFFECT_SMELLINGSALT, AI_CV_SmellingSalt + if_effect EFFECT_TRICK, AI_CV_Trick + if_effect EFFECT_ROLE_PLAY, AI_CV_ChangeSelfAbility + if_effect EFFECT_SUPERPOWER, AI_CV_Superpower + if_effect EFFECT_MAGIC_COAT, AI_CV_MagicCoat + if_effect EFFECT_RECYCLE, AI_CV_Recycle + if_effect EFFECT_REVENGE, AI_CV_Revenge + if_effect EFFECT_BRICK_BREAK, AI_CV_BrickBreak + if_effect EFFECT_KNOCK_OFF, AI_CV_KnockOff + if_effect EFFECT_ENDEAVOR, AI_CV_Endeavor + if_effect EFFECT_ERUPTION, AI_CV_Eruption + if_effect EFFECT_SKILL_SWAP, AI_CV_ChangeSelfAbility + if_effect EFFECT_IMPRISON, AI_CV_Imprison + if_effect EFFECT_REFRESH, AI_CV_Refresh + if_effect EFFECT_SNATCH, AI_CV_Snatch + if_effect EFFECT_BLAZE_KICK, AI_CV_HighCrit + if_effect EFFECT_MUD_SPORT, AI_CV_MudSport + if_effect EFFECT_OVERHEAT, AI_CV_Overheat + if_effect EFFECT_TICKLE, AI_CV_DefenseDown + if_effect EFFECT_COSMIC_POWER, AI_CV_SpDefUp + if_effect EFFECT_BULK_UP, AI_CV_DefenseUp + if_effect EFFECT_POISON_TAIL, AI_CV_HighCrit + if_effect EFFECT_WATER_SPORT, AI_CV_WaterSport + if_effect EFFECT_CALM_MIND, AI_CV_SpDefUp + if_effect EFFECT_DRAGON_DANCE, AI_CV_DragonDance + end + +AI_CV_Sleep:: @ 81DA71C + if_has_move_with_effect AI_TARGET, EFFECT_DREAM_EATER, AI_CV_SleepEncourageSlpDamage + if_has_move_with_effect AI_TARGET, EFFECT_NIGHTMARE, AI_CV_SleepEncourageSlpDamage + goto AI_CV_Sleep_End + +AI_CV_SleepEncourageSlpDamage:: @ 81DA72F + if_random_less_than 128, AI_CV_Sleep_End + score +1 + +AI_CV_Sleep_End:: @ 81DA737 + end + +AI_CV_Absorb:: @ 81DA738 + if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_AbsorbEncourageMaybe + if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_AbsorbEncourageMaybe + goto AI_CV_Absorb_End + +AI_CV_AbsorbEncourageMaybe:: @ 81DA749 + if_random_less_than 50, AI_CV_Absorb_End score -3 -AI_sub_81DA751:: @ 81DA751 +AI_CV_Absorb_End:: @ 81DA751 end -AI_sub_81DA752:: @ 81DA752 - if_stat_level_less_than 0, 7, 7, AI_sub_81DA76C +AI_CV_SelfKO:: @ 81DA752 + if_stat_level_less_than AI_TARGET, STAT_EVASION, 7, AI_CV_SelfKO_Encourage1 score -1 - if_stat_level_less_than 0, 7, 10, AI_sub_81DA76C - if_random_less_than -128, AI_sub_81DA76C + if_stat_level_less_than AI_TARGET, STAT_EVASION, 10, AI_CV_SelfKO_Encourage1 + if_random_less_than 128, AI_CV_SelfKO_Encourage1 score -1 -AI_sub_81DA76C:: @ 81DA76C - if_hp_less_than 1, 80, AI_sub_81DA784 - if_would_go_first 1, AI_sub_81DA784 - if_random_less_than 50, AI_sub_81DA7AF - jump AI_sub_81DA42A - -AI_sub_81DA784:: @ 81DA784 - if_hp_more_than 1, 50, AI_sub_81DA7A7 - if_random_less_than -128, AI_sub_81DA793 - score 1 - -AI_sub_81DA793:: @ 81DA793 - if_hp_more_than 1, 30, AI_sub_81DA7AF - if_random_less_than 50, AI_sub_81DA7AF - score 1 - jump AI_sub_81DA7AF - -AI_sub_81DA7A7:: @ 81DA7A7 - if_random_less_than 50, AI_sub_81DA7AF +AI_CV_SelfKO_Encourage1:: @ 81DA76C + if_hp_less_than AI_USER, 80, AI_CV_SelfKO_Encourage2 + if_target_faster AI_CV_SelfKO_Encourage2 + if_random_less_than 50, AI_CV_SelfKO_End + goto Score_Minus3 + +AI_CV_SelfKO_Encourage2:: @ 81DA784 + if_hp_more_than AI_USER, 50, AI_CV_SelfKO_Encourage4 + if_random_less_than 128, AI_CV_SelfKO_Encourage3 + score +1 + +AI_CV_SelfKO_Encourage3:: @ 81DA793 + if_hp_more_than AI_USER, 30, AI_CV_SelfKO_End + if_random_less_than 50, AI_CV_SelfKO_End + score +1 + goto AI_CV_SelfKO_End + +AI_CV_SelfKO_Encourage4:: @ 81DA7A7 + if_random_less_than 50, AI_CV_SelfKO_End score -1 -AI_sub_81DA7AF:: @ 81DA7AF +AI_CV_SelfKO_End:: @ 81DA7AF end -AI_sub_81DA7B0:: @ 81DA7B0 - if_damage_bonus 10, AI_sub_81DA7C1 - if_damage_bonus 20, AI_sub_81DA7C1 - jump AI_sub_81DA7C3 +AI_CV_DreamEater:: @ 81DA7B0 + if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_DreamEater_ScoreDown1 + if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_DreamEater_ScoreDown1 + goto AI_CV_DreamEater_End -AI_sub_81DA7C1:: @ 81DA7C1 +AI_CV_DreamEater_ScoreDown1:: @ 81DA7C1 score -1 -AI_sub_81DA7C3:: @ 81DA7C3 +AI_CV_DreamEater_End:: @ 81DA7C3 end -AI_sub_81DA7C4:: @ 81DA7C4 - if_would_go_first 1, AI_sub_81DA7E2 - get_move 0 - if_not_in_words AI_words_81DA7F8, AI_sub_81DA7E2 - if_random_less_than -128, AI_sub_81DA7F5 - score 2 - jump AI_sub_81DA7F5 +AI_CV_MirrorMove:: @ 81DA7C4 + if_target_faster AI_CV_MirrorMove2 + get_last_used_move AI_TARGET + if_not_in_hwords AI_CV_MirrorMove_EncouragedMovesToMirror, AI_CV_MirrorMove2 + if_random_less_than 128, AI_CV_MirrorMove_End + score +2 + goto AI_CV_MirrorMove_End -AI_sub_81DA7E2:: @ 81DA7E2 - get_move 0 - if_in_words AI_words_81DA7F8, AI_sub_81DA7F5 - if_random_less_than 80, AI_sub_81DA7F5 +AI_CV_MirrorMove2:: @ 81DA7E2 + get_last_used_move AI_TARGET + if_in_hwords AI_CV_MirrorMove_EncouragedMovesToMirror, AI_CV_MirrorMove_End + if_random_less_than 80, AI_CV_MirrorMove_End score -1 -AI_sub_81DA7F5:: @ 81DA7F5 +AI_CV_MirrorMove_End:: @ 81DA7F5 end - .space 2 -AI_words_81DA7F8:: @ 81DA7F8 + .space 2 +AI_CV_MirrorMove_EncouragedMovesToMirror:: @ 81DA7F8 .align 1 - .2byte 0x4F - .2byte 0x8E - .2byte 0x93 - .2byte 0x5F - .2byte 0x2F - .2byte 0x140 - .2byte 0x145 - .2byte 0x1C - .2byte 0x6C - .2byte 0x5C - .2byte 0xC - .2byte 0x20 - .2byte 0x5A - .2byte 0x149 - .2byte 0xEE - .2byte 0xB1 - .2byte 0x6D - .2byte 0xBA - .2byte 0x67 - .2byte 0xB2 - .2byte 0xB8 - .2byte 0x139 - .2byte 0x13F - .2byte 0x56 - .2byte 0x89 - .2byte 0x4D - .2byte 0xF7 - .2byte 0xDF - .2byte 0x3F - .2byte 0xF5 - .2byte 0xA8 - .2byte 0x157 - .2byte 0xD5 - .2byte 0xCF - .2byte 0x103 - .2byte 0x104 - .2byte 0x10F - .2byte 0x114 - .2byte 0x11D - .2byte 0xFFFF - -AI_sub_81DA848:: @ 81DA848 - if_stat_level_less_than 1, 1, 9, AI_sub_81DA85D - if_random_less_than 100, AI_sub_81DA86C + .2byte MOVE_SLEEP_POWDER + .2byte MOVE_LOVELY_KISS + .2byte MOVE_SPORE + .2byte MOVE_HYPNOSIS + .2byte MOVE_SING + .2byte MOVE_GRASS_WHISTLE + .2byte MOVE_SHADOW_PUNCH + .2byte MOVE_SAND_ATTACK + .2byte MOVE_SMOKESCREEN + .2byte MOVE_TOXIC + .2byte MOVE_GUILLOTINE + .2byte MOVE_HORN_DRILL + .2byte MOVE_FISSURE + .2byte MOVE_SHEER_COLD + .2byte MOVE_CROSS_CHOP + .2byte MOVE_AEROBLAST + .2byte MOVE_CONFUSE_RAY + .2byte MOVE_SWEET_KISS + .2byte MOVE_SCREECH + .2byte MOVE_COTTON_SPORE + .2byte MOVE_SCARY_FACE + .2byte MOVE_FAKE_TEARS + .2byte MOVE_METAL_SOUND + .2byte MOVE_THUNDER_WAVE + .2byte MOVE_GLARE + .2byte MOVE_POISON_POWDER + .2byte MOVE_SHADOW_BALL + .2byte MOVE_DYNAMIC_PUNCH + .2byte MOVE_HYPER_BEAM + .2byte MOVE_EXTREME_SPEED + .2byte MOVE_THIEF + .2byte MOVE_COVET + .2byte MOVE_ATTRACT + .2byte MOVE_SWAGGER + .2byte MOVE_TORMENT + .2byte MOVE_FLATTER + .2byte MOVE_TRICK + .2byte MOVE_SUPERPOWER + .2byte MOVE_SKILL_SWAP + .2byte -1 + +AI_CV_AttackUp:: @ 81DA848 + if_stat_level_less_than AI_USER, STAT_ATK, 9, AI_CV_AttackUp2 + if_random_less_than 100, AI_CV_AttackUp3 score -1 - jump AI_sub_81DA86C + goto AI_CV_AttackUp3 -AI_sub_81DA85D:: @ 81DA85D - if_hp_not_equal 1, 100, AI_sub_81DA86C - if_random_less_than -128, AI_sub_81DA86C - score 2 +AI_CV_AttackUp2:: @ 81DA85D + if_hp_not_equal AI_USER, 100, AI_CV_AttackUp3 + if_random_less_than 128, AI_CV_AttackUp3 + score +2 -AI_sub_81DA86C:: @ 81DA86C - if_hp_more_than 1, 70, AI_sub_81DA882 - if_hp_less_than 1, 40, AI_sub_81DA880 - if_random_less_than 40, AI_sub_81DA882 +AI_CV_AttackUp3:: @ 81DA86C + if_hp_more_than AI_USER, 70, AI_CV_AttackUp_End + if_hp_less_than AI_USER, 40, AI_CV_AttackUp_ScoreDown2 + if_random_less_than 40, AI_CV_AttackUp_End -AI_sub_81DA880:: @ 81DA880 +AI_CV_AttackUp_ScoreDown2:: @ 81DA880 score -2 -AI_sub_81DA882:: @ 81DA882 +AI_CV_AttackUp_End:: @ 81DA882 end -AI_sub_81DA883:: @ 81DA883 - if_stat_level_less_than 1, 2, 9, AI_sub_81DA898 - if_random_less_than 100, AI_sub_81DA8A7 +AI_CV_DefenseUp:: @ 81DA883 + if_stat_level_less_than AI_USER, STAT_DEF, 9, AI_CV_DefenseUp2 + if_random_less_than 100, AI_CV_DefenseUp3 score -1 - jump AI_sub_81DA8A7 + goto AI_CV_DefenseUp3 -AI_sub_81DA898:: @ 81DA898 - if_hp_not_equal 1, 100, AI_sub_81DA8A7 - if_random_less_than -128, AI_sub_81DA8A7 - score 2 +AI_CV_DefenseUp2:: @ 81DA898 + if_hp_not_equal AI_USER, 100, AI_CV_DefenseUp3 + if_random_less_than 128, AI_CV_DefenseUp3 + score +2 -AI_sub_81DA8A7:: @ 81DA8A7 - if_hp_less_than 1, 70, AI_sub_81DA8B4 - if_random_less_than -56, AI_sub_81DA8DE +AI_CV_DefenseUp3:: @ 81DA8A7 + if_hp_less_than AI_USER, 70, AI_CV_DefenseUp4 + if_random_less_than 200, AI_CV_DefenseUp_End -AI_sub_81DA8B4:: @ 81DA8B4 - if_hp_less_than 1, 40, AI_sub_81DA8DC - get_move 0 +AI_CV_DefenseUp4:: @ 81DA8B4 + if_hp_less_than AI_USER, 40, AI_CV_DefenseUp_ScoreDown2 + get_last_used_move AI_TARGET get_move_power_from_result - if_equal 0, AI_sub_81DA8D6 - get_move 0 + if_equal 0, AI_CV_DefenseUp5 + get_last_used_move AI_TARGET get_move_type_from_result - if_not_in_bytes AI_bytes_81DA8DF, AI_sub_81DA8DC - if_random_less_than 60, AI_sub_81DA8DE + if_not_in_bytes AI_CV_DefenseUp_PhysicalTypes, AI_CV_DefenseUp_ScoreDown2 + if_random_less_than 60, AI_CV_DefenseUp_End -AI_sub_81DA8D6:: @ 81DA8D6 - if_random_less_than 60, AI_sub_81DA8DE +AI_CV_DefenseUp5:: @ 81DA8D6 + if_random_less_than 60, AI_CV_DefenseUp_End -AI_sub_81DA8DC:: @ 81DA8DC +AI_CV_DefenseUp_ScoreDown2:: @ 81DA8DC score -2 -AI_sub_81DA8DE:: @ 81DA8DE +AI_CV_DefenseUp_End:: @ 81DA8DE end -AI_bytes_81DA8DF:: @ 81DA8DF - .byte 0 - .byte 1 - .byte 3 - .byte 4 - .byte 2 - .byte 5 - .byte 6 - .byte 7 - .byte 8 - .byte 0xFF +AI_CV_DefenseUp_PhysicalTypes:: @ 81DA8DF + .byte TYPE_NORMAL + .byte TYPE_FIGHTING + .byte TYPE_POISON + .byte TYPE_GROUND + .byte TYPE_FLYING + .byte TYPE_ROCK + .byte TYPE_BUG + .byte TYPE_GHOST + .byte TYPE_STEEL + .byte -1 -AI_sub_81DA8E9:: @ 81DA8E9 - if_would_go_first 1, AI_sub_81DA8F6 +AI_CV_SpeedUp:: @ 81DA8E9 + if_target_faster AI_CV_SpeedUp2 score -3 - jump AI_sub_81DA8FE + goto AI_CV_SpeedUp_End -AI_sub_81DA8F6:: @ 81DA8F6 - if_random_less_than 70, AI_sub_81DA8FE - score 3 +AI_CV_SpeedUp2:: @ 81DA8F6 + if_random_less_than 70, AI_CV_SpeedUp_End + score +3 -AI_sub_81DA8FE:: @ 81DA8FE +AI_CV_SpeedUp_End:: @ 81DA8FE end -AI_sub_81DA8FF:: @ 81DA8FF - if_stat_level_less_than 1, 4, 9, AI_sub_81DA914 - if_random_less_than 100, AI_sub_81DA923 +AI_CV_SpAtkUp:: @ 81DA8FF + if_stat_level_less_than AI_USER, STAT_SPATK, 9, AI_CV_SpAtkUp2 + if_random_less_than 100, AI_CV_SpAtkUp3 score -1 - jump AI_sub_81DA923 + goto AI_CV_SpAtkUp3 -AI_sub_81DA914:: @ 81DA914 - if_hp_not_equal 1, 100, AI_sub_81DA923 - if_random_less_than -128, AI_sub_81DA923 - score 2 +AI_CV_SpAtkUp2:: @ 81DA914 + if_hp_not_equal AI_USER, 100, AI_CV_SpAtkUp3 + if_random_less_than 128, AI_CV_SpAtkUp3 + score +2 -AI_sub_81DA923:: @ 81DA923 - if_hp_more_than 1, 70, AI_sub_81DA939 - if_hp_less_than 1, 40, AI_sub_81DA937 - if_random_less_than 70, AI_sub_81DA939 +AI_CV_SpAtkUp3:: @ 81DA923 + if_hp_more_than AI_USER, 70, AI_CV_SpAtkUp_End + if_hp_less_than AI_USER, 40, AI_CV_SpAtkUp_ScoreDown2 + if_random_less_than 70, AI_CV_SpAtkUp_End -AI_sub_81DA937:: @ 81DA937 +AI_CV_SpAtkUp_ScoreDown2:: @ 81DA937 score -2 -AI_sub_81DA939:: @ 81DA939 +AI_CV_SpAtkUp_End:: @ 81DA939 end -AI_sub_81DA93A:: @ 81DA93A - if_stat_level_less_than 1, 5, 9, AI_sub_81DA94F - if_random_less_than 100, AI_sub_81DA95E +AI_CV_SpDefUp:: @ 81DA93A + if_stat_level_less_than AI_USER, STAT_SPDEF, 9, AI_CV_SpDefUp2 + if_random_less_than 100, AI_CV_SpDefUp3 score -1 - jump AI_sub_81DA95E + goto AI_CV_SpDefUp3 -AI_sub_81DA94F:: @ 81DA94F - if_hp_not_equal 1, 100, AI_sub_81DA95E - if_random_less_than -128, AI_sub_81DA95E - score 2 +AI_CV_SpDefUp2:: @ 81DA94F + if_hp_not_equal AI_USER, 100, AI_CV_SpDefUp3 + if_random_less_than 128, AI_CV_SpDefUp3 + score +2 -AI_sub_81DA95E:: @ 81DA95E - if_hp_less_than 1, 70, AI_sub_81DA96B - if_random_less_than -56, AI_sub_81DA995 +AI_CV_SpDefUp3:: @ 81DA95E + if_hp_less_than AI_USER, 70, AI_CV_SpDefUp4 + if_random_less_than 200, AI_CV_SpDefUp_End -AI_sub_81DA96B:: @ 81DA96B - if_hp_less_than 1, 40, AI_sub_81DA993 - get_move 0 +AI_CV_SpDefUp4:: @ 81DA96B + if_hp_less_than AI_USER, 40, AI_CV_SpDefUp_ScoreDown2 + get_last_used_move AI_TARGET get_move_power_from_result - if_equal 0, AI_sub_81DA98D - get_move 0 + if_equal 0, AI_CV_SpDefUp5 + get_last_used_move AI_TARGET get_move_type_from_result - if_in_bytes AI_bytes_81DA996, AI_sub_81DA993 - if_random_less_than 60, AI_sub_81DA995 + if_in_bytes AI_CV_SpDefUp_PhysicalTypes, AI_CV_SpDefUp_ScoreDown2 + if_random_less_than 60, AI_CV_SpDefUp_End -AI_sub_81DA98D:: @ 81DA98D - if_random_less_than 60, AI_sub_81DA995 +AI_CV_SpDefUp5:: @ 81DA98D + if_random_less_than 60, AI_CV_SpDefUp_End -AI_sub_81DA993:: @ 81DA993 +AI_CV_SpDefUp_ScoreDown2:: @ 81DA993 score -2 -AI_sub_81DA995:: @ 81DA995 +AI_CV_SpDefUp_End:: @ 81DA995 end -AI_bytes_81DA996:: @ 81DA996 - .byte 0 - .byte 1 - .byte 3 - .byte 4 - .byte 2 - .byte 5 - .byte 6 - .byte 7 - .byte 8 - .byte 0xFF +AI_CV_SpDefUp_PhysicalTypes:: @ 81DA996 + .byte TYPE_NORMAL + .byte TYPE_FIGHTING + .byte TYPE_POISON + .byte TYPE_GROUND + .byte TYPE_FLYING + .byte TYPE_ROCK + .byte TYPE_BUG + .byte TYPE_GHOST + .byte TYPE_STEEL + .byte -1 -AI_sub_81DA9A0:: @ 81DA9A0 - if_stat_level_less_than 1, 6, 9, AI_sub_81DA9B0 - if_random_less_than 50, AI_sub_81DA9B0 +AI_CV_AccuracyUp:: @ 81DA9A0 + if_stat_level_less_than AI_USER, STAT_ACC, 9, AI_CV_AccuracyUp2 + if_random_less_than 50, AI_CV_AccuracyUp2 score -2 -AI_sub_81DA9B0:: @ 81DA9B0 - if_hp_more_than 1, 70, AI_sub_81DA9B9 +AI_CV_AccuracyUp2:: @ 81DA9B0 + if_hp_more_than AI_USER, 70, AI_CV_AccuracyUp_End score -2 -AI_sub_81DA9B9:: @ 81DA9B9 +AI_CV_AccuracyUp_End:: @ 81DA9B9 end -AI_sub_81DA9BA:: @ 81DA9BA - if_hp_less_than 1, 90, AI_sub_81DA9C9 - if_random_less_than 100, AI_sub_81DA9C9 - score 3 +AI_CV_EvasionUp:: @ 81DA9BA + if_hp_less_than AI_USER, 90, AI_CV_EvasionUp2 + if_random_less_than 100, AI_CV_EvasionUp2 + score +3 -AI_sub_81DA9C9:: @ 81DA9C9 - if_stat_level_less_than 1, 7, 9, AI_sub_81DA9D9 - if_random_less_than -128, AI_sub_81DA9D9 +AI_CV_EvasionUp2:: @ 81DA9C9 + if_stat_level_less_than AI_USER, STAT_EVASION, 9, AI_CV_EvasionUp3 + if_random_less_than 128, AI_CV_EvasionUp3 score -1 -AI_sub_81DA9D9:: @ 81DA9D9 - if_not_status 0, 128, AI_sub_81DA9F8 - if_hp_more_than 1, 50, AI_sub_81DA9F0 - if_random_less_than 80, AI_sub_81DA9F8 - -AI_sub_81DA9F0:: @ 81DA9F0 - if_random_less_than 50, AI_sub_81DA9F8 - score 3 - -AI_sub_81DA9F8:: @ 81DA9F8 - if_not_status3 0, 4, AI_sub_81DAA0A - if_random_less_than 70, AI_sub_81DAA0A - score 3 - -AI_sub_81DAA0A:: @ 81DAA0A - if_not_status3 1, 1024, AI_sub_81DAA1C - if_random_less_than -128, AI_sub_81DAA1C - score 2 - -AI_sub_81DAA1C:: @ 81DAA1C - if_not_status2 0, 268435456, AI_sub_81DAA2E - if_random_less_than 70, AI_sub_81DAA2E - score 3 - -AI_sub_81DAA2E:: @ 81DAA2E - if_hp_more_than 1, 70, AI_sub_81DAA53 - if_stat_level_equal 1, 7, 6, AI_sub_81DAA53 - if_hp_less_than 1, 40, AI_sub_81DAA51 - if_hp_less_than 0, 40, AI_sub_81DAA51 - if_random_less_than 70, AI_sub_81DAA53 - -AI_sub_81DAA51:: @ 81DAA51 +AI_CV_EvasionUp3:: @ 81DA9D9 + if_not_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_EvasionUp5 + if_hp_more_than AI_USER, 50, AI_CV_EvasionUp4 + if_random_less_than 80, AI_CV_EvasionUp5 + +AI_CV_EvasionUp4:: @ 81DA9F0 + if_random_less_than 50, AI_CV_EvasionUp5 + score +3 + +AI_CV_EvasionUp5:: @ 81DA9F8 + if_not_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_EvasionUp6 + if_random_less_than 70, AI_CV_EvasionUp6 + score +3 + +AI_CV_EvasionUp6:: @ 81DAA0A + if_not_status3 AI_USER, STATUS3_ROOTED, AI_CV_EvasionUp7 + if_random_less_than 128, AI_CV_EvasionUp7 + score +2 + +AI_CV_EvasionUp7:: @ 81DAA1C + if_not_status2 AI_TARGET, STATUS2_CURSED, AI_CV_EvasionUp8 + if_random_less_than 70, AI_CV_EvasionUp8 + score +3 + +AI_CV_EvasionUp8:: @ 81DAA2E + if_hp_more_than AI_USER, 70, AI_CV_EvasionUp_End + if_stat_level_equal AI_USER, STAT_EVASION, 6, AI_CV_EvasionUp_End + if_hp_less_than AI_USER, 40, AI_CV_EvasionUp_ScoreDown2 + if_hp_less_than AI_TARGET, 40, AI_CV_EvasionUp_ScoreDown2 + if_random_less_than 70, AI_CV_EvasionUp_End + +AI_CV_EvasionUp_ScoreDown2:: @ 81DAA51 score -2 -AI_sub_81DAA53:: @ 81DAA53 +AI_CV_EvasionUp_End:: @ 81DAA53 end -AI_sub_81DAA54:: @ 81DAA54 - if_stat_level_more_than 0, 7, 10, AI_sub_81DAA79 - if_stat_level_less_than 1, 6, 2, AI_sub_81DAA79 - if_stat_level_more_than 0, 7, 8, AI_sub_81DAA7B - if_stat_level_less_than 1, 6, 4, AI_sub_81DAA7B - jump AI_sub_81DAA83 +AI_CV_AlwaysHit:: @ 81DAA54 + if_stat_level_more_than AI_TARGET, STAT_EVASION, 10, AI_CV_AlwaysHit_ScoreUp1 + if_stat_level_less_than AI_USER, STAT_ACC, 2, AI_CV_AlwaysHit_ScoreUp1 + if_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_AlwaysHit2 + if_stat_level_less_than AI_USER, STAT_ACC, 4, AI_CV_AlwaysHit2 + goto AI_CV_AlwaysHit_End -AI_sub_81DAA79:: @ 81DAA79 - score 1 +AI_CV_AlwaysHit_ScoreUp1:: @ 81DAA79 + score +1 -AI_sub_81DAA7B:: @ 81DAA7B - if_random_less_than 100, AI_sub_81DAA83 - score 1 +AI_CV_AlwaysHit2:: @ 81DAA7B + if_random_less_than 100, AI_CV_AlwaysHit_End + score +1 -AI_sub_81DAA83:: @ 81DAA83 +AI_CV_AlwaysHit_End:: @ 81DAA83 end -AI_sub_81DAA84:: @ 81DAA84 - if_stat_level_equal 0, 1, 6, AI_sub_81DAAA7 +AI_CV_AttackDown:: @ 81DAA84 + if_stat_level_equal AI_TARGET, STAT_ATK, 6, AI_CV_AttackDown3 score -1 - if_hp_more_than 1, 90, AI_sub_81DAA97 + if_hp_more_than AI_USER, 90, AI_CV_AttackDown2 score -1 -AI_sub_81DAA97:: @ 81DAA97 - if_stat_level_more_than 0, 1, 3, AI_sub_81DAAA7 - if_random_less_than 50, AI_sub_81DAAA7 +AI_CV_AttackDown2:: @ 81DAA97 + if_stat_level_more_than AI_TARGET, STAT_ATK, 3, AI_CV_AttackDown3 + if_random_less_than 50, AI_CV_AttackDown3 score -2 -AI_sub_81DAAA7:: @ 81DAAA7 - if_hp_more_than 0, 70, AI_sub_81DAAB0 +AI_CV_AttackDown3:: @ 81DAAA7 + if_hp_more_than AI_TARGET, 70, AI_CV_AttackDown4 score -2 -AI_sub_81DAAB0:: @ 81DAAB0 - get_type 0 - if_in_bytes AI_bytes_81DAACF, AI_sub_81DAACE - get_type 2 - if_in_bytes AI_bytes_81DAACF, AI_sub_81DAACE - if_random_less_than 50, AI_sub_81DAACE +AI_CV_AttackDown4:: @ 81DAAB0 + get_target_type1 + if_in_bytes AI_CV_AttackDown_PhysicalTypeList, AI_CV_AttackDown_End + get_target_type2 + if_in_bytes AI_CV_AttackDown_PhysicalTypeList, AI_CV_AttackDown_End + if_random_less_than 50, AI_CV_AttackDown_End score -2 -AI_sub_81DAACE:: @ 81DAACE +AI_CV_AttackDown_End:: @ 81DAACE end -AI_bytes_81DAACF:: @ 81DAACF - .byte 0 - .byte 1 - .byte 4 - .byte 5 - .byte 6 - .byte 8 - .byte 0xFF +@ Missing Poison, Flying, and Ghost for unknown reason +AI_CV_AttackDown_PhysicalTypeList:: @ 81DAACF + .byte TYPE_NORMAL + .byte TYPE_FIGHTING + .byte TYPE_GROUND + .byte TYPE_ROCK + .byte TYPE_BUG + .byte TYPE_STEEL + .byte -1 -AI_sub_81DAAD6:: @ 81DAAD6 - if_hp_less_than 1, 70, AI_sub_81DAAE5 - if_stat_level_more_than 0, 2, 3, AI_sub_81DAAED +AI_CV_DefenseDown:: @ 81DAAD6 + if_hp_less_than AI_USER, 70, AI_CV_DefenseDown2 + if_stat_level_more_than AI_TARGET, STAT_DEF, 3, AI_CV_DefenseDown3 -AI_sub_81DAAE5:: @ 81DAAE5 - if_random_less_than 50, AI_sub_81DAAED +AI_CV_DefenseDown2:: @ 81DAAE5 + if_random_less_than 50, AI_CV_DefenseDown3 score -2 -AI_sub_81DAAED:: @ 81DAAED - if_hp_more_than 0, 70, AI_sub_81DAAF6 +AI_CV_DefenseDown3:: @ 81DAAED + if_hp_more_than AI_TARGET, 70, AI_CV_DefenseDown_End score -2 -AI_sub_81DAAF6:: @ 81DAAF6 +AI_CV_DefenseDown_End:: @ 81DAAF6 end -AI_sub_81DAAF7:: @ 81DAAF7 - if_move 196, AI_sub_81DAB0D - if_move 317, AI_sub_81DAB0D - if_move 341, AI_sub_81DAB0D +AI_CV_SpeedDownFromChance:: @ 81DAAF7 + if_move MOVE_ICY_WIND, AI_CV_SpeedDown + if_move MOVE_ROCK_TOMB, AI_CV_SpeedDown + if_move MOVE_MUD_SHOT, AI_CV_SpeedDown end -AI_sub_81DAB0D:: @ 81DAB0D - if_would_go_first 1, AI_sub_81DAB1A +AI_CV_SpeedDown:: @ 81DAB0D + if_target_faster AI_CV_SpeedDown2 score -3 - jump AI_sub_81DAB22 + goto AI_CV_SpeedDown_End -AI_sub_81DAB1A:: @ 81DAB1A - if_random_less_than 70, AI_sub_81DAB22 - score 2 +AI_CV_SpeedDown2:: @ 81DAB1A + if_random_less_than 70, AI_CV_SpeedDown_End + score +2 -AI_sub_81DAB22:: @ 81DAB22 +AI_CV_SpeedDown_End:: @ 81DAB22 end -AI_sub_81DAB23:: @ 81DAB23 - if_stat_level_equal 0, 1, 6, AI_sub_81DAB46 +AI_CV_SpAtkDown:: @ 81DAB23 + if_stat_level_equal AI_TARGET, STAT_ATK, 6, AI_CV_SpAtkDown3 score -1 - if_hp_more_than 1, 90, AI_sub_81DAB36 + if_hp_more_than AI_USER, 90, AI_CV_SpAtkDown2 score -1 -AI_sub_81DAB36:: @ 81DAB36 - if_stat_level_more_than 0, 4, 3, AI_sub_81DAB46 - if_random_less_than 50, AI_sub_81DAB46 +AI_CV_SpAtkDown2:: @ 81DAB36 + if_stat_level_more_than AI_TARGET, STAT_SPATK, 3, AI_CV_SpAtkDown3 + if_random_less_than 50, AI_CV_SpAtkDown3 score -2 -AI_sub_81DAB46:: @ 81DAB46 - if_hp_more_than 0, 70, AI_sub_81DAB4F +AI_CV_SpAtkDown3:: @ 81DAB46 + if_hp_more_than AI_TARGET, 70, AI_CV_SpAtkDown4 score -2 -AI_sub_81DAB4F:: @ 81DAB4F - get_type 0 - if_in_bytes AI_bytes_81DAB6E, AI_sub_81DAB6D - get_type 2 - if_in_bytes AI_bytes_81DAB6E, AI_sub_81DAB6D - if_random_less_than 50, AI_sub_81DAB6D +AI_CV_SpAtkDown4:: @ 81DAB4F + get_target_type1 + if_in_bytes AI_CV_SpAtkDown_SpecialTypeList, AI_CV_SpAtkDown_End + get_target_type2 + if_in_bytes AI_CV_SpAtkDown_SpecialTypeList, AI_CV_SpAtkDown_End + if_random_less_than 50, AI_CV_SpAtkDown_End score -2 -AI_sub_81DAB6D:: @ 81DAB6D +AI_CV_SpAtkDown_End:: @ 81DAB6D end -AI_bytes_81DAB6E:: @ 81DAB6E - .byte 10 - .byte 11 - .byte 12 - .byte 13 - .byte 14 - .byte 15 - .byte 16 - .byte 17 - .byte 0xFF +AI_CV_SpAtkDown_SpecialTypeList:: @ 81DAB6E + .byte TYPE_FIRE + .byte TYPE_WATER + .byte TYPE_GRASS + .byte TYPE_ELECTRIC + .byte TYPE_PSYCHIC + .byte TYPE_ICE + .byte TYPE_DRAGON + .byte TYPE_DARK + .byte -1 -AI_sub_81DAB77:: @ 81DAB77 - if_hp_less_than 1, 70, AI_sub_81DAB86 - if_stat_level_more_than 0, 5, 3, AI_sub_81DAB8E +AI_CV_SpDefDown:: @ 81DAB77 + if_hp_less_than AI_USER, 70, AI_CV_SpDefDown2 + if_stat_level_more_than AI_TARGET, STAT_SPDEF, 3, AI_CV_SpDefDown3 -AI_sub_81DAB86:: @ 81DAB86 - if_random_less_than 50, AI_sub_81DAB8E +AI_CV_SpDefDown2:: @ 81DAB86 + if_random_less_than 50, AI_CV_SpDefDown3 score -2 -AI_sub_81DAB8E:: @ 81DAB8E - if_hp_more_than 0, 70, AI_sub_81DAB97 +AI_CV_SpDefDown3:: @ 81DAB8E + if_hp_more_than AI_TARGET, 70, AI_CV_SpDefDown_End score -2 -AI_sub_81DAB97:: @ 81DAB97 +AI_CV_SpDefDown_End:: @ 81DAB97 end -AI_sub_81DAB98:: @ 81DAB98 - if_hp_less_than 1, 70, AI_sub_81DABA6 - if_hp_more_than 0, 70, AI_sub_81DABAE +AI_CV_AccuracyDown:: @ 81DAB98 + if_hp_less_than AI_USER, 70, AI_CV_AccuracyDown2 + if_hp_more_than AI_TARGET, 70, AI_CV_AccuracyDown3 -AI_sub_81DABA6:: @ 81DABA6 - if_random_less_than 100, AI_sub_81DABAE +AI_CV_AccuracyDown2:: @ 81DABA6 + if_random_less_than 100, AI_CV_AccuracyDown3 score -1 -AI_sub_81DABAE:: @ 81DABAE - if_stat_level_more_than 1, 6, 4, AI_sub_81DABBE - if_random_less_than 80, AI_sub_81DABBE +AI_CV_AccuracyDown3:: @ 81DABAE + if_stat_level_more_than AI_USER, STAT_ACC, 4, AI_CV_AccuracyDown4 + if_random_less_than 80, AI_CV_AccuracyDown4 score -2 -AI_sub_81DABBE:: @ 81DABBE - if_not_status 0, 128, AI_sub_81DABD0 - if_random_less_than 70, AI_sub_81DABD0 - score 2 - -AI_sub_81DABD0:: @ 81DABD0 - if_not_status3 0, 4, AI_sub_81DABE2 - if_random_less_than 70, AI_sub_81DABE2 - score 2 - -AI_sub_81DABE2:: @ 81DABE2 - if_not_status3 1, 1024, AI_sub_81DABF4 - if_random_less_than -128, AI_sub_81DABF4 - score 1 - -AI_sub_81DABF4:: @ 81DABF4 - if_not_status2 0, 268435456, AI_sub_81DAC06 - if_random_less_than 70, AI_sub_81DAC06 - score 2 - -AI_sub_81DAC06:: @ 81DAC06 - if_hp_more_than 1, 70, AI_sub_81DAC2B - if_stat_level_equal 0, 6, 6, AI_sub_81DAC2B - if_hp_less_than 1, 40, AI_sub_81DAC29 - if_hp_less_than 0, 40, AI_sub_81DAC29 - if_random_less_than 70, AI_sub_81DAC2B - -AI_sub_81DAC29:: @ 81DAC29 +AI_CV_AccuracyDown4:: @ 81DABBE + if_not_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_AccuracyDown5 + if_random_less_than 70, AI_CV_AccuracyDown5 + score +2 + +AI_CV_AccuracyDown5:: @ 81DABD0 + if_not_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_AccuracyDown6 + if_random_less_than 70, AI_CV_AccuracyDown6 + score +2 + +AI_CV_AccuracyDown6:: @ 81DABE2 + if_not_status3 AI_USER, STATUS3_ROOTED, AI_CV_AccuracyDown7 + if_random_less_than 128, AI_CV_AccuracyDown7 + score +1 + +AI_CV_AccuracyDown7:: @ 81DABF4 + if_not_status2 AI_TARGET, STATUS2_CURSED, AI_CV_AccuracyDown8 + if_random_less_than 70, AI_CV_AccuracyDown8 + score +2 + +AI_CV_AccuracyDown8:: @ 81DAC06 + if_hp_more_than AI_USER, 70, AI_CV_AccuracyDown_End + if_stat_level_equal AI_TARGET, STAT_ACC, 6, AI_CV_AccuracyDown_End + if_hp_less_than AI_USER, 40, AI_CV_AccuracyDown_ScoreDown2 + if_hp_less_than AI_TARGET, 40, AI_CV_AccuracyDown_ScoreDown2 + if_random_less_than 70, AI_CV_AccuracyDown_End + +AI_CV_AccuracyDown_ScoreDown2:: @ 81DAC29 score -2 -AI_sub_81DAC2B:: @ 81DAC2B +AI_CV_AccuracyDown_End:: @ 81DAC2B end -AI_sub_81DAC2C:: @ 81DAC2C - if_hp_less_than 1, 70, AI_sub_81DAC3B - if_stat_level_more_than 0, 7, 3, AI_sub_81DAC43 +AI_CV_EvasionDown:: @ 81DAC2C + if_hp_less_than AI_USER, 70, AI_CV_EvasionDown2 + if_stat_level_more_than AI_TARGET, STAT_EVASION, 3, AI_CV_EvasionDown3 -AI_sub_81DAC3B:: @ 81DAC3B - if_random_less_than 50, AI_sub_81DAC43 +AI_CV_EvasionDown2:: @ 81DAC3B + if_random_less_than 50, AI_CV_EvasionDown3 score -2 -AI_sub_81DAC43:: @ 81DAC43 - if_hp_more_than 0, 70, AI_sub_81DAC4C +AI_CV_EvasionDown3:: @ 81DAC43 + if_hp_more_than AI_TARGET, 70, AI_CV_EvasionDown_End score -2 -AI_sub_81DAC4C:: @ 81DAC4C +AI_CV_EvasionDown_End:: @ 81DAC4C end -AI_sub_81DAC4D:: @ 81DAC4D - if_stat_level_more_than 1, 1, 8, AI_sub_81DACA2 - if_stat_level_more_than 1, 2, 8, AI_sub_81DACA2 - if_stat_level_more_than 1, 4, 8, AI_sub_81DACA2 - if_stat_level_more_than 1, 5, 8, AI_sub_81DACA2 - if_stat_level_more_than 1, 7, 8, AI_sub_81DACA2 - if_stat_level_less_than 0, 1, 4, AI_sub_81DACA2 - if_stat_level_less_than 0, 2, 4, AI_sub_81DACA2 - if_stat_level_less_than 0, 4, 4, AI_sub_81DACA2 - if_stat_level_less_than 0, 5, 4, AI_sub_81DACA2 - if_stat_level_less_than 0, 6, 4, AI_sub_81DACA2 - jump AI_sub_81DACAA +AI_CV_Haze:: @ 81DAC4D + if_stat_level_more_than AI_USER, STAT_ATK, 8, AI_CV_Haze2 + if_stat_level_more_than AI_USER, STAT_DEF, 8, AI_CV_Haze2 + if_stat_level_more_than AI_USER, STAT_SPATK, 8, AI_CV_Haze2 + if_stat_level_more_than AI_USER, STAT_SPDEF, 8, AI_CV_Haze2 + if_stat_level_more_than AI_USER, STAT_EVASION, 8, AI_CV_Haze2 + if_stat_level_less_than AI_TARGET, STAT_ATK, 4, AI_CV_Haze2 + if_stat_level_less_than AI_TARGET, STAT_DEF, 4, AI_CV_Haze2 + if_stat_level_less_than AI_TARGET, STAT_SPATK, 4, AI_CV_Haze2 + if_stat_level_less_than AI_TARGET, STAT_SPDEF, 4, AI_CV_Haze2 + if_stat_level_less_than AI_TARGET, STAT_ACC, 4, AI_CV_Haze2 + goto AI_CV_Haze3 -AI_sub_81DACA2:: @ 81DACA2 - if_random_less_than 50, AI_sub_81DACAA +AI_CV_Haze2:: @ 81DACA2 + if_random_less_than 50, AI_CV_Haze3 score -3 -AI_sub_81DACAA:: @ 81DACAA - if_stat_level_more_than 0, 1, 8, AI_sub_81DAD07 - if_stat_level_more_than 0, 2, 8, AI_sub_81DAD07 - if_stat_level_more_than 0, 4, 8, AI_sub_81DAD07 - if_stat_level_more_than 0, 5, 8, AI_sub_81DAD07 - if_stat_level_more_than 0, 7, 8, AI_sub_81DAD07 - if_stat_level_less_than 1, 1, 4, AI_sub_81DAD07 - if_stat_level_less_than 1, 2, 4, AI_sub_81DAD07 - if_stat_level_less_than 1, 4, 4, AI_sub_81DAD07 - if_stat_level_less_than 1, 5, 4, AI_sub_81DAD07 - if_stat_level_less_than 1, 6, 4, AI_sub_81DAD07 - if_random_less_than 50, AI_sub_81DAD0F +AI_CV_Haze3:: @ 81DACAA + if_stat_level_more_than AI_TARGET, STAT_ATK, 8, AI_CV_Haze4 + if_stat_level_more_than AI_TARGET, STAT_DEF, 8, AI_CV_Haze4 + if_stat_level_more_than AI_TARGET, STAT_SPATK, 8, AI_CV_Haze4 + if_stat_level_more_than AI_TARGET, STAT_SPDEF, 8, AI_CV_Haze4 + if_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_Haze4 + if_stat_level_less_than AI_USER, STAT_ATK, 4, AI_CV_Haze4 + if_stat_level_less_than AI_USER, STAT_DEF, 4, AI_CV_Haze4 + if_stat_level_less_than AI_USER, STAT_SPATK, 4, AI_CV_Haze4 + if_stat_level_less_than AI_USER, STAT_SPDEF, 4, AI_CV_Haze4 + if_stat_level_less_than AI_USER, STAT_ACC, 4, AI_CV_Haze4 + if_random_less_than 50, AI_CV_Haze_End score -1 - jump AI_sub_81DAD0F + goto AI_CV_Haze_End -AI_sub_81DAD07:: @ 81DAD07 - if_random_less_than 50, AI_sub_81DAD0F - score 3 +AI_CV_Haze4:: @ 81DAD07 + if_random_less_than 50, AI_CV_Haze_End + score +3 -AI_sub_81DAD0F:: @ 81DAD0F +AI_CV_Haze_End:: @ 81DAD0F end -AI_sub_81DAD10:: @ 81DAD10 - if_hp_more_than 1, 90, AI_sub_81DAD19 +AI_CV_Bide:: @ 81DAD10 + if_hp_more_than AI_USER, 90, AI_CV_Bide_End score -2 -AI_sub_81DAD19:: @ 81DAD19 +AI_CV_Bide_End:: @ 81DAD19 end -AI_sub_81DAD1A:: @ 81DAD1A - if_stat_level_more_than 0, 1, 8, AI_sub_81DAD49 - if_stat_level_more_than 0, 2, 8, AI_sub_81DAD49 - if_stat_level_more_than 0, 4, 8, AI_sub_81DAD49 - if_stat_level_more_than 0, 5, 8, AI_sub_81DAD49 - if_stat_level_more_than 0, 7, 8, AI_sub_81DAD49 +AI_CV_Roar:: @ 81DAD1A + if_stat_level_more_than AI_TARGET, STAT_ATK, 8, AI_CV_Roar2 + if_stat_level_more_than AI_TARGET, STAT_DEF, 8, AI_CV_Roar2 + if_stat_level_more_than AI_TARGET, STAT_SPATK, 8, AI_CV_Roar2 + if_stat_level_more_than AI_TARGET, STAT_SPDEF, 8, AI_CV_Roar2 + if_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_Roar2 score -3 - jump AI_sub_81DAD51 + goto AI_CV_Roar_End -AI_sub_81DAD49:: @ 81DAD49 - if_random_less_than -128, AI_sub_81DAD51 - score 2 +AI_CV_Roar2:: @ 81DAD49 + if_random_less_than 128, AI_CV_Roar_End + score +2 -AI_sub_81DAD51:: @ 81DAD51 +AI_CV_Roar_End:: @ 81DAD51 end -AI_sub_81DAD52:: @ 81DAD52 - if_hp_more_than 1, 90, AI_sub_81DAD5B +AI_CV_Conversion:: @ 81DAD52 + if_hp_more_than AI_USER, 90, AI_CV_Conversion2 score -2 -AI_sub_81DAD5B:: @ 81DAD5B +AI_CV_Conversion2:: @ 81DAD5B get_turn_count - if_equal 0, AI_sub_81DAD68 - if_random_less_than -56, AI_sub_81DA427 + if_equal 0, AI_CV_Conversion_End + if_random_less_than 200, Score_Minus2 -AI_sub_81DAD68:: @ 81DAD68 +AI_CV_Conversion_End:: @ 81DAD68 end -AI_sub_81DAD69:: @ 81DAD69 +AI_CV_HealWeather:: @ 81DAD69 get_weather - if_equal 3, AI_sub_81DAD81 - if_equal 1, AI_sub_81DAD81 - if_equal 2, AI_sub_81DAD81 - jump AI_sub_81DAD83 + if_equal AI_WEATHER_HAIL, AI_CV_HealWeather_ScoreDown2 + if_equal AI_WEATHER_RAIN, AI_CV_HealWeather_ScoreDown2 + if_equal AI_WEATHER_SANDSTORM, AI_CV_HealWeather_ScoreDown2 + goto AI_CV_Heal -AI_sub_81DAD81:: @ 81DAD81 +AI_CV_HealWeather_ScoreDown2:: @ 81DAD81 score -2 -AI_sub_81DAD83:: @ 81DAD83 - if_hp_equal 1, 100, AI_sub_81DADAB - if_would_go_first 1, AI_sub_81DADB2 +AI_CV_Heal:: @ 81DAD83 + if_hp_equal AI_USER, 100, AI_CV_Heal3 + if_target_faster AI_CV_Heal4 score -8 - jump AI_sub_81DADDB - if_hp_less_than 1, 50, AI_sub_81DADC6 - if_hp_more_than 1, 80, AI_sub_81DADAB - if_random_less_than 70, AI_sub_81DADC6 + goto AI_CV_Heal_End + +@ Never reached +AI_CV_Heal2: + if_hp_less_than AI_USER, 50, AI_CV_Heal5 + if_hp_more_than AI_USER, 80, AI_CV_Heal3 + if_random_less_than 70, AI_CV_Heal5 -AI_sub_81DADAB:: @ 81DADAB +AI_CV_Heal3:: @ 81DADAB score -3 - jump AI_sub_81DADDB + goto AI_CV_Heal_End -AI_sub_81DADB2:: @ 81DADB2 - if_hp_less_than 1, 70, AI_sub_81DADC6 - if_random_less_than 30, AI_sub_81DADC6 +AI_CV_Heal4:: @ 81DADB2 + if_hp_less_than AI_USER, 70, AI_CV_Heal5 + if_random_less_than 30, AI_CV_Heal5 score -3 - jump AI_sub_81DADDB + goto AI_CV_Heal_End -AI_sub_81DADC6:: @ 81DADC6 - if_not_move_effect 0, -61, AI_sub_81DADD3 - if_random_less_than 100, AI_sub_81DADDB +AI_CV_Heal5:: @ 81DADC6 + if_doesnt_have_move_with_effect AI_TARGET, EFFECT_SNATCH, AI_CV_Heal6 + if_random_less_than 100, AI_CV_Heal_End -AI_sub_81DADD3:: @ 81DADD3 - if_random_less_than 20, AI_sub_81DADDB - score 2 +AI_CV_Heal6:: @ 81DADD3 + if_random_less_than 20, AI_CV_Heal_End + score +2 -AI_sub_81DADDB:: @ 81DADDB +AI_CV_Heal_End:: @ 81DADDB end -AI_sub_81DADDC:: @ 81DADDC - if_user_cant_damage AI_sub_81DADFF - if_hp_more_than 1, 50, AI_sub_81DADF0 - if_random_less_than 50, AI_sub_81DADF0 +AI_CV_Toxic:: @ 81DADDC + if_user_has_no_attacking_moves AI_CV_Toxic3 + if_hp_more_than AI_USER, 50, AI_CV_Toxic2 + if_random_less_than 50, AI_CV_Toxic2 score -3 -AI_sub_81DADF0:: @ 81DADF0 - if_hp_more_than 0, 50, AI_sub_81DADFF - if_random_less_than 50, AI_sub_81DADFF +AI_CV_Toxic2:: @ 81DADF0 + if_hp_more_than AI_TARGET, 50, AI_CV_Toxic3 + if_random_less_than 50, AI_CV_Toxic3 score -3 -AI_sub_81DADFF:: @ 81DADFF - if_move_effect 1, 14, AI_sub_81DAE12 - if_move_effect 1, 111, AI_sub_81DAE12 - jump AI_sub_81DAE1A +AI_CV_Toxic3:: @ 81DADFF + if_has_move_with_effect AI_USER, EFFECT_SPECIAL_DEFENSE_UP, AI_CV_Toxic4 + if_has_move_with_effect AI_USER, EFFECT_PROTECT, AI_CV_Toxic4 + goto AI_CV_Toxic_End -AI_sub_81DAE12:: @ 81DAE12 - if_random_less_than 60, AI_sub_81DAE1A - score 2 +AI_CV_Toxic4:: @ 81DAE12 + if_random_less_than 60, AI_CV_Toxic_End + score +2 -AI_sub_81DAE1A:: @ 81DAE1A +AI_CV_Toxic_End:: @ 81DAE1A end -AI_sub_81DAE1B:: @ 81DAE1B - if_hp_less_than 1, 50, AI_sub_81DAE3E - get_type 0 - if_in_bytes AI_bytes_81DAE41, AI_sub_81DAE40 - get_type 2 - if_in_bytes AI_bytes_81DAE41, AI_sub_81DAE40 - if_random_less_than 50, AI_sub_81DAE40 +AI_CV_LightScreen:: @ 81DAE1B + if_hp_less_than AI_USER, 50, AI_CV_LightScreen_ScoreDown2 + get_target_type1 + if_in_bytes AI_CV_LightScreen_SpecialTypeList, AI_CV_LightScreen_End + get_target_type2 + if_in_bytes AI_CV_LightScreen_SpecialTypeList, AI_CV_LightScreen_End + if_random_less_than 50, AI_CV_LightScreen_End -AI_sub_81DAE3E:: @ 81DAE3E +AI_CV_LightScreen_ScoreDown2:: @ 81DAE3E score -2 -AI_sub_81DAE40:: @ 81DAE40 +AI_CV_LightScreen_End:: @ 81DAE40 end -AI_bytes_81DAE41:: @ 81DAE41 - .byte 10 - .byte 11 - .byte 12 - .byte 13 - .byte 14 - .byte 15 - .byte 16 - .byte 17 - .byte 0xFF +AI_CV_LightScreen_SpecialTypeList:: @ 81DAE41 + .byte TYPE_FIRE + .byte TYPE_WATER + .byte TYPE_GRASS + .byte TYPE_ELECTRIC + .byte TYPE_PSYCHIC + .byte TYPE_ICE + .byte TYPE_DRAGON + .byte TYPE_DARK + .byte -1 -AI_sub_81DAE4A:: @ 81DAE4A - if_would_go_first 1, AI_sub_81DAE79 - if_hp_not_equal 1, 100, AI_sub_81DAE5E +AI_CV_Rest:: @ 81DAE4A + if_target_faster AI_CV_Rest4 + if_hp_not_equal AI_USER, 100, AI_CV_Rest2 score -8 - jump AI_sub_81DAEA9 + goto AI_CV_Rest_End -AI_sub_81DAE5E:: @ 81DAE5E - if_hp_less_than 1, 40, AI_sub_81DAE94 - if_hp_more_than 1, 50, AI_sub_81DAE72 - if_random_less_than 70, AI_sub_81DAE94 +AI_CV_Rest2:: @ 81DAE5E + if_hp_less_than AI_USER, 40, AI_CV_Rest6 + if_hp_more_than AI_USER, 50, AI_CV_Rest3 + if_random_less_than 70, AI_CV_Rest6 -AI_sub_81DAE72:: @ 81DAE72 +AI_CV_Rest3:: @ 81DAE72 score -3 - jump AI_sub_81DAEA9 + goto AI_CV_Rest_End -AI_sub_81DAE79:: @ 81DAE79 - if_hp_less_than 1, 60, AI_sub_81DAE94 - if_hp_more_than 1, 70, AI_sub_81DAE8D - if_random_less_than 50, AI_sub_81DAE94 +AI_CV_Rest4:: @ 81DAE79 + if_hp_less_than AI_USER, 60, AI_CV_Rest6 + if_hp_more_than AI_USER, 70, AI_CV_Rest5 + if_random_less_than 50, AI_CV_Rest6 -AI_sub_81DAE8D:: @ 81DAE8D +AI_CV_Rest5:: @ 81DAE8D score -3 - jump AI_sub_81DAEA9 + goto AI_CV_Rest_End -AI_sub_81DAE94:: @ 81DAE94 - if_not_move_effect 0, -61, AI_sub_81DAEA1 - if_random_less_than 50, AI_sub_81DAEA9 +AI_CV_Rest6:: @ 81DAE94 + if_doesnt_have_move_with_effect AI_TARGET, EFFECT_SNATCH, AI_CV_Rest7 + if_random_less_than 50, AI_CV_Rest_End -AI_sub_81DAEA1:: @ 81DAEA1 - if_random_less_than 10, AI_sub_81DAEA9 - score 3 +AI_CV_Rest7:: @ 81DAEA1 + if_random_less_than 10, AI_CV_Rest_End + score +3 -AI_sub_81DAEA9:: @ 81DAEA9 +AI_CV_Rest_End:: @ 81DAEA9 end -AI_sub_81DAEAA:: @ 81DAEAA +AI_CV_OneHitKO:: @ 81DAEAA end -AI_sub_81DAEAB:: @ 81DAEAB - if_hp_more_than 0, 50, AI_sub_81DAEB4 +AI_CV_SuperFang:: @ 81DAEAB + if_hp_more_than AI_TARGET, 50, AI_CV_SuperFang_End score -1 -AI_sub_81DAEB4:: @ 81DAEB4 +AI_CV_SuperFang_End:: @ 81DAEB4 end -AI_sub_81DAEB5:: @ 81DAEB5 - if_status 0, 128, AI_sub_81DAEE2 - if_status2 0, 268435456, AI_sub_81DAEE2 - if_status3 0, 32, AI_sub_81DAEE2 - if_status2 0, 983040, AI_sub_81DAEE2 - jump AI_sub_81DAEEA +AI_CV_Trap:: @ 81DAEB5 + if_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_Trap2 + if_status2 AI_TARGET, STATUS2_CURSED, AI_CV_Trap2 + if_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_Trap2 + if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Trap2 + goto AI_CV_Trap_End -AI_sub_81DAEE2:: @ 81DAEE2 - if_random_less_than -128, AI_sub_81DAEEA - score 1 +AI_CV_Trap2:: @ 81DAEE2 + if_random_less_than 128, AI_CV_Trap_End + score +1 -AI_sub_81DAEEA:: @ 81DAEEA +AI_CV_Trap_End:: @ 81DAEEA end -AI_sub_81DAEEB:: @ 81DAEEB - if_damage_bonus 10, AI_sub_81DAF11 - if_damage_bonus 20, AI_sub_81DAF11 - if_damage_bonus 80, AI_sub_81DAF09 - if_damage_bonus -96, AI_sub_81DAF09 - if_random_less_than -128, AI_sub_81DAF11 +AI_CV_HighCrit:: @ 81DAEEB + if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_HighCrit_End + if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_HighCrit_End + if_type_effectiveness AI_EFFECTIVENESS_x2, AI_CV_HighCrit2 + if_type_effectiveness AI_EFFECTIVENESS_x4, AI_CV_HighCrit2 + if_random_less_than 128, AI_CV_HighCrit_End -AI_sub_81DAF09:: @ 81DAF09 - if_random_less_than -128, AI_sub_81DAF11 - score 1 +AI_CV_HighCrit2:: @ 81DAF09 + if_random_less_than 128, AI_CV_HighCrit_End + score +1 -AI_sub_81DAF11:: @ 81DAF11 +AI_CV_HighCrit_End:: @ 81DAF11 end -AI_sub_81DAF12:: @ 81DAF12 - if_random_less_than -128, AI_sub_81DAF1A - score 1 +@ Improvement in Emerald +@AI_CV_Swagger: +@ if_has_move AI_USER, MOVE_PSYCH_UP, AI_CV_SwaggerHasPsychUp + +AI_CV_Flatter:: @ 81DAF12 + if_random_less_than 128, AI_CV_Confuse + score +1 -AI_sub_81DAF1A:: @ 81DAF1A - if_hp_more_than 0, 70, AI_sub_81DAF3B - if_random_less_than -128, AI_sub_81DAF29 +AI_CV_Confuse:: @ 81DAF1A + if_hp_more_than AI_TARGET, 70, AI_CV_Confuse_End + if_random_less_than 128, AI_CV_Confuse2 score -1 -AI_sub_81DAF29:: @ 81DAF29 - if_hp_more_than 0, 50, AI_sub_81DAF3B +AI_CV_Confuse2:: @ 81DAF29 + if_hp_more_than AI_TARGET, 50, AI_CV_Confuse_End score -1 - if_hp_more_than 0, 30, AI_sub_81DAF3B + if_hp_more_than AI_TARGET, 30, AI_CV_Confuse_End score -1 -AI_sub_81DAF3B:: @ 81DAF3B - end - -AI_sub_81DAF3C:: @ 81DAF3C - if_hp_less_than 1, 50, AI_sub_81DAF5F - get_type 0 - if_in_bytes AI_bytes_81DAF62, AI_sub_81DAF61 - get_type 2 - if_in_bytes AI_bytes_81DAF62, AI_sub_81DAF61 - if_random_less_than 50, AI_sub_81DAF61 - -AI_sub_81DAF5F:: @ 81DAF5F +AI_CV_Confuse_End:: @ 81DAF3B + end + +@ Improvement in Emerald +@AI_CV_SwaggerHasPsychUp: +@ if_stat_level_more_than AI_TARGET, STAT_ATK, 3, AI_CV_SwaggerHasPsychUp_Minus5 +@ score +3 +@ get_turn_count +@ if_not_equal 0, AI_CV_SwaggerHasPsychUp_End +@ score +2 +@ goto AI_CV_SwaggerHasPsychUp_End +@ +@AI_CV_SwaggerHasPsychUp_Minus5: +@ score -5 +@ +@AI_CV_SwaggerHasPsychUp_End: +@ end + +AI_CV_Reflect:: @ 81DAF3C + if_hp_less_than AI_USER, 50, AI_CV_Reflect_ScoreDown2 + get_target_type1 + if_in_bytes AI_CV_Reflect_PhysicalTypeList, AI_CV_Reflect_End + get_target_type2 + if_in_bytes AI_CV_Reflect_PhysicalTypeList, AI_CV_Reflect_End + if_random_less_than 50, AI_CV_Reflect_End + +AI_CV_Reflect_ScoreDown2:: @ 81DAF5F score -2 -AI_sub_81DAF61:: @ 81DAF61 +AI_CV_Reflect_End:: @ 81DAF61 end -AI_bytes_81DAF62:: @ 81DAF62 - .byte 0 - .byte 1 - .byte 2 - .byte 3 - .byte 4 - .byte 5 - .byte 6 - .byte 7 - .byte 8 - .byte 0xFF +AI_CV_Reflect_PhysicalTypeList:: @ 81DAF62 + .byte TYPE_NORMAL + .byte TYPE_FIGHTING + .byte TYPE_FLYING + .byte TYPE_POISON + .byte TYPE_GROUND + .byte TYPE_ROCK + .byte TYPE_BUG + .byte TYPE_GHOST + .byte TYPE_STEEL + .byte -1 -AI_sub_81DAF6C:: @ 81DAF6C - if_hp_less_than 1, 50, AI_sub_81DAF7A - if_hp_more_than 0, 50, AI_sub_81DAF7C +AI_CV_Poison:: @ 81DAF6C + if_hp_less_than AI_USER, 50, AI_CV_Poison_ScoreDown1 + if_hp_more_than AI_TARGET, 50, AI_CV_Poison_End -AI_sub_81DAF7A:: @ 81DAF7A +AI_CV_Poison_ScoreDown1:: @ 81DAF7A score -1 -AI_sub_81DAF7C:: @ 81DAF7C +AI_CV_Poison_End:: @ 81DAF7C end -AI_sub_81DAF7D:: @ 81DAF7D - if_would_go_first 1, AI_sub_81DAF91 - if_hp_more_than 1, 70, AI_sub_81DAF99 +AI_CV_Paralyze:: @ 81DAF7D + if_target_faster AI_CV_Paralyze2 + if_hp_more_than AI_USER, 70, AI_CV_Paralyze_End score -1 - jump AI_sub_81DAF99 + goto AI_CV_Paralyze_End -AI_sub_81DAF91:: @ 81DAF91 - if_random_less_than 20, AI_sub_81DAF99 - score 3 +AI_CV_Paralyze2:: @ 81DAF91 + if_random_less_than 20, AI_CV_Paralyze_End + score +3 -AI_sub_81DAF99:: @ 81DAF99 +AI_CV_Paralyze_End:: @ 81DAF99 end -AI_sub_81DAF9A:: @ 81DAF9A - if_would_go_first 1, AI_sub_81DAFBC - if_hp_more_than 1, 60, AI_sub_81DAFBC - if_hp_less_than 1, 40, AI_sub_81DAFB4 - if_random_less_than -76, AI_sub_81DAFBC +AI_CV_VitalThrow:: @ 81DAF9A + if_target_faster AI_CV_VitalThrow_End + if_hp_more_than AI_USER, 60, AI_CV_VitalThrow_End + if_hp_less_than AI_USER, 40, AI_CV_VitalThrow2 + if_random_less_than 180, AI_CV_VitalThrow_End -AI_sub_81DAFB4:: @ 81DAFB4 - if_random_less_than 50, AI_sub_81DAFBC +AI_CV_VitalThrow2:: @ 81DAFB4 + if_random_less_than 50, AI_CV_VitalThrow_End score -1 -AI_sub_81DAFBC:: @ 81DAFBC +AI_CV_VitalThrow_End:: @ 81DAFBC end -AI_sub_81DAFBD:: @ 81DAFBD - if_hp_more_than 1, 90, AI_sub_81DAFEA - if_hp_more_than 1, 70, AI_sub_81DAFE2 - if_hp_more_than 1, 50, AI_sub_81DAFDA - if_random_less_than 100, AI_sub_81DAFDA +AI_CV_Substitute:: @ 81DAFBD + if_hp_more_than AI_USER, 90, AI_CV_Substitute4 + if_hp_more_than AI_USER, 70, AI_CV_Substitute3 + if_hp_more_than AI_USER, 50, AI_CV_Substitute2 + if_random_less_than 100, AI_CV_Substitute2 score -1 -AI_sub_81DAFDA:: @ 81DAFDA - if_random_less_than 100, AI_sub_81DAFE2 +AI_CV_Substitute2:: @ 81DAFDA + if_random_less_than 100, AI_CV_Substitute3 score -1 -AI_sub_81DAFE2:: @ 81DAFE2 - if_random_less_than 100, AI_sub_81DAFEA +AI_CV_Substitute3:: @ 81DAFE2 + if_random_less_than 100, AI_CV_Substitute4 score -1 -AI_sub_81DAFEA:: @ 81DAFEA - if_would_go_first 1, AI_sub_81DB052 - get_move 0 +AI_CV_Substitute4:: @ 81DAFEA + if_target_faster AI_CV_Substitute_End + get_last_used_move AI_TARGET get_move_effect_from_result - if_equal 1, AI_sub_81DB022 - if_equal 33, AI_sub_81DB022 - if_equal 66, AI_sub_81DB022 - if_equal 67, AI_sub_81DB022 - if_equal -89, AI_sub_81DB022 - if_equal 49, AI_sub_81DB031 - if_equal 84, AI_sub_81DB040 - jump AI_sub_81DB052 + if_equal EFFECT_SLEEP, AI_CV_Substitute5 + if_equal EFFECT_TOXIC, AI_CV_Substitute5 + if_equal EFFECT_POISON, AI_CV_Substitute5 + if_equal EFFECT_PARALYZE, AI_CV_Substitute5 + if_equal EFFECT_WILL_O_WISP, AI_CV_Substitute5 + if_equal EFFECT_CONFUSE, AI_CV_Substitute6 + if_equal EFFECT_LEECH_SEED, AI_CV_Substitute7 + goto AI_CV_Substitute_End -AI_sub_81DB022:: @ 81DB022 - if_not_status 0, 255, AI_sub_81DB04A - jump AI_sub_81DB052 +AI_CV_Substitute5:: @ 81DB022 + if_not_status AI_TARGET, STATUS1_ANY, AI_CV_Substitute8 + goto AI_CV_Substitute_End -AI_sub_81DB031:: @ 81DB031 - if_not_status2 0, 7, AI_sub_81DB04A - jump AI_sub_81DB052 +AI_CV_Substitute6:: @ 81DB031 + if_not_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_Substitute8 + goto AI_CV_Substitute_End -AI_sub_81DB040:: @ 81DB040 - if_status3 0, 4, AI_sub_81DB052 +AI_CV_Substitute7:: @ 81DB040 + if_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_Substitute_End -AI_sub_81DB04A:: @ 81DB04A - if_random_less_than 100, AI_sub_81DB052 - score 1 +AI_CV_Substitute8:: @ 81DB04A + if_random_less_than 100, AI_CV_Substitute_End + score +1 -AI_sub_81DB052:: @ 81DB052 +AI_CV_Substitute_End:: @ 81DB052 end -AI_sub_81DB053:: @ 81DB053 - if_damage_bonus 10, AI_sub_81DB078 - if_damage_bonus 20, AI_sub_81DB078 - if_would_go_first 1, AI_sub_81DB071 - if_hp_more_than 1, 40, AI_sub_81DB078 - jump AI_sub_81DB07A +AI_CV_Recharge:: @ 81DB053 + if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Recharge_ScoreDown1 + if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Recharge_ScoreDown1 + if_target_faster AI_CV_Recharge2 + if_hp_more_than AI_USER, 40, AI_CV_Recharge_ScoreDown1 + goto AI_CV_Recharge_End -AI_sub_81DB071:: @ 81DB071 - if_hp_less_than 1, 60, AI_sub_81DB07A +AI_CV_Recharge2:: @ 81DB071 + if_hp_less_than AI_USER, 60, AI_CV_Recharge_End -AI_sub_81DB078:: @ 81DB078 +AI_CV_Recharge_ScoreDown1:: @ 81DB078 score -1 -AI_sub_81DB07A:: @ 81DB07A +AI_CV_Recharge_End:: @ 81DB07A end -AI_sub_81DB07B:: @ 81DB07B - if_would_go_first 1, AI_sub_81DB099 - get_move 0 +AI_CV_Disable:: @ 81DB07B + if_target_faster AI_CV_Disable_End + get_last_used_move AI_TARGET get_move_power_from_result - if_equal 0, AI_sub_81DB091 - score 1 - jump AI_sub_81DB099 + if_equal 0, AI_CV_Disable2 + score +1 + goto AI_CV_Disable_End -AI_sub_81DB091:: @ 81DB091 - if_random_less_than 100, AI_sub_81DB099 +AI_CV_Disable2:: @ 81DB091 + if_random_less_than 100, AI_CV_Disable_End score -1 -AI_sub_81DB099:: @ 81DB099 +AI_CV_Disable_End:: @ 81DB099 end -AI_sub_81DB09A:: @ 81DB09A - if_status 0, 7, AI_sub_81DB12E - if_status2 0, 983040, AI_sub_81DB12E - if_status2 0, 7, AI_sub_81DB12E - if_hp_more_than 1, 30, AI_sub_81DB0C7 - if_random_less_than 10, AI_sub_81DB0C7 +AI_CV_Counter:: @ 81DB09A + if_status AI_TARGET, STATUS1_SLEEP, AI_CV_Counter_ScoreDown1 + if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Counter_ScoreDown1 + if_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_Counter_ScoreDown1 + if_hp_more_than AI_USER, 30, AI_CV_Counter2 + if_random_less_than 10, AI_CV_Counter2 score -1 -AI_sub_81DB0C7:: @ 81DB0C7 - if_hp_more_than 1, 50, AI_sub_81DB0D6 - if_random_less_than 100, AI_sub_81DB0D6 +AI_CV_Counter2:: @ 81DB0C7 + if_hp_more_than AI_USER, 50, AI_CV_Counter3 + if_random_less_than 100, AI_CV_Counter3 score -1 -AI_sub_81DB0D6:: @ 81DB0D6 - get_move 0 +AI_CV_Counter3:: @ 81DB0D6 +@ if_has_move AI_USER, MOVE_MIRROR_COAT, AI_CV_Counter7 @ Improvement in Emerald + get_last_used_move AI_TARGET get_move_power_from_result - if_equal 0, AI_sub_81DB105 - if_not_taunted AI_sub_81DB0EC - if_random_less_than 100, AI_sub_81DB0EC - score 1 + if_equal 0, AI_CV_Counter5 + if_target_not_taunted AI_CV_Counter4 + if_random_less_than 100, AI_CV_Counter4 + score +1 -AI_sub_81DB0EC:: @ 81DB0EC - get_move 0 +AI_CV_Counter4:: @ 81DB0EC + get_last_used_move AI_TARGET get_move_type_from_result - if_not_in_bytes AI_bytes_81DB131, AI_sub_81DB12E - if_random_less_than 100, AI_sub_81DB130 - score 1 - jump AI_sub_81DB130 - -AI_sub_81DB105:: @ 81DB105 - if_not_taunted AI_sub_81DB112 - if_random_less_than 100, AI_sub_81DB112 - score 1 - -AI_sub_81DB112:: @ 81DB112 - get_type 0 - if_in_bytes AI_bytes_81DB131, AI_sub_81DB130 - get_type 2 - if_in_bytes AI_bytes_81DB131, AI_sub_81DB130 - if_random_less_than 50, AI_sub_81DB130 - -AI_sub_81DB12E:: @ 81DB12E + if_not_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_ScoreDown1 + if_random_less_than 100, AI_CV_Counter_End + score +1 + goto AI_CV_Counter_End + +AI_CV_Counter5:: @ 81DB105 + if_target_not_taunted AI_CV_Counter6 + if_random_less_than 100, AI_CV_Counter6 + score +1 + +AI_CV_Counter6:: @ 81DB112 + get_target_type1 + if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End + get_target_type2 + if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End + if_random_less_than 50, AI_CV_Counter_End + +@ Improvement in Emerald +@AI_CV_Counter7: +@ if_random_less_than 100, AI_CV_Counter8 +@ score +4 +@ +@AI_CV_Counter8: +@ end + +AI_CV_Counter_ScoreDown1:: @ 81DB12E score -1 -AI_sub_81DB130:: @ 81DB130 - end - -AI_bytes_81DB131:: @ 81DB131 - .byte 0 - .byte 1 - .byte 2 - .byte 3 - .byte 4 - .byte 5 - .byte 6 - .byte 7 - .byte 8 - .byte 0xFF - -AI_sub_81DB13B:: @ 81DB13B - if_last_move_did_damage 0, 0, AI_sub_81DB154 - if_would_go_first 1, AI_sub_81DB161 - get_move 0 +AI_CV_Counter_End:: @ 81DB130 + end + +AI_CV_Counter_PhysicalTypeList:: @ 81DB131 + .byte TYPE_NORMAL + .byte TYPE_FIGHTING + .byte TYPE_FLYING + .byte TYPE_POISON + .byte TYPE_GROUND + .byte TYPE_ROCK + .byte TYPE_BUG + .byte TYPE_GHOST + .byte TYPE_STEEL + .byte -1 + +AI_CV_Encore:: @ 81DB13B + if_any_move_disabled AI_TARGET, AI_CV_Encore2 + if_target_faster AI_CV_Encore_ScoreDown2 + get_last_used_move AI_TARGET get_move_effect_from_result - if_not_in_bytes AI_bytes_81DB164, AI_sub_81DB161 + if_not_in_bytes AI_CV_Encore_EncouragedMovesToEncore, AI_CV_Encore_ScoreDown2 -AI_sub_81DB154:: @ 81DB154 - if_random_less_than 30, AI_sub_81DB163 - score 3 - jump AI_sub_81DB163 +AI_CV_Encore2:: @ 81DB154 + if_random_less_than 30, AI_CV_Encore_End + score +3 + goto AI_CV_Encore_End -AI_sub_81DB161:: @ 81DB161 +AI_CV_Encore_ScoreDown2:: @ 81DB161 score -2 -AI_sub_81DB163:: @ 81DB163 - end - -AI_bytes_81DB164:: @ 81DB164 - .byte 8 - .byte 10 - .byte 11 - .byte 12 - .byte 13 - .byte 25 - .byte 28 - .byte 30 - .byte 33 - .byte 35 - .byte 37 - .byte 40 - .byte 54 - .byte 49 - .byte 66 - .byte 67 - .byte 84 - .byte 85 - .byte 50 - .byte 90 - .byte 93 - .byte 94 - .byte 102 - .byte 106 - .byte 107 - .byte 111 - .byte 191 - .byte 113 - .byte 114 - .byte 115 - .byte 116 - .byte 118 - .byte 120 - .byte 124 - .byte 136 - .byte 137 - .byte 142 - .byte 143 - .byte 148 - .byte 158 - .byte 160 - .byte 161 - .byte 162 - .byte 164 - .byte 165 - .byte 167 - .byte 172 - .byte 174 - .byte 177 - .byte 178 - .byte 181 - .byte 184 - .byte 188 - .byte 191 - .byte 192 - .byte 193 - .byte 194 - .byte 199 - .byte 201 - .byte 210 - .byte 212 - .byte 213 - .byte 0xFF - -AI_sub_81DB1A3:: @ 81DB1A3 - if_hp_less_than 0, 80, AI_sub_81DB1CC - if_would_go_first 1, AI_sub_81DB1BE - if_hp_more_than 1, 40, AI_sub_81DB1CC - score 1 - jump AI_sub_81DB1CE - -AI_sub_81DB1BE:: @ 81DB1BE - if_hp_more_than 1, 60, AI_sub_81DB1CC - score 1 - jump AI_sub_81DB1CE - -AI_sub_81DB1CC:: @ 81DB1CC +AI_CV_Encore_End:: @ 81DB163 + end + +AI_CV_Encore_EncouragedMovesToEncore:: @ 81DB164 + .byte EFFECT_DREAM_EATER + .byte EFFECT_ATTACK_UP + .byte EFFECT_DEFENSE_UP + .byte EFFECT_SPEED_UP + .byte EFFECT_SPECIAL_ATTACK_UP + .byte EFFECT_HAZE + .byte EFFECT_ROAR + .byte EFFECT_CONVERSION + .byte EFFECT_TOXIC + .byte EFFECT_LIGHT_SCREEN + .byte EFFECT_REST + .byte EFFECT_SUPER_FANG + .byte EFFECT_SPECIAL_DEFENSE_UP_2 + .byte EFFECT_CONFUSE + .byte EFFECT_POISON + .byte EFFECT_PARALYZE + .byte EFFECT_LEECH_SEED + .byte EFFECT_SPLASH + .byte EFFECT_ATTACK_UP_2 + .byte EFFECT_ENCORE + .byte EFFECT_CONVERSION_2 + .byte EFFECT_LOCK_ON + .byte EFFECT_HEAL_BELL + .byte EFFECT_MEAN_LOOK + .byte EFFECT_NIGHTMARE + .byte EFFECT_PROTECT + .byte EFFECT_SKILL_SWAP + .byte EFFECT_FORESIGHT + .byte EFFECT_PERISH_SONG + .byte EFFECT_SANDSTORM + .byte EFFECT_ENDURE + .byte EFFECT_SWAGGER + .byte EFFECT_ATTRACT + .byte EFFECT_SAFEGUARD + .byte EFFECT_RAIN_DANCE + .byte EFFECT_SUNNY_DAY + .byte EFFECT_BELLY_DRUM + .byte EFFECT_PSYCH_UP + .byte EFFECT_FUTURE_SIGHT + .byte EFFECT_FAKE_OUT + .byte EFFECT_STOCKPILE + .byte EFFECT_SPIT_UP + .byte EFFECT_SWALLOW + .byte EFFECT_HAIL + .byte EFFECT_TORMENT + .byte EFFECT_WILL_O_WISP + .byte EFFECT_FOLLOW_ME + .byte EFFECT_CHARGE + .byte EFFECT_TRICK + .byte EFFECT_ROLE_PLAY + .byte EFFECT_INGRAIN + .byte EFFECT_RECYCLE + .byte EFFECT_KNOCK_OFF + .byte EFFECT_SKILL_SWAP + .byte EFFECT_IMPRISON + .byte EFFECT_REFRESH + .byte EFFECT_GRUDGE + .byte EFFECT_TEETER_DANCE + .byte EFFECT_MUD_SPORT + .byte EFFECT_WATER_SPORT + .byte EFFECT_DRAGON_DANCE + .byte EFFECT_CAMOUFLAGE + .byte -1 + +AI_CV_PainSplit:: @ 81DB1A3 + if_hp_less_than AI_TARGET, 80, AI_CV_PainSplit_ScoreDown1 + if_target_faster AI_CV_PainSplit2 + if_hp_more_than AI_USER, 40, AI_CV_PainSplit_ScoreDown1 + score +1 + goto AI_CV_PainSplit_End + +AI_CV_PainSplit2:: @ 81DB1BE + if_hp_more_than AI_USER, 60, AI_CV_PainSplit_ScoreDown1 + score +1 + goto AI_CV_PainSplit_End + +AI_CV_PainSplit_ScoreDown1:: @ 81DB1CC score -1 -AI_sub_81DB1CE:: @ 81DB1CE +AI_CV_PainSplit_End:: @ 81DB1CE end -AI_sub_81DB1CF:: @ 81DB1CF - score 2 +AI_CV_Snore:: @ 81DB1CF + score +2 end -AI_sub_81DB1D2:: @ 81DB1D2 - if_random_less_than -128, AI_sub_81DB1DA - score 2 +AI_CV_LockOn:: @ 81DB1D2 + if_random_less_than 128, AI_CV_LockOn_End + score +2 -AI_sub_81DB1DA:: @ 81DB1DA +AI_CV_LockOn_End:: @ 81DB1DA end -AI_sub_81DB1DB:: @ 81DB1DB - score 2 +AI_CV_SleepTalk:: @ 81DB1DB +@ if_status AI_USER, STATUS1_SLEEP, Score_Plus10 @ Improvement in Emerald + score +2 @ Change to -5 end -AI_sub_81DB1DE:: @ 81DB1DE +AI_CV_DestinyBond:: @ 81DB1DE score -1 - if_would_go_first 1, AI_sub_81DB213 - if_hp_more_than 1, 70, AI_sub_81DB213 - if_random_less_than -128, AI_sub_81DB1F5 - score 1 + if_target_faster AI_CV_DestinyBond_End + if_hp_more_than AI_USER, 70, AI_CV_DestinyBond_End + if_random_less_than 128, AI_CV_DestinyBond2 + score +1 -AI_sub_81DB1F5:: @ 81DB1F5 - if_hp_more_than 1, 50, AI_sub_81DB213 - if_random_less_than -128, AI_sub_81DB204 - score 1 +AI_CV_DestinyBond2:: @ 81DB1F5 + if_hp_more_than AI_USER, 50, AI_CV_DestinyBond_End + if_random_less_than 128, AI_CV_DestinyBond3 + score +1 -AI_sub_81DB204:: @ 81DB204 - if_hp_more_than 1, 30, AI_sub_81DB213 - if_random_less_than 100, AI_sub_81DB213 - score 2 +AI_CV_DestinyBond3:: @ 81DB204 + if_hp_more_than AI_USER, 30, AI_CV_DestinyBond_End + if_random_less_than 100, AI_CV_DestinyBond_End + score +2 -AI_sub_81DB213:: @ 81DB213 +AI_CV_DestinyBond_End:: @ 81DB213 end -AI_sub_81DB214:: @ 81DB214 - if_would_go_first 1, AI_sub_81DB234 - if_hp_more_than 1, 33, AI_sub_81DB256 - if_hp_more_than 1, 20, AI_sub_81DB258 - if_hp_less_than 1, 8, AI_sub_81DB247 - jump AI_sub_81DB249 +AI_CV_Flail:: @ 81DB214 + if_target_faster AI_CV_Flail2 + if_hp_more_than AI_USER, 33, AI_CV_Flail_ScoreDown1 + if_hp_more_than AI_USER, 20, AI_CV_Flail_End + if_hp_less_than AI_USER, 8, AI_CV_Flail_ScoreUp1 + goto AI_CV_Flail3 -AI_sub_81DB234:: @ 81DB234 - if_hp_more_than 1, 60, AI_sub_81DB256 - if_hp_more_than 1, 40, AI_sub_81DB258 - jump AI_sub_81DB249 +AI_CV_Flail2:: @ 81DB234 + if_hp_more_than AI_USER, 60, AI_CV_Flail_ScoreDown1 + if_hp_more_than AI_USER, 40, AI_CV_Flail_End + goto AI_CV_Flail3 -AI_sub_81DB247:: @ 81DB247 - score 1 +AI_CV_Flail_ScoreUp1:: @ 81DB247 + score +1 -AI_sub_81DB249:: @ 81DB249 - if_random_less_than 100, AI_sub_81DB258 - score 1 - jump AI_sub_81DB258 +AI_CV_Flail3:: @ 81DB249 + if_random_less_than 100, AI_CV_Flail_End + score +1 + goto AI_CV_Flail_End -AI_sub_81DB256:: @ 81DB256 +AI_CV_Flail_ScoreDown1:: @ 81DB256 score -1 -AI_sub_81DB258:: @ 81DB258 +AI_CV_Flail_End:: @ 81DB258 end -AI_sub_81DB259:: @ 81DB259 - if_status 0, 255, AI_sub_81DB26F - if_status_in_party 0, 255, AI_sub_81DB26F +AI_CV_HealBell:: @ 81DB259 + if_status AI_TARGET, STATUS1_ANY, AI_CV_HealBell_End + if_status_in_party AI_TARGET, STATUS1_ANY, AI_CV_HealBell_End score -5 -AI_sub_81DB26F:: @ 81DB26F +AI_CV_HealBell_End:: @ 81DB26F end -AI_sub_81DB270:: @ 81DB270 - get_hold_effect 0 - if_not_in_bytes AI_bytes_81DB28B, AI_sub_81DB288 - if_random_less_than 50, AI_sub_81DB28A - score 1 - jump AI_sub_81DB28A +AI_CV_Thief:: @ 81DB270 + get_hold_effect AI_TARGET + if_not_in_bytes AI_CV_Thief_EncourageItemsToSteal, AI_CV_Thief_ScoreDown2 + if_random_less_than 50, AI_CV_Thief_End + score +1 + goto AI_CV_Thief_End -AI_sub_81DB288:: @ 81DB288 +AI_CV_Thief_ScoreDown2:: @ 81DB288 score -2 -AI_sub_81DB28A:: @ 81DB28A - end - -AI_bytes_81DB28B:: @ 81DB28B - .byte 3 - .byte 9 - .byte 1 - .byte 22 - .byte 43 - .byte 45 - .byte 65 - .byte 0xFF - -AI_sub_81DB293:: @ 81DB293 - get_type 1 - if_equal 7, AI_sub_81DB2D8 - get_type 3 - if_equal 7, AI_sub_81DB2D8 - if_stat_level_more_than 1, 2, 9, AI_sub_81DB2E1 - if_random_less_than -128, AI_sub_81DB2B3 - score 1 - -AI_sub_81DB2B3:: @ 81DB2B3 - if_stat_level_more_than 1, 2, 7, AI_sub_81DB2E1 - if_random_less_than -128, AI_sub_81DB2C3 - score 1 - -AI_sub_81DB2C3:: @ 81DB2C3 - if_stat_level_more_than 1, 2, 6, AI_sub_81DB2E1 - if_random_less_than -128, AI_sub_81DB2E1 - score 1 - jump AI_sub_81DB2E1 - -AI_sub_81DB2D8:: @ 81DB2D8 - if_hp_more_than 1, 80, AI_sub_81DB2E1 +AI_CV_Thief_End:: @ 81DB28A + end + +AI_CV_Thief_EncourageItemsToSteal:: @ 81DB28B + .byte HOLD_EFFECT_CURE_SLP + .byte HOLD_EFFECT_CURE_STATUS + .byte HOLD_EFFECT_RESTORE_HP + .byte HOLD_EFFECT_EVASION_UP + .byte HOLD_EFFECT_LEFTOVERS + .byte HOLD_EFFECT_LIGHT_BALL + .byte HOLD_EFFECT_THICK_CLUB + .byte -1 + +AI_CV_Curse:: @ 81DB293 + get_user_type1 + if_equal TYPE_GHOST, AI_CV_Curse4 + get_user_type2 + if_equal TYPE_GHOST, AI_CV_Curse4 + if_stat_level_more_than AI_USER, STAT_DEF, 9, AI_CV_Curse_End + if_random_less_than 128, AI_CV_Curse2 + score +1 + +AI_CV_Curse2:: @ 81DB2B3 + if_stat_level_more_than AI_USER, STAT_DEF, 7, AI_CV_Curse_End + if_random_less_than 128, AI_CV_Curse3 + score +1 + +AI_CV_Curse3:: @ 81DB2C3 + if_stat_level_more_than AI_USER, STAT_DEF, 6, AI_CV_Curse_End + if_random_less_than 128, AI_CV_Curse_End + score +1 + goto AI_CV_Curse_End + +AI_CV_Curse4:: @ 81DB2D8 + if_hp_more_than AI_USER, 80, AI_CV_Curse_End score -1 -AI_sub_81DB2E1:: @ 81DB2E1 - end - -AI_sub_81DB2E2:: @ 81DB2E2 - get_protect_count 1 - if_more_than 1, AI_sub_81DB3A0 - if_status 1, 128, AI_sub_81DB397 - if_status2 1, 268435456, AI_sub_81DB397 - if_status3 1, 32, AI_sub_81DB397 - if_status2 1, 983040, AI_sub_81DB397 - if_status3 1, 4, AI_sub_81DB397 - if_status3 1, 6144, AI_sub_81DB397 - if_move_effect 0, 32, AI_sub_81DB397 - if_move_effect 0, -100, AI_sub_81DB397 - if_status 0, 128, AI_sub_81DB37E - if_status2 0, 268435456, AI_sub_81DB37E - if_status3 0, 32, AI_sub_81DB37E - if_status2 0, 983040, AI_sub_81DB37E - if_status3 0, 4, AI_sub_81DB37E - if_status3 0, 6144, AI_sub_81DB37E - get_move 0 +AI_CV_Curse_End:: @ 81DB2E1 + end + +AI_CV_Protect:: @ 81DB2E2 + get_protect_count AI_USER + if_more_than 1, AI_CV_Protect_ScoreDown2 + if_status AI_USER, STATUS1_TOXIC_POISON, AI_CV_Protect3 + if_status2 AI_USER, STATUS2_CURSED, AI_CV_Protect3 + if_status3 AI_USER, STATUS3_PERISH_SONG, AI_CV_Protect3 + if_status2 AI_USER, STATUS2_INFATUATION, AI_CV_Protect3 + if_status3 AI_USER, STATUS3_LEECHSEED, AI_CV_Protect3 + if_status3 AI_USER, STATUS3_YAWN, AI_CV_Protect3 + if_has_move_with_effect AI_TARGET, EFFECT_RESTORE_HP, AI_CV_Protect3 + if_has_move_with_effect AI_TARGET, EFFECT_DEFENSE_CURL, AI_CV_Protect3 + if_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_Protect_ScoreUp2 + if_status2 AI_TARGET, STATUS2_CURSED, AI_CV_Protect_ScoreUp2 + if_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_Protect_ScoreUp2 + if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Protect_ScoreUp2 + if_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_Protect_ScoreUp2 + if_status3 AI_TARGET, STATUS3_YAWN, AI_CV_Protect_ScoreUp2 + get_last_used_move AI_TARGET get_move_effect_from_result - if_not_equal 94, AI_sub_81DB37E - jump AI_sub_81DB380 + if_not_equal EFFECT_LOCK_ON, AI_CV_Protect_ScoreUp2 + goto AI_CV_Protect2 + +AI_CV_Protect_ScoreUp2:: @ 81DB37E + score +2 -AI_sub_81DB37E:: @ 81DB37E - score 2 +AI_CV_Protect2:: @ 81DB380 +@ if_random_less_than 128, AI_CV_Protect4 @ Improvement in Emerald +@ score -1 -AI_sub_81DB380:: @ 81DB380 - get_protect_count 1 - if_equal 0, AI_sub_81DB3A2 +AI_CV_Protect4:: + get_protect_count AI_USER + if_equal 0, AI_CV_Protect_End score -1 - if_random_less_than -128, AI_sub_81DB3A2 + if_random_less_than 128, AI_CV_Protect_End score -1 - jump AI_sub_81DB3A2 + goto AI_CV_Protect_End -AI_sub_81DB397:: @ 81DB397 - get_move 0 +AI_CV_Protect3:: @ 81DB397 + get_last_used_move AI_TARGET get_move_effect_from_result - if_not_equal 94, AI_sub_81DB3A2 + if_not_equal EFFECT_LOCK_ON, AI_CV_Protect_End -AI_sub_81DB3A0:: @ 81DB3A0 +AI_CV_Protect_ScoreDown2:: @ 81DB3A0 score -2 -AI_sub_81DB3A2:: @ 81DB3A2 +AI_CV_Protect_End:: @ 81DB3A2 end -AI_sub_81DB3A3:: @ 81DB3A3 - get_type 1 - if_equal 7, AI_sub_81DB3C2 - get_type 3 - if_equal 7, AI_sub_81DB3C2 - if_stat_level_more_than 1, 7, 8, AI_sub_81DB3C8 +AI_CV_Foresight:: @ 81DB3A3 + get_user_type1 + if_equal TYPE_GHOST, AI_CV_Foresight2 + get_user_type2 + if_equal TYPE_GHOST, AI_CV_Foresight2 + if_stat_level_more_than AI_USER, STAT_EVASION, 8, AI_CV_Foresight3 score -2 - jump AI_sub_81DB3D0 + goto AI_CV_Foresight_End -AI_sub_81DB3C2:: @ 81DB3C2 - if_random_less_than 80, AI_sub_81DB3D0 +AI_CV_Foresight2:: @ 81DB3C2 + if_random_less_than 80, AI_CV_Foresight_End -AI_sub_81DB3C8:: @ 81DB3C8 - if_random_less_than 80, AI_sub_81DB3D0 - score 2 +AI_CV_Foresight3:: @ 81DB3C8 + if_random_less_than 80, AI_CV_Foresight_End + score +2 -AI_sub_81DB3D0:: @ 81DB3D0 +AI_CV_Foresight_End:: @ 81DB3D0 end -AI_sub_81DB3D1:: @ 81DB3D1 - if_hp_less_than 1, 4, AI_sub_81DB3DF - if_hp_less_than 1, 35, AI_sub_81DB3E6 +AI_CV_Endure:: @ 81DB3D1 + if_hp_less_than AI_USER, 4, AI_CV_Endure2 + if_hp_less_than AI_USER, 35, AI_CV_Endure3 -AI_sub_81DB3DF:: @ 81DB3DF +AI_CV_Endure2:: @ 81DB3DF score -1 - jump AI_sub_81DB3EE + goto AI_CV_Endure_End -AI_sub_81DB3E6:: @ 81DB3E6 - if_random_less_than 70, AI_sub_81DB3EE - score 1 +AI_CV_Endure3:: @ 81DB3E6 + if_random_less_than 70, AI_CV_Endure_End + score +1 -AI_sub_81DB3EE:: @ 81DB3EE +AI_CV_Endure_End:: @ 81DB3EE end -AI_sub_81DB3EF:: @ 81DB3EF - if_stat_level_more_than 1, 1, 8, AI_sub_81DB41C - if_stat_level_more_than 1, 2, 8, AI_sub_81DB41C - if_stat_level_more_than 1, 4, 8, AI_sub_81DB41C - if_stat_level_more_than 1, 5, 8, AI_sub_81DB41C - if_stat_level_more_than 1, 7, 8, AI_sub_81DB41C - jump AI_sub_81DB442 +AI_CV_BatonPass:: @ 81DB3EF + if_stat_level_more_than AI_USER, STAT_ATK, 8, AI_CV_BatonPass2 + if_stat_level_more_than AI_USER, STAT_DEF, 8, AI_CV_BatonPass2 + if_stat_level_more_than AI_USER, STAT_SPATK, 8, AI_CV_BatonPass2 + if_stat_level_more_than AI_USER, STAT_SPDEF, 8, AI_CV_BatonPass2 + if_stat_level_more_than AI_USER, STAT_EVASION, 8, AI_CV_BatonPass2 + goto AI_CV_BatonPass5 -AI_sub_81DB41C:: @ 81DB41C - if_would_go_first 1, AI_sub_81DB42E - if_hp_more_than 1, 60, AI_sub_81DB48A - jump AI_sub_81DB435 +AI_CV_BatonPass2:: @ 81DB41C + if_target_faster AI_CV_BatonPass3 + if_hp_more_than AI_USER, 60, AI_CV_BatonPass_End + goto AI_CV_BatonPass4 -AI_sub_81DB42E:: @ 81DB42E - if_hp_more_than 1, 70, AI_sub_81DB48A +AI_CV_BatonPass3:: @ 81DB42E + if_hp_more_than AI_USER, 70, AI_CV_BatonPass_End -AI_sub_81DB435:: @ 81DB435 - if_random_less_than 80, AI_sub_81DB48A - score 2 - jump AI_sub_81DB48A +AI_CV_BatonPass4:: @ 81DB435 + if_random_less_than 80, AI_CV_BatonPass_End + score +2 + goto AI_CV_BatonPass_End -AI_sub_81DB442:: @ 81DB442 - if_stat_level_more_than 1, 1, 7, AI_sub_81DB46F - if_stat_level_more_than 1, 2, 7, AI_sub_81DB46F - if_stat_level_more_than 1, 4, 7, AI_sub_81DB46F - if_stat_level_more_than 1, 5, 7, AI_sub_81DB46F - if_stat_level_more_than 1, 7, 7, AI_sub_81DB46F - jump AI_sub_81DB488 +AI_CV_BatonPass5:: @ 81DB442 + if_stat_level_more_than AI_USER, STAT_ATK, 7, AI_CV_BatonPass7 + if_stat_level_more_than AI_USER, STAT_DEF, 7, AI_CV_BatonPass7 + if_stat_level_more_than AI_USER, STAT_SPATK, 7, AI_CV_BatonPass7 + if_stat_level_more_than AI_USER, STAT_SPDEF, 7, AI_CV_BatonPass7 + if_stat_level_more_than AI_USER, STAT_EVASION, 7, AI_CV_BatonPass7 + goto AI_CV_BatonPass_ScoreDown2 -AI_sub_81DB46F:: @ 81DB46F - if_would_go_first 1, AI_sub_81DB481 - if_hp_more_than 1, 60, AI_sub_81DB488 - jump AI_sub_81DB48A +AI_CV_BatonPass7:: @ 81DB46F + if_target_faster AI_CV_BatonPass8 + if_hp_more_than AI_USER, 60, AI_CV_BatonPass_ScoreDown2 + goto AI_CV_BatonPass_End -AI_sub_81DB481:: @ 81DB481 - if_hp_less_than 1, 70, AI_sub_81DB48A +AI_CV_BatonPass8:: @ 81DB481 + if_hp_less_than AI_USER, 70, AI_CV_BatonPass_End -AI_sub_81DB488:: @ 81DB488 +AI_CV_BatonPass_ScoreDown2:: @ 81DB488 score -2 -AI_sub_81DB48A:: @ 81DB48A +AI_CV_BatonPass_End:: @ 81DB48A end -AI_sub_81DB48B:: @ 81DB48B - is_first_turn 1 - if_not_equal 0, AI_sub_81DB4C0 - get_type 0 - if_equal 7, AI_sub_81DB4B8 - get_type 0 - if_equal 14, AI_sub_81DB4B8 - get_type 2 - if_equal 7, AI_sub_81DB4B8 - get_type 2 - if_equal 14, AI_sub_81DB4B8 - jump AI_sub_81DB4C0 +AI_CV_Pursuit:: @ 81DB48B + is_first_turn_for AI_USER + if_not_equal 0, AI_CV_Pursuit_End + get_target_type1 + if_equal TYPE_GHOST, AI_CV_Pursuit2 + get_target_type1 + if_equal TYPE_PSYCHIC, AI_CV_Pursuit2 + get_target_type2 + if_equal TYPE_GHOST, AI_CV_Pursuit2 + get_target_type2 + if_equal TYPE_PSYCHIC, AI_CV_Pursuit2 + goto AI_CV_Pursuit_End -AI_sub_81DB4B8:: @ 81DB4B8 - if_random_less_than -128, AI_sub_81DB4C0 - score 1 +AI_CV_Pursuit2:: @ 81DB4B8 + if_random_less_than 128, AI_CV_Pursuit_End + score +1 -AI_sub_81DB4C0:: @ 81DB4C0 +AI_CV_Pursuit_End:: @ 81DB4C0 end -AI_sub_81DB4C1:: @ 81DB4C1 - if_would_go_first 0, AI_sub_81DB4CF - get_ability 1 - if_equal 33, AI_sub_81DB4F6 +AI_CV_RainDance:: @ 81DB4C1 + if_user_faster AI_CV_RainDance2 + get_ability AI_USER + if_equal ABILITY_SWIFT_SWIM, AI_CV_RainDance3 -AI_sub_81DB4CF:: @ 81DB4CF - if_hp_less_than 1, 40, AI_sub_81DB4FD +AI_CV_RainDance2:: @ 81DB4CF + if_hp_less_than AI_USER, 40, AI_CV_RainDance_ScoreDown1 get_weather - if_equal 3, AI_sub_81DB4F6 - if_equal 0, AI_sub_81DB4F6 - if_equal 2, AI_sub_81DB4F6 - get_ability 1 - if_equal 44, AI_sub_81DB4F6 - jump AI_sub_81DB4FF - -AI_sub_81DB4F6:: @ 81DB4F6 - score 1 - jump AI_sub_81DB4FF - -AI_sub_81DB4FD:: @ 81DB4FD + if_equal AI_WEATHER_HAIL, AI_CV_RainDance3 + if_equal AI_WEATHER_SUN, AI_CV_RainDance3 + if_equal AI_WEATHER_SANDSTORM, AI_CV_RainDance3 + get_ability AI_USER + if_equal ABILITY_RAIN_DISH, AI_CV_RainDance3 + goto AI_CV_RainDance_End + +AI_CV_RainDance3:: @ 81DB4F6 + score +1 + goto AI_CV_RainDance_End + +AI_CV_RainDance_ScoreDown1:: @ 81DB4FD score -1 -AI_sub_81DB4FF:: @ 81DB4FF +AI_CV_RainDance_End:: @ 81DB4FF end -AI_sub_81DB500:: @ 81DB500 - if_hp_less_than 1, 40, AI_sub_81DB526 +AI_CV_SunnyDay:: @ 81DB500 + if_hp_less_than AI_USER, 40, AI_CV_SunnyDay_ScoreDown1 get_weather - if_equal 3, AI_sub_81DB51F - if_equal 1, AI_sub_81DB51F - if_equal 2, AI_sub_81DB51F - jump AI_sub_81DB528 + if_equal AI_WEATHER_HAIL, AI_CV_SunnyDay2 + if_equal AI_WEATHER_RAIN, AI_CV_SunnyDay2 + if_equal AI_WEATHER_SANDSTORM, AI_CV_SunnyDay2 + goto AI_CV_SunnyDay_End -AI_sub_81DB51F:: @ 81DB51F - score 1 - jump AI_sub_81DB528 +AI_CV_SunnyDay2:: @ 81DB51F + score +1 + goto AI_CV_SunnyDay_End -AI_sub_81DB526:: @ 81DB526 +AI_CV_SunnyDay_ScoreDown1:: @ 81DB526 score -1 -AI_sub_81DB528:: @ 81DB528 +AI_CV_SunnyDay_End:: @ 81DB528 end -AI_sub_81DB529:: @ 81DB529 - if_hp_less_than 1, 90, AI_sub_81DB535 - jump AI_sub_81DB537 +AI_CV_BellyDrum:: @ 81DB529 + if_hp_less_than AI_USER, 90, AI_CV_BellyDrum_ScoreDown2 + goto AI_CV_BellyDrum_End -AI_sub_81DB535:: @ 81DB535 +AI_CV_BellyDrum_ScoreDown2:: @ 81DB535 score -2 -AI_sub_81DB537:: @ 81DB537 +AI_CV_BellyDrum_End:: @ 81DB537 end -AI_sub_81DB538:: @ 81DB538 - if_stat_level_more_than 0, 1, 8, AI_sub_81DB565 - if_stat_level_more_than 0, 2, 8, AI_sub_81DB565 - if_stat_level_more_than 0, 4, 8, AI_sub_81DB565 - if_stat_level_more_than 0, 5, 8, AI_sub_81DB565 - if_stat_level_more_than 0, 7, 8, AI_sub_81DB565 - jump AI_sub_81DB5A2 +AI_CV_PsychUp:: @ 81DB538 + if_stat_level_more_than AI_TARGET, STAT_ATK, 8, AI_CV_PsychUp2 + if_stat_level_more_than AI_TARGET, STAT_DEF, 8, AI_CV_PsychUp2 + if_stat_level_more_than AI_TARGET, STAT_SPATK, 8, AI_CV_PsychUp2 + if_stat_level_more_than AI_TARGET, STAT_SPDEF, 8, AI_CV_PsychUp2 + if_stat_level_more_than AI_TARGET, STAT_EVASION, 8, AI_CV_PsychUp2 + goto AI_CV_PsychUp_ScoreDown2 -AI_sub_81DB565:: @ 81DB565 - if_stat_level_less_than 1, 1, 7, AI_sub_81DB59A - if_stat_level_less_than 1, 2, 7, AI_sub_81DB59A - if_stat_level_less_than 1, 4, 7, AI_sub_81DB59A - if_stat_level_less_than 1, 5, 7, AI_sub_81DB59A - if_stat_level_less_than 1, 7, 7, AI_sub_81DB598 - if_random_less_than 50, AI_sub_81DB5A4 - jump AI_sub_81DB5A2 +AI_CV_PsychUp2:: @ 81DB565 + if_stat_level_less_than AI_USER, STAT_ATK, 7, AI_CV_PsychUp3 + if_stat_level_less_than AI_USER, STAT_DEF, 7, AI_CV_PsychUp3 + if_stat_level_less_than AI_USER, STAT_SPATK, 7, AI_CV_PsychUp3 + if_stat_level_less_than AI_USER, STAT_SPDEF, 7, AI_CV_PsychUp3 + if_stat_level_less_than AI_USER, STAT_EVASION, 7, AI_CV_PsychUp_ScoreUp1 + if_random_less_than 50, AI_CV_PsychUp_End + goto AI_CV_PsychUp_ScoreDown2 -AI_sub_81DB598:: @ 81DB598 - score 1 +AI_CV_PsychUp_ScoreUp1:: @ 81DB598 + score +1 -AI_sub_81DB59A:: @ 81DB59A - if_random_less_than -128, AI_sub_81DB5A4 - score 1 +AI_CV_PsychUp3:: @ 81DB59A + if_random_less_than 128, AI_CV_PsychUp_End @ Remove this line + score +1 +@ end @ Improvement in Emerald -AI_sub_81DB5A2:: @ 81DB5A2 +AI_CV_PsychUp_ScoreDown2:: @ 81DB5A2 score -2 -AI_sub_81DB5A4:: @ 81DB5A4 +AI_CV_PsychUp_End:: @ 81DB5A4 end -AI_sub_81DB5A5:: @ 81DB5A5 - if_status 0, 7, AI_sub_81DB639 - if_status2 0, 983040, AI_sub_81DB639 - if_status2 0, 7, AI_sub_81DB639 - if_hp_more_than 1, 30, AI_sub_81DB5D2 - if_random_less_than 10, AI_sub_81DB5D2 +AI_CV_MirrorCoat:: @ 81DB5A5 + if_status AI_TARGET, STATUS1_SLEEP, AI_CV_MirrorCoat_ScoreDown1 + if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_MirrorCoat_ScoreDown1 + if_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_MirrorCoat_ScoreDown1 + if_hp_more_than AI_USER, 30, AI_CV_MirrorCoat2 + if_random_less_than 10, AI_CV_MirrorCoat2 score -1 -AI_sub_81DB5D2:: @ 81DB5D2 - if_hp_more_than 1, 50, AI_sub_81DB5E1 - if_random_less_than 100, AI_sub_81DB5E1 +AI_CV_MirrorCoat2:: @ 81DB5D2 + if_hp_more_than AI_USER, 50, AI_CV_MirrorCoat3 + if_random_less_than 100, AI_CV_MirrorCoat3 score -1 -AI_sub_81DB5E1:: @ 81DB5E1 - get_move 0 +AI_CV_MirrorCoat3:: @ 81DB5E1 +@ if_has_move AI_USER, MOVE_COUNTER, AI_CV_MirrorCoat_ScoreUp4 @ Improvement in Emerald + get_last_used_move AI_TARGET get_move_power_from_result - if_equal 0, AI_sub_81DB610 - if_not_taunted AI_sub_81DB5F7 - if_random_less_than 100, AI_sub_81DB5F7 - score 1 + if_equal 0, AI_CV_MirrorCoat5 + if_target_not_taunted AI_CV_MirrorCoat4 + if_random_less_than 100, AI_CV_MirrorCoat4 + score +1 -AI_sub_81DB5F7:: @ 81DB5F7 - get_move 0 +AI_CV_MirrorCoat4:: @ 81DB5F7 + get_last_used_move AI_TARGET get_move_type_from_result - if_not_in_bytes AI_bytes_81DB63C, AI_sub_81DB639 - if_random_less_than 100, AI_sub_81DB63B - score 1 - jump AI_sub_81DB63B - -AI_sub_81DB610:: @ 81DB610 - if_not_taunted AI_sub_81DB61D - if_random_less_than 100, AI_sub_81DB61D - score 1 - -AI_sub_81DB61D:: @ 81DB61D - get_type 0 - if_in_bytes AI_bytes_81DB63C, AI_sub_81DB63B - get_type 2 - if_in_bytes AI_bytes_81DB63C, AI_sub_81DB63B - if_random_less_than 50, AI_sub_81DB63B - -AI_sub_81DB639:: @ 81DB639 + if_not_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_ScoreDown1 + if_random_less_than 100, AI_CV_MirrorCoat_End + score +1 + goto AI_CV_MirrorCoat_End + +AI_CV_MirrorCoat5:: @ 81DB610 + if_target_not_taunted AI_CV_MirrorCoat6 + if_random_less_than 100, AI_CV_MirrorCoat6 + score +1 + +AI_CV_MirrorCoat6:: @ 81DB61D + get_target_type1 + if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End + get_target_type2 + if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End + if_random_less_than 50, AI_CV_MirrorCoat_End + +@ Improvement in Emerald +@AI_CV_MirrorCoat_ScoreUp4: +@ if_random_less_than 100, AI_CV_MirrorCoat_ScoreUp4_End +@ score +4 +@ +@AI_CV_MirrorCoat_ScoreUp4_End: +@ end + +AI_CV_MirrorCoat_ScoreDown1:: @ 81DB639 score -1 -AI_sub_81DB63B:: @ 81DB63B - end - -AI_bytes_81DB63C:: @ 81DB63C - .byte 10 - .byte 11 - .byte 12 - .byte 13 - .byte 14 - .byte 15 - .byte 16 - .byte 17 - .byte 0xFF - -AI_sub_81DB645:: @ 81DB645 - if_damage_bonus 10, AI_sub_81DB666 - if_damage_bonus 20, AI_sub_81DB666 - if_move_effect 0, 111, AI_sub_81DB666 - if_hp_more_than 1, 38, AI_sub_81DB668 +AI_CV_MirrorCoat_End:: @ 81DB63B + end + +AI_CV_MirrorCoat_SpecialTypeList:: @ 81DB63C + .byte TYPE_FIRE + .byte TYPE_WATER + .byte TYPE_GRASS + .byte TYPE_ELECTRIC + .byte TYPE_PSYCHIC + .byte TYPE_ICE + .byte TYPE_DRAGON + .byte TYPE_DARK + .byte -1 + +AI_CV_ChargeUpMove:: @ 81DB645 + if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_ChargeUpMove_ScoreDown2 + if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_ChargeUpMove_ScoreDown2 + if_has_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_ChargeUpMove_ScoreDown2 + if_hp_more_than AI_USER, 38, AI_CV_ChargeUpMove_End score -1 - jump AI_sub_81DB668 + goto AI_CV_ChargeUpMove_End -AI_sub_81DB666:: @ 81DB666 +AI_CV_ChargeUpMove_ScoreDown2:: @ 81DB666 score -2 -AI_sub_81DB668:: @ 81DB668 +AI_CV_ChargeUpMove_End:: @ 81DB668 end -AI_sub_81DB669:: @ 81DB669 - if_not_move_effect 0, 111, AI_sub_81DB677 +AI_CV_SemiInvulnerable:: @ 81DB669 + if_doesnt_have_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_SemiInvulnerable2 score -1 - jump AI_sub_81DB6EE - -AI_sub_81DB677:: @ 81DB677 - if_status 0, 128, AI_sub_81DB6E6 - if_status2 0, 268435456, AI_sub_81DB6E6 - if_status3 0, 4, AI_sub_81DB6E6 + goto AI_CV_SemiInvulnerable_End + +@ BUG: The scripts for checking type-resistance to weather for semi-invulnerable moves are swapped +@ The result is that the AI is encouraged to stall while taking damage from weather +@ To fix, swap _CheckSandstormTypes/_CheckIceType in the below script +AI_CV_SemiInvulnerable2:: @ 81DB677 + if_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_SemiInvulnerable_TryEncourage + if_status2 AI_TARGET, STATUS2_CURSED, AI_CV_SemiInvulnerable_TryEncourage + if_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_SemiInvulnerable_TryEncourage get_weather - if_equal 3, AI_sub_81DB6A7 - if_equal 2, AI_sub_81DB6C2 - jump AI_sub_81DB6D2 - -AI_sub_81DB6A7:: @ 81DB6A7 - get_type 1 - if_in_bytes AI_bytes_81DB6EF, AI_sub_81DB6E6 - get_type 3 - if_in_bytes AI_bytes_81DB6EF, AI_sub_81DB6E6 - jump AI_sub_81DB6D2 - -AI_sub_81DB6C2:: @ 81DB6C2 - get_type 1 - if_equal 15, AI_sub_81DB6E6 - get_type 3 - if_equal 15, AI_sub_81DB6E6 - -AI_sub_81DB6D2:: @ 81DB6D2 - if_would_go_first 1, AI_sub_81DB6EE - get_move 0 + if_equal AI_WEATHER_HAIL, AI_CV_SemiInvulnerable_CheckSandstormTypes + if_equal AI_WEATHER_SANDSTORM, AI_CV_SemiInvulnerable_CheckIceType + goto AI_CV_SemiInvulnerable5 + +AI_CV_SemiInvulnerable_CheckSandstormTypes:: @ 81DB6A7 + get_user_type1 + if_in_bytes AI_CV_SandstormResistantTypes, AI_CV_SemiInvulnerable_TryEncourage + get_user_type2 + if_in_bytes AI_CV_SandstormResistantTypes, AI_CV_SemiInvulnerable_TryEncourage + goto AI_CV_SemiInvulnerable5 + +AI_CV_SemiInvulnerable_CheckIceType:: @ 81DB6C2 + get_user_type1 + if_equal TYPE_ICE, AI_CV_SemiInvulnerable_TryEncourage + get_user_type2 + if_equal TYPE_ICE, AI_CV_SemiInvulnerable_TryEncourage + +AI_CV_SemiInvulnerable5:: @ 81DB6D2 + if_target_faster AI_CV_SemiInvulnerable_End + get_last_used_move AI_TARGET get_move_effect_from_result - if_not_equal 94, AI_sub_81DB6E6 - jump AI_sub_81DB6EE + if_not_equal EFFECT_LOCK_ON, AI_CV_SemiInvulnerable_TryEncourage + goto AI_CV_SemiInvulnerable_End -AI_sub_81DB6E6:: @ 81DB6E6 - if_random_less_than 80, AI_sub_81DB6EE - score 1 +AI_CV_SemiInvulnerable_TryEncourage:: @ 81DB6E6 + if_random_less_than 80, AI_CV_SemiInvulnerable_End + score +1 -AI_sub_81DB6EE:: @ 81DB6EE +AI_CV_SemiInvulnerable_End:: @ 81DB6EE end -AI_bytes_81DB6EF:: @ 81DB6EF - .byte 4 - .byte 5 - .byte 8 - .byte 0xFF +AI_CV_SandstormResistantTypes:: @ 81DB6EF + .byte TYPE_GROUND + .byte TYPE_ROCK + .byte TYPE_STEEL + .byte -1 -AI_sub_81DB6F3:: @ 81DB6F3 - score 2 +AI_CV_FakeOut:: @ 81DB6F3 + score +2 end -AI_sub_81DB6F6:: @ 81DB6F6 - get_stockpile_count 1 - if_less_than 2, AI_sub_81DB706 - if_random_less_than 80, AI_sub_81DB706 - score 2 +AI_CV_SpitUp:: @ 81DB6F6 + get_stockpile_count AI_USER + if_less_than 2, AI_CV_SpitUp_End + if_random_less_than 80, AI_CV_SpitUp_End + score +2 -AI_sub_81DB706:: @ 81DB706 +AI_CV_SpitUp_End:: @ 81DB706 end -AI_sub_81DB707:: @ 81DB707 - if_hp_less_than 1, 40, AI_sub_81DB72D +AI_CV_Hail:: @ 81DB707 + if_hp_less_than AI_USER, 40, AI_CV_Hail_ScoreDown1 get_weather - if_equal 0, AI_sub_81DB726 - if_equal 1, AI_sub_81DB726 - if_equal 2, AI_sub_81DB726 - jump AI_sub_81DB72F + if_equal AI_WEATHER_SUN, AI_CV_Hail2 + if_equal AI_WEATHER_RAIN, AI_CV_Hail2 + if_equal AI_WEATHER_SANDSTORM, AI_CV_Hail2 + goto AI_CV_Hail_End -AI_sub_81DB726:: @ 81DB726 - score 1 - jump AI_sub_81DB72F +AI_CV_Hail2:: @ 81DB726 + score +1 + goto AI_CV_Hail_End -AI_sub_81DB72D:: @ 81DB72D +AI_CV_Hail_ScoreDown1:: @ 81DB72D score -1 -AI_sub_81DB72F:: @ 81DB72F +AI_CV_Hail_End:: @ 81DB72F end -AI_sub_81DB730:: @ 81DB730 - if_not_status 0, 216, AI_sub_81DB73C - score 1 +@ BUG: Facade score is increased if the target is statused, but should be if the user is. Replace AI_TARGET with AI_USER +AI_CV_Facade:: @ 81DB730 + if_not_status AI_TARGET, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, AI_CV_Facade_End + score +1 -AI_sub_81DB73C:: @ 81DB73C +AI_CV_Facade_End:: @ 81DB73C end -AI_sub_81DB73D:: @ 81DB73D - if_damage_bonus 10, AI_sub_81DB77C - if_damage_bonus 20, AI_sub_81DB77C - if_status 0, 7, AI_sub_81DB789 - if_status2 0, 983040, AI_sub_81DB783 - if_status2 0, 7, AI_sub_81DB783 - is_first_turn 1 - if_not_equal 0, AI_sub_81DB78B - if_random_less_than 100, AI_sub_81DB78B - score 1 - jump AI_sub_81DB78B +AI_CV_FocusPunch:: @ 81DB73D + if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_FocusPunch2 + if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_FocusPunch2 + if_status AI_TARGET, STATUS1_SLEEP, AI_CV_FocusPunch_ScoreUp1 + if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_FocusPunch3 + if_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_FocusPunch3 + is_first_turn_for AI_USER + if_not_equal 0, AI_CV_FocusPunch_End + if_random_less_than 100, AI_CV_FocusPunch_End + score +1 + goto AI_CV_FocusPunch_End -AI_sub_81DB77C:: @ 81DB77C +AI_CV_FocusPunch2:: @ 81DB77C score -1 - jump AI_sub_81DB78B + goto AI_CV_FocusPunch_End -AI_sub_81DB783:: @ 81DB783 - if_random_less_than 100, AI_sub_81DB78B +AI_CV_FocusPunch3:: @ 81DB783 + if_random_less_than 100, AI_CV_FocusPunch_End -AI_sub_81DB789:: @ 81DB789 - score 1 +AI_CV_FocusPunch_ScoreUp1:: @ 81DB789 + score +1 -AI_sub_81DB78B:: @ 81DB78B +AI_CV_FocusPunch_End:: @ 81DB78B end -AI_sub_81DB78C:: @ 81DB78C - if_status 0, 64, AI_sub_81DB79B - jump AI_sub_81DB79D +AI_CV_SmellingSalt:: @ 81DB78C + if_status AI_TARGET, STATUS1_PARALYSIS, AI_CV_SmellingSalt_ScoreUp1 + goto AI_CV_SmellingSalt_End -AI_sub_81DB79B:: @ 81DB79B - score 1 +AI_CV_SmellingSalt_ScoreUp1:: @ 81DB79B + score +1 -AI_sub_81DB79D:: @ 81DB79D +AI_CV_SmellingSalt_End:: @ 81DB79D end -AI_sub_81DB79E:: @ 81DB79E - get_hold_effect 1 - if_in_bytes AI_bytes_81DB7E7, AI_sub_81DB7B9 - if_in_bytes AI_bytes_81DB7DF, AI_sub_81DB7CB +AI_CV_Trick:: @ 81DB79E + get_hold_effect AI_USER + if_in_bytes AI_CV_Trick_ChoiceEffects, AI_CV_Trick3 + if_in_bytes AI_CV_Trick_EffectsToEncourage, AI_CV_Trick4 -AI_sub_81DB7B2:: @ 81DB7B2 +AI_CV_Trick2:: @ 81DB7B2 score -3 - jump AI_sub_81DB7DE - -AI_sub_81DB7B9:: @ 81DB7B9 - get_hold_effect 0 - if_in_bytes AI_bytes_81DB7E7, AI_sub_81DB7B2 - score 5 - jump AI_sub_81DB7DE - -AI_sub_81DB7CB:: @ 81DB7CB - get_hold_effect 0 - if_in_bytes AI_bytes_81DB7DF, AI_sub_81DB7B2 - if_random_less_than 50, AI_sub_81DB7DE - score 2 - -AI_sub_81DB7DE:: @ 81DB7DE - end - -AI_bytes_81DB7DF:: @ 81DB7DF - .byte 10 - .byte 11 - .byte 12 - .byte 13 - .byte 14 - .byte 24 - .byte 29 - .byte 0xFF - -AI_bytes_81DB7E7:: @ 81DB7E7 - .byte 29 - .byte 0xFF - -AI_sub_81DB7E9:: @ 81DB7E9 - get_ability 1 - if_in_bytes AI_bytes_81DB80F, AI_sub_81DB7FF - get_ability 0 - if_in_bytes AI_bytes_81DB80F, AI_sub_81DB806 - -AI_sub_81DB7FF:: @ 81DB7FF + goto AI_CV_Trick_End + +AI_CV_Trick3:: @ 81DB7B9 + get_hold_effect AI_TARGET + if_in_bytes AI_CV_Trick_ChoiceEffects, AI_CV_Trick2 + score +5 + goto AI_CV_Trick_End + +AI_CV_Trick4:: @ 81DB7CB + get_hold_effect AI_TARGET + if_in_bytes AI_CV_Trick_EffectsToEncourage, AI_CV_Trick2 + if_random_less_than 50, AI_CV_Trick_End + score +2 + +AI_CV_Trick_End:: @ 81DB7DE + end + +AI_CV_Trick_EffectsToEncourage:: @ 81DB7DF + .byte HOLD_EFFECT_CONFUSE_SPICY + .byte HOLD_EFFECT_CONFUSE_DRY + .byte HOLD_EFFECT_CONFUSE_SWEET + .byte HOLD_EFFECT_CONFUSE_BITTER + .byte HOLD_EFFECT_CONFUSE_SOUR + .byte HOLD_EFFECT_MACHO_BRACE + .byte HOLD_EFFECT_CHOICE_BAND + .byte -1 + +AI_CV_Trick_ChoiceEffects:: @ 81DB7E7 + .byte HOLD_EFFECT_CHOICE_BAND + .byte -1 + +AI_CV_ChangeSelfAbility:: @ 81DB7E9 + get_ability AI_USER + if_in_bytes AI_CV_ChangeSelfAbility_AbilitiesToEncourage, AI_CV_ChangeSelfAbility2 + get_ability AI_TARGET + if_in_bytes AI_CV_ChangeSelfAbility_AbilitiesToEncourage, AI_CV_ChangeSelfAbility3 + +AI_CV_ChangeSelfAbility2:: @ 81DB7FF score -1 - jump AI_sub_81DB80E - -AI_sub_81DB806:: @ 81DB806 - if_random_less_than 50, AI_sub_81DB80E - score 2 - -AI_sub_81DB80E:: @ 81DB80E - end - -AI_bytes_81DB80F:: @ 81DB80F - .byte 3 - .byte 4 - .byte 8 - .byte 9 - .byte 18 - .byte 25 - .byte 27 - .byte 33 - .byte 37 - .byte 44 - .byte 56 - .byte 61 - .byte 63 - .byte 74 - .byte 34 - .byte 19 - .byte 0xFF - -AI_sub_81DB820:: @ 81DB820 - if_damage_bonus 10, AI_sub_81DB84D - if_damage_bonus 20, AI_sub_81DB84D - if_stat_level_less_than 1, 1, 6, AI_sub_81DB84D - if_would_go_first 1, AI_sub_81DB846 - if_hp_more_than 1, 40, AI_sub_81DB84D - jump AI_sub_81DB84F - -AI_sub_81DB846:: @ 81DB846 - if_hp_less_than 1, 60, AI_sub_81DB84F - -AI_sub_81DB84D:: @ 81DB84D + goto AI_CV_ChangeSelfAbility_End + +AI_CV_ChangeSelfAbility3:: @ 81DB806 + if_random_less_than 50, AI_CV_ChangeSelfAbility_End + score +2 + +AI_CV_ChangeSelfAbility_End:: @ 81DB80E + end + +AI_CV_ChangeSelfAbility_AbilitiesToEncourage:: @ 81DB80F + .byte ABILITY_SPEED_BOOST + .byte ABILITY_BATTLE_ARMOR + .byte ABILITY_SAND_VEIL + .byte ABILITY_STATIC + .byte ABILITY_FLASH_FIRE + .byte ABILITY_WONDER_GUARD + .byte ABILITY_EFFECT_SPORE + .byte ABILITY_SWIFT_SWIM + .byte ABILITY_HUGE_POWER + .byte ABILITY_RAIN_DISH + .byte ABILITY_CUTE_CHARM + .byte ABILITY_SHED_SKIN + .byte ABILITY_MARVEL_SCALE + .byte ABILITY_PURE_POWER + .byte ABILITY_CHLOROPHYLL + .byte ABILITY_SHIELD_DUST + .byte -1 + +AI_CV_Superpower:: @ 81DB820 + if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Superpower_ScoreDown1 + if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Superpower_ScoreDown1 + if_stat_level_less_than AI_USER, STAT_ATK, 6, AI_CV_Superpower_ScoreDown1 + if_target_faster AI_CV_Superpower2 + if_hp_more_than AI_USER, 40, AI_CV_Superpower_ScoreDown1 + goto AI_CV_Superpower_End + +AI_CV_Superpower2:: @ 81DB846 + if_hp_less_than AI_USER, 60, AI_CV_Superpower_End + +AI_CV_Superpower_ScoreDown1:: @ 81DB84D score -1 -AI_sub_81DB84F:: @ 81DB84F +AI_CV_Superpower_End:: @ 81DB84F end -AI_sub_81DB850:: @ 81DB850 - if_hp_more_than 0, 30, AI_sub_81DB85F - if_random_less_than 100, AI_sub_81DB85F +AI_CV_MagicCoat:: @ 81DB850 + if_hp_more_than AI_TARGET, 30, AI_CV_MagicCoat2 + if_random_less_than 100, AI_CV_MagicCoat2 score -1 -AI_sub_81DB85F:: @ 81DB85F - is_first_turn 1 - if_equal 0, AI_sub_81DB87A - if_random_less_than -106, AI_sub_81DB882 - score 1 - jump AI_sub_81DB882 - if_random_less_than 50, AI_sub_81DB882 +AI_CV_MagicCoat2:: + is_first_turn_for AI_USER + if_equal 0, AI_CV_MagicCoat4 + if_random_less_than 150, AI_CV_MagicCoat_End + score +1 + goto AI_CV_MagicCoat_End + if_random_less_than 50, AI_CV_MagicCoat_End -AI_sub_81DB87A:: @ 81DB87A - if_random_less_than 30, AI_sub_81DB882 +AI_CV_MagicCoat3:: +@ if_random_less_than 50, AI_CV_MagicCoat_End @ Improvement in Emerald + +AI_CV_MagicCoat4:: @ 81DB87A + if_random_less_than 30, AI_CV_MagicCoat_End score -1 -AI_sub_81DB882:: @ 81DB882 +AI_CV_MagicCoat_End:: @ 81DB882 end -AI_sub_81DB883:: @ 81DB883 - get_item 1 - if_not_in_bytes AI_bytes_81DB89E, AI_sub_81DB89B - if_random_less_than 50, AI_sub_81DB89D - score 1 - jump AI_sub_81DB89D +AI_CV_Recycle:: @ 81DB883 + get_used_held_item AI_USER + if_not_in_bytes AI_CV_Recycle_ItemsToEncourage, AI_CV_Recycle_ScoreDown2 + if_random_less_than 50, AI_CV_Recycle_End + score +1 + goto AI_CV_Recycle_End -AI_sub_81DB89B:: @ 81DB89B +AI_CV_Recycle_ScoreDown2:: @ 81DB89B score -2 -AI_sub_81DB89D:: @ 81DB89D +AI_CV_Recycle_End:: @ 81DB89D end -AI_bytes_81DB89E:: @ 81DB89E - .byte 134 - .byte 141 - .byte 174 - .byte 0xFF +AI_CV_Recycle_ItemsToEncourage:: @ 81DB89E + .byte ITEM_CHESTO_BERRY + .byte ITEM_LUM_BERRY + .byte ITEM_STARF_BERRY + .byte -1 -AI_sub_81DB8A2:: @ 81DB8A2 - if_status 0, 7, AI_sub_81DB8CD - if_status2 0, 983040, AI_sub_81DB8CD - if_status2 0, 7, AI_sub_81DB8CD - if_random_less_than -76, AI_sub_81DB8CD - score 2 - jump AI_sub_81DB8CF +AI_CV_Revenge:: @ 81DB8A2 + if_status AI_TARGET, STATUS1_SLEEP, AI_CV_Revenge_ScoreDown2 + if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Revenge_ScoreDown2 + if_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_Revenge_ScoreDown2 + if_random_less_than 180, AI_CV_Revenge_ScoreDown2 + score +2 + goto AI_CV_Revenge_End -AI_sub_81DB8CD:: @ 81DB8CD +AI_CV_Revenge_ScoreDown2:: @ 81DB8CD score -2 -AI_sub_81DB8CF:: @ 81DB8CF +AI_CV_Revenge_End:: @ 81DB8CF end -AI_sub_81DB8D0:: @ 81DB8D0 - if_status4 0, 1, AI_sub_81DB8DF - jump AI_sub_81DB8E1 +AI_CV_BrickBreak:: @ 81DB8D0 + if_side_affecting AI_TARGET, SIDE_STATUS_REFLECT, AI_CV_BrickBreak_ScoreUp1 + goto AI_CV_BrickBreak_End -AI_sub_81DB8DF:: @ 81DB8DF - score 1 +AI_CV_BrickBreak_ScoreUp1:: @ 81DB8DF + score +1 -AI_sub_81DB8E1:: @ 81DB8E1 +AI_CV_BrickBreak_End:: @ 81DB8E1 end -AI_sub_81DB8E2:: @ 81DB8E2 - if_hp_less_than 0, 30, AI_sub_81DB8F9 - is_first_turn 1 - if_more_than 0, AI_sub_81DB8F9 - if_random_less_than -76, AI_sub_81DB8F9 - score 1 +AI_CV_KnockOff:: @ 81DB8E2 + if_hp_less_than AI_TARGET, 30, AI_CV_KnockOff_End + is_first_turn_for AI_USER + if_more_than 0, AI_CV_KnockOff_End + if_random_less_than 180, AI_CV_KnockOff_End + score +1 -AI_sub_81DB8F9:: @ 81DB8F9 +AI_CV_KnockOff_End:: @ 81DB8F9 end -AI_sub_81DB8FA:: @ 81DB8FA - if_hp_less_than 0, 70, AI_sub_81DB923 - if_would_go_first 1, AI_sub_81DB915 - if_hp_more_than 1, 40, AI_sub_81DB923 - score 1 - jump AI_sub_81DB925 +AI_CV_Endeavor:: @ 81DB8FA + if_hp_less_than AI_TARGET, 70, AI_CV_Endeavor_ScoreDown1 + if_target_faster AI_CV_Endeavor2 + if_hp_more_than AI_USER, 40, AI_CV_Endeavor_ScoreDown1 + score +1 + goto AI_CV_Endeavor_End -AI_sub_81DB915:: @ 81DB915 - if_hp_more_than 1, 50, AI_sub_81DB923 - score 1 - jump AI_sub_81DB925 +AI_CV_Endeavor2:: @ 81DB915 + if_hp_more_than AI_USER, 50, AI_CV_Endeavor_ScoreDown1 + score +1 + goto AI_CV_Endeavor_End -AI_sub_81DB923:: @ 81DB923 +AI_CV_Endeavor_ScoreDown1:: @ 81DB923 score -1 -AI_sub_81DB925:: @ 81DB925 +AI_CV_Endeavor_End:: @ 81DB925 end -AI_sub_81DB926:: @ 81DB926 - if_damage_bonus 10, AI_sub_81DB94B - if_damage_bonus 20, AI_sub_81DB94B - if_would_go_first 1, AI_sub_81DB944 - if_hp_more_than 0, 50, AI_sub_81DB94D - jump AI_sub_81DB94B +AI_CV_Eruption:: @ 81DB926 + if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Eruption_ScoreDown1 + if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Eruption_ScoreDown1 + if_target_faster AI_CV_Eruption2 + if_hp_more_than AI_TARGET, 50, AI_CV_Eruption_End + goto AI_CV_Eruption_ScoreDown1 -AI_sub_81DB944:: @ 81DB944 - if_hp_more_than 0, 70, AI_sub_81DB94D +AI_CV_Eruption2:: @ 81DB944 + if_hp_more_than AI_TARGET, 70, AI_CV_Eruption_End -AI_sub_81DB94B:: @ 81DB94B +AI_CV_Eruption_ScoreDown1:: @ 81DB94B score -1 -AI_sub_81DB94D:: @ 81DB94D +AI_CV_Eruption_End:: @ 81DB94D end -AI_sub_81DB94E:: @ 81DB94E - is_first_turn 1 - if_more_than 0, AI_sub_81DB95E - if_random_less_than 100, AI_sub_81DB95E - score 2 +AI_CV_Imprison:: @ 81DB94E + is_first_turn_for AI_USER + if_more_than 0, AI_CV_Imprison_End + if_random_less_than 100, AI_CV_Imprison_End + score +2 -AI_sub_81DB95E:: @ 81DB95E +AI_CV_Imprison_End:: @ 81DB95E end -AI_sub_81DB95F:: @ 81DB95F - if_hp_less_than 0, 50, AI_sub_81DB96B - jump AI_sub_81DB96D +AI_CV_Refresh:: @ 81DB95F + if_hp_less_than AI_TARGET, 50, AI_CV_Refresh_ScoreDown1 + goto AI_CV_Refresh_End -AI_sub_81DB96B:: @ 81DB96B +AI_CV_Refresh_ScoreDown1:: @ 81DB96B score -1 -AI_sub_81DB96D:: @ 81DB96D - end - -AI_sub_81DB96E:: @ 81DB96E - is_first_turn 1 - if_equal 1, AI_sub_81DB9B5 - if_random_less_than 30, AI_sub_81DB9D7 - if_would_go_first 1, AI_sub_81DB99B - if_hp_not_equal 1, 100, AI_sub_81DB9CF - if_hp_less_than 0, 70, AI_sub_81DB9CF - if_random_less_than 60, AI_sub_81DB9D7 - jump AI_sub_81DB9CF - -AI_sub_81DB99B:: @ 81DB99B - if_hp_more_than 0, 25, AI_sub_81DB9CF - if_move_effect 0, 32, AI_sub_81DB9B5 - if_move_effect 0, -100, AI_sub_81DB9B5 - jump AI_sub_81DB9C2 - -AI_sub_81DB9B5:: @ 81DB9B5 - if_random_less_than -106, AI_sub_81DB9D7 - score 2 - jump AI_sub_81DB9D7 - -AI_sub_81DB9C2:: @ 81DB9C2 - if_random_less_than -26, AI_sub_81DB9CF - score 1 - jump AI_sub_81DB9D7 - -AI_sub_81DB9CF:: @ 81DB9CF - if_random_less_than 30, AI_sub_81DB9D7 +AI_CV_Refresh_End:: @ 81DB96D + end + +AI_CV_Snatch:: @ 81DB96E + is_first_turn_for AI_USER + if_equal 1, AI_CV_Snatch3 + if_random_less_than 30, AI_CV_Snatch_End + if_target_faster AI_CV_Snatch2 + if_hp_not_equal AI_USER, 100, AI_CV_Snatch5 + if_hp_less_than AI_TARGET, 70, AI_CV_Snatch5 + if_random_less_than 60, AI_CV_Snatch_End + goto AI_CV_Snatch5 + +AI_CV_Snatch2:: @ 81DB99B + if_hp_more_than AI_TARGET, 25, AI_CV_Snatch5 + if_has_move_with_effect AI_TARGET, EFFECT_RESTORE_HP, AI_CV_Snatch3 + if_has_move_with_effect AI_TARGET, EFFECT_DEFENSE_CURL, AI_CV_Snatch3 + goto AI_CV_Snatch4 + +AI_CV_Snatch3:: @ 81DB9B5 + if_random_less_than 150, AI_CV_Snatch_End + score +2 + goto AI_CV_Snatch_End + +AI_CV_Snatch4:: @ 81DB9C2 + if_random_less_than 230, AI_CV_Snatch5 + score +1 + goto AI_CV_Snatch_End + +AI_CV_Snatch5:: @ 81DB9CF + if_random_less_than 30, AI_CV_Snatch_End score -2 -AI_sub_81DB9D7:: @ 81DB9D7 +AI_CV_Snatch_End:: @ 81DB9D7 end -AI_sub_81DB9D8:: @ 81DB9D8 - if_hp_less_than 1, 50, AI_sub_81DB9FB - get_type 0 - if_equal 13, AI_sub_81DB9F4 - get_type 2 - if_equal 13, AI_sub_81DB9F4 - jump AI_sub_81DB9FB +AI_CV_MudSport:: @ 81DB9D8 + if_hp_less_than AI_USER, 50, AI_CV_MudSport_ScoreDown1 + get_target_type1 + if_equal TYPE_ELECTRIC, AI_CV_MudSport2 + get_target_type2 + if_equal TYPE_ELECTRIC, AI_CV_MudSport2 + goto AI_CV_MudSport_ScoreDown1 -AI_sub_81DB9F4:: @ 81DB9F4 - score 1 - jump AI_sub_81DB9FD +AI_CV_MudSport2:: @ 81DB9F4 + score +1 + goto AI_CV_MudSport_End -AI_sub_81DB9FB:: @ 81DB9FB +AI_CV_MudSport_ScoreDown1:: @ 81DB9FB score -1 -AI_sub_81DB9FD:: @ 81DB9FD +AI_CV_MudSport_End:: @ 81DB9FD end -AI_sub_81DB9FE:: @ 81DB9FE - if_damage_bonus 10, AI_sub_81DBA23 - if_damage_bonus 20, AI_sub_81DBA23 - if_would_go_first 1, AI_sub_81DBA1C - if_hp_more_than 1, 60, AI_sub_81DBA25 - jump AI_sub_81DBA23 +AI_CV_Overheat:: @ 81DB9FE + if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_Overheat_ScoreDown1 + if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_Overheat_ScoreDown1 + if_target_faster AI_CV_Overheat2 + if_hp_more_than AI_USER, 60, AI_CV_Overheat_End + goto AI_CV_Overheat_ScoreDown1 -AI_sub_81DBA1C:: @ 81DBA1C - if_hp_more_than 1, 80, AI_sub_81DBA25 +AI_CV_Overheat2:: @ 81DBA1C + if_hp_more_than AI_USER, 80, AI_CV_Overheat_End -AI_sub_81DBA23:: @ 81DBA23 +AI_CV_Overheat_ScoreDown1:: @ 81DBA23 score -1 -AI_sub_81DBA25:: @ 81DBA25 +AI_CV_Overheat_End:: @ 81DBA25 end -AI_sub_81DBA26:: @ 81DBA26 - if_hp_less_than 1, 50, AI_sub_81DBA49 - get_type 0 - if_equal 10, AI_sub_81DBA42 - get_type 2 - if_equal 10, AI_sub_81DBA42 - jump AI_sub_81DBA49 +AI_CV_WaterSport:: @ 81DBA26 + if_hp_less_than AI_USER, 50, AI_CV_WaterSport_ScoreDown1 + get_target_type1 + if_equal TYPE_FIRE, AI_CV_WaterSport2 + get_target_type2 + if_equal TYPE_FIRE, AI_CV_WaterSport2 + goto AI_CV_WaterSport_ScoreDown1 -AI_sub_81DBA42:: @ 81DBA42 - score 1 - jump AI_sub_81DBA4B +AI_CV_WaterSport2:: @ 81DBA42 + score +1 + goto AI_CV_WaterSport_End -AI_sub_81DBA49:: @ 81DBA49 +AI_CV_WaterSport_ScoreDown1:: @ 81DBA49 score -1 -AI_sub_81DBA4B:: @ 81DBA4B +AI_CV_WaterSport_End:: @ 81DBA4B end -AI_sub_81DBA4C:: @ 81DBA4C - if_would_go_first 1, AI_sub_81DBA66 - if_hp_more_than 1, 50, AI_sub_81DBA6E - if_random_less_than 70, AI_sub_81DBA6E +AI_CV_DragonDance:: @ 81DBA4C + if_target_faster AI_CV_DragonDance2 + if_hp_more_than AI_USER, 50, AI_CV_DragonDance_End + if_random_less_than 70, AI_CV_DragonDance_End score -1 - jump AI_sub_81DBA6E + goto AI_CV_DragonDance_End -AI_sub_81DBA66:: @ 81DBA66 - if_random_less_than -128, AI_sub_81DBA6E - score 1 +AI_CV_DragonDance2:: @ 81DBA66 + if_random_less_than 128, AI_CV_DragonDance_End + score +1 -AI_sub_81DBA6E:: @ 81DBA6E +AI_CV_DragonDance_End:: @ 81DBA6E end -AI_CheckViability:: @ 81DBA6F - if_can_faint AI_sub_81DBA7C - is_most_powerful_move - if_equal 1, AI_sub_81DA424 +AI_TryToFaint:: @ 81DBA6F + if_can_faint AI_TryToFaint_TryToEncourageQuickAttack + get_how_powerful_move_is + if_equal MOVE_NOT_MOST_POWERFUL, Score_Minus1 +@ if_type_effectiveness AI_EFFECTIVENESS_x4, AI_TryToFaint_DoubleSuperEffective @ Improvement in Emerald end -AI_sub_81DBA7C:: @ 81DBA7C - if_effect 7, AI_sub_81DBA8C - if_not_effect 103, AI_sub_81DBA8A - score 2 +@ Improvement in Emerald +@AI_TryToFaint_DoubleSuperEffective: +@ if_random_less_than 80, AI_TryToFaint_End +@ score +2 +@ end + +AI_TryToFaint_TryToEncourageQuickAttack:: @ 81DBA7C + if_effect EFFECT_EXPLOSION, AI_TryToFaint_End + if_not_effect EFFECT_QUICK_ATTACK, AI_TryToFaint_ScoreUp4 + score +2 -AI_sub_81DBA8A:: @ 81DBA8A - score 4 +AI_TryToFaint_ScoreUp4:: @ 81DBA8A + score +4 -AI_sub_81DBA8C:: @ 81DBA8C +AI_TryToFaint_End:: @ 81DBA8C end AI_SetupFirstTurn:: @ 81DBA8D get_turn_count - if_not_equal 0, AI_sub_81DBAA6 - get_effect - if_not_in_bytes AI_bytes_81DBAA7, AI_sub_81DBAA6 - if_random_less_than 80, AI_sub_81DBAA6 - score 2 - -AI_sub_81DBAA6:: @ 81DBAA6 - end - -AI_bytes_81DBAA7:: @ 81DBAA7 - .byte 10 - .byte 11 - .byte 12 - .byte 13 - .byte 14 - .byte 15 - .byte 16 - .byte 18 - .byte 19 - .byte 20 - .byte 21 - .byte 22 - .byte 23 - .byte 24 - .byte 30 - .byte 35 - .byte 54 - .byte 47 - .byte 49 - .byte 50 - .byte 51 - .byte 52 - .byte 53 - .byte 54 - .byte 55 - .byte 56 - .byte 58 - .byte 59 - .byte 60 - .byte 61 - .byte 62 - .byte 63 - .byte 64 - .byte 65 - .byte 66 - .byte 67 - .byte 79 - .byte 84 - .byte 108 - .byte 109 - .byte 118 - .byte 213 - .byte 187 - .byte 156 - .byte 165 - .byte 166 - .byte 167 - .byte 181 - .byte 192 - .byte 199 - .byte 205 - .byte 206 - .byte 208 - .byte 211 - .byte 213 - .byte 0xFF + if_not_equal 0, AI_SetupFirstTurn_End + get_considered_move_effect + if_not_in_bytes AI_SetupFirstTurn_SetupEffectsToEncourage, AI_SetupFirstTurn_End + if_random_less_than 80, AI_SetupFirstTurn_End + score +2 + +AI_SetupFirstTurn_End:: @ 81DBAA6 + end + +AI_SetupFirstTurn_SetupEffectsToEncourage:: @ 81DBAA7 + .byte EFFECT_ATTACK_UP + .byte EFFECT_DEFENSE_UP + .byte EFFECT_SPEED_UP + .byte EFFECT_SPECIAL_ATTACK_UP + .byte EFFECT_SPECIAL_DEFENSE_UP + .byte EFFECT_ACCURACY_UP + .byte EFFECT_EVASION_UP + .byte EFFECT_ATTACK_DOWN + .byte EFFECT_DEFENSE_DOWN + .byte EFFECT_SPEED_DOWN + .byte EFFECT_SPECIAL_ATTACK_DOWN + .byte EFFECT_SPECIAL_DEFENSE_DOWN + .byte EFFECT_ACCURACY_DOWN + .byte EFFECT_EVASION_DOWN + .byte EFFECT_CONVERSION + .byte EFFECT_LIGHT_SCREEN + .byte EFFECT_SPECIAL_DEFENSE_UP_2 + .byte EFFECT_FOCUS_ENERGY + .byte EFFECT_CONFUSE + .byte EFFECT_ATTACK_UP_2 + .byte EFFECT_DEFENSE_UP_2 + .byte EFFECT_SPEED_UP_2 + .byte EFFECT_SPECIAL_ATTACK_UP_2 + .byte EFFECT_SPECIAL_DEFENSE_UP_2 + .byte EFFECT_ACCURACY_UP_2 + .byte EFFECT_EVASION_UP_2 + .byte EFFECT_ATTACK_DOWN_2 + .byte EFFECT_DEFENSE_DOWN_2 + .byte EFFECT_SPEED_DOWN_2 + .byte EFFECT_SPECIAL_ATTACK_DOWN_2 + .byte EFFECT_SPECIAL_DEFENSE_DOWN_2 + .byte EFFECT_ACCURACY_DOWN_2 + .byte EFFECT_EVASION_DOWN_2 + .byte EFFECT_REFLECT + .byte EFFECT_POISON + .byte EFFECT_PARALYZE + .byte EFFECT_SUBSTITUTE + .byte EFFECT_LEECH_SEED + .byte EFFECT_MINIMIZE + .byte EFFECT_CURSE + .byte EFFECT_SWAGGER + .byte EFFECT_CAMOUFLAGE + .byte EFFECT_YAWN + .byte EFFECT_DEFENSE_CURL + .byte EFFECT_TORMENT + .byte EFFECT_FLATTER + .byte EFFECT_WILL_O_WISP + .byte EFFECT_INGRAIN + .byte EFFECT_IMPRISON + .byte EFFECT_TEETER_DANCE + .byte EFFECT_TICKLE + .byte EFFECT_COSMIC_POWER + .byte EFFECT_BULK_UP + .byte EFFECT_CALM_MIND + .byte EFFECT_CAMOUFLAGE + .byte -1 AI_PreferStrongestMove:: @ 81DBADF - is_most_powerful_move - if_not_equal 0, AI_sub_81DBAEE - if_random_less_than 100, AI_sub_81DBAEE - score 2 + get_how_powerful_move_is + if_not_equal MOVE_POWER_DISCOURAGED, AI_PreferStrongestMove_End + if_random_less_than 100, AI_PreferStrongestMove_End + score +2 -AI_sub_81DBAEE:: @ 81DBAEE +AI_PreferStrongestMove_End:: @ 81DBAEE end AI_Risky:: @ 81DBAEF - get_effect - if_not_in_bytes AI_bytes_81DBB02, AI_sub_81DBB01 - if_random_less_than -128, AI_sub_81DBB01 - score 2 - -AI_sub_81DBB01:: @ 81DBB01 - end - -AI_bytes_81DBB02:: @ 81DBB02 - .byte 1 - .byte 7 - .byte 9 - .byte 38 - .byte 43 - .byte 49 - .byte 83 - .byte 88 - .byte 89 - .byte 98 - .byte 118 - .byte 120 - .byte 122 - .byte 140 - .byte 142 - .byte 144 - .byte 170 - .byte 185 - .byte 199 - .byte 0xFF + get_considered_move_effect + if_not_in_bytes AI_Risky_EffectsToEncourage, AI_Risky_End + if_random_less_than 128, AI_Risky_End + score +2 + +AI_Risky_End:: @ 81DBB01 + end + +AI_Risky_EffectsToEncourage:: @ 81DBB02 + .byte EFFECT_SLEEP + .byte EFFECT_EXPLOSION + .byte EFFECT_MIRROR_MOVE + .byte EFFECT_OHKO + .byte EFFECT_HIGH_CRITICAL + .byte EFFECT_CONFUSE + .byte EFFECT_METRONOME + .byte EFFECT_PSYWAVE + .byte EFFECT_COUNTER + .byte EFFECT_DESTINY_BOND + .byte EFFECT_SWAGGER + .byte EFFECT_ATTRACT + .byte EFFECT_PRESENT + .byte EFFECT_ALL_STATS_UP_HIT + .byte EFFECT_BELLY_DRUM + .byte EFFECT_MIRROR_COAT + .byte EFFECT_FOCUS_PUNCH + .byte EFFECT_REVENGE + .byte EFFECT_TEETER_DANCE + .byte -1 AI_PreferBatonPass:: @ 81DBB16 - count_alive_pokemon 1 - if_equal 0, AI_sub_81DBB3A - is_most_powerful_move - if_not_equal 0, AI_sub_81DBB3A - if_move_effect 1, 127, AI_sub_81DBB32 - if_random_less_than 80, AI_sub_81DBB01 - -AI_sub_81DBB32:: @ 81DBB32 - if_random_less_than 20, AI_sub_81DBB01 - score 3 - -AI_sub_81DBB3A:: @ 81DBB3A - end - + count_alive_pokemon AI_USER + if_equal 0, AI_PreferBatonPass_End + get_how_powerful_move_is + if_not_equal MOVE_POWER_DISCOURAGED, AI_PreferBatonPass_End + if_has_move_with_effect AI_USER, EFFECT_BATON_PASS, AI_PreferBatonPass_GoForBatonPass + if_random_less_than 80, AI_Risky_End + +@ Improvement in Emerald (several below) +AI_PreferBatonPass_GoForBatonPass:: @ 81DBB32 +@ if_move MOVE_SWORDS_DANCE, AI_PreferBatonPass2 +@ if_move MOVE_DRAGON_DANCE, AI_PreferBatonPass2 +@ if_move MOVE_CALM_MIND, AI_PreferBatonPass2 +@ if_effect EFFECT_PROTECT, AI_PreferBatonPass3 +@ if_move MOVE_BATON_PASS, AI_PreferBatonPass_EncourageIfHighStats + if_random_less_than 20, AI_Risky_End + score +3 + +@AI_PreferBatonPass2: +@ get_turn_count +@ if_equal 0, Score_Plus5 +@ if_hp_less_than AI_USER, 60, Score_Minus10 +@ goto Score_Plus1 +@ +@AI_PreferBatonPass3:: +@ get_last_used_move AI_USER +@ if_in_hwords AI_PreferBatonPass_ProtectMoves, Score_Minus2 +@ score +2 +@ end +@ +@AI_PreferBatonPass_ProtectMoves: +@ .2byte MOVE_PROTECT +@ .2byte MOVE_DETECT +@ .2byte -1 +@ +@AI_PreferBatonPass_EncourageIfHighStats: +@ get_turn_count +@ if_equal 0, Score_Minus2 +@ if_stat_level_more_than AI_USER, STAT_ATK, 8, Score_Plus3 +@ if_stat_level_more_than AI_USER, STAT_ATK, 7, Score_Plus2 +@ if_stat_level_more_than AI_USER, STAT_ATK, 6, Score_Plus1 +@ if_stat_level_more_than AI_USER, STAT_SPATK, 8, Score_Plus3 +@ if_stat_level_more_than AI_USER, STAT_SPATK, 7, Score_Plus2 +@ if_stat_level_more_than AI_USER, STAT_SPATK, 6, Score_Plus1 +@ end + +AI_PreferBatonPass_End:: @ 81DBB3A + end + +@ Empty. Expanded in Emerald AI_DoubleBattle:: @ 81DBB3B end AI_HPAware:: @ 81DBB3C - if_hp_more_than 1, 70, AI_sub_81DBB59 - if_hp_more_than 1, 30, AI_sub_81DBB68 - get_effect - if_in_bytes AI_bytes_81DBBFC, AI_sub_81DBB77 - jump AI_sub_81DBB7F - -AI_sub_81DBB59:: @ 81DBB59 - get_effect - if_in_bytes AI_bytes_81DBBC3, AI_sub_81DBB77 - jump AI_sub_81DBB7F - -AI_sub_81DBB68:: @ 81DBB68 - get_effect - if_in_bytes AI_bytes_81DBBD1, AI_sub_81DBB77 - jump AI_sub_81DBB7F - -AI_sub_81DBB77:: @ 81DBB77 - if_random_less_than 50, AI_sub_81DBB7F + if_hp_more_than AI_USER, 70, AI_HPAware_UserHasHighHP + if_hp_more_than AI_USER, 30, AI_HPAware_UserHasMediumHP + get_considered_move_effect + if_in_bytes AI_HPAware_DiscouragedEffectsWhenLowHP, AI_HPAware_TryToDiscourage + goto AI_HPAware_ConsiderTarget + +AI_HPAware_UserHasHighHP:: @ 81DBB59 + get_considered_move_effect + if_in_bytes AI_HPAware_DiscouragedEffectsWhenHighHP, AI_HPAware_TryToDiscourage + goto AI_HPAware_ConsiderTarget + +AI_HPAware_UserHasMediumHP:: @ 81DBB68 + get_considered_move_effect + if_in_bytes AI_HPAware_DiscouragedEffectsWhenMediumHP, AI_HPAware_TryToDiscourage + goto AI_HPAware_ConsiderTarget + +AI_HPAware_TryToDiscourage:: @ 81DBB77 + if_random_less_than 50, AI_HPAware_ConsiderTarget score -2 -AI_sub_81DBB7F:: @ 81DBB7F - if_hp_more_than 0, 70, AI_sub_81DBB9C - if_hp_more_than 0, 30, AI_sub_81DBBAB - get_effect - if_in_bytes AI_bytes_81DBC55, AI_sub_81DBBBA - jump AI_sub_81DBBC2 - -AI_sub_81DBB9C:: @ 81DBB9C - get_effect - if_in_bytes AI_bytes_81DBC2C, AI_sub_81DBBBA - jump AI_sub_81DBBC2 - -AI_sub_81DBBAB:: @ 81DBBAB - get_effect - if_in_bytes AI_bytes_81DBC2D, AI_sub_81DBBBA - jump AI_sub_81DBBC2 - -AI_sub_81DBBBA:: @ 81DBBBA - if_random_less_than 50, AI_sub_81DBBC2 +AI_HPAware_ConsiderTarget:: @ 81DBB7F + if_hp_more_than AI_TARGET, 70, AI_HPAware_TargetHasHighHP + if_hp_more_than AI_TARGET, 30, AI_HPAware_TargetHasMediumHP + get_considered_move_effect + if_in_bytes AI_HPAware_DiscouragedEffectsWhenTargetLowHP, AI_HPAware_TargetTryToDiscourage + goto AI_HPAware_End + +AI_HPAware_TargetHasHighHP:: @ 81DBB9C + get_considered_move_effect + if_in_bytes AI_HPAware_DiscouragedEffectsWhenTargetHighHP, AI_HPAware_TargetTryToDiscourage + goto AI_HPAware_End + +AI_HPAware_TargetHasMediumHP:: @ 81DBBAB + get_considered_move_effect + if_in_bytes AI_HPAware_DiscouragedEffectsWhenTargetMediumHP, AI_HPAware_TargetTryToDiscourage + goto AI_HPAware_End + +AI_HPAware_TargetTryToDiscourage:: @ 81DBBBA + if_random_less_than 50, AI_HPAware_End score -2 -AI_sub_81DBBC2:: @ 81DBBC2 - end - -AI_bytes_81DBBC3:: @ 81DBBC3 - .byte 7 - .byte 32 - .byte 37 - .byte 98 - .byte 99 - .byte 116 - .byte 132 - .byte 133 - .byte 134 - .byte 157 - .byte 168 - .byte 194 - .byte 204 - .byte 0xFF - -AI_bytes_81DBBD1:: @ 81DBBD1 - .byte 7 - .byte 10 - .byte 11 - .byte 12 - .byte 13 - .byte 14 - .byte 15 - .byte 16 - .byte 18 - .byte 19 - .byte 20 - .byte 21 - .byte 22 - .byte 23 - .byte 24 - .byte 26 - .byte 30 - .byte 35 - .byte 46 - .byte 47 - .byte 50 - .byte 51 - .byte 52 - .byte 53 - .byte 54 - .byte 55 - .byte 56 - .byte 58 - .byte 59 - .byte 60 - .byte 61 - .byte 62 - .byte 63 - .byte 64 - .byte 93 - .byte 124 - .byte 142 - .byte 205 - .byte 206 - .byte 208 - .byte 211 - .byte 212 - .byte 0xFF - -AI_bytes_81DBBFC:: @ 81DBBFC - .byte 10 - .byte 11 - .byte 12 - .byte 13 - .byte 14 - .byte 15 - .byte 16 - .byte 18 - .byte 19 - .byte 20 - .byte 21 - .byte 22 - .byte 23 - .byte 24 - .byte 26 - .byte 30 - .byte 35 - .byte 46 - .byte 47 - .byte 50 - .byte 51 - .byte 52 - .byte 53 - .byte 54 - .byte 55 - .byte 56 - .byte 58 - .byte 59 - .byte 60 - .byte 61 - .byte 62 - .byte 63 - .byte 64 - .byte 81 - .byte 93 - .byte 94 - .byte 124 - .byte 142 - .byte 143 - .byte 144 - .byte 151 - .byte 190 - .byte 205 - .byte 206 - .byte 208 - .byte 211 - .byte 212 - .byte 0xFF - -AI_bytes_81DBC2C:: @ 81DBC2C - .byte 0xFF - -AI_bytes_81DBC2D:: @ 81DBC2D - .byte 10 - .byte 11 - .byte 12 - .byte 13 - .byte 14 - .byte 15 - .byte 16 - .byte 18 - .byte 19 - .byte 20 - .byte 21 - .byte 22 - .byte 23 - .byte 24 - .byte 46 - .byte 47 - .byte 50 - .byte 51 - .byte 52 - .byte 53 - .byte 54 - .byte 55 - .byte 56 - .byte 58 - .byte 59 - .byte 60 - .byte 61 - .byte 62 - .byte 63 - .byte 64 - .byte 66 - .byte 91 - .byte 114 - .byte 124 - .byte 205 - .byte 206 - .byte 208 - .byte 211 - .byte 212 - .byte 0xFF - -AI_bytes_81DBC55:: @ 81DBC55 - .byte 1 - .byte 7 - .byte 10 - .byte 11 - .byte 12 - .byte 13 - .byte 14 - .byte 15 - .byte 16 - .byte 18 - .byte 19 - .byte 20 - .byte 21 - .byte 22 - .byte 23 - .byte 24 - .byte 26 - .byte 30 - .byte 33 - .byte 35 - .byte 38 - .byte 40 - .byte 40 - .byte 46 - .byte 47 - .byte 49 - .byte 50 - .byte 51 - .byte 52 - .byte 53 - .byte 54 - .byte 55 - .byte 56 - .byte 58 - .byte 59 - .byte 60 - .byte 61 - .byte 62 - .byte 63 - .byte 64 - .byte 66 - .byte 67 - .byte 91 - .byte 93 - .byte 94 - .byte 100 - .byte 114 - .byte 118 - .byte 119 - .byte 120 - .byte 124 - .byte 143 - .byte 144 - .byte 167 - .byte 205 - .byte 206 - .byte 208 - .byte 211 - .byte 212 - .byte 0xFF +AI_HPAware_End:: @ 81DBBC2 + end + +AI_HPAware_DiscouragedEffectsWhenHighHP:: @ 81DBBC3 + .byte EFFECT_EXPLOSION + .byte EFFECT_RESTORE_HP + .byte EFFECT_REST + .byte EFFECT_DESTINY_BOND + .byte EFFECT_FLAIL + .byte EFFECT_ENDURE + .byte EFFECT_MORNING_SUN + .byte EFFECT_SYNTHESIS + .byte EFFECT_MOONLIGHT + .byte EFFECT_SOFTBOILED + .byte EFFECT_MEMENTO + .byte EFFECT_GRUDGE + .byte EFFECT_OVERHEAT + .byte -1 + +AI_HPAware_DiscouragedEffectsWhenMediumHP:: @ 81DBBD1 + .byte EFFECT_EXPLOSION + .byte EFFECT_ATTACK_UP + .byte EFFECT_DEFENSE_UP + .byte EFFECT_SPEED_UP + .byte EFFECT_SPECIAL_ATTACK_UP + .byte EFFECT_SPECIAL_DEFENSE_UP + .byte EFFECT_ACCURACY_UP + .byte EFFECT_EVASION_UP + .byte EFFECT_ATTACK_DOWN + .byte EFFECT_DEFENSE_DOWN + .byte EFFECT_SPEED_DOWN + .byte EFFECT_SPECIAL_ATTACK_DOWN + .byte EFFECT_SPECIAL_DEFENSE_DOWN + .byte EFFECT_ACCURACY_DOWN + .byte EFFECT_EVASION_DOWN + .byte EFFECT_BIDE + .byte EFFECT_CONVERSION + .byte EFFECT_LIGHT_SCREEN + .byte EFFECT_MIST + .byte EFFECT_FOCUS_ENERGY + .byte EFFECT_ATTACK_UP_2 + .byte EFFECT_DEFENSE_UP_2 + .byte EFFECT_SPEED_UP_2 + .byte EFFECT_SPECIAL_ATTACK_UP_2 + .byte EFFECT_SPECIAL_DEFENSE_UP_2 + .byte EFFECT_ACCURACY_UP_2 + .byte EFFECT_EVASION_UP_2 + .byte EFFECT_ATTACK_DOWN_2 + .byte EFFECT_DEFENSE_DOWN_2 + .byte EFFECT_SPEED_DOWN_2 + .byte EFFECT_SPECIAL_ATTACK_DOWN_2 + .byte EFFECT_SPECIAL_DEFENSE_DOWN_2 + .byte EFFECT_ACCURACY_DOWN_2 + .byte EFFECT_EVASION_DOWN_2 + .byte EFFECT_CONVERSION_2 + .byte EFFECT_SAFEGUARD + .byte EFFECT_BELLY_DRUM + .byte EFFECT_TICKLE + .byte EFFECT_COSMIC_POWER + .byte EFFECT_BULK_UP + .byte EFFECT_CALM_MIND + .byte EFFECT_DRAGON_DANCE + .byte -1 + +AI_HPAware_DiscouragedEffectsWhenLowHP:: @ 81DBBFC + .byte EFFECT_ATTACK_UP + .byte EFFECT_DEFENSE_UP + .byte EFFECT_SPEED_UP + .byte EFFECT_SPECIAL_ATTACK_UP + .byte EFFECT_SPECIAL_DEFENSE_UP + .byte EFFECT_ACCURACY_UP + .byte EFFECT_EVASION_UP + .byte EFFECT_ATTACK_DOWN + .byte EFFECT_DEFENSE_DOWN + .byte EFFECT_SPEED_DOWN + .byte EFFECT_SPECIAL_ATTACK_DOWN + .byte EFFECT_SPECIAL_DEFENSE_DOWN + .byte EFFECT_ACCURACY_DOWN + .byte EFFECT_EVASION_DOWN + .byte EFFECT_BIDE + .byte EFFECT_CONVERSION + .byte EFFECT_LIGHT_SCREEN + .byte EFFECT_MIST + .byte EFFECT_FOCUS_ENERGY + .byte EFFECT_ATTACK_UP_2 + .byte EFFECT_DEFENSE_UP_2 + .byte EFFECT_SPEED_UP_2 + .byte EFFECT_SPECIAL_ATTACK_UP_2 + .byte EFFECT_SPECIAL_DEFENSE_UP_2 + .byte EFFECT_ACCURACY_UP_2 + .byte EFFECT_EVASION_UP_2 + .byte EFFECT_ATTACK_DOWN_2 + .byte EFFECT_DEFENSE_DOWN_2 + .byte EFFECT_SPEED_DOWN_2 + .byte EFFECT_SPECIAL_ATTACK_DOWN_2 + .byte EFFECT_SPECIAL_DEFENSE_DOWN_2 + .byte EFFECT_ACCURACY_DOWN_2 + .byte EFFECT_EVASION_DOWN_2 + .byte EFFECT_RAGE + .byte EFFECT_CONVERSION_2 + .byte EFFECT_LOCK_ON + .byte EFFECT_SAFEGUARD + .byte EFFECT_BELLY_DRUM + .byte EFFECT_PSYCH_UP + .byte EFFECT_MIRROR_COAT + .byte EFFECT_SOLARBEAM + .byte EFFECT_ERUPTION + .byte EFFECT_TICKLE + .byte EFFECT_COSMIC_POWER + .byte EFFECT_BULK_UP + .byte EFFECT_CALM_MIND + .byte EFFECT_DRAGON_DANCE + .byte -1 + +AI_HPAware_DiscouragedEffectsWhenTargetHighHP:: @ 81DBC2C + .byte -1 + +AI_HPAware_DiscouragedEffectsWhenTargetMediumHP:: @ 81DBC2D + .byte EFFECT_ATTACK_UP + .byte EFFECT_DEFENSE_UP + .byte EFFECT_SPEED_UP + .byte EFFECT_SPECIAL_ATTACK_UP + .byte EFFECT_SPECIAL_DEFENSE_UP + .byte EFFECT_ACCURACY_UP + .byte EFFECT_EVASION_UP + .byte EFFECT_ATTACK_DOWN + .byte EFFECT_DEFENSE_DOWN + .byte EFFECT_SPEED_DOWN + .byte EFFECT_SPECIAL_ATTACK_DOWN + .byte EFFECT_SPECIAL_DEFENSE_DOWN + .byte EFFECT_ACCURACY_DOWN + .byte EFFECT_EVASION_DOWN + .byte EFFECT_MIST + .byte EFFECT_FOCUS_ENERGY + .byte EFFECT_ATTACK_UP_2 + .byte EFFECT_DEFENSE_UP_2 + .byte EFFECT_SPEED_UP_2 + .byte EFFECT_SPECIAL_ATTACK_UP_2 + .byte EFFECT_SPECIAL_DEFENSE_UP_2 + .byte EFFECT_ACCURACY_UP_2 + .byte EFFECT_EVASION_UP_2 + .byte EFFECT_ATTACK_DOWN_2 + .byte EFFECT_DEFENSE_DOWN_2 + .byte EFFECT_SPEED_DOWN_2 + .byte EFFECT_SPECIAL_ATTACK_DOWN_2 + .byte EFFECT_SPECIAL_DEFENSE_DOWN_2 + .byte EFFECT_ACCURACY_DOWN_2 + .byte EFFECT_EVASION_DOWN_2 + .byte EFFECT_POISON + .byte EFFECT_PAIN_SPLIT + .byte EFFECT_PERISH_SONG + .byte EFFECT_SAFEGUARD + .byte EFFECT_TICKLE + .byte EFFECT_COSMIC_POWER + .byte EFFECT_BULK_UP + .byte EFFECT_CALM_MIND + .byte EFFECT_DRAGON_DANCE + .byte -1 + +AI_HPAware_DiscouragedEffectsWhenTargetLowHP:: @ 81DBC55 + .byte EFFECT_SLEEP + .byte EFFECT_EXPLOSION + .byte EFFECT_ATTACK_UP + .byte EFFECT_DEFENSE_UP + .byte EFFECT_SPEED_UP + .byte EFFECT_SPECIAL_ATTACK_UP + .byte EFFECT_SPECIAL_DEFENSE_UP + .byte EFFECT_ACCURACY_UP + .byte EFFECT_EVASION_UP + .byte EFFECT_ATTACK_DOWN + .byte EFFECT_DEFENSE_DOWN + .byte EFFECT_SPEED_DOWN + .byte EFFECT_SPECIAL_ATTACK_DOWN + .byte EFFECT_SPECIAL_DEFENSE_DOWN + .byte EFFECT_ACCURACY_DOWN + .byte EFFECT_EVASION_DOWN + .byte EFFECT_BIDE + .byte EFFECT_CONVERSION + .byte EFFECT_TOXIC + .byte EFFECT_LIGHT_SCREEN + .byte EFFECT_OHKO + .byte EFFECT_SUPER_FANG @ Maybe supposed to be EFFECT_RAZOR_WIND + .byte EFFECT_SUPER_FANG + .byte EFFECT_MIST + .byte EFFECT_FOCUS_ENERGY + .byte EFFECT_CONFUSE + .byte EFFECT_ATTACK_UP_2 + .byte EFFECT_DEFENSE_UP_2 + .byte EFFECT_SPEED_UP_2 + .byte EFFECT_SPECIAL_ATTACK_UP_2 + .byte EFFECT_SPECIAL_DEFENSE_UP_2 + .byte EFFECT_ACCURACY_UP_2 + .byte EFFECT_EVASION_UP_2 + .byte EFFECT_ATTACK_DOWN_2 + .byte EFFECT_DEFENSE_DOWN_2 + .byte EFFECT_SPEED_DOWN_2 + .byte EFFECT_SPECIAL_ATTACK_DOWN_2 + .byte EFFECT_SPECIAL_DEFENSE_DOWN_2 + .byte EFFECT_ACCURACY_DOWN_2 + .byte EFFECT_EVASION_DOWN_2 + .byte EFFECT_POISON + .byte EFFECT_PARALYZE + .byte EFFECT_PAIN_SPLIT + .byte EFFECT_CONVERSION_2 + .byte EFFECT_LOCK_ON + .byte EFFECT_SPITE + .byte EFFECT_PERISH_SONG + .byte EFFECT_SWAGGER + .byte EFFECT_FURY_CUTTER + .byte EFFECT_ATTRACT + .byte EFFECT_SAFEGUARD + .byte EFFECT_PSYCH_UP + .byte EFFECT_MIRROR_COAT + .byte EFFECT_WILL_O_WISP + .byte EFFECT_TICKLE + .byte EFFECT_COSMIC_POWER + .byte EFFECT_BULK_UP + .byte EFFECT_CALM_MIND + .byte EFFECT_DRAGON_DANCE + .byte -1 AI_Unknown:: @ 81DBC91 - if_not_effect -119, AI_sub_81DBCA7 - if_equal 0, AI_sub_81DBCA7 - is_first_turn 1 - if_equal 0, AI_sub_81DBCA7 - score 5 + if_not_effect EFFECT_SUNNY_DAY, AI_Unknown_End + if_equal 0, AI_Unknown_End + is_first_turn_for AI_USER + if_equal 0, AI_Unknown_End + score +5 -AI_sub_81DBCA7:: @ 81DBCA7 +AI_Unknown_End:: @ 81DBCA7 end AI_Roaming:: @ 81DBCA8 - if_status2 1, 57344, AI_sub_81DBCD5 - if_status2 1, 67108864, AI_sub_81DBCD5 - get_ability 0 - if_equal 23, AI_sub_81DBCD5 - get_ability 1 - if_equal 26, AI_sub_81DBCD4 - get_ability 0 - if_equal 71, AI_sub_81DBCD5 - -AI_sub_81DBCD4:: @ 81DBCD4 + if_status2 AI_USER, STATUS2_WRAPPED, AI_Roaming_End + if_status2 AI_USER, STATUS2_ESCAPE_PREVENTION, AI_Roaming_End + get_ability AI_TARGET + if_equal ABILITY_SHADOW_TAG, AI_Roaming_End + get_ability AI_USER + if_equal ABILITY_LEVITATE, AI_Roaming_Flee + get_ability AI_TARGET + if_equal ABILITY_ARENA_TRAP, AI_Roaming_End + +AI_Roaming_Flee:: @ 81DBCD4 flee -AI_sub_81DBCD5:: @ 81DBCD5 +AI_Roaming_End:: @ 81DBCD5 end AI_Safari:: @ 81DBCD6 - if_random_100 AI_sub_81DBCDC + if_random_safari_flee AI_Safari_Flee watch -AI_sub_81DBCDC:: @ 81DBCDC +AI_Safari_Flee:: @ 81DBCDC flee +@ From Hoenns Poochyena fight (Zigzagoon in Emerald) AI_FirstBattle:: @ 81DBCDD - if_hp_equal 0, 20, AI_sub_81DBCEC - if_hp_less_than 0, 20, AI_sub_81DBCEC + if_hp_equal AI_TARGET, 20, AI_FirstBattle_Flee + if_hp_less_than AI_TARGET, 20, AI_FirstBattle_Flee end -AI_sub_81DBCEC:: @ 81DBCEC +AI_FirstBattle_Flee:: @ 81DBCEC flee AI_Ret:: @ 81DBCED diff --git a/include/constants/battle.h b/include/constants/battle.h index 2da89d815..c273b9a50 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -61,8 +61,8 @@ #define BATTLE_TYPE_REGI 0x4000 #define BATTLE_TYPE_GHOST 0x8000 #define BATTLE_TYPE_POKEDUDE 0x10000 -#define BATTLE_TYPE_PALACE 0x20000 -#define BATTLE_TYPE_ARENA 0x40000 +#define BATTLE_TYPE_PALACE 0x20000 // TODO: Update name +#define BATTLE_TYPE_ARENA 0x40000 // TOOD: Update name #define BATTLE_TYPE_TRAINER_TOWER 0x80000 #define BATTLE_TYPE_PIKE 0x100000 #define BATTLE_TYPE_PYRAMID 0x200000 diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index f55661b91..d23648f39 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -23,7 +23,7 @@ #define AI_EFFECTIVENESS_x0 0 // ai weather -#define AI_WEATHER_SUNNY 0 +#define AI_WEATHER_SUN 0 #define AI_WEATHER_RAIN 1 #define AI_WEATHER_SANDSTORM 2 #define AI_WEATHER_HAIL 3 @@ -35,8 +35,8 @@ // script's table id to bit #define AI_SCRIPT_CHECK_BAD_MOVE (1 << 0) -#define AI_SCRIPT_TRY_TO_FAINT (1 << 1) -#define AI_SCRIPT_CHECK_VIABILITY (1 << 2) +#define AI_SCRIPT_CHECK_VIABILITY (1 << 1) +#define AI_SCRIPT_TRY_TO_FAINT (1 << 2) #define AI_SCRIPT_SETUP_FIRST_TURN (1 << 3) #define AI_SCRIPT_RISKY (1 << 4) #define AI_SCRIPT_PREFER_STRONGEST_MOVE (1 << 5) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index c6fc55003..e394a8fb4 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -91,4 +91,8 @@ #define PLAYER_HAS_ONE_MON 0x1 #define PLAYER_HAS_ONE_USABLE_MON 0x2 +#define MON_MALE 0x00 +#define MON_FEMALE 0xFE +#define MON_GENDERLESS 0xFF + #endif // GUARD_CONSTANTS_POKEMON_H diff --git a/include/pokemon.h b/include/pokemon.h index ae909018c..54ea44efd 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -3,6 +3,7 @@ #include "global.h" #include "sprite.h" +#include "constants/pokemon.h" #define MON_DATA_PERSONALITY 0 #define MON_DATA_OT_ID 1 @@ -104,10 +105,6 @@ #define MON_GIVEN_TO_PC 0x1 #define MON_CANT_GIVE 0x2 -#define MON_MALE 0x00 -#define MON_FEMALE 0xFE -#define MON_GENDERLESS 0xFF - #define FRIENDSHIP_EVENT_GROW_LEVEL 0x0 #define FRIENDSHIP_EVENT_VITAMIN 0x1 #define FRIENDSHIP_EVENT_BATTLE_ITEM 0x2 @@ -145,25 +142,6 @@ #define UNOWN_FORM_COUNT 28 #define MAX_MON_LEVEL 100 -enum -{ - EGG_GROUP_NONE, - EGG_GROUP_MONSTER, - EGG_GROUP_WATER_1, - EGG_GROUP_BUG, - EGG_GROUP_FLYING, - EGG_GROUP_FIELD, - EGG_GROUP_FAIRY, - EGG_GROUP_GRASS, - EGG_GROUP_HUMAN_LIKE, - EGG_GROUP_WATER_3, - EGG_GROUP_MINERAL, - EGG_GROUP_AMORPHOUS, - EGG_GROUP_WATER_2, - EGG_GROUP_DITTO, - EGG_GROUP_DRAGON, - EGG_GROUP_UNDISCOVERED -}; struct PokemonSubstruct0 { @@ -369,16 +347,6 @@ enum STAT_STAGE_EVASION, // 7 }; -enum -{ - STAT_HP, // 0 - STAT_ATK, // 1 - STAT_DEF, // 2 - STAT_SPD, // 3 - STAT_SPATK, // 4 - STAT_SPDEF, // 5 -}; - struct BaseStats { /* 0x00 */ u8 baseHP; diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index d988fd7b4..8bd90ef2d 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -44,100 +44,100 @@ AI scripts. static EWRAM_DATA const u8 *sAIScriptPtr = NULL; extern u8 *gBattleAI_ScriptsTable[]; -static void BattleAICmd_if_random_less_than(void); -static void BattleAICmd_if_random_greater_than(void); -static void BattleAICmd_if_random_equal(void); -static void BattleAICmd_if_random_not_equal(void); -static void BattleAICmd_score(void); -static void BattleAICmd_if_hp_less_than(void); -static void BattleAICmd_if_hp_more_than(void); -static void BattleAICmd_if_hp_equal(void); -static void BattleAICmd_if_hp_not_equal(void); -static void BattleAICmd_if_status(void); -static void BattleAICmd_if_not_status(void); -static void BattleAICmd_if_status2(void); -static void BattleAICmd_if_not_status2(void); -static void BattleAICmd_if_status3(void); -static void BattleAICmd_if_not_status3(void); -static void BattleAICmd_if_status4(void); -static void BattleAICmd_if_not_status4(void); -static void BattleAICmd_if_less_than(void); -static void BattleAICmd_if_more_than(void); -static void BattleAICmd_if_equal(void); -static void BattleAICmd_if_not_equal(void); -static void BattleAICmd_if_less_than_32(void); -static void BattleAICmd_if_more_than_32(void); -static void BattleAICmd_if_equal_32(void); -static void BattleAICmd_if_not_equal_32(void); -static void BattleAICmd_if_move(void); -static void BattleAICmd_if_not_move(void); -static void BattleAICmd_if_in_bytes(void); -static void BattleAICmd_if_not_in_bytes(void); -static void BattleAICmd_if_in_words(void); -static void BattleAICmd_if_not_in_words(void); -static void BattleAICmd_if_user_can_damage(void); -static void BattleAICmd_if_user_cant_damage(void); -static void BattleAICmd_get_turn_count(void); -static void BattleAICmd_get_type(void); -static void BattleAICmd_get_move_power(void); -static void BattleAICmd_is_most_powerful_move(void); -static void BattleAICmd_get_move(void); -static void BattleAICmd_if_arg_equal(void); -static void BattleAICmd_if_arg_not_equal(void); -static void BattleAICmd_if_would_go_first(void); -static void BattleAICmd_if_would_not_go_first(void); -static void BattleAICmd_nullsub_2A(void); -static void BattleAICmd_nullsub_2B(void); -static void BattleAICmd_count_alive_pokemon(void); -static void BattleAICmd_get_considered_move(void); -static void BattleAICmd_get_considered_move_effect(void); -static void BattleAICmd_get_ability(void); -static void BattleAICmd_get_highest_possible_damage(void); -static void BattleAICmd_if_type_effectiveness(void); -static void BattleAICmd_nullsub_32(void); -static void BattleAICmd_nullsub_33(void); -static void BattleAICmd_if_status_in_party(void); -static void BattleAICmd_if_status_not_in_party(void); -static void BattleAICmd_get_weather(void); -static void BattleAICmd_if_effect(void); -static void BattleAICmd_if_not_effect(void); -static void BattleAICmd_if_stat_level_less_than(void); -static void BattleAICmd_if_stat_level_more_than(void); -static void BattleAICmd_if_stat_level_equal(void); -static void BattleAICmd_if_stat_level_not_equal(void); -static void BattleAICmd_if_can_faint(void); -static void BattleAICmd_if_cant_faint(void); -static void BattleAICmd_if_has_move(void); -static void BattleAICmd_if_dont_have_move(void); -static void BattleAICmd_if_move_effect(void); -static void BattleAICmd_if_not_move_effect(void); -static void BattleAICmd_if_last_move_did_damage(void); -static void BattleAICmd_if_encored(void); -static void BattleAICmd_flee(void); -static void BattleAICmd_frlg_safari(void); -static void BattleAICmd_watch(void); -static void BattleAICmd_get_hold_effect(void); -static void BattleAICmd_get_gender(void); -static void BattleAICmd_is_first_turn(void); -static void BattleAICmd_get_stockpile_count(void); -static void BattleAICmd_is_double_battle(void); -static void BattleAICmd_get_used_held_item(void); -static void BattleAICmd_get_move_type_from_result(void); -static void BattleAICmd_get_move_power_from_result(void); -static void BattleAICmd_get_move_effect_from_result(void); -static void BattleAICmd_get_protect_count(void); -static void BattleAICmd_nullsub_52(void); -static void BattleAICmd_nullsub_53(void); -static void BattleAICmd_nullsub_54(void); -static void BattleAICmd_nullsub_55(void); -static void BattleAICmd_nullsub_56(void); -static void BattleAICmd_nullsub_57(void); -static void BattleAICmd_call(void); -static void BattleAICmd_jump(void); -static void BattleAICmd_end(void); -static void BattleAICmd_if_level_compare(void); -static void BattleAICmd_if_taunted(void); -static void BattleAICmd_if_not_taunted(void); +static void Cmd_if_random_less_than(void); +static void Cmd_if_random_greater_than(void); +static void Cmd_if_random_equal(void); +static void Cmd_if_random_not_equal(void); +static void Cmd_score(void); +static void Cmd_if_hp_less_than(void); +static void Cmd_if_hp_more_than(void); +static void Cmd_if_hp_equal(void); +static void Cmd_if_hp_not_equal(void); +static void Cmd_if_status(void); +static void Cmd_if_not_status(void); +static void Cmd_if_status2(void); +static void Cmd_if_not_status2(void); +static void Cmd_if_status3(void); +static void Cmd_if_not_status3(void); +static void Cmd_if_side_affecting(void); +static void Cmd_if_not_side_affecting(void); +static void Cmd_if_less_than(void); +static void Cmd_if_more_than(void); +static void Cmd_if_equal(void); +static void Cmd_if_not_equal(void); +static void Cmd_if_less_than_ptr(void); +static void Cmd_if_more_than_ptr(void); +static void Cmd_if_equal_ptr(void); +static void Cmd_if_not_equal_ptr(void); +static void Cmd_if_move(void); +static void Cmd_if_not_move(void); +static void Cmd_if_in_bytes(void); +static void Cmd_if_not_in_bytes(void); +static void Cmd_if_in_hwords(void); +static void Cmd_if_not_in_hwords(void); +static void Cmd_if_user_has_attacking_move(void); +static void Cmd_if_user_has_no_attacking_moves(void); +static void Cmd_get_turn_count(void); +static void Cmd_get_type(void); +static void Cmd_get_considered_move_power(void); +static void Cmd_get_how_powerful_move_is(void); +static void Cmd_get_last_used_battler_move(void); +static void Cmd_if_equal_(void); +static void Cmd_if_not_equal_(void); +static void Cmd_if_would_go_first(void); +static void Cmd_if_would_not_go_first(void); +static void Cmd_nullsub_2A(void); +static void Cmd_nullsub_2B(void); +static void Cmd_count_alive_pokemon(void); +static void Cmd_get_considered_move(void); +static void Cmd_get_considered_move_effect(void); +static void Cmd_get_ability(void); +static void Cmd_get_highest_type_effectiveness(void); +static void Cmd_if_type_effectiveness(void); +static void Cmd_nullsub_32(void); +static void Cmd_nullsub_33(void); +static void Cmd_if_status_in_party(void); +static void Cmd_if_status_not_in_party(void); +static void Cmd_get_weather(void); +static void Cmd_if_effect(void); +static void Cmd_if_not_effect(void); +static void Cmd_if_stat_level_less_than(void); +static void Cmd_if_stat_level_more_than(void); +static void Cmd_if_stat_level_equal(void); +static void Cmd_if_stat_level_not_equal(void); +static void Cmd_if_can_faint(void); +static void Cmd_if_cant_faint(void); +static void Cmd_if_has_move(void); +static void Cmd_if_doesnt_have_move(void); +static void Cmd_if_has_move_with_effect(void); +static void Cmd_if_doesnt_have_move_with_effect(void); +static void Cmd_if_any_move_disabled_or_encored(void); +static void Cmd_if_curr_move_disabled_or_encored(void); +static void Cmd_flee(void); +static void Cmd_if_random_safari_flee(void); +static void Cmd_watch(void); +static void Cmd_get_hold_effect(void); +static void Cmd_get_gender(void); +static void Cmd_is_first_turn_for(void); +static void Cmd_get_stockpile_count(void); +static void Cmd_is_double_battle(void); +static void Cmd_get_used_held_item(void); +static void Cmd_get_move_type_from_result(void); +static void Cmd_get_move_power_from_result(void); +static void Cmd_get_move_effect_from_result(void); +static void Cmd_get_protect_count(void); +static void Cmd_nullsub_52(void); +static void Cmd_nullsub_53(void); +static void Cmd_nullsub_54(void); +static void Cmd_nullsub_55(void); +static void Cmd_nullsub_56(void); +static void Cmd_nullsub_57(void); +static void Cmd_call(void); +static void Cmd_goto(void); +static void Cmd_end(void); +static void Cmd_if_level_compare(void); +static void Cmd_if_target_taunted(void); +static void Cmd_if_target_not_taunted(void); static void RecordLastUsedMoveByTarget(void); static void BattleAI_DoAIProcessing(void); @@ -148,100 +148,100 @@ typedef void (*BattleAICmdFunc)(void); static const BattleAICmdFunc sBattleAICmdTable[] = { - BattleAICmd_if_random_less_than, // 0x0 - BattleAICmd_if_random_greater_than, // 0x1 - BattleAICmd_if_random_equal, // 0x2 - BattleAICmd_if_random_not_equal, // 0x3 - BattleAICmd_score, // 0x4 - BattleAICmd_if_hp_less_than, // 0x5 - BattleAICmd_if_hp_more_than, // 0x6 - BattleAICmd_if_hp_equal, // 0x7 - BattleAICmd_if_hp_not_equal, // 0x8 - BattleAICmd_if_status, // 0x9 - BattleAICmd_if_not_status, // 0xA - BattleAICmd_if_status2, // 0xB - BattleAICmd_if_not_status2, // 0xC - BattleAICmd_if_status3, // 0xD - BattleAICmd_if_not_status3, // 0xE - BattleAICmd_if_status4, // 0xF - BattleAICmd_if_not_status4, // 0x10 - BattleAICmd_if_less_than, // 0x11 - BattleAICmd_if_more_than, // 0x12 - BattleAICmd_if_equal, // 0x13 - BattleAICmd_if_not_equal, // 0x14 - BattleAICmd_if_less_than_32, // 0x15 - BattleAICmd_if_more_than_32, // 0x16 - BattleAICmd_if_equal_32, // 0x17 - BattleAICmd_if_not_equal_32, // 0x18 - BattleAICmd_if_move, // 0x19 - BattleAICmd_if_not_move, // 0x1A - BattleAICmd_if_in_bytes, // 0x1B - BattleAICmd_if_not_in_bytes, // 0x1C - BattleAICmd_if_in_words, // 0x1D - BattleAICmd_if_not_in_words, // 0x1E - BattleAICmd_if_user_can_damage, // 0x1F - BattleAICmd_if_user_cant_damage, // 0x20 - BattleAICmd_get_turn_count, // 0x21 - BattleAICmd_get_type, // 0x22 - BattleAICmd_get_move_power, // 0x23 - BattleAICmd_is_most_powerful_move, // 0x24 - BattleAICmd_get_move, // 0x25 - BattleAICmd_if_arg_equal, // 0x26 - BattleAICmd_if_arg_not_equal, // 0x27 - BattleAICmd_if_would_go_first, // 0x28 - BattleAICmd_if_would_not_go_first, // 0x29 - BattleAICmd_nullsub_2A, // 0x2A - BattleAICmd_nullsub_2B, // 0x2B - BattleAICmd_count_alive_pokemon, // 0x2C - BattleAICmd_get_considered_move, // 0x2D - BattleAICmd_get_considered_move_effect, // 0x2E - BattleAICmd_get_ability, // 0x2F - BattleAICmd_get_highest_possible_damage, // 0x30 - BattleAICmd_if_type_effectiveness, // 0x31 - BattleAICmd_nullsub_32, // 0x32 - BattleAICmd_nullsub_33, // 0x33 - BattleAICmd_if_status_in_party, // 0x34 - BattleAICmd_if_status_not_in_party, // 0x35 - BattleAICmd_get_weather, // 0x36 - BattleAICmd_if_effect, // 0x37 - BattleAICmd_if_not_effect, // 0x38 - BattleAICmd_if_stat_level_less_than, // 0x39 - BattleAICmd_if_stat_level_more_than, // 0x3A - BattleAICmd_if_stat_level_equal, // 0x3B - BattleAICmd_if_stat_level_not_equal, // 0x3C - BattleAICmd_if_can_faint, // 0x3D - BattleAICmd_if_cant_faint, // 0x3E - BattleAICmd_if_has_move, // 0x3F - BattleAICmd_if_dont_have_move, // 0x40 - BattleAICmd_if_move_effect, // 0x41 - BattleAICmd_if_not_move_effect, // 0x42 - BattleAICmd_if_last_move_did_damage, // 0x43 - BattleAICmd_if_encored, // 0x44 - BattleAICmd_flee, // 0x45 - BattleAICmd_frlg_safari, // 0x46 - BattleAICmd_watch, // 0x47 - BattleAICmd_get_hold_effect, // 0x48 - BattleAICmd_get_gender, // 0x49 - BattleAICmd_is_first_turn, // 0x4A - BattleAICmd_get_stockpile_count, // 0x4B - BattleAICmd_is_double_battle, // 0x4C - BattleAICmd_get_used_held_item, // 0x4D - BattleAICmd_get_move_type_from_result, // 0x4E - BattleAICmd_get_move_power_from_result, // 0x4F - BattleAICmd_get_move_effect_from_result, // 0x50 - BattleAICmd_get_protect_count, // 0x51 - BattleAICmd_nullsub_52, // 0x52 - BattleAICmd_nullsub_53, // 0x53 - BattleAICmd_nullsub_54, // 0x54 - BattleAICmd_nullsub_55, // 0x55 - BattleAICmd_nullsub_56, // 0x56 - BattleAICmd_nullsub_57, // 0x57 - BattleAICmd_call, // 0x58 - BattleAICmd_jump, // 0x59 - BattleAICmd_end, // 0x5A - BattleAICmd_if_level_compare, // 0x5B - BattleAICmd_if_taunted, // 0x5C - BattleAICmd_if_not_taunted, // 0x5D + Cmd_if_random_less_than, // 0x0 + Cmd_if_random_greater_than, // 0x1 + Cmd_if_random_equal, // 0x2 + Cmd_if_random_not_equal, // 0x3 + Cmd_score, // 0x4 + Cmd_if_hp_less_than, // 0x5 + Cmd_if_hp_more_than, // 0x6 + Cmd_if_hp_equal, // 0x7 + Cmd_if_hp_not_equal, // 0x8 + Cmd_if_status, // 0x9 + Cmd_if_not_status, // 0xA + Cmd_if_status2, // 0xB + Cmd_if_not_status2, // 0xC + Cmd_if_status3, // 0xD + Cmd_if_not_status3, // 0xE + Cmd_if_side_affecting, // 0xF + Cmd_if_not_side_affecting, // 0x10 + Cmd_if_less_than, // 0x11 + Cmd_if_more_than, // 0x12 + Cmd_if_equal, // 0x13 + Cmd_if_not_equal, // 0x14 + Cmd_if_less_than_ptr, // 0x15 + Cmd_if_more_than_ptr, // 0x16 + Cmd_if_equal_ptr, // 0x17 + Cmd_if_not_equal_ptr, // 0x18 + Cmd_if_move, // 0x19 + Cmd_if_not_move, // 0x1A + Cmd_if_in_bytes, // 0x1B + Cmd_if_not_in_bytes, // 0x1C + Cmd_if_in_hwords, // 0x1D + Cmd_if_not_in_hwords, // 0x1E + Cmd_if_user_has_attacking_move, // 0x1F + Cmd_if_user_has_no_attacking_moves, // 0x20 + Cmd_get_turn_count, // 0x21 + Cmd_get_type, // 0x22 + Cmd_get_considered_move_power, // 0x23 + Cmd_get_how_powerful_move_is, // 0x24 + Cmd_get_last_used_battler_move, // 0x25 + Cmd_if_equal_, // 0x26 + Cmd_if_not_equal_, // 0x27 + Cmd_if_would_go_first, // 0x28 + Cmd_if_would_not_go_first, // 0x29 + Cmd_nullsub_2A, // 0x2A + Cmd_nullsub_2B, // 0x2B + Cmd_count_alive_pokemon, // 0x2C + Cmd_get_considered_move, // 0x2D + Cmd_get_considered_move_effect, // 0x2E + Cmd_get_ability, // 0x2F + Cmd_get_highest_type_effectiveness, // 0x30 + Cmd_if_type_effectiveness, // 0x31 + Cmd_nullsub_32, // 0x32 + Cmd_nullsub_33, // 0x33 + Cmd_if_status_in_party, // 0x34 + Cmd_if_status_not_in_party, // 0x35 + Cmd_get_weather, // 0x36 + Cmd_if_effect, // 0x37 + Cmd_if_not_effect, // 0x38 + Cmd_if_stat_level_less_than, // 0x39 + Cmd_if_stat_level_more_than, // 0x3A + Cmd_if_stat_level_equal, // 0x3B + Cmd_if_stat_level_not_equal, // 0x3C + Cmd_if_can_faint, // 0x3D + Cmd_if_cant_faint, // 0x3E + Cmd_if_has_move, // 0x3F + Cmd_if_doesnt_have_move, // 0x40 + Cmd_if_has_move_with_effect, // 0x41 + Cmd_if_doesnt_have_move_with_effect, // 0x42 + Cmd_if_any_move_disabled_or_encored, // 0x43 + Cmd_if_curr_move_disabled_or_encored, // 0x44 + Cmd_flee, // 0x45 + Cmd_if_random_safari_flee, // 0x46 + Cmd_watch, // 0x47 + Cmd_get_hold_effect, // 0x48 + Cmd_get_gender, // 0x49 + Cmd_is_first_turn_for, // 0x4A + Cmd_get_stockpile_count, // 0x4B + Cmd_is_double_battle, // 0x4C + Cmd_get_used_held_item, // 0x4D + Cmd_get_move_type_from_result, // 0x4E + Cmd_get_move_power_from_result, // 0x4F + Cmd_get_move_effect_from_result, // 0x50 + Cmd_get_protect_count, // 0x51 + Cmd_nullsub_52, // 0x52 + Cmd_nullsub_53, // 0x53 + Cmd_nullsub_54, // 0x54 + Cmd_nullsub_55, // 0x55 + Cmd_nullsub_56, // 0x56 + Cmd_nullsub_57, // 0x57 + Cmd_call, // 0x58 + Cmd_goto, // 0x59 + Cmd_end, // 0x5A + Cmd_if_level_compare, // 0x5B + Cmd_if_target_taunted, // 0x5C + Cmd_if_target_not_taunted, // 0x5D }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -275,7 +275,7 @@ void BattleAI_HandleItemUseBeforeAISetup(void) && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_SAFARI | BATTLE_TYPE_LINK)) ) { - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_TRAINER_ITEMS; i++) { if (gTrainers[gTrainerBattleOpponent_A].items[i] != 0) { @@ -298,13 +298,13 @@ void BattleAI_SetupAIData(void) for (i = 0; i < sizeof(struct AI_ThinkingStruct); i++) data[i] = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) AI_THINKING_STRUCT->score[i] = 100; moveLimitations = CheckMoveLimitations(gActiveBattler, 0, 0xFF); // Ignore moves that aren't possible to use. - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBitTable[i] & moveLimitations) AI_THINKING_STRUCT->score[i] = 0; @@ -331,32 +331,32 @@ void BattleAI_SetupAIData(void) // Choose proper trainer ai scripts. // Fire Red, why all the returns?!? - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) // _080C6E84 + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) { AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_SAFARI; return; } - else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) // _080C6EAC + else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) { AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_ROAMING; return; } - else if (!(gBattleTypeFlags & (0x80900)) && (gTrainerBattleOpponent_A != 0x400)) // _080C6ECC + else if (!(gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER)) && (gTrainerBattleOpponent_A != SECRET_BASE_OPPONENT)) { - if (gBattleTypeFlags & (0x80 << 10)) + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - AI_THINKING_STRUCT->aiFlags = 1; + AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_CHECK_BAD_MOVE; return; } - else if (gBattleTypeFlags & (0x80 << 11)) + else if (gBattleTypeFlags & BATTLE_TYPE_ARENA) { - AI_THINKING_STRUCT->aiFlags = 7; + AI_THINKING_STRUCT->aiFlags = (AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY); return; } } else { - AI_THINKING_STRUCT->aiFlags = 7; + AI_THINKING_STRUCT->aiFlags = (AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY); return; } AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags; @@ -383,10 +383,10 @@ u8 BattleAI_ChooseMoveOrAction(void) } // special flee or watch cases for safari. - if (AI_THINKING_STRUCT->aiAction & (AI_ACTION_FLEE)) // flee - return 4; - if (AI_THINKING_STRUCT->aiAction & (AI_ACTION_WATCH)) // watch - return 5; + if (AI_THINKING_STRUCT->aiAction & AI_ACTION_FLEE) + return AI_CHOICE_FLEE; + if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH) + return AI_CHOICE_WATCH; numOfBestMoves = 1; currentMoveArray[0] = AI_THINKING_STRUCT->score[0]; @@ -416,13 +416,14 @@ static void BattleAI_DoAIProcessing(void) { switch (AI_THINKING_STRUCT->aiState) { - case AIState_DoNotProcess: //Needed to match. + case AIState_DoNotProcess: // Needed to match. break; case AIState_SettingUp: - sAIScriptPtr = gBattleAI_ScriptsTable[AI_THINKING_STRUCT->aiLogicId]; // set the AI ptr. + sAIScriptPtr = gBattleAI_ScriptsTable[AI_THINKING_STRUCT->aiLogicId]; + if (gBattleMons[gBattlerAttacker].pp[AI_THINKING_STRUCT->movesetIndex] == 0) { - AI_THINKING_STRUCT->moveConsidered = 0; // don't consider a move you have 0 PP for, idiot. + AI_THINKING_STRUCT->moveConsidered = 0; // Don't consider moves with no PP } else { @@ -432,15 +433,18 @@ static void BattleAI_DoAIProcessing(void) break; case AIState_Processing: if (AI_THINKING_STRUCT->moveConsidered != 0) - sBattleAICmdTable[*sAIScriptPtr](); // run AI command. + { + sBattleAICmdTable[*sAIScriptPtr](); // Run AI command. + } else { - AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; // definitely do not consider any move that has 0 PP. + AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE; } if (AI_THINKING_STRUCT->aiAction & AI_ACTION_DONE) { AI_THINKING_STRUCT->movesetIndex++; + if (AI_THINKING_STRUCT->movesetIndex < MAX_MON_MOVES && (AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK) == 0) AI_THINKING_STRUCT->aiState = AIState_SettingUp; // as long as their are more moves to process, keep setting this to setup state. else @@ -479,16 +483,16 @@ static void ClearBattlerMoveHistory(u8 battlerId) void RecordAbilityBattle(u8 battlerId, u8 abilityId) { if (GetBattlerSide(battlerId) == 0) - BATTLE_HISTORY->abilities[GetBattlerPosition(battlerId) & 1] = abilityId; + BATTLE_HISTORY->abilities[GET_BATTLER_SIDE(battlerId)] = abilityId; } void RecordItemEffectBattle(u8 battlerId, u8 itemEffect) { if (GetBattlerSide(battlerId) == 0) - BATTLE_HISTORY->itemEffects[GetBattlerPosition(battlerId) & 1] = itemEffect; + BATTLE_HISTORY->itemEffects[GET_BATTLER_SIDE(battlerId)] = itemEffect; } -static void BattleAICmd_if_random_less_than(void) +static void Cmd_if_random_less_than(void) { if (Random() % 256 < sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -496,7 +500,7 @@ static void BattleAICmd_if_random_less_than(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_random_greater_than(void) +static void Cmd_if_random_greater_than(void) { if (Random() % 256 > sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -504,7 +508,7 @@ static void BattleAICmd_if_random_greater_than(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_random_equal(void) +static void Cmd_if_random_equal(void) { if (Random() % 256 == sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -512,7 +516,7 @@ static void BattleAICmd_if_random_equal(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_random_not_equal(void) +static void Cmd_if_random_not_equal(void) { if (Random() % 256 != sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -520,7 +524,7 @@ static void BattleAICmd_if_random_not_equal(void) sAIScriptPtr += 6; } -static void BattleAICmd_score(void) +static void Cmd_score(void) { AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] += sAIScriptPtr[1]; // add the result to the array of the move consider's score. @@ -530,218 +534,213 @@ static void BattleAICmd_score(void) sAIScriptPtr += 2; // AI return. } -enum { - TARGET, - USER -}; - -static void BattleAICmd_if_hp_less_than(void) +static void Cmd_if_hp_less_than(void) { - u16 index; + u16 battlerId; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) < sAIScriptPtr[2]) + if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) < sAIScriptPtr[2]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; } -static void BattleAICmd_if_hp_more_than(void) +static void Cmd_if_hp_more_than(void) { - u16 index; + u16 battlerId; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) > sAIScriptPtr[2]) + if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) > sAIScriptPtr[2]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; } -static void BattleAICmd_if_hp_equal(void) +static void Cmd_if_hp_equal(void) { - u16 index; + u16 battlerId; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) == sAIScriptPtr[2]) + if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) == sAIScriptPtr[2]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; } -static void BattleAICmd_if_hp_not_equal(void) +static void Cmd_if_hp_not_equal(void) { - u16 index; + u16 battlerId; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) != sAIScriptPtr[2]) + if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) != sAIScriptPtr[2]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); else sAIScriptPtr += 7; } -static void BattleAICmd_if_status(void) +static void Cmd_if_status(void) { - u16 index; - u32 arg; + u16 battlerId; + u32 status; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - arg = T1_READ_32(sAIScriptPtr + 2); + status = T1_READ_32(sAIScriptPtr + 2); - if ((gBattleMons[index].status1 & arg) != 0) + if (gBattleMons[battlerId].status1 & status) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } -static void BattleAICmd_if_not_status(void) +static void Cmd_if_not_status(void) { - u16 index; - u32 arg; + u16 battlerId; + u32 status; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - arg = T1_READ_32(sAIScriptPtr + 2); + status = T1_READ_32(sAIScriptPtr + 2); - if ((gBattleMons[index].status1 & arg) == 0) + if (!(gBattleMons[battlerId].status1 & status)) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } -static void BattleAICmd_if_status2(void) +static void Cmd_if_status2(void) { - u16 index; - u32 arg; + u16 battlerId; + u32 status; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - arg = T1_READ_32(sAIScriptPtr + 2); + status = T1_READ_32(sAIScriptPtr + 2); - if ((gBattleMons[index].status2 & arg) != 0) + if ((gBattleMons[battlerId].status2 & status)) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } -static void BattleAICmd_if_not_status2(void) +static void Cmd_if_not_status2(void) { - u16 index; - u32 arg; + u16 battlerId; + u32 status; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - arg = T1_READ_32(sAIScriptPtr + 2); + status = T1_READ_32(sAIScriptPtr + 2); - if ((gBattleMons[index].status2 & arg) == 0) + if (!(gBattleMons[battlerId].status2 & status)) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } -static void BattleAICmd_if_status3(void) +static void Cmd_if_status3(void) { - u16 index; - u32 arg; + u16 battlerId; + u32 status; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - arg = T1_READ_32(sAIScriptPtr + 2); + status = T1_READ_32(sAIScriptPtr + 2); - if ((gStatuses3[index] & arg) != 0) + if (gStatuses3[battlerId] & status) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } -static void BattleAICmd_if_not_status3(void) +static void Cmd_if_not_status3(void) { - u16 index; - u32 arg; + u16 battlerId; + u32 status; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - arg = T1_READ_32(sAIScriptPtr + 2); + status = T1_READ_32(sAIScriptPtr + 2); - if ((gStatuses3[index] & arg) == 0) + if (!(gStatuses3[battlerId] & status)) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } -static void BattleAICmd_if_status4(void) +static void Cmd_if_side_affecting(void) { - u16 index; - u32 arg1, arg2; + u16 battlerId; + u32 side, status; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - arg1 = GetBattlerPosition(index) & 1; - arg2 = T1_READ_32(sAIScriptPtr + 2); + side = GET_BATTLER_SIDE(battlerId); + status = T1_READ_32(sAIScriptPtr + 2); - if ((gSideStatuses[arg1] & arg2) != 0) + if (gSideStatuses[side] & status) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } -static void BattleAICmd_if_not_status4(void) +static void Cmd_if_not_side_affecting(void) { - u16 index; - u32 arg1, arg2; + u16 battlerId; + u32 side, status; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - arg1 = GetBattlerPosition(index) & 1; - arg2 = T1_READ_32(sAIScriptPtr + 2); + side = GET_BATTLER_SIDE(battlerId); + status = T1_READ_32(sAIScriptPtr + 2); - if ((gSideStatuses[arg1] & arg2) == 0) + if (!(gSideStatuses[side] & status)) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); else sAIScriptPtr += 10; } -static void BattleAICmd_if_less_than(void) +static void Cmd_if_less_than(void) { if (AI_THINKING_STRUCT->funcResult < sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -749,7 +748,7 @@ static void BattleAICmd_if_less_than(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_more_than(void) +static void Cmd_if_more_than(void) { if (AI_THINKING_STRUCT->funcResult > sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -757,7 +756,7 @@ static void BattleAICmd_if_more_than(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_equal(void) +static void Cmd_if_equal(void) { if (AI_THINKING_STRUCT->funcResult == sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -765,7 +764,7 @@ static void BattleAICmd_if_equal(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_not_equal(void) +static void Cmd_if_not_equal(void) { if (AI_THINKING_STRUCT->funcResult != sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -773,47 +772,47 @@ static void BattleAICmd_if_not_equal(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_less_than_32(void) +static void Cmd_if_less_than_ptr(void) { - u8 *temp = T1_READ_PTR(sAIScriptPtr + 1); + const u8 *value = T1_READ_PTR(sAIScriptPtr + 1); - if (AI_THINKING_STRUCT->funcResult < *temp) + if (AI_THINKING_STRUCT->funcResult < *value) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); else sAIScriptPtr += 9; } -static void BattleAICmd_if_more_than_32(void) +static void Cmd_if_more_than_ptr(void) { - u8 *temp = T1_READ_PTR(sAIScriptPtr + 1); + const u8 *value = T1_READ_PTR(sAIScriptPtr + 1); - if (AI_THINKING_STRUCT->funcResult > *temp) + if (AI_THINKING_STRUCT->funcResult > *value) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); else sAIScriptPtr += 9; } -static void BattleAICmd_if_equal_32(void) +static void Cmd_if_equal_ptr(void) { - u8 *temp = T1_READ_PTR(sAIScriptPtr + 1); + const u8 *value = T1_READ_PTR(sAIScriptPtr + 1); - if (AI_THINKING_STRUCT->funcResult == *temp) + if (AI_THINKING_STRUCT->funcResult == *value) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); else sAIScriptPtr += 9; } -static void BattleAICmd_if_not_equal_32(void) +static void Cmd_if_not_equal_ptr(void) { - u8 *temp = T1_READ_PTR(sAIScriptPtr + 1); + const u8 *value = T1_READ_PTR(sAIScriptPtr + 1); - if (AI_THINKING_STRUCT->funcResult != *temp) + if (AI_THINKING_STRUCT->funcResult != *value) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); else sAIScriptPtr += 9; } -static void BattleAICmd_if_move(void) +static void Cmd_if_move(void) { u16 move = T1_READ_16(sAIScriptPtr + 1); @@ -823,7 +822,7 @@ static void BattleAICmd_if_move(void) sAIScriptPtr += 7; } -static void BattleAICmd_if_not_move(void) +static void Cmd_if_not_move(void) { u16 move = T1_READ_16(sAIScriptPtr + 1); @@ -833,9 +832,9 @@ static void BattleAICmd_if_not_move(void) sAIScriptPtr += 7; } -static void BattleAICmd_if_in_bytes(void) +static void Cmd_if_in_bytes(void) { - u8 *ptr = T1_READ_PTR(sAIScriptPtr + 1); + const u8 *ptr = T1_READ_PTR(sAIScriptPtr + 1); while (*ptr != 0xFF) { @@ -849,9 +848,9 @@ static void BattleAICmd_if_in_bytes(void) sAIScriptPtr += 9; } -static void BattleAICmd_if_not_in_bytes(void) +static void Cmd_if_not_in_bytes(void) { - u8 *ptr = T1_READ_PTR(sAIScriptPtr + 1); + const u8 *ptr = T1_READ_PTR(sAIScriptPtr + 1); while (*ptr != 0xFF) { @@ -865,9 +864,9 @@ static void BattleAICmd_if_not_in_bytes(void) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); } -static void BattleAICmd_if_in_words(void) +static void Cmd_if_in_hwords(void) { - u16 *ptr = (u16 *)T1_READ_PTR(sAIScriptPtr + 1); + const u16 *ptr = (const u16 *)T1_READ_PTR(sAIScriptPtr + 1); while (*ptr != 0xFFFF) { @@ -881,9 +880,9 @@ static void BattleAICmd_if_in_words(void) sAIScriptPtr += 9; } -static void BattleAICmd_if_not_in_words(void) +static void Cmd_if_not_in_hwords(void) { - u16 *ptr = (u16 *)T1_READ_PTR(sAIScriptPtr + 1); + const u16 *ptr = (const u16 *)T1_READ_PTR(sAIScriptPtr + 1); while (*ptr != 0xFFFF) { @@ -897,7 +896,7 @@ static void BattleAICmd_if_not_in_words(void) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 5); } -static void BattleAICmd_if_user_can_damage(void) +static void Cmd_if_user_has_attacking_move(void) { s32 i; @@ -907,13 +906,14 @@ static void BattleAICmd_if_user_can_damage(void) && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].power != 0) break; } + if (i == MAX_MON_MOVES) sAIScriptPtr += 5; else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); } -static void BattleAICmd_if_user_cant_damage(void) +static void Cmd_if_user_has_no_attacking_moves(void) { s32 i; @@ -923,51 +923,52 @@ static void BattleAICmd_if_user_cant_damage(void) && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].power != 0) break; } + if (i != MAX_MON_MOVES) sAIScriptPtr += 5; else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); } -static void BattleAICmd_get_turn_count(void) +static void Cmd_get_turn_count(void) { AI_THINKING_STRUCT->funcResult = gBattleResults.battleTurnCounter; sAIScriptPtr += 1; } -static void BattleAICmd_get_type(void) +static void Cmd_get_type(void) { switch (sAIScriptPtr[1]) { - case 1: // player primary type + case AI_TYPE1_USER: AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerAttacker].type1; break; - case 0: // enemy primary type + case AI_TYPE1_TARGET: AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type1; break; - case 3: // player secondary type + case AI_TYPE2_USER: AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerAttacker].type2; break; - case 2: // enemy secondary type + case AI_TYPE2_TARGET: AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type2; break; - case 4: // type of move being pointed to + case AI_TYPE_MOVE: AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].type; break; } sAIScriptPtr += 2; } -static void BattleAICmd_get_move_power(void) +static void Cmd_get_considered_move_power(void) { AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power; sAIScriptPtr += 1; } -static void BattleAICmd_is_most_powerful_move(void) +static void Cmd_get_how_powerful_move_is(void) { s32 i, checkedMove; - s32 moveDmgs[4]; + s32 moveDmgs[MAX_MON_MOVES]; for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) { @@ -1028,9 +1029,9 @@ static void BattleAICmd_is_most_powerful_move(void) sAIScriptPtr++; } -static void BattleAICmd_get_move(void) +static void Cmd_get_last_used_battler_move(void) { - if (sAIScriptPtr[1] == USER) + if (sAIScriptPtr[1] == AI_USER) AI_THINKING_STRUCT->funcResult = gLastMoves[gBattlerAttacker]; else AI_THINKING_STRUCT->funcResult = gLastMoves[gBattlerTarget]; @@ -1038,7 +1039,7 @@ static void BattleAICmd_get_move(void) sAIScriptPtr += 2; } -static void BattleAICmd_if_arg_equal(void) +static void Cmd_if_equal_(void) // Same as if_equal. { if (sAIScriptPtr[1] == AI_THINKING_STRUCT->funcResult) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -1046,7 +1047,7 @@ static void BattleAICmd_if_arg_equal(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_arg_not_equal(void) +static void Cmd_if_not_equal_(void) // Same as if_not_equal. { if (sAIScriptPtr[1] != AI_THINKING_STRUCT->funcResult) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -1054,7 +1055,7 @@ static void BattleAICmd_if_arg_not_equal(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_would_go_first(void) +static void Cmd_if_would_go_first(void) { if (GetWhoStrikesFirst(gBattlerAttacker, gBattlerTarget, TRUE) == sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -1062,7 +1063,7 @@ static void BattleAICmd_if_would_go_first(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_would_not_go_first(void) +static void Cmd_if_would_not_go_first(void) { if (GetWhoStrikesFirst(gBattlerAttacker, gBattlerTarget, TRUE) != sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -1070,49 +1071,49 @@ static void BattleAICmd_if_would_not_go_first(void) sAIScriptPtr += 6; } -static void BattleAICmd_nullsub_2A(void) +static void Cmd_nullsub_2A(void) { } -static void BattleAICmd_nullsub_2B(void) +static void Cmd_nullsub_2B(void) { } -static void BattleAICmd_count_alive_pokemon(void) +static void Cmd_count_alive_pokemon(void) { + u8 battlerId; + u8 battlerOnField1, battlerOnField2; struct Pokemon *party; - int i; - u8 index; - u8 var, var2; + s32 i; AI_THINKING_STRUCT->funcResult = 0; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - if (GetBattlerSide(index) == 0) + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - u32 status; - var = gBattlerPartyIndexes[index]; - status = GetBattlerPosition(index) ^ 2; - var2 = gBattlerPartyIndexes[GetBattlerAtPosition(status)]; + u32 position; + battlerOnField1 = gBattlerPartyIndexes[battlerId]; + position = GetBattlerPosition(battlerId) ^ BIT_FLANK; + battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)]; } - else + else // In singles there's only one battlerId by side. { - var = gBattlerPartyIndexes[index]; - var2 = gBattlerPartyIndexes[index]; + battlerOnField1 = gBattlerPartyIndexes[battlerId]; + battlerOnField2 = gBattlerPartyIndexes[battlerId]; } - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { - if (i != var && i != var2 + if (i != battlerOnField1 && i != battlerOnField2 && GetMonData(&party[i], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) @@ -1124,30 +1125,30 @@ static void BattleAICmd_count_alive_pokemon(void) sAIScriptPtr += 2; } -static void BattleAICmd_get_considered_move(void) +static void Cmd_get_considered_move(void) { AI_THINKING_STRUCT->funcResult = AI_THINKING_STRUCT->moveConsidered; sAIScriptPtr += 1; } -static void BattleAICmd_get_considered_move_effect(void) +static void Cmd_get_considered_move_effect(void) { AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect; sAIScriptPtr += 1; } -static void BattleAICmd_get_ability(void) +static void Cmd_get_ability(void) { - u8 index; + u8 battlerId; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - if (GetBattlerSide(index) == TARGET) + if (GetBattlerSide(battlerId) == AI_TARGET) { - u16 side = GetBattlerPosition(index) & 1; + u16 side = GET_BATTLER_SIDE(battlerId); if (BATTLE_HISTORY->abilities[side] != 0) { @@ -1157,48 +1158,46 @@ static void BattleAICmd_get_ability(void) } // abilities that prevent fleeing. - if (gBattleMons[index].ability == ABILITY_SHADOW_TAG - || gBattleMons[index].ability == ABILITY_MAGNET_PULL - || gBattleMons[index].ability == ABILITY_ARENA_TRAP) + if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG + || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL + || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP) { - AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability; + AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability; sAIScriptPtr += 2; return; } - if (gBaseStats[gBattleMons[index].species].abilities[0] != ABILITY_NONE) + if (gBaseStats[gBattleMons[battlerId].species].abilities[0] != ABILITY_NONE) { - if (gBaseStats[gBattleMons[index].species].abilities[1] != ABILITY_NONE) + if (gBaseStats[gBattleMons[battlerId].species].abilities[1] != ABILITY_NONE) { // AI has no knowledge of opponent, so it guesses which ability. if (Random() % 2) - { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[0]; - } + AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].abilities[0]; else - { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[1]; - } + AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].abilities[1]; } else { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[0]; // it's definitely ability 1. + AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].abilities[0]; } } else { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].abilities[1]; // AI cant actually reach this part since every mon has at least 1 ability. + // AI can't actually reach this part since no pokemon has ability 2 and no ability 1. + AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].abilities[1]; } } else { // The AI knows its own ability. - AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability; + AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability; } + sAIScriptPtr += 2; } -static void BattleAICmd_get_highest_possible_damage(void) +static void Cmd_get_highest_type_effectiveness(void) { s32 i; u8 *dynamicMoveType; @@ -1211,12 +1210,12 @@ static void BattleAICmd_get_highest_possible_damage(void) gCritMultiplier = 1; AI_THINKING_STRUCT->funcResult = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { gBattleMoveDamage = 40; gCurrentMove = gBattleMons[gBattlerAttacker].moves[i]; - if (gCurrentMove != 0) + if (gCurrentMove != MOVE_NONE) { TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget); @@ -1240,7 +1239,7 @@ static void BattleAICmd_get_highest_possible_damage(void) sAIScriptPtr += 1; } -static void BattleAICmd_if_type_effectiveness(void) +static void Cmd_if_type_effectiveness(void) { u8 damageVar; @@ -1276,22 +1275,24 @@ static void BattleAICmd_if_type_effectiveness(void) sAIScriptPtr += 6; } -static void BattleAICmd_nullsub_32(void) +static void Cmd_nullsub_32(void) { } -static void BattleAICmd_nullsub_33(void) +static void Cmd_nullsub_33(void) { } -static void BattleAICmd_if_status_in_party(void) +static void Cmd_if_status_in_party(void) { struct Pokemon *party; struct Pokemon *partyPtr; int i; u32 statusToCompareTo; + // u8 battlerId - // for whatever reason, game freak put the party pointer into 2 variables instead of 1. it's possible at some point the switch encompassed the whole function and used each respective variable creating largely duplicate code. + // for whatever reason, game freak put the party pointer into 2 variables instead of 1 + // it's possible at some point the switch encompassed the whole function and used each respective variable creating largely duplicate code. switch (sAIScriptPtr[1]) { case 1: @@ -1302,9 +1303,23 @@ static void BattleAICmd_if_status_in_party(void) break; } + /* Emerald's fixed version below + switch (sAIScriptPtr[1]) + { + case AI_USER: + battlerId = gBattlerAttacker; + break; + default: + battlerId = gBattlerTarget; + break; + } + + party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; + */ + statusToCompareTo = T1_READ_32(sAIScriptPtr + 2); - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES); u16 hp = GetMonData(&party[i], MON_DATA_HP); @@ -1312,7 +1327,7 @@ static void BattleAICmd_if_status_in_party(void) if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) { - sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); // WHAT. why is this being merged into the above switch + sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 6); return; } } @@ -1321,12 +1336,13 @@ static void BattleAICmd_if_status_in_party(void) } // bugged, doesnt return properly. also unused -static void BattleAICmd_if_status_not_in_party(void) +static void Cmd_if_status_not_in_party(void) { struct Pokemon *party; struct Pokemon *partyPtr; int i; u32 statusToCompareTo; + //u8 battlerId switch (sAIScriptPtr[1]) { @@ -1340,7 +1356,7 @@ static void BattleAICmd_if_status_not_in_party(void) statusToCompareTo = T1_READ_32(sAIScriptPtr + 2); - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES); u16 hp = GetMonData(&party[i], MON_DATA_HP); @@ -1363,7 +1379,7 @@ enum extern u16 gBattleWeather; -static void BattleAICmd_get_weather(void) +static void Cmd_get_weather(void) { if (gBattleWeather & WEATHER_RAIN_ANY) AI_THINKING_STRUCT->funcResult = WEATHER_TYPE_RAIN; @@ -1377,7 +1393,7 @@ static void BattleAICmd_get_weather(void) sAIScriptPtr += 1; } -static void BattleAICmd_if_effect(void) +static void Cmd_if_effect(void) { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -1385,7 +1401,7 @@ static void BattleAICmd_if_effect(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_not_effect(void) +static void Cmd_if_not_effect(void) { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect != sAIScriptPtr[1]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); @@ -1393,67 +1409,67 @@ static void BattleAICmd_if_not_effect(void) sAIScriptPtr += 6; } -static void BattleAICmd_if_stat_level_less_than(void) +static void Cmd_if_stat_level_less_than(void) { - u32 party; + u32 battlerId; - if (sAIScriptPtr[1] == USER) - party = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - party = gBattlerTarget; + battlerId = gBattlerTarget; - if (gBattleMons[party].statStages[sAIScriptPtr[2]] < sAIScriptPtr[3]) + if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] < sAIScriptPtr[3]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); else sAIScriptPtr += 8; } -static void BattleAICmd_if_stat_level_more_than(void) +static void Cmd_if_stat_level_more_than(void) { - u32 party; + u32 battlerId; - if (sAIScriptPtr[1] == USER) - party = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - party = gBattlerTarget; + battlerId = gBattlerTarget; - if (gBattleMons[party].statStages[sAIScriptPtr[2]] > sAIScriptPtr[3]) + if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] > sAIScriptPtr[3]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); else sAIScriptPtr += 8; } -static void BattleAICmd_if_stat_level_equal(void) +static void Cmd_if_stat_level_equal(void) { - u32 party; + u32 battlerId; - if (sAIScriptPtr[1] == USER) - party = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - party = gBattlerTarget; + battlerId = gBattlerTarget; - if (gBattleMons[party].statStages[sAIScriptPtr[2]] == sAIScriptPtr[3]) + if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] == sAIScriptPtr[3]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); else sAIScriptPtr += 8; } -static void BattleAICmd_if_stat_level_not_equal(void) +static void Cmd_if_stat_level_not_equal(void) { - u32 party; + u32 battlerId; - if (sAIScriptPtr[1] == USER) - party = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - party = gBattlerTarget; + battlerId = gBattlerTarget; - if (gBattleMons[party].statStages[sAIScriptPtr[2]] != sAIScriptPtr[3]) + if (gBattleMons[battlerId].statStages[sAIScriptPtr[2]] != sAIScriptPtr[3]) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); else sAIScriptPtr += 8; } -static void BattleAICmd_if_can_faint(void) +static void Cmd_if_can_faint(void) { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) { @@ -1482,7 +1498,7 @@ static void BattleAICmd_if_can_faint(void) sAIScriptPtr += 5; } -static void BattleAICmd_if_cant_faint(void) +static void Cmd_if_cant_faint(void) { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) { @@ -1509,18 +1525,18 @@ static void BattleAICmd_if_cant_faint(void) sAIScriptPtr += 5; } -static void BattleAICmd_if_has_move(void) +static void Cmd_if_has_move(void) { int i; - u16 *temp_ptr = (u16 *)(sAIScriptPtr + 2); + const u16 *movePtr = (u16 *)(sAIScriptPtr + 2); switch (sAIScriptPtr[1]) { - case 1: - case 3: + case AI_USER: + case AI_USER_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { - if (gBattleMons[gBattlerAttacker].moves[i] == *temp_ptr) + if (gBattleMons[gBattlerAttacker].moves[i] == *movePtr) break; } if (i == MAX_MON_MOVES) @@ -1528,33 +1544,33 @@ static void BattleAICmd_if_has_move(void) else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); break; - case 0: - case 2: + case AI_TARGET: + case AI_TARGET_PARTNER: for (i = 0; i < 8; i++) { - if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] == *temp_ptr) + if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] == *movePtr) break; } if (i == 8) sAIScriptPtr += 8; - else + else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); break; } } -static void BattleAICmd_if_dont_have_move(void) +static void Cmd_if_doesnt_have_move(void) { int i; - u16 *temp_ptr = (u16 *)(sAIScriptPtr + 2); + const u16 *movePtr = (u16 *)(sAIScriptPtr + 2); switch (sAIScriptPtr[1]) { - case 1: - case 3: + case AI_USER: + case AI_USER_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { - if (gBattleMons[gBattlerAttacker].moves[i] == *temp_ptr) + if (gBattleMons[gBattlerAttacker].moves[i] == *movePtr) break; } if (i != MAX_MON_MOVES) @@ -1562,11 +1578,11 @@ static void BattleAICmd_if_dont_have_move(void) else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 4); break; - case 0: - case 2: + case AI_TARGET: + case AI_TARGET_PARTNER: for (i = 0; i < 8; i++) { - if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] == *temp_ptr) + if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] == *movePtr) break; } if (i != 8) @@ -1577,14 +1593,14 @@ static void BattleAICmd_if_dont_have_move(void) } } -static void BattleAICmd_if_move_effect(void) +static void Cmd_if_has_move_with_effect(void) { int i; switch (sAIScriptPtr[1]) { - case 1: - case 3: + case AI_USER: + case AI_USER_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].effect == sAIScriptPtr[2]) @@ -1595,8 +1611,8 @@ static void BattleAICmd_if_move_effect(void) else sAIScriptPtr += 7; break; - case 0: - case 2: + case AI_TARGET: + case AI_TARGET_PARTNER: for (i = 0; i < 8; i++) { if (gBattleMons[gBattlerAttacker].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i]].effect == sAIScriptPtr[2]) @@ -1606,14 +1622,14 @@ static void BattleAICmd_if_move_effect(void) } } -static void BattleAICmd_if_not_move_effect(void) +static void Cmd_if_doesnt_have_move_with_effect(void) { int i; switch (sAIScriptPtr[1]) { - case 1: - case 3: + case AI_USER: + case AI_USER_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] != 0 && gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].effect == sAIScriptPtr[2]) @@ -1624,8 +1640,8 @@ static void BattleAICmd_if_not_move_effect(void) else sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); break; - case 0: - case 2: + case AI_TARGET: + case AI_TARGET_PARTNER: for (i = 0; i < 8; i++) { if (BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget >> 1][i]].effect == sAIScriptPtr[2]) @@ -1635,171 +1651,163 @@ static void BattleAICmd_if_not_move_effect(void) } } -static void BattleAICmd_if_last_move_did_damage(void) +static void Cmd_if_any_move_disabled_or_encored(void) { - u8 index; + u8 battlerId; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; if (sAIScriptPtr[2] == 0) { - if (gDisableStructs[index].disabledMove == MOVE_NONE) - { + if (gDisableStructs[battlerId].disabledMove == MOVE_NONE) sAIScriptPtr += 7; - return; - } - sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); - return; + else + sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); } - else if (sAIScriptPtr[2] != 1) // ignore the macro if its not 0 or 1. + else if (sAIScriptPtr[2] != 1) { sAIScriptPtr += 7; - return; } - else if (gDisableStructs[index].encoredMove != MOVE_NONE) + else { - sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); - return; + if (gDisableStructs[battlerId].encoredMove != MOVE_NONE) + sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 3); + else + sAIScriptPtr += 7; } - sAIScriptPtr += 7; } -static void BattleAICmd_if_encored(void) +static void Cmd_if_curr_move_disabled_or_encored(void) { switch (sAIScriptPtr[1]) { - case 0: // _08109348 + case 0: if (gDisableStructs[gActiveBattler].disabledMove == AI_THINKING_STRUCT->moveConsidered) - { sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); - return; - } - sAIScriptPtr += 6; - return; - case 1: // _08109370 + else + sAIScriptPtr += 6; + break; + case 1: if (gDisableStructs[gActiveBattler].encoredMove == AI_THINKING_STRUCT->moveConsidered) - { sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 2); - return; - } - sAIScriptPtr += 6; - return; + else + sAIScriptPtr += 6; + break; default: sAIScriptPtr += 6; - return; + break; } } -static void BattleAICmd_flee(void) +static void Cmd_flee(void) { AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_FLEE being enabled. } -// FRLG safari command -static void BattleAICmd_frlg_safari(void) +static void Cmd_if_random_safari_flee(void) { - u8 var; + u8 safariFleeRate; if (gBattleStruct->safariGoNearCounter) { - var = gBattleStruct->safariEscapeFactor * 2; - if (var > 20) - var = 20; + safariFleeRate = gBattleStruct->safariEscapeFactor * 2; + if (safariFleeRate > 20) + safariFleeRate = 20; } - else if (gBattleStruct->safariPkblThrowCounter != 0) // _080C91DC + else if (gBattleStruct->safariPkblThrowCounter != 0) { - var = gBattleStruct->safariEscapeFactor / 4; - if (var == 0) - var = 1; + safariFleeRate = gBattleStruct->safariEscapeFactor / 4; + if (safariFleeRate == 0) + safariFleeRate = 1; } else - var = gBattleStruct->safariEscapeFactor; - var *= 5; - if ((u8)(Random() % 100) < var) + safariFleeRate = gBattleStruct->safariEscapeFactor; + safariFleeRate *= 5; + if ((u8)(Random() % 100) < safariFleeRate) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); else sAIScriptPtr += 5; } -static void BattleAICmd_watch(void) +static void Cmd_watch(void) { AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_WATCH being enabled. } -static void BattleAICmd_get_hold_effect(void) +static void Cmd_get_hold_effect(void) { - u8 index; + u8 battlerId; u16 side; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - if (GetBattlerSide(index) == 0) + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { - side = (GetBattlerPosition(index) & 1); + side = GET_BATTLER_SIDE(battlerId); AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->itemEffects[side]; } else - AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[index].item); + AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[battlerId].item); sAIScriptPtr += 2; } -static void BattleAICmd_get_gender(void) +static void Cmd_get_gender(void) { - u8 index; + u8 battlerId; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[index].species, gBattleMons[index].personality); + AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[battlerId].species, gBattleMons[battlerId].personality); sAIScriptPtr += 2; } -static void BattleAICmd_is_first_turn(void) +static void Cmd_is_first_turn_for(void) { - u8 index; + u8 battlerId; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - AI_THINKING_STRUCT->funcResult = gDisableStructs[index].isFirstTurn; + AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].isFirstTurn; sAIScriptPtr += 2; } -static void BattleAICmd_get_stockpile_count(void) +static void Cmd_get_stockpile_count(void) { - u8 index; + u8 battlerId; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - AI_THINKING_STRUCT->funcResult = gDisableStructs[index].stockpileCounter; + AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].stockpileCounter; sAIScriptPtr += 2; } -static void BattleAICmd_is_double_battle(void) +static void Cmd_is_double_battle(void) { AI_THINKING_STRUCT->funcResult = gBattleTypeFlags & BATTLE_TYPE_DOUBLE; sAIScriptPtr += 1; } -static void BattleAICmd_get_used_held_item(void) +static void Cmd_get_used_held_item(void) { u8 battlerId; @@ -1807,88 +1815,88 @@ static void BattleAICmd_get_used_held_item(void) battlerId = gBattlerAttacker; else battlerId = gBattlerTarget; - // This is likely a leftover from Ruby's code and its ugly ewram access. + AI_THINKING_STRUCT->funcResult = ((u8 *)gBattleStruct->usedHeldItems)[battlerId * 2]; sAIScriptPtr += 2; } -static void BattleAICmd_get_move_type_from_result(void) +static void Cmd_get_move_type_from_result(void) { AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].type; sAIScriptPtr += 1; } -static void BattleAICmd_get_move_power_from_result(void) +static void Cmd_get_move_power_from_result(void) { AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].power; sAIScriptPtr += 1; } -static void BattleAICmd_get_move_effect_from_result(void) +static void Cmd_get_move_effect_from_result(void) { AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].effect; sAIScriptPtr += 1; } -static void BattleAICmd_get_protect_count(void) +static void Cmd_get_protect_count(void) { - u8 index; + u8 battlerId; - if (sAIScriptPtr[1] == USER) - index = gBattlerAttacker; + if (sAIScriptPtr[1] == AI_USER) + battlerId = gBattlerAttacker; else - index = gBattlerTarget; + battlerId = gBattlerTarget; - AI_THINKING_STRUCT->funcResult = gDisableStructs[index].protectUses; + AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].protectUses; sAIScriptPtr += 2; } -static void BattleAICmd_nullsub_52(void) +static void Cmd_nullsub_52(void) { } -static void BattleAICmd_nullsub_53(void) +static void Cmd_nullsub_53(void) { } -static void BattleAICmd_nullsub_54(void) +static void Cmd_nullsub_54(void) { } -static void BattleAICmd_nullsub_55(void) +static void Cmd_nullsub_55(void) { } -static void BattleAICmd_nullsub_56(void) +static void Cmd_nullsub_56(void) { } -static void BattleAICmd_nullsub_57(void) +static void Cmd_nullsub_57(void) { } -static void BattleAICmd_call(void) +static void Cmd_call(void) { AIStackPushVar(sAIScriptPtr + 5); sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); } -static void BattleAICmd_jump(void) +static void Cmd_goto(void) { sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); } -static void BattleAICmd_end(void) +static void Cmd_end(void) { if (AIStackPop() == FALSE) AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE; } -static void BattleAICmd_if_level_compare(void) +static void Cmd_if_level_compare(void) { switch (sAIScriptPtr[1]) { @@ -1919,7 +1927,7 @@ static void BattleAICmd_if_level_compare(void) } } -static void BattleAICmd_if_taunted(void) +static void Cmd_if_target_taunted(void) { if (gDisableStructs[gBattlerTarget].tauntTimer != 0) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); @@ -1927,7 +1935,7 @@ static void BattleAICmd_if_taunted(void) sAIScriptPtr += 5; } -static void BattleAICmd_if_not_taunted(void) +static void Cmd_if_target_not_taunted(void) { if (gDisableStructs[gBattlerTarget].tauntTimer == 0) sAIScriptPtr = T1_READ_PTR(sAIScriptPtr + 1); |