mirror of
https://github.com/rh-hideout/pokeemerald-expansion.git
synced 2026-03-21 18:04:50 -05:00
Fixes Infiltrator and adds config for Substitute interaction (#9073)
This commit is contained in:
parent
ee1e02b2ef
commit
022f5eb52e
|
|
@ -383,6 +383,7 @@ bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef);
|
|||
bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef);
|
||||
bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect secondaryMoveEffect, enum FunctionCallOption option);
|
||||
bool32 CanBeConfused(u32 battler);
|
||||
bool32 IsSafeguardProtected(u32 battlerAtk, u32 battlerDef, u32 abilityAtk);
|
||||
u32 GetBattlerAffectionHearts(u32 battler);
|
||||
void TryToRevertMimicryAndFlags(void);
|
||||
bool32 BattleArenaTurnEnd(void);
|
||||
|
|
|
|||
|
|
@ -172,6 +172,7 @@
|
|||
#define B_ATE_MULTIPLIER GEN_LATEST // In Gen7+, -ate abilities (Aerilate, Galvanize, Normalize, Pixilate, Refrigerate) multiply damage by 1.2. Otherwise, it's 1.3, except Normalize which has no multiplier.
|
||||
#define B_DEFIANT_STICKY_WEB GEN_LATEST // In Gen9+, Defiant activates on Sticky Web regardless of who set it up. In Gen8, Defiant does not activate on Sticky Web set up by an ally after Court Change swaps its side.
|
||||
#define B_POWDER_OVERCOAT GEN_LATEST // In Gen6+, Overcoat blocks powder and spore moves from affecting the user.
|
||||
#define B_INFILTRATOR_SUBSTITUTE GEN_LATEST // In Gen6+, Infiltrator bypasses Substitute when using a move, excluding Transform and Sky Drop.
|
||||
|
||||
// Item settings
|
||||
#define B_CONFUSE_BERRIES_HEAL GEN_LATEST // In Gens3-6, Figy and similar berries restore 1/8th of HP and trigger at half HP. In Gen7 they restore half HP, triggering at 25% HP. In Gen8 they heal 1/3rd of HP.
|
||||
|
|
|
|||
|
|
@ -157,6 +157,7 @@
|
|||
F(BATTLE_BOND, battleBond, (u32, GEN_COUNT - 1)) \
|
||||
F(ATE_MULTIPLIER, ateMultiplier, (u32, GEN_COUNT - 1)) \
|
||||
F(DEFIANT_STICKY_WEB, defiantStickyWeb, (u32, GEN_COUNT - 1)) \
|
||||
F(INFILTRATOR_SUBSTITUTE, infiltratorSubstitute, (u32, GEN_COUNT - 1)) \
|
||||
/* Item settings */ \
|
||||
F(CONFUSE_BERRIES_HEAL, confuseBerriesHeal, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \
|
||||
F(X_ITEMS_BUFF, xItemsBuff, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \
|
||||
|
|
|
|||
|
|
@ -3094,7 +3094,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c
|
|||
case MOVE_EFFECT_PARALYSIS:
|
||||
case MOVE_EFFECT_TOXIC:
|
||||
case MOVE_EFFECT_FROSTBITE:
|
||||
if (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !primary)
|
||||
if (IsSafeguardProtected(gBattlerAttacker, gEffectBattler, GetBattlerAbility(gBattlerAttacker)) && !primary)
|
||||
gBattlescriptCurrInstr = battleScript;
|
||||
else if (CanSetNonVolatileStatus(
|
||||
gBattlerAttacker,
|
||||
|
|
@ -3108,7 +3108,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c
|
|||
case MOVE_EFFECT_CONFUSION:
|
||||
if (!CanBeConfused(gEffectBattler)
|
||||
|| gBattleMons[gEffectBattler].volatiles.confusionTurns
|
||||
|| (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !primary))
|
||||
|| (IsSafeguardProtected(gBattlerAttacker, gEffectBattler, GetBattlerAbility(gBattlerAttacker)) && !primary))
|
||||
{
|
||||
gBattlescriptCurrInstr = battleScript;
|
||||
}
|
||||
|
|
@ -10322,7 +10322,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union St
|
|||
{
|
||||
if (gSideTimers[GetBattlerSide(battler)].mistTimer
|
||||
&& !flags.certain && gCurrentMove != MOVE_CURSE
|
||||
&& !(battler == gBattlerTarget && GetBattlerAbility(gBattlerAttacker) == ABILITY_INFILTRATOR))
|
||||
&& !(battler == gBattlerTarget && GetBattlerAbility(gBattlerAttacker) == ABILITY_INFILTRATOR && !IsBattlerAlly(gBattlerAttacker, battler)))
|
||||
{
|
||||
if (flags.allowPtr)
|
||||
{
|
||||
|
|
@ -11265,6 +11265,7 @@ static void Cmd_transformdataexecution(void)
|
|||
gChosenMove = MOVE_UNAVAILABLE;
|
||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||
if (gBattleMons[gBattlerTarget].volatiles.transformed
|
||||
|| DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)
|
||||
|| gBattleStruct->illusion[gBattlerTarget].state == ILLUSION_ON
|
||||
|| IsSemiInvulnerable(gBattlerTarget, EXCLUDE_COMMANDER))
|
||||
{
|
||||
|
|
@ -13402,6 +13403,10 @@ bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move)
|
|||
return FALSE;
|
||||
else if (MoveIgnoresSubstitute(move))
|
||||
return FALSE;
|
||||
else if (GetConfig(CONFIG_INFILTRATOR_SUBSTITUTE) < GEN_6)
|
||||
return TRUE;
|
||||
else if (GetMoveEffect(move) == EFFECT_TRANSFORM || GetMoveEffect(move) == EFFECT_SKY_DROP)
|
||||
return TRUE;
|
||||
else if (IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_INFILTRATOR))
|
||||
return FALSE;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -6114,6 +6114,17 @@ bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
bool32 IsSafeguardProtected(u32 battlerAtk, u32 battlerDef, u32 abilityAtk)
|
||||
{
|
||||
if (!(gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD))
|
||||
return FALSE;
|
||||
if (IsBattlerAlly(battlerAtk, battlerDef))
|
||||
return TRUE;
|
||||
if (abilityAtk == ABILITY_INFILTRATOR)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect effect, enum FunctionCallOption option)
|
||||
{
|
||||
const u8 *battleScript = NULL;
|
||||
|
|
@ -6268,7 +6279,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abil
|
|||
abilityDef = ABILITY_FLOWER_VEIL;
|
||||
battleScript = BattleScript_FlowerVeilProtects;
|
||||
}
|
||||
else if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD)
|
||||
else if (IsSafeguardProtected(battlerAtk, battlerDef, abilityAtk))
|
||||
{
|
||||
battleScript = BattleScript_SafeguardProtected;
|
||||
}
|
||||
|
|
@ -8294,7 +8305,7 @@ static inline uq4_12_t GetScreensModifier(struct DamageContext *ctx)
|
|||
{
|
||||
return UQ_4_12(1.0);
|
||||
}
|
||||
if (ctx->abilityAtk == ABILITY_INFILTRATOR)
|
||||
if (ctx->abilityAtk == ABILITY_INFILTRATOR && !IsBattlerAlly(ctx->battlerAtk, ctx->battlerDef))
|
||||
{
|
||||
if (ctx->updateFlags)
|
||||
RecordAbilityBattle(ctx->battlerAtk, ctx->abilityDef);
|
||||
|
|
|
|||
|
|
@ -117,6 +117,7 @@ SINGLE_BATTLE_TEST("Illusion breaks if user loses Illusion due to Worry Seed")
|
|||
SINGLE_BATTLE_TEST("Illusion breaks when attacked behind a substitute")
|
||||
{
|
||||
GIVEN {
|
||||
WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, GEN_6);
|
||||
PLAYER(SPECIES_DRAGAPULT) { Ability(ABILITY_INFILTRATOR); Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
|
||||
OPPONENT(SPECIES_ZOROARK) { Speed(2); }
|
||||
|
|
|
|||
|
|
@ -1,4 +1,238 @@
|
|||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
TO_DO_BATTLE_TEST("TODO: Write Infiltrator (Ability) test titles")
|
||||
SINGLE_BATTLE_TEST("Infiltrator bypasses the opponent's Light Screen/Reflect/Aurora Veil", s16 damage)
|
||||
{
|
||||
u32 screenMove, attackingMove, ability;
|
||||
|
||||
PARAMETRIZE { screenMove = MOVE_LIGHT_SCREEN; attackingMove = MOVE_WATER_GUN; ability = ABILITY_INFILTRATOR; }
|
||||
PARAMETRIZE { screenMove = MOVE_LIGHT_SCREEN; attackingMove = MOVE_WATER_GUN; ability = ABILITY_CLEAR_BODY; }
|
||||
PARAMETRIZE { screenMove = MOVE_REFLECT; attackingMove = MOVE_SCRATCH; ability = ABILITY_INFILTRATOR; }
|
||||
PARAMETRIZE { screenMove = MOVE_REFLECT; attackingMove = MOVE_SCRATCH; ability = ABILITY_CLEAR_BODY; }
|
||||
PARAMETRIZE { screenMove = MOVE_AURORA_VEIL; attackingMove = MOVE_WATER_GUN; ability = ABILITY_INFILTRATOR; }
|
||||
PARAMETRIZE { screenMove = MOVE_AURORA_VEIL; attackingMove = MOVE_WATER_GUN; ability = ABILITY_CLEAR_BODY; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_LIGHT_SCREEN) == EFFECT_LIGHT_SCREEN);
|
||||
ASSUME(GetMoveEffect(MOVE_REFLECT) == EFFECT_REFLECT);
|
||||
ASSUME(GetMoveEffect(MOVE_AURORA_VEIL) == EFFECT_AURORA_VEIL);
|
||||
ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_DRAGAPULT) { Ability(ability); }
|
||||
OPPONENT(SPECIES_ABOMASNOW) { Ability(ABILITY_SNOW_WARNING); }
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, screenMove); MOVE(player, attackingMove); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, screenMove, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, attackingMove, player);
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(0.5), results[1].damage);
|
||||
EXPECT_MUL_EQ(results[2].damage, UQ_4_12(0.5), results[3].damage);
|
||||
EXPECT_MUL_EQ(results[4].damage, UQ_4_12(0.5), results[5].damage);
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Infiltrator doesn't bypass an ally's Light Screen/Reflect/Aurora Veil", s16 damage)
|
||||
{
|
||||
u32 screenMove, attackingMove, ability;
|
||||
|
||||
PARAMETRIZE { screenMove = MOVE_LIGHT_SCREEN; attackingMove = MOVE_WATER_GUN; ability = ABILITY_INFILTRATOR; }
|
||||
PARAMETRIZE { screenMove = MOVE_LIGHT_SCREEN; attackingMove = MOVE_WATER_GUN; ability = ABILITY_CLEAR_BODY; }
|
||||
PARAMETRIZE { screenMove = MOVE_REFLECT; attackingMove = MOVE_SCRATCH; ability = ABILITY_INFILTRATOR; }
|
||||
PARAMETRIZE { screenMove = MOVE_REFLECT; attackingMove = MOVE_SCRATCH; ability = ABILITY_CLEAR_BODY; }
|
||||
PARAMETRIZE { screenMove = MOVE_AURORA_VEIL; attackingMove = MOVE_WATER_GUN; ability = ABILITY_INFILTRATOR; }
|
||||
PARAMETRIZE { screenMove = MOVE_AURORA_VEIL; attackingMove = MOVE_WATER_GUN; ability = ABILITY_CLEAR_BODY; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_LIGHT_SCREEN) == EFFECT_LIGHT_SCREEN);
|
||||
ASSUME(GetMoveEffect(MOVE_REFLECT) == EFFECT_REFLECT);
|
||||
ASSUME(GetMoveEffect(MOVE_AURORA_VEIL) == EFFECT_AURORA_VEIL);
|
||||
ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_DRAGAPULT) { Ability(ability); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_ABOMASNOW) { Ability(ABILITY_SNOW_WARNING); }
|
||||
OPPONENT(SPECIES_WYNAUT);
|
||||
} WHEN {
|
||||
TURN { MOVE(playerRight, screenMove); MOVE(playerLeft, attackingMove, target: playerRight); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, screenMove, playerRight);
|
||||
ANIMATION(ANIM_TYPE_MOVE, attackingMove, playerLeft);
|
||||
HP_BAR(playerRight, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
EXPECT_EQ(results[0].damage, results[1].damage);
|
||||
EXPECT_EQ(results[2].damage, results[3].damage);
|
||||
EXPECT_EQ(results[4].damage, results[5].damage);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Infiltrator bypasses the opponent's Mist")
|
||||
{
|
||||
u32 ability;
|
||||
|
||||
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; }
|
||||
PARAMETRIZE { ability = ABILITY_INFILTRATOR; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_MIST) == EFFECT_MIST);
|
||||
ASSUME(GetMoveEffect(MOVE_SCREECH) == EFFECT_DEFENSE_DOWN_2);
|
||||
PLAYER(SPECIES_DRAGAPULT) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_MIST); MOVE(player, MOVE_SCREECH); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_MIST, opponent);
|
||||
if (ability == ABILITY_INFILTRATOR)
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, player);
|
||||
else
|
||||
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, player);
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Infiltrator doesn't bypass an ally's Mist")
|
||||
{
|
||||
u32 ability;
|
||||
|
||||
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; }
|
||||
PARAMETRIZE { ability = ABILITY_INFILTRATOR; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_MIST) == EFFECT_MIST);
|
||||
ASSUME(GetMoveEffect(MOVE_SCREECH) == EFFECT_DEFENSE_DOWN_2);
|
||||
PLAYER(SPECIES_DRAGAPULT) { Ability(ability); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WYNAUT);
|
||||
} WHEN {
|
||||
TURN { MOVE(playerRight, MOVE_MIST); MOVE(playerLeft, MOVE_SCREECH, target: playerRight); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_MIST, playerRight);
|
||||
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, playerLeft);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Infiltrator bypasses the opponent's Safeguard")
|
||||
{
|
||||
u32 ability;
|
||||
|
||||
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; }
|
||||
PARAMETRIZE { ability = ABILITY_INFILTRATOR; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_SAFEGUARD) == EFFECT_SAFEGUARD);
|
||||
ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS);
|
||||
PLAYER(SPECIES_DRAGAPULT) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_SAFEGUARD); MOVE(player, MOVE_THUNDER_WAVE); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SAFEGUARD, opponent);
|
||||
if (ability == ABILITY_INFILTRATOR)
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, player);
|
||||
else
|
||||
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, player);
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Infiltrator doesn't bypass an ally's Safeguard")
|
||||
{
|
||||
u32 ability;
|
||||
|
||||
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; }
|
||||
PARAMETRIZE { ability = ABILITY_INFILTRATOR; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_SAFEGUARD) == EFFECT_SAFEGUARD);
|
||||
ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS);
|
||||
PLAYER(SPECIES_DRAGAPULT) { Ability(ability); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WYNAUT);
|
||||
} WHEN {
|
||||
TURN { MOVE(playerRight, MOVE_SAFEGUARD); MOVE(playerLeft, MOVE_THUNDER_WAVE, target: playerRight); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SAFEGUARD, playerRight);
|
||||
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, playerLeft);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Infiltrator bypasses the opponent's Substitute (Gen 6+)")
|
||||
{
|
||||
u32 ability, config;
|
||||
|
||||
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; config = GEN_5; }
|
||||
PARAMETRIZE { ability = ABILITY_INFILTRATOR; config = GEN_5; }
|
||||
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; config = GEN_6; }
|
||||
PARAMETRIZE { ability = ABILITY_INFILTRATOR; config = GEN_6; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, config);
|
||||
ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE);
|
||||
ASSUME(!MoveIgnoresSubstitute(MOVE_SCRATCH));
|
||||
PLAYER(SPECIES_DRAGAPULT) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_SCRATCH); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent);
|
||||
if (ability == ABILITY_INFILTRATOR && config >= GEN_6) {
|
||||
NOT SUB_HIT(opponent);
|
||||
} else {
|
||||
SUB_HIT(opponent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Infiltrator bypasses an ally's Substitute (Gen 6+)")
|
||||
{
|
||||
u32 ability, config;
|
||||
|
||||
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; config = GEN_5; }
|
||||
PARAMETRIZE { ability = ABILITY_INFILTRATOR; config = GEN_5; }
|
||||
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; config = GEN_6; }
|
||||
PARAMETRIZE { ability = ABILITY_INFILTRATOR; config = GEN_6; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, config);
|
||||
ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE);
|
||||
ASSUME(!MoveIgnoresSubstitute(MOVE_SCRATCH));
|
||||
PLAYER(SPECIES_DRAGAPULT) { Ability(ability); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WYNAUT);
|
||||
} WHEN {
|
||||
TURN { MOVE(playerRight, MOVE_SUBSTITUTE); MOVE(playerLeft, MOVE_SCRATCH, target: playerRight); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, playerRight);
|
||||
if (ability == ABILITY_INFILTRATOR && config == GEN_6) {
|
||||
NOT SUB_HIT(playerRight);
|
||||
} else {
|
||||
SUB_HIT(playerRight);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Infiltrator doesn't ignore a battler's Substitute when using Transform or Sky Drop")
|
||||
{
|
||||
u32 ability, move;
|
||||
|
||||
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; move = MOVE_TRANSFORM; }
|
||||
PARAMETRIZE { ability = ABILITY_INFILTRATOR; move = MOVE_TRANSFORM; }
|
||||
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; move = MOVE_SKY_DROP; }
|
||||
PARAMETRIZE { ability = ABILITY_INFILTRATOR; move = MOVE_SKY_DROP; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(CONFIG_INFILTRATOR_SUBSTITUTE, GEN_6);
|
||||
ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE);
|
||||
ASSUME(GetMoveEffect(MOVE_TRANSFORM) == EFFECT_TRANSFORM);
|
||||
ASSUME(GetMoveEffect(MOVE_SKY_DROP) == EFFECT_SKY_DROP);
|
||||
PLAYER(SPECIES_DRAGAPULT) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_SCRATCH); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent);
|
||||
NOT ANIMATION(ANIM_TYPE_MOVE, move, player);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user