diff --git a/include/constants/abilities.h b/include/constants/abilities.h index 3f7b595e7..59250e521 100644 --- a/include/constants/abilities.h +++ b/include/constants/abilities.h @@ -254,6 +254,6 @@ #define ABILITIES_COUNT_GEN7 234 -#define ABILITIES_COUNT ABILITIES_COUNT_GEN4 +#define ABILITIES_COUNT ABILITIES_COUNT_GEN6 #endif // GUARD_CONSTANTS_ABILITIES_H diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 4fab97fd7..1d247a20b 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -10,5 +10,6 @@ #define B_CRIT_CHANCE GEN_6 // Chances of a critical hit landing. See atk04_critcalc. #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. #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/include/constants/moves.h b/include/constants/moves.h index f026614d6..f8683edbc 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -638,6 +638,6 @@ #define MOVES_COUNT_GEN6 622 -#define MOVES_COUNT MOVES_COUNT_GEN4 +#define MOVES_COUNT MOVES_COUNT_GEN5 #endif // GUARD_CONSTANTS_MOVES_H diff --git a/src/battle_debug.c b/src/battle_debug.c index a6aa4c9eb..5b8b847f5 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1170,7 +1170,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) break; case LIST_ITEM_MOVES: data->modifyArrows.minValue = 0; - data->modifyArrows.maxValue = MOVES_COUNT_GEN5 - 1; + data->modifyArrows.maxValue = MOVES_COUNT_GEN6 - 1; data->modifyArrows.maxDigits = 3; data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].moves[data->currentSecondaryListItemId]; data->modifyArrows.typeOfVal = VAL_U16; diff --git a/src/battle_main.c b/src/battle_main.c index c1c072d34..39ce13085 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -52,6 +52,7 @@ #include "international_string_util.h" #include "pokeball.h" #include "party_menu.h" +#include "constants\battle_config.h" struct UnknownPokemonStruct4 { @@ -4674,13 +4675,39 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) return speed; } +static s8 GetMovePriority(u8 battlerId) +{ + s8 priority; + u16 move; + + if (gProtectStructs[battlerId].noValidMoves) + move = MOVE_STRUGGLE; + else + move = gBattleMons[battlerId].moves[*(gBattleStruct->chosenMovePositions + battlerId)]; + + priority = gBattleMoves[move].priority; + if (GetBattlerAbility(battlerId) == ABILITY_GALE_WINGS + && gBattleMoves[move].type == TYPE_FLYING + && (B_GALE_WINGS == GEN_6 || BATTLER_MAX_HP(battlerId))) + { + priority++; + } + else if (GetBattlerAbility(battlerId) == ABILITY_PRANKSTER + && gBattleMoves[move].split == SPLIT_STATUS) + { + priority++; + } + + return priority; +} + u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) { u8 strikesFirst = 0; u32 speedBattler1 = 0, speedBattler2 = 0; - u16 moveBattler1 = 0, moveBattler2 = 0; u32 holdEffectBattler1 = 0, holdEffectBattler2 = 0; bool32 quickClawBattler1 = FALSE, quickClawBattler2 = FALSE; + s8 priority1 = 0, priority2 = 0; speedBattler1 = GetBattlerTotalSpeedStat(battler1); holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); @@ -4694,36 +4721,15 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler2)) / 100) quickClawBattler2 = TRUE; - if (ignoreChosenMoves) - { - moveBattler1 = MOVE_NONE; - moveBattler2 = MOVE_NONE; - } - else + if (!ignoreChosenMoves) { if (gChosenActionByBattler[battler1] == B_ACTION_USE_MOVE) - { - if (gProtectStructs[battler1].noValidMoves) - moveBattler1 = MOVE_STRUGGLE; - else - moveBattler1 = gBattleMons[battler1].moves[*(gBattleStruct->chosenMovePositions + battler1)]; - } - else - moveBattler1 = MOVE_NONE; - + priority1 = GetMovePriority(battler1); if (gChosenActionByBattler[battler2] == B_ACTION_USE_MOVE) - { - if (gProtectStructs[battler2].noValidMoves) - moveBattler2 = MOVE_STRUGGLE; - else - moveBattler2 = gBattleMons[battler2].moves[*(gBattleStruct->chosenMovePositions + battler2)]; - } - else - moveBattler2 = MOVE_NONE; + priority2 = GetMovePriority(battler2); } - - if (gBattleMoves[moveBattler1].priority == gBattleMoves[moveBattler2].priority) + if (priority1 == priority2) { // QUICK CLAW - always first // LAGGING TAIL - always last @@ -4765,7 +4771,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) } } } - else if (gBattleMoves[moveBattler1].priority < gBattleMoves[moveBattler2].priority) + else if (priority1 < priority2) { strikesFirst = 1; // battler2's move has greater priority }