From d64dc2bbe890f210d653fede84151bd37ca1bc98 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 24 Oct 2021 17:55:37 +1300 Subject: [PATCH 1/7] Sleep moves don't check target's type Dark types aren't immune to Hypnosis, Ghost types aren't immune to Yawn or Lovely Kiss, so this check isn't needed. --- src/battle_ai_util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index fef6e6c6ff..0c3bf717a9 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2606,7 +2606,6 @@ bool32 AI_CanSleep(u8 battler, u16 ability) bool32 AI_CanPutToSleep(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, u16 partnerMove) { if (!AI_CanSleep(battlerDef, defAbility) - || AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0 || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(BATTLE_PARTNER(battlerAtk), battlerDef, partnerMove)) // shouldn't try to sleep mon that partner is trying to make sleep return FALSE; From bbe2eccf62c210926739a324d4d001dd1e7bbcda Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 24 Oct 2021 17:57:06 +1300 Subject: [PATCH 2/7] Fix typo CanBeParayzed to CanBeParalyzed --- src/battle_ai_util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 0c3bf717a9..dc2be7fd51 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2653,7 +2653,7 @@ bool32 AI_CanPoison(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, u16 return TRUE; } -static bool32 CanBeParayzed(u8 battler, u16 ability) +static bool32 CanBeParalyzed(u8 battler, u16 ability) { if (ability == ABILITY_LIMBER || IS_BATTLER_OF_TYPE(battler, TYPE_ELECTRIC) @@ -2665,7 +2665,7 @@ static bool32 CanBeParayzed(u8 battler, u16 ability) bool32 AI_CanParalyze(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, u16 partnerMove) { - if (!CanBeParayzed(battlerDef, defAbility) + if (!CanBeParalyzed(battlerDef, defAbility) || AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0 || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) From 4310868bee6d4ddb0f8a238ef1d003896a79b7d7 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 24 Oct 2021 18:49:17 +1300 Subject: [PATCH 3/7] AI handles multi-strike and fixed dmg moves Does not account for Parental Bond or Beat Up yet as those require some functions from #1676. --- include/battle_util.h | 5 ++- src/battle_ai_util.c | 90 +++++++++++++++++++++++++++++++++++++++---- src/battle_util.c | 26 +++++++++++++ 3 files changed, 113 insertions(+), 8 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index ee7337ef2d..5ffc901c3e 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -156,7 +156,7 @@ void BufferStatChange(u8 battlerId, u8 statId, u8 stringId); void DoBurmyFormChange(u32 monId); bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 checkTarget); -// ability checks +// Ability checks bool32 IsRolePlayBannedAbilityAtk(u16 ability); bool32 IsRolePlayBannedAbility(u16 ability); bool32 IsSkillSwapBannedAbility(u16 ability); @@ -173,4 +173,7 @@ bool32 CanBeFrozen(u8 battlerId); bool32 CanBeConfused(u8 battlerId); bool32 IsBattlerTerrainAffected(u8 battlerId, u32 terrainFlag); +// Move checks +bool8 IsTwoStrikesMove(u16 move); + #endif // GUARD_BATTLE_UTIL_H diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index dc2be7fd51..cf9980ee48 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -733,20 +733,85 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) else dmg = (critDmg + normalDmg * (critChance - 1)) / critChance; - // handle dynamic move damage + // Handle dynamic move damage switch (gBattleMoves[move].effect) { case EFFECT_LEVEL_DAMAGE: case EFFECT_PSYWAVE: - //psywave's expected damage is equal to the user's level - dmg = gBattleMons[battlerAtk].level; + { + // Psywave's expected damage is equal to the user's level + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) + dmg = 2 * gBattleMons[battlerAtk].level; + else + dmg = gBattleMons[battlerAtk].level; break; + } case EFFECT_DRAGON_RAGE: - dmg = 40; + { + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) + dmg = 80; + else + dmg = 40; break; + } case EFFECT_SONICBOOM: - dmg = 20; + { + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) + dmg = 40; + else + dmg = 20; break; + } + case EFFECT_MULTI_HIT: + { + if (AI_DATA->atkAbility == ABILITY_SKILL_LINK) + dmg *= 5; + else + dmg *= 3; // Average number of hits is three + break; + } + case EFFECT_TRIPLE_KICK: + { + if (AI_DATA->atkAbility == ABILITY_SKILL_LINK) + dmg *= 6; // Skill Link ensures the 2nd and 3rd hits will connect if the first does + else + dmg *= 5; // Triple Kick/Triple Axel's average power is almost 5x its base power + break; + } + case EFFECT_ENDEAVOR: + { + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + else + // If target has less HP than user, Endeavor does no damage + dmg = max(0, gBattleMons[battlerDef].hp - gBattleMons[battlerAtk].hp); + break; + } + case EFFECT_SUPER_FANG: + { + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + // Two hits of Super Fang halves HP twice, leaving target with 25% HP + else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) + dmg = gBattleMons[battlerDef].hp * 3 / 4; + else + dmg = gBattleMons[battlerDef].hp / 2; + break; + } + case EFFECT_FINAL_GAMBIT: + { + if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) + dmg = 0; + else + dmg = gBattleMons[battlerAtk].hp; + break; + } //case EFFECT_METAL_BURST: //case EFFECT_COUNTER: default: @@ -755,6 +820,17 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) break; } + // Handle other multi-strike moves + if (IsTwoStrikesMove(move)) + { + dmg *= 2; + } + else if (move == MOVE_SURGING_STRIKES + || (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)) + { + dmg *= 3; + } + RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); @@ -2653,7 +2729,7 @@ bool32 AI_CanPoison(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, u16 return TRUE; } -static bool32 CanBeParalyzed(u8 battler, u16 ability) +static bool32 AI_CanBeParalyzed(u8 battler, u16 ability) { if (ability == ABILITY_LIMBER || IS_BATTLER_OF_TYPE(battler, TYPE_ELECTRIC) @@ -2665,7 +2741,7 @@ static bool32 CanBeParalyzed(u8 battler, u16 ability) bool32 AI_CanParalyze(u8 battlerAtk, u8 battlerDef, u16 defAbility, u16 move, u16 partnerMove) { - if (!CanBeParalyzed(battlerDef, defAbility) + if (!AI_CanBeParalyzed(battlerDef, defAbility) || AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0 || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) diff --git a/src/battle_util.c b/src/battle_util.c index 33dd0f5de1..cc9e2fc164 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -217,6 +217,20 @@ static const u16 sEntrainmentTargetSimpleBeamBannedAbilities[] = ABILITY_GULP_MISSILE, }; +static const u16 sTwoStrikeMoves[] = +{ + MOVE_BONEMERANG, + MOVE_DOUBLE_HIT, + MOVE_DOUBLE_IRON_BASH, + MOVE_DOUBLE_KICK, + MOVE_DRAGON_DARTS, + MOVE_DUAL_CHOP, + MOVE_DUAL_WINGBEAT, + MOVE_GEAR_GRIND, + MOVE_TWINEEDLE, + 0xFFFF +}; + bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) { u32 ability = GetBattlerAbility(battlerAtk); @@ -9509,3 +9523,15 @@ bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 chec #endif return FALSE; } + +bool8 IsTwoStrikesMove(u16 move) +{ + u32 i; + + for (i = 0; i < ARRAY_COUNT(sTwoStrikeMoves); i++) + { + if (move == sTwoStrikeMoves[i]) + return TRUE; + } + return FALSE; +} From 4faa0776415f31b371bc44311799d1b758a8585c Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Tue, 26 Oct 2021 13:41:08 +1300 Subject: [PATCH 4/7] Triple Kick, Super Fang tweaks Ignore accuracy for Triple Kick and assume all hits will connect. Super Fang always does at least 1 damage, so this should be accounted for. --- src/battle_ai_util.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index cf9980ee48..3535e800c1 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -778,10 +778,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) } case EFFECT_TRIPLE_KICK: { - if (AI_DATA->atkAbility == ABILITY_SKILL_LINK) - dmg *= 6; // Skill Link ensures the 2nd and 3rd hits will connect if the first does - else - dmg *= 5; // Triple Kick/Triple Axel's average power is almost 5x its base power + dmg *= 6; break; } case EFFECT_ENDEAVOR: @@ -799,9 +796,9 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) dmg = 0; // Two hits of Super Fang halves HP twice, leaving target with 25% HP else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = gBattleMons[battlerDef].hp * 3 / 4; + dmg = max(1, gBattleMons[battlerDef].hp * 3 / 4); else - dmg = gBattleMons[battlerDef].hp / 2; + dmg = max(1, gBattleMons[battlerDef].hp / 2); break; } case EFFECT_FINAL_GAMBIT: From 8af882348a504d953997baa2faf5a50c12e59009 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Tue, 2 Nov 2021 16:56:12 +1300 Subject: [PATCH 5/7] Fix Parental Bond Super Fang Min damage should be 2 --- src/battle_ai_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 3535e800c1..9478d73439 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -796,7 +796,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) dmg = 0; // Two hits of Super Fang halves HP twice, leaving target with 25% HP else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = max(1, gBattleMons[battlerDef].hp * 3 / 4); + dmg = max(2, gBattleMons[battlerDef].hp * 3 / 4); else dmg = max(1, gBattleMons[battlerDef].hp / 2); break; From a2574b55cc231b4fa6b44878f0d699e17fecd5c3 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Thu, 4 Nov 2021 16:09:28 +1300 Subject: [PATCH 6/7] Fix dynamic move damage calculation Can't check effectiveness here without breaking the AI. After testing, it also appears that it doesn't need to be checked here after all. --- src/battle_ai_util.c | 80 +++++++------------------------------------- 1 file changed, 12 insertions(+), 68 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index ab7cc6b535..884e0fa374 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -738,95 +738,39 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) { case EFFECT_LEVEL_DAMAGE: case EFFECT_PSYWAVE: - { - // Psywave's expected damage is equal to the user's level - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = 2 * gBattleMons[battlerAtk].level; - else - dmg = gBattleMons[battlerAtk].level; + dmg = gBattleMons[battlerAtk].level * (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND ? 2 : 1); break; - } case EFFECT_DRAGON_RAGE: - { - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = 80; - else - dmg = 40; + dmg = 40 * (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND ? 2 : 1); break; - } case EFFECT_SONICBOOM: - { - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = 40; - else - dmg = 20; + dmg = 20 * (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND ? 2 : 1); break; - } case EFFECT_MULTI_HIT: - { - if (AI_DATA->atkAbility == ABILITY_SKILL_LINK) - dmg *= 5; - else - dmg *= 3; // Average number of hits is three + dmg *= (AI_DATA->atkAbility == ABILITY_SKILL_LINK ? 5 : 3); break; - } case EFFECT_TRIPLE_KICK: - { - dmg *= 6; + dmg *= (AI_DATA->atkAbility == ABILITY_SKILL_LINK ? 6 : 5); break; - } case EFFECT_ENDEAVOR: - { - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - else - // If target has less HP than user, Endeavor does no damage - dmg = max(0, gBattleMons[battlerDef].hp - gBattleMons[battlerAtk].hp); + // If target has less HP than user, Endeavor does no damage + dmg = max(0, gBattleMons[battlerDef].hp - gBattleMons[battlerAtk].hp); break; - } case EFFECT_SUPER_FANG: - { - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - // Two hits of Super Fang halves HP twice, leaving target with 25% HP - else if (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND) - dmg = max(2, gBattleMons[battlerDef].hp * 3 / 4); - else - dmg = max(1, gBattleMons[battlerDef].hp / 2); + dmg = (AI_DATA->atkAbility == ABILITY_PARENTAL_BOND + ? max(2, gBattleMons[battlerDef].hp * 3 / 4) + : max(1, gBattleMons[battlerDef].hp / 2)); break; - } case EFFECT_FINAL_GAMBIT: - { - if (AI_GetMoveEffectiveness(move, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0) - dmg = 0; - else - dmg = gBattleMons[battlerAtk].hp; - break; - } - //case EFFECT_METAL_BURST: - //case EFFECT_COUNTER: - default: - //do not add the random factor, it's an average case analysis - //dmg *= (100 - (Random() % 10)) / 100; // add random factor + dmg = gBattleMons[battlerAtk].hp; break; } // Handle other multi-strike moves if (IsTwoStrikesMove(move)) - { dmg *= 2; - } - else if (move == MOVE_SURGING_STRIKES - || (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)) - { + else if (move == MOVE_SURGING_STRIKES || (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)) dmg *= 3; - } RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); From 7d1009768440b5c28a641f1700a45837af3d871c Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Thu, 4 Nov 2021 17:11:56 +1300 Subject: [PATCH 7/7] Replace IsTwoStrikesMove with FLAG_TWO_STRIKES Note that this flag does nothing until the Parental Bond PR is merged - it's just for the AI until then. --- include/battle_util.h | 3 --- include/constants/pokemon.h | 1 + src/battle_ai_util.c | 2 +- src/battle_util.c | 26 -------------------------- src/data/battle_moves.h | 20 ++++++++++---------- 5 files changed, 12 insertions(+), 40 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index ac27461bd2..aa2a3d8386 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -175,7 +175,4 @@ bool32 CanBeFrozen(u8 battlerId); bool32 CanBeConfused(u8 battlerId); bool32 IsBattlerTerrainAffected(u8 battlerId, u32 terrainFlag); -// Move checks -bool8 IsTwoStrikesMove(u16 move); - #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 4e776e592b..959148e6c8 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -308,6 +308,7 @@ #define FLAG_DMG_UNGROUNDED_IGNORE_TYPE_IF_FLYING (1 << 24) // Makes a Ground type move do 1x damage to flying and levitating targets #define FLAG_THAW_USER (1 << 25) #define FLAG_HIT_IN_SUBSTITUTE (1 << 26) // Hyperspace Fury +#define FLAG_TWO_STRIKES (1 << 27) // A move with this flag will strike twice, and may apply its effect on each hit // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 884e0fa374..4fd01418c2 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -767,7 +767,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) } // Handle other multi-strike moves - if (IsTwoStrikesMove(move)) + if (gBattleMoves[move].flags & FLAG_TWO_STRIKES) dmg *= 2; else if (move == MOVE_SURGING_STRIKES || (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)) dmg *= 3; diff --git a/src/battle_util.c b/src/battle_util.c index 82d6ddcbd9..05c7af1229 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -217,20 +217,6 @@ static const u16 sEntrainmentTargetSimpleBeamBannedAbilities[] = ABILITY_GULP_MISSILE, }; -static const u16 sTwoStrikeMoves[] = -{ - MOVE_BONEMERANG, - MOVE_DOUBLE_HIT, - MOVE_DOUBLE_IRON_BASH, - MOVE_DOUBLE_KICK, - MOVE_DRAGON_DARTS, - MOVE_DUAL_CHOP, - MOVE_DUAL_WINGBEAT, - MOVE_GEAR_GRIND, - MOVE_TWINEEDLE, - 0xFFFF -}; - bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) { u32 ability = GetBattlerAbility(battlerAtk); @@ -9620,15 +9606,3 @@ bool32 IsBattlerWeatherAffected(u8 battlerId, u32 weatherFlags) } return FALSE; } - -bool8 IsTwoStrikesMove(u16 move) -{ - u32 i; - - for (i = 0; i < ARRAY_COUNT(sTwoStrikeMoves); i++) - { - if (move == sTwoStrikeMoves[i]) - return TRUE; - } - return FALSE; -} diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 97d61202a4..f4ace39155 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -378,7 +378,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -649,7 +649,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -2460,7 +2460,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -7267,7 +7267,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -8367,7 +8367,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -8575,7 +8575,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -10726,9 +10726,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_DOUBLE_IRON_BASH] = { #if B_UPDATED_MOVE_DATA >= GEN_8 - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST | FLAG_TWO_STRIKES, #else - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST | FLAG_TWO_STRIKES, #endif .effect = EFFECT_DOUBLE_IRON_BASH, .power = 60, @@ -10850,7 +10850,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, }, @@ -11480,7 +11480,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TWO_STRIKES, .split = SPLIT_PHYSICAL, },