185 lines
6.1 KiB
C
185 lines
6.1 KiB
C
#include "global.h"
|
|
#include "test/battle.h"
|
|
|
|
ASSUMPTIONS
|
|
{
|
|
ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER);
|
|
ASSUME(GetMoveCategory(MOVE_POUND) == DAMAGE_CATEGORY_PHYSICAL);
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("Counter is not affected by Protect effects")
|
|
{
|
|
u32 move;
|
|
|
|
PARAMETRIZE { move = MOVE_SPIKY_SHIELD; }
|
|
PARAMETRIZE { move = MOVE_BANEFUL_BUNKER; }
|
|
PARAMETRIZE { move = MOVE_BURNING_BULWARK; }
|
|
PARAMETRIZE { move = MOVE_KINGS_SHIELD; }
|
|
PARAMETRIZE { move = MOVE_SILK_TRAP; }
|
|
PARAMETRIZE { move = MOVE_OBSTRUCT; }
|
|
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(opponent, move); MOVE(player, MOVE_COUNTER); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_MOVE, move, opponent);
|
|
NONE_OF {
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player);
|
|
if (move == MOVE_SPIKY_SHIELD) {
|
|
HP_BAR(player);
|
|
} else if (move == MOVE_BANEFUL_BUNKER) {
|
|
STATUS_ICON(player, STATUS1_POISON);
|
|
} else if (move == MOVE_BURNING_BULWARK) {
|
|
STATUS_ICON(player, STATUS1_BURN);
|
|
} else if (move == MOVE_KINGS_SHIELD) {
|
|
MESSAGE("Wobbuffet's Attack fell!");
|
|
} else if (move == MOVE_SILK_TRAP) {
|
|
MESSAGE("Wobbuffet's Speed fell!");
|
|
} else if (move == MOVE_OBSTRUCT) {
|
|
MESSAGE("Wobbuffet's Defense harshly fell!");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("Counter will do twice as much damage received from the opponent")
|
|
{
|
|
s16 normalDmg;
|
|
s16 counterDmg;
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(opponent, MOVE_POUND); MOVE(player, MOVE_COUNTER); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent);
|
|
HP_BAR(player, captureDamage: &normalDmg);
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player);
|
|
HP_BAR(opponent, captureDamage: &counterDmg);
|
|
} THEN {
|
|
EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), counterDmg);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Counter cannot affect ally Pokémon")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
} WHEN {
|
|
TURN {
|
|
MOVE(playerLeft, MOVE_POUND, target: playerRight);
|
|
MOVE(playerRight, MOVE_COUNTER, target: playerLeft);
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft);
|
|
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerRight);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Counter hits the last opponent that hit the user")
|
|
{
|
|
s16 normalDmg;
|
|
s16 counterDmg;
|
|
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
} WHEN {
|
|
TURN {
|
|
MOVE(opponentLeft, MOVE_POUND, target: playerLeft);
|
|
MOVE(opponentRight, MOVE_SLAM, target: playerLeft);
|
|
MOVE(playerLeft, MOVE_COUNTER);
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft);
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_SLAM, opponentRight);
|
|
HP_BAR(playerLeft, captureDamage: &normalDmg);
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft);
|
|
HP_BAR(opponentRight, captureDamage: &counterDmg);
|
|
} THEN {
|
|
EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), counterDmg);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Counter respects Follow me")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
} WHEN {
|
|
TURN {
|
|
MOVE(opponentRight, MOVE_FOLLOW_ME);
|
|
MOVE(opponentLeft, MOVE_POUND, target: playerLeft);
|
|
MOVE(playerLeft, MOVE_COUNTER, target: opponentLeft);
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_FOLLOW_ME, opponentRight);
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft);
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft);
|
|
HP_BAR(opponentRight);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Counter fails if mon that damaged Counter user is no longer on the field (Gen 1-4)")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
} WHEN {
|
|
TURN {
|
|
MOVE(opponentLeft, MOVE_POUND, target: playerLeft);
|
|
MOVE(playerRight, MOVE_POUND, target: opponentLeft);
|
|
MOVE(playerLeft, MOVE_COUNTER, target: opponentLeft);
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft);
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerRight);
|
|
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("Counter deals 1 damage when the attack received is blocked by Disguise")
|
|
{
|
|
s16 counterDmg;
|
|
GIVEN {
|
|
ASSUME(GetMoveCategory(MOVE_SHADOW_SNEAK) == DAMAGE_CATEGORY_PHYSICAL);
|
|
PLAYER(SPECIES_MIMIKYU) { Ability(ABILITY_DISGUISE); }
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(opponent, MOVE_SHADOW_SNEAK); MOVE(player, MOVE_COUNTER); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_SHADOW_SNEAK, opponent);
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player);
|
|
HP_BAR(opponent, captureDamage: &counterDmg);
|
|
} THEN {
|
|
EXPECT_EQ(counterDmg, 1);
|
|
}
|
|
}
|
|
|
|
// Gen 1
|
|
TO_DO_BATTLE_TEST("Counter can only counter Normal and Fighting-type moves (Gen 1)");
|
|
TO_DO_BATTLE_TEST("Counter can hit ghost-type Pokémon (Gen 1)");
|
|
TO_DO_BATTLE_TEST("Counter can return damage dealt to a substitute (Gen 1)");
|
|
|
|
// Gen 2-3
|
|
TO_DO_BATTLE_TEST("Counter can counter Hidden Power regardless of type (Gen 2-3)");
|
|
|
|
// Gen 2+
|
|
TO_DO_BATTLE_TEST("Counter can only counter physical moves (Gen 2+)");
|
|
TO_DO_BATTLE_TEST("Counter cannot hit ghost-type Pokémon (Gen 2+)");
|
|
TO_DO_BATTLE_TEST("Counter cannot return damage dealt to a substitute (Gen 2+)");
|
|
|
|
// Triple Battles required to test
|
|
//TO_DO_BATTLE_TEST("Counter can hit non-adjacent opponents if they were the last Pokémon to hit the user");
|