Fixes Throat Spray being blocked by Sheer Force (#7808)

This commit is contained in:
Alex 2025-09-27 21:59:31 +02:00 committed by GitHub
parent 027a4380b6
commit e5e0800b90
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 31 additions and 18 deletions

View File

@ -155,14 +155,14 @@ enum MoveEndEffects
MOVEEND_ITEM_EFFECTS_ATTACKER,
MOVEEND_ABILITY_BLOCK,
MOVEEND_SHEER_FORCE, // If move is Sheer Force affected, skip until Opportunist
MOVEEND_RED_CARD, // Red Card triggers before Eject Pack
MOVEEND_RED_CARD,
MOVEEND_EJECT_BUTTON,
MOVEEND_LIFEORB_SHELLBELL, // Includes shell bell, throat spray, etc
MOVEEND_LIFEORB_SHELLBELL,
MOVEEND_FORM_CHANGE,
MOVEEND_EMERGENCY_EXIT,
MOVEEND_EJECT_PACK,
MOVEEND_HIT_ESCAPE,
MOVEEND_OPPORTUNIST, // Occurs after other stat change items/abilities to try and copy the boosts
MOVEEND_OPPORTUNIST,
MOVEEND_PICKPOCKET,
MOVEEND_WHITE_HERB,
MOVEEND_THIRD_MOVE_BLOCK,

View File

@ -6501,6 +6501,21 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect)
case HOLD_EFFECT_MIRROR_HERB:
effect = TryConsumeMirrorHerb(battler, ITEMEFFECT_NONE);
break;
case HOLD_EFFECT_THROAT_SPRAY:
if (IsSoundMove(gCurrentMove)
&& !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)
&& IsBattlerAlive(gBattlerAttacker)
&& IsAnyTargetAffected(gBattlerAttacker)
&& CompareStat(gBattlerAttacker, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)
&& !NoAliveMonsForEitherParty()) // Don't activate if battle will end
{
gLastUsedItem = gBattleMons[gBattlerAttacker].item;
gBattleScripting.battler = gBattlerAttacker;
SET_STATCHANGER(STAT_SPATK, 1, FALSE);
effect = ITEM_STATS_CHANGE;
BattleScriptCall(BattleScript_AttackerItemStatRaise);
}
break;
default:
break;
}
@ -7089,21 +7104,6 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler)
gLastUsedItem = atkItem;
}
break;
case HOLD_EFFECT_THROAT_SPRAY: // Does NOT need to be a damaging move
if (IsSoundMove(gCurrentMove)
&& !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)
&& IsBattlerAlive(gBattlerAttacker)
&& IsAnyTargetAffected(gBattlerAttacker)
&& CompareStat(gBattlerAttacker, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)
&& !NoAliveMonsForEitherParty()) // Don't activate if battle will end
{
gLastUsedItem = atkItem;
gBattleScripting.battler = gBattlerAttacker;
SET_STATCHANGER(STAT_SPATK, 1, FALSE);
effect = ITEM_STATS_CHANGE;
BattleScriptCall(BattleScript_AttackerItemStatRaise);
}
break;
default:
break;
}

View File

@ -104,3 +104,16 @@ SINGLE_BATTLE_TEST("Throat Spray does not activate if user flinches")
}
}
}
SINGLE_BATTLE_TEST("Throat Spray is not blocked by Sheer Force")
{
GIVEN {
PLAYER(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); Item(ITEM_THROAT_SPRAY); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_BUG_BUZZ); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_BUG_BUZZ, player);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player);
}
}