632 lines
23 KiB
C
632 lines
23 KiB
C
#include "global.h"
|
|
#include "test_battle.h"
|
|
|
|
// TODO:
|
|
// Max Guard protects against Transform, Block (not Mean Look), Flower Shield, Gear Up, and so on (see Bulba).
|
|
// Imprison doesn't stop Max Moves.
|
|
// Max Moves change type as you'd expect with Normalize, Weather Ball, etc.
|
|
// (Unrelated) Refactor code to remove dynamax.usingMaxMove?
|
|
|
|
// ============= DYNAMAX AND MAX MOVE INTERACTIONS ===================
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax increases HP and max HP by 1.5x")
|
|
{
|
|
GIVEN { // TODO: Dynamax level
|
|
PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(80); }
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, player);
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Celebrate!");
|
|
} FINALLY {
|
|
EXPECT_EQ(player->hp, 120);
|
|
EXPECT_EQ(player->maxHP, 150);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax expires after three turns")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(80); }
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); } // 1st max move
|
|
TURN { MOVE(player, MOVE_TACKLE); } // 2nd max move
|
|
TURN { MOVE(player, MOVE_TACKLE); } // 3rd max move
|
|
} SCENE {
|
|
int i;
|
|
for (i = 0; i < DYNAMAX_TURNS; ++i) {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Celebrate!");
|
|
}
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
|
} FINALLY {
|
|
EXPECT_EQ(player->hp, 80);
|
|
EXPECT_EQ(player->maxHP, 100);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be flinched")
|
|
{
|
|
GIVEN {
|
|
ASSUME(gBattleMoves[MOVE_FAKE_OUT].effect == EFFECT_FAKE_OUT);
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(opponent, MOVE_FAKE_OUT); MOVE(player, MOVE_TACKLE, dynamax: TRUE); }
|
|
} SCENE {
|
|
MESSAGE("Foe Wobbuffet used Fake Out!");
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
}
|
|
}
|
|
|
|
// Message is "Steelix shook its head. It seems like it can't use this move..."?
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be hit by weight-based moves")
|
|
{
|
|
GIVEN {
|
|
ASSUME(gBattleMoves[MOVE_HEAVY_SLAM].effect == EFFECT_HEAT_CRASH);
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_HEAVY_SLAM); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Heavy Slam!");
|
|
MESSAGE("The move was blocked by the power of Dynamax!");
|
|
NONE_OF { HP_BAR(player); }
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be hit by OHKO moves")
|
|
{
|
|
GIVEN {
|
|
ASSUME(gBattleMoves[MOVE_FISSURE].effect == EFFECT_OHKO);
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_MACHAMP) { Ability(ABILITY_NO_GUARD); }
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_FISSURE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Machamp used Fissure!");
|
|
MESSAGE("Wobbuffet is unaffected!");
|
|
NONE_OF { HP_BAR(player); }
|
|
}
|
|
}
|
|
|
|
// can't be used at all in Raid, see "Documenting Dynamax"
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Destiny Bond")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Speed(50); };
|
|
OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); }
|
|
} WHEN {
|
|
TURN { MOVE(opponent, MOVE_DESTINY_BOND); MOVE(player, MOVE_TACKLE, dynamax: TRUE); }
|
|
} SCENE {
|
|
MESSAGE("Foe Wobbuffet used Destiny Bond!");
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet fainted!");
|
|
NONE_OF { HP_BAR(player); }
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are affected by Grudge")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Speed(50); };
|
|
OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); }
|
|
} WHEN {
|
|
TURN { MOVE(opponent, MOVE_GRUDGE); MOVE(player, MOVE_TACKLE, dynamax: TRUE); }
|
|
} SCENE {
|
|
MESSAGE("Foe Wobbuffet used Grudge!");
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Wobbuffet's Tackle lost all its PP due to the GRUDGE!");
|
|
MESSAGE("Foe Wobbuffet fainted!");
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by phazing moves, but still take damage")
|
|
{
|
|
GIVEN {
|
|
ASSUME(gBattleMoves[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET);
|
|
ASSUME(gBattleMoves[MOVE_WHIRLWIND].effect == EFFECT_ROAR);
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(opponent, MOVE_DRAGON_TAIL); MOVE(player, MOVE_TACKLE, dynamax: TRUE); }
|
|
TURN { MOVE(opponent, MOVE_WHIRLWIND); MOVE(player, MOVE_TACKLE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Dragon Tail!");
|
|
HP_BAR(player);
|
|
MESSAGE("The move was blocked by the power of Dynamax!");
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Whirlwind!");
|
|
MESSAGE("The move was blocked by the power of Dynamax!");
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Red Card")
|
|
{
|
|
GIVEN {
|
|
ASSUME(gItems[ITEM_RED_CARD].holdEffect == HOLD_EFFECT_RED_CARD);
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); }
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent);
|
|
MESSAGE("Foe Wobbuffet held up its Red Card against Wobbuffet!");
|
|
MESSAGE("The move was blocked by the power of Dynamax!");
|
|
} FINALLY {
|
|
EXPECT_EQ(opponent->item, ITEM_NONE);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can be switched out by Eject Button")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_BUTTON); }
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_TACKLE); SEND_OUT(player, 1); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Tackle!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player);
|
|
MESSAGE("Wobbuffet is switched out with the Eject Button!");
|
|
} FINALLY {
|
|
EXPECT_EQ(opponent->item, ITEM_NONE);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot have their ability swapped to another Pokemon's")
|
|
{
|
|
GIVEN {
|
|
ASSUME(P_GEN_8_POKEMON == TRUE);
|
|
PLAYER(SPECIES_MILTANK) { Ability(ABILITY_SCRAPPY); }
|
|
OPPONENT(SPECIES_RUNERIGUS) { Ability(ABILITY_WANDERING_SPIRIT); }
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_SKILL_SWAP); }
|
|
} SCENE {
|
|
MESSAGE("Miltank used Max Strike!");
|
|
MESSAGE("Foe Runerigus used Skill Swap!");
|
|
MESSAGE("But it failed!");
|
|
} FINALLY {
|
|
EXPECT_EQ(player->ability, ABILITY_SCRAPPY);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their ability changed or suppressed")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SHADOW_TAG); }
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_SIMPLE_BEAM); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Simple Beam!");
|
|
MESSAGE("Wobbuffet acquired Simple!");
|
|
} FINALLY {
|
|
EXPECT_EQ(player->ability, ABILITY_SIMPLE);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are immune to Encore")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_ENCORE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Encore!");
|
|
MESSAGE("But it failed!");
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can be encored immediately after reverting")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Speed(50); };
|
|
OPPONENT(SPECIES_WOBBUFFET) { Speed(100); };
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_ARM_THRUST, dynamax: TRUE); }
|
|
TURN { MOVE(player, MOVE_ARM_THRUST); }
|
|
TURN { MOVE(player, MOVE_ARM_THRUST); }
|
|
TURN { MOVE(opponent, MOVE_ENCORE); MOVE(player, MOVE_TACKLE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Knuckle!");
|
|
MESSAGE("Wobbuffet used Max Knuckle!");
|
|
MESSAGE("Wobbuffet used Max Knuckle!");
|
|
MESSAGE("Foe Wobbuffet used Encore!");
|
|
MESSAGE("Wobbuffet used Arm Thrust!");
|
|
}
|
|
}
|
|
|
|
// Max Moves don't make contact, so Cursed Body doesn't need to be tested? Implemented a check anyway
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon's Max Moves cannot be disabled")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_DISABLE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Disable!");
|
|
MESSAGE("But it failed!");
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have base moves disabled on their first turn")
|
|
{
|
|
GIVEN {
|
|
ASSUME(B_DISABLE_TURNS >= GEN_5);
|
|
PLAYER(SPECIES_WOBBUFFET) { Speed(50); };
|
|
OPPONENT(SPECIES_WOBBUFFET) { Speed(100); };
|
|
} WHEN {
|
|
TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_TACKLE); }
|
|
TURN { MOVE(opponent, MOVE_DISABLE); MOVE(player, MOVE_TACKLE, dynamax: TRUE); }
|
|
TURN {}
|
|
TURN {}
|
|
TURN { MOVE(player, MOVE_TACKLE, allowed: FALSE); MOVE(player, MOVE_CELEBRATE); }
|
|
} SCENE {
|
|
MESSAGE("Foe Wobbuffet used Celebrate!");
|
|
MESSAGE("Wobbuffet used Tackle!");
|
|
MESSAGE("Foe Wobbuffet used Disable!");
|
|
MESSAGE("Wobbuffet's Tackle was disabled!");
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are immune to Torment")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_TORMENT); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Torment!");
|
|
MESSAGE("But it failed!");
|
|
}
|
|
}
|
|
|
|
// This is true for all item-removing moves.
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not immune to Knock Off")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_POTION); }
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_KNOCK_OFF); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Knock Off!");
|
|
MESSAGE("Foe Wobbuffet knocked off Wobbuffet's Potion!");
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon lose their substitutes")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_CELEBRATE); }
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_TACKLE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Substitute!");
|
|
MESSAGE("Wobbuffet made a SUBSTITUTE!");
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Foe Wobbuffet used Tackle!");
|
|
HP_BAR(player);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their base moves copied by Copycat")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
} WHEN {
|
|
TURN { MOVE(playerLeft, MOVE_TRICK_ROOM, dynamax: TRUE, target: opponentLeft); MOVE(playerRight, MOVE_COPYCAT, target: opponentLeft); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Guard!");
|
|
MESSAGE("Wynaut used Trick Room!");
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon take double damage from Dynamax Cannon", s16 damage)
|
|
{
|
|
bool32 dynamaxed;
|
|
PARAMETRIZE { dynamaxed = FALSE; }
|
|
PARAMETRIZE { dynamaxed = TRUE; }
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: dynamaxed); MOVE(opponent, MOVE_DYNAMAX_CANNON); }
|
|
} SCENE {
|
|
HP_BAR(player, captureDamage: &results[i].damage);
|
|
} FINALLY {
|
|
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(2.0), results[1].damage);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves deal 1/4 damage through protect", s16 damage)
|
|
{
|
|
bool32 protected;
|
|
KNOWN_FAILING; // rounding error? also messages are wonky
|
|
PARAMETRIZE { protected = FALSE; }
|
|
PARAMETRIZE { protected = TRUE; }
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
if (protected)
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_PROTECT); }
|
|
else
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); }
|
|
} SCENE {
|
|
HP_BAR(opponent, captureDamage: &results[i].damage);
|
|
} FINALLY {
|
|
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(0.25), results[1].damage);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass Max Guard")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); MOVE(opponent, MOVE_PROTECT, dynamax: TRUE); }
|
|
} SCENE {
|
|
NONE_OF { HP_BAR(opponent); }
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("(DYNAMAX) Feint bypasses Max Guard but doesn't break it")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
} WHEN {
|
|
TURN { MOVE(playerLeft, MOVE_PROTECT, dynamax: TRUE);
|
|
MOVE(opponentLeft, MOVE_FEINT, target: playerLeft);
|
|
MOVE(opponentRight, MOVE_TACKLE, target: playerLeft);
|
|
}
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Guard!");
|
|
MESSAGE("Foe Wobbuffet used Feint!");
|
|
HP_BAR(playerLeft);
|
|
MESSAGE("Foe Wynaut used Tackle!");
|
|
NONE_OF { HP_BAR(playerLeft); }
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are immune to Instruct")
|
|
{
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
} WHEN {
|
|
TURN { MOVE(playerLeft, MOVE_TACKLE, dynamax: TRUE, target: opponentLeft);
|
|
MOVE(playerRight, MOVE_INSTRUCT, target: playerLeft);
|
|
}
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Wynaut used Instruct!");
|
|
MESSAGE("But it failed!");
|
|
}
|
|
}
|
|
|
|
// Move selection tests can't be simulated :(
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Choice items", s16 damage)
|
|
{
|
|
u16 item;
|
|
PARAMETRIZE { item = ITEM_CHOICE_BAND; }
|
|
PARAMETRIZE { item = ITEM_NONE; }
|
|
GIVEN {
|
|
ASSUME(gItems[ITEM_CHOICE_BAND].holdEffect == HOLD_EFFECT_CHOICE_BAND);
|
|
PLAYER(SPECIES_WOBBUFFET) { Item(item); };
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
HP_BAR(opponent, captureDamage: &results[i].damage);
|
|
} FINALLY {
|
|
EXPECT_EQ(results[0].damage, results[1].damage);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot use Max Guard while holding Assault Vest")
|
|
{
|
|
GIVEN {
|
|
ASSUME(gItems[ITEM_ASSAULT_VEST].holdEffect == HOLD_EFFECT_ASSAULT_VEST);
|
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ASSAULT_VEST); };
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_TACKLE, dynamax: TRUE); }
|
|
TURN { MOVE(player, MOVE_PROTECT, allowed: FALSE); MOVE(player, MOVE_TACKLE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
}
|
|
}
|
|
|
|
// ============= MAX MOVE EFFECTS ==========================================
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers single opponent's speed")
|
|
{
|
|
GIVEN {
|
|
// Fails?: ASSUME(GetMaxMove(B_POSITION_PLAYER_LEFT, MOVE_TACKLE) == MOVE_MAX_STRIKE);
|
|
ASSUME(gBattleMoves[MOVE_MAX_STRIKE].argument == MAX_EFFECT_LOWER_SPEED);
|
|
OPPONENT(SPECIES_WOBBUFFET) { Speed(100); }
|
|
PLAYER(SPECIES_WOBBUFFET) { Speed(80); }
|
|
} WHEN {
|
|
TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_TACKLE, dynamax: TRUE); }
|
|
TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_TACKLE); }
|
|
} SCENE {
|
|
// turn 1
|
|
MESSAGE("Foe Wobbuffet used Tackle!");
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
|
|
MESSAGE("Foe Wobbuffet's speed fell!");
|
|
// turn 2
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
|
|
MESSAGE("Foe Wobbuffet's speed fell!");
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers both opponents' speed")
|
|
{
|
|
GIVEN {
|
|
// Fails? ASSUME(GetMaxMove(B_POSITION_PLAYER_LEFT, MOVE_TACKLE) == MOVE_MAX_STRIKE);
|
|
ASSUME(gBattleMoves[MOVE_MAX_STRIKE].argument == MAX_EFFECT_LOWER_SPEED);
|
|
PLAYER(SPECIES_WOBBUFFET) { Speed(80); }
|
|
PLAYER(SPECIES_WOBBUFFET) { Speed(79); }
|
|
OPPONENT(SPECIES_WOBBUFFET) {Speed(100); }
|
|
OPPONENT(SPECIES_WOBBUFFET) { Speed(99); }
|
|
} WHEN {
|
|
TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft, dynamax: TRUE); \
|
|
MOVE(opponentLeft, MOVE_TACKLE, target: playerLeft); \
|
|
MOVE(opponentRight, MOVE_TACKLE, target: playerLeft); }
|
|
TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); \
|
|
MOVE(opponentLeft, MOVE_TACKLE, target: playerLeft); \
|
|
MOVE(opponentRight, MOVE_TACKLE, target: playerLeft); }
|
|
} SCENE {
|
|
// turn 1
|
|
MESSAGE("Foe Wobbuffet used Tackle!");
|
|
MESSAGE("Foe Wobbuffet used Tackle!");
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft);
|
|
MESSAGE("Foe Wobbuffet's speed fell!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight);
|
|
MESSAGE("Foe Wobbuffet's speed fell!");
|
|
// turn 2
|
|
MESSAGE("Wobbuffet used Max Strike!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft);
|
|
MESSAGE("Foe Wobbuffet's speed fell!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight);
|
|
MESSAGE("Foe Wobbuffet's speed fell!");
|
|
MESSAGE("Foe Wobbuffet used Tackle!");
|
|
MESSAGE("Foe Wobbuffet used Tackle!");
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Max Flare sets up sunlight")
|
|
{
|
|
GIVEN {
|
|
ASSUME(gBattleMoves[MOVE_MAX_FLARE].argument == MAX_EFFECT_SUN);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_EMBER, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Flare!");
|
|
MESSAGE("The sunlight got bright!");
|
|
MESSAGE("Foe Wobbuffet used Celebrate!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SUN_CONTINUES);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Max Geyser sets up heavy rain")
|
|
{
|
|
GIVEN {
|
|
ASSUME(gBattleMoves[MOVE_MAX_GEYSER].argument == MAX_EFFECT_RAIN);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_WATER_GUN, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Geyser!");
|
|
MESSAGE("It started to rain!");
|
|
MESSAGE("Foe Wobbuffet used Celebrate!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RAIN_CONTINUES);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Max Hailstorm sets up hail")
|
|
{
|
|
GIVEN {
|
|
ASSUME(gBattleMoves[MOVE_MAX_HAILSTORM].argument == MAX_EFFECT_HAIL);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_POWDER_SNOW, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Hailstorm!");
|
|
MESSAGE("It started to hail!");
|
|
MESSAGE("Foe Wobbuffet used Celebrate!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HAIL_CONTINUES);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Max Rockfall sets up a sandstorm")
|
|
{
|
|
GIVEN {
|
|
ASSUME(gBattleMoves[MOVE_MAX_ROCKFALL].argument == MAX_EFFECT_SANDSTORM);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_ROCK_THROW, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Rockfall!");
|
|
MESSAGE("A sandstorm brewed!");
|
|
MESSAGE("Foe Wobbuffet used Celebrate!");
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SANDSTORM_CONTINUES);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Max Overgrowth sets up Grassy Terrain")
|
|
{
|
|
KNOWN_FAILING; // Grassy terrain bugged #2820
|
|
GIVEN {
|
|
ASSUME(gBattleMoves[MOVE_MAX_OVERGROWTH].argument == MAX_EFFECT_GRASSY_TERRAIN);
|
|
OPPONENT(SPECIES_WOBBUFFET) { MaxHP(256); HP(128); };
|
|
PLAYER(SPECIES_WOBBUFFET) { MaxHP(256); HP(128); };
|
|
} WHEN {
|
|
TURN { MOVE(player, MOVE_VINE_WHIP, dynamax: TRUE); MOVE(opponent, MOVE_CELEBRATE); }
|
|
TURN { MOVE(player, MOVE_VINE_WHIP); MOVE(opponent, MOVE_CELEBRATE); }
|
|
} SCENE {
|
|
MESSAGE("Wobbuffet used Max Overgrowth!");
|
|
MESSAGE("Foe Wobbuffet cannot use Celebrate!");
|
|
HP_BAR(player, damage: -256/16);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("(DYNAMAX) Max Mindstorm sets up Psychic Terrain")
|
|
{
|
|
// TODO: BG doesn't seem to load?
|
|
GIVEN {
|
|
ASSUME(gBattleMoves[MOVE_MAX_MINDSTORM].argument == MAX_EFFECT_PSYCHIC_TERRAIN);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(opponent, MOVE_EXTREME_SPEED); MOVE(player, MOVE_PSYCHIC, dynamax: TRUE); }
|
|
TURN { MOVE(opponent, MOVE_EXTREME_SPEED); MOVE(player, MOVE_PSYCHIC); }
|
|
} SCENE {
|
|
MESSAGE("Foe Wobbuffet used ExtremeSpeed!");
|
|
MESSAGE("Wobbuffet used Max Mindstorm!");
|
|
MESSAGE("Foe Wobbuffet cannot use ExtremeSpeed!");
|
|
MESSAGE("Wobbuffet used Max Mindstorm!");
|
|
}
|
|
}
|