From 43ad1a4d3b3e14deaf4e904fa11566eea6e5049b Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Tue, 18 Jul 2023 03:07:14 -0400 Subject: [PATCH] Unified multi-strike move flags (#3126) * Unified twoStrikes and threeStrikes flags into strikeCount * Decreased strikeCount max from 255 to 15. --- include/pokemon.h | 3 +-- src/battle_ai_util.c | 6 +++--- src/battle_script_commands.c | 3 +-- src/battle_util.c | 16 ++++++---------- src/data/battle_moves.h | 24 ++++++++++++------------ test/move_flag_three_strikes.c | 4 ++-- 6 files changed, 25 insertions(+), 31 deletions(-) diff --git a/include/pokemon.h b/include/pokemon.h index aa4f26a4c..c33e7bb81 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -376,8 +376,7 @@ struct BattleMove u32 ignoreTypeIfFlyingAndUngrounded:1; u32 thawsUser:1; u32 ignoresSubstitute:1; - u32 twoStrikes:1; // May apply its effect on each hit. - u32 threeStrikes:1; // May apply its effect on each hit. + u32 strikeCount:4; // Max 15 hits. Defaults to 1 if not set. May apply its effect on each hit. u32 meFirstBanned:1; u32 gravityBanned:1; u32 mimicBanned:1; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index e9edf8dc5..3e8c5ae87 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -864,9 +864,9 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *typeEffectiveness, } // Handle other multi-strike moves - if (gBattleMoves[move].twoStrikes) - dmg *= 2; - else if (gBattleMoves[move].threeStrikes || (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)) + if (gBattleMoves[move].strikeCount > 1) + dmg *= gBattleMoves[move].strikeCount; + else if (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH) dmg *= 3; if (dmg == 0) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f97fd2cd0..1c6a2e677 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -16034,8 +16034,7 @@ bool8 IsMoveAffectedByParentalBond(u16 move, u8 battlerId) { if (move != MOVE_NONE && move != MOVE_STRUGGLE && gBattleMoves[move].split != SPLIT_STATUS - && !gBattleMoves[move].twoStrikes - && !gBattleMoves[move].threeStrikes) + && !gBattleMoves[move].strikeCount > 2) { u32 i; for (i = 0; i < ARRAY_COUNT(sParentalBondBannedEffects); i++) diff --git a/src/battle_util.c b/src/battle_util.c index fc16d0aff..0f1613cb9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3743,21 +3743,17 @@ u8 AtkCanceller_UnableToUseMove(void) PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } - else if (gBattleMoves[gCurrentMove].twoStrikes) + else if (gBattleMoves[gCurrentMove].strikeCount > 1) { - gMultiHitCounter = 2; - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) - if (gCurrentMove == MOVE_DRAGON_DARTS) - { - // TODO - } + gMultiHitCounter = gBattleMoves[gCurrentMove].strikeCount; + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) } - else if (gBattleMoves[gCurrentMove].effect == EFFECT_TRIPLE_KICK || gBattleMoves[gCurrentMove].threeStrikes) + else if (gBattleMoves[gCurrentMove].effect == EFFECT_TRIPLE_KICK) { gMultiHitCounter = 3; PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } - #if B_BEAT_UP >= GEN_5 + #if B_BEAT_UP >= GEN_5 else if (gBattleMoves[gCurrentMove].effect == EFFECT_BEAT_UP) { struct Pokemon* party = GetBattlerParty(gBattlerAttacker); @@ -3775,7 +3771,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleStruct->beatUpSlot = 0; PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } - #endif + #endif gBattleStruct->atkCancellerTracker++; break; case CANCELLER_END: diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 96e6e5648..00082d6ec 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -428,7 +428,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_MEGA_KICK] = @@ -716,7 +716,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .zMoveEffect = Z_EFFECT_NONE, .sheerForceBoost = TRUE, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_5, // && B_UPDATED_MOVE_FLAGS > GEN_2 - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_PIN_MISSILE] = @@ -2680,7 +2680,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .priority = 0, .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_REST] = @@ -7767,7 +7767,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_ROAR_OF_TIME] = @@ -8930,7 +8930,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_HEART_STAMP] = @@ -9158,7 +9158,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_SEARING_SHOT] = @@ -11540,7 +11540,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .makesContact = TRUE, .punchingMove = TRUE, .sheerForceBoost = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS < GEN_8, .metronomeBanned = TRUE, }, @@ -11668,7 +11668,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .priority = 0, .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_TEATIME] = @@ -12372,7 +12372,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .twoStrikes = TRUE, + .strikeCount = 2, }, [MOVE_SCORCHING_SANDS] = @@ -12441,7 +12441,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, .punchingMove = TRUE, - .threeStrikes = TRUE, + .strikeCount = 3, .metronomeBanned = TRUE, }, @@ -13241,7 +13241,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .split = SPLIT_PHYSICAL, .zMoveEffect = Z_EFFECT_NONE, .makesContact = TRUE, - .threeStrikes = TRUE, + .strikeCount = 3, }, [MOVE_MORTAL_SPIN] = @@ -13566,7 +13566,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .priority = 0, .split = SPLIT_SPECIAL, .zMoveEffect = Z_EFFECT_NONE, - .twoStrikes = TRUE, + .strikeCount = 2, .metronomeBanned = TRUE, }, diff --git a/test/move_flag_three_strikes.c b/test/move_flag_three_strikes.c index acb7effc0..21debc730 100644 --- a/test/move_flag_three_strikes.c +++ b/test/move_flag_three_strikes.c @@ -8,7 +8,7 @@ SINGLE_BATTLE_TEST("Three-strike flag turns a move into a 3-hit move") s16 thirdHit; GIVEN { - ASSUME(gBattleMoves[MOVE_TRIPLE_DIVE].threeStrikes); + ASSUME(gBattleMoves[MOVE_TRIPLE_DIVE].strikeCount == 3); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Surging Strikes hits 3 times with each hit being a critical s16 thirdHit; GIVEN { - ASSUME(gBattleMoves[MOVE_SURGING_STRIKES].threeStrikes); + ASSUME(gBattleMoves[MOVE_SURGING_STRIKES].strikeCount == 3); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN {