diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5f951f8c7e..7736a57ae3 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2991,30 +2991,31 @@ void SetMoveEffect(enum BattlerId battlerAtk, enum BattlerId effectBattler, enum } break; case MOVE_EFFECT_SECRET_POWER: - if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + if (IsBattlerAlive(battlerAtk)) { - switch (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + moveEffect = gBattleEnvironmentInfo[gBattleEnvironment].secretPowerEffect; + if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) { - case STATUS_FIELD_MISTY_TERRAIN: - moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1; - break; - case STATUS_FIELD_GRASSY_TERRAIN: - moveEffect = MOVE_EFFECT_SLEEP; - break; - case STATUS_FIELD_ELECTRIC_TERRAIN: - moveEffect = MOVE_EFFECT_PARALYSIS; - break; - case STATUS_FIELD_PSYCHIC_TERRAIN: - moveEffect = MOVE_EFFECT_SPD_MINUS_1; - break; - default: - moveEffect = MOVE_EFFECT_PARALYSIS; - break; + switch (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + case STATUS_FIELD_MISTY_TERRAIN: + moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1; + break; + case STATUS_FIELD_GRASSY_TERRAIN: + moveEffect = MOVE_EFFECT_SLEEP; + break; + case STATUS_FIELD_ELECTRIC_TERRAIN: + moveEffect = MOVE_EFFECT_PARALYSIS; + break; + case STATUS_FIELD_PSYCHIC_TERRAIN: + moveEffect = MOVE_EFFECT_SPD_MINUS_1; + break; + default: + moveEffect = MOVE_EFFECT_PARALYSIS; + break; + } } - } - else - { - SetMoveEffect(battlerAtk, effectBattler, gBattleEnvironmentInfo[gBattleEnvironment].secretPowerEffect, battleScript, effectFlags); + SetMoveEffect(battlerAtk, effectBattler, moveEffect, battleScript, effectFlags); } break; case MOVE_EFFECT_PSYCHIC_NOISE: diff --git a/test/battle/move_effect_secondary/secret_power.c b/test/battle/move_effect_secondary/secret_power.c new file mode 100644 index 0000000000..f2c1016cb6 --- /dev/null +++ b/test/battle/move_effect_secondary/secret_power.c @@ -0,0 +1,73 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(MoveHasAdditionalEffect(MOVE_SECRET_POWER, MOVE_EFFECT_SECRET_POWER) == TRUE); +} + +SINGLE_BATTLE_TEST("Secret Power inflicts paralysis in Electric Terrain") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_ELECTRIC_TERRAIN) == EFFECT_ELECTRIC_TERRAIN); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_ELECTRIC_TERRAIN); MOVE(player, MOVE_SECRET_POWER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SECRET_POWER, player); + STATUS_ICON(opponent, paralysis: TRUE); + } +} + +SINGLE_BATTLE_TEST("Secret Power inflicts sleep in Grassy Terrain") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_GRASSY_TERRAIN) == EFFECT_GRASSY_TERRAIN); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_GRASSY_TERRAIN); MOVE(player, MOVE_SECRET_POWER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASSY_TERRAIN, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SECRET_POWER, player); + STATUS_ICON(opponent, sleep: TRUE); + } +} + +SINGLE_BATTLE_TEST("Secret Power lowers Speed in Psychic Terrain") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_PSYCHIC_TERRAIN) == EFFECT_PSYCHIC_TERRAIN); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_PSYCHIC_TERRAIN); MOVE(player, MOVE_SECRET_POWER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHIC_TERRAIN, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SECRET_POWER, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } +} + +SINGLE_BATTLE_TEST("Secret Power lowers Sp. Atk in Misty Terrain") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_MISTY_TERRAIN) == EFFECT_MISTY_TERRAIN); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_MISTY_TERRAIN); MOVE(player, MOVE_SECRET_POWER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_TERRAIN, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SECRET_POWER, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE - 1); + } +} + +TO_DO_BATTLE_TEST("Secret Power doesn't inflict secondary effects when user fainted");