This commit is contained in:
grintoul 2026-03-21 08:02:48 +01:00 committed by GitHub
commit 0a4c8677f9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 535 additions and 32 deletions

View File

@ -133,6 +133,8 @@ enum RandomTag
RNG_CUTE_CHARM,
RNG_DAMAGE_MODIFIER,
RNG_DIRE_CLAW,
RNG_DISABLE_MOVE,
RNG_DISABLE_TURNS,
RNG_EFFECT_SPORE,
RNG_FLAME_BODY,
RNG_FORCE_RANDOM_SWITCH,

View File

@ -772,12 +772,18 @@ static bool32 HandleEndTurnDisable(enum BattlerId battler)
if (gBattleMons[battler].volatiles.disabledMove == gBattleMons[battler].moves[moveIndex])
break;
}
if (!(GetConfig(B_DISABLE_TURNS) <= GEN_2
&& gBattleMons[battler].volatiles.unableToUseMove
&& (gBattleMons[battler].volatiles.disabledMove != gChosenMoveByBattler[battler]))) // Timer increments still if fast disable blocked move
{
gBattleMons[battler].volatiles.disableTimer--;
}
if (moveIndex == MAX_MON_MOVES) // Pokémon does not have the disabled move anymore
{
gBattleMons[battler].volatiles.disabledMove = 0;
gBattleMons[battler].volatiles.disableTimer = 0;
}
else if (--gBattleMons[battler].volatiles.disableTimer == 0) // disable ends
else if (gBattleMons[battler].volatiles.disableTimer == 0) // disable ends
{
gBattleMons[battler].volatiles.disabledMove = 0;
gBattleScripting.battler = battler;

View File

@ -4112,7 +4112,7 @@ static enum Move GetSleepTalkMove(void)
unusableMovesBits |= (1 << (i));
}
unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~(MOVE_LIMITATION_PP | MOVE_LIMITATION_CHOICE_ITEM));
unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~(MOVE_LIMITATION_PP | MOVE_LIMITATION_CHOICE_ITEM | MOVE_LIMITATION_DISABLED));
if (unusableMovesBits == ALL_MOVES_MASK) // all 4 moves cannot be chosen
return move;

View File

@ -8749,24 +8749,53 @@ static void Cmd_disablelastusedattack(void)
CMD_ARGS(const u8 *failInstr);
s32 i;
enum Move moveToDisable = gLastMoves[gBattlerTarget];
if (GetConfig(B_DISABLE_TURNS) == GEN_1)
{
enum Move eligibleMoves[MAX_MON_MOVES] = {0};
s32 eligibleMovesCount = 0;
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[gBattlerTarget].moves[i] == MOVE_NONE || gBattleMons[gBattlerTarget].pp[i] == 0)
continue;
else
eligibleMoves[eligibleMovesCount++] = gBattleMons[gBattlerTarget].moves[i];
}
if (eligibleMovesCount > 0)
moveToDisable = eligibleMoves[RandomUniform(RNG_DISABLE_MOVE, 0, (eligibleMovesCount - 1))];
}
if (moveToDisable == MOVE_NONE || gBattleMons[gBattlerTarget].volatiles.disabledMove != MOVE_NONE)
{
gBattlescriptCurrInstr = cmd->failInstr;
return;
}
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget])
if (gBattleMons[gBattlerTarget].moves[i] == moveToDisable)
break;
}
if (gBattleMons[gBattlerTarget].volatiles.disabledMove == MOVE_NONE
&& i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0)
{
PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].moves[i])
PREPARE_MOVE_BUFFER(gBattleTextBuff1, moveToDisable)
gBattleMons[gBattlerTarget].volatiles.disabledMove = gBattleMons[gBattlerTarget].moves[i];
if (B_DISABLE_TURNS >= GEN_5)
if (GetConfig(B_DISABLE_TURNS) == GEN_1)
gBattleMons[gBattlerTarget].volatiles.disableTimer = RandomUniform(RNG_DISABLE_TURNS, 0, 7);
else if (GetConfig(B_DISABLE_TURNS) == GEN_2)
gBattleMons[gBattlerTarget].volatiles.disableTimer = RandomUniform(RNG_DISABLE_TURNS, 1, 7);
else if (GetConfig(B_DISABLE_TURNS) == GEN_3)
gBattleMons[gBattlerTarget].volatiles.disableTimer = RandomUniform(RNG_DISABLE_TURNS, 2, 5);
else if (GetConfig(B_DISABLE_TURNS) == GEN_4)
gBattleMons[gBattlerTarget].volatiles.disableTimer = RandomUniform(RNG_DISABLE_TURNS, B_DISABLE_TIMER, 7);
else // GEN_5+
gBattleMons[gBattlerTarget].volatiles.disableTimer = B_DISABLE_TIMER;
else if (B_DISABLE_TURNS >= GEN_4)
gBattleMons[gBattlerTarget].volatiles.disableTimer = (Random() & 3) + B_DISABLE_TIMER; // 4-7 turns
else
gBattleMons[gBattlerTarget].volatiles.disableTimer = (Random() & 3) + 2; // 2-5 turns
// If timer set to zero turns, don't set disabledMove
if (gBattleMons[gBattlerTarget].volatiles.disableTimer != 0)
gBattleMons[gBattlerTarget].volatiles.disabledMove = moveToDisable;
gBattlescriptCurrInstr = cmd->nextInstr;
}
else

View File

@ -1422,14 +1422,18 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] =
{
.name = COMPOUND_STRING("Disable"),
.description = COMPOUND_STRING(
#if B_DISABLE_TURNS >= GEN_5
"For 4 turns, prevents foe\n"
"Prevents the foe from using\n"
#if B_DISABLE_TURNS == GEN_1
"a random move for 0-7 turns."),
#elif B_DISABLE_TURNS == GEN_2
"its last move for 1-7 turns."),
#elif B_DISABLE_TURNS == GEN_3
"its last move for 2-5 turns."),
#elif B_DISABLE_TURNS == GEN_4
"For 4-7 turns, prevents foe\n"
"its last move for 4-7 turns."),
#else
"For 2-5 turns, prevents foe\n"
"its last move for 4 turns."),
#endif
"from using last used move."),
#if B_UPDATED_MOVE_DATA >= GEN_5
.accuracy = 100,
#elif B_UPDATED_MOVE_DATA == GEN_4

View File

@ -1,20 +1,482 @@
#include "global.h"
#include "test/battle.h"
TO_DO_BATTLE_TEST("Disable prevents the target from using a random move (Gen 1)");
TO_DO_BATTLE_TEST("Disable prevents the target from using the last move used (Gen 2+)");
TO_DO_BATTLE_TEST("Disable fails if one of the target's moves is already disabled");
TO_DO_BATTLE_TEST("Disable fails if the target haven't used a move yet (Gen 2+)");
TO_DO_BATTLE_TEST("Disable fails if the last move used was Struggle (Gen 2+)");
TO_DO_BATTLE_TEST("Disable fails if the last move used was a Max Move");
TO_DO_BATTLE_TEST("Disabled moves can still be used via Sleep Talk");
TO_DO_BATTLE_TEST("Disabled moves can still be used via Metronome");
TO_DO_BATTLE_TEST("Disabled moves can still be used via Mirror Move");
TO_DO_BATTLE_TEST("Disable lasts 0-7 turns (Gen 1)");
TO_DO_BATTLE_TEST("Disable lasts 2-8 turns (Gen 2)");
TO_DO_BATTLE_TEST("Disable lasts 2-5 turns (Gen 3)");
TO_DO_BATTLE_TEST("Disable lasts 4-7 turns (Gen 4)");
TO_DO_BATTLE_TEST("Disable lasts 4 turns (Gen 5+)");
TO_DO_BATTLE_TEST("Disable's timer only counts down when trying to use a move (Gen 1-2)");
TO_DO_BATTLE_TEST("Disable's timer counts down regardless of the action (Gen 3+)");
TO_DO_BATTLE_TEST("Baton Pass doesn't pass Disable's effect");
SINGLE_BATTLE_TEST("Disable prevents the target from using a random move (Gen 1)")
{
PASSES_RANDOMLY(1, 3, RNG_DISABLE_MOVE);
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, GEN_1);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(1); Moves(MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_ICE_BEAM); }
} WHEN {
TURN { MOVE(player, MOVE_DISABLE); MOVE(opponent, MOVE_THUNDERBOLT); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, opponent);
}
}
SINGLE_BATTLE_TEST("Disable prevents the target from using the last move used (Gen 2+)")
{
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, GEN_2);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(1); Moves(MOVE_SCRATCH, MOVE_CELEBRATE); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); }
TURN { MOVE(player, MOVE_DISABLE); MOVE(opponent, MOVE_SCRATCH); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
MESSAGE("The opposing Wynaut's Scratch is disabled!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
}
}
SINGLE_BATTLE_TEST("Disable fails if one of the target's moves is already disabled")
{
u32 config = GEN_LATEST;
PARAMETRIZE { config = GEN_1; }
PARAMETRIZE { config = GEN_2; }
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, config);
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
OPPONENT(SPECIES_WYNAUT) { Speed(2); Moves(MOVE_CELEBRATE, MOVE_SCRATCH); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_DISABLE); }
TURN { MOVE(player, MOVE_DISABLE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent);
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Disable fails if the target haven't used a move yet (Gen 2+)")
{
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, GEN_2);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(1); Moves(MOVE_CELEBRATE, MOVE_SCRATCH); }
} WHEN {
TURN { MOVE(player, MOVE_DISABLE); MOVE(opponent, MOVE_SCRATCH); }
TURN { MOVE(player, MOVE_DISABLE); MOVE(opponent, MOVE_SCRATCH); }
} SCENE {
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("But it failed!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
MESSAGE("The opposing Wynaut's Scratch is disabled!");
}
}
SINGLE_BATTLE_TEST("Disable fails if the last move used was Struggle (Gen 2+)")
{
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, GEN_2);
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
OPPONENT(SPECIES_WYNAUT) { Speed(2); MovesWithPP({MOVE_SCRATCH, 1}, {MOVE_CELEBRATE, 40}); Item(ITEM_CHOICE_BAND); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_CELEBRATE); }
TURN { FORCED_MOVE(opponent); MOVE(player, MOVE_DISABLE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, opponent);
NONE_OF {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
}
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Disable fails if the last move used was a Max Move")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
OPPONENT(SPECIES_WYNAUT) { Speed(2); }
} WHEN {
TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_DYNAMAX); MOVE(player, MOVE_DISABLE); }
TURN { MOVE(opponent, MOVE_SLEEP_TALK); MOVE(player, MOVE_SPORE); }
TURN { MOVE(opponent, MOVE_SLEEP_TALK); }
} SCENE {
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_GUARD, opponent);
MESSAGE("Wobbuffet used Disable!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Disabled moves can still be used via Sleep Talk")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
OPPONENT(SPECIES_WYNAUT) { Speed(2); Moves(MOVE_SLEEP_TALK, MOVE_SCRATCH); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_DISABLE); }
TURN { MOVE(opponent, MOVE_SLEEP_TALK); MOVE(player, MOVE_SPORE); }
TURN { MOVE(opponent, MOVE_SLEEP_TALK); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, opponent);
MESSAGE("But it failed!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, opponent);
NOT MESSAGE("The opposing Wynaut's Scratch is disabled!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
}
}
SINGLE_BATTLE_TEST("Disabled moves can still be used via Metronome")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
OPPONENT(SPECIES_WYNAUT) { Speed(2); Moves(MOVE_METRONOME, MOVE_SCRATCH); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_DISABLE); }
TURN { MOVE(opponent, MOVE_METRONOME, WITH_RNG(RNG_METRONOME, MOVE_SCRATCH)); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut used Metronome!");
NOT MESSAGE("But it failed!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_METRONOME, opponent);
MESSAGE("Waggling a finger let it use Scratch!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
}
}
SINGLE_BATTLE_TEST("Disabled moves can still be used via Mirror Move")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
OPPONENT(SPECIES_WYNAUT) { Speed(2); Moves(MOVE_DISABLE, MOVE_MIRROR_MOVE); }
} WHEN {
TURN { MOVE(opponent, MOVE_DISABLE); MOVE(player, MOVE_DISABLE); }
TURN { MOVE(opponent, MOVE_MIRROR_MOVE); MOVE(player, MOVE_DISABLE); }
} SCENE {
MESSAGE("The opposing Wynaut used Disable!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, opponent);
MESSAGE("But it failed!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Disable was disabled!");
MESSAGE("The opposing Wynaut used Mirror Move!");
NOT MESSAGE("But it failed!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_MOVE, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, opponent);
MESSAGE("Wobbuffet's Disable was disabled!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("Wobbuffet's Disable is disabled!");
}
}
SINGLE_BATTLE_TEST("Disable lasts 0-7 turns (Gen 1)")
{
PASSES_RANDOMLY(1, 8, RNG_DISABLE_TURNS);
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, GEN_1);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(1); Moves(MOVE_SCRATCH, MOVE_CELEBRATE); }
} WHEN {
TURN { MOVE(player, MOVE_DISABLE, WITH_RNG(RNG_DISABLE_MOVE, 0)); MOVE(opponent, MOVE_SCRATCH); }
TURN {}
TURN {}
TURN {}
TURN {}
TURN {}
TURN {}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
MESSAGE("The opposing Wynaut's Scratch is disabled!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
MESSAGE("The opposing Wynaut's move is no longer disabled!");
}
}
SINGLE_BATTLE_TEST("Disable has a 1 in 8 chance for the target to still use its move (Gen 1)")
{
PASSES_RANDOMLY(1, 8, RNG_DISABLE_TURNS);
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, GEN_1);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(1); Moves(MOVE_SCRATCH, MOVE_CELEBRATE); }
} WHEN {
TURN { MOVE(player, MOVE_DISABLE, WITH_RNG(RNG_DISABLE_MOVE, 0)); MOVE(opponent, MOVE_SCRATCH); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
NOT MESSAGE("The opposing Wynaut's Scratch is disabled!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
}
}
SINGLE_BATTLE_TEST("Disable lasts 1-7 turns (Gen 2)")
{
PASSES_RANDOMLY(1, 7, RNG_DISABLE_TURNS);
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, GEN_2);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(1); Moves(MOVE_SCRATCH, MOVE_CELEBRATE); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); }
TURN { MOVE(player, MOVE_DISABLE); MOVE(opponent, MOVE_SCRATCH); }
TURN {}
TURN {}
TURN {}
TURN {}
TURN {}
TURN {}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); // 0 turns
MESSAGE("The opposing Wynaut's Scratch is disabled!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 7 turns
}
}
SINGLE_BATTLE_TEST("Disable lasts 2-5 turns (Gen 3)")
{
PASSES_RANDOMLY(1, 4, RNG_DISABLE_TURNS);
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, GEN_3);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(1); Moves(MOVE_SCRATCH, MOVE_CELEBRATE); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); }
TURN { MOVE(player, MOVE_DISABLE); MOVE(opponent, MOVE_SCRATCH); }
TURN {}
TURN {}
TURN {}
TURN {}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); // 0 turns
MESSAGE("The opposing Wynaut's Scratch is disabled!");
NOT MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 1 turn
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 5 turns
}
}
SINGLE_BATTLE_TEST("Disable lasts 4-7 turns (Gen 4)")
{
PASSES_RANDOMLY(1, 4, RNG_DISABLE_TURNS);
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, GEN_4);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(1); Moves(MOVE_SCRATCH, MOVE_CELEBRATE); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); }
TURN { MOVE(player, MOVE_DISABLE); MOVE(opponent, MOVE_SCRATCH); }
TURN {}
TURN {}
TURN {}
TURN {}
TURN {}
TURN {}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); // 0 turns
MESSAGE("The opposing Wynaut's Scratch is disabled!");
NOT MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 1 turn
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
NOT MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 2 turns
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
NOT MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 3 turns
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
MESSAGE("The opposing Wynaut's move is no longer disabled!");
}
}
SINGLE_BATTLE_TEST("Disable lasts 4 turns (Gen 5+)")
{
PASSES_RANDOMLY(10, 10, RNG_DISABLE_TURNS);
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, GEN_5);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(1); Moves(MOVE_SCRATCH, MOVE_CELEBRATE); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); }
TURN { MOVE(player, MOVE_DISABLE); MOVE(opponent, MOVE_SCRATCH); }
TURN {}
TURN {}
TURN {}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); // 0 turns
MESSAGE("The opposing Wynaut's Scratch is disabled!");
NOT MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 1 turn
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
NOT MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 2 turns
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
NOT MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 3 turns
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
MESSAGE("The opposing Wynaut's move is no longer disabled!");
}
}
SINGLE_BATTLE_TEST("Disable's timer only counts down when trying to use a move (Gen 1-2)")
{
u32 config = GEN_LATEST;
enum Move move = MOVE_NONE;
PARAMETRIZE { config = GEN_1; move = MOVE_SCRATCH; }
PARAMETRIZE { config = GEN_1; move = MOVE_ROCK_SLIDE; }
PARAMETRIZE { config = GEN_1; move = MOVE_SING; }
PARAMETRIZE { config = GEN_1; move = MOVE_ICE_BEAM; }
PARAMETRIZE { config = GEN_1; move = MOVE_THUNDERBOLT; }
//PARAMETRIZE { config = GEN_1; move = MOVE_WRAP; } // TO DO: uncomment once Gen 1 Wrap is added
PARAMETRIZE { config = GEN_2; move = MOVE_SCRATCH; }
PARAMETRIZE { config = GEN_2; move = MOVE_ROCK_SLIDE; }
PARAMETRIZE { config = GEN_2; move = MOVE_SING; }
PARAMETRIZE { config = GEN_2; move = MOVE_ICE_BEAM; }
PARAMETRIZE { config = GEN_2; move = MOVE_THUNDERBOLT; }
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, config);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); Moves(move, MOVE_DISABLE, MOVE_CELEBRATE); }
OPPONENT(SPECIES_WYNAUT) { Speed(1); Moves(MOVE_CELEBRATE, MOVE_SCRATCH); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); }
TURN { MOVE(player, MOVE_DISABLE, WITH_RNG(RNG_DISABLE_TURNS, 2)); MOVE(opponent, MOVE_SCRATCH); }
switch (move)
{
case MOVE_ICE_BEAM:
TURN { MOVE(player, move); MOVE(opponent, MOVE_CELEBRATE, WITH_RNG(RNG_FROZEN, FALSE)); }
break;
case MOVE_THUNDERBOLT:
TURN { MOVE(player, move); MOVE(opponent, MOVE_CELEBRATE, WITH_RNG(RNG_PARALYSIS, FALSE)); }
break;
default:
TURN { MOVE(player, move); MOVE(opponent, MOVE_CELEBRATE); }
break;
}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); // 0 turns
MESSAGE("The opposing Wynaut's Scratch is disabled!");
NOT MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 1 turn
ANIMATION(ANIM_TYPE_MOVE, move, player);
if (move != MOVE_SCRATCH)
NOT MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 2 turns
else
MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 2 turns
}
}
SINGLE_BATTLE_TEST("Disable's timer counts down regardless of the action (Gen 3+)")
{
enum Move move = MOVE_NONE;
PARAMETRIZE { move = MOVE_SCRATCH; }
PARAMETRIZE { move = MOVE_ROCK_SLIDE; }
PARAMETRIZE { move = MOVE_SING; }
PARAMETRIZE { move = MOVE_ICE_BEAM; }
PARAMETRIZE { move = MOVE_THUNDERBOLT; }
GIVEN {
WITH_CONFIG(B_DISABLE_TURNS, GEN_3);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); Moves(move, MOVE_DISABLE, MOVE_CELEBRATE); }
OPPONENT(SPECIES_WYNAUT) { Speed(1); Moves(MOVE_CELEBRATE, MOVE_SCRATCH); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); }
TURN { MOVE(player, MOVE_DISABLE, WITH_RNG(RNG_DISABLE_TURNS, 2)); MOVE(opponent, MOVE_SCRATCH); }
switch (move)
{
case MOVE_ICE_BEAM:
TURN { MOVE(player, move); MOVE(opponent, MOVE_CELEBRATE, WITH_RNG(RNG_FROZEN, FALSE)); }
break;
case MOVE_THUNDERBOLT:
TURN { MOVE(player, move); MOVE(opponent, MOVE_CELEBRATE, WITH_RNG(RNG_PARALYSIS, FALSE)); }
break;
default:
TURN { MOVE(player, move); MOVE(opponent, MOVE_CELEBRATE); }
break;
}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); // 0 turns
MESSAGE("The opposing Wynaut's Scratch is disabled!");
NOT MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 1 turn
ANIMATION(ANIM_TYPE_MOVE, move, player);
MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 2 turns
}
}
SINGLE_BATTLE_TEST("Baton Pass doesn't pass Disable's effect")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET) { Speed(1); Moves(MOVE_DISABLE, MOVE_CELEBRATE); }
OPPONENT(SPECIES_WYNAUT) { Speed(2); Moves(MOVE_SCRATCH, MOVE_BATON_PASS); }
OPPONENT(SPECIES_WYNAUT) { Speed(2); Moves(MOVE_SCRATCH, MOVE_BATON_PASS); }
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_DISABLE); }
TURN { MOVE(opponent, MOVE_BATON_PASS, partyIndex:1); }
TURN { MOVE(opponent, MOVE_SCRATCH); }
TURN { MOVE(opponent, MOVE_SCRATCH); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISABLE, player);
MESSAGE("The opposing Wynaut's Scratch was disabled!");
MESSAGE("The opposing Wynaut used Baton Pass!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_BATON_PASS, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
MESSAGE("The opposing Wynaut used Scratch!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
MESSAGE("The opposing Wynaut used Scratch!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
NOT MESSAGE("The opposing Wynaut's move is no longer disabled!"); // 4 turns
}
}
TO_DO_BATTLE_TEST("Disable's effect persists when an affected move is taught over following a level up (Gen1)");