Add Spicy Spray (#9769)
Some checks are pending
CI / build-emerald (push) Waiting to run
CI / build-firered (push) Waiting to run
CI / build-leafgreen (push) Waiting to run
CI / release (push) Waiting to run
CI / test (push) Waiting to run
CI / build (push) Blocked by required conditions
CI / docs_validate (push) Waiting to run
CI / allcontributors (push) Waiting to run

Co-authored-by: LinathanZel <linathan@DESKTOP-RVGNQ5E.localdomain>
This commit is contained in:
Linathan 2026-04-14 17:24:10 -04:00 committed by GitHub
parent 09c06ca859
commit bc09176a03
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 129 additions and 1 deletions

View File

@ -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;
}

View File

@ -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."),
},
};

View File

@ -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);
}
}