From 198a1a8646dc4b6218bcf2e738213490fcef5ca0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 2 Aug 2018 20:24:18 +0200 Subject: [PATCH] Proper Sound moves and substitute --- asm/macros/battle_script.inc | 3 ++- data/battle_scripts_1.s | 44 +++++++++++++++---------------- include/battle_script_commands.h | 1 + include/constants/battle_config.h | 1 + include/constants/pokemon.h | 1 + include/data/battle_moves.h | 44 +++++++++++++++---------------- src/battle_script_commands.c | 35 +++++++++++++++++------- src/battle_util.c | 25 +++++------------- 8 files changed, 79 insertions(+), 75 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index dd4deaad79..e879dfd056 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1149,8 +1149,9 @@ .4byte \param0 .endm - .macro nop_E9 + .macro jumpifsubstituteblocks ptr .byte 0xe9 + .4byte \ptr .endm .macro tryrecycleitem param0 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index adcfcd3d78..fb4b6c824a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -533,7 +533,7 @@ BattleScript_EffectRoost: BattleScript_EffectCaptivate: setstatchanger STAT_SPATK, 2, TRUE attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce + jumpifsubstituteblocks BattleScript_ButItFailedAtkStringPpReduce jumpifoppositegenders BattleScript_CaptivateCheckAcc goto BattleScript_ButItFailedAtkStringPpReduce BattleScript_CaptivateCheckAcc: @@ -686,7 +686,7 @@ BattleScript_EffectSleep:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_AlreadyAsleep jumpifcantmakeasleep BattleScript_CantMakeAsleep jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed @@ -825,7 +825,7 @@ BattleScript_82D8BEA:: BattleScript_EffectDreamEater:: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_82D8C0E + jumpifsubstituteblocks BattleScript_82D8C0E jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_82D8C18 BattleScript_82D8C0E:: attackstring @@ -953,7 +953,7 @@ BattleScript_EffectEvasionDown: setstatchanger STAT_EVASION, 1, TRUE BattleScript_EffectStatDown: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce + jumpifsubstituteblocks BattleScript_ButItFailedAtkStringPpReduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE BattleScript_StatDownFromAttackString: attackstring @@ -1112,7 +1112,7 @@ BattleScript_EffectToxic:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed @@ -1328,7 +1328,7 @@ BattleScript_EffectConfuse: attackstring ppreduce jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_AlreadyConfused accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected @@ -1431,7 +1431,7 @@ BattleScript_EffectPoison:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned jumpiftype BS_TARGET, TYPE_POISON, BattleScript_NotAffected @@ -1452,7 +1452,7 @@ BattleScript_EffectParalyze:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed typecalc jumpifmovehadnoeffect BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed @@ -1579,7 +1579,7 @@ BattleScript_EffectMimic:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON mimicattackcopy BattleScript_ButItFailed attackanimation @@ -1603,7 +1603,7 @@ BattleScript_EffectLeechSeed:: attackstring pause 0x20 ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_DoLeechSeed, ACC_CURR_MOVE BattleScript_DoLeechSeed:: setseeded @@ -1732,7 +1732,7 @@ BattleScript_EffectLockOn:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE setalwayshitflag attackanimation @@ -1745,7 +1745,6 @@ BattleScript_EffectSketch:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed copymovepermanently BattleScript_ButItFailed attackanimation waitanimation @@ -1888,7 +1887,7 @@ BattleScript_EffectMeanLook:: ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_ButItFailed - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed attackanimation waitanimation setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE @@ -1901,7 +1900,7 @@ BattleScript_EffectNightmare:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus2 BS_TARGET, STATUS2_NIGHTMARE, BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_NightmareWorked goto BattleScript_ButItFailed @@ -1956,7 +1955,6 @@ BattleScript_DoGhostCurse:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON cursetarget BattleScript_ButItFailed orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE @@ -2049,7 +2047,7 @@ BattleScript_RolloutHit:: BattleScript_EffectSwagger:: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_MakeMoveMissed + jumpifsubstituteblocks BattleScript_MakeMoveMissed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce @@ -2574,7 +2572,7 @@ BattleScript_EffectTorment:: BattleScript_EffectFlatter:: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_MakeMoveMissed + jumpifsubstituteblocks BattleScript_MakeMoveMissed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce @@ -2599,7 +2597,7 @@ BattleScript_EffectWillOWisp:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_BURN, BattleScript_AlreadyBurned jumpiftype BS_TARGET, TYPE_FIRE, BattleScript_NotAffected jumpifability BS_TARGET, ABILITY_WATER_VEIL, BattleScript_WaterVeilPrevents @@ -2634,7 +2632,7 @@ BattleScript_EffectMemento:: setatkhptozero attackanimation waitanimation - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_82DA148 + jumpifsubstituteblocks BattleScript_82DA148 setbyte sFIELD_1B, 0x0 playstatchangeanimation BS_TARGET, 0x12, 0x7 playstatchangeanimation BS_TARGET, 0x2, 0x3 @@ -2679,7 +2677,7 @@ BattleScript_EffectFocusPunch:: goto BattleScript_MoveEnd BattleScript_EffectSmellingsalt:: - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_EffectHit + jumpifsubstituteblocks BattleScript_EffectHit setmoveeffect MOVE_EFFECT_REMOVE_PARALYSIS | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit @@ -2741,7 +2739,7 @@ BattleScript_EffectTrick:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE tryswapitems BattleScript_ButItFailed attackanimation @@ -2858,7 +2856,7 @@ BattleScript_EffectYawn:: ppreduce jumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_PrintBankAbilityMadeIneffective jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifcantmakeasleep BattleScript_ButItFailed @@ -2970,7 +2968,7 @@ BattleScript_TeeterDanceLoop:: setmoveeffect MOVE_EFFECT_CONFUSION jumpifbyteequal gBattlerAttacker, gBattlerTarget, BattleScript_TeeterDanceLoopIncrement jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_TeeterDanceOwnTempoPrevents - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_TeeterDanceSubstitutePrevents + jumpifsubstituteblocks BattleScript_TeeterDanceSubstitutePrevents jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_TeeterDanceAlreadyConfused jumpifhasnohp BS_TARGET, BattleScript_TeeterDanceLoopIncrement accuracycheck BattleScript_TeeterDanceMissed, ACC_CURR_MOVE diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 0f56ca213d..92593e4a6d 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -12,6 +12,7 @@ void BattleCreateYesNoCursorAt(u8 cursorPosition); void BufferMoveToLearnIntoBattleTextBuff2(void); void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags); bool8 UproarWakeUpCheck(u8 battlerId); +bool32 DoesSubstituteBlockMove(u8 battlerAtk, u8 battlerDef, u32 move); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u8 gUnknown_0831C494[][4]; diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 1d247a20b5..c6809c094d 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -11,5 +11,6 @@ #define B_FELL_STINGER_STAT_RAISE GEN_6 // Gen6 Atk+2, Gen7 Atk+3. #define B_ABILITY_WEATHER GEN_6 // Up to gen5 - weather induced by abilities such as Drought or Drizzle lasted till the battle's end or weather change by a move. From Gen6 onwards, weather caused by abilities lasts the same amount of turns as induced from a move. #define B_GALE_WINGS GEN_6 // Gen7 requires full hp. +#define B_SOUND_SUBSTITUTE GEN_6 // Starting from gen6 sound moves bypass Substitute. #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index b176964bc4..5dd095c790 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -95,6 +95,7 @@ #define FLAG_DMG_MINIMIZE 0x2000 #define FLAG_DMG_UNDERGROUND 0x4000 #define FLAG_DMG_UNDERWATER 0x8000 +#define FLAG_SOUND 0x10000 // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 78cd16fe68..f422ece123 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -552,7 +552,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_ROAR @@ -564,7 +564,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -6, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_SING @@ -576,7 +576,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_SUPERSONIC @@ -588,7 +588,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_SONIC_BOOM @@ -1248,7 +1248,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_DOUBLE_TEAM @@ -2088,7 +2088,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_CURSE @@ -2352,7 +2352,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_ICY_WIND @@ -2592,7 +2592,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = FLAG_SNATCH_AFFECTED, + .flags = FLAG_SNATCH_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_RETURN @@ -3048,7 +3048,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_STOCKPILE @@ -3660,7 +3660,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_POISON_FANG @@ -3840,7 +3840,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_GRASS_WHISTLE @@ -3852,7 +3852,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_TICKLE @@ -4872,7 +4872,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_DRAGON_PULSE @@ -5388,7 +5388,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_JUDGMENT @@ -5976,7 +5976,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_CHIP_AWAY @@ -6576,7 +6576,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_SECRET_SWORD @@ -6672,7 +6672,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_ICICLE_CRASH @@ -6828,7 +6828,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_ION_DELUGE @@ -6900,7 +6900,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_PARTING_SHOT @@ -6912,7 +6912,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_TOPSY_TURVY @@ -7044,7 +7044,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_FAIRY_LOCK @@ -7092,7 +7092,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_DIAMOND_STORM diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b42298da59..2d31a0af4e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -324,7 +324,7 @@ static void atkE5_pickup(void); static void atkE6_docastformchangeanimation(void); static void atkE7_trycastformdatachange(void); static void atkE8_settypebasedhalvers(void); -static void atkE9_nop(void); +static void atkE9_jumpifsubstituteblocks(void); static void atkEA_tryrecycleitem(void); static void atkEB_settypetoterrain(void); static void atkEC_pursuitrelated(void); @@ -582,7 +582,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkE6_docastformchangeanimation, atkE7_trycastformdatachange, atkE8_settypebasedhalvers, - atkE9_nop, + atkE9_jumpifsubstituteblocks, atkEA_tryrecycleitem, atkEB_settypetoterrain, atkEC_pursuitrelated, @@ -1407,7 +1407,7 @@ static void atk07_adjustdamage(void) { u8 holdEffect, param; - if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) + if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) goto END; if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) goto END; @@ -1562,7 +1562,7 @@ static void atk0B_healthbarupdate(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + if (DoesSubstituteBlockMove(gBattlerAttacker, gActiveBattler, gCurrentMove) && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, gActiveBattler); } @@ -1606,7 +1606,7 @@ static void atk0C_datahpupdate(void) if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + if (DoesSubstituteBlockMove(gBattlerAttacker, gActiveBattler, gCurrentMove) && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { if (gDisableStructs[gActiveBattler].substituteHP >= gBattleMoveDamage) { @@ -2002,7 +2002,7 @@ void SetMoveEffect(bool8 primary, u8 certain) && gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_STEAL_ITEM) INCREMENT_RESET_RETURN - if (gBattleMons[gEffectBattler].status2 & STATUS2_SUBSTITUTE && affectsUser != MOVE_EFFECT_AFFECTS_USER) + if (DoesSubstituteBlockMove(gBattlerAttacker, gEffectBattler, gCurrentMove) && affectsUser != MOVE_EFFECT_AFFECTS_USER) INCREMENT_RESET_RETURN if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) // status change @@ -5321,7 +5321,7 @@ static void atk5C_hitanimation(void) { gBattlescriptCurrInstr += 2; } - else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0) + else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(DoesSubstituteBlockMove(gBattlerAttacker, gActiveBattler, gCurrentMove)) || gDisableStructs[gActiveBattler].substituteHP == 0) { BtlController_EmitHitAnimation(0); MarkBattlerForControllerExec(gActiveBattler); @@ -7828,7 +7828,7 @@ static void atkA4_trysetencore(void) static void atkA5_painsplitdmgcalc(void) { - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE)) + if (!(DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove))) { s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + gBattleMons[gBattlerTarget].hp) / 2; s32 painSplitHp = gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - hpDiff; @@ -9537,9 +9537,24 @@ static void atkE8_settypebasedhalvers(void) // water and mud sport gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } -static void atkE9_nop(void) +bool32 DoesSubstituteBlockMove(u8 battlerAtk, u8 battlerDef, u32 move) { - gBattlescriptCurrInstr++; + if (!(gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE)) + return FALSE; + else if (gBattleMoves[move].flags & FLAG_SOUND && B_SOUND_SUBSTITUTE >= GEN_6) + return FALSE; + else if (GetBattlerAbility(battlerAtk) == ABILITY_INFILTRATOR) + return FALSE; + else + return TRUE; +} + +static void atkE9_jumpifsubstituteblocks(void) +{ + if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; } static void atkEA_tryrecycleitem(void) diff --git a/src/battle_util.c b/src/battle_util.c index 77923db9dd..863ce9f184 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -29,11 +29,6 @@ extern u8 weather_get_current(void); // rom const data -static const u16 sSoundMovesTable[] = -{ - MOVE_GROWL, MOVE_ROAR, MOVE_SING, MOVE_SUPERSONIC, MOVE_SCREECH, MOVE_SNORE, - MOVE_UPROAR, MOVE_METAL_SOUND, MOVE_GRASS_WHISTLE, MOVE_HYPER_VOICE, 0xFFFF -}; static const u8 sAbilitiesAffectedByMoldBreaker[] = { @@ -2777,24 +2772,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITYEFFECT_MOVES_BLOCK: // 2 - if (gLastUsedAbility == ABILITY_SOUNDPROOF) + if (gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND) { - for (i = 0; sSoundMovesTable[i] != 0xFFFF; i++) - { - if (sSoundMovesTable[i] == move) - break; - } - if (sSoundMovesTable[i] != 0xFFFF) - { - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - gBattlescriptCurrInstr = BattleScript_SoundproofProtected; - effect = 1; - } + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + gBattlescriptCurrInstr = BattleScript_SoundproofProtected; + effect = 1; } break; case ABILITYEFFECT_ABSORBING: // 3 - if (move) + if (move != MOVE_NONE) { u8 statId; switch (gLastUsedAbility)