pokeemmo/test/battle/ability/infiltrator.c

239 lines
9.8 KiB
C

#include "global.h"
#include "test/battle.h"
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);
}
}