summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGriffinR <griffin.g.richards@gmail.com>2020-01-22 16:38:27 -0500
committerGriffinR <griffin.g.richards@gmail.com>2020-01-22 19:21:40 -0500
commitd084a5ca84ec7062b8e546293e67202f2d2f4732 (patch)
treeaf486891024318e0f2162044e18684a24e644bd0
parent055e5d2bbff31a98bcdffec0d7392e7ce77bcd46 (diff)
Sync AI scripts
-rw-r--r--asm/macros/battle_ai_script.inc397
-rw-r--r--data/battle_ai_scripts.s4916
-rw-r--r--include/constants/battle.h4
-rw-r--r--include/constants/battle_ai.h6
-rw-r--r--include/constants/pokemon.h4
-rw-r--r--include/pokemon.h34
-rw-r--r--src/battle_ai_script_commands.c1130
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);