diff --git a/src/battle_util.c b/src/battle_util.c index fbc6477532..6678083c77 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4256,6 +4256,20 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, enum BattlerId battler, enum effect++; } break; + case ABILITY_SPICY_SPRAY: + if (IsBattlerAlive(gBattlerAttacker) + && !gBattleStruct->unableToUseMove + && IsBattlerTurnDamaged(gBattlerTarget, EXCLUDING_SUBSTITUTES) + && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker))) + { + gEffectBattler = gBattlerAttacker; + gBattleScripting.battler = gBattlerTarget; + gBattleScripting.moveEffect = MOVE_EFFECT_BURN; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); + BattleScriptCall(BattleScript_AbilityStatusEffect); + effect++; + } + break; default: break; } diff --git a/src/data/abilities.h b/src/data/abilities.h index 73ca7c78a1..d8b0145cf3 100644 --- a/src/data/abilities.h +++ b/src/data/abilities.h @@ -2478,6 +2478,6 @@ const struct AbilityInfo gAbilitiesInfo[ABILITIES_COUNT] = [ABILITY_SPICY_SPRAY] = { .name = _("Spicy Spray"), - .description = COMPOUND_STRING("Unimplemented."), + .description = COMPOUND_STRING("Burns the foe when damaged."), }, }; diff --git a/test/battle/ability/spicy_spray.c b/test/battle/ability/spicy_spray.c new file mode 100644 index 0000000000..3fab0070f7 --- /dev/null +++ b/test/battle/ability/spicy_spray.c @@ -0,0 +1,114 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Spicy Spray burns the attacker") +{ + enum Move move; + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_SWIFT; } + GIVEN { + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + ASSUME(!MoveMakesContact(MOVE_SWIFT)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SCOVILLAIN) { Item(ITEM_SCOVILLAINITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + ABILITY_POPUP(opponent, ABILITY_SPICY_SPRAY); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, player); + STATUS_ICON(player, burn: TRUE); + } +} + +SINGLE_BATTLE_TEST("Spicy Spray burns the attacker even if the attacker is behind a Substitute") +{ + enum Move move; + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_SWIFT; } + GIVEN { + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + ASSUME(!MoveMakesContact(MOVE_SWIFT)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SCOVILLAIN) { Item(ITEM_SCOVILLAINITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); MOVE(player, MOVE_SUBSTITUTE); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + ABILITY_POPUP(opponent, ABILITY_SPICY_SPRAY); + STATUS_ICON(player, burn: TRUE); + } +} + +SINGLE_BATTLE_TEST("Spicy Spray does not burn the attacker if the defender is behind a Substitute") +{ + enum Move move; + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_SWIFT; } + GIVEN { + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + ASSUME(!MoveMakesContact(MOVE_SWIFT)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SCOVILLAIN) { Item(ITEM_SCOVILLAINITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE, gimmick: GIMMICK_MEGA); MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_SPICY_SPRAY); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, player); + STATUS_ICON(player, burn: TRUE); + } + } +} + +SINGLE_BATTLE_TEST("Spicy Spray burns the attacker even if the attacker has Sheer Force") +{ + enum Move move; + PARAMETRIZE { move = MOVE_CRUNCH; } + PARAMETRIZE { move = MOVE_ICE_BEAM; } + GIVEN { + ASSUME(MoveMakesContact(MOVE_CRUNCH)); + ASSUME(!MoveMakesContact(MOVE_ICE_BEAM)); + PLAYER(SPECIES_FERALIGATR) { Ability(ABILITY_SHEER_FORCE); } + OPPONENT(SPECIES_SCOVILLAIN) { Item(ITEM_SCOVILLAINITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + ABILITY_POPUP(opponent, ABILITY_SPICY_SPRAY); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, player); + STATUS_ICON(player, burn: TRUE); + } +} + +SINGLE_BATTLE_TEST("Spicy Spray burns the attacker even if the defender faints") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SCOVILLAIN) { Item(ITEM_SCOVILLAINITE); HP(1); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + ABILITY_POPUP(opponent, ABILITY_SPICY_SPRAY); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, player); + STATUS_ICON(player, burn: TRUE); + } +} + +SINGLE_BATTLE_TEST("Spicy Spray burns the attacker even if the defender behind a Substitute takes damage") +{ + GIVEN { + ASSUME(IsSoundMove(MOVE_HYPER_VOICE)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SCOVILLAIN) { Item(ITEM_SCOVILLAINITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE, gimmick: GIMMICK_MEGA); MOVE(player, MOVE_HYPER_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + ABILITY_POPUP(opponent, ABILITY_SPICY_SPRAY); + STATUS_ICON(player, burn: TRUE); + } +}