mirror of
https://github.com/pret/pokeemerald.git
synced 2026-04-25 15:57:29 -05:00
"Aerilate"-esque Ability Tests and Config (#6313)
This commit is contained in:
parent
94d4a37e1d
commit
540744024d
|
|
@ -159,6 +159,7 @@
|
|||
#define B_PICKUP_WILD GEN_LATEST // In Gen9+, Pickup allows its user to pickup its own used item at the end of the turn in wild battles.
|
||||
#define B_MAGIC_GUARD GEN_LATEST // In Gen4 only, Magic Guard ignores immobilization caused by paralysis
|
||||
#define B_BATTLE_BOND GEN_LATEST // In Gen9+, Battle Bond increases Atk, SpAtk and Speed by one stage, once per battle
|
||||
#define B_ATE_MULTIPLIER GEN_LATEST // In Gen7+, -ate abilities (Aerilate, Galvanize, Normalize, Pixilate, Refrigerate) multiply damage by 1.2. Otherwise, it's 1.3, except Normalize which has no multiplier.
|
||||
|
||||
// Item settings
|
||||
#define B_HP_BERRIES GEN_LATEST // In Gen4+, berries which restore HP activate immediately after HP drops to half. In Gen3, the effect occurs at the end of the turn.
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ enum GenConfigTag
|
|||
GEN_CONFIG_HEAL_BELL_SOUNDPROOF,
|
||||
GEN_CONFIG_TELEPORT_BEHAVIOR,
|
||||
GEN_CONFIG_BATTLE_BOND,
|
||||
GEN_CONFIG_ATE_MULTIPLIER,
|
||||
GEN_CONFIG_COUNT
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] =
|
|||
[GEN_CONFIG_HEAL_BELL_SOUNDPROOF] = B_HEAL_BELL_SOUNDPROOF,
|
||||
[GEN_CONFIG_TELEPORT_BEHAVIOR] = B_TELEPORT_BEHAVIOR,
|
||||
[GEN_CONFIG_BATTLE_BOND] = B_BATTLE_BOND,
|
||||
[GEN_CONFIG_ATE_MULTIPLIER] = B_ATE_MULTIPLIER,
|
||||
};
|
||||
|
||||
#if TESTING
|
||||
|
|
|
|||
|
|
@ -6078,8 +6078,7 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler)
|
|||
gBattleStruct->dynamicMoveType = moveType | F_DYNAMIC_TYPE_SET;
|
||||
|
||||
moveType = GetBattleMoveType(move);
|
||||
if ((gFieldStatuses & STATUS_FIELD_ION_DELUGE && moveType == TYPE_NORMAL)
|
||||
|| gStatuses4[battler] & STATUS4_ELECTRIFIED)
|
||||
if ((gFieldStatuses & STATUS_FIELD_ION_DELUGE && moveType == TYPE_NORMAL) || gStatuses4[battler] & STATUS4_ELECTRIFIED)
|
||||
gBattleStruct->dynamicMoveType = TYPE_ELECTRIC | F_DYNAMIC_TYPE_SET;
|
||||
|
||||
// Check if a gem should activate.
|
||||
|
|
|
|||
|
|
@ -9490,22 +9490,22 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData *
|
|||
break;
|
||||
case ABILITY_PIXILATE:
|
||||
if (moveType == TYPE_FAIRY && gBattleStruct->ateBoost[battlerAtk])
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(1.2));
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3));
|
||||
break;
|
||||
case ABILITY_GALVANIZE:
|
||||
if (moveType == TYPE_ELECTRIC && gBattleStruct->ateBoost[battlerAtk])
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(1.2));
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3));
|
||||
break;
|
||||
case ABILITY_REFRIGERATE:
|
||||
if (moveType == TYPE_ICE && gBattleStruct->ateBoost[battlerAtk])
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(1.2));
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3));
|
||||
break;
|
||||
case ABILITY_AERILATE:
|
||||
if (moveType == TYPE_FLYING && gBattleStruct->ateBoost[battlerAtk])
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(1.2));
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3));
|
||||
break;
|
||||
case ABILITY_NORMALIZE:
|
||||
if (moveType == TYPE_NORMAL && gBattleStruct->ateBoost[battlerAtk])
|
||||
if (moveType == TYPE_NORMAL && gBattleStruct->ateBoost[battlerAtk] && GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7)
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(1.2));
|
||||
break;
|
||||
case ABILITY_PUNK_ROCK:
|
||||
|
|
|
|||
|
|
@ -45,12 +45,137 @@ SINGLE_BATTLE_TEST("Aerilate can not turn certain moves into Flying type moves")
|
|||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Aerilate boosts power of affected moves by 20% (Gen7+)");
|
||||
TO_DO_BATTLE_TEST("Aerilate boosts power of affected moves by 30% (Gen6)");
|
||||
SINGLE_BATTLE_TEST("Aerilate boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage)
|
||||
{
|
||||
u32 move, genConfig;
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; genConfig = GEN_7; }
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; genConfig = GEN_6; }
|
||||
PARAMETRIZE { move = MOVE_SKILL_SWAP; genConfig = GEN_7; }
|
||||
PARAMETRIZE { move = MOVE_SKILL_SWAP; genConfig = GEN_6; }
|
||||
|
||||
// Gen 6-7
|
||||
TO_DO_BATTLE_TEST("Aerilate overrides Electrify (Gen6-7)");
|
||||
TO_DO_BATTLE_TEST("Aerilate overrides Ion Deluge (Gen6-7)");
|
||||
// Gen 8+
|
||||
//TO_DO_BATTLE_TEST("Aerilate doesn't override Electrify (Gen8+)"); // No mon with Aerilate exists in Gen8+, but probably behaves similar to Pixilate, which does.
|
||||
//TO_DO_BATTLE_TEST("Aerilate doesn't override Ion Deluge (Gen8+)"); // Ion Deluge doesn't exist in Gen 8+, but we probably could assume it behaves similar to under Electrify. TODO: Test by hacking SV.
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig);
|
||||
ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL);
|
||||
ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_SALAMENCE) { Ability(ABILITY_MOXIE); Item(ITEM_SALAMENCITE); }
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, move, gimmick: GIMMICK_MEGA); MOVE(player, MOVE_TACKLE); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
if (genConfig >= GEN_7)
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.2), results[2].damage); // No STAB
|
||||
else
|
||||
EXPECT_MUL_EQ(results[1].damage, Q_4_12(1.3), results[3].damage); // No STAB
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Aerilate doesn't affect Weather Ball's type", s16 damage)
|
||||
{
|
||||
u32 move1, move2;
|
||||
PARAMETRIZE { move1 = MOVE_CELEBRATE; move2 = MOVE_CELEBRATE; }
|
||||
PARAMETRIZE { move1 = MOVE_SUNNY_DAY; move2 = MOVE_CELEBRATE; }
|
||||
PARAMETRIZE { move1 = MOVE_CELEBRATE; move2 = MOVE_SKILL_SWAP; }
|
||||
PARAMETRIZE { move1 = MOVE_SUNNY_DAY; move2 = MOVE_SKILL_SWAP; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
|
||||
ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL);
|
||||
ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP);
|
||||
ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_PINSIR) { Ability(ABILITY_HYPER_CUTTER); Item(ITEM_PINSIRITE); }
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, move2, gimmick: GIMMICK_MEGA); MOVE(player, move1); }
|
||||
TURN { MOVE(player, MOVE_WEATHER_BALL); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, move2, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, move1, player);
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
if (move1 == MOVE_SUNNY_DAY)
|
||||
MESSAGE("It's super effective!");
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(6.0), results[1].damage); // double base power + type effectiveness + sun 50% boost
|
||||
EXPECT_MUL_EQ(results[2].damage, Q_4_12(6.0), results[3].damage);
|
||||
EXPECT_EQ(results[0].damage, results[2].damage);
|
||||
EXPECT_EQ(results[1].damage, results[3].damage);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Aerilate doesn't affect Natural Gift's type")
|
||||
{
|
||||
u16 move;
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; }
|
||||
PARAMETRIZE { move = MOVE_SKILL_SWAP; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
|
||||
ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP);
|
||||
ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_PERSIM_BERRY)].type == TYPE_GROUND);
|
||||
ASSUME(gSpeciesInfo[SPECIES_SALAMENCE_MEGA].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_SALAMENCE_MEGA].types[1] == TYPE_FLYING);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PERSIM_BERRY); }
|
||||
OPPONENT(SPECIES_SALAMENCE) { Item(ITEM_SALAMENCITE); }
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, move, gimmick: GIMMICK_MEGA); MOVE(player, MOVE_NATURAL_GIFT); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, move, opponent);
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, player); }
|
||||
MESSAGE("It doesn't affect the opposing Salamence…");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Aerilate doesn't affect Judgment / Techno Blast / Multi-Attack's type")
|
||||
{
|
||||
u16 move, item;
|
||||
PARAMETRIZE { move = MOVE_JUDGMENT; item = ITEM_ZAP_PLATE; }
|
||||
PARAMETRIZE { move = MOVE_TECHNO_BLAST; item = ITEM_SHOCK_DRIVE; }
|
||||
PARAMETRIZE { move = MOVE_MULTI_ATTACK; item = ITEM_ELECTRIC_MEMORY; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_JUDGMENT) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_TECHNO_BLAST) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_MULTI_ATTACK) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP);
|
||||
ASSUME(gItemsInfo[ITEM_ZAP_PLATE].holdEffect == HOLD_EFFECT_PLATE);
|
||||
ASSUME(gItemsInfo[ITEM_ZAP_PLATE].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].holdEffect == HOLD_EFFECT_DRIVE);
|
||||
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY);
|
||||
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Item(item); }
|
||||
OPPONENT(SPECIES_SALAMENCE) { Item(ITEM_SALAMENCITE); }
|
||||
OPPONENT(SPECIES_DIGLETT);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_SKILL_SWAP, gimmick: GIMMICK_MEGA); }
|
||||
TURN { SWITCH(opponent, 1); MOVE(player, move); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent);
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, move, player); }
|
||||
MESSAGE("It doesn't affect the opposing Diglett…");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Aerilate doesn't affect Hidden Power's type")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
|
||||
ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
|
||||
PLAYER(SPECIES_PINSIR) { Ability(ABILITY_AERILATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric
|
||||
OPPONENT(SPECIES_DIGLETT);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_HIDDEN_POWER); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_HIDDEN_POWER, player); }
|
||||
MESSAGE("It doesn't affect the opposing Diglett…");
|
||||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Aerilate doesn't override Electrify (Gen7+)"); // No mon with Aerilate exists in Gen8+, but probably behaves similar to Pixilate, which does.
|
||||
TO_DO_BATTLE_TEST("Aerilate doesn't override Ion Deluge (Gen7+)"); // Ion Deluge doesn't exist in Gen 8+, but we probably could assume it behaves similar to under Electrify. TODO: Test by hacking SV.
|
||||
TO_DO_BATTLE_TEST("Aerilate overrides Electrify (Gen6)")
|
||||
TO_DO_BATTLE_TEST("Aerilate overrides Ion Deluge (Gen6)")
|
||||
TO_DO_BATTLE_TEST("Aerilate doesn't affect Tera Starstorm's type");
|
||||
TO_DO_BATTLE_TEST("Aerilate doesn't affect Max Strike's type");
|
||||
TO_DO_BATTLE_TEST("Aerilate doesn't affect Terrain Pulse's type");
|
||||
TO_DO_BATTLE_TEST("Aerilate doesn't affect damaging Z-Move types");
|
||||
TO_DO_BATTLE_TEST("(DYNAMAX) Aerilate turns Max Strike into Max Airstream"); // All other -ate abilities do this, so interpolating this as no Aerilate mon is available in a Dynamax game
|
||||
|
|
|
|||
|
|
@ -42,7 +42,128 @@ SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type move
|
|||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+)");
|
||||
TO_DO_BATTLE_TEST("Galvanize boosts power of affected moves by 30% (Gen6)");
|
||||
SINGLE_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage)
|
||||
{
|
||||
u32 ability, genConfig;
|
||||
PARAMETRIZE { ability = ABILITY_STURDY; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_STURDY; genConfig = GEN_6; }
|
||||
PARAMETRIZE { ability = ABILITY_GALVANIZE; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_GALVANIZE; genConfig = GEN_6; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig);
|
||||
PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); Moves(MOVE_TACKLE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_TACKLE); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
if (genConfig >= GEN_7)
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.8), results[2].damage); // STAB + ate
|
||||
else
|
||||
EXPECT_MUL_EQ(results[1].damage, Q_4_12(1.95), results[3].damage); // STAB + ate
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Galvanize doesn't affect Weather Ball's type", s16 damage)
|
||||
{
|
||||
u16 move, ability;
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_STURDY; }
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_STURDY; }
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_GALVANIZE; }
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_GALVANIZE; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
|
||||
ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL);
|
||||
ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG);
|
||||
PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); }
|
||||
OPPONENT(SPECIES_PINSIR);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
TURN { MOVE(player, MOVE_WEATHER_BALL); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
if (move == MOVE_SUNNY_DAY)
|
||||
MESSAGE("It's super effective!");
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(6.0), results[1].damage); // double base power + type effectiveness + sun 50% boost
|
||||
EXPECT_MUL_EQ(results[2].damage, Q_4_12(6.0), results[3].damage);
|
||||
EXPECT_EQ(results[0].damage, results[2].damage);
|
||||
EXPECT_EQ(results[1].damage, results[3].damage);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Galvanize doesn't affect Natural Gift's type")
|
||||
{
|
||||
u16 ability;
|
||||
PARAMETRIZE { ability = ABILITY_STURDY; }
|
||||
PARAMETRIZE { ability = ABILITY_GALVANIZE; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
|
||||
ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON);
|
||||
ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL);
|
||||
PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); Item(ITEM_ORAN_BERRY); }
|
||||
OPPONENT(SPECIES_BELDUM);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_NATURAL_GIFT); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, player); }
|
||||
MESSAGE("It doesn't affect the opposing Beldum…");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Galvanize doesn't affect Judgment / Techno Blast / Multi-Attack's type")
|
||||
{
|
||||
u16 move, item;
|
||||
PARAMETRIZE { move = MOVE_JUDGMENT; item = ITEM_SPLASH_PLATE; }
|
||||
PARAMETRIZE { move = MOVE_TECHNO_BLAST; item = ITEM_DOUSE_DRIVE; }
|
||||
PARAMETRIZE { move = MOVE_MULTI_ATTACK; item = ITEM_WATER_MEMORY; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_JUDGMENT) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_TECHNO_BLAST) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_MULTI_ATTACK) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(gItemsInfo[ITEM_SPLASH_PLATE].holdEffect == HOLD_EFFECT_PLATE);
|
||||
ASSUME(gItemsInfo[ITEM_SPLASH_PLATE].secondaryId == TYPE_WATER);
|
||||
ASSUME(gItemsInfo[ITEM_DOUSE_DRIVE].holdEffect == HOLD_EFFECT_DRIVE);
|
||||
ASSUME(gItemsInfo[ITEM_DOUSE_DRIVE].secondaryId == TYPE_WATER);
|
||||
ASSUME(gItemsInfo[ITEM_WATER_MEMORY].holdEffect == HOLD_EFFECT_MEMORY);
|
||||
ASSUME(gItemsInfo[ITEM_WATER_MEMORY].secondaryId == TYPE_WATER);
|
||||
ASSUME(gSpeciesInfo[SPECIES_VAPOREON].types[0] == TYPE_WATER);
|
||||
PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); Item(item); }
|
||||
OPPONENT(SPECIES_VAPOREON) { Ability(ABILITY_WATER_ABSORB); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, move, player); }
|
||||
if (move == MOVE_JUDGMENT)
|
||||
MESSAGE("The opposing Vaporeon's Water Absorb made Judgment useless!");
|
||||
else if (move == MOVE_TECHNO_BLAST)
|
||||
MESSAGE("The opposing Vaporeon's Water Absorb made Techno Blast useless!");
|
||||
else if (move == MOVE_MULTI_ATTACK)
|
||||
MESSAGE("The opposing Vaporeon's Water Absorb made Multi-Attack useless!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Galvanize doesn't affect Hidden Power's type")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
|
||||
ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
|
||||
PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(30); } // HP Water
|
||||
OPPONENT(SPECIES_VAPOREON) { Ability(ABILITY_WATER_ABSORB); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_HIDDEN_POWER); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_HIDDEN_POWER, player); }
|
||||
MESSAGE("The opposing Vaporeon's Water Absorb made Hidden Power useless!");
|
||||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Galvanize doesn't affect Tera Starstorm's type");
|
||||
TO_DO_BATTLE_TEST("Galvanize doesn't affect Max Strike's type");
|
||||
TO_DO_BATTLE_TEST("Galvanize doesn't affect Terrain Pulse's type");
|
||||
TO_DO_BATTLE_TEST("Galvanize doesn't affect damaging Z-Move types");
|
||||
TO_DO_BATTLE_TEST("(DYNAMAX) Galvanize turns Max Strike into Max Lightning when not used by Gigantamax Pikachu/Toxtricity");
|
||||
//TO_DO_BATTLE_TEST("(DYNAMAX) Galvanize doesn't turn Max Strike into Max Lightning when used by Gigantamax Pikachu/Toxtricity, instead becoming G-Max Volt Crash/Stun Shock"); // Marked in Bulbapedia as "needs research", so this assumes that it behaves like Pixilate.
|
||||
|
|
|
|||
|
|
@ -1,16 +1,274 @@
|
|||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
TO_DO_BATTLE_TEST("Normalize tuns a move into a Normal-type move");
|
||||
TO_DO_BATTLE_TEST("Normalize boosts power of both affected and originally Normal-type moves by 20% (Gen7+)");
|
||||
TO_DO_BATTLE_TEST("Normalize affects status moves"); // Eg. Thunder Wave can affect Ground types
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL);
|
||||
ASSUME(GetMovePower(MOVE_TACKLE) > 0);
|
||||
ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER);
|
||||
ASSUME(GetMovePower(MOVE_WATER_GUN) > 0);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Normalize turns a move into a Normal-type move")
|
||||
{
|
||||
u16 ability;
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
|
||||
GIVEN {
|
||||
ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST);
|
||||
PLAYER(SPECIES_GASTLY);
|
||||
OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN);}
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_WATER_GUN); }
|
||||
} SCENE {
|
||||
if (ability == ABILITY_CUTE_CHARM)
|
||||
{
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent);
|
||||
NOT { MESSAGE("It doesn't affect Gastly…"); }
|
||||
}
|
||||
else
|
||||
{
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); }
|
||||
MESSAGE("It doesn't affect Gastly…");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Normalize affects status moves")
|
||||
{
|
||||
u16 ability;
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveType(MOVE_THUNDER_WAVE) == TYPE_ELECTRIC);
|
||||
ASSUME(gSpeciesInfo[SPECIES_DRILBUR].types[0] == TYPE_GROUND);
|
||||
PLAYER(SPECIES_DRILBUR);
|
||||
OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_THUNDER_WAVE);}
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_THUNDER_WAVE); }
|
||||
} SCENE {
|
||||
if (ability == ABILITY_CUTE_CHARM)
|
||||
{
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, opponent); }
|
||||
MESSAGE("But it failed!");
|
||||
}
|
||||
else
|
||||
{
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, opponent);
|
||||
NOT { MESSAGE("But it failed!"); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage to Water-type Pokémon", s16 damage)
|
||||
{
|
||||
u16 ability;
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveType(MOVE_FREEZE_DRY) == TYPE_ICE);
|
||||
ASSUME(GetMoveEffect(MOVE_FREEZE_DRY) == EFFECT_SUPER_EFFECTIVE_ON_ARG);
|
||||
ASSUME(gSpeciesInfo[SPECIES_MUDKIP].types[0] == TYPE_WATER);
|
||||
PLAYER(SPECIES_MUDKIP);
|
||||
OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_FREEZE_DRY);}
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_FREEZE_DRY); }
|
||||
} SCENE {
|
||||
MESSAGE("It's super effective!");
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.8), results[1].damage); // STAB + Ate
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Normalize boosts power of unaffected moves by 20% (Gen7+)", s16 damage)
|
||||
{
|
||||
u32 ability, genConfig;
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_6; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_6; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig);
|
||||
PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_TACKLE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_TACKLE); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
if (genConfig >= GEN_7)
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.2), results[2].damage); // Ate
|
||||
else
|
||||
EXPECT_EQ(results[1].damage, results[3].damage); // No boost
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Normalize boosts power of affected moves by 20% (Gen7+)", s16 damage)
|
||||
{
|
||||
u32 ability, genConfig;
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_6; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_6; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig);
|
||||
PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_WATER_GUN); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
if (genConfig >= GEN_7)
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.8), results[2].damage); // STAB + ate
|
||||
else
|
||||
EXPECT_MUL_EQ(results[1].damage, Q_4_12(1.5), results[3].damage); // STAB + no ate
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Normalize-affected moves become Electric-type under Electrify's effect", s16 damage)
|
||||
{
|
||||
u32 ability, genConfig;
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_6; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_6; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY);
|
||||
WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig);
|
||||
PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_ELECTRIFY); MOVE(player, MOVE_WATER_GUN); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
if (genConfig >= GEN_7)
|
||||
EXPECT_EQ(results[0].damage, results[2].damage);
|
||||
else
|
||||
EXPECT_EQ(results[1].damage, results[3].damage);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Normalize-affected moves become Electric-type under Ion Deluge's effect", s16 damage)
|
||||
{
|
||||
u32 ability, genConfig;
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_6; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; genConfig = GEN_6; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_ION_DELUGE) == EFFECT_ION_DELUGE);
|
||||
WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig);
|
||||
PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_ION_DELUGE); MOVE(player, MOVE_WATER_GUN); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
if (genConfig >= GEN_7)
|
||||
EXPECT_EQ(results[0].damage, results[2].damage);
|
||||
else
|
||||
EXPECT_EQ(results[1].damage, results[3].damage);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Normalize doesn't affect Weather Ball's type", s16 damage)
|
||||
{
|
||||
u16 move, ability;
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_CUTE_CHARM; }
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_CUTE_CHARM; }
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_NORMALIZE; }
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_NORMALIZE; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
|
||||
ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL);
|
||||
ASSUME(gSpeciesInfo[SPECIES_MEGANIUM].types[0] == TYPE_GRASS);
|
||||
PLAYER(SPECIES_SKITTY) { Ability(ability); }
|
||||
OPPONENT(SPECIES_MEGANIUM);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
TURN { MOVE(player, MOVE_WEATHER_BALL); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
if (move == MOVE_SUNNY_DAY)
|
||||
MESSAGE("It's super effective!");
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(4.0), results[1].damage); // double base power + type effectiveness + sun 50% boost - STAB
|
||||
EXPECT_MUL_EQ(results[2].damage, Q_4_12(4.0), results[3].damage);
|
||||
EXPECT_EQ(results[0].damage, results[2].damage);
|
||||
EXPECT_EQ(results[1].damage, results[3].damage);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Normalize doesn't affect Natural Gift's type")
|
||||
{
|
||||
u16 ability;
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
|
||||
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
|
||||
ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON);
|
||||
ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL);
|
||||
PLAYER(SPECIES_SKITTY) { Ability(ability); Item(ITEM_ORAN_BERRY); }
|
||||
OPPONENT(SPECIES_BELDUM);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_NATURAL_GIFT); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, player); }
|
||||
MESSAGE("It doesn't affect the opposing Beldum…");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Normalize doesn't affect Judgment / Techno Blast / Multi-Attack's type")
|
||||
{
|
||||
u16 move, item;
|
||||
PARAMETRIZE { move = MOVE_JUDGMENT; item = ITEM_ZAP_PLATE; }
|
||||
PARAMETRIZE { move = MOVE_TECHNO_BLAST; item = ITEM_SHOCK_DRIVE; }
|
||||
PARAMETRIZE { move = MOVE_MULTI_ATTACK; item = ITEM_ELECTRIC_MEMORY; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_JUDGMENT) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_TECHNO_BLAST) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_MULTI_ATTACK) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(gItemsInfo[ITEM_ZAP_PLATE].holdEffect == HOLD_EFFECT_PLATE);
|
||||
ASSUME(gItemsInfo[ITEM_ZAP_PLATE].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].holdEffect == HOLD_EFFECT_DRIVE);
|
||||
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY);
|
||||
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
|
||||
PLAYER(SPECIES_SKITTY) { Ability(ABILITY_NORMALIZE); Item(item); }
|
||||
OPPONENT(SPECIES_DIGLETT);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, move, player); }
|
||||
MESSAGE("It doesn't affect the opposing Diglett…");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Normalize doesn't affect Hidden Power's type")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
|
||||
ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
|
||||
PLAYER(SPECIES_SKITTY) { Ability(ABILITY_NORMALIZE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric
|
||||
OPPONENT(SPECIES_DIGLETT);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_HIDDEN_POWER); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_HIDDEN_POWER, player); }
|
||||
MESSAGE("It doesn't affect the opposing Diglett…");
|
||||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Aerilate doesn't affect Tera Starstorm's type");
|
||||
TO_DO_BATTLE_TEST("Normalize makes Flying Press do Normal/Flying damage");
|
||||
TO_DO_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage to Water-type Pokémon");
|
||||
TO_DO_BATTLE_TEST("Normalize-affected moves become Electric-type under Electrify's effect");
|
||||
TO_DO_BATTLE_TEST("Normalize-affected moves become Electric-type under Ion Deluge's effect");
|
||||
TO_DO_BATTLE_TEST("Normalize doesn't affect Hidden Power's type");
|
||||
TO_DO_BATTLE_TEST("Normalize doesn't affect Weather Ball's type");
|
||||
TO_DO_BATTLE_TEST("Normalize doesn't affect Natural Gift's type");
|
||||
TO_DO_BATTLE_TEST("Normalize doesn't affect Judgment/Techno Blast/Multi-Attack's type");
|
||||
TO_DO_BATTLE_TEST("Normalize doesn't affect Terrain Pulse's type");
|
||||
TO_DO_BATTLE_TEST("Normalize doesn't affect damaging Z-Move types");
|
||||
|
|
|
|||
|
|
@ -21,15 +21,127 @@ SINGLE_BATTLE_TEST("Pixilate turns a Normal-type move into a Fairy-type move")
|
|||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Pixilate can not turn certain moves into Fairy type moves");
|
||||
TO_DO_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+)");
|
||||
TO_DO_BATTLE_TEST("Pixilate boosts power of affected moves by 30% (Gen6)");
|
||||
SINGLE_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage)
|
||||
{
|
||||
u32 ability, genConfig;
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_6; }
|
||||
PARAMETRIZE { ability = ABILITY_PIXILATE; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_PIXILATE; genConfig = GEN_6; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig);
|
||||
PLAYER(SPECIES_SYLVEON) { Ability(ability); Moves(MOVE_TACKLE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_TACKLE); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
if (genConfig >= GEN_7)
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.8), results[2].damage); // STAB + ate
|
||||
else
|
||||
EXPECT_MUL_EQ(results[1].damage, Q_4_12(1.95), results[3].damage); // STAB + ate
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Pixilate doesn't affect Weather Ball's type", s16 damage)
|
||||
{
|
||||
u16 move, ability;
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_STURDY; }
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_STURDY; }
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_PIXILATE; }
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_PIXILATE; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
|
||||
ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL);
|
||||
ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG);
|
||||
PLAYER(SPECIES_SYLVEON) { Level(5); Ability(ability); }
|
||||
OPPONENT(SPECIES_PINSIR);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
TURN { MOVE(player, MOVE_WEATHER_BALL); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
if (move == MOVE_SUNNY_DAY)
|
||||
MESSAGE("It's super effective!");
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(6.0), results[1].damage); // double base power + type effectiveness + sun 50% boost
|
||||
EXPECT_MUL_EQ(results[2].damage, Q_4_12(6.0), results[3].damage);
|
||||
EXPECT_EQ(results[0].damage, results[2].damage);
|
||||
EXPECT_EQ(results[1].damage, results[3].damage);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Pixilate doesn't affect Natural Gift's type")
|
||||
{
|
||||
u16 ability;
|
||||
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
|
||||
PARAMETRIZE { ability = ABILITY_PIXILATE; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
|
||||
ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON);
|
||||
ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL);
|
||||
PLAYER(SPECIES_SYLVEON) { Ability(ability); Item(ITEM_ORAN_BERRY); }
|
||||
OPPONENT(SPECIES_BELDUM);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_NATURAL_GIFT); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, player); }
|
||||
MESSAGE("It doesn't affect the opposing Beldum…");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Pixilate doesn't affect Judgment / Techno Blast / Multi-Attack's type")
|
||||
{
|
||||
u16 move, item;
|
||||
PARAMETRIZE { move = MOVE_JUDGMENT; item = ITEM_ZAP_PLATE; }
|
||||
PARAMETRIZE { move = MOVE_TECHNO_BLAST; item = ITEM_SHOCK_DRIVE; }
|
||||
PARAMETRIZE { move = MOVE_MULTI_ATTACK; item = ITEM_ELECTRIC_MEMORY; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_JUDGMENT) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_TECHNO_BLAST) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_MULTI_ATTACK) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(gItemsInfo[ITEM_ZAP_PLATE].holdEffect == HOLD_EFFECT_PLATE);
|
||||
ASSUME(gItemsInfo[ITEM_ZAP_PLATE].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].holdEffect == HOLD_EFFECT_DRIVE);
|
||||
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY);
|
||||
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
|
||||
PLAYER(SPECIES_SYLVEON) { Ability(ABILITY_PIXILATE); Item(item); }
|
||||
OPPONENT(SPECIES_DIGLETT);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, move, player); }
|
||||
MESSAGE("It doesn't affect the opposing Diglett…");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Pixilate doesn't affect Hidden Power's type")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
|
||||
ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
|
||||
PLAYER(SPECIES_SYLVEON) { Ability(ABILITY_PIXILATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric
|
||||
OPPONENT(SPECIES_DIGLETT);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_HIDDEN_POWER); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_HIDDEN_POWER, player); }
|
||||
MESSAGE("It doesn't affect the opposing Diglett…");
|
||||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Pixilate doesn't override Electrify (Gen7+)");
|
||||
TO_DO_BATTLE_TEST("Pixilate doesn't override Ion Deluge (Gen7+)"); // Ion Deluge doesn't exist in Gen 8+, but we probably could assume it behaves similar to under Electrify. TODO: Test by hacking SV.
|
||||
TO_DO_BATTLE_TEST("Pixilate overrides Electrify (Gen6)")
|
||||
TO_DO_BATTLE_TEST("Pixilate overrides Ion Deluge (Gen6)")
|
||||
TO_DO_BATTLE_TEST("Pixilate doesn't affect Tera Starstorm's type");
|
||||
TO_DO_BATTLE_TEST("Pixilate doesn't affect Max Strike's type");
|
||||
TO_DO_BATTLE_TEST("Pixilate doesn't affect Terrain Pulse's type");
|
||||
TO_DO_BATTLE_TEST("Pixilate doesn't affect damaging Z-Move types");
|
||||
TO_DO_BATTLE_TEST("(DYNAMAX) Pixilate turns Max Strike into Max Starfall when not used by Gigantamax Alcremie");
|
||||
TO_DO_BATTLE_TEST("(DYNAMAX) Pixilate doesn't turn Max Strike into Max Starfall when used by Gigantamax Alcremie, instead becoming G-Max Finale");
|
||||
|
||||
// Gen 6-7
|
||||
TO_DO_BATTLE_TEST("Pixilate overrides Electrify (Gen6-7)");
|
||||
TO_DO_BATTLE_TEST("Pixilate overrides Ion Deluge (Gen6-7)");
|
||||
// Gen 8+
|
||||
TO_DO_BATTLE_TEST("Pixilate doesn't override Electrify (Gen8+)");
|
||||
//TO_DO_BATTLE_TEST("Pixilate doesn't override Ion Deluge (Gen8+)"); // Ion Deluge doesn't exist in Gen 8+, but we probably could assume it behaves similar to under Electrify. TODO: Test by hacking SV.
|
||||
|
|
|
|||
|
|
@ -20,15 +20,126 @@ SINGLE_BATTLE_TEST("Refrigerate turns a Normal-type move into a Ice-type move")
|
|||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Refrigerate can not turn certain moves into Ice type moves");
|
||||
TO_DO_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+)");
|
||||
TO_DO_BATTLE_TEST("Refrigerate boosts power of affected moves by 30% (Gen6)");
|
||||
SINGLE_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage)
|
||||
{
|
||||
u32 ability, genConfig;
|
||||
PARAMETRIZE { ability = ABILITY_SNOW_WARNING; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_SNOW_WARNING; genConfig = GEN_6; }
|
||||
PARAMETRIZE { ability = ABILITY_REFRIGERATE; genConfig = GEN_7; }
|
||||
PARAMETRIZE { ability = ABILITY_REFRIGERATE; genConfig = GEN_6; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig);
|
||||
PLAYER(SPECIES_AMAURA) { Ability(ability); Moves(MOVE_TACKLE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_TACKLE); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
if (genConfig >= GEN_7)
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.8), results[2].damage); // STAB + ate
|
||||
else
|
||||
EXPECT_MUL_EQ(results[1].damage, Q_4_12(1.95), results[3].damage); // STAB + ate
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage)
|
||||
{
|
||||
u16 move, ability;
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_SNOW_WARNING; }
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_SNOW_WARNING; }
|
||||
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_REFRIGERATE; }
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_REFRIGERATE; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
|
||||
ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG);
|
||||
PLAYER(SPECIES_AMAURA) { Ability(ability); }
|
||||
OPPONENT(SPECIES_PINSIR);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
TURN { MOVE(player, MOVE_WEATHER_BALL); }
|
||||
} SCENE {
|
||||
HP_BAR(opponent, captureDamage: &results[i].damage);
|
||||
if (move == MOVE_SUNNY_DAY)
|
||||
MESSAGE("It's super effective!");
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); // double base power + type effectiveness + sun 50% boost vs hail no type effectiveness
|
||||
EXPECT_MUL_EQ(results[2].damage, Q_4_12(6.0), results[3].damage); // double base power + type effectiveness + sun 50% boost
|
||||
EXPECT_MUL_EQ(results[2].damage, Q_4_12(3.0), results[0].damage); // type effectiveness + sun 50% boost, both have double base power
|
||||
EXPECT_EQ(results[1].damage, results[3].damage);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Refrigerate doesn't affect Natural Gift's type")
|
||||
{
|
||||
u16 ability;
|
||||
PARAMETRIZE { ability = ABILITY_SNOW_WARNING; }
|
||||
PARAMETRIZE { ability = ABILITY_REFRIGERATE; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
|
||||
ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON);
|
||||
ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL);
|
||||
PLAYER(SPECIES_AMAURA) { Ability(ability); Item(ITEM_ORAN_BERRY); }
|
||||
OPPONENT(SPECIES_BELDUM);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_NATURAL_GIFT); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_NATURAL_GIFT, player); }
|
||||
MESSAGE("It doesn't affect the opposing Beldum…");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Refrigerate doesn't affect Judgment / Techno Blast / Multi-Attack's type")
|
||||
{
|
||||
u16 move, item;
|
||||
PARAMETRIZE { move = MOVE_JUDGMENT; item = ITEM_ZAP_PLATE; }
|
||||
PARAMETRIZE { move = MOVE_TECHNO_BLAST; item = ITEM_SHOCK_DRIVE; }
|
||||
PARAMETRIZE { move = MOVE_MULTI_ATTACK; item = ITEM_ELECTRIC_MEMORY; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_JUDGMENT) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_TECHNO_BLAST) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_MULTI_ATTACK) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(gItemsInfo[ITEM_ZAP_PLATE].holdEffect == HOLD_EFFECT_PLATE);
|
||||
ASSUME(gItemsInfo[ITEM_ZAP_PLATE].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].holdEffect == HOLD_EFFECT_DRIVE);
|
||||
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY);
|
||||
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC);
|
||||
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
|
||||
PLAYER(SPECIES_AMAURA) { Ability(ABILITY_REFRIGERATE); Item(item); }
|
||||
OPPONENT(SPECIES_DIGLETT);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, move, player); }
|
||||
MESSAGE("It doesn't affect the opposing Diglett…");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Refrigerate doesn't affect Hidden Power's type")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
|
||||
ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
|
||||
PLAYER(SPECIES_AMAURA) { Ability(ABILITY_REFRIGERATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric
|
||||
OPPONENT(SPECIES_DIGLETT);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_HIDDEN_POWER); }
|
||||
} SCENE {
|
||||
NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_HIDDEN_POWER, player); }
|
||||
MESSAGE("It doesn't affect the opposing Diglett…");
|
||||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Refrigerate doesn't override Electrify (Gen7+)"); // No mon with Refrigerate exists in Gen8+, but probably behaves similar to Pixilate, which does.
|
||||
TO_DO_BATTLE_TEST("Refrigerate doesn't override Ion Deluge (Gen7+)"); // Ion Deluge doesn't exist in Gen 8+, but we probably could assume it behaves similar to under Electrify. TODO: Test by hacking SV.
|
||||
TO_DO_BATTLE_TEST("Refrigerate overrides Electrify (Gen6)")
|
||||
TO_DO_BATTLE_TEST("Refrigerate overrides Ion Deluge (Gen6)")
|
||||
TO_DO_BATTLE_TEST("Refrigerate doesn't affect Tera Starstorm's type");
|
||||
TO_DO_BATTLE_TEST("Refrigerate doesn't affect Max Strike's type");
|
||||
TO_DO_BATTLE_TEST("Refrigerate doesn't affect Terrain Pulse's type");
|
||||
TO_DO_BATTLE_TEST("Refrigerate doesn't affect damaging Z-Move types");
|
||||
TO_DO_BATTLE_TEST("(DYNAMAX) Refrigerate turns Max Strike into Max Hailstorm when not used by Gigantamax Lapras");
|
||||
//TO_DO_BATTLE_TEST("(DYNAMAX) Refrigerate doesn't turn Max Strike into Max Hailstorm when used by Gigantamax Lapras, instead becoming G-Max Resonance"); // Marked in Bulbapedia as "needs research", so this assumes that it behaves like Pixilate.
|
||||
|
||||
// Gen 6-7
|
||||
TO_DO_BATTLE_TEST("Refrigerate overrides Electrify (Gen6-7)");
|
||||
TO_DO_BATTLE_TEST("Refrigerate overrides Ion Deluge (Gen6-7)");
|
||||
// Gen 8+
|
||||
//TO_DO_BATTLE_TEST("Refrigerate doesn't override Electrify (Gen8+)"); // Bulbapedia doesn't list this effect, so it assumes it behaves like Pixilate.
|
||||
//TO_DO_BATTLE_TEST("Refrigerate doesn't override Ion Deluge (Gen8+)"); // Ion Deluge doesn't exist in Gen 8+, but we probably could assume it behaves similar to under Electrify. TODO: Test by hacking SV.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user