Fix Unseen Fist triggering protection move side effects (#9428)
Some checks are pending
CI / build (push) Waiting to run
CI / docs_validate (push) Waiting to run
CI / allcontributors (push) Waiting to run
Docs / deploy (push) Waiting to run

This commit is contained in:
GGbond 2026-03-05 15:29:37 +08:00 committed by GitHub
parent 18de04499e
commit 41c02c206f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 53 additions and 2 deletions

View File

@ -2061,15 +2061,25 @@ static enum MoveEndResult MoveEndProtectLikeEffect(void)
{
enum MoveEndResult result = MOVEEND_RESULT_CONTINUE;
u32 temp = 0;
enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker);
enum HoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker);
enum ProtectMethod method = gProtectStructs[gBattlerTarget].protected;
if (gProtectStructs[gBattlerAttacker].chargingTurn
|| CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove))
|| CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, holdEffectAtk, gCurrentMove))
{
gBattleScripting.moveendState++;
return result;
}
if (method != PROTECT_MAX_GUARD
&& abilityAtk == ABILITY_UNSEEN_FIST
&& IsMoveMakingContact(gBattlerAttacker, gBattlerTarget, abilityAtk, holdEffectAtk, gCurrentMove))
{
gBattleScripting.moveendState++;
return result;
}
enum ProtectMethod method = gProtectStructs[gBattlerTarget].protected;
switch (method)
{
case PROTECT_SPIKY_SHIELD:

View File

@ -5,6 +5,12 @@ ASSUMPTIONS
{
ASSUME(MoveMakesContact(MOVE_SCRATCH));
ASSUME(GetMoveEffect(MOVE_PROTECT) == EFFECT_PROTECT);
ASSUME(GetMoveEffect(MOVE_KINGS_SHIELD) == EFFECT_PROTECT);
ASSUME(GetMoveEffect(MOVE_SPIKY_SHIELD) == EFFECT_PROTECT);
ASSUME(GetMoveEffect(MOVE_BANEFUL_BUNKER) == EFFECT_PROTECT);
ASSUME(GetMoveEffect(MOVE_BURNING_BULWARK) == EFFECT_PROTECT);
ASSUME(GetMoveEffect(MOVE_OBSTRUCT) == EFFECT_PROTECT);
ASSUME(GetMoveEffect(MOVE_SILK_TRAP) == EFFECT_PROTECT);
}
TO_DO_BATTLE_TEST("TODO: Write Unseen Fist (Ability) test titles")
@ -33,3 +39,38 @@ SINGLE_BATTLE_TEST("Unseen Fist ignores Protect when user has Protective Pads, b
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MACH_PUNCH, player);
}
}
SINGLE_BATTLE_TEST("Unseen Fist bypasses protect effects without triggering their contact effects")
{
enum Move protectMove = MOVE_NONE;
u8 loweredStat = 0;
PARAMETRIZE { protectMove = MOVE_SPIKY_SHIELD; loweredStat = 0; }
PARAMETRIZE { protectMove = MOVE_KINGS_SHIELD; loweredStat = STAT_ATK; }
PARAMETRIZE { protectMove = MOVE_BANEFUL_BUNKER; loweredStat = 0; }
PARAMETRIZE { protectMove = MOVE_BURNING_BULWARK; loweredStat = 0; }
PARAMETRIZE { protectMove = MOVE_OBSTRUCT; loweredStat = STAT_DEF; }
PARAMETRIZE { protectMove = MOVE_SILK_TRAP; loweredStat = STAT_SPEED; }
GIVEN {
PLAYER(SPECIES_URSHIFU) { Ability(ABILITY_UNSEEN_FIST); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, protectMove); MOVE(player, MOVE_SCRATCH); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, protectMove, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player);
HP_BAR(opponent);
NONE_OF {
HP_BAR(player);
STATUS_ICON(player, STATUS1_POISON);
STATUS_ICON(player, STATUS1_BURN);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
}
} THEN {
EXPECT_EQ(player->hp, player->maxHP);
EXPECT_EQ(player->status1, STATUS1_NONE);
if (loweredStat != 0)
EXPECT_EQ(player->statStages[loweredStat], DEFAULT_STAT_STAGE);
}
}