diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e880bf88bc..8a758e09f1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -286,7 +286,60 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectGrassyTerrain .4byte BattleScript_EffectElectricTerrain .4byte BattleScript_EffectPsychicTerrain + .4byte BattleScript_EffectAttackAccUp + .4byte BattleScript_EffectAttackSpAttackUp + .4byte BattleScript_EffectHurricane +BattleScript_EffectAttackSpAttackUp: + attackcanceler + attackstring + ppreduce + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, 0xC, BattleScript_AttackSpAttackUpDoMoveAnim + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPATK, 0xC, BattleScript_CantRaiseMultipleStats +BattleScript_AttackSpAttackUpDoMoveAnim:: + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF, 0x0 + setstatchanger STAT_ATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, BattleScript_AttackSpAttackUpTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackSpAttackUpTrySpDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_AttackSpAttackUpTrySpDef:: + setstatchanger STAT_SPATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, BattleScript_AttackSpAttackUpEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackSpAttackUpEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_AttackSpAttackUpEnd: + goto BattleScript_MoveEnd + +BattleScript_EffectAttackAccUp: + attackcanceler + attackstring + ppreduce + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, 0xC, BattleScript_AttackAccUpDoMoveAnim + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ACC, 0xC, BattleScript_CantRaiseMultipleStats +BattleScript_AttackAccUpDoMoveAnim:: + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF, 0x0 + setstatchanger STAT_ATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, BattleScript_AttackAccUpTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackAccUpTrySpDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_AttackAccUpTrySpDef:: + setstatchanger STAT_ACC, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, BattleScript_AttackAccUpEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackAccUpEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_AttackAccUpEnd: + goto BattleScript_MoveEnd + BattleScript_EffectMistyTerrain: BattleScript_EffectGrassyTerrain: BattleScript_EffectElectricTerrain: @@ -2501,12 +2554,17 @@ BattleScript_SolarbeamOnFirstTurn:: ppreduce goto BattleScript_TwoTurnMovesSecondTurn -BattleScript_EffectThunder:: +BattleScript_EffectThunder: setmoveeffect MOVE_EFFECT_PARALYSIS orword gHitMarker, HITMARKER_IGNORE_ON_AIR goto BattleScript_EffectHit + +BattleScript_EffectHurricane: + setmoveeffect MOVE_EFFECT_CONFUSION + orword gHitMarker, HITMARKER_IGNORE_ON_AIR + goto BattleScript_EffectHit -BattleScript_EffectTeleport:: +BattleScript_EffectTeleport: attackcanceler attackstring ppreduce diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 4fb18611a1..6f20a8f1b9 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -275,5 +275,8 @@ #define EFFECT_GRASSY_TERRAIN 269 #define EFFECT_ELECTRIC_TERRAIN 270 #define EFFECT_PSYCHIC_TERRAIN 271 +#define EFFECT_ATTACK_ACCURACY_UP 272 +#define EFFECT_ATTACK_SPATK_UP 273 +#define EFFECT_HURRICANE 274 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 5dd095c790..a0900fff0f 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -96,6 +96,7 @@ #define FLAG_DMG_UNDERGROUND 0x4000 #define FLAG_DMG_UNDERWATER 0x8000 #define FLAG_SOUND 0x10000 +#define FLAG_BALLISTIC 0x20000 // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index fb5ca5b63c..970f2f5a86 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -1464,7 +1464,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_BALLISTIC, .split = SPLIT_PHYSICAL, }, { // MOVE_LICK @@ -1692,7 +1692,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_BALLISTIC, .split = SPLIT_PHYSICAL, }, { // MOVE_LEECH_LIFE @@ -2268,7 +2268,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_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_MUD_SLAP @@ -2292,7 +2292,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_SPIKES @@ -2316,7 +2316,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .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_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_FORESIGHT @@ -2976,7 +2976,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_FUTURE_SIGHT @@ -3564,7 +3564,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_FEATHER_DANCE @@ -3624,7 +3624,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, .split = SPLIT_PHYSICAL, }, { // MOVE_NEEDLE_ARM @@ -3744,7 +3744,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_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_AROMATHERAPY @@ -3984,7 +3984,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_BALLISTIC, .split = SPLIT_PHYSICAL, }, { // MOVE_AERIAL_ACE @@ -4212,7 +4212,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_BALLISTIC, .split = SPLIT_PHYSICAL, }, { // MOVE_SHOCK_WAVE @@ -4332,7 +4332,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, .split = SPLIT_PHYSICAL, }, { // MOVE_HEALING_WISH @@ -4764,7 +4764,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 | FLAG_MEGA_LAUNCHER_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_MEGA_LAUNCHER_BOOST | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_ROCK_POLISH @@ -4944,7 +4944,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_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_ENERGY_BALL @@ -4956,7 +4956,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_BRAVE_BIRD @@ -5124,7 +5124,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_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_PSYCHO_CUT @@ -5280,7 +5280,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_BALLISTIC, .split = SPLIT_PHYSICAL, }, { // MOVE_CROSS_POISON @@ -5328,7 +5328,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_BALLISTIC, .split = SPLIT_PHYSICAL, }, { // MOVE_STONE_EDGE @@ -5620,7 +5620,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HONE_CLAWS - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ATTACK_ACCURACY_UP, .power = 0, .type = TYPE_DARK, .accuracy = 0, @@ -5844,7 +5844,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_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_SOAK @@ -5904,7 +5904,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .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_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_FOUL_PLAY @@ -6316,7 +6316,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_WORK_UP - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ATTACK_SPATK_UP, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -6424,7 +6424,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HEAT_CRASH - .effect = EFFECT_HEAT_CRASH, // Needs a custom move effect (maybe the same as heavy slam?) + .effect = EFFECT_HEAT_CRASH, .power = 1, .type = TYPE_FIRE, .accuracy = 100, @@ -6508,7 +6508,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HURRICANE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_HURRICANE, .power = 110, .type = TYPE_FLYING, .accuracy = 70, @@ -6544,7 +6544,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SEARING_SHOT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (30% burn, does not affect opponents with BULLETPROOF) + .effect = EFFECT_BURN_HIT, .power = 100, .type = TYPE_FIRE, .accuracy = 100, @@ -6552,7 +6552,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 30, .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_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_TECHNO_BLAST diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1740d9c389..dcdb39c3a5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1137,7 +1137,7 @@ static bool32 AccuracyCalcHelper(u16 move) gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; - if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && gBattleMoves[move].effect == EFFECT_THUNDER) + if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW)) { JumpIfMoveFailed(7, move); @@ -1199,8 +1199,8 @@ static void atk01_accuracycheck(void) buff = 0xC; moveAcc = gBattleMoves[move].accuracy; - // Check Thunder on sunny weather. - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && gBattleMoves[move].effect == EFFECT_THUNDER) + // Check Thunder and Hurricane on sunny weather. + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) moveAcc = 50; // Check Wonder Skin. if (defAbility == ABILITY_WONDER_SKIN && gBattleMoves[move].power == 0) diff --git a/src/battle_util.c b/src/battle_util.c index 2f3d1cdede..3c03ae4f7c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2822,7 +2822,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITYEFFECT_MOVES_BLOCK: // 2 - if (gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND) + if ((gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND) + || (gLastUsedAbility == ABILITY_BULLETPROOF && gBattleMoves[move].flags & FLAG_BALLISTIC)) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) gHitMarker |= HITMARKER_NO_PPDEDUCT;