mirror of
https://github.com/pret/pokeemerald.git
synced 2026-09-30 13:57:40 -05:00
Renamed Battle Move "Split" to the proper "Category" (#3774)
This commit is contained in:
committed by
GitHub
parent
13a4bf5838
commit
442620cf6b
@@ -22,7 +22,7 @@ Based off RHH's pokeemerald-expansion v1.7.0 https://github.com/rh-hideout/pokee
|
||||
- 2v2 Wild battles support.
|
||||
- 1v2/2v1 battles support.
|
||||
- Fairy Type (configurable).
|
||||
- Physical/Special/Status Category Split (configurable).
|
||||
- Physical/Special/Status Category (configurable).
|
||||
- New moves and abilities up to Scarlet and Violet.
|
||||
- Custom Contest data up to SwSh, newer moves are WIP. ([source](https://pokemonurpg.com/info/contests/rse-move-list/))
|
||||
- Mega Evolution
|
||||
|
||||
@@ -1,783 +0,0 @@
|
||||
.macro if_random_less_than param0:req, param1:req
|
||||
.byte 0x0
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_random_greater_than param0:req, param1:req
|
||||
.byte 0x1
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_random_equal param0:req, param1:req
|
||||
.byte 0x2
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_random_not_equal param0:req, param1:req
|
||||
.byte 0x3
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro score param0:req
|
||||
.byte 0x4
|
||||
.byte \param0
|
||||
.endm
|
||||
|
||||
.macro if_hp_less_than battler:req, param1:req, param2:req
|
||||
.byte 0x5
|
||||
.byte \battler
|
||||
.byte \param1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_hp_more_than battler:req, param1:req, param2:req
|
||||
.byte 0x6
|
||||
.byte \battler
|
||||
.byte \param1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_hp_equal battler:req, param1:req, param2:req
|
||||
.byte 0x7
|
||||
.byte \battler
|
||||
.byte \param1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_hp_not_equal battler:req, param1:req, param2:req
|
||||
.byte 0x8
|
||||
.byte \battler
|
||||
.byte \param1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_status battler:req, status1:req, param2:req
|
||||
.byte 0x9
|
||||
.byte \battler
|
||||
.4byte \status1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_not_status battler:req, status1:req, param2:req
|
||||
.byte 0xa
|
||||
.byte \battler
|
||||
.4byte \status1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_status2 battler:req, status2:req, param2:req
|
||||
.byte 0xb
|
||||
.byte \battler
|
||||
.4byte \status2
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_not_status2 battler:req, status2:req, param2:req
|
||||
.byte 0xc
|
||||
.byte \battler
|
||||
.4byte \status2
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_status3 battler:req, status3:req, param2:req
|
||||
.byte 0xd
|
||||
.byte \battler
|
||||
.4byte \status3
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_not_status3 battler:req, status3:req, param2:req
|
||||
.byte 0xe
|
||||
.byte \battler
|
||||
.4byte \status3
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_side_affecting battler:req, sidestatus:req, param2:req
|
||||
.byte 0xf
|
||||
.byte \battler
|
||||
.4byte \sidestatus
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_not_side_affecting battler:req, sidestatus:req, param2:req
|
||||
.byte 0x10
|
||||
.byte \battler
|
||||
.4byte \sidestatus
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_less_than param0:req, param1:req
|
||||
.byte 0x11
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_more_than param0:req, param1:req
|
||||
.byte 0x12
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_equal param0:req, param1:req
|
||||
.byte 0x13
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_not_equal param0:req, param1:req
|
||||
.byte 0x14
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_less_than_ptr param0:req, param1:req
|
||||
.byte 0x15
|
||||
.4byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_more_than_ptr param0:req, param1:req
|
||||
.byte 0x16
|
||||
.4byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_equal_ptr param0:req, param1:req
|
||||
.byte 0x17
|
||||
.4byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_not_equal_ptr param0:req, param1:req
|
||||
.byte 0x18
|
||||
.4byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_move param0:req, param1:req
|
||||
.byte 0x19
|
||||
.2byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_not_move param0:req, param1:req
|
||||
.byte 0x1a
|
||||
.2byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_in_bytes param0:req, param1:req
|
||||
.byte 0x1b
|
||||
.4byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_not_in_bytes param0:req, param1:req
|
||||
.byte 0x1c
|
||||
.4byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_in_hwords param0:req, param1:req
|
||||
.byte 0x1d
|
||||
.4byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_not_in_hwords param0:req, param1:req
|
||||
.byte 0x1e
|
||||
.4byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_user_has_attacking_move param0:req
|
||||
.byte 0x1f
|
||||
.4byte \param0
|
||||
.endm
|
||||
|
||||
.macro if_user_has_no_attacking_moves param0:req
|
||||
.byte 0x20
|
||||
.4byte \param0
|
||||
.endm
|
||||
|
||||
.macro get_turn_count
|
||||
.byte 0x21
|
||||
.endm
|
||||
|
||||
.macro get_type param0:req
|
||||
.byte 0x22
|
||||
.byte \param0
|
||||
.endm
|
||||
|
||||
.macro get_considered_move_power
|
||||
.byte 0x23
|
||||
.endm
|
||||
|
||||
.macro get_how_powerful_move_is
|
||||
.byte 0x24
|
||||
.endm
|
||||
|
||||
.macro get_last_used_bank_move battler:req
|
||||
.byte 0x25
|
||||
.byte \battler
|
||||
.endm
|
||||
|
||||
.macro if_equal_u32 param0:req, param1:req
|
||||
.byte 0x26
|
||||
.4byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_not_equal_u32 param0:req, param1:req
|
||||
.byte 0x27
|
||||
.4byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_user_goes param0:req, param1:req
|
||||
.byte 0x28
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_cant_use_belch battler:req, ptr:req
|
||||
.byte 0x29
|
||||
.byte \battler
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro nop_2A
|
||||
.byte 0x2a
|
||||
.endm
|
||||
|
||||
.macro nop_2B
|
||||
.byte 0x2b
|
||||
.endm
|
||||
|
||||
.macro count_usable_party_mons battler:req
|
||||
.byte 0x2c
|
||||
.byte \battler
|
||||
.endm
|
||||
|
||||
.macro get_considered_move
|
||||
.byte 0x2d
|
||||
.endm
|
||||
|
||||
.macro get_considered_move_effect
|
||||
.byte 0x2e
|
||||
.endm
|
||||
|
||||
.macro get_ability battler:req
|
||||
.byte 0x2f
|
||||
.byte \battler
|
||||
.endm
|
||||
|
||||
.macro get_highest_type_effectiveness
|
||||
.byte 0x30
|
||||
.endm
|
||||
|
||||
.macro if_type_effectiveness param0:req, param1:req
|
||||
.byte 0x31
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro nop_32
|
||||
.byte 0x32
|
||||
.endm
|
||||
|
||||
.macro nop_33
|
||||
.byte 0x33
|
||||
.endm
|
||||
|
||||
.macro if_status_in_party battler:req, status1:req, param2:req
|
||||
.byte 0x34
|
||||
.byte \battler
|
||||
.4byte \status1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_status_not_in_party battler:req, status1:req, param2:req
|
||||
.byte 0x35
|
||||
.byte \battler
|
||||
.4byte \status1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro get_weather
|
||||
.byte 0x36
|
||||
.endm
|
||||
|
||||
.macro if_effect param0:req, param1:req
|
||||
.byte 0x37
|
||||
.2byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_not_effect param0:req, param1:req
|
||||
.byte 0x38
|
||||
.2byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_stat_level_less_than battler:req, stat:req, param2:req, param3:req
|
||||
.byte 0x39
|
||||
.byte \battler
|
||||
.byte \stat
|
||||
.byte \param2
|
||||
.4byte \param3
|
||||
.endm
|
||||
|
||||
.macro if_stat_level_more_than battler:req, stat:req, param2:req, param3:req
|
||||
.byte 0x3a
|
||||
.byte \battler
|
||||
.byte \stat
|
||||
.byte \param2
|
||||
.4byte \param3
|
||||
.endm
|
||||
|
||||
.macro if_stat_level_equal battler:req, stat:req, param2:req, param3:req
|
||||
.byte 0x3b
|
||||
.byte \battler
|
||||
.byte \stat
|
||||
.byte \param2
|
||||
.4byte \param3
|
||||
.endm
|
||||
|
||||
.macro if_stat_level_not_equal battler:req, stat:req, param2:req, param3:req
|
||||
.byte 0x3c
|
||||
.byte \battler
|
||||
.byte \stat
|
||||
.byte \param2
|
||||
.4byte \param3
|
||||
.endm
|
||||
|
||||
.macro if_can_faint param0:req
|
||||
.byte 0x3d
|
||||
.4byte \param0
|
||||
.endm
|
||||
|
||||
.macro if_cant_faint param0:req
|
||||
.byte 0x3e
|
||||
.4byte \param0
|
||||
.endm
|
||||
|
||||
.macro if_has_move battler:req, param1:req, param2:req
|
||||
.byte 0x3f
|
||||
.byte \battler
|
||||
.2byte \param1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_doesnt_have_move battler:req, param1:req, param2:req
|
||||
.byte 0x40
|
||||
.byte \battler
|
||||
.2byte \param1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_has_move_with_effect battler:req, param1:req, param2:req
|
||||
.byte 0x41
|
||||
.byte \battler
|
||||
.byte \param1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_doesnt_have_move_with_effect battler:req, param1:req, param2:req
|
||||
.byte 0x42
|
||||
.byte \battler
|
||||
.byte \param1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_any_move_disabled_or_encored battler:req, param1:req, param2:req
|
||||
.byte 0x43
|
||||
.byte \battler
|
||||
.byte \param1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro if_curr_move_disabled_or_encored param0:req, param1:req
|
||||
.byte 0x44
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro flee
|
||||
.byte 0x45
|
||||
.endm
|
||||
|
||||
.macro if_random_safari_flee param0:req
|
||||
.byte 0x46
|
||||
.4byte \param0
|
||||
.endm
|
||||
|
||||
.macro watch
|
||||
.byte 0x47
|
||||
.endm
|
||||
|
||||
.macro get_hold_effect battler:req
|
||||
.byte 0x48
|
||||
.byte \battler
|
||||
.endm
|
||||
|
||||
.macro get_gender battler:req
|
||||
.byte 0x49
|
||||
.byte \battler
|
||||
.endm
|
||||
|
||||
.macro is_first_turn_for battler:req
|
||||
.byte 0x4a
|
||||
.byte \battler
|
||||
.endm
|
||||
|
||||
.macro get_stockpile_count battler:req
|
||||
.byte 0x4b
|
||||
.byte \battler
|
||||
.endm
|
||||
|
||||
.macro is_double_battle
|
||||
.byte 0x4c
|
||||
.endm
|
||||
|
||||
.macro get_used_held_item battler:req
|
||||
.byte 0x4d
|
||||
.byte \battler
|
||||
.endm
|
||||
|
||||
.macro get_move_type_from_result
|
||||
.byte 0x4e
|
||||
.endm
|
||||
|
||||
.macro get_move_power_from_result
|
||||
.byte 0x4f
|
||||
.endm
|
||||
|
||||
.macro get_move_effect_from_result
|
||||
.byte 0x50
|
||||
.endm
|
||||
|
||||
.macro get_protect_count battler:req
|
||||
.byte 0x51
|
||||
.byte \battler
|
||||
.endm
|
||||
|
||||
.macro if_move_flag flag jumpptr
|
||||
.byte 0x52
|
||||
.4byte \flag
|
||||
.4byte \jumpptr
|
||||
.endm
|
||||
|
||||
.macro if_field_status flag jumpptr
|
||||
.byte 0x53
|
||||
.4byte \flag
|
||||
.4byte \jumpptr
|
||||
.endm
|
||||
|
||||
.macro get_move_accuracy
|
||||
.byte 0x54
|
||||
.endm
|
||||
|
||||
.macro call_if_eq value, ptr
|
||||
.byte 0x55
|
||||
.2byte \value
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro call_if_move_flag flag ptr
|
||||
.byte 0x56
|
||||
.4byte \flag
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro nop_57
|
||||
.byte 0x57
|
||||
.endm
|
||||
|
||||
.macro call param0:req
|
||||
.byte 0x58
|
||||
.4byte \param0
|
||||
.endm
|
||||
|
||||
.macro goto param0:req
|
||||
.byte 0x59
|
||||
.4byte \param0
|
||||
.endm
|
||||
|
||||
.macro end
|
||||
.byte 0x5a
|
||||
.endm
|
||||
|
||||
.macro if_level_cond param0:req, param1:req
|
||||
.byte 0x5b
|
||||
.byte \param0
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_target_taunted param0:req
|
||||
.byte 0x5c
|
||||
.4byte \param0
|
||||
.endm
|
||||
|
||||
.macro if_target_not_taunted param0:req
|
||||
.byte 0x5d
|
||||
.4byte \param0
|
||||
.endm
|
||||
|
||||
.macro if_target_is_ally param0:req
|
||||
.byte 0x5e
|
||||
.4byte \param0
|
||||
.endm
|
||||
|
||||
.macro is_of_type battler:req, type:req
|
||||
.byte 0x5f
|
||||
.byte \battler
|
||||
.byte \type
|
||||
.endm
|
||||
|
||||
.macro check_ability battler:req, ability:req
|
||||
.byte 0x60
|
||||
.byte \battler
|
||||
.byte \ability
|
||||
.endm
|
||||
|
||||
.macro if_flash_fired battler:req, param1:req
|
||||
.byte 0x61
|
||||
.byte \battler
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro if_holds_item battler:req, param1:req, param2:req
|
||||
.byte 0x62
|
||||
.byte \battler
|
||||
.2byte \param1
|
||||
.4byte \param2
|
||||
.endm
|
||||
|
||||
.macro get_ally_chosen_move
|
||||
.byte 0x63
|
||||
.endm
|
||||
|
||||
.macro if_has_no_attacking_moves battler:req, param1:req
|
||||
.byte 0x64
|
||||
.byte \battler
|
||||
.4byte \param1
|
||||
.endm
|
||||
|
||||
.macro get_hazards_count battler:req, effect:req
|
||||
.byte 0x65
|
||||
.byte \battler
|
||||
.2byte \effect
|
||||
.endm
|
||||
|
||||
.macro if_doesnt_hold_berry battler:req, ptr:req
|
||||
.byte 0x66
|
||||
.byte \battler
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro if_share_type battler1:req, battler2:req, ptr:req
|
||||
.byte 0x67
|
||||
.byte \battler1
|
||||
.byte \battler2
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro if_cant_use_last_resort battler:req, ptr:req
|
||||
.byte 0x68
|
||||
.byte \battler
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro if_has_move_with_split battler:req, split:req, ptr:req
|
||||
.byte 0x69
|
||||
.byte \battler
|
||||
.byte \split
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro if_has_no_move_with_split battler:req, split:req, ptr:req
|
||||
.byte 0x6A
|
||||
.byte \battler
|
||||
.byte \split
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro if_physical_moves_unusable attacker:req, target:req, ptr:req
|
||||
.byte 0x6B
|
||||
.byte \attacker
|
||||
.byte \target
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro if_ai_can_go_down ptr:req
|
||||
.byte 0x6C
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro if_has_move_with_type battler:req, type:req, ptr:req
|
||||
.byte 0x6D
|
||||
.byte \battler
|
||||
.byte \type
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro if_no_move_used battler:req, ptr:req
|
||||
.byte 0x6E
|
||||
.byte \battler
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro if_has_move_with_flag battler:req, flag:req, ptr:req
|
||||
.byte 0x6F
|
||||
.byte \battler
|
||||
.4byte \flag
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro if_battler_absent battler:req, ptr:req
|
||||
.byte 0x70
|
||||
.byte \battler
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro if_grounded battler:req, ptr:req
|
||||
.byte 0x71
|
||||
.byte \battler
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro get_best_dmg_hp_percent
|
||||
.byte 0x72
|
||||
.endm
|
||||
|
||||
.macro get_curr_dmg_hp_percent
|
||||
.byte 0x73
|
||||
.endm
|
||||
|
||||
.macro get_move_split_from_result
|
||||
.byte 0x74
|
||||
.endm
|
||||
|
||||
.macro get_considered_move_split
|
||||
.byte 0x75
|
||||
.endm
|
||||
|
||||
.macro get_considered_move_target
|
||||
.byte 0x76
|
||||
.endm
|
||||
|
||||
.macro compare_speeds battler1:req, battler2:req
|
||||
.byte 0x77
|
||||
.byte \battler1
|
||||
.byte \battler2
|
||||
.endm
|
||||
|
||||
.macro is_wakeup_turn battler:req
|
||||
.byte 0x78
|
||||
.byte \battler
|
||||
.endm
|
||||
|
||||
.macro if_has_move_with_accuracy_lt battler:req, value:req, ptr:req
|
||||
.byte 0x79
|
||||
.byte \battler
|
||||
.byte \value
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
@ useful script macros
|
||||
.macro if_has_physical_move battler:req, ptr:req
|
||||
if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr
|
||||
.endm
|
||||
|
||||
.macro if_has_no_physical_move battler:req, ptr:req
|
||||
if_has_no_move_with_split \battler, SPLIT_PHYSICAL, \ptr
|
||||
.endm
|
||||
|
||||
.macro if_has_special_move battler:req, ptr:req
|
||||
if_has_move_with_split \battler, SPLIT_SPECIAL, \ptr
|
||||
.endm
|
||||
|
||||
.macro if_has_no_special_move battler:req, ptr:req
|
||||
if_has_no_move_with_split \battler, SPLIT_SPECIAL, \ptr
|
||||
.endm
|
||||
|
||||
.macro if_holds_no_item battler, ptr:req
|
||||
if_holds_item \battler, 0, \ptr
|
||||
.endm
|
||||
|
||||
.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_ability battler:req, ability:req, ptr:req
|
||||
check_ability \battler, \ability
|
||||
if_equal 1, \ptr
|
||||
.endm
|
||||
|
||||
.macro if_no_ability battler:req, ability:req, ptr:req
|
||||
check_ability \battler, \ability
|
||||
if_equal 0, \ptr
|
||||
.endm
|
||||
|
||||
.macro if_type battler:req, type:req, ptr:req
|
||||
is_of_type \battler, \type
|
||||
if_equal 1, \ptr
|
||||
.endm
|
||||
|
||||
.macro if_no_type battler:req, type:req, ptr:req
|
||||
is_of_type \battler, \type
|
||||
if_equal 0, \ptr
|
||||
.endm
|
||||
|
||||
.macro if_target_faster ptr:req
|
||||
if_user_goes 1, \ptr
|
||||
.endm
|
||||
|
||||
.macro if_user_faster ptr:req
|
||||
if_user_goes 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
|
||||
|
||||
.macro call_if_always_hit ptr:req
|
||||
get_move_accuracy
|
||||
call_if_eq 0, \ptr
|
||||
.endm
|
||||
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
@@ -545,7 +545,7 @@ struct ZMoveData
|
||||
u8 active:1; // is z move being used this turn
|
||||
u8 zStatusActive:1;
|
||||
u8 healReplacement:1;
|
||||
u8 activeSplit:2; // active z move split
|
||||
u8 activeCategory:2; // active z move category
|
||||
u8 zUnused:1;
|
||||
u8 triggerSpriteId;
|
||||
u8 possibleZMoves[MAX_BATTLERS_COUNT];
|
||||
@@ -554,7 +554,7 @@ struct ZMoveData
|
||||
u8 used[MAX_BATTLERS_COUNT]; //one per bank for multi-battles
|
||||
u16 toBeUsed[MAX_BATTLERS_COUNT]; // z moves per battler to be used
|
||||
u16 baseMoves[MAX_BATTLERS_COUNT];
|
||||
u8 splits[MAX_BATTLERS_COUNT];
|
||||
u8 categories[MAX_BATTLERS_COUNT];
|
||||
};
|
||||
|
||||
struct DynamaxData
|
||||
@@ -566,8 +566,8 @@ struct DynamaxData
|
||||
bool8 dynamaxed[MAX_BATTLERS_COUNT];
|
||||
u8 dynamaxTurns[MAX_BATTLERS_COUNT];
|
||||
u8 usingMaxMove[MAX_BATTLERS_COUNT];
|
||||
u8 activeSplit;
|
||||
u8 splits[MAX_BATTLERS_COUNT];
|
||||
u8 activeCategory;
|
||||
u8 categories[MAX_BATTLERS_COUNT];
|
||||
u16 baseMove[MAX_BATTLERS_COUNT]; // base move of Max Move
|
||||
u16 lastUsedBaseMove;
|
||||
u16 levelUpHP;
|
||||
@@ -761,9 +761,9 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER
|
||||
typeArg = gBattleMoves[move].type; \
|
||||
}
|
||||
|
||||
#define IS_MOVE_PHYSICAL(move)(GetBattleMoveSplit(move) == SPLIT_PHYSICAL)
|
||||
#define IS_MOVE_SPECIAL(move)(GetBattleMoveSplit(move) == SPLIT_SPECIAL)
|
||||
#define IS_MOVE_STATUS(move)(gBattleMoves[move].split == SPLIT_STATUS)
|
||||
#define IS_MOVE_PHYSICAL(move)(GetBattleMoveCategory(move) == BATTLE_CATEGORY_PHYSICAL)
|
||||
#define IS_MOVE_SPECIAL(move)(GetBattleMoveCategory(move) == BATTLE_CATEGORY_SPECIAL)
|
||||
#define IS_MOVE_STATUS(move)(gBattleMoves[move].category == BATTLE_CATEGORY_STATUS)
|
||||
|
||||
#define IS_EFFECT_RECOIL(effect)(effect == EFFECT_RECOIL || effect == EFFECT_RECOIL_IF_MISS)
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility);
|
||||
|
||||
// move checks
|
||||
bool32 IsAffectedByPowder(u32 battler, u32 ability, u32 holdEffect);
|
||||
bool32 MovesWithSplitUnusable(u32 attacker, u32 target, u32 split);
|
||||
bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category);
|
||||
u32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo);
|
||||
s32 AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectiveness, bool32 considerZPower);
|
||||
s32 AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectiveness, bool32 considerZPower, u32 weather);
|
||||
@@ -98,10 +98,9 @@ u32 AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef);
|
||||
u16 *GetMovesArray(u32 battler);
|
||||
bool32 IsConfusionMoveEffect(u32 moveEffect);
|
||||
bool32 HasMove(u32 battlerId, u32 move);
|
||||
bool32 HasOnlyMovesWithSplit(u32 battlerId, u32 split, bool32 onlyOffensive);
|
||||
bool32 HasMoveWithSplit(u32 battler, u32 split);
|
||||
bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensive);
|
||||
bool32 HasMoveWithCategory(u32 battler, u32 category);
|
||||
bool32 HasMoveWithType(u32 battler, u32 type);
|
||||
bool32 HasMoveWithTypeAndSplit(u32 battler, u32 type, u32 split);
|
||||
bool32 HasMoveEffect(u32 battlerId, u32 moveEffect);
|
||||
bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect);
|
||||
bool32 IsAromaVeilProtectedMove(u32 move);
|
||||
@@ -177,8 +176,8 @@ struct BattlePokemon *AllocSaveBattleMons(void);
|
||||
void FreeRestoreBattleMons(struct BattlePokemon *savedBattleMons);
|
||||
s32 CountUsablePartyMons(u32 battlerId);
|
||||
bool32 IsPartyFullyHealedExceptBattler(u32 battler);
|
||||
bool32 PartyHasMoveSplit(u32 battlerId, u32 split);
|
||||
bool32 SideHasMoveSplit(u32 battlerId, u32 split);
|
||||
bool32 PartyHasMoveCategory(u32 battlerId, u32 category);
|
||||
bool32 SideHasMoveCategory(u32 battlerId, u32 category);
|
||||
|
||||
// score increases
|
||||
void IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, u32 statId, s32 *score);
|
||||
|
||||
@@ -193,13 +193,13 @@ struct Pokemon *GetIllusionMonPtr(u32 battler);
|
||||
void ClearIllusionMon(u32 battler);
|
||||
bool32 SetIllusionMon(struct Pokemon *mon, u32 battler);
|
||||
bool32 ShouldGetStatBadgeBoost(u16 flagId, u32 battler);
|
||||
u8 GetBattleMoveSplit(u32 moveId);
|
||||
u8 GetBattleMoveCategory(u32 moveId);
|
||||
bool32 CanFling(u32 battler);
|
||||
bool32 IsTelekinesisBannedSpecies(u16 species);
|
||||
bool32 IsHealBlockPreventingMove(u32 battler, u32 move);
|
||||
bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId);
|
||||
bool32 IsPartnerMonFromSameTrainer(u32 battler);
|
||||
u8 GetSplitBasedOnStats(u32 battler);
|
||||
u8 GetCategoryBasedOnStats(u32 battler);
|
||||
bool32 TestSheerForceFlag(u32 battler, u16 move);
|
||||
void TryRestoreHeldItems(void);
|
||||
bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item);
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
#define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a Pokémon, as opposing to waiting for the animation to end.
|
||||
#define B_FAST_HP_DRAIN TRUE // If set to TRUE, HP bars will move faster to accomodate higher max HP amounts.
|
||||
#define B_SHOW_TARGETS TRUE // If set to TRUE, all available targets, for moves hitting 2 or 3 Pokémon, will be shown before selecting a move.
|
||||
#define B_SHOW_SPLIT_ICON TRUE // If set to TRUE, it will show an icon in the summary showing the move's category split.
|
||||
#define B_SHOW_CATEGORY_ICON TRUE // If set to TRUE, it will show an icon in the summary showing the move's category.
|
||||
#define B_HIDE_HEALTHBOX_IN_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations.
|
||||
#define B_EXPANDED_MOVE_NAMES FALSE // If set to TRUE, move names are increased from 12 characters to 16 characters.
|
||||
#define B_WAIT_TIME_MULTIPLIER 16 // This determines how long text pauses in battle last. Vanilla is 16. Lower values result in faster battles.
|
||||
|
||||
@@ -225,10 +225,10 @@
|
||||
#define EV_ITEM_RAISE_LIMIT 100
|
||||
#endif
|
||||
|
||||
// Split defines.
|
||||
#define SPLIT_PHYSICAL 0x0
|
||||
#define SPLIT_SPECIAL 0x1
|
||||
#define SPLIT_STATUS 0x2
|
||||
// Move category defines.
|
||||
#define BATTLE_CATEGORY_PHYSICAL 0
|
||||
#define BATTLE_CATEGORY_SPECIAL 1
|
||||
#define BATTLE_CATEGORY_STATUS 2
|
||||
|
||||
// Just for readability
|
||||
#define ALWAYS_CRIT 3
|
||||
|
||||
@@ -408,7 +408,7 @@ struct BattleMove
|
||||
u16 effect;
|
||||
u8 power;
|
||||
u8 type:5;
|
||||
u8 split:3;
|
||||
u8 category:3;
|
||||
|
||||
u16 accuracy:7;
|
||||
u16 recoil:7;
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
* PARAMETRIZE { raiseAttack = FALSE; }
|
||||
* PARAMETRIZE { raiseAttack = TRUE; }
|
||||
* GIVEN {
|
||||
* ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
* ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
* PLAYER(SPECIES_WOBBUFFET);
|
||||
* OPPONENT(SPECIES_WOBBUFFET);
|
||||
* } WHEN {
|
||||
@@ -176,7 +176,7 @@
|
||||
* Pokémon we can observe the damage of a physical attack with and
|
||||
* without the burn. To document that this test assumes the attack is
|
||||
* physical we can use:
|
||||
* ASSUME(gBattleMoves[MOVE_WHATEVER].split == SPLIT_PHYSICAL);
|
||||
* ASSUME(gBattleMoves[MOVE_WHATEVER].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
*
|
||||
* ASSUMPTIONS
|
||||
* Should be placed immediately after any #includes and contain any
|
||||
|
||||
@@ -1045,7 +1045,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
case EFFECT_ATTACK_UP:
|
||||
case EFFECT_ATTACK_UP_2:
|
||||
case EFFECT_ATTACK_UP_USER_ALLY:
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-10);
|
||||
break;
|
||||
case EFFECT_STUFF_CHEEKS:
|
||||
@@ -1062,7 +1062,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
case EFFECT_SPECIAL_ATTACK_UP:
|
||||
case EFFECT_SPECIAL_ATTACK_UP_2:
|
||||
case EFFECT_SPECIAL_ATTACK_UP_3:
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK) || !HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL))
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_SPECIAL))
|
||||
ADJUST_SCORE(-10);
|
||||
break;
|
||||
case EFFECT_SPECIAL_DEFENSE_UP:
|
||||
@@ -1088,7 +1088,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
ADJUST_SCORE(-8);
|
||||
break;
|
||||
case EFFECT_BULK_UP:
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_DEF))
|
||||
ADJUST_SCORE(-8);
|
||||
@@ -1100,7 +1100,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
ADJUST_SCORE(-8);
|
||||
break;
|
||||
case EFFECT_DRAGON_DANCE:
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPEED))
|
||||
ADJUST_SCORE(-8);
|
||||
@@ -1108,7 +1108,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
case EFFECT_COIL:
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ACC))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-8);
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_DEF))
|
||||
ADJUST_SCORE(-6);
|
||||
@@ -1117,7 +1117,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
if (aiData->abilities[battlerAtk] != ABILITY_CONTRARY)
|
||||
{
|
||||
if (gBattleMons[battlerAtk].statStages[STAT_ATK] >= MAX_STAT_STAGE
|
||||
&& (gBattleMons[battlerAtk].statStages[STAT_ACC] >= MAX_STAT_STAGE || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL)))
|
||||
&& (gBattleMons[battlerAtk].statStages[STAT_ACC] >= MAX_STAT_STAGE || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL)))
|
||||
ADJUST_SCORE(-10);
|
||||
break;
|
||||
}
|
||||
@@ -1137,7 +1137,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
break;
|
||||
case EFFECT_QUIVER_DANCE:
|
||||
case EFFECT_GEOMANCY:
|
||||
if (gBattleMons[battlerAtk].statStages[STAT_SPATK] >= MAX_STAT_STAGE || !HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL))
|
||||
if (gBattleMons[battlerAtk].statStages[STAT_SPATK] >= MAX_STAT_STAGE || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_SPECIAL))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPEED))
|
||||
ADJUST_SCORE(-8);
|
||||
@@ -1145,7 +1145,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
ADJUST_SCORE(-6);
|
||||
break;
|
||||
case EFFECT_VICTORY_DANCE:
|
||||
if (gBattleMons[battlerAtk].statStages[STAT_ATK] >= MAX_STAT_STAGE || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
if (gBattleMons[battlerAtk].statStages[STAT_ATK] >= MAX_STAT_STAGE || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPEED))
|
||||
ADJUST_SCORE(-8);
|
||||
@@ -1153,7 +1153,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
ADJUST_SCORE(-6);
|
||||
break;
|
||||
case EFFECT_SHIFT_GEAR:
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPEED))
|
||||
ADJUST_SCORE(-8);
|
||||
@@ -1168,9 +1168,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK) || !HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL))
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_SPECIAL))
|
||||
ADJUST_SCORE(-8);
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPEED))
|
||||
ADJUST_SCORE(-6);
|
||||
@@ -1208,9 +1208,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
if (aiData->abilities[battlerAtk] == ABILITY_PLUS || aiData->abilities[battlerAtk] == ABILITY_MINUS)
|
||||
{
|
||||
// same as growth, work up
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK) || !HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL))
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_SPECIAL))
|
||||
ADJUST_SCORE(-8);
|
||||
break;
|
||||
}
|
||||
@@ -1223,8 +1223,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
{
|
||||
if (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_PLUS || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_MINUS)
|
||||
{
|
||||
if ((!BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_ATK) || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
&& (!BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_SPATK) || !HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL)))
|
||||
if ((!BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_ATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
&& (!BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_SPATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_SPECIAL)))
|
||||
ADJUST_SCORE(-10);
|
||||
}
|
||||
else if (aiData->abilities[battlerAtk] != ABILITY_PLUS && aiData->abilities[battlerAtk] != ABILITY_MINUS)
|
||||
@@ -1268,7 +1268,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
// stat lowering effects
|
||||
case EFFECT_ATTACK_DOWN:
|
||||
case EFFECT_ATTACK_DOWN_2:
|
||||
if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) //|| !HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL))
|
||||
if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_ATK)) //|| !HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (aiData->abilities[battlerDef] == ABILITY_HYPER_CUTTER)
|
||||
ADJUST_SCORE(-10);
|
||||
@@ -1287,7 +1287,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
break;
|
||||
case EFFECT_SPECIAL_ATTACK_DOWN:
|
||||
case EFFECT_SPECIAL_ATTACK_DOWN_2:
|
||||
if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) //|| !HasMoveWithSplit(battlerDef, SPLIT_SPECIAL))
|
||||
if (!ShouldLowerStat(battlerDef, aiData->abilities[battlerDef], STAT_SPATK)) //|| !HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_SPECIAL))
|
||||
ADJUST_SCORE(-10);
|
||||
break;
|
||||
case EFFECT_SPECIAL_DEFENSE_DOWN:
|
||||
@@ -1374,7 +1374,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
case EFFECT_MIRROR_COAT:
|
||||
if (IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION))
|
||||
ADJUST_SCORE(-1);
|
||||
if (predictedMove == MOVE_NONE || GetBattleMoveSplit(predictedMove) == SPLIT_STATUS
|
||||
if (predictedMove == MOVE_NONE || GetBattleMoveCategory(predictedMove) == BATTLE_CATEGORY_STATUS
|
||||
|| DoesSubstituteBlockMove(battlerAtk, BATTLE_PARTNER(battlerDef), predictedMove))
|
||||
ADJUST_SCORE(-10);
|
||||
break;
|
||||
@@ -1519,7 +1519,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
}
|
||||
else // regular curse
|
||||
{
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_DEF))
|
||||
ADJUST_SCORE(-8);
|
||||
@@ -2176,7 +2176,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
case EFFECT_POWER_TRICK:
|
||||
if (IS_TARGETING_PARTNER(battlerAtk, battlerDef))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (gBattleMons[battlerAtk].defense >= gBattleMons[battlerAtk].attack && !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
else if (gBattleMons[battlerAtk].defense >= gBattleMons[battlerAtk].attack && !HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-10);
|
||||
break;
|
||||
case EFFECT_POWER_SWAP: // Don't use if attacker's stat stages are higher than opponents
|
||||
@@ -2814,7 +2814,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
break;
|
||||
case ABILITY_LIGHTNING_ROD:
|
||||
if (moveType == TYPE_ELECTRIC
|
||||
&& HasMoveWithSplit(battlerAtkPartner, SPLIT_SPECIAL)
|
||||
&& HasMoveWithCategory(battlerAtkPartner, BATTLE_CATEGORY_SPECIAL)
|
||||
&& BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_SPATK))
|
||||
{
|
||||
RETURN_SCORE_PLUS(1);
|
||||
@@ -2829,7 +2829,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
break; // handled in AI_HPAware
|
||||
case ABILITY_STORM_DRAIN:
|
||||
if (moveType == TYPE_WATER
|
||||
&& HasMoveWithSplit(battlerAtkPartner, SPLIT_SPECIAL)
|
||||
&& HasMoveWithCategory(battlerAtkPartner, BATTLE_CATEGORY_SPECIAL)
|
||||
&& BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_SPATK))
|
||||
{
|
||||
RETURN_SCORE_PLUS(1);
|
||||
@@ -2852,7 +2852,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
break;
|
||||
case ABILITY_SAP_SIPPER:
|
||||
if (moveType == TYPE_GRASS
|
||||
&& HasMoveWithSplit(battlerAtkPartner, SPLIT_PHYSICAL)
|
||||
&& HasMoveWithCategory(battlerAtkPartner, BATTLE_CATEGORY_PHYSICAL)
|
||||
&& BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK))
|
||||
{
|
||||
RETURN_SCORE_PLUS(1);
|
||||
@@ -2861,7 +2861,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
case ABILITY_JUSTIFIED:
|
||||
if (moveType == TYPE_DARK
|
||||
&& !IS_MOVE_STATUS(move)
|
||||
&& HasMoveWithSplit(battlerAtkPartner, SPLIT_PHYSICAL)
|
||||
&& HasMoveWithCategory(battlerAtkPartner, BATTLE_CATEGORY_PHYSICAL)
|
||||
&& BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK)
|
||||
&& !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, AI_THINKING_STRUCT->movesetIndex, 1))
|
||||
{
|
||||
@@ -2913,7 +2913,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
break;
|
||||
case EFFECT_SWAGGER:
|
||||
if (gBattleMons[battlerAtkPartner].statStages[STAT_ATK] < MAX_STAT_STAGE
|
||||
&& HasMoveWithSplit(battlerAtkPartner, SPLIT_PHYSICAL)
|
||||
&& HasMoveWithCategory(battlerAtkPartner, BATTLE_CATEGORY_PHYSICAL)
|
||||
&& (!AI_CanBeConfused(battlerAtkPartner, TRUE)
|
||||
|| atkPartnerHoldEffect == HOLD_EFFECT_CURE_CONFUSION
|
||||
|| atkPartnerHoldEffect == HOLD_EFFECT_CURE_STATUS))
|
||||
@@ -2923,7 +2923,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
break;
|
||||
case EFFECT_FLATTER:
|
||||
if (gBattleMons[battlerAtkPartner].statStages[STAT_SPATK] < MAX_STAT_STAGE
|
||||
&& HasMoveWithSplit(battlerAtkPartner, SPLIT_SPECIAL)
|
||||
&& HasMoveWithCategory(battlerAtkPartner, BATTLE_CATEGORY_SPECIAL)
|
||||
&& (!AI_CanBeConfused(battlerAtkPartner, TRUE)
|
||||
|| atkPartnerHoldEffect == HOLD_EFFECT_CURE_CONFUSION
|
||||
|| atkPartnerHoldEffect == HOLD_EFFECT_CURE_STATUS))
|
||||
@@ -2935,7 +2935,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
if (atkPartnerAbility == ABILITY_JUSTIFIED
|
||||
&& moveType == TYPE_DARK
|
||||
&& !IS_MOVE_STATUS(move)
|
||||
&& HasMoveWithSplit(battlerAtkPartner, SPLIT_PHYSICAL)
|
||||
&& HasMoveWithCategory(battlerAtkPartner, BATTLE_CATEGORY_PHYSICAL)
|
||||
&& BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK)
|
||||
&& !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, AI_THINKING_STRUCT->movesetIndex, 0))
|
||||
{
|
||||
@@ -3200,7 +3200,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
u32 i;
|
||||
|
||||
// The AI should understand that while Dynamaxed, status moves function like Protect.
|
||||
if (IsDynamaxed(battlerAtk) && gBattleMoves[move].split == SPLIT_STATUS)
|
||||
if (IsDynamaxed(battlerAtk) && gBattleMoves[move].category == BATTLE_CATEGORY_STATUS)
|
||||
moveEffect = EFFECT_PROTECT;
|
||||
|
||||
// Targeting partner, check benefits of doing that instead
|
||||
@@ -3241,8 +3241,8 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
// check burn / frostbite
|
||||
if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_SMART_SWITCHING && AI_DATA->abilities[battlerAtk] == ABILITY_NATURAL_CURE)
|
||||
{
|
||||
if ((gBattleMons[battlerAtk].status1 & STATUS1_BURN && HasOnlyMovesWithSplit(battlerAtk, SPLIT_PHYSICAL, TRUE))
|
||||
|| (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE && HasOnlyMovesWithSplit(battlerAtk, SPLIT_SPECIAL, TRUE)))
|
||||
if ((gBattleMons[battlerAtk].status1 & STATUS1_BURN && HasOnlyMovesWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL, TRUE))
|
||||
|| (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE && HasOnlyMovesWithCategory(battlerAtk, BATTLE_CATEGORY_SPECIAL, TRUE)))
|
||||
ADJUST_SCORE(-20); // Force switch if all your attacking moves are physical and you have Natural Cure.
|
||||
}
|
||||
|
||||
@@ -3275,7 +3275,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
case EFFECT_ATTACK_UP:
|
||||
case EFFECT_ATTACK_UP_2:
|
||||
case EFFECT_ATTACK_UP_USER_ALLY:
|
||||
if (MovesWithSplitUnusable(battlerAtk, battlerDef, SPLIT_PHYSICAL))
|
||||
if (MovesWithCategoryUnusable(battlerAtk, battlerDef, BATTLE_CATEGORY_PHYSICAL))
|
||||
{
|
||||
ADJUST_SCORE(-8);
|
||||
break;
|
||||
@@ -3297,7 +3297,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
case EFFECT_DEFENSE_UP:
|
||||
case EFFECT_DEFENSE_UP_2:
|
||||
case EFFECT_DEFENSE_UP_3:
|
||||
if (!HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL))
|
||||
if (!HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(-2);
|
||||
if (aiData->hpPercents[battlerAtk] > 90 && AI_RandLessThan(128))
|
||||
ADJUST_SCORE(2);
|
||||
@@ -3321,7 +3321,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
case EFFECT_SPECIAL_ATTACK_UP:
|
||||
case EFFECT_SPECIAL_ATTACK_UP_2:
|
||||
case EFFECT_SPECIAL_ATTACK_UP_3:
|
||||
if (MovesWithSplitUnusable(battlerAtk, battlerDef, SPLIT_SPECIAL))
|
||||
if (MovesWithCategoryUnusable(battlerAtk, battlerDef, BATTLE_CATEGORY_SPECIAL))
|
||||
{
|
||||
ADJUST_SCORE(-8);
|
||||
break;
|
||||
@@ -3342,7 +3342,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
break;
|
||||
case EFFECT_SPECIAL_DEFENSE_UP:
|
||||
case EFFECT_SPECIAL_DEFENSE_UP_2:
|
||||
if (!HasMoveWithSplit(battlerDef, SPLIT_SPECIAL))
|
||||
if (!HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_SPECIAL))
|
||||
ADJUST_SCORE(-2);
|
||||
if (aiData->hpPercents[battlerAtk] > 90 && AI_RandLessThan(128))
|
||||
ADJUST_SCORE(2);
|
||||
@@ -3483,9 +3483,9 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
if (aiData->hpPercents[battlerAtk] <= 40 || aiData->abilities[battlerAtk] == ABILITY_CONTRARY)
|
||||
break;
|
||||
|
||||
if (HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
if (HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
IncreaseStatUpScore(battlerAtk, battlerDef, STAT_ATK, &score);
|
||||
else if (HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL))
|
||||
else if (HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_SPECIAL))
|
||||
IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPATK, &score);
|
||||
break;
|
||||
case EFFECT_HAZE:
|
||||
@@ -3700,7 +3700,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
if (CountUsablePartyMons(battlerAtk) == 0)
|
||||
break; // Can't switch
|
||||
|
||||
//if (switchAbility == ABILITY_INTIMIDATE && PartyHasMoveSplit(battlerDef, SPLIT_PHYSICAL))
|
||||
//if (switchAbility == ABILITY_INTIMIDATE && PartyHasMoveCategory(battlerDef, BATTLE_CATEGORY_PHYSICAL))
|
||||
//ADJUST_SCORE(7);
|
||||
}
|
||||
break;
|
||||
@@ -4041,7 +4041,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
}
|
||||
break;
|
||||
case EFFECT_BELLY_DRUM:
|
||||
if (!CanTargetFaintAi(battlerDef, battlerAtk) && HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL) && aiData->abilities[battlerAtk] != ABILITY_CONTRARY)
|
||||
if (!CanTargetFaintAi(battlerDef, battlerAtk) && HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL) && aiData->abilities[battlerAtk] != ABILITY_CONTRARY)
|
||||
score += (MAX_STAT_STAGE - gBattleMons[battlerAtk].statStages[STAT_ATK]);
|
||||
break;
|
||||
case EFFECT_PSYCH_UP:
|
||||
@@ -4054,11 +4054,11 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
switch (i)
|
||||
{
|
||||
case STAT_ATK:
|
||||
if (HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
if (HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(1);
|
||||
break;
|
||||
case STAT_SPATK:
|
||||
if (HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL))
|
||||
if (HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_SPECIAL))
|
||||
ADJUST_SCORE(1);
|
||||
break;
|
||||
case STAT_ACC:
|
||||
@@ -4237,7 +4237,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
case EFFECT_TAUNT:
|
||||
if (IS_MOVE_STATUS(predictedMove))
|
||||
ADJUST_SCORE(3);
|
||||
else if (HasMoveWithSplit(battlerDef, SPLIT_STATUS))
|
||||
else if (HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_STATUS))
|
||||
ADJUST_SCORE(2);
|
||||
break;
|
||||
case EFFECT_TRICK:
|
||||
@@ -4248,11 +4248,11 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
ADJUST_SCORE(2); // assume its beneficial
|
||||
break;
|
||||
case HOLD_EFFECT_CHOICE_BAND:
|
||||
if (!HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL))
|
||||
if (!HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(2);
|
||||
break;
|
||||
case HOLD_EFFECT_CHOICE_SPECS:
|
||||
if (!HasMoveWithSplit(battlerDef, SPLIT_SPECIAL))
|
||||
if (!HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_SPECIAL))
|
||||
ADJUST_SCORE(2);
|
||||
break;
|
||||
case HOLD_EFFECT_TOXIC_ORB:
|
||||
@@ -4458,7 +4458,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
ADJUST_SCORE(1);
|
||||
break;
|
||||
case EFFECT_TICKLE:
|
||||
if (gBattleMons[battlerDef].statStages[STAT_DEF] > 4 && HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL)
|
||||
if (gBattleMons[battlerDef].statStages[STAT_DEF] > 4 && HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL)
|
||||
&& aiData->abilities[battlerDef] != ABILITY_CONTRARY && ShouldLowerDefense(battlerAtk, battlerDef, aiData->abilities[battlerDef]))
|
||||
{
|
||||
ADJUST_SCORE(2);
|
||||
@@ -4526,7 +4526,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
case EFFECT_POWER_TRICK:
|
||||
if (!(gStatuses3[battlerAtk] & STATUS3_POWER_TRICK))
|
||||
{
|
||||
if (gBattleMons[battlerAtk].defense > gBattleMons[battlerAtk].attack && HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
|
||||
if (gBattleMons[battlerAtk].defense > gBattleMons[battlerAtk].attack && HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL))
|
||||
ADJUST_SCORE(2);
|
||||
break;
|
||||
}
|
||||
@@ -4626,8 +4626,8 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
ADJUST_SCORE(1);
|
||||
break;
|
||||
case EFFECT_WONDER_ROOM:
|
||||
if ((HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL) && gBattleMons[battlerAtk].defense < gBattleMons[battlerAtk].spDefense)
|
||||
|| (HasMoveWithSplit(battlerDef, SPLIT_SPECIAL) && gBattleMons[battlerAtk].spDefense < gBattleMons[battlerAtk].defense))
|
||||
if ((HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_PHYSICAL) && gBattleMons[battlerAtk].defense < gBattleMons[battlerAtk].spDefense)
|
||||
|| (HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_SPECIAL) && gBattleMons[battlerAtk].spDefense < gBattleMons[battlerAtk].defense))
|
||||
ADJUST_SCORE(2);
|
||||
break;
|
||||
case EFFECT_GRAVITY:
|
||||
@@ -4791,7 +4791,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
{
|
||||
if (gDisableStructs[battlerDef].tauntTimer != 0)
|
||||
ADJUST_SCORE(1); // target must use damaging move
|
||||
if (GetNoOfHitsToKOBattler(battlerDef, battlerAtk, predictedMoveSlot) >= 2 && GetBattleMoveSplit(predictedMove) == SPLIT_PHYSICAL)
|
||||
if (GetNoOfHitsToKOBattler(battlerDef, battlerAtk, predictedMoveSlot) >= 2 && GetBattleMoveCategory(predictedMove) == BATTLE_CATEGORY_PHYSICAL)
|
||||
ADJUST_SCORE(3);
|
||||
}
|
||||
break;
|
||||
@@ -4800,7 +4800,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
||||
{
|
||||
if (gDisableStructs[battlerDef].tauntTimer != 0)
|
||||
ADJUST_SCORE(1); // target must use damaging move
|
||||
if (GetNoOfHitsToKOBattler(battlerDef, battlerAtk, predictedMoveSlot) >= 2 && GetBattleMoveSplit(predictedMove) == SPLIT_SPECIAL)
|
||||
if (GetNoOfHitsToKOBattler(battlerDef, battlerAtk, predictedMoveSlot) >= 2 && GetBattleMoveCategory(predictedMove) == BATTLE_CATEGORY_SPECIAL)
|
||||
ADJUST_SCORE(3);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -655,7 +655,7 @@ bool32 IsAffectedByPowder(u32 battler, u32 ability, u32 holdEffect)
|
||||
|
||||
// This function checks if all physical/special moves are either unusable or unreasonable to use.
|
||||
// Consider a pokemon boosting their attack against a ghost pokemon having only normal-type physical attacks.
|
||||
bool32 MovesWithSplitUnusable(u32 attacker, u32 target, u32 split)
|
||||
bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category)
|
||||
{
|
||||
s32 i, moveType;
|
||||
u32 usable = 0;
|
||||
@@ -666,7 +666,7 @@ bool32 MovesWithSplitUnusable(u32 attacker, u32 target, u32 split)
|
||||
{
|
||||
if (moves[i] != MOVE_NONE
|
||||
&& moves[i] != MOVE_UNAVAILABLE
|
||||
&& GetBattleMoveSplit(moves[i]) == split
|
||||
&& GetBattleMoveCategory(moves[i]) == category
|
||||
&& !(unusable & gBitTable[i]))
|
||||
{
|
||||
SetTypeBeforeUsingMove(moves[i], attacker);
|
||||
@@ -1770,7 +1770,7 @@ bool32 ShouldLowerAttack(u32 battlerAtk, u32 battlerDef, u32 defAbility)
|
||||
return FALSE; // Don't bother lowering stats if can kill enemy.
|
||||
|
||||
if (gBattleMons[battlerDef].statStages[STAT_ATK] > 4
|
||||
&& HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL)
|
||||
&& HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_PHYSICAL)
|
||||
&& defAbility != ABILITY_CONTRARY
|
||||
&& defAbility != ABILITY_CLEAR_BODY
|
||||
&& defAbility != ABILITY_WHITE_SMOKE
|
||||
@@ -1787,7 +1787,7 @@ bool32 ShouldLowerDefense(u32 battlerAtk, u32 battlerDef, u32 defAbility)
|
||||
return FALSE; // Don't bother lowering stats if can kill enemy.
|
||||
|
||||
if (gBattleMons[battlerDef].statStages[STAT_DEF] > 4
|
||||
&& HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL)
|
||||
&& HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL)
|
||||
&& defAbility != ABILITY_CONTRARY
|
||||
&& defAbility != ABILITY_CLEAR_BODY
|
||||
&& defAbility != ABILITY_WHITE_SMOKE
|
||||
@@ -1819,7 +1819,7 @@ bool32 ShouldLowerSpAtk(u32 battlerAtk, u32 battlerDef, u32 defAbility)
|
||||
return FALSE; // Don't bother lowering stats if can kill enemy.
|
||||
|
||||
if (gBattleMons[battlerDef].statStages[STAT_SPATK] > 4
|
||||
&& HasMoveWithSplit(battlerDef, SPLIT_SPECIAL)
|
||||
&& HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_SPECIAL)
|
||||
&& defAbility != ABILITY_CONTRARY
|
||||
&& defAbility != ABILITY_CLEAR_BODY
|
||||
&& defAbility != ABILITY_FULL_METAL_BODY
|
||||
@@ -1835,7 +1835,7 @@ bool32 ShouldLowerSpDef(u32 battlerAtk, u32 battlerDef, u32 defAbility)
|
||||
return FALSE; // Don't bother lowering stats if can kill enemy.
|
||||
|
||||
if (gBattleMons[battlerDef].statStages[STAT_SPDEF] > 4
|
||||
&& HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL)
|
||||
&& HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_SPECIAL)
|
||||
&& defAbility != ABILITY_CONTRARY
|
||||
&& defAbility != ABILITY_CLEAR_BODY
|
||||
&& defAbility != ABILITY_FULL_METAL_BODY
|
||||
@@ -1896,7 +1896,7 @@ u16 *GetMovesArray(u32 battler)
|
||||
return gBattleResources->battleHistory->usedMoves[battler];
|
||||
}
|
||||
|
||||
bool32 HasOnlyMovesWithSplit(u32 battlerId, u32 split, bool32 onlyOffensive)
|
||||
bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensive)
|
||||
{
|
||||
u32 i;
|
||||
u16 *moves = GetMovesArray(battlerId);
|
||||
@@ -1905,21 +1905,21 @@ bool32 HasOnlyMovesWithSplit(u32 battlerId, u32 split, bool32 onlyOffensive)
|
||||
{
|
||||
if (onlyOffensive && IS_MOVE_STATUS(moves[i]))
|
||||
continue;
|
||||
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetBattleMoveSplit(moves[i]) != split)
|
||||
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetBattleMoveCategory(moves[i]) != category)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 HasMoveWithSplit(u32 battler, u32 split)
|
||||
bool32 HasMoveWithCategory(u32 battler, u32 category)
|
||||
{
|
||||
u32 i;
|
||||
u16 *moves = GetMovesArray(battler);
|
||||
|
||||
for (i = 0; i < MAX_MON_MOVES; i++)
|
||||
{
|
||||
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetBattleMoveSplit(moves[i]) == split)
|
||||
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetBattleMoveCategory(moves[i]) == category)
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
@@ -2466,11 +2466,11 @@ static bool32 AnyUsefulStatIsRaised(u32 battler)
|
||||
switch (statId)
|
||||
{
|
||||
case STAT_ATK:
|
||||
if (HasMoveWithSplit(battler, SPLIT_PHYSICAL))
|
||||
if (HasMoveWithCategory(battler, BATTLE_CATEGORY_PHYSICAL))
|
||||
return TRUE;
|
||||
break;
|
||||
case STAT_SPATK:
|
||||
if (HasMoveWithSplit(battler, SPLIT_SPECIAL))
|
||||
if (HasMoveWithCategory(battler, BATTLE_CATEGORY_SPECIAL))
|
||||
return TRUE;
|
||||
break;
|
||||
case STAT_SPEED:
|
||||
@@ -2773,7 +2773,7 @@ bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move
|
||||
|
||||
static bool32 AI_CanPoisonType(u32 battlerAttacker, u32 battlerTarget, u32 move)
|
||||
{
|
||||
return ((AI_DATA->abilities[battlerAttacker] == ABILITY_CORROSION && gBattleMoves[move].split == SPLIT_STATUS)
|
||||
return ((AI_DATA->abilities[battlerAttacker] == ABILITY_CORROSION && gBattleMoves[move].category == BATTLE_CATEGORY_STATUS)
|
||||
|| !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON) || IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL)));
|
||||
}
|
||||
|
||||
@@ -2801,8 +2801,8 @@ bool32 ShouldPoisonSelf(u32 battler, u32 ability)
|
||||
|| ability == ABILITY_POISON_HEAL
|
||||
|| ability == ABILITY_QUICK_FEET
|
||||
|| ability == ABILITY_MAGIC_GUARD
|
||||
|| (ability == ABILITY_TOXIC_BOOST && HasMoveWithSplit(battler, SPLIT_PHYSICAL))
|
||||
|| (ability == ABILITY_GUTS && HasMoveWithSplit(battler, SPLIT_PHYSICAL))
|
||||
|| (ability == ABILITY_TOXIC_BOOST && HasMoveWithCategory(battler, BATTLE_CATEGORY_PHYSICAL))
|
||||
|| (ability == ABILITY_GUTS && HasMoveWithCategory(battler, BATTLE_CATEGORY_PHYSICAL))
|
||||
|| HasMoveEffect(battler, EFFECT_FACADE)
|
||||
|| HasMoveEffect(battler, EFFECT_PSYCHO_SHIFT)))
|
||||
return TRUE; // battler can be poisoned and has move/ability that synergizes with being poisoned
|
||||
@@ -2900,8 +2900,8 @@ bool32 ShouldBurnSelf(u32 battler, u32 ability)
|
||||
ability == ABILITY_QUICK_FEET
|
||||
|| ability == ABILITY_HEATPROOF
|
||||
|| ability == ABILITY_MAGIC_GUARD
|
||||
|| (ability == ABILITY_FLARE_BOOST && HasMoveWithSplit(battler, SPLIT_SPECIAL))
|
||||
|| (ability == ABILITY_GUTS && HasMoveWithSplit(battler, SPLIT_PHYSICAL))
|
||||
|| (ability == ABILITY_FLARE_BOOST && HasMoveWithCategory(battler, BATTLE_CATEGORY_SPECIAL))
|
||||
|| (ability == ABILITY_GUTS && HasMoveWithCategory(battler, BATTLE_CATEGORY_PHYSICAL))
|
||||
|| HasMoveEffect(battler, EFFECT_FACADE)
|
||||
|| HasMoveEffect(battler, EFFECT_PSYCHO_SHIFT)))
|
||||
return TRUE;
|
||||
@@ -3128,13 +3128,13 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, u32 moveEffect)
|
||||
break;
|
||||
case EFFECT_REFLECT:
|
||||
// Use only if the player has a physical move and AI doesn't already have Reflect itself active.
|
||||
if (HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL)
|
||||
if (HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_PHYSICAL)
|
||||
&& !(gSideStatuses[atkSide] & SIDE_STATUS_REFLECT))
|
||||
return TRUE;
|
||||
break;
|
||||
case EFFECT_LIGHT_SCREEN:
|
||||
// Use only if the player has a special move and AI doesn't already have Light Screen itself active.
|
||||
if (HasMoveWithSplit(battlerDef, SPLIT_SPECIAL)
|
||||
if (HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_SPECIAL)
|
||||
&& !(gSideStatuses[atkSide] & SIDE_STATUS_LIGHTSCREEN))
|
||||
return TRUE;
|
||||
break;
|
||||
@@ -3425,7 +3425,7 @@ bool32 IsPartyFullyHealedExceptBattler(u32 battlerId)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 PartyHasMoveSplit(u32 battlerId, u32 split)
|
||||
bool32 PartyHasMoveCategory(u32 battlerId, u32 category)
|
||||
{
|
||||
struct Pokemon *party = GetBattlerParty(battlerId);
|
||||
u32 i, j;
|
||||
@@ -3443,7 +3443,7 @@ bool32 PartyHasMoveSplit(u32 battlerId, u32 split)
|
||||
if (pp > 0 && move != MOVE_NONE)
|
||||
{
|
||||
//TODO - handle photon geyser, light that burns the sky
|
||||
if (gBattleMoves[move].split == split)
|
||||
if (gBattleMoves[move].category == category)
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
@@ -3452,16 +3452,16 @@ bool32 PartyHasMoveSplit(u32 battlerId, u32 split)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool32 SideHasMoveSplit(u32 battlerId, u32 split)
|
||||
bool32 SideHasMoveCategory(u32 battlerId, u32 category)
|
||||
{
|
||||
if (IsDoubleBattle())
|
||||
{
|
||||
if (HasMoveWithSplit(battlerId, split) || HasMoveWithSplit(BATTLE_PARTNER(battlerId), split))
|
||||
if (HasMoveWithCategory(battlerId, category) || HasMoveWithCategory(BATTLE_PARTNER(battlerId), category))
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (HasMoveWithSplit(battlerId, split))
|
||||
if (HasMoveWithCategory(battlerId, category))
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
@@ -3559,7 +3559,7 @@ void IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, u32 statId, s32 *score)
|
||||
switch (statId)
|
||||
{
|
||||
case STAT_ATK:
|
||||
if (HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL) && AI_DATA->hpPercents[battlerAtk] > 40)
|
||||
if (HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL) && AI_DATA->hpPercents[battlerAtk] > 40)
|
||||
{
|
||||
if (gBattleMons[battlerAtk].statStages[STAT_ATK] < STAT_UP_2_STAGE)
|
||||
ADJUST_SCORE_PTR(2);
|
||||
@@ -3570,7 +3570,7 @@ void IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, u32 statId, s32 *score)
|
||||
ADJUST_SCORE_PTR(1);
|
||||
break;
|
||||
case STAT_DEF:
|
||||
if ((HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL)|| IS_MOVE_PHYSICAL(gLastMoves[battlerDef]))
|
||||
if ((HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_PHYSICAL)|| IS_MOVE_PHYSICAL(gLastMoves[battlerDef]))
|
||||
&& AI_DATA->hpPercents[battlerAtk] > 70)
|
||||
{
|
||||
if (gBattleMons[battlerAtk].statStages[STAT_DEF] < STAT_UP_2_STAGE)
|
||||
@@ -3589,7 +3589,7 @@ void IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, u32 statId, s32 *score)
|
||||
}
|
||||
break;
|
||||
case STAT_SPATK:
|
||||
if (HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL) && AI_DATA->hpPercents[battlerAtk] > 40)
|
||||
if (HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_SPECIAL) && AI_DATA->hpPercents[battlerAtk] > 40)
|
||||
{
|
||||
if (gBattleMons[battlerAtk].statStages[STAT_SPATK] < STAT_UP_2_STAGE)
|
||||
ADJUST_SCORE_PTR(2);
|
||||
@@ -3598,7 +3598,7 @@ void IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, u32 statId, s32 *score)
|
||||
}
|
||||
break;
|
||||
case STAT_SPDEF:
|
||||
if ((HasMoveWithSplit(battlerDef, SPLIT_SPECIAL) || IS_MOVE_SPECIAL(gLastMoves[battlerDef]))
|
||||
if ((HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_SPECIAL) || IS_MOVE_SPECIAL(gLastMoves[battlerDef]))
|
||||
&& AI_DATA->hpPercents[battlerAtk] > 70)
|
||||
{
|
||||
if (gBattleMons[battlerAtk].statStages[STAT_SPDEF] < STAT_UP_2_STAGE)
|
||||
@@ -3658,7 +3658,7 @@ void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score)
|
||||
if (AI_CanBurn(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, AI_DATA->partnerMove))
|
||||
{
|
||||
ADJUST_SCORE_PTR(1); // burning is good
|
||||
if (HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL))
|
||||
if (HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_PHYSICAL))
|
||||
{
|
||||
if (CanTargetFaintAi(battlerDef, battlerAtk))
|
||||
ADJUST_SCORE_PTR(2); // burning the target to stay alive is cool
|
||||
@@ -3737,7 +3737,7 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score
|
||||
if (AI_CanGiveFrostbite(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, AI_DATA->partnerMove))
|
||||
{
|
||||
ADJUST_SCORE_PTR(1); // frostbite is good
|
||||
if (HasMoveWithSplit(battlerDef, SPLIT_SPECIAL))
|
||||
if (HasMoveWithCategory(battlerDef, BATTLE_CATEGORY_SPECIAL))
|
||||
{
|
||||
if (CanTargetFaintAi(battlerDef, battlerAtk))
|
||||
ADJUST_SCORE_PTR(2); // frostbiting the target to stay alive is cool
|
||||
|
||||
@@ -703,7 +703,7 @@ static void HandleInputChooseMove(u32 battler)
|
||||
|
||||
QueueZMove(battler, chosenMove);
|
||||
gBattleStruct->zmove.viewing = FALSE;
|
||||
if (gBattleMoves[moveInfo->moves[gMoveSelectionCursor[battler]]].split != SPLIT_STATUS)
|
||||
if (gBattleMoves[moveInfo->moves[gMoveSelectionCursor[battler]]].category != BATTLE_CATEGORY_STATUS)
|
||||
moveTarget = MOVE_TARGET_SELECTED; //damaging z moves always have selected target
|
||||
}
|
||||
|
||||
|
||||
@@ -322,19 +322,19 @@ u16 GetMaxMove(u16 battlerId, u16 baseMove)
|
||||
{
|
||||
return MOVE_STRUGGLE;
|
||||
}
|
||||
else if (gBattleMoves[baseMove].split == SPLIT_STATUS)
|
||||
else if (gBattleMoves[baseMove].category == BATTLE_CATEGORY_STATUS)
|
||||
{
|
||||
move = MOVE_MAX_GUARD;
|
||||
}
|
||||
else if (gBattleStruct->dynamicMoveType)
|
||||
{
|
||||
move = GetTypeBasedMaxMove(battlerId, gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK);
|
||||
gBattleStruct->dynamax.splits[battlerId] = gBattleMoves[baseMove].split;
|
||||
gBattleStruct->dynamax.categories[battlerId] = gBattleMoves[baseMove].category;
|
||||
}
|
||||
else
|
||||
{
|
||||
move = GetTypeBasedMaxMove(battlerId, gBattleMoves[baseMove].type);
|
||||
gBattleStruct->dynamax.splits[battlerId] = gBattleMoves[baseMove].split;
|
||||
gBattleStruct->dynamax.categories[battlerId] = gBattleMoves[baseMove].category;
|
||||
}
|
||||
|
||||
return move;
|
||||
|
||||
@@ -4673,7 +4673,7 @@ s8 GetMovePriority(u32 battler, u16 move)
|
||||
priority = gBattleMoves[move].priority;
|
||||
|
||||
// Max Guard check
|
||||
if (gBattleStruct->dynamax.usingMaxMove[battler] && gBattleMoves[move].split == SPLIT_STATUS)
|
||||
if (gBattleStruct->dynamax.usingMaxMove[battler] && gBattleMoves[move].category == BATTLE_CATEGORY_STATUS)
|
||||
return gBattleMoves[MOVE_MAX_GUARD].priority;
|
||||
|
||||
if (ability == ABILITY_GALE_WINGS
|
||||
|
||||
@@ -2920,7 +2920,7 @@ void BufferStringBattle(u16 stringID, u32 battler)
|
||||
}
|
||||
break;
|
||||
case STRINGID_USEDMOVE: // pokemon used a move msg
|
||||
if (gBattleStruct->zmove.active && gBattleStruct->zmove.activeSplit != SPLIT_STATUS)
|
||||
if (gBattleStruct->zmove.active && gBattleStruct->zmove.activeCategory != BATTLE_CATEGORY_STATUS)
|
||||
StringCopy(gBattleTextBuff3, GetZMoveName(gBattleMsgDataPtr->currentMove));
|
||||
else if (IsMaxMove(gBattleMsgDataPtr->currentMove))
|
||||
StringCopy(gBattleTextBuff3, GetMaxMoveName(gBattleMsgDataPtr->currentMove));
|
||||
|
||||
@@ -5568,7 +5568,7 @@ static void Cmd_moveend(void)
|
||||
break;
|
||||
case MOVEEND_NUM_HITS:
|
||||
if (gBattlerAttacker != gBattlerTarget
|
||||
&& gBattleMoves[gCurrentMove].split != SPLIT_STATUS
|
||||
&& gBattleMoves[gCurrentMove].category != BATTLE_CATEGORY_STATUS
|
||||
&& !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& TARGET_TURN_DAMAGED)
|
||||
{
|
||||
@@ -8128,7 +8128,7 @@ static bool32 HasAttackerFaintedTarget(void)
|
||||
|
||||
bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget)
|
||||
{
|
||||
return ((GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION && gBattleMoves[gCurrentMove].split == SPLIT_STATUS)
|
||||
return ((GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION && gBattleMoves[gCurrentMove].category == BATTLE_CATEGORY_STATUS)
|
||||
|| !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON) || IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL)));
|
||||
}
|
||||
|
||||
@@ -10202,7 +10202,7 @@ static void Cmd_various(void)
|
||||
case VARIOUS_PHOTON_GEYSER_CHECK:
|
||||
{
|
||||
VARIOUS_ARGS();
|
||||
gBattleStruct->swapDamageCategory = (GetSplitBasedOnStats(battler) == SPLIT_SPECIAL);
|
||||
gBattleStruct->swapDamageCategory = (GetCategoryBasedOnStats(battler) == BATTLE_CATEGORY_SPECIAL);
|
||||
break;
|
||||
}
|
||||
case VARIOUS_SHELL_SIDE_ARM_CHECK: // 0% chance GameFreak actually checks this way according to DaWobblefet, but this is the only functional explanation at the moment
|
||||
@@ -15587,7 +15587,7 @@ bool32 IsMoveAffectedByParentalBond(u32 move, u32 battler)
|
||||
{
|
||||
if (move != MOVE_NONE && move != MOVE_UNAVAILABLE && move != MOVE_STRUGGLE
|
||||
&& !gBattleMoves[move].parentalBondBanned
|
||||
&& gBattleMoves[move].split != SPLIT_STATUS
|
||||
&& gBattleMoves[move].category != BATTLE_CATEGORY_STATUS
|
||||
&& gBattleMoves[move].strikeCount < 2)
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
|
||||
|
||||
@@ -343,7 +343,7 @@ void HandleAction_UseMove(void)
|
||||
if (gBattleStruct->dynamax.usingMaxMove[gBattlerAttacker])
|
||||
{
|
||||
gCurrentMove = gChosenMove = GetMaxMove(gBattlerAttacker, gCurrentMove);
|
||||
gBattleStruct->dynamax.activeSplit = gBattleStruct->dynamax.splits[gBattlerAttacker];
|
||||
gBattleStruct->dynamax.activeCategory = gBattleStruct->dynamax.categories[gBattlerAttacker];
|
||||
}
|
||||
|
||||
moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove);
|
||||
@@ -3768,14 +3768,14 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType)
|
||||
{
|
||||
//attacker has a queued z move
|
||||
gBattleStruct->zmove.active = TRUE;
|
||||
gBattleStruct->zmove.activeSplit = gBattleStruct->zmove.splits[gBattlerAttacker];
|
||||
gBattleStruct->zmove.activeCategory = gBattleStruct->zmove.categories[gBattlerAttacker];
|
||||
RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_Z_CRYSTAL);
|
||||
gBattleStruct->zmove.used[gBattlerAttacker] = TRUE;
|
||||
if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsPartnerMonFromSameTrainer(gBattlerAttacker))
|
||||
gBattleStruct->zmove.used[BATTLE_PARTNER(gBattlerAttacker)] = TRUE; //if 1v1 double, set partner used flag as well
|
||||
|
||||
gBattleScripting.battler = gBattlerAttacker;
|
||||
if (gBattleStruct->zmove.activeSplit == SPLIT_STATUS)
|
||||
if (gBattleStruct->zmove.activeCategory == BATTLE_CATEGORY_STATUS)
|
||||
{
|
||||
gBattleStruct->zmove.effect = gBattleMoves[gBattleStruct->zmove.baseMoves[gBattlerAttacker]].zMove.effect;
|
||||
BattleScriptPushCursor();
|
||||
@@ -6663,13 +6663,13 @@ static u8 TrySetEnigmaBerry(u32 battler)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u8 DamagedStatBoostBerryEffect(u32 battler, u8 statId, u8 split)
|
||||
static u8 DamagedStatBoostBerryEffect(u32 battler, u8 statId, u8 category)
|
||||
{
|
||||
if (IsBattlerAlive(battler)
|
||||
&& CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)
|
||||
&& (gBattleScripting.overrideBerryRequirements
|
||||
|| (!DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove)
|
||||
&& GetBattleMoveSplit(gCurrentMove) == split
|
||||
&& GetBattleMoveCategory(gCurrentMove) == category
|
||||
&& TARGET_TURN_DAMAGED))
|
||||
)
|
||||
{
|
||||
@@ -6944,11 +6944,11 @@ static u8 ItemEffectMoveEnd(u32 battler, u16 holdEffect)
|
||||
break;
|
||||
case HOLD_EFFECT_KEE_BERRY: // consume and boost defense if used physical move
|
||||
if (B_BERRIES_INSTANT >= GEN_4)
|
||||
effect = DamagedStatBoostBerryEffect(battler, STAT_DEF, SPLIT_PHYSICAL);
|
||||
effect = DamagedStatBoostBerryEffect(battler, STAT_DEF, BATTLE_CATEGORY_PHYSICAL);
|
||||
break;
|
||||
case HOLD_EFFECT_MARANGA_BERRY: // consume and boost sp. defense if used special move
|
||||
if (B_BERRIES_INSTANT >= GEN_4)
|
||||
effect = DamagedStatBoostBerryEffect(battler, STAT_SPDEF, SPLIT_SPECIAL);
|
||||
effect = DamagedStatBoostBerryEffect(battler, STAT_SPDEF, BATTLE_CATEGORY_SPECIAL);
|
||||
break;
|
||||
case HOLD_EFFECT_RANDOM_STAT_UP:
|
||||
if (B_BERRIES_INSTANT >= GEN_4)
|
||||
@@ -7928,10 +7928,10 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn)
|
||||
}
|
||||
break;
|
||||
case HOLD_EFFECT_KEE_BERRY: // consume and boost defense if used physical move
|
||||
effect = DamagedStatBoostBerryEffect(battler, STAT_DEF, SPLIT_PHYSICAL);
|
||||
effect = DamagedStatBoostBerryEffect(battler, STAT_DEF, BATTLE_CATEGORY_PHYSICAL);
|
||||
break;
|
||||
case HOLD_EFFECT_MARANGA_BERRY: // consume and boost sp. defense if used special move
|
||||
effect = DamagedStatBoostBerryEffect(battler, STAT_SPDEF, SPLIT_SPECIAL);
|
||||
effect = DamagedStatBoostBerryEffect(battler, STAT_SPDEF, BATTLE_CATEGORY_SPECIAL);
|
||||
break;
|
||||
case HOLD_EFFECT_STICKY_BARB:
|
||||
if (TARGET_TURN_DAMAGED
|
||||
@@ -10065,7 +10065,7 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(u32 move, u32 mov
|
||||
if (recordAbilities && (illusionSpecies = GetIllusionMonSpecies(battlerDef)))
|
||||
TryNoticeIllusionInTypeEffectiveness(move, moveType, battlerAtk, battlerDef, modifier, illusionSpecies);
|
||||
|
||||
if (gBattleMoves[move].split == SPLIT_STATUS && move != MOVE_THUNDER_WAVE)
|
||||
if (gBattleMoves[move].category == BATTLE_CATEGORY_STATUS && move != MOVE_THUNDER_WAVE)
|
||||
{
|
||||
modifier = UQ_4_12(1.0);
|
||||
if (B_GLARE_GHOST < GEN_4 && move == MOVE_GLARE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST))
|
||||
@@ -10697,23 +10697,23 @@ bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 GetBattleMoveSplit(u32 moveId)
|
||||
u8 GetBattleMoveCategory(u32 moveId)
|
||||
{
|
||||
if (gBattleStruct != NULL && gBattleStruct->zmove.active && !IS_MOVE_STATUS(moveId))
|
||||
return gBattleStruct->zmove.activeSplit;
|
||||
return gBattleStruct->zmove.activeCategory;
|
||||
if (gBattleStruct != NULL && IsMaxMove(moveId)) // TODO: Might be buggy depending on when this is called.
|
||||
return gBattleStruct->dynamax.activeSplit;
|
||||
return gBattleStruct->dynamax.activeCategory;
|
||||
if (gBattleStruct != NULL && gBattleStruct->swapDamageCategory) // Photon Geyser, Shell Side Arm, Light That Burns the Sky
|
||||
return SPLIT_PHYSICAL;
|
||||
return BATTLE_CATEGORY_PHYSICAL;
|
||||
if (B_PHYSICAL_SPECIAL_SPLIT >= GEN_4)
|
||||
return gBattleMoves[moveId].split;
|
||||
return gBattleMoves[moveId].category;
|
||||
|
||||
if (IS_MOVE_STATUS(moveId))
|
||||
return SPLIT_STATUS;
|
||||
return BATTLE_CATEGORY_STATUS;
|
||||
else if (gBattleMoves[moveId].type < TYPE_MYSTERY)
|
||||
return SPLIT_PHYSICAL;
|
||||
return BATTLE_CATEGORY_PHYSICAL;
|
||||
else
|
||||
return SPLIT_SPECIAL;
|
||||
return BATTLE_CATEGORY_SPECIAL;
|
||||
}
|
||||
|
||||
static bool32 TryRemoveScreens(u32 battler)
|
||||
@@ -10755,7 +10755,7 @@ static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler)
|
||||
}
|
||||
|
||||
// Photon geyser & light that burns the sky
|
||||
u8 GetSplitBasedOnStats(u32 battler)
|
||||
u8 GetCategoryBasedOnStats(u32 battler)
|
||||
{
|
||||
u32 attack = gBattleMons[battler].attack;
|
||||
u32 spAttack = gBattleMons[battler].spAttack;
|
||||
@@ -10767,9 +10767,9 @@ u8 GetSplitBasedOnStats(u32 battler)
|
||||
spAttack = spAttack / gStatStageRatios[gBattleMons[battler].statStages[STAT_SPATK]][1];
|
||||
|
||||
if (spAttack >= attack)
|
||||
return SPLIT_SPECIAL;
|
||||
return BATTLE_CATEGORY_SPECIAL;
|
||||
else
|
||||
return SPLIT_PHYSICAL;
|
||||
return BATTLE_CATEGORY_PHYSICAL;
|
||||
}
|
||||
|
||||
static u32 GetFlingPowerFromItemId(u32 itemId)
|
||||
|
||||
@@ -149,9 +149,9 @@ void QueueZMove(u8 battler, u16 baseMove)
|
||||
gBattleStruct->zmove.toBeUsed[battler] = gBattleStruct->zmove.chosenZMove;
|
||||
gBattleStruct->zmove.baseMoves[battler] = baseMove;
|
||||
if (gBattleStruct->zmove.chosenZMove == MOVE_LIGHT_THAT_BURNS_THE_SKY)
|
||||
gBattleStruct->zmove.splits[battler] = GetSplitBasedOnStats(battler);
|
||||
gBattleStruct->zmove.categories[battler] = GetCategoryBasedOnStats(battler);
|
||||
else
|
||||
gBattleStruct->zmove.splits[battler] = gBattleMoves[baseMove].split;
|
||||
gBattleStruct->zmove.categories[battler] = gBattleMoves[baseMove].category;
|
||||
}
|
||||
|
||||
bool32 IsViableZMove(u8 battler, u16 move)
|
||||
@@ -518,7 +518,7 @@ static void ZMoveSelectionDisplayPower(u16 move, u16 zMove)
|
||||
if (zMove >= MOVE_CATASTROPIKA)
|
||||
power = gBattleMoves[zMove].power;
|
||||
|
||||
if (gBattleMoves[move].split != SPLIT_STATUS)
|
||||
if (gBattleMoves[move].category != BATTLE_CATEGORY_STATUS)
|
||||
{
|
||||
txtPtr = StringCopy(gDisplayedStringBattle, sText_PowerColon);
|
||||
ConvertIntToDecimalStringN(txtPtr, power, STR_CONV_MODE_LEFT_ALIGN, 3);
|
||||
@@ -687,7 +687,7 @@ static bool32 AreStatsMaxed(u8 battler, u8 n)
|
||||
|
||||
u16 GetZMovePower(u16 move)
|
||||
{
|
||||
if (gBattleMoves[move].split == SPLIT_STATUS)
|
||||
if (gBattleMoves[move].category == BATTLE_CATEGORY_STATUS)
|
||||
return 0;
|
||||
if (gBattleMoves[move].effect == EFFECT_OHKO)
|
||||
return 180;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -429,7 +429,7 @@ struct PokedexView
|
||||
u8 statBarsSpriteId;
|
||||
u8 statBarsBgSpriteId;
|
||||
bool8 justScrolled;
|
||||
u8 splitIconSpriteId; //Physical/Special Split
|
||||
u8 categoryIconSpriteId; //Physical/Special/Status category
|
||||
u8 numEggMoves;
|
||||
u8 numLevelUpMoves;
|
||||
u8 numTMHMMoves;
|
||||
@@ -614,62 +614,61 @@ static void PrintForms(u8 taskId, u16 species);
|
||||
static void Task_SwitchScreensFromFormsScreen(u8 taskId);
|
||||
static void Task_ExitFormsScreen(u8 taskId);
|
||||
|
||||
//Physical Special Split icon
|
||||
static u8 ShowSplitIcon(u32 split); //Physical/Special Split from BE
|
||||
static void DestroySplitIcon(void); //Physical/Special Split from BE
|
||||
//Physical/Special/Status category icon
|
||||
static u8 ShowCategoryIcon(u32 category);
|
||||
static void DestroyCategoryIcon(void);
|
||||
|
||||
static u16 NationalPokedexNumToSpeciesHGSS(u16 nationalNum);
|
||||
|
||||
//Physical/Special Split from BE
|
||||
#define TAG_SPLIT_ICONS 30004
|
||||
#define TAG_CATEGORY_ICONS 30004
|
||||
|
||||
static const u16 sSplitIcons_Pal[] = INCBIN_U16("graphics/interface/split_icons.gbapal");
|
||||
static const u32 sSplitIcons_Gfx[] = INCBIN_U32("graphics/interface/split_icons.4bpp.lz");
|
||||
static const u16 sCategoryIcons_Pal[] = INCBIN_U16("graphics/interface/category_icons.gbapal");
|
||||
static const u32 sCategoryIcons_Gfx[] = INCBIN_U32("graphics/interface/category_icons.4bpp.lz");
|
||||
|
||||
static const struct OamData sOamData_SplitIcons =
|
||||
static const struct OamData sOamData_CategoryIcons =
|
||||
{
|
||||
.size = SPRITE_SIZE(16x16),
|
||||
.shape = SPRITE_SHAPE(16x16),
|
||||
.priority = 0,
|
||||
};
|
||||
static const struct CompressedSpriteSheet sSpriteSheet_SplitIcons =
|
||||
static const struct CompressedSpriteSheet sSpriteSheet_CategoryIcons =
|
||||
{
|
||||
.data = sSplitIcons_Gfx,
|
||||
.data = sCategoryIcons_Gfx,
|
||||
.size = 16*16*3/2,
|
||||
.tag = TAG_SPLIT_ICONS,
|
||||
.tag = TAG_CATEGORY_ICONS,
|
||||
};
|
||||
static const struct SpritePalette sSpritePal_SplitIcons =
|
||||
static const struct SpritePalette sSpritePal_CategoryIcons =
|
||||
{
|
||||
.data = sSplitIcons_Pal,
|
||||
.tag = TAG_SPLIT_ICONS
|
||||
.data = sCategoryIcons_Pal,
|
||||
.tag = TAG_CATEGORY_ICONS
|
||||
};
|
||||
static const union AnimCmd sSpriteAnim_SplitIcon0[] =
|
||||
static const union AnimCmd sSpriteAnim_CategoryIcon0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
static const union AnimCmd sSpriteAnim_SplitIcon1[] =
|
||||
static const union AnimCmd sSpriteAnim_CategoryIcon1[] =
|
||||
{
|
||||
ANIMCMD_FRAME(4, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
static const union AnimCmd sSpriteAnim_SplitIcon2[] =
|
||||
static const union AnimCmd sSpriteAnim_CategoryIcon2[] =
|
||||
{
|
||||
ANIMCMD_FRAME(8, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
static const union AnimCmd *const sSpriteAnimTable_SplitIcons[] =
|
||||
static const union AnimCmd *const sSpriteAnimTable_CategoryIcons[] =
|
||||
{
|
||||
sSpriteAnim_SplitIcon0,
|
||||
sSpriteAnim_SplitIcon1,
|
||||
sSpriteAnim_SplitIcon2,
|
||||
sSpriteAnim_CategoryIcon0,
|
||||
sSpriteAnim_CategoryIcon1,
|
||||
sSpriteAnim_CategoryIcon2,
|
||||
};
|
||||
static const struct SpriteTemplate sSpriteTemplate_SplitIcons =
|
||||
static const struct SpriteTemplate sSpriteTemplate_CategoryIcons =
|
||||
{
|
||||
.tileTag = TAG_SPLIT_ICONS,
|
||||
.paletteTag = TAG_SPLIT_ICONS,
|
||||
.oam = &sOamData_SplitIcons,
|
||||
.anims = sSpriteAnimTable_SplitIcons,
|
||||
.tileTag = TAG_CATEGORY_ICONS,
|
||||
.paletteTag = TAG_CATEGORY_ICONS,
|
||||
.oam = &sOamData_CategoryIcons,
|
||||
.anims = sSpriteAnimTable_CategoryIcons,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallbackDummy
|
||||
@@ -4931,21 +4930,22 @@ static void LoadTilesetTilemapHGSS(u8 page)
|
||||
}
|
||||
}
|
||||
|
||||
//Physical/Special Split
|
||||
static u8 ShowSplitIcon(u32 split)
|
||||
//Physical/Special/Status category
|
||||
static u8 ShowCategoryIcon(u32 category)
|
||||
{
|
||||
if (sPokedexView->splitIconSpriteId == 0xFF)
|
||||
sPokedexView->splitIconSpriteId = CreateSprite(&sSpriteTemplate_SplitIcons, 139, 90, 0);
|
||||
if (sPokedexView->categoryIconSpriteId == 0xFF)
|
||||
sPokedexView->categoryIconSpriteId = CreateSprite(&sSpriteTemplate_CategoryIcons, 139, 90, 0);
|
||||
|
||||
gSprites[sPokedexView->splitIconSpriteId].invisible = FALSE;
|
||||
StartSpriteAnim(&gSprites[sPokedexView->splitIconSpriteId], split);
|
||||
return sPokedexView->splitIconSpriteId;
|
||||
gSprites[sPokedexView->categoryIconSpriteId].invisible = FALSE;
|
||||
StartSpriteAnim(&gSprites[sPokedexView->categoryIconSpriteId], category);
|
||||
return sPokedexView->categoryIconSpriteId;
|
||||
}
|
||||
static void DestroySplitIcon(void)
|
||||
|
||||
static void DestroyCategoryIcon(void)
|
||||
{
|
||||
if (sPokedexView->splitIconSpriteId != 0xFF)
|
||||
DestroySprite(&gSprites[sPokedexView->splitIconSpriteId]);
|
||||
sPokedexView->splitIconSpriteId = 0xFF;
|
||||
if (sPokedexView->categoryIconSpriteId != 0xFF)
|
||||
DestroySprite(&gSprites[sPokedexView->categoryIconSpriteId]);
|
||||
sPokedexView->categoryIconSpriteId = 0xFF;
|
||||
}
|
||||
|
||||
//************************************
|
||||
@@ -5075,10 +5075,10 @@ static void Task_LoadStatsScreen(u8 taskId)
|
||||
sPokedexView->typeIconSpriteIds[0] = 0xFF;
|
||||
sPokedexView->typeIconSpriteIds[1] = 0xFF;
|
||||
CreateTypeIconSprites();
|
||||
sPokedexView->splitIconSpriteId = 0xFF; //Physical/Special Split
|
||||
LoadCompressedPalette(gMoveTypes_Pal, 0x1D0, 0x60); //Physical/Special Split
|
||||
LoadCompressedSpriteSheet(&sSpriteSheet_SplitIcons); //Physical/Special Split
|
||||
LoadSpritePalette(&sSpritePal_SplitIcons); //Physical/Special Split
|
||||
sPokedexView->categoryIconSpriteId = 0xFF;
|
||||
LoadCompressedPalette(gMoveTypes_Pal, 0x1D0, 0x60);
|
||||
LoadCompressedSpriteSheet(&sSpriteSheet_CategoryIcons);
|
||||
LoadSpritePalette(&sSpritePal_CategoryIcons);
|
||||
gMain.state++;
|
||||
break;
|
||||
case 4:
|
||||
@@ -5498,9 +5498,9 @@ static void PrintStatsScreen_Moves_Bottom(u8 taskId)
|
||||
else
|
||||
ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].power, STR_CONV_MODE_RIGHT_ALIGN, 3);
|
||||
PrintStatsScreenTextSmall(WIN_STATS_MOVES_BOTTOM, gStringVar1, moves_x + 45, moves_y);
|
||||
//Physical/Special Split
|
||||
DestroySplitIcon();
|
||||
ShowSplitIcon(GetBattleMoveSplit(move));
|
||||
//Physical/Special/Status Category
|
||||
DestroyCategoryIcon();
|
||||
ShowCategoryIcon(GetBattleMoveCategory(move));
|
||||
//Accuracy
|
||||
if (gBattleMoves[move].accuracy == 0)
|
||||
StringCopy(gStringVar1, gText_ThreeDashes);
|
||||
@@ -5510,8 +5510,8 @@ static void PrintStatsScreen_Moves_Bottom(u8 taskId)
|
||||
}
|
||||
else //Appeal + Jam
|
||||
{
|
||||
DestroySplitIcon();
|
||||
gSprites[sPokedexView->splitIconSpriteId].invisible = TRUE;
|
||||
DestroyCategoryIcon();
|
||||
gSprites[sPokedexView->categoryIconSpriteId].invisible = TRUE;
|
||||
//Appeal
|
||||
contest_effectValue = gContestEffects[gContestMoves[move].effect].appeal;
|
||||
if (contest_effectValue != 0xFF)
|
||||
|
||||
@@ -189,7 +189,7 @@ static EWRAM_DATA struct PokemonSummaryScreenData
|
||||
bool8 handleDeoxys;
|
||||
s16 switchCounter; // Used for various switch statement cases that decompress/load graphics or pokemon data
|
||||
u8 unk_filler4[6];
|
||||
u8 splitIconSpriteId;
|
||||
u8 categoryIconSpriteId;
|
||||
} *sMonSummaryScreen = NULL;
|
||||
|
||||
EWRAM_DATA u8 gLastViewedMonIndex = 0;
|
||||
@@ -738,62 +738,62 @@ static const u8 sMovesPPLayout[] = _("{PP}{DYNAMIC 0}/{DYNAMIC 1}");
|
||||
#define TAG_MON_STATUS 30001
|
||||
#define TAG_MOVE_TYPES 30002
|
||||
#define TAG_MON_MARKINGS 30003
|
||||
#define TAG_SPLIT_ICONS 30004
|
||||
#define TAG_CATEGORY_ICONS 30004
|
||||
|
||||
static const u16 sSplitIcons_Pal[] = INCBIN_U16("graphics/interface/split_icons.gbapal");
|
||||
static const u32 sSplitIcons_Gfx[] = INCBIN_U32("graphics/interface/split_icons.4bpp.lz");
|
||||
static const u16 sCategoryIcons_Pal[] = INCBIN_U16("graphics/interface/category_icons.gbapal");
|
||||
static const u32 sCategoryIcons_Gfx[] = INCBIN_U32("graphics/interface/category_icons.4bpp.lz");
|
||||
|
||||
static const struct OamData sOamData_SplitIcons =
|
||||
static const struct OamData sOamData_CategoryIcons =
|
||||
{
|
||||
.size = SPRITE_SIZE(16x16),
|
||||
.shape = SPRITE_SHAPE(16x16),
|
||||
.priority = 0,
|
||||
};
|
||||
|
||||
static const struct CompressedSpriteSheet sSpriteSheet_SplitIcons =
|
||||
static const struct CompressedSpriteSheet sSpriteSheet_CategoryIcons =
|
||||
{
|
||||
.data = sSplitIcons_Gfx,
|
||||
.data = sCategoryIcons_Gfx,
|
||||
.size = 16*16*3/2,
|
||||
.tag = TAG_SPLIT_ICONS,
|
||||
.tag = TAG_CATEGORY_ICONS,
|
||||
};
|
||||
|
||||
static const struct SpritePalette sSpritePal_SplitIcons =
|
||||
static const struct SpritePalette sSpritePal_CategoryIcons =
|
||||
{
|
||||
.data = sSplitIcons_Pal,
|
||||
.tag = TAG_SPLIT_ICONS
|
||||
.data = sCategoryIcons_Pal,
|
||||
.tag = TAG_CATEGORY_ICONS
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_SplitIcon0[] =
|
||||
static const union AnimCmd sSpriteAnim_CategoryIcon0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_SplitIcon1[] =
|
||||
static const union AnimCmd sSpriteAnim_CategoryIcon1[] =
|
||||
{
|
||||
ANIMCMD_FRAME(4, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd sSpriteAnim_SplitIcon2[] =
|
||||
static const union AnimCmd sSpriteAnim_CategoryIcon2[] =
|
||||
{
|
||||
ANIMCMD_FRAME(8, 0),
|
||||
ANIMCMD_END
|
||||
};
|
||||
|
||||
static const union AnimCmd *const sSpriteAnimTable_SplitIcons[] =
|
||||
static const union AnimCmd *const sSpriteAnimTable_CategoryIcons[] =
|
||||
{
|
||||
sSpriteAnim_SplitIcon0,
|
||||
sSpriteAnim_SplitIcon1,
|
||||
sSpriteAnim_SplitIcon2,
|
||||
sSpriteAnim_CategoryIcon0,
|
||||
sSpriteAnim_CategoryIcon1,
|
||||
sSpriteAnim_CategoryIcon2,
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_SplitIcons =
|
||||
static const struct SpriteTemplate sSpriteTemplate_CategoryIcons =
|
||||
{
|
||||
.tileTag = TAG_SPLIT_ICONS,
|
||||
.paletteTag = TAG_SPLIT_ICONS,
|
||||
.oam = &sOamData_SplitIcons,
|
||||
.anims = sSpriteAnimTable_SplitIcons,
|
||||
.tileTag = TAG_CATEGORY_ICONS,
|
||||
.paletteTag = TAG_CATEGORY_ICONS,
|
||||
.oam = &sOamData_CategoryIcons,
|
||||
.anims = sSpriteAnimTable_CategoryIcons,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SpriteCallbackDummy
|
||||
@@ -1153,21 +1153,21 @@ static const struct SpriteTemplate sSpriteTemplate_StatusCondition =
|
||||
static const u16 sMarkings_Pal[] = INCBIN_U16("graphics/summary_screen/markings.gbapal");
|
||||
|
||||
// code
|
||||
static u8 ShowSplitIcon(u32 split)
|
||||
static u8 ShowCategoryIcon(u32 category)
|
||||
{
|
||||
if (sMonSummaryScreen->splitIconSpriteId == 0xFF)
|
||||
sMonSummaryScreen->splitIconSpriteId = CreateSprite(&sSpriteTemplate_SplitIcons, 48, 129, 0);
|
||||
if (sMonSummaryScreen->categoryIconSpriteId == 0xFF)
|
||||
sMonSummaryScreen->categoryIconSpriteId = CreateSprite(&sSpriteTemplate_CategoryIcons, 48, 129, 0);
|
||||
|
||||
gSprites[sMonSummaryScreen->splitIconSpriteId].invisible = FALSE;
|
||||
StartSpriteAnim(&gSprites[sMonSummaryScreen->splitIconSpriteId], split);
|
||||
return sMonSummaryScreen->splitIconSpriteId;
|
||||
gSprites[sMonSummaryScreen->categoryIconSpriteId].invisible = FALSE;
|
||||
StartSpriteAnim(&gSprites[sMonSummaryScreen->categoryIconSpriteId], category);
|
||||
return sMonSummaryScreen->categoryIconSpriteId;
|
||||
}
|
||||
|
||||
static void DestroySplitIcon(void)
|
||||
static void DestroyCategoryIcon(void)
|
||||
{
|
||||
if (sMonSummaryScreen->splitIconSpriteId != 0xFF)
|
||||
DestroySprite(&gSprites[sMonSummaryScreen->splitIconSpriteId]);
|
||||
sMonSummaryScreen->splitIconSpriteId = 0xFF;
|
||||
if (sMonSummaryScreen->categoryIconSpriteId != 0xFF)
|
||||
DestroySprite(&gSprites[sMonSummaryScreen->categoryIconSpriteId]);
|
||||
sMonSummaryScreen->categoryIconSpriteId = 0xFF;
|
||||
}
|
||||
|
||||
void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void))
|
||||
@@ -1204,7 +1204,7 @@ void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex,
|
||||
}
|
||||
|
||||
sMonSummaryScreen->currPageIndex = sMonSummaryScreen->minPageIndex;
|
||||
sMonSummaryScreen->splitIconSpriteId = 0xFF;
|
||||
sMonSummaryScreen->categoryIconSpriteId = 0xFF;
|
||||
SummaryScreen_SetAnimDelayTaskId(TASK_NONE);
|
||||
|
||||
if (gMonSpritesGfxPtr == NULL)
|
||||
@@ -1451,8 +1451,8 @@ static bool8 DecompressGraphics(void)
|
||||
break;
|
||||
case 12:
|
||||
LoadCompressedPalette(gMoveTypes_Pal, OBJ_PLTT_ID(13), 3 * PLTT_SIZE_4BPP);
|
||||
LoadCompressedSpriteSheet(&sSpriteSheet_SplitIcons);
|
||||
LoadSpritePalette(&sSpritePal_SplitIcons);
|
||||
LoadCompressedSpriteSheet(&sSpriteSheet_CategoryIcons);
|
||||
LoadSpritePalette(&sSpritePal_CategoryIcons);
|
||||
sMonSummaryScreen->switchCounter = 0;
|
||||
return TRUE;
|
||||
}
|
||||
@@ -2090,7 +2090,7 @@ static void ChangeSelectedMove(s16 *taskData, s8 direction, u8 *moveIndexPtr)
|
||||
{
|
||||
ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_POWER_ACC);
|
||||
ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_APPEAL_JAM);
|
||||
DestroySplitIcon();
|
||||
DestroyCategoryIcon();
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
HandlePowerAccTilemap(0, 3);
|
||||
HandleAppealJamTilemap(0, 3, 0);
|
||||
@@ -2117,7 +2117,7 @@ static void CloseMoveSelectMode(u8 taskId)
|
||||
{
|
||||
ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_POWER_ACC);
|
||||
ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_APPEAL_JAM);
|
||||
DestroySplitIcon();
|
||||
DestroyCategoryIcon();
|
||||
HandlePowerAccTilemap(0, 3);
|
||||
HandleAppealJamTilemap(0, 3, 0);
|
||||
}
|
||||
@@ -2344,7 +2344,7 @@ static void ShowCantForgetHMsWindow(u8 taskId)
|
||||
{
|
||||
ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_POWER_ACC);
|
||||
ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_APPEAL_JAM);
|
||||
gSprites[sMonSummaryScreen->splitIconSpriteId].invisible = TRUE;
|
||||
gSprites[sMonSummaryScreen->categoryIconSpriteId].invisible = TRUE;
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
HandlePowerAccTilemap(0, 3);
|
||||
HandleAppealJamTilemap(0, 3, 0);
|
||||
@@ -3044,7 +3044,7 @@ static void ClearPageWindowTilemaps(u8 page)
|
||||
if (sMonSummaryScreen->newMove != MOVE_NONE || sMonSummaryScreen->firstMoveIndex != MAX_MON_MOVES)
|
||||
{
|
||||
ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_POWER_ACC);
|
||||
gSprites[sMonSummaryScreen->splitIconSpriteId].invisible = TRUE;
|
||||
gSprites[sMonSummaryScreen->categoryIconSpriteId].invisible = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -3764,8 +3764,8 @@ static void PrintMoveDetails(u16 move)
|
||||
if (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES)
|
||||
{
|
||||
moveEffect = gBattleMoves[move].effect;
|
||||
if (B_SHOW_SPLIT_ICON == TRUE)
|
||||
ShowSplitIcon(GetBattleMoveSplit(move));
|
||||
if (B_SHOW_CATEGORY_ICON == TRUE)
|
||||
ShowCategoryIcon(GetBattleMoveCategory(move));
|
||||
PrintMovePowerAndAccuracy(move);
|
||||
|
||||
if (moveEffect != EFFECT_PLACEHOLDER)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_WATER_GUN].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_WATER_GUN].category == BATTLE_CATEGORY_SPECIAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Beads of Ruin reduces Sp. Def", s16 damage)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a single battle", s16 damage)
|
||||
@@ -83,7 +83,7 @@ SINGLE_BATTLE_TEST("Contrary raises stats after using a move which would normall
|
||||
PARAMETRIZE { ability = ABILITY_TANGLED_FEET; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_OVERHEAT].effect == EFFECT_OVERHEAT);
|
||||
ASSUME(gBattleMoves[MOVE_OVERHEAT].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_OVERHEAT].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_SPINDA) { Ability(ability); }
|
||||
} WHEN {
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_ECHOED_VOICE].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_ECHOED_VOICE].category == BATTLE_CATEGORY_SPECIAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Defeatist halves Attack when HP <= 50%", s16 damage)
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TRI_ATTACK].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TRI_ATTACK].category == BATTLE_CATEGORY_SPECIAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Download raises Attack if player has lower Def than Sp. Def", s16 damage)
|
||||
|
||||
@@ -17,8 +17,8 @@ SINGLE_BATTLE_TEST("Dragon's Maw increases Dragon-type move damage", s16 damage)
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].type != TYPE_DRAGON);
|
||||
ASSUME(gBattleMoves[MOVE_DRAGON_CLAW].type == TYPE_DRAGON);
|
||||
ASSUME(gBattleMoves[MOVE_DRAGON_BREATH].type == TYPE_DRAGON);
|
||||
ASSUME(gBattleMoves[MOVE_DRAGON_CLAW].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_DRAGON_BREATH].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_DRAGON_CLAW].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_DRAGON_BREATH].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_REGIDRAGO) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Earth Eater activates on status moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_SAND_ATTACK].type == TYPE_GROUND);
|
||||
ASSUME(gBattleMoves[MOVE_SAND_ATTACK].split == SPLIT_STATUS);
|
||||
ASSUME(gBattleMoves[MOVE_SAND_ATTACK].category == BATTLE_CATEGORY_STATUS);
|
||||
PLAYER(SPECIES_ORTHWORM) { Ability(ABILITY_EARTH_EATER); HP(1); MaxHP(100); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -12,8 +12,8 @@ SINGLE_BATTLE_TEST("Electromorphosis sets up Charge when hit by any move")
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].power != 0);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].power != 0);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].category == BATTLE_CATEGORY_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_THUNDER_SHOCK].power != 0);
|
||||
ASSUME(gBattleMoves[MOVE_THUNDER_SHOCK].type == TYPE_ELECTRIC);
|
||||
|
||||
|
||||
@@ -12,10 +12,10 @@ SINGLE_BATTLE_TEST("Ice Scales halves the damage from special moves", s16 damage
|
||||
PARAMETRIZE { ability = ABILITY_SHIELD_DUST; move = MOVE_TACKLE; }
|
||||
PARAMETRIZE { ability = ABILITY_ICE_SCALES; move = MOVE_TACKLE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_PSYCHIC].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_PSYSHOCK].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_PSYCHIC].category == BATTLE_CATEGORY_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_PSYSHOCK].category == BATTLE_CATEGORY_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_PSYSHOCK].effect == EFFECT_PSYSHOCK);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_FROSMOTH) { Ability(ability); }
|
||||
} WHEN {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after switch out", s16 damage)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
SINGLE_BATTLE_TEST("Parental Bond converts Tackle into a two-strike move")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split != SPLIT_STATUS);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category != BATTLE_CATEGORY_STATUS);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].strikeCount < 2);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].effect == EFFECT_HIT);
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gSpeciesInfo[SPECIES_UMBREON].types[0] == TYPE_DARK);
|
||||
ASSUME(gBattleMoves[MOVE_CONFUSE_RAY].split == SPLIT_STATUS);
|
||||
ASSUME(gBattleMoves[MOVE_CONFUSE_RAY].category == BATTLE_CATEGORY_STATUS);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type Pokémon")
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_ROUND].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_ROUND].category == BATTLE_CATEGORY_SPECIAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Protosynthesis boosts the highest stat")
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_ROUND].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_ROUND].category == BATTLE_CATEGORY_SPECIAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Quark Drive boosts the highest stat")
|
||||
|
||||
@@ -17,8 +17,8 @@ SINGLE_BATTLE_TEST("Rocky Payload increases Rock-type move damage", s16 damage)
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].type != TYPE_ROCK);
|
||||
ASSUME(gBattleMoves[MOVE_ROCK_THROW].type == TYPE_ROCK);
|
||||
ASSUME(gBattleMoves[MOVE_POWER_GEM].type == TYPE_ROCK);
|
||||
ASSUME(gBattleMoves[MOVE_ROCK_THROW].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_POWER_GEM].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_ROCK_THROW].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_POWER_GEM].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_BOMBIRDIER) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -26,8 +26,8 @@ SINGLE_BATTLE_TEST("Stamina raises Defense by 1 when hit by a move")
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].power != 0);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].power != 0);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].category == BATTLE_CATEGORY_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STAMINA); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -17,8 +17,8 @@ SINGLE_BATTLE_TEST("Steelworker increases Steel-type move damage", s16 damage)
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].type != TYPE_STEEL);
|
||||
ASSUME(gBattleMoves[MOVE_ANCHOR_SHOT].type == TYPE_STEEL);
|
||||
ASSUME(gBattleMoves[MOVE_FLASH_CANNON].type == TYPE_STEEL);
|
||||
ASSUME(gBattleMoves[MOVE_ANCHOR_SHOT].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_FLASH_CANNON].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_ANCHOR_SHOT].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_FLASH_CANNON].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_DHELMISE) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Sword of Ruin reduces Defense", s16 damage)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Tablets of Ruin reduces Attack", s16 damage)
|
||||
|
||||
@@ -17,8 +17,8 @@ SINGLE_BATTLE_TEST("Transistor increases Electric-type move damage", s16 damage)
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].type != TYPE_ELECTRIC);
|
||||
ASSUME(gBattleMoves[MOVE_WILD_CHARGE].type == TYPE_ELECTRIC);
|
||||
ASSUME(gBattleMoves[MOVE_THUNDER_SHOCK].type == TYPE_ELECTRIC);
|
||||
ASSUME(gBattleMoves[MOVE_WILD_CHARGE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_THUNDER_SHOCK].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_WILD_CHARGE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_THUNDER_SHOCK].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_REGIELEKI) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_WATER_GUN].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_WATER_GUN].category == BATTLE_CATEGORY_SPECIAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Vessel of Ruin reduces Sp. Atk", s16 damage)
|
||||
|
||||
@@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Volt Absorb activates on status moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_THUNDER_WAVE].type == TYPE_ELECTRIC);
|
||||
ASSUME(gBattleMoves[MOVE_THUNDER_WAVE].split == SPLIT_STATUS);
|
||||
ASSUME(gBattleMoves[MOVE_THUNDER_WAVE].category == BATTLE_CATEGORY_STATUS);
|
||||
PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); HP(1); MaxHP(100); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Water Absorb activates on status moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_SOAK].type == TYPE_WATER);
|
||||
ASSUME(gBattleMoves[MOVE_SOAK].split == SPLIT_STATUS);
|
||||
ASSUME(gBattleMoves[MOVE_SOAK].category == BATTLE_CATEGORY_STATUS);
|
||||
PLAYER(SPECIES_POLIWAG) { Ability(ABILITY_WATER_ABSORB); HP(1); MaxHP(100); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -5,8 +5,8 @@ ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].power != 0);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].power != 0);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].category == BATTLE_CATEGORY_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(B_WEAK_ARMOR_SPEED >= GEN_7);
|
||||
}
|
||||
|
||||
|
||||
@@ -405,7 +405,7 @@ AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose He
|
||||
|
||||
for (j = MOVE_NONE + 1; j < MOVES_COUNT; j++)
|
||||
{
|
||||
if (gBattleMoves[j].split == SPLIT_STATUS) {
|
||||
if (gBattleMoves[j].category == BATTLE_CATEGORY_STATUS) {
|
||||
PARAMETRIZE{ statusMove = j; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gItems[ITEM_JABOCA_BERRY].holdEffect == HOLD_EFFECT_JABOCA_BERRY);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Jaboca Berry causes the attacker to lose 1/8 of its max HP if a physical move was used")
|
||||
@@ -16,7 +16,7 @@ SINGLE_BATTLE_TEST("Jaboca Berry causes the attacker to lose 1/8 of its max HP i
|
||||
PARAMETRIZE { move = MOVE_TACKLE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_JABOCA_BERRY); }
|
||||
} WHEN {
|
||||
@@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Jaboca Berry tirggers before Bug Bite can steal it")
|
||||
{
|
||||
KNOWN_FAILING;
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_BUG_BITE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_BUG_BITE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_JABOCA_BERRY); }
|
||||
} WHEN {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gItems[ITEM_KEE_BERRY].holdEffect == HOLD_EFFECT_KEE_BERRY);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Kee Berry raises the holder's Defense by one stage when hit by a physical move")
|
||||
@@ -15,7 +15,7 @@ SINGLE_BATTLE_TEST("Kee Berry raises the holder's Defense by one stage when hit
|
||||
PARAMETRIZE { move = MOVE_TACKLE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_KEE_BERRY); }
|
||||
} WHEN {
|
||||
@@ -58,7 +58,7 @@ SINGLE_BATTLE_TEST("Kee Berry raises the holder's Defense by two stages with Rip
|
||||
SINGLE_BATTLE_TEST("Kee Berry is not triggered by a special move")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_KEE_BERRY); }
|
||||
} WHEN {
|
||||
|
||||
@@ -12,8 +12,8 @@ SINGLE_BATTLE_TEST("Maranga Berry raises the holder's Sp. Def by one stage when
|
||||
PARAMETRIZE { move = MOVE_TACKLE; }
|
||||
PARAMETRIZE { move = MOVE_SWIFT; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_MARANGA_BERRY); }
|
||||
} WHEN {
|
||||
@@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Maranga Berry raises the holder's Sp. Def by one stage when
|
||||
SINGLE_BATTLE_TEST("Maranga Berry raises the holder's Sp. Def by two stages with Ripen when hit by a special move")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_APPLIN) { Item(ITEM_MARANGA_BERRY); Ability(ABILITY_RIPEN); }
|
||||
} WHEN {
|
||||
|
||||
@@ -15,8 +15,8 @@ SINGLE_BATTLE_TEST("Rowap Berry causes the attacker to lose 1/8 of its max HP if
|
||||
PARAMETRIZE { move = MOVE_TACKLE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_SWIFT].category == BATTLE_CATEGORY_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ROWAP_BERRY); }
|
||||
} WHEN {
|
||||
@@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Rowap Berry causes the attacker to lose 1/8 of its max HP if
|
||||
SINGLE_BATTLE_TEST("Rowap Berry is not triggered by a physical move")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ROWAP_BERRY); }
|
||||
} WHEN {
|
||||
|
||||
@@ -136,7 +136,7 @@ SINGLE_BATTLE_TEST("Critical hits do not ignore positive stat stages", s16 damag
|
||||
PARAMETRIZE { move = MOVE_HOWL; }
|
||||
PARAMETRIZE { move = MOVE_TAIL_WHIP; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_SCRATCH].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_SCRATCH].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -157,7 +157,7 @@ SINGLE_BATTLE_TEST("Critical hits ignore negative stat stages", s16 damage)
|
||||
PARAMETRIZE { move = MOVE_HARDEN; }
|
||||
PARAMETRIZE { move = MOVE_GROWL; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_SCRATCH].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_SCRATCH].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Growl lowers Attack", s16 damage)
|
||||
PARAMETRIZE { lowerAttack = FALSE; }
|
||||
PARAMETRIZE { lowerAttack = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Meditate raises Attack", s16 damage)
|
||||
PARAMETRIZE { raiseAttack = FALSE; }
|
||||
PARAMETRIZE { raiseAttack = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Howl raises user's Attack", s16 damage)
|
||||
PARAMETRIZE { raiseAttack = FALSE; }
|
||||
PARAMETRIZE { raiseAttack = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -37,7 +37,7 @@ DOUBLE_BATTLE_TEST("Howl raises user's and partner's Attack", s16 damageLeft, s1
|
||||
PARAMETRIZE { raiseAttack = FALSE; }
|
||||
PARAMETRIZE { raiseAttack = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(15); }
|
||||
PLAYER(SPECIES_WYNAUT) { Speed(10); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(13); }
|
||||
@@ -69,7 +69,7 @@ DOUBLE_BATTLE_TEST("Howl does not work on partner if it has Soundproof")
|
||||
s16 damage[2];
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(15); }
|
||||
PLAYER(SPECIES_VOLTORB) { Speed(10); Ability(ABILITY_SOUNDPROOF); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(5); }
|
||||
|
||||
@@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Tail Whip lowers Defense", s16 damage)
|
||||
PARAMETRIZE { lowerDefense = FALSE; }
|
||||
PARAMETRIZE { lowerDefense = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Harden raises Defense", s16 damage)
|
||||
PARAMETRIZE { raiseDefense = FALSE; }
|
||||
PARAMETRIZE { raiseDefense = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -15,8 +15,8 @@ ASSUMPTIONS
|
||||
ASSUME(gBattleMoves[MOVE_STICKY_WEB].effect == EFFECT_STICKY_WEB);
|
||||
ASSUME(gBattleMoves[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(gBattleMoves[MOVE_SCREECH].effect == EFFECT_DEFENSE_DOWN_2);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].category == BATTLE_CATEGORY_SPECIAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1")
|
||||
|
||||
@@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Haze resets stat changes", s16 damage)
|
||||
PARAMETRIZE { haze = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_MEDITATE].effect == EFFECT_ATTACK_UP);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -12,10 +12,10 @@ ASSUMPTIONS
|
||||
ASSUME(gBattleMoves[MOVE_QUICK_GUARD].effect == EFFECT_PROTECT);
|
||||
ASSUME(gBattleMoves[MOVE_CRAFTY_SHIELD].effect == EFFECT_PROTECT);
|
||||
ASSUME(gBattleMoves[MOVE_BANEFUL_BUNKER].effect == EFFECT_PROTECT);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].makesContact);
|
||||
ASSUME(gBattleMoves[MOVE_LEER].split == SPLIT_STATUS);
|
||||
ASSUME(gBattleMoves[MOVE_WATER_GUN].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_LEER].category == BATTLE_CATEGORY_STATUS);
|
||||
ASSUME(gBattleMoves[MOVE_WATER_GUN].category == BATTLE_CATEGORY_SPECIAL);
|
||||
ASSUME(!(gBattleMoves[MOVE_WATER_GUN].makesContact));
|
||||
}
|
||||
|
||||
@@ -421,7 +421,7 @@ DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from status moves")
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_LEER].target == MOVE_TARGET_BOTH);
|
||||
ASSUME(gBattleMoves[MOVE_HYPER_VOICE].target == MOVE_TARGET_BOTH);
|
||||
ASSUME(gBattleMoves[MOVE_HYPER_VOICE].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_HYPER_VOICE].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gBattleMoves[MOVE_SHELL_TRAP].effect == EFFECT_SHELL_TRAP);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_WATER_GUN].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_LEER].split == SPLIT_STATUS);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_WATER_GUN].category == BATTLE_CATEGORY_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_LEER].category == BATTLE_CATEGORY_STATUS);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Shell Trap activates only if hit by a physical move")
|
||||
|
||||
@@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Confide lowers Special Attack", s16 damage)
|
||||
PARAMETRIZE { lowerSpecialAttack = FALSE; }
|
||||
PARAMETRIZE { lowerSpecialAttack = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_GUST].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Tail Glow drastically raises Special Attack", s16 damage)
|
||||
PARAMETRIZE { raiseSpecialAttack = FALSE; }
|
||||
PARAMETRIZE { raiseSpecialAttack = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gBattleMoves[MOVE_GUST].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -148,8 +148,8 @@ SINGLE_BATTLE_TEST("Stockpile temporarily raises Def and Sp. Def", s16 dmgPyhsic
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; }
|
||||
GIVEN {
|
||||
ASSUME(B_STOCKPILE_RAISES_DEFS >= GEN_4);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
} WHEN {
|
||||
@@ -184,8 +184,8 @@ DOUBLE_BATTLE_TEST("Stockpile's Def and Sp. Def boost is lost after using Spit U
|
||||
PARAMETRIZE { count = 3; move = MOVE_SPIT_UP; }
|
||||
GIVEN {
|
||||
ASSUME(B_STOCKPILE_RAISES_DEFS >= GEN_4);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].split == SPLIT_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].split == SPLIT_SPECIAL);
|
||||
ASSUME(gBattleMoves[MOVE_TACKLE].category == BATTLE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gBattleMoves[MOVE_GUST].category == BATTLE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(4); HP(399); MaxHP(400); }
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(3); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
|
||||
|
||||
Reference in New Issue
Block a user