2230 lines
92 KiB
C
2230 lines
92 KiB
C
#include "global.h"
|
|
#include "test/battle.h"
|
|
|
|
// These tests are very heavy computationally. Only use them to review animation PRs.
|
|
|
|
#if T_SHOULD_RUN_MOVE_ANIM
|
|
|
|
#define ANIM_TEST_START_MOVE 1 // First move to test
|
|
#define ANIM_TEST_END_MOVE MOVES_COUNT-1 // Last move to test
|
|
|
|
|
|
static void ParametrizeMovesAndSpecies(u32 j, u32 *pMove, u32 *pSpecies, u32 variation)
|
|
{
|
|
enum BattleMoveEffects effect = GetMoveEffect(j);
|
|
if (effect == EFFECT_DARK_VOID) // User needs to be Darkrai
|
|
{
|
|
*pMove = j;
|
|
*pSpecies = SPECIES_DARKRAI;
|
|
}
|
|
else if (effect == EFFECT_HYPERSPACE_FURY) // User needs to be Hoopa Unbound
|
|
{
|
|
*pMove = j;
|
|
*pSpecies = SPECIES_HOOPA_UNBOUND;
|
|
}
|
|
else if (effect == EFFECT_AURA_WHEEL) // User needs to be Morpeko
|
|
{
|
|
*pMove = j;
|
|
*pSpecies = SPECIES_MORPEKO_FULL_BELLY;
|
|
}
|
|
else if (effect == EFFECT_ROTOTILLER || effect == EFFECT_FLOWER_SHIELD) // User needs to be Grass-type
|
|
{
|
|
*pMove = j;
|
|
*pSpecies = SPECIES_TANGELA;
|
|
}
|
|
else if (effect == EFFECT_FAIL_IF_NOT_ARG_TYPE && GetMoveArgType(j) == TYPE_FIRE) // User needs to be Fire-type
|
|
{
|
|
*pMove = j;
|
|
*pSpecies = SPECIES_FLAREON;
|
|
}
|
|
else if (effect == EFFECT_FAIL_IF_NOT_ARG_TYPE && GetMoveArgType(j) == TYPE_ELECTRIC) // User needs to be Electric-type
|
|
{
|
|
*pMove = j;
|
|
*pSpecies = SPECIES_JOLTEON;
|
|
}
|
|
else if (effect == EFFECT_MAGNETIC_FLUX || effect == EFFECT_GEAR_UP) // User needs to have Plus
|
|
{
|
|
*pMove = j;
|
|
*pSpecies = SPECIES_KLINKLANG;
|
|
}
|
|
else if (effect == EFFECT_PLACEHOLDER) // Ignore placeholder *pMoves
|
|
{
|
|
*pMove = MOVE_POUND;
|
|
*pSpecies = SPECIES_WOBBUFFET;
|
|
}
|
|
else // Everything else
|
|
{
|
|
*pMove = j;
|
|
*pSpecies = SPECIES_WOBBUFFET;
|
|
}
|
|
}
|
|
|
|
static u32 ParametrizeFriendship(u32 move, u32 variation)
|
|
{
|
|
if (gMovesInfo[move].effect == EFFECT_FRUSTRATION
|
|
|| gMovesInfo[move].effect == EFFECT_RETURN
|
|
)
|
|
{
|
|
if (variation == 0)
|
|
return 1;
|
|
else if (variation == 1)
|
|
return 61;
|
|
else if (variation == 2)
|
|
return 101;
|
|
else if (variation == 3)
|
|
return 201;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static u32 GetParametrizedHP(u32 move, u32 variation)
|
|
{
|
|
if (gMovesInfo[move].effect == EFFECT_POWER_BASED_ON_USER_HP && variation > 0)
|
|
{
|
|
if (variation == 1)
|
|
return 6000;
|
|
else if (variation == 2)
|
|
return 4000;
|
|
else if (variation == 3)
|
|
return 2000;
|
|
}
|
|
return 9997;
|
|
}
|
|
|
|
static u32 GetParametrizedItem(u32 move, u32 variation)
|
|
{
|
|
if ((move == MOVE_TECHNO_BLAST) && variation > 0)
|
|
{
|
|
if (variation == 1)
|
|
return ITEM_DOUSE_DRIVE;
|
|
else if (variation == 2)
|
|
return ITEM_SHOCK_DRIVE;
|
|
else if (variation == 3)
|
|
return ITEM_BURN_DRIVE;
|
|
else if (variation == 4)
|
|
return ITEM_CHILL_DRIVE;
|
|
}
|
|
return ITEM_ORAN_BERRY;
|
|
}
|
|
|
|
static u32 GetParametrizedLevel(u32 move, u32 variation)
|
|
{
|
|
if (gMovesInfo[move].effect == EFFECT_LEVEL_DAMAGE && variation > 0)
|
|
{
|
|
if (variation == 1)
|
|
return 50;
|
|
else if (variation == 2)
|
|
return 20;
|
|
}
|
|
return 100;
|
|
}
|
|
|
|
static bool32 GetParametrizedShinyness(u32 move, u32 variation)
|
|
{
|
|
if ((gMovesInfo[move].effect == EFFECT_DRAGON_DARTS && variation == 2)
|
|
|| (move == MOVE_SYRUP_BOMB && variation == 1)
|
|
)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
static bool32 TargetHasToMove(u32 move) // Opponent needs to hit the player first
|
|
{
|
|
enum BattleMoveEffects effect = GetMoveEffect(move);
|
|
if (effect == EFFECT_COUNTER
|
|
|| effect == EFFECT_MIRROR_MOVE
|
|
|| effect == EFFECT_CONVERSION_2
|
|
|| effect == EFFECT_MIRROR_COAT
|
|
|| effect == EFFECT_METAL_BURST
|
|
|| effect == EFFECT_COPYCAT
|
|
|| effect == EFFECT_SUCKER_PUNCH
|
|
|| effect == EFFECT_INSTRUCT)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
static bool32 AttackerHasToSwitch(u32 move) // User needs to send out a different team member
|
|
{
|
|
enum BattleMoveEffects effect = GetMoveEffect(move);
|
|
if (effect == EFFECT_TELEPORT
|
|
|| effect == EFFECT_EXPLOSION
|
|
|| effect == EFFECT_MISTY_EXPLOSION
|
|
|| effect == EFFECT_BATON_PASS
|
|
|| effect == EFFECT_MEMENTO
|
|
|| effect == EFFECT_HEALING_WISH
|
|
|| effect == EFFECT_HIT_ESCAPE
|
|
|| effect == EFFECT_FINAL_GAMBIT
|
|
|| effect == EFFECT_PARTING_SHOT
|
|
|| effect == EFFECT_SHED_TAIL
|
|
|| effect == EFFECT_CHILLY_RECEPTION)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
static bool32 UserHasToGoFirst(u32 move) // Player needs to go first
|
|
{
|
|
enum BattleMoveEffects effect = GetMoveEffect(move);
|
|
if (effect == EFFECT_PROTECT
|
|
|| effect == EFFECT_ENDURE
|
|
|| effect == EFFECT_FOLLOW_ME
|
|
|| effect == EFFECT_MAGIC_COAT
|
|
|| effect == EFFECT_ME_FIRST
|
|
|| effect == EFFECT_QUASH
|
|
|| effect == EFFECT_MAT_BLOCK
|
|
|| effect == EFFECT_ELECTRIFY
|
|
|| effect == EFFECT_SHELL_TRAP)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
static u32 GetVariationsNumber(u32 move, bool8 isDouble)
|
|
{
|
|
u32 variationsNumber;
|
|
|
|
if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL
|
|
|| gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE
|
|
|| move == MOVE_TECHNO_BLAST)
|
|
variationsNumber = 5;
|
|
else if (gMovesInfo[move].effect == EFFECT_FRUSTRATION
|
|
|| gMovesInfo[move].effect == EFFECT_RETURN
|
|
|| gMovesInfo[move].effect == EFFECT_IVY_CUDGEL
|
|
|| move == MOVE_WATER_SPOUT) //we don't use the effect because other moves with the water spout effect don't have animation variations
|
|
variationsNumber = 4;
|
|
else if (gMovesInfo[move].effect == EFFECT_SPIT_UP
|
|
|| gMovesInfo[move].effect == EFFECT_SWALLOW
|
|
|| gMovesInfo[move].effect == EFFECT_DRAGON_DARTS
|
|
|| move == MOVE_SEISMIC_TOSS)
|
|
variationsNumber = 3;
|
|
else if (gMovesInfo[move].effect == EFFECT_CURSE
|
|
|| gMovesInfo[move].effect == EFFECT_PRESENT
|
|
|| gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM
|
|
|| gMovesInfo[move].effect == EFFECT_FICKLE_BEAM
|
|
|| gMovesInfo[move].effect == EFFECT_MAGNITUDE
|
|
|| (isDouble && gMovesInfo[move].effect == EFFECT_TERA_STARSTORM)
|
|
|| move == MOVE_SYRUP_BOMB)
|
|
variationsNumber = 2;
|
|
else
|
|
variationsNumber = 1;
|
|
return variationsNumber;
|
|
}
|
|
static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 variation)
|
|
{
|
|
enum BattleMoveEffects effect = GetMoveEffect(move);
|
|
// Setup turn
|
|
if (effect == EFFECT_SNORE
|
|
|| effect == EFFECT_SLEEP_TALK)
|
|
{ // attacker needs to be asleep
|
|
TURN { MOVE(attacker, MOVE_REST); }
|
|
}
|
|
else if (effect == EFFECT_SPIT_UP
|
|
|| effect == EFFECT_SWALLOW)
|
|
{ // attacker needs to have used Stockpile
|
|
for (u32 i = 0; i <= variation; i++)
|
|
{
|
|
TURN { MOVE(attacker, MOVE_STOCKPILE); }
|
|
}
|
|
}
|
|
else if ((effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && GetMoveEffectArg_Status(move) == STATUS1_PARALYSIS))
|
|
{ // defender needs to be paralyzed
|
|
TURN { MOVE(attacker, MOVE_THUNDER_WAVE); }
|
|
}
|
|
else if (effect == EFFECT_RECYCLE
|
|
|| effect == EFFECT_BELCH)
|
|
{ // attacker needs to have eaten its Berry
|
|
TURN { MOVE(attacker, MOVE_STUFF_CHEEKS); }
|
|
}
|
|
else if (effect == EFFECT_REFRESH
|
|
|| effect == EFFECT_PSYCHO_SHIFT)
|
|
{ // attacker needs to be paralyzed
|
|
TURN { MOVE(defender, MOVE_THUNDER_WAVE); }
|
|
}
|
|
else if (effect == EFFECT_LAST_RESORT)
|
|
{ // attacker needs to have used all other moves
|
|
TURN { MOVE(attacker, MOVE_POUND); }
|
|
}
|
|
else if (effect == EFFECT_DREAM_EATER
|
|
|| effect == EFFECT_NIGHTMARE)
|
|
{ // defender needs to be asleep
|
|
TURN { MOVE(defender, MOVE_REST); }
|
|
}
|
|
else if (effect == EFFECT_VENOM_DRENCH
|
|
|| effect == EFFECT_PURIFY)
|
|
{ // defender needs to be poisoned
|
|
TURN { MOVE(attacker, MOVE_POISON_POWDER); }
|
|
}
|
|
else if (effect == EFFECT_TOPSY_TURVY)
|
|
{ // defender needs to have its stats buffed
|
|
TURN { MOVE(defender, MOVE_SWORDS_DANCE); }
|
|
}
|
|
else if (effect == EFFECT_AURORA_VEIL)
|
|
{ // Has to be hailing
|
|
TURN { MOVE(attacker, MOVE_HAIL); }
|
|
}
|
|
else if (effect == EFFECT_STEEL_ROLLER)
|
|
{ // Needs a terrain
|
|
TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); }
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL && variation > 0)
|
|
{
|
|
if (variation == 1)
|
|
TURN { MOVE(attacker, MOVE_SUNNY_DAY); }
|
|
else if (variation == 2)
|
|
TURN { MOVE(attacker, MOVE_RAIN_DANCE); }
|
|
else if (variation == 3)
|
|
TURN { MOVE(attacker, MOVE_SANDSTORM); }
|
|
else
|
|
TURN { MOVE(attacker, MOVE_HAIL); }
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE && variation > 0)
|
|
{
|
|
if (variation == 1)
|
|
TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); }
|
|
else if (variation == 2)
|
|
TURN { MOVE(attacker, MOVE_GRASSY_TERRAIN); }
|
|
else if (variation == 3)
|
|
TURN { MOVE(attacker, MOVE_PSYCHIC_TERRAIN); }
|
|
else if (variation == 4)
|
|
TURN { MOVE(attacker, MOVE_MISTY_TERRAIN); }
|
|
}
|
|
else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect)
|
|
{
|
|
TURN { MOVE(attacker, move); }
|
|
}
|
|
// Effective turn
|
|
TURN {
|
|
if (TargetHasToMove(move))
|
|
{
|
|
MOVE(defender, effect == EFFECT_MIRROR_COAT ? MOVE_SWIFT : MOVE_POUND);
|
|
MOVE(attacker, move);
|
|
}
|
|
else if (effect == EFFECT_SNATCH)
|
|
{ // defender needs to steal the defender's buffing move
|
|
MOVE(attacker, move);
|
|
MOVE(defender, MOVE_SWORDS_DANCE);
|
|
}
|
|
else if (effect == EFFECT_OHKO || effect == EFFECT_SHEER_COLD)
|
|
{ // defender needs to send out a different team member
|
|
MOVE(attacker, move);
|
|
SEND_OUT(defender, 1);
|
|
}
|
|
else if (AttackerHasToSwitch(move))
|
|
{ // attacker needs to send out a different team member
|
|
MOVE(attacker, move);
|
|
SEND_OUT(attacker, 1);
|
|
}
|
|
else if (UserHasToGoFirst(move))
|
|
{ // attacker needs to go first
|
|
MOVE(attacker, move);
|
|
MOVE(defender, MOVE_POUND);
|
|
}
|
|
else if (effect == EFFECT_REVIVAL_BLESSING)
|
|
{ // attacker selects party member
|
|
MOVE(attacker, move, partyIndex: 1);
|
|
MOVE(defender, MOVE_HELPING_HAND);
|
|
}
|
|
else if (effect == EFFECT_UPPER_HAND)
|
|
{ // defender needs to choose priority move
|
|
MOVE(attacker, move);
|
|
MOVE(defender, MOVE_QUICK_ATTACK);
|
|
}
|
|
else if (effect == EFFECT_ACUPRESSURE)
|
|
{
|
|
MOVE(attacker, move, target: attacker);
|
|
}
|
|
else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect)
|
|
{
|
|
MOVE(defender, MOVE_HELPING_HAND);
|
|
SKIP_TURN(attacker);
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_PRESENT)
|
|
{
|
|
if (variation == 0)
|
|
MOVE(attacker, move, WITH_RNG(RNG_PRESENT, 1));
|
|
else if (variation == 1)
|
|
MOVE(attacker, move, WITH_RNG(RNG_PRESENT, 254));
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_MAGNITUDE)
|
|
{
|
|
if (variation == 0)
|
|
MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 50));
|
|
else if (variation == 1)
|
|
MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 99));
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_FICKLE_BEAM)
|
|
{
|
|
if (variation == 0)
|
|
MOVE(attacker, move, WITH_RNG(RNG_FICKLE_BEAM, FALSE));
|
|
else if (variation == 1)
|
|
MOVE(attacker, move, WITH_RNG(RNG_FICKLE_BEAM, TRUE));
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM)
|
|
{
|
|
if (variation == 0)
|
|
MOVE(attacker, move, WITH_RNG(RNG_SHELL_SIDE_ARM, FALSE));
|
|
else if (variation == 1)
|
|
MOVE(attacker, move, WITH_RNG(RNG_SHELL_SIDE_ARM, TRUE));
|
|
}
|
|
else
|
|
{ // All other moves
|
|
MOVE(defender, MOVE_HELPING_HAND); // Helping Hand, so there's no anim on the defender's side.
|
|
MOVE(attacker, move);
|
|
}
|
|
}
|
|
if (gMovesInfo[move].effect == EFFECT_WISH)
|
|
{
|
|
TURN {};
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_FUTURE_SIGHT)
|
|
{
|
|
TURN {};
|
|
TURN {};
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_ROLLOUT)
|
|
{
|
|
TURN {MOVE(attacker, move);};
|
|
TURN {MOVE(attacker, move);};
|
|
TURN {MOVE(attacker, move);};
|
|
TURN {MOVE(attacker, move);};
|
|
TURN {MOVE(attacker, MOVE_HELPING_HAND);};
|
|
}
|
|
}
|
|
|
|
static void SceneSingles(u32 move, struct BattlePokemon *mon)
|
|
{
|
|
enum BattleMoveEffects effect = GetMoveEffect(move);
|
|
if (effect == EFFECT_FOLLOW_ME
|
|
|| effect == EFFECT_HELPING_HAND
|
|
|| effect == EFFECT_AFTER_YOU
|
|
|| effect == EFFECT_ALLY_SWITCH
|
|
|| effect == EFFECT_AROMATIC_MIST
|
|
|| move == MOVE_HOLD_HANDS // Hack here because it shares its effect with Splash and Celebrate
|
|
|| effect == EFFECT_COACHING
|
|
|| effect == EFFECT_DRAGON_CHEER)
|
|
{
|
|
// Moves that fail in Single Battles
|
|
}
|
|
else if (effect == EFFECT_MIRROR_MOVE) // Copy the opponent's move
|
|
{
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, mon);
|
|
}
|
|
else if (effect == EFFECT_NATURE_POWER) // Recorded battles always use BATTLE_ENVIRONMENT_BUILDING
|
|
{
|
|
ANIMATION(ANIM_TYPE_MOVE, B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT, mon);
|
|
}
|
|
else // All other moves
|
|
{
|
|
ANIMATION(ANIM_TYPE_MOVE, move, mon);
|
|
}
|
|
}
|
|
|
|
static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *target, struct BattlePokemon *ignore1, struct BattlePokemon *ignore2, u32 variation)
|
|
{
|
|
enum BattleMoveEffects effect = GetMoveEffect(move);
|
|
// Setup turn
|
|
if (effect == EFFECT_SNORE
|
|
|| effect == EFFECT_SLEEP_TALK)
|
|
{ // Player needs to be asleep
|
|
TURN { MOVE(attacker, MOVE_REST); }
|
|
}
|
|
else if (effect == EFFECT_SPIT_UP
|
|
|| effect == EFFECT_SWALLOW)
|
|
{ // Player needs to have used Stockpile
|
|
for (u32 i = 0; i <= variation; i++)
|
|
{
|
|
TURN { MOVE(attacker, MOVE_STOCKPILE); }
|
|
}
|
|
}
|
|
else if ((effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && GetMoveEffectArg_Status(move) == STATUS1_PARALYSIS))
|
|
{ // Opponent needs to be paralyzed
|
|
TURN { MOVE(attacker, MOVE_THUNDER_WAVE, target: target); }
|
|
}
|
|
else if (effect == EFFECT_RECYCLE
|
|
|| effect == EFFECT_BELCH)
|
|
{ // Player needs to have eaten its Berry
|
|
TURN { MOVE(attacker, MOVE_STUFF_CHEEKS); }
|
|
}
|
|
else if (effect == EFFECT_REFRESH
|
|
|| effect == EFFECT_PSYCHO_SHIFT)
|
|
{ // Player needs to be paralyzed
|
|
TURN { MOVE(target, MOVE_THUNDER_WAVE, target: attacker); }
|
|
}
|
|
else if (effect == EFFECT_LAST_RESORT)
|
|
{ // Player needs to have used all other moves
|
|
TURN { MOVE(attacker, MOVE_POUND, target: target); }
|
|
}
|
|
else if (effect == EFFECT_DREAM_EATER
|
|
|| effect == EFFECT_NIGHTMARE)
|
|
{ // Opponent needs to be asleep
|
|
TURN { MOVE(target, MOVE_REST); }
|
|
}
|
|
else if (effect == EFFECT_VENOM_DRENCH
|
|
|| effect == EFFECT_PURIFY)
|
|
{ // Opponent needs to be poisoned
|
|
TURN { MOVE(attacker, MOVE_POISON_POWDER, target: target); }
|
|
}
|
|
else if (effect == EFFECT_TOPSY_TURVY)
|
|
{ // Opponent needs to have its stats buffed
|
|
TURN { MOVE(target, MOVE_SWORDS_DANCE); }
|
|
}
|
|
else if (effect == EFFECT_AURORA_VEIL)
|
|
{ // Has to be hailing
|
|
TURN { MOVE(attacker, MOVE_HAIL); }
|
|
}
|
|
else if (effect == EFFECT_STEEL_ROLLER)
|
|
{ // Needs a terrain
|
|
TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); }
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL && variation > 0)
|
|
{
|
|
if (variation == 1)
|
|
TURN { MOVE(attacker, MOVE_SUNNY_DAY); }
|
|
else if (variation == 2)
|
|
TURN { MOVE(attacker, MOVE_RAIN_DANCE); }
|
|
else if (variation == 3)
|
|
TURN { MOVE(attacker, MOVE_SANDSTORM); }
|
|
else
|
|
TURN { MOVE(attacker, MOVE_HAIL); }
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE && variation > 0)
|
|
{
|
|
if (variation == 1)
|
|
TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); }
|
|
else if (variation == 2)
|
|
TURN { MOVE(attacker, MOVE_GRASSY_TERRAIN); }
|
|
else if (variation == 3)
|
|
TURN { MOVE(attacker, MOVE_PSYCHIC_TERRAIN); }
|
|
else if (variation == 4)
|
|
TURN { MOVE(attacker, MOVE_MISTY_TERRAIN); }
|
|
}
|
|
else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect)
|
|
{
|
|
TURN { MOVE(attacker, move, target: target); }
|
|
}
|
|
// Effective turn
|
|
TURN {
|
|
if (TargetHasToMove(move))
|
|
{ // Opponent needs to hit the player first
|
|
MOVE(target, effect == EFFECT_MIRROR_COAT ? MOVE_SWIFT : MOVE_POUND, target: attacker);
|
|
MOVE(attacker, move, target: target);
|
|
}
|
|
else if (effect == EFFECT_SNATCH)
|
|
{ // Opponent needs to steal the opponent's buffing move
|
|
MOVE(attacker, move, target: target);
|
|
MOVE(target, MOVE_SWORDS_DANCE);
|
|
}
|
|
else if (effect == EFFECT_OHKO || effect == EFFECT_SHEER_COLD)
|
|
{ // Opponent needs to send out a different team member
|
|
MOVE(attacker, move, target: target);
|
|
SEND_OUT(target, 2);
|
|
}
|
|
else if (AttackerHasToSwitch(move))
|
|
{ // Player needs to send out a different team member
|
|
MOVE(attacker, move, target: target);
|
|
SEND_OUT(attacker, 2);
|
|
}
|
|
else if (UserHasToGoFirst(move))
|
|
{ // Player needs to go first
|
|
MOVE(attacker, move, target: target);
|
|
MOVE(target, MOVE_POUND, target: attacker);
|
|
}
|
|
else if (effect == EFFECT_AFTER_YOU)
|
|
{ // Player goes first, opponent third
|
|
MOVE(attacker, move, target: target);
|
|
MOVE(ignore1, MOVE_CELEBRATE);
|
|
MOVE(target, MOVE_POUND, target: attacker);
|
|
MOVE(ignore2, MOVE_CELEBRATE);
|
|
}
|
|
else if (effect == EFFECT_REVIVAL_BLESSING)
|
|
{ // Player selects party member
|
|
MOVE(attacker, move, partyIndex: 2);
|
|
MOVE(target, MOVE_LAST_RESORT, target: attacker); // Last Resort, so there's no anim on the opponent's side.
|
|
}
|
|
else if (effect == EFFECT_UPPER_HAND)
|
|
{ // Opponent needs to choose priority move
|
|
MOVE(attacker, move, target: target);
|
|
MOVE(target, MOVE_QUICK_ATTACK, target: attacker);
|
|
}
|
|
else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect)
|
|
{
|
|
MOVE(target, MOVE_LAST_RESORT, target: attacker);
|
|
SKIP_TURN(attacker);
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_PRESENT)
|
|
{
|
|
if (variation == 0)
|
|
MOVE(attacker, move, target: target, WITH_RNG(RNG_PRESENT, 1));
|
|
else if (variation == 1)
|
|
MOVE(attacker, move, target: target, WITH_RNG(RNG_PRESENT, 254));
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_MAGNITUDE)
|
|
{
|
|
if (variation == 0)
|
|
MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 50));
|
|
else if (variation == 1)
|
|
MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 99));
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_FICKLE_BEAM)
|
|
{
|
|
if (variation == 0)
|
|
MOVE(attacker, move, target: target, WITH_RNG(RNG_FICKLE_BEAM, FALSE));
|
|
else if (variation == 1)
|
|
MOVE(attacker, move, target: target, WITH_RNG(RNG_FICKLE_BEAM, TRUE));
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM)
|
|
{
|
|
if (variation == 0)
|
|
MOVE(attacker, move, target: target, WITH_RNG(RNG_SHELL_SIDE_ARM, FALSE));
|
|
else if (variation == 1)
|
|
MOVE(attacker, move, target: target, WITH_RNG(RNG_SHELL_SIDE_ARM, TRUE));
|
|
}
|
|
else
|
|
{ // All other moves
|
|
MOVE(target, MOVE_LAST_RESORT, target: attacker); // Last Resort, so there's no anim on the opponent's side.
|
|
MOVE(attacker, move, target: target);
|
|
}
|
|
if (effect != EFFECT_AFTER_YOU)
|
|
{
|
|
// Actions for the remaining battlers
|
|
MOVE(ignore1, MOVE_CELEBRATE);
|
|
MOVE(ignore2, MOVE_CELEBRATE);
|
|
}
|
|
}
|
|
if (gMovesInfo[move].effect == EFFECT_WISH)
|
|
{
|
|
TURN {};
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_FUTURE_SIGHT)
|
|
{
|
|
TURN {};
|
|
TURN {};
|
|
}
|
|
else if (gMovesInfo[move].effect == EFFECT_ROLLOUT)
|
|
{
|
|
TURN {MOVE(attacker, move, target: target);};
|
|
TURN {MOVE(attacker, move, target: target);};
|
|
TURN {MOVE(attacker, move, target: target);};
|
|
TURN {MOVE(attacker, move, target: target);};
|
|
TURN {MOVE(attacker, MOVE_LAST_RESORT, target: attacker);};
|
|
}
|
|
}
|
|
|
|
static void DoublesScene(u32 move, struct BattlePokemon *attacker)
|
|
{
|
|
enum BattleMoveEffects effect = GetMoveEffect(move);
|
|
if (effect == EFFECT_MAGNETIC_FLUX || effect == EFFECT_GEAR_UP) // For some reason, Magnetic Flux and Gear Up are failing in Double Battles here
|
|
{
|
|
// Moves that fail in Double Battles
|
|
}
|
|
else if (effect == EFFECT_MIRROR_MOVE)
|
|
{ // Copy the opponent's move
|
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, attacker);
|
|
}
|
|
else if (effect == EFFECT_NATURE_POWER)
|
|
{ // Recorded battles always use BATTLE_ENVIRONMENT_BUILDING
|
|
ANIMATION(ANIM_TYPE_MOVE, B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT, attacker);
|
|
}
|
|
else
|
|
{ // All other moves
|
|
ANIMATION(ANIM_TYPE_MOVE, move, attacker);
|
|
}
|
|
}
|
|
|
|
//static void SameSideTargeting(u32 move, struct BattlePokemon *attacker)
|
|
//{
|
|
// // Don't know how to make sure this is correct, some moves don't display
|
|
//}
|
|
|
|
SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (player to opponent)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 k = 0, variation = 0, variationsNumber;
|
|
u32 friendship = 0, tempFriendship;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
variationsNumber = GetVariationsNumber(j, FALSE);
|
|
for (k = 0; k < variationsNumber; k++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k);
|
|
tempFriendship = ParametrizeFriendship(j, k);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;}
|
|
}
|
|
}
|
|
GIVEN {
|
|
PLAYER(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW)
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
WhenSingles(move, player, opponent, variation);
|
|
} SCENE {
|
|
SceneSingles(move, player);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (opponent to player)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 k = 0, variation = 0, variationsNumber;
|
|
u32 friendship = 0, tempFriendship;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
variationsNumber = GetVariationsNumber(j, FALSE);
|
|
for (k = 0; k < variationsNumber; k++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k);
|
|
tempFriendship = ParametrizeFriendship(j, k);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;}
|
|
}
|
|
}
|
|
GIVEN {
|
|
OPPONENT(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW)
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
WhenSingles(move, opponent, player, variation);
|
|
} SCENE {
|
|
SceneSingles(move, opponent);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft to opponentLeft)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 k = 0, variation = 0, variationsNumber;
|
|
u32 friendship = 0, tempFriendship;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = playerLeft;
|
|
struct BattlePokemon *target = opponentLeft;
|
|
struct BattlePokemon *ignore1 = playerRight;
|
|
struct BattlePokemon *ignore2 = opponentRight;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
variationsNumber = GetVariationsNumber(j, TRUE);
|
|
for (k = 0; k < variationsNumber; k++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k);
|
|
tempFriendship = ParametrizeFriendship(j, k);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;}
|
|
}
|
|
}
|
|
GIVEN {
|
|
PLAYER(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == playerLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
PLAYER(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == playerRight)
|
|
{
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW)
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW)
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2, variation);
|
|
} SCENE {
|
|
DoublesScene(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft to playerLeft)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 k = 0, variation = 0, variationsNumber;
|
|
u32 friendship = 0, tempFriendship;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = opponentLeft;
|
|
struct BattlePokemon *target = playerLeft;
|
|
struct BattlePokemon *ignore1 = opponentRight;
|
|
struct BattlePokemon *ignore2 = playerRight;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
variationsNumber = GetVariationsNumber(j, TRUE);
|
|
for (k = 0; k < variationsNumber; k++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k);
|
|
tempFriendship = ParametrizeFriendship(j, k);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;}
|
|
}
|
|
}
|
|
GIVEN {
|
|
OPPONENT(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == opponentLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
OPPONENT(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == opponentRight) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2, variation);
|
|
} SCENE {
|
|
DoublesScene(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft to opponentRight)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 k = 0, variation = 0, variationsNumber;
|
|
u32 friendship = 0, tempFriendship;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = playerLeft;
|
|
struct BattlePokemon *target = opponentRight;
|
|
struct BattlePokemon *ignore1 = playerRight;
|
|
struct BattlePokemon *ignore2 = opponentLeft;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
variationsNumber = GetVariationsNumber(j, TRUE);
|
|
for (k = 0; k < variationsNumber; k++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k);
|
|
tempFriendship = ParametrizeFriendship(j, k);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;}
|
|
}
|
|
}
|
|
GIVEN {
|
|
PLAYER(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == playerLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
PLAYER(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == playerRight) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2, variation);
|
|
} SCENE {
|
|
DoublesScene(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRight to playerLeft)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 k = 0, variation = 0, variationsNumber;
|
|
u32 friendship = 0, tempFriendship;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = opponentRight;
|
|
struct BattlePokemon *target = playerLeft;
|
|
struct BattlePokemon *ignore1 = opponentLeft;
|
|
struct BattlePokemon *ignore2 = playerRight;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
variationsNumber = GetVariationsNumber(j, TRUE);
|
|
for (k = 0; k < variationsNumber; k++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k);
|
|
tempFriendship = ParametrizeFriendship(j, k);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;}
|
|
}
|
|
}
|
|
GIVEN {
|
|
OPPONENT(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == opponentLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
OPPONENT(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == opponentRight) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2, variation);
|
|
} SCENE {
|
|
DoublesScene(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight to opponentLeft)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 k = 0, variation = 0, variationsNumber;
|
|
u32 friendship = 0, tempFriendship;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = playerRight;
|
|
struct BattlePokemon *target = opponentLeft;
|
|
struct BattlePokemon *ignore1 = playerLeft;
|
|
struct BattlePokemon *ignore2 = opponentRight;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
variationsNumber = GetVariationsNumber(j, TRUE);
|
|
for (k = 0; k < variationsNumber; k++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k);
|
|
tempFriendship = ParametrizeFriendship(j, k);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;}
|
|
}
|
|
}
|
|
GIVEN {
|
|
PLAYER(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == playerLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
PLAYER(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == playerRight) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2, variation);
|
|
} SCENE {
|
|
DoublesScene(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft to playerRight)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 k = 0, variation = 0, variationsNumber;
|
|
u32 friendship = 0, tempFriendship;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = opponentLeft;
|
|
struct BattlePokemon *target = playerRight;
|
|
struct BattlePokemon *ignore1 = playerLeft;
|
|
struct BattlePokemon *ignore2 = opponentRight;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
variationsNumber = GetVariationsNumber(j, TRUE);
|
|
for (k = 0; k < variationsNumber; k++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k);
|
|
tempFriendship = ParametrizeFriendship(j, k);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;}
|
|
}
|
|
}
|
|
GIVEN {
|
|
OPPONENT(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == opponentLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
OPPONENT(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == opponentRight) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2, variation);
|
|
} SCENE {
|
|
DoublesScene(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight to opponentRight)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 k = 0, variation = 0, variationsNumber;
|
|
u32 friendship = 0, tempFriendship;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = playerRight;
|
|
struct BattlePokemon *target = opponentRight;
|
|
struct BattlePokemon *ignore1 = playerLeft;
|
|
struct BattlePokemon *ignore2 = opponentLeft;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
variationsNumber = GetVariationsNumber(j, TRUE);
|
|
for (k = 0; k < variationsNumber; k++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k);
|
|
tempFriendship = ParametrizeFriendship(j, k);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;}
|
|
}
|
|
}
|
|
GIVEN {
|
|
PLAYER(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == playerLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
PLAYER(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == playerRight) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2, variation);
|
|
} SCENE {
|
|
DoublesScene(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRight to playerRight)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 k = 0, variation = 0, variationsNumber;
|
|
u32 friendship = 0, tempFriendship;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = opponentRight;
|
|
struct BattlePokemon *target = playerRight;
|
|
struct BattlePokemon *ignore1 = playerLeft;
|
|
struct BattlePokemon *ignore2 = opponentLeft;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
variationsNumber = GetVariationsNumber(j, TRUE);
|
|
for (k = 0; k < variationsNumber; k++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k);
|
|
tempFriendship = ParametrizeFriendship(j, k);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;}
|
|
}
|
|
}
|
|
GIVEN {
|
|
OPPONENT(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == opponentLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
OPPONENT(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (attacker == opponentRight) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2, variation);
|
|
} SCENE {
|
|
DoublesScene(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
/*
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft to playerRight)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = playerLeft;
|
|
struct BattlePokemon *target = playerRight;
|
|
struct BattlePokemon *ignore1 = opponentRight;
|
|
struct BattlePokemon *ignore2 = opponentLeft;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; }
|
|
}
|
|
GIVEN {
|
|
OPPONENT(species) {
|
|
HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY);
|
|
if (attacker == opponentLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
}
|
|
}
|
|
OPPONENT(species) {
|
|
HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY);
|
|
if (attacker == opponentRight) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2);
|
|
} SCENE {
|
|
SameSideTargeting(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight to playerLeft)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = playerRight;
|
|
struct BattlePokemon *target = playerLeft;
|
|
struct BattlePokemon *ignore1 = opponentRight;
|
|
struct BattlePokemon *ignore2 = opponentLeft;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; }
|
|
}
|
|
GIVEN {
|
|
OPPONENT(species) {
|
|
HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY);
|
|
if (attacker == opponentLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
}
|
|
}
|
|
OPPONENT(species) {
|
|
HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY);
|
|
if (attacker == opponentRight) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2);
|
|
} SCENE {
|
|
SameSideTargeting(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentleft to opponentRight)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = opponentLeft;
|
|
struct BattlePokemon *target = opponentRight;
|
|
struct BattlePokemon *ignore1 = playerLeft;
|
|
struct BattlePokemon *ignore2 = playerRight;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; }
|
|
}
|
|
GIVEN {
|
|
OPPONENT(species) {
|
|
HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY);
|
|
if (attacker == opponentLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
}
|
|
}
|
|
OPPONENT(species) {
|
|
HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY);
|
|
if (attacker == opponentRight) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2);
|
|
} SCENE {
|
|
SameSideTargeting(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRight to opponentLeft)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
struct BattlePokemon *attacker = opponentRight;
|
|
struct BattlePokemon *target = opponentLeft;
|
|
struct BattlePokemon *ignore1 = playerLeft;
|
|
struct BattlePokemon *ignore2 = playerRight;
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; }
|
|
}
|
|
GIVEN {
|
|
OPPONENT(species) {
|
|
HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY);
|
|
if (attacker == opponentLeft) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
}
|
|
}
|
|
OPPONENT(species) {
|
|
HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY);
|
|
if (attacker == opponentRight) {
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
}
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW) {
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
DoublesWhen(move, attacker, target, ignore1, ignore2);
|
|
} SCENE {
|
|
SameSideTargeting(move, attacker);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
}
|
|
}
|
|
*/
|
|
|
|
SINGLE_BATTLE_TEST("Move Animations occur before their stat change animations - Singles (player to opponent)")
|
|
{
|
|
u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0;
|
|
u32 k = 0, variation = 0, variationsNumber;
|
|
u32 friendship = 0, tempFriendship;
|
|
u32 tempMove, tempSpecies;
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
for (; j <= ANIM_TEST_END_MOVE; j++) {
|
|
variationsNumber = GetVariationsNumber(j, FALSE);
|
|
for (k = 0; k < variationsNumber; k++) {
|
|
ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k);
|
|
tempFriendship = ParametrizeFriendship(j, k);
|
|
PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;}
|
|
}
|
|
}
|
|
GIVEN {
|
|
PLAYER(species) {
|
|
Level(GetParametrizedLevel(move, variation));
|
|
HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation));
|
|
if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE);
|
|
if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND);
|
|
if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS);
|
|
if (friendship) Friendship(friendship);
|
|
if (GetParametrizedShinyness(move, variation)) Shiny(TRUE);
|
|
}
|
|
PLAYER(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND);
|
|
HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998);
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) {
|
|
Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY);
|
|
if (GetMoveEffect(move) != EFFECT_BESTOW)
|
|
Item(ITEM_ORAN_BERRY);
|
|
}
|
|
OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); }
|
|
} WHEN {
|
|
WhenSingles(move, player, opponent, variation);
|
|
} SCENE {
|
|
if (!(GetMoveEffect(move) == EFFECT_RECYCLE
|
|
|| GetMoveEffect(move) == EFFECT_BELCH
|
|
|| GetMoveEffect(move) == EFFECT_SPIT_UP
|
|
|| GetMoveEffect(move) == EFFECT_SWALLOW
|
|
|| GetMoveEffect(move) == EFFECT_TOPSY_TURVY)) // require a move that boosts stats before using this move
|
|
{
|
|
NONE_OF {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
|
}
|
|
}
|
|
SceneSingles(move, player);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
// Z-Moves
|
|
#define Z_MOVE_PARAMETERS PARAMETRIZE { zmove = MOVE_BREAKNECK_BLITZ; species = SPECIES_WOBBUFFET; move = MOVE_TACKLE; item = ITEM_NORMALIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_INFERNO_OVERDRIVE; species = SPECIES_WOBBUFFET; move = MOVE_EMBER; item = ITEM_FIRIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_HYDRO_VORTEX; species = SPECIES_WOBBUFFET; move = MOVE_BUBBLE; item = ITEM_WATERIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_GIGAVOLT_HAVOC; species = SPECIES_WOBBUFFET; move = MOVE_THUNDERBOLT; item = ITEM_ELECTRIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_BLOOM_DOOM; species = SPECIES_WOBBUFFET; move = MOVE_RAZOR_LEAF; item = ITEM_GRASSIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_SUBZERO_SLAMMER; species = SPECIES_WOBBUFFET; move = MOVE_ICE_BEAM; item = ITEM_ICIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_ALL_OUT_PUMMELING; species = SPECIES_WOBBUFFET; move = MOVE_KARATE_CHOP; item = ITEM_FIGHTINIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_ACID_DOWNPOUR; species = SPECIES_WOBBUFFET; move = MOVE_SLUDGE_BOMB; item = ITEM_POISONIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_TECTONIC_RAGE; species = SPECIES_WOBBUFFET; move = MOVE_MUD_SLAP; item = ITEM_GROUNDIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_SUPERSONIC_SKYSTRIKE; species = SPECIES_WOBBUFFET; move = MOVE_AERIAL_ACE; item = ITEM_FLYINIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_SHATTERED_PSYCHE; species = SPECIES_WOBBUFFET; move = MOVE_CONFUSION; item = ITEM_PSYCHIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_SAVAGE_SPIN_OUT; species = SPECIES_WOBBUFFET; move = MOVE_BUG_BUZZ; item = ITEM_BUGINIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_CONTINENTAL_CRUSH; species = SPECIES_WOBBUFFET; move = MOVE_ROCK_SLIDE; item = ITEM_ROCKIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_NEVER_ENDING_NIGHTMARE; species = SPECIES_WOBBUFFET; move = MOVE_SHADOW_BALL; item = ITEM_GHOSTIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_DEVASTATING_DRAKE; species = SPECIES_WOBBUFFET; move = MOVE_DRAGON_PULSE; item = ITEM_DRAGONIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_BLACK_HOLE_ECLIPSE; species = SPECIES_WOBBUFFET; move = MOVE_BITE; item = ITEM_DARKINIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_CORKSCREW_CRASH; species = SPECIES_WOBBUFFET; move = MOVE_METAL_CLAW; item = ITEM_STEELIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_TWINKLE_TACKLE; species = SPECIES_WOBBUFFET; move = MOVE_MOONBLAST; item = ITEM_FAIRIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_CATASTROPIKA; species = SPECIES_PIKACHU; move = MOVE_VOLT_TACKLE; item = ITEM_PIKANIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_EXTREME_EVOBOOST; species = SPECIES_EEVEE; move = MOVE_LAST_RESORT; item = ITEM_EEVIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_PULVERIZING_PANCAKE; species = SPECIES_SNORLAX; move = MOVE_GIGA_IMPACT; item = ITEM_SNORLIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_GENESIS_SUPERNOVA; species = SPECIES_MEW; move = MOVE_PSYCHIC; item = ITEM_MEWNIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_SINISTER_ARROW_RAID; species = SPECIES_DECIDUEYE; move = MOVE_SPIRIT_SHACKLE; item = ITEM_DECIDIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_MALICIOUS_MOONSAULT; species = SPECIES_INCINEROAR; move = MOVE_DARKEST_LARIAT; item = ITEM_INCINIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_OCEANIC_OPERETTA; species = SPECIES_PRIMARINA; move = MOVE_SPARKLING_ARIA; item = ITEM_PRIMARIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_SPLINTERED_STORMSHARDS; species = SPECIES_LYCANROC_MIDNIGHT; move = MOVE_STONE_EDGE; item = ITEM_LYCANIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_SPLINTERED_STORMSHARDS; species = SPECIES_LYCANROC_MIDDAY; move = MOVE_STONE_EDGE; item = ITEM_LYCANIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_SPLINTERED_STORMSHARDS; species = SPECIES_LYCANROC_DUSK; move = MOVE_STONE_EDGE; item = ITEM_LYCANIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_LETS_SNUGGLE_FOREVER; species = SPECIES_MIMIKYU; move = MOVE_PLAY_ROUGH; item = ITEM_MIMIKIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_CLANGOROUS_SOULBLAZE; species = SPECIES_KOMMO_O; move = MOVE_CLANGING_SCALES; item = ITEM_KOMMONIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_GUARDIAN_OF_ALOLA; species = SPECIES_TAPU_KOKO; move = MOVE_NATURES_MADNESS; item = ITEM_TAPUNIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_SEARING_SUNRAZE_SMASH; species = SPECIES_SOLGALEO; move = MOVE_SUNSTEEL_STRIKE; item = ITEM_SOLGANIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_MENACING_MOONRAZE_MAELSTROM; species = SPECIES_LUNALA; move = MOVE_MOONGEIST_BEAM; item = ITEM_LUNALIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_SOUL_STEALING_7_STAR_STRIKE; species = SPECIES_MARSHADOW; move = MOVE_SPECTRAL_THIEF; item = ITEM_MARSHADIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_STOKED_SPARKSURFER; species = SPECIES_RAICHU_ALOLA; move = MOVE_THUNDERBOLT; item = ITEM_ALORAICHIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_10_000_000_VOLT_THUNDERBOLT; species = SPECIES_PIKACHU_ALOLA; move = MOVE_THUNDERBOLT; item = ITEM_PIKASHUNIUM_Z; } \
|
|
PARAMETRIZE { zmove = MOVE_LIGHT_THAT_BURNS_THE_SKY; species = SPECIES_NECROZMA_DAWN_WINGS; move = MOVE_PHOTON_GEYSER; item = ITEM_ULTRANECROZIUM_Z; }
|
|
|
|
SINGLE_BATTLE_TEST("Z-Moves don't leak when used - Singles (player to opponent)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, item, zmove;
|
|
Z_MOVE_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(species) { Item(item); }
|
|
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
} WHEN {
|
|
if (species == SPECIES_NECROZMA_DAWN_WINGS)
|
|
{
|
|
TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); }
|
|
TURN { MOVE(player, move, gimmick: GIMMICK_Z_MOVE); }
|
|
}
|
|
else
|
|
{
|
|
TURN { MOVE(player, move, gimmick: GIMMICK_Z_MOVE); }
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, player);
|
|
ANIMATION(ANIM_TYPE_MOVE, zmove, player);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("Z-Moves don't leak when used - Singles (opponent to player)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, item, zmove;
|
|
Z_MOVE_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(species) { Item(item); }
|
|
} WHEN {
|
|
if (species == SPECIES_NECROZMA_DAWN_WINGS)
|
|
{
|
|
TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); }
|
|
TURN { MOVE(opponent, move, gimmick: GIMMICK_Z_MOVE); }
|
|
}
|
|
else
|
|
{
|
|
TURN { MOVE(opponent, move, gimmick: GIMMICK_Z_MOVE); }
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, opponent);
|
|
ANIMATION(ANIM_TYPE_MOVE, zmove, opponent);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerLeft to opponentLeft)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, item, zmove;
|
|
Z_MOVE_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(species) { Item(item); }
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
} WHEN {
|
|
if (species == SPECIES_NECROZMA_DAWN_WINGS)
|
|
{
|
|
TURN { MOVE(playerLeft, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); }
|
|
TURN { MOVE(playerLeft, move, gimmick: GIMMICK_Z_MOVE, target: opponentLeft); }
|
|
}
|
|
else
|
|
{
|
|
TURN { MOVE(playerLeft, move, gimmick: GIMMICK_Z_MOVE, target: opponentLeft); }
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, playerLeft);
|
|
ANIMATION(ANIM_TYPE_MOVE, zmove, playerLeft);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerLeft to opponentRight)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, item, zmove;
|
|
Z_MOVE_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(species) { Item(item); }
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
} WHEN {
|
|
if (species == SPECIES_NECROZMA_DAWN_WINGS)
|
|
{
|
|
TURN { MOVE(playerLeft, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); }
|
|
TURN { MOVE(playerLeft, move, gimmick: GIMMICK_Z_MOVE, target: opponentRight); }
|
|
}
|
|
else
|
|
{
|
|
TURN { MOVE(playerLeft, move, gimmick: GIMMICK_Z_MOVE, target: opponentRight); }
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, playerLeft);
|
|
ANIMATION(ANIM_TYPE_MOVE, zmove, playerLeft);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerRight to opponentLeft)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, item, zmove;
|
|
Z_MOVE_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(SPECIES_WYNAUT);
|
|
PLAYER(species) { Item(item); }
|
|
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
} WHEN {
|
|
if (species == SPECIES_NECROZMA_DAWN_WINGS)
|
|
{
|
|
TURN { MOVE(playerRight, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); }
|
|
TURN { MOVE(playerRight, move, gimmick: GIMMICK_Z_MOVE, target: opponentLeft); }
|
|
}
|
|
else
|
|
{
|
|
TURN { MOVE(playerRight, move, gimmick: GIMMICK_Z_MOVE, target: opponentLeft); }
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, playerRight);
|
|
ANIMATION(ANIM_TYPE_MOVE, zmove, playerRight);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerRight to opponentRight)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, item, zmove;
|
|
Z_MOVE_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(SPECIES_WYNAUT);
|
|
PLAYER(species) { Item(item); }
|
|
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
} WHEN {
|
|
if (species == SPECIES_NECROZMA_DAWN_WINGS)
|
|
{
|
|
TURN { MOVE(playerRight, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); }
|
|
TURN { MOVE(playerRight, move, gimmick: GIMMICK_Z_MOVE, target: opponentRight); }
|
|
}
|
|
else
|
|
{
|
|
TURN { MOVE(playerRight, move, gimmick: GIMMICK_Z_MOVE, target: opponentRight); }
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, playerRight);
|
|
ANIMATION(ANIM_TYPE_MOVE, zmove, playerRight);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentLeft to playerLeft)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, item, zmove;
|
|
Z_MOVE_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(species) { Item(item); }
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
} WHEN {
|
|
if (species == SPECIES_NECROZMA_DAWN_WINGS)
|
|
{
|
|
TURN { MOVE(opponentLeft, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); }
|
|
TURN { MOVE(opponentLeft, move, gimmick: GIMMICK_Z_MOVE, target: playerLeft); }
|
|
}
|
|
else
|
|
{
|
|
TURN { MOVE(opponentLeft, move, gimmick: GIMMICK_Z_MOVE, target: playerLeft); }
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, opponentLeft);
|
|
ANIMATION(ANIM_TYPE_MOVE, zmove, opponentLeft);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentLeft to playerRight)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, item, zmove;
|
|
Z_MOVE_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(species) { Item(item); }
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
} WHEN {
|
|
if (species == SPECIES_NECROZMA_DAWN_WINGS)
|
|
{
|
|
TURN { MOVE(opponentLeft, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); }
|
|
TURN { MOVE(opponentLeft, move, gimmick: GIMMICK_Z_MOVE, target: playerRight); }
|
|
}
|
|
else
|
|
{
|
|
TURN { MOVE(opponentLeft, move, gimmick: GIMMICK_Z_MOVE, target: playerRight); }
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, opponentLeft);
|
|
ANIMATION(ANIM_TYPE_MOVE, zmove, opponentLeft);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentRight to playerLeft)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, item, zmove;
|
|
Z_MOVE_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
OPPONENT(species) { Item(item); }
|
|
} WHEN {
|
|
if (species == SPECIES_NECROZMA_DAWN_WINGS)
|
|
{
|
|
TURN { MOVE(opponentRight, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); }
|
|
TURN { MOVE(opponentRight, move, gimmick: GIMMICK_Z_MOVE, target: playerLeft); }
|
|
}
|
|
else
|
|
{
|
|
TURN { MOVE(opponentRight, move, gimmick: GIMMICK_Z_MOVE, target: playerLeft); }
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, opponentRight);
|
|
ANIMATION(ANIM_TYPE_MOVE, zmove, opponentRight);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentRight to playerRight)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, item, zmove;
|
|
Z_MOVE_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
OPPONENT(species) { Item(item); }
|
|
} WHEN {
|
|
if (species == SPECIES_NECROZMA_DAWN_WINGS)
|
|
{
|
|
TURN { MOVE(opponentRight, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); }
|
|
TURN { MOVE(opponentRight, move, gimmick: GIMMICK_Z_MOVE, target: playerRight); }
|
|
}
|
|
else
|
|
{
|
|
TURN { MOVE(opponentRight, move, gimmick: GIMMICK_Z_MOVE, target: playerRight); }
|
|
}
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, opponentRight);
|
|
ANIMATION(ANIM_TYPE_MOVE, zmove, opponentRight);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
// Max Moves
|
|
|
|
// Tera Blast and all type variants
|
|
#define TERA_BLAST_PARAMETERS PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_NORMAL; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FIGHTING; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FLYING; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_POISON; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_GROUND; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_ROCK; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_BUG; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_GHOST; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_STEEL; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_WATER; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FIRE; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_GRASS; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_ELECTRIC; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_PSYCHIC; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_ICE; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_DRAGON; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_DARK; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_FAIRY; } \
|
|
PARAMETRIZE { species = SPECIES_WOBBUFFET; move = MOVE_TERA_BLAST; type = TYPE_STELLAR; }
|
|
|
|
SINGLE_BATTLE_TEST("Tera Blast doesn't leak when used - Singles (player to opponent)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, type;
|
|
TERA_BLAST_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(species) { TeraType(type); }
|
|
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
} WHEN {
|
|
TURN { MOVE(player, move, gimmick: GIMMICK_TERA); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, player);
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, player);
|
|
ANIMATION(ANIM_TYPE_MOVE, move, player);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("Tera Blast doesn't leak when used - Singles (opponent to player)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, type;
|
|
TERA_BLAST_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(species) { TeraType(type); }
|
|
} WHEN {
|
|
TURN { MOVE(opponent, move, gimmick: GIMMICK_TERA); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponent);
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponent);
|
|
ANIMATION(ANIM_TYPE_MOVE, move, opponent);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerLeft to opponentLeft)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, type;
|
|
TERA_BLAST_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(species) { TeraType(type); }
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
} WHEN {
|
|
TURN { MOVE(playerLeft, move, gimmick: GIMMICK_TERA, target: opponentLeft); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerLeft);
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerLeft);
|
|
ANIMATION(ANIM_TYPE_MOVE, move, playerLeft);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerLeft to opponentRight)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, type;
|
|
TERA_BLAST_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(species) { TeraType(type); }
|
|
PLAYER(SPECIES_WYNAUT);
|
|
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
} WHEN {
|
|
TURN { MOVE(playerLeft, move, gimmick: GIMMICK_TERA, target: opponentRight); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerLeft);
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerLeft);
|
|
ANIMATION(ANIM_TYPE_MOVE, move, playerLeft);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerRight to opponentLeft)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, type;
|
|
TERA_BLAST_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(SPECIES_WYNAUT);
|
|
PLAYER(species) { TeraType(type); }
|
|
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
} WHEN {
|
|
TURN { MOVE(playerRight, move, gimmick: GIMMICK_TERA, target: opponentLeft); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerRight);
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerRight);
|
|
ANIMATION(ANIM_TYPE_MOVE, move, playerRight);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerRight to opponentRight)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, type;
|
|
TERA_BLAST_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(SPECIES_WYNAUT);
|
|
PLAYER(species) { TeraType(type); }
|
|
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
} WHEN {
|
|
TURN { MOVE(playerRight, move, gimmick: GIMMICK_TERA, target: opponentRight); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, playerRight);
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, playerRight);
|
|
ANIMATION(ANIM_TYPE_MOVE, move, playerRight);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentLeft to playerLeft)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, type;
|
|
TERA_BLAST_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(species) { Item(ITEM_FOCUS_SASH); }
|
|
PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WOBBUFFET) { TeraType(type); }
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
} WHEN {
|
|
TURN { MOVE(opponentLeft, move, gimmick: GIMMICK_TERA, target: playerLeft); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentLeft);
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentLeft);
|
|
ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentLeft to playerRight)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, type;
|
|
TERA_BLAST_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(species) { Item(ITEM_FOCUS_SASH); }
|
|
PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WOBBUFFET) { TeraType(type); }
|
|
OPPONENT(SPECIES_WYNAUT);
|
|
} WHEN {
|
|
TURN { MOVE(opponentLeft, move, gimmick: GIMMICK_TERA, target: playerRight); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentLeft);
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentLeft);
|
|
ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentRight to playerLeft)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, type;
|
|
TERA_BLAST_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(species) { Item(ITEM_FOCUS_SASH); }
|
|
PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WYNAUT) { TeraType(type); }
|
|
} WHEN {
|
|
TURN { MOVE(opponentRight, move, gimmick: GIMMICK_TERA, target: playerLeft); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentRight);
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentRight);
|
|
ANIMATION(ANIM_TYPE_MOVE, move, opponentRight);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentRight to playerRight)")
|
|
{
|
|
FORCE_MOVE_ANIM(TRUE);
|
|
u32 species, move, type;
|
|
TERA_BLAST_PARAMETERS;
|
|
GIVEN {
|
|
PLAYER(species) { Item(ITEM_FOCUS_SASH); }
|
|
PLAYER(SPECIES_WYNAUT) { Item(ITEM_FOCUS_SASH); }
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WYNAUT) { TeraType(type); }
|
|
} WHEN {
|
|
TURN { MOVE(opponentRight, move, gimmick: GIMMICK_TERA, target: playerRight); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, opponentRight);
|
|
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, opponentRight);
|
|
ANIMATION(ANIM_TYPE_MOVE, move, opponentRight);
|
|
} THEN {
|
|
FORCE_MOVE_ANIM(FALSE);
|
|
if (gLoadFail || gSpriteAllocs != 0)
|
|
DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move);
|
|
EXPECT_EQ(gLoadFail, FALSE);
|
|
EXPECT_EQ(gSpriteAllocs, 0);
|
|
}
|
|
}
|
|
|
|
#endif
|