mirror of
https://github.com/rh-hideout/pokeemerald-expansion
synced 2025-10-05 23:42:46 +02:00
Fix some failed and assume fail tests with GEN_LATEST
= GEN_5
(#7735)
This commit is contained in:
@@ -41,6 +41,10 @@ enum GenConfigTag
|
||||
GEN_CONFIG_PRANKSTER_DARK_TYPES,
|
||||
GEN_CONFIG_DESTINY_BOND_FAIL,
|
||||
GEN_CONFIG_POWDER_RAIN,
|
||||
GEN_CONFIG_POWDER_GRASS,
|
||||
GEN_CONFIG_OBLIVIOUS_TAUNT,
|
||||
GEN_CONFIG_TOXIC_NEVER_MISS,
|
||||
GEN_CONFIG_PARALYZE_ELECTRIC,
|
||||
GEN_CONFIG_COUNT
|
||||
};
|
||||
|
||||
|
@@ -44,6 +44,10 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] =
|
||||
[GEN_CONFIG_PRANKSTER_DARK_TYPES] = B_PRANKSTER_DARK_TYPES,
|
||||
[GEN_CONFIG_DESTINY_BOND_FAIL] = B_DESTINY_BOND_FAIL,
|
||||
[GEN_CONFIG_POWDER_RAIN] = B_POWDER_RAIN,
|
||||
[GEN_CONFIG_POWDER_GRASS] = B_POWDER_GRASS,
|
||||
[GEN_CONFIG_OBLIVIOUS_TAUNT] = B_OBLIVIOUS_TAUNT,
|
||||
[GEN_CONFIG_TOXIC_NEVER_MISS] = B_TOXIC_NEVER_MISS,
|
||||
[GEN_CONFIG_PARALYZE_ELECTRIC] = B_PARALYZE_ELECTRIC,
|
||||
};
|
||||
|
||||
#if TESTING
|
||||
|
@@ -534,7 +534,7 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler)
|
||||
bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect)
|
||||
{
|
||||
if (ability == ABILITY_OVERCOAT
|
||||
|| (B_POWDER_GRASS >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS))
|
||||
|| (GetGenConfig(GEN_CONFIG_POWDER_GRASS) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS))
|
||||
|| holdEffect == HOLD_EFFECT_SAFETY_GOGGLES)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
|
@@ -862,7 +862,7 @@ static bool8 DoesTypePreventStatus(u16 species, u32 status)
|
||||
break;
|
||||
case STATUS1_PARALYSIS:
|
||||
if (GetSpeciesType(species, 0) == TYPE_GROUND || GetSpeciesType(species, 1) == TYPE_GROUND
|
||||
|| (B_PARALYZE_ELECTRIC >= GEN_6 && (GetSpeciesType(species, 0) == TYPE_ELECTRIC || GetSpeciesType(species, 1) == TYPE_ELECTRIC)))
|
||||
|| (GetGenConfig(GEN_CONFIG_PARALYZE_ELECTRIC) >= GEN_6 && (GetSpeciesType(species, 0) == TYPE_ELECTRIC || GetSpeciesType(species, 1) == TYPE_ELECTRIC)))
|
||||
ret = TRUE;
|
||||
break;
|
||||
case STATUS1_BURN:
|
||||
|
@@ -1046,7 +1046,7 @@ bool32 IsMovePowderBlocked(u32 battlerAtk, u32 battlerDef, u32 move)
|
||||
|
||||
if (IsPowderMove(move) && (battlerAtk != battlerDef))
|
||||
{
|
||||
if (B_POWDER_GRASS >= GEN_6
|
||||
if (GetGenConfig(GEN_CONFIG_POWDER_GRASS) >= GEN_6
|
||||
&& (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) || GetBattlerAbility(battlerDef) == ABILITY_OVERCOAT))
|
||||
{
|
||||
gBattlerAbility = battlerDef;
|
||||
@@ -12765,7 +12765,7 @@ static void Cmd_settaunt(void)
|
||||
{
|
||||
CMD_ARGS(const u8 *failInstr);
|
||||
|
||||
if (B_OBLIVIOUS_TAUNT >= GEN_6 && GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS)
|
||||
if (GetGenConfig(GEN_CONFIG_OBLIVIOUS_TAUNT) >= GEN_6 && GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS)
|
||||
{
|
||||
gBattlescriptCurrInstr = BattleScript_NotAffectedAbilityPopUp;
|
||||
gLastUsedAbility = ABILITY_OBLIVIOUS;
|
||||
|
@@ -4689,7 +4689,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
case ABILITY_EFFECT_SPORE:
|
||||
{
|
||||
u32 abilityAtk = GetBattlerAbility(gBattlerAttacker);
|
||||
if ((!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) || B_POWDER_GRASS < GEN_6)
|
||||
if ((GetGenConfig(GEN_CONFIG_POWDER_GRASS) < GEN_6 || !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS))
|
||||
&& abilityAtk != ABILITY_OVERCOAT
|
||||
&& GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES)
|
||||
{
|
||||
@@ -5616,7 +5616,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u
|
||||
{
|
||||
battleScript = BattleScript_AlreadyParalyzed;
|
||||
}
|
||||
else if (B_PARALYZE_ELECTRIC >= GEN_6 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ELECTRIC))
|
||||
else if (GetGenConfig(GEN_CONFIG_PARALYZE_ELECTRIC) >= GEN_6 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ELECTRIC))
|
||||
{
|
||||
battleScript = BattleScript_NotAffected;
|
||||
}
|
||||
@@ -10378,7 +10378,7 @@ u32 TryImmunityAbilityHealStatus(u32 battler, u32 caseID)
|
||||
case ABILITY_OBLIVIOUS:
|
||||
if (gBattleMons[battler].volatiles.infatuation)
|
||||
effect = 3;
|
||||
else if (gDisableStructs[battler].tauntTimer != 0)
|
||||
else if (GetGenConfig(GEN_CONFIG_OBLIVIOUS_TAUNT) >= GEN_6 && gDisableStructs[battler].tauntTimer != 0)
|
||||
effect = 4;
|
||||
break;
|
||||
}
|
||||
@@ -11663,7 +11663,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u
|
||||
u32 nonVolatileStatus = GetMoveNonVolatileStatus(move);
|
||||
|
||||
if ((gBattleMons[battlerDef].volatiles.lockOn && gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk)
|
||||
|| (B_TOXIC_NEVER_MISS >= GEN_6 && nonVolatileStatus == MOVE_EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON))
|
||||
|| (GetGenConfig(GEN_CONFIG_TOXIC_NEVER_MISS) >= GEN_6 && nonVolatileStatus == MOVE_EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON))
|
||||
|| gBattleMons[battlerDef].volatiles.glaiveRush)
|
||||
{
|
||||
effect = TRUE;
|
||||
|
@@ -31,22 +31,35 @@ SINGLE_BATTLE_TEST("Oblivious prevents Captivate")
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Oblivious prevents Taunt")
|
||||
SINGLE_BATTLE_TEST("Oblivious prevents Taunt (Gen6+)")
|
||||
{
|
||||
u32 gen = 0;
|
||||
PARAMETRIZE { gen = GEN_5; }
|
||||
PARAMETRIZE { gen = GEN_6; }
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_OBLIVIOUS_TAUNT, gen);
|
||||
ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT);
|
||||
ASSUME(B_OBLIVIOUS_TAUNT >= GEN_6);
|
||||
PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_TAUNT); }
|
||||
TURN { MOVE(player, MOVE_SPORE); }
|
||||
TURN { MOVE(player, MOVE_SPORE, allowed: gen == GEN_6); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(player, ABILITY_OBLIVIOUS);
|
||||
NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_TAUNT, opponent); }
|
||||
MESSAGE("It doesn't affect Slowpoke…");
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player);
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent);
|
||||
if (gen == GEN_6) {
|
||||
NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_TAUNT, opponent); }
|
||||
ABILITY_POPUP(player, ABILITY_OBLIVIOUS);
|
||||
MESSAGE("It doesn't affect Slowpoke…");
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player);
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent);
|
||||
} else {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_TAUNT, opponent);
|
||||
NONE_OF {
|
||||
ABILITY_POPUP(player, ABILITY_OBLIVIOUS);
|
||||
MESSAGE("It doesn't affect Slowpoke…");
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player);
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, opponent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,25 +1,37 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
SINGLE_BATTLE_TEST("Overcoat blocks powder and spore moves")
|
||||
SINGLE_BATTLE_TEST("Overcoat blocks powder and spore moves (Gen6+)")
|
||||
{
|
||||
u32 gen = 0;
|
||||
PARAMETRIZE { gen = GEN_5; }
|
||||
PARAMETRIZE { gen = GEN_6; }
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, gen);
|
||||
ASSUME(IsPowderMove(MOVE_STUN_SPORE));
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_PINECO) { Ability(ABILITY_OVERCOAT); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_STUN_SPORE); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(opponent, ABILITY_OVERCOAT);
|
||||
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player);
|
||||
MESSAGE("It doesn't affect the opposing Pineco…");
|
||||
if (gen == GEN_6) {
|
||||
ABILITY_POPUP(opponent, ABILITY_OVERCOAT);
|
||||
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player);
|
||||
MESSAGE("It doesn't affect the opposing Pineco…");
|
||||
} else {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player);
|
||||
NONE_OF {
|
||||
ABILITY_POPUP(opponent, ABILITY_OVERCOAT);
|
||||
MESSAGE("It doesn't affect the opposing Pineco…");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Overcoat blocks damage from sandstorm")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WYNAUT) { Speed(50); }
|
||||
PLAYER(SPECIES_WYNAUT) { Speed(50); }
|
||||
PLAYER(SPECIES_HELIOLISK) { Speed(40); Ability(ABILITY_SAND_VEIL); }
|
||||
OPPONENT(SPECIES_PINECO) { Speed(30); Ability(ABILITY_OVERCOAT); }
|
||||
OPPONENT(SPECIES_STARLY) { Speed(20); }
|
||||
@@ -41,7 +53,7 @@ DOUBLE_BATTLE_TEST("Overcoat blocks damage from hail")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL);
|
||||
PLAYER(SPECIES_WYNAUT) { Speed(50); Ability(ABILITY_SNOW_CLOAK); }
|
||||
PLAYER(SPECIES_WYNAUT) { Speed(50); Ability(ABILITY_SNOW_CLOAK); }
|
||||
PLAYER(SPECIES_SOLOSIS) { Speed(40); Ability(ABILITY_RUN_AWAY); }
|
||||
OPPONENT(SPECIES_PINECO) { Speed(30); Ability(ABILITY_OVERCOAT); }
|
||||
OPPONENT(SPECIES_SNORUNT) { Speed(20); }
|
||||
@@ -73,4 +85,3 @@ SINGLE_BATTLE_TEST("Overcoat blocks Effect Spore's effect")
|
||||
EXPECT_EQ(player->status1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -291,10 +291,10 @@ SINGLE_BATTLE_TEST("Parental Bond Snore strikes twice while asleep")
|
||||
HP_BAR(opponent, captureDamage: &damage[1]);
|
||||
MESSAGE("The Pokémon was hit 2 time(s)!");
|
||||
} THEN {
|
||||
if (B_PARENTAL_BOND_DMG == GEN_6)
|
||||
EXPECT_MUL_EQ(damage[0], Q_4_12(0.5), damage[1]);
|
||||
else
|
||||
if (B_PARENTAL_BOND_DMG >= GEN_7)
|
||||
EXPECT_MUL_EQ(damage[0], Q_4_12(0.25), damage[1]);
|
||||
else
|
||||
EXPECT_MUL_EQ(damage[0], Q_4_12(0.5), damage[1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -59,6 +59,7 @@ SINGLE_BATTLE_TEST("Protosynthesis ability pop up activates only once during the
|
||||
u16 turns;
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_ABILITY_WEATHER, GEN_6);
|
||||
PLAYER(SPECIES_WALKING_WAKE) { Ability(ABILITY_PROTOSYNTHESIS); }
|
||||
OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); };
|
||||
} WHEN {
|
||||
|
@@ -56,11 +56,21 @@ SINGLE_BATTLE_TEST("Supersweet Syrup can not further lower opponents evasion if
|
||||
TURN { MOVE(opponent, MOVE_SWEET_SCENT); }
|
||||
TURN { MOVE(opponent, MOVE_SWEET_SCENT); }
|
||||
TURN { MOVE(opponent, MOVE_SWEET_SCENT); }
|
||||
if (GetMoveEffect(MOVE_SWEET_SCENT) == EFFECT_EVASION_DOWN) {
|
||||
TURN { MOVE(opponent, MOVE_SWEET_SCENT); }
|
||||
TURN { MOVE(opponent, MOVE_SWEET_SCENT); }
|
||||
TURN { MOVE(opponent, MOVE_SWEET_SCENT); }
|
||||
}
|
||||
TURN { SWITCH(opponent, 1); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent);
|
||||
if (GetMoveEffect(MOVE_SWEET_SCENT) == EFFECT_EVASION_DOWN) {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SWEET_SCENT, opponent);
|
||||
}
|
||||
ABILITY_POPUP(opponent, ABILITY_SUPERSWEET_SYRUP);
|
||||
NONE_OF {
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
|
@@ -59,7 +59,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: Considers ShouldSwitch and GetMos
|
||||
// Switching in trapper is an advanced feature of ShouldSwitch that requires GetMostSuitableMonToSwitchInto to also return a specific mon; this passing means the AI can use both in prediction
|
||||
PASSES_RANDOMLY(5, 10, RNG_AI_PREDICT_SWITCH);
|
||||
GIVEN {
|
||||
ASSUME(B_POWDER_GRASS >= GEN_6);
|
||||
WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_6);
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON);
|
||||
PLAYER(SPECIES_SKARMORY) { Moves(MOVE_SCRATCH); }
|
||||
PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_ACROBATICS); }
|
||||
|
@@ -101,6 +101,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Marshadow vs Mawile)")
|
||||
PARAMETRIZE { expectedDamage = 123; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveCategory(MOVE_SPECTRAL_THIEF) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(B_UPDATED_TYPE_MATCHUPS >= GEN_6); // Steel resists Ghost in Gen2-5
|
||||
PLAYER(SPECIES_MARSHADOW) { Level(100); Attack(286); }
|
||||
OPPONENT(SPECIES_MAWILE) { Level(100); Defense(226); HP(241); }
|
||||
} WHEN {
|
||||
@@ -196,6 +197,7 @@ SINGLE_BATTLE_TEST("Gem boosted Damage calculation")
|
||||
{
|
||||
s16 dmg;
|
||||
s16 expectedDamage;
|
||||
#if I_GEM_BOOST_POWER >= GEN_6
|
||||
PARAMETRIZE { expectedDamage = 240; }
|
||||
PARAMETRIZE { expectedDamage = 237; }
|
||||
PARAMETRIZE { expectedDamage = 234; }
|
||||
@@ -212,6 +214,25 @@ SINGLE_BATTLE_TEST("Gem boosted Damage calculation")
|
||||
PARAMETRIZE { expectedDamage = 208; }
|
||||
PARAMETRIZE { expectedDamage = 205; }
|
||||
PARAMETRIZE { expectedDamage = 204; }
|
||||
#else
|
||||
KNOWN_FAILING;
|
||||
PARAMETRIZE { expectedDamage = 273; }
|
||||
PARAMETRIZE { expectedDamage = 270; }
|
||||
PARAMETRIZE { expectedDamage = 267; }
|
||||
PARAMETRIZE { expectedDamage = 264; }
|
||||
PARAMETRIZE { expectedDamage = 261; }
|
||||
PARAMETRIZE { expectedDamage = 258; }
|
||||
PARAMETRIZE { expectedDamage = 256; }
|
||||
PARAMETRIZE { expectedDamage = 253; }
|
||||
PARAMETRIZE { expectedDamage = 250; }
|
||||
PARAMETRIZE { expectedDamage = 247; }
|
||||
PARAMETRIZE { expectedDamage = 244; }
|
||||
PARAMETRIZE { expectedDamage = 241; }
|
||||
PARAMETRIZE { expectedDamage = 240; }
|
||||
PARAMETRIZE { expectedDamage = 237; }
|
||||
PARAMETRIZE { expectedDamage = 234; }
|
||||
PARAMETRIZE { expectedDamage = 231; }
|
||||
#endif
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_MAKUHITA) { Item(ITEM_FIGHTING_GEM); }
|
||||
OPPONENT(SPECIES_MAKUHITA);
|
||||
|
@@ -1464,7 +1464,7 @@ DOUBLE_BATTLE_TEST("Dynamax: G-Max Chi Strike boosts allies' crit chance by 1 st
|
||||
{
|
||||
u32 j;
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_6);
|
||||
WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, GEN_6);
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CHI_STRIKE, MOVE_EFFECT_CRIT_PLUS_SIDE));
|
||||
PLAYER(SPECIES_MACHAMP) { GigantamaxFactor(TRUE); }
|
||||
PLAYER(SPECIES_MACHOP);
|
||||
|
@@ -606,14 +606,14 @@ SINGLE_BATTLE_TEST("(TERA) Terastallizing into the Stellar type boosts all moves
|
||||
s16 damage[4];
|
||||
GIVEN {
|
||||
ASSUME(GetMovePower(MOVE_MEGA_DRAIN) == 40);
|
||||
ASSUME(GetMovePower(MOVE_BUBBLE) == 40);
|
||||
ASSUME(GetMovePower(MOVE_WATER_GUN) == 40);
|
||||
PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_MEGA_DRAIN); }
|
||||
TURN { MOVE(player, MOVE_MEGA_DRAIN, gimmick: GIMMICK_TERA); }
|
||||
TURN { MOVE(player, MOVE_MEGA_DRAIN); }
|
||||
TURN { MOVE(player, MOVE_BUBBLE); }
|
||||
TURN { MOVE(player, MOVE_WATER_GUN); }
|
||||
} SCENE {
|
||||
// turn 1
|
||||
MESSAGE("Wobbuffet used Mega Drain!");
|
||||
@@ -628,8 +628,8 @@ SINGLE_BATTLE_TEST("(TERA) Terastallizing into the Stellar type boosts all moves
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_MEGA_DRAIN, player);
|
||||
HP_BAR(opponent, captureDamage: &damage[2]);
|
||||
// turn 4
|
||||
MESSAGE("Wobbuffet used Bubble!");
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_BUBBLE, player);
|
||||
MESSAGE("Wobbuffet used Water Gun!");
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, player);
|
||||
HP_BAR(opponent, captureDamage: &damage[3]);
|
||||
} THEN {
|
||||
// The jump from 40 BP to 72 BP (60 * 1.2x) is a 1.8x boost.
|
||||
|
@@ -38,6 +38,7 @@ SINGLE_BATTLE_TEST("Booster Energy will activate Quark Drive after Electric Terr
|
||||
SINGLE_BATTLE_TEST("Booster Energy will activate Protosynthesis after harsh sunlight ends")
|
||||
{
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_ABILITY_WEATHER, GEN_6);
|
||||
PLAYER(SPECIES_RAGING_BOLT) { Attack(100); Defense(100); Speed(100); SpAttack(110); SpDefense(100); Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); }
|
||||
OPPONENT(SPECIES_TORKOAL) { Speed(100); Ability(ABILITY_DROUGHT); };
|
||||
} WHEN {
|
||||
|
@@ -32,7 +32,6 @@ SINGLE_BATTLE_TEST("Gem boost is only applied once")
|
||||
s16 normalHit;
|
||||
|
||||
GIVEN {
|
||||
ASSUME(I_GEM_BOOST_POWER >= GEN_6);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -46,7 +45,10 @@ SINGLE_BATTLE_TEST("Gem boost is only applied once")
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player);
|
||||
HP_BAR(opponent, captureDamage: &normalHit);
|
||||
} THEN {
|
||||
EXPECT_MUL_EQ(normalHit, Q_4_12(1.3), boostedHit);
|
||||
if (I_GEM_BOOST_POWER >= GEN_6)
|
||||
EXPECT_MUL_EQ(normalHit, Q_4_12(1.3), boostedHit);
|
||||
else
|
||||
EXPECT_MUL_EQ(normalHit, Q_4_12(1.5), boostedHit);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -30,7 +30,6 @@ SINGLE_BATTLE_TEST("Acrobatics still doubles in power when Flying Gem is consume
|
||||
PARAMETRIZE { heldItem = ITEM_NONE; }
|
||||
PARAMETRIZE { heldItem = ITEM_FLYING_GEM; }
|
||||
GIVEN {
|
||||
ASSUME(I_GEM_BOOST_POWER >= GEN_6);
|
||||
ASSUME(gItemsInfo[ITEM_FLYING_GEM].holdEffect == HOLD_EFFECT_GEMS);
|
||||
ASSUME(gItemsInfo[ITEM_FLYING_GEM].secondaryId == TYPE_FLYING);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
|
@@ -4,7 +4,6 @@
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS);
|
||||
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Dragon Darts strikes twice")
|
||||
@@ -72,13 +71,13 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if the other one is F
|
||||
struct BattlePokemon *chosenTarget = NULL;
|
||||
struct BattlePokemon *finalTarget = NULL;
|
||||
u32 speciesLeft, speciesRight;
|
||||
PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; speciesLeft = SPECIES_CLEFAIRY; speciesRight = SPECIES_WOBBUFFET; }
|
||||
PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentRight; speciesLeft = SPECIES_CLEFAIRY; speciesRight = SPECIES_WOBBUFFET; }
|
||||
PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentLeft; speciesLeft = SPECIES_WOBBUFFET; speciesRight = SPECIES_CLEFAIRY; }
|
||||
PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; speciesLeft = SPECIES_WOBBUFFET; speciesRight = SPECIES_CLEFAIRY; }
|
||||
PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; speciesLeft = SPECIES_FIDOUGH; speciesRight = SPECIES_WOBBUFFET; }
|
||||
PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentRight; speciesLeft = SPECIES_FIDOUGH; speciesRight = SPECIES_WOBBUFFET; }
|
||||
PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentLeft; speciesLeft = SPECIES_WOBBUFFET; speciesRight = SPECIES_FIDOUGH; }
|
||||
PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; speciesLeft = SPECIES_WOBBUFFET; speciesRight = SPECIES_FIDOUGH; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
|
||||
ASSUME(GetSpeciesType(SPECIES_FIDOUGH, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_FIDOUGH, 1) == TYPE_FAIRY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(speciesLeft);
|
||||
@@ -257,7 +256,6 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes right ally twice if one strike misses")
|
||||
DOUBLE_BATTLE_TEST("Dragon Darts strikes will be both redirected to Follow Me user")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@@ -273,14 +271,14 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes will be both redirected to Follow Me us
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Dragon Darts fails to strike any target if under a fairy type follow me user")
|
||||
DOUBLE_BATTLE_TEST("Dragon Darts fails to strike any target if under a Fairy-type follow me user")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
|
||||
ASSUME(GetSpeciesType(SPECIES_FIDOUGH, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_FIDOUGH, 1) == TYPE_FAIRY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_CLEFAIRY);
|
||||
OPPONENT(SPECIES_FIDOUGH);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponentRight, MOVE_FOLLOW_ME); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentLeft); }
|
||||
} SCENE {
|
||||
@@ -295,7 +293,6 @@ DOUBLE_BATTLE_TEST("Dragon Darts fails to strike any target if under a fairy typ
|
||||
DOUBLE_BATTLE_TEST("Dragon Darts fails to strike the second target if first target fainted and follow me was active")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
@@ -12,15 +12,14 @@ SINGLE_BATTLE_TEST("Fickle Beam deals double damage 30% of the time")
|
||||
|
||||
PASSES_RANDOMLY(30, 100, RNG_FICKLE_BEAM);
|
||||
GIVEN {
|
||||
ASSUME(GetMovePower(MOVE_POWER_GEM) == 80);
|
||||
ASSUME(GetMovePower(MOVE_FICKLE_BEAM) == 80);
|
||||
ASSUME(GetMovePower(MOVE_DAZZLING_GLEAM) == GetMovePower(MOVE_FICKLE_BEAM));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_POWER_GEM); }
|
||||
TURN { MOVE(player, MOVE_DAZZLING_GLEAM); }
|
||||
TURN { MOVE(player, MOVE_FICKLE_BEAM); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_POWER_GEM, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_DAZZLING_GLEAM, player);
|
||||
HP_BAR(opponent, captureDamage: &damage[0]);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_FICKLE_BEAM, player);
|
||||
HP_BAR(opponent, captureDamage: &damage[1]);
|
||||
|
@@ -1,10 +1,18 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
#if B_UPDATED_MOVE_DATA >= GEN_6
|
||||
#define FUTURE_SIGHT_EQUIVALENT MOVE_SEED_FLARE /* 120 power */
|
||||
#elif B_UPDATED_MOVE_DATA >= GEN_5
|
||||
#define FUTURE_SIGHT_EQUIVALENT MOVE_DYNAMAX_CANNON /* 100 power */
|
||||
#else
|
||||
#define FUTURE_SIGHT_EQUIVALENT MOVE_EXTRASENSORY /* 80 power */
|
||||
#endif
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(GetMovePower(MOVE_SEED_FLARE) == GetMovePower(MOVE_FUTURE_SIGHT));
|
||||
ASSUME(GetMoveCategory(MOVE_SEED_FLARE) == GetMoveCategory(MOVE_FUTURE_SIGHT));
|
||||
ASSUME(GetMovePower(FUTURE_SIGHT_EQUIVALENT) == GetMovePower(MOVE_FUTURE_SIGHT));
|
||||
ASSUME(GetMoveCategory(FUTURE_SIGHT_EQUIVALENT) == GetMoveCategory(MOVE_FUTURE_SIGHT));
|
||||
ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT);
|
||||
ASSUME(GetMovePower(MOVE_FUTURE_SIGHT) > 0);
|
||||
}
|
||||
@@ -23,13 +31,13 @@ SINGLE_BATTLE_TEST("Future Sight uses Sp. Atk stat of the original user without
|
||||
PLAYER(SPECIES_RAICHU) { Item(item); }
|
||||
OPPONENT(SPECIES_REGICE);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SEED_FLARE, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); }
|
||||
TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); }
|
||||
TURN { MOVE(player, MOVE_FUTURE_SIGHT); }
|
||||
TURN { SWITCH(player, 1); }
|
||||
TURN { }
|
||||
TURN { }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SEED_FLARE, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player);
|
||||
HP_BAR(opponent, captureDamage: &seedFlareDmg);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player);
|
||||
MESSAGE("The opposing Regice took the Future Sight attack!");
|
||||
@@ -49,13 +57,13 @@ SINGLE_BATTLE_TEST("Future Sight is not boosted by Life Orb is original user if
|
||||
PLAYER(SPECIES_RAICHU) { Item(ITEM_LIFE_ORB); }
|
||||
OPPONENT(SPECIES_REGICE);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SEED_FLARE, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); }
|
||||
TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); }
|
||||
TURN { MOVE(player, MOVE_FUTURE_SIGHT); }
|
||||
TURN { SWITCH(player, 1); }
|
||||
TURN { }
|
||||
TURN { }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SEED_FLARE, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player);
|
||||
HP_BAR(opponent, captureDamage: &seedFlareDmg);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player);
|
||||
MESSAGE("The opposing Regice took the Future Sight attack!");
|
||||
@@ -77,13 +85,13 @@ SINGLE_BATTLE_TEST("Future Sight receives STAB from party mon (Gen 5+)")
|
||||
PLAYER(SPECIES_RAICHU);
|
||||
OPPONENT(SPECIES_REGICE);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SEED_FLARE, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); }
|
||||
TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); }
|
||||
TURN { MOVE(player, MOVE_FUTURE_SIGHT); }
|
||||
TURN { SWITCH(player, 1); }
|
||||
TURN { }
|
||||
TURN { }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SEED_FLARE, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player);
|
||||
HP_BAR(opponent, captureDamage: &seedFlareDmg);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player);
|
||||
HP_BAR(opponent, captureDamage: &futureSightDmg);
|
||||
@@ -100,13 +108,13 @@ SINGLE_BATTLE_TEST("Future Sight is affected by type effectiveness (Gen 5+)")
|
||||
PLAYER(SPECIES_RAICHU);
|
||||
OPPONENT(SPECIES_HOUNDOOM);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SEED_FLARE, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); }
|
||||
TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); }
|
||||
TURN { MOVE(player, MOVE_FUTURE_SIGHT); }
|
||||
TURN { SWITCH(player, 1); }
|
||||
TURN { }
|
||||
TURN { }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SEED_FLARE, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player);
|
||||
HP_BAR(opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player);
|
||||
MESSAGE("The opposing Houndoom took the Future Sight attack!");
|
||||
|
@@ -280,6 +280,7 @@ DOUBLE_BATTLE_TEST("Instructed move will be redirected by Rage Powder after inst
|
||||
PARAMETRIZE { moveTarget = opponentLeft; }
|
||||
PARAMETRIZE { moveTarget = opponentRight; }
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_6);
|
||||
ASSUME(GetMoveEffect(MOVE_RAGE_POWDER) == EFFECT_FOLLOW_ME);
|
||||
ASSUME(IsPowderMove(MOVE_RAGE_POWDER) == TRUE);
|
||||
ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK);
|
||||
|
@@ -177,14 +177,14 @@ SINGLE_BATTLE_TEST("Scale Shot is immune to Fairy types and will end the move co
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT);
|
||||
ASSUME(GetMoveType(MOVE_SCALE_SHOT) == TYPE_DRAGON);
|
||||
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
|
||||
ASSUME(GetSpeciesType(SPECIES_FIDOUGH, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_FIDOUGH, 1) == TYPE_FAIRY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_CLEFAIRY) { HP(1); }
|
||||
OPPONENT(SPECIES_FIDOUGH) { HP(1); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SCALE_SHOT); }
|
||||
} SCENE {
|
||||
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player);
|
||||
MESSAGE("It doesn't affect the opposing Clefairy…");
|
||||
MESSAGE("It doesn't affect the opposing Fidough…");
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -149,9 +149,10 @@ DOUBLE_BATTLE_TEST("Powder fails if target is already affected by Powder")
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Powder fails if the target is Grass type")
|
||||
SINGLE_BATTLE_TEST("Powder fails if the target is Grass type (Gen6+)")
|
||||
{
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_6);
|
||||
ASSUME(GetSpeciesType(SPECIES_VENUSAUR, 0) == TYPE_GRASS || GetSpeciesType(SPECIES_VENUSAUR, 1) == TYPE_GRASS);
|
||||
PLAYER(SPECIES_VENUSAUR);
|
||||
OPPONENT(SPECIES_VIVILLON);
|
||||
@@ -164,9 +165,10 @@ SINGLE_BATTLE_TEST("Powder fails if the target is Grass type")
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Powder fails if the target has Overcoat")
|
||||
SINGLE_BATTLE_TEST("Powder fails if the target has Overcoat (Gen6+)")
|
||||
{
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_6);
|
||||
PLAYER(SPECIES_FORRETRESS) { Ability(ABILITY_OVERCOAT); }
|
||||
OPPONENT(SPECIES_VIVILLON);
|
||||
} WHEN {
|
||||
|
@@ -43,14 +43,16 @@ SINGLE_BATTLE_TEST("Toxic can't bad poison a poison or steel type")
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Toxic cannot miss if used by a Poison-type")
|
||||
SINGLE_BATTLE_TEST("Toxic cannot miss if used by a Poison-type (Gen6+)")
|
||||
{
|
||||
u32 species;
|
||||
u32 species, gen;
|
||||
bool32 hit;
|
||||
PARAMETRIZE { species = SPECIES_WOBBUFFET; hit = FALSE; }
|
||||
PARAMETRIZE { species = SPECIES_NIDORAN_M; hit = TRUE; }
|
||||
PARAMETRIZE { species = SPECIES_WOBBUFFET; hit = FALSE; gen = GEN_5; }
|
||||
PARAMETRIZE { species = SPECIES_NIDORAN_M; hit = FALSE; gen = GEN_5; }
|
||||
PARAMETRIZE { species = SPECIES_WOBBUFFET; hit = FALSE; gen = GEN_6; }
|
||||
PARAMETRIZE { species = SPECIES_NIDORAN_M; hit = TRUE; gen = GEN_6; }
|
||||
GIVEN {
|
||||
ASSUME(B_TOXIC_NEVER_MISS >= GEN_6);
|
||||
WITH_CONFIG(GEN_CONFIG_TOXIC_NEVER_MISS, gen);
|
||||
ASSUME(GetSpeciesType(SPECIES_NIDORAN_M, 0) == TYPE_POISON);
|
||||
PLAYER(species);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
@@ -38,11 +38,10 @@ SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze poison/electric types respe
|
||||
u8 statusAnim;
|
||||
u16 species;
|
||||
u32 rng;
|
||||
#if B_PARALYZE_ELECTRIC >= GEN_6
|
||||
PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_RAICHU; }
|
||||
#endif // B_PARALYZE_ELECTRIC
|
||||
PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = MOVE_EFFECT_POISON; species = SPECIES_ARBOK; }
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, GEN_6);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(species);
|
||||
} WHEN {
|
||||
|
@@ -21,19 +21,27 @@ SINGLE_BATTLE_TEST("Thunder Shock inflicts paralysis")
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Thunder Shock cannot paralyze an Electric-type")
|
||||
SINGLE_BATTLE_TEST("Thunder Shock cannot paralyze an Electric-type (Gen6+)")
|
||||
{
|
||||
u32 gen = 0;
|
||||
PARAMETRIZE { gen = GEN_5; }
|
||||
PARAMETRIZE { gen = GEN_6; }
|
||||
GIVEN {
|
||||
ASSUME(B_PARALYZE_ELECTRIC >= GEN_6);
|
||||
WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, gen);
|
||||
ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_PIKACHU);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_THUNDER_SHOCK); }
|
||||
TURN { MOVE(player, MOVE_THUNDER_SHOCK, secondaryEffect: TRUE); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_SHOCK, player);
|
||||
HP_BAR(opponent);
|
||||
NONE_OF {
|
||||
if (gen == GEN_6) {
|
||||
NONE_OF {
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent);
|
||||
STATUS_ICON(opponent, paralysis: TRUE);
|
||||
}
|
||||
} else {
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent);
|
||||
STATUS_ICON(opponent, paralysis: TRUE);
|
||||
}
|
||||
|
@@ -46,12 +46,11 @@ SINGLE_BATTLE_TEST("Tri Attack cannot paralyze/burn/freeze electric/fire/ice typ
|
||||
u8 statusAnim;
|
||||
u16 species;
|
||||
u32 rng;
|
||||
#if B_PARALYZE_ELECTRIC >= GEN_6
|
||||
PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_RAICHU; }
|
||||
#endif // B_PARALYZE_ELECTRIC
|
||||
PARAMETRIZE { statusAnim = B_ANIM_STATUS_BRN; rng = MOVE_EFFECT_BURN; species = SPECIES_ARCANINE; }
|
||||
PARAMETRIZE { statusAnim = B_ANIM_STATUS_FRZ; rng = MOVE_EFFECT_FREEZE_OR_FROSTBITE; species = SPECIES_GLALIE; }
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, GEN_6);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(species);
|
||||
} WHEN {
|
||||
|
@@ -1,9 +1,13 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
SINGLE_BATTLE_TEST("Powder moves are blocked by Grass-type Pokémon")
|
||||
SINGLE_BATTLE_TEST("Powder moves are blocked by Grass-type Pokémon (Gen6+)")
|
||||
{
|
||||
u32 gen = 0;
|
||||
PARAMETRIZE { gen = GEN_5; }
|
||||
PARAMETRIZE { gen = GEN_6; }
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, gen);
|
||||
ASSUME(IsPowderMove(MOVE_STUN_SPORE));
|
||||
ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS);
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
@@ -11,7 +15,12 @@ SINGLE_BATTLE_TEST("Powder moves are blocked by Grass-type Pokémon")
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_STUN_SPORE); }
|
||||
} SCENE {
|
||||
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player);
|
||||
MESSAGE("It doesn't affect the opposing Oddish…");
|
||||
if (gen == GEN_6) {
|
||||
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player);
|
||||
MESSAGE("It doesn't affect the opposing Oddish…");
|
||||
} else {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, player);
|
||||
NOT MESSAGE("It doesn't affect the opposing Oddish…");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -55,6 +55,7 @@ AI_SINGLE_BATTLE_TEST("AI avoids Thunder Wave when it can not paralyse target")
|
||||
PARAMETRIZE { species = SPECIES_PIKACHU; ability = ABILITY_STATIC; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, GEN_6);
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT);
|
||||
PLAYER(species) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_THUNDER_WAVE); }
|
||||
@@ -63,18 +64,30 @@ AI_SINGLE_BATTLE_TEST("AI avoids Thunder Wave when it can not paralyse target")
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Thunder Wave doesn't affect Electric types in Gen6+")
|
||||
SINGLE_BATTLE_TEST("Thunder Wave doesn't affect Electric types (Gen6+)")
|
||||
{
|
||||
u32 gen = 0;
|
||||
PARAMETRIZE { gen = GEN_5; }
|
||||
PARAMETRIZE { gen = GEN_6; }
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, gen);
|
||||
ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC);
|
||||
ASSUME(B_PARALYZE_ELECTRIC >= GEN_6);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_PIKACHU);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_THUNDER_WAVE); }
|
||||
} SCENE {
|
||||
MESSAGE("Wobbuffet used Thunder Wave!");
|
||||
MESSAGE("It doesn't affect the opposing Pikachu…");
|
||||
if (gen == GEN_6) {
|
||||
NONE_OF {
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent);
|
||||
STATUS_ICON(opponent, paralysis: TRUE);
|
||||
}
|
||||
MESSAGE("It doesn't affect the opposing Pikachu…");
|
||||
} else {
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent);
|
||||
STATUS_ICON(opponent, paralysis: TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -22,11 +22,25 @@ SINGLE_BATTLE_TEST("Sleep prevents the battler from using a move")
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Sleep: Spore doesn't affect grass types (Gen 6+)")
|
||||
SINGLE_BATTLE_TEST("Sleep: Spore affects grass types (Gen1-5)")
|
||||
{
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_5);
|
||||
ASSUME(IsPowderMove(MOVE_SPORE));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_CHIKORITA);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SPORE); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, player);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Sleep: Spore doesn't affect grass types (Gen6+)")
|
||||
{
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_6);
|
||||
ASSUME(IsPowderMove(MOVE_SPORE));
|
||||
ASSUME(B_POWDER_GRASS >= GEN_6);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_CHIKORITA);
|
||||
} WHEN {
|
||||
|
Reference in New Issue
Block a user