mirror of
https://github.com/pret/pokefirered.git
synced 2026-09-28 20:08:52 -05:00
update and fix tests
This commit is contained in:
1
Makefile
1
Makefile
@@ -449,6 +449,7 @@ libagbsyscall:
|
||||
@$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=1
|
||||
|
||||
# Elf from object files
|
||||
LDFLAGS = -Map ../../$(MAP)
|
||||
$(ELF): $(LD_SCRIPT) $(LD_SCRIPT_DEPS) $(OBJS) libagbsyscall
|
||||
@cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat
|
||||
@echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ <objs> <libs> | cat"
|
||||
|
||||
@@ -377,7 +377,7 @@ B_ATK_NAME_WITH_PREFIX = FD 0F
|
||||
B_DEF_NAME_WITH_PREFIX = FD 10
|
||||
B_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBattler
|
||||
@ B_ACTIVE_NAME_WITH_PREFIX = FD 12
|
||||
B_SCR_ACTIVE_NAME_WITH_PREFIX = FD 13
|
||||
B_SCR_NAME_WITH_PREFIX = FD 13
|
||||
B_CURRENT_MOVE = FD 14
|
||||
B_LAST_MOVE = FD 15
|
||||
B_LAST_ITEM = FD 16
|
||||
@@ -425,7 +425,7 @@ B_DEF_PARTNER_NAME = FD 3C
|
||||
B_ATK_NAME_WITH_PREFIX2 = FD 3E
|
||||
B_DEF_NAME_WITH_PREFIX2 = FD 3F
|
||||
B_EFF_NAME_WITH_PREFIX2 = FD 40
|
||||
B_SCR_ACTIVE_NAME_WITH_PREFIX2 = FD 41
|
||||
B_SCR_NAME_WITH_PREFIX2 = FD 41
|
||||
|
||||
@ indicates the end of a town/city name (before " TOWN" or " CITY")
|
||||
NAME_END = FC 00
|
||||
|
||||
@@ -1,22 +1,16 @@
|
||||
#include "config/battle.h"
|
||||
#include "constants/moves.h"
|
||||
#include "constants/battle.h"
|
||||
#include "constants/battle_script_commands.h"
|
||||
#include "constants/battle_anim.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/abilities.h"
|
||||
#include "constants/species.h"
|
||||
#include "constants/pokemon.h"
|
||||
#include "constants/battle_string_ids.h"
|
||||
#include "constants/moves.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/game_stat.h"
|
||||
#include "constants/battle_string_ids.h"
|
||||
.include "asm/macros.inc"
|
||||
.include "asm/macros/battle_script.inc"
|
||||
@ Define these here since misc_constants.inc conflicts with the C headers
|
||||
.set NULL, 0
|
||||
.set FALSE, 0
|
||||
.set TRUE, 1
|
||||
.include "constants/constants.inc"
|
||||
|
||||
.section script_data, "aw", %progbits
|
||||
.align 2
|
||||
|
||||
@ pokefirered leftovers
|
||||
BattleScript_OldMan_Pokedude_CaughtMessage::
|
||||
@@ -97,7 +91,7 @@ BattleScript_UseItemMessage:
|
||||
return
|
||||
|
||||
BattleScript_ItemRestoreHPRet:
|
||||
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
|
||||
clearmoveresultflags MOVE_RESULT_NO_EFFECT
|
||||
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
|
||||
healthbarupdate BS_SCRIPTING
|
||||
datahpupdate BS_SCRIPTING
|
||||
@@ -118,7 +112,7 @@ BattleScript_ItemRestoreHPEnd:
|
||||
|
||||
BattleScript_ItemRestoreHP_Party::
|
||||
jumpifbyte CMP_EQUAL, gBattleCommunication, TRUE, BattleScript_ItemRestoreHP_SendOutRevivedBattler
|
||||
bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT
|
||||
clearmoveresultflags MOVE_RESULT_NO_EFFECT
|
||||
printstring STRINGID_ITEMRESTOREDSPECIESHEALTH
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
return
|
||||
|
||||
@@ -1110,7 +1110,6 @@ extern u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT];
|
||||
extern u32 gSideStatuses[NUM_BATTLE_SIDES];
|
||||
extern u32 gHitMarker;
|
||||
extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT];
|
||||
extern u16 gMoveResultFlags;
|
||||
extern u8 gCurrentActionFuncId;
|
||||
extern u8 gCurrMovePos;
|
||||
extern u8 gChosenMovePos;
|
||||
|
||||
@@ -298,9 +298,9 @@ extern const u8 gText_BattleTowerBan_Is2[];
|
||||
|
||||
extern const u8 gText_StatSharply[];
|
||||
extern const u8 gText_StatRose[];
|
||||
extern const u8 sText_StatFell[];
|
||||
extern const u8 sText_drastically[];
|
||||
extern const u8 sText_severely[];
|
||||
extern const u8 gText_StatFell[];
|
||||
extern const u8 gText_drastically[];
|
||||
extern const u8 gText_severely[];
|
||||
|
||||
// battle_script_commands
|
||||
extern const u8 gText_BattleYesNoChoice[];
|
||||
|
||||
@@ -1129,4 +1129,8 @@
|
||||
#undef P_FAMILY_PECHARUNT
|
||||
#define P_FAMILY_PECHARUNT TRUE
|
||||
|
||||
// Flags
|
||||
#undef B_FLAG_SLEEP_CLAUSE
|
||||
#define B_FLAG_SLEEP_CLAUSE FLAG_SPECIAL_FLAG_UNUSED_0x4003
|
||||
|
||||
#endif // GUARD_CONFIG_TEST_H
|
||||
|
||||
@@ -1535,6 +1535,9 @@
|
||||
#define SPECIAL_FLAGS_START 0x4000
|
||||
#define FLAG_DONT_SHOW_MAP_NAME_POPUP (SPECIAL_FLAGS_START + 0x0)
|
||||
#define FLAG_DONT_TRANSITION_MUSIC (SPECIAL_FLAGS_START + 0x1)
|
||||
#define FLAG_SPECIAL_FLAG_UNUSED_0x4002 (SPECIAL_FLAGS_START + 0x2) // Unused Flag
|
||||
#define FLAG_SPECIAL_FLAG_UNUSED_0x4003 (SPECIAL_FLAGS_START + 0x3) // Unused Flag
|
||||
#define FLAG_SPECIAL_FLAG_UNUSED_0x4004 (SPECIAL_FLAGS_START + 0x4) // Unused Flag
|
||||
#define FLAG_SAFE_FOLLOWER_MOVEMENT (SPECIAL_FLAGS_START + 0x5) // When set, applymovement does not put the follower inside a pokeball
|
||||
// FLAG_SPECIAL_FLAG_0x4002 - 0x407F also exist and are unused
|
||||
#define SPECIAL_FLAGS_END (SPECIAL_FLAGS_START + 0x7F)
|
||||
|
||||
@@ -12,7 +12,7 @@ typedef u32 uq4_12_t;
|
||||
|
||||
// Converts a number to Q4.12 fixed-point format
|
||||
#define Q_4_12(n) ((q4_12_t)((n) * 4096))
|
||||
#define UQ_4_12(n) ((uq4_12_t)((n) * 4096))
|
||||
#define UQ_4_12(n) ((uq4_12_t)((n) * 4096 + 0.5))
|
||||
#define UQ_4_12_FLOORED(n) ((uq4_12_t)((n) * 4096))
|
||||
|
||||
// Converts a number to Q24.8 fixed-point format
|
||||
|
||||
@@ -625,6 +625,7 @@ void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot);
|
||||
void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon);
|
||||
u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove);
|
||||
u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove);
|
||||
void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv);
|
||||
void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move);
|
||||
u32 GetMonAffectionHearts(struct Pokemon *pokemon);
|
||||
void UpdateMonPersonality(struct BoxPokemon *boxMon, u32 personality);
|
||||
|
||||
@@ -29,6 +29,7 @@ void PlayCry_NormalNoDucking(u16 species, s8 pan, s8 volume, u8 priority);
|
||||
void PlayCry_ByMode(u16 species, s8 pan, u8 mode);
|
||||
void PlayCry_ReleaseDouble(u16 species, s8 pan, u8 mode);
|
||||
void PlayCry_Script(u16 species, u8 mode);
|
||||
void PlayCry_DuckNoRestore(u16 species, s8 pan, u8 mode);
|
||||
void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode);
|
||||
bool8 IsCryFinished(void);
|
||||
void StopCryAndClearCrySongs(void);
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
*
|
||||
* ASSUMPTIONS
|
||||
* {
|
||||
* ASSUME(gMovesInfo[MOVE_STUN_SPORE].effect == EFFECT_PARALYZE);
|
||||
* ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_PARALYZE);
|
||||
* }
|
||||
*
|
||||
* SINGLE_BATTLE_TEST("Stun Spore inflicts paralysis")
|
||||
@@ -87,7 +87,7 @@
|
||||
* SINGLE_BATTLE_TEST("Stun Spore does not affect Grass-types")
|
||||
* {
|
||||
* GIVEN {
|
||||
* ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove);
|
||||
* ASSUME(IsPowderMove(MOVE_STUN_SPORE));
|
||||
* ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS);
|
||||
* PLAYER(SPECIES_ODDISH); // 1.
|
||||
* OPPONENT(SPECIES_ODDISH); // 2.
|
||||
@@ -129,7 +129,7 @@
|
||||
* PARAMETRIZE { raiseAttack = FALSE; }
|
||||
* PARAMETRIZE { raiseAttack = TRUE; }
|
||||
* GIVEN {
|
||||
* ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
* ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
* PLAYER(SPECIES_WOBBUFFET);
|
||||
* OPPONENT(SPECIES_WOBBUFFET);
|
||||
* } WHEN {
|
||||
@@ -176,7 +176,7 @@
|
||||
* Pokémon we can observe the damage of a physical attack with and
|
||||
* without the burn. To document that this test assumes the attack is
|
||||
* physical we can use:
|
||||
* ASSUME(gMovesInfo[MOVE_WHATEVER].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
* ASSUME(GetMoveCategory(MOVE_WHATEVER) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
*
|
||||
* ASSUMPTIONS
|
||||
* Should be placed immediately after any #includes and contain any
|
||||
@@ -186,7 +186,7 @@
|
||||
* move_effect_poison_hit.c should be:
|
||||
* ASSUMPTIONS
|
||||
* {
|
||||
* ASSUME(gMovesInfo[MOVE_POISON_STING].effect == EFFECT_POISON_HIT);
|
||||
* ASSUME(GetMoveEffect(MOVE_POISON_STING) == EFFECT_POISON_HIT);
|
||||
* }
|
||||
*
|
||||
* SINGLE_BATTLE_TEST(name, results...) and DOUBLE_BATTLE_TEST(name, results...)
|
||||
@@ -228,7 +228,7 @@
|
||||
* PARAMETRIZE { hp = 99; }
|
||||
* PARAMETRIZE { hp = 33; }
|
||||
* GIVEN {
|
||||
* ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE);
|
||||
* ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE);
|
||||
* PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); MaxHP(99); HP(hp); }
|
||||
* OPPONENT(SPECIES_WOBBUFFET);
|
||||
* } WHEN {
|
||||
@@ -265,7 +265,7 @@
|
||||
*
|
||||
* If the tag is not provided, runs the test 50 times and computes an
|
||||
* approximate pass ratio.
|
||||
* PASSES_RANDOMLY(gMovesInfo[move].accuracy, 100);
|
||||
* PASSES_RANDOMLY(GetMoveAccuracy(move), 100);
|
||||
* Note that this mode of PASSES_RANDOMLY makes the tests run very
|
||||
* slowly and should be avoided where possible. If the mechanic you are
|
||||
* testing is missing its tag, you should add it.
|
||||
@@ -287,6 +287,16 @@
|
||||
* GIVEN {
|
||||
* FLAG_SET(FLAG_SYS_EXAMPLE_FLAG);
|
||||
*
|
||||
* WITH_CONFIG(configTag, value)
|
||||
* Runs the test with a specified config override. `configTag` must be
|
||||
* of `enum GenConfigTag`
|
||||
* Example:
|
||||
* GIVEN {
|
||||
* WITH_CONFIG(GEN_CONFIG_GALE_WINGS, GEN_6);
|
||||
* }
|
||||
* The `value` may be inferred from a local variable, e.g. set by
|
||||
* PARAMETRIZE.
|
||||
*
|
||||
* PLAYER(species) and OPPONENT(species)
|
||||
* Adds the species to the player's or opponent's party respectively.
|
||||
* The Pokémon can be further customized with the following functions:
|
||||
@@ -488,6 +498,7 @@
|
||||
#include "battle.h"
|
||||
#include "battle_anim.h"
|
||||
#include "data.h"
|
||||
#include "generational_changes.h"
|
||||
#include "item.h"
|
||||
#include "random.h"
|
||||
#include "recorded_battle.h"
|
||||
@@ -682,6 +693,7 @@ struct BattleTestData
|
||||
|
||||
struct RecordedBattleSave recordedBattle;
|
||||
u8 battleRecordTypes[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE];
|
||||
u8 battleRecordTurnNumbers[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE];
|
||||
u8 battleRecordSourceLineOffsets[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE];
|
||||
u16 recordIndexes[MAX_BATTLERS_COUNT];
|
||||
struct BattlerTurn battleRecordTurns[MAX_TURNS][MAX_BATTLERS_COUNT];
|
||||
@@ -715,6 +727,7 @@ struct BattleTestRunnerState
|
||||
u16 observedRatio;
|
||||
u16 trialRatio;
|
||||
bool8 runRandomly:1;
|
||||
bool8 didRunRandomly:1;
|
||||
bool8 runGiven:1;
|
||||
bool8 runWhen:1;
|
||||
bool8 runScene:1;
|
||||
@@ -740,7 +753,7 @@ extern struct BattleTestRunnerState *const gBattleTestRunnerState;
|
||||
/* Test */
|
||||
|
||||
#define TO_DO_BATTLE_TEST(_name) \
|
||||
TEST("TODO: " _name) \
|
||||
TEST(_name) \
|
||||
{ \
|
||||
TO_DO; \
|
||||
}
|
||||
@@ -820,6 +833,7 @@ struct moveWithPP {
|
||||
#define AI_LOG AILogScores(__LINE__)
|
||||
|
||||
#define FLAG_SET(flagId) SetFlagForTest(__LINE__, flagId)
|
||||
#define WITH_CONFIG(configTag, value) TestSetConfig(__LINE__, configTag, value)
|
||||
|
||||
#define PLAYER(species) for (OpenPokemon(__LINE__, B_SIDE_PLAYER, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__))
|
||||
#define OPPONENT(species) for (OpenPokemon(__LINE__, B_SIDE_OPPONENT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__))
|
||||
@@ -853,6 +867,7 @@ struct moveWithPP {
|
||||
#define Shadow(isShadow) Shadow_(__LINE__, shadow)
|
||||
|
||||
void SetFlagForTest(u32 sourceLine, u16 flagId);
|
||||
void TestSetConfig(u32 sourceLine, enum GenConfigTag configTag, u32 value);
|
||||
void ClearFlagAfterTest(void);
|
||||
void OpenPokemon(u32 sourceLine, u32 side, u32 species);
|
||||
void ClosePokemon(u32 sourceLine);
|
||||
|
||||
@@ -83,7 +83,7 @@ s32 Test_MgbaPrintf(const char *fmt, ...);
|
||||
|
||||
#define TEST(_name) \
|
||||
static void CAT(Test, __LINE__)(void); \
|
||||
__attribute__((section(".tests"))) static const struct Test CAT(sTest, __LINE__) = \
|
||||
__attribute__((section(".tests"), used)) static const struct Test CAT(sTest, __LINE__) = \
|
||||
{ \
|
||||
.name = _name, \
|
||||
.filename = __FILE__, \
|
||||
@@ -95,7 +95,7 @@ s32 Test_MgbaPrintf(const char *fmt, ...);
|
||||
|
||||
#define ASSUMPTIONS \
|
||||
static void Assumptions(void); \
|
||||
__attribute__((section(".tests"))) static const struct Test sAssumptions = \
|
||||
__attribute__((section(".tests"), used, no_reorder)) static const struct Test sAssumptions = \
|
||||
{ \
|
||||
.name = "ASSUMPTIONS: " __FILE__, \
|
||||
.filename = __FILE__, \
|
||||
|
||||
@@ -6675,6 +6675,79 @@ static void ReloadBattlerSprites(u32 battler, struct Pokemon *party)
|
||||
}
|
||||
}
|
||||
|
||||
static void TrySwapSkyDropTargets(u32 battlerAtk, u32 battlerPartner)
|
||||
{
|
||||
u32 i, temp;
|
||||
|
||||
// battlerAtk is using Ally Switch
|
||||
// check if our partner is the target of sky drop
|
||||
// If so, change that index to battlerAtk
|
||||
for (i = 0; i < gBattlersCount; i++) {
|
||||
if (gBattleStruct->skyDropTargets[i] == battlerPartner) {
|
||||
gBattleStruct->skyDropTargets[i] = battlerAtk;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Then swap our own sky drop targets with the partner in case our partner is mid-skydrop
|
||||
SWAP(gBattleStruct->skyDropTargets[battlerAtk], gBattleStruct->skyDropTargets[battlerPartner], temp);
|
||||
}
|
||||
|
||||
#define TRY_SIDE_TIMER_BATTLER_ID_SWAP(battlerAtk, battlerPartner, side, field) \
|
||||
if (gSideTimers[side].field == battlerAtk) \
|
||||
gSideTimers[side].field = battlerPartner; \
|
||||
else if (gSideTimers[side].field == battlerPartner) \
|
||||
gSideTimers[side].field = battlerAtk;
|
||||
|
||||
static void TrySwapStickyWebBattlerId(u32 battlerAtk, u32 battlerPartner)
|
||||
{
|
||||
u32 atkSide = GetBattlerSide(battlerAtk);
|
||||
u32 oppSide = GetBattlerSide(BATTLE_OPPOSITE(battlerAtk));
|
||||
|
||||
// not all of these are needed to be swapped, but are done so to be robust to anything in the future that might care about them
|
||||
TRY_SIDE_TIMER_BATTLER_ID_SWAP(battlerAtk, battlerPartner, atkSide, reflectBattlerId);
|
||||
TRY_SIDE_TIMER_BATTLER_ID_SWAP(battlerAtk, battlerPartner, atkSide, lightscreenBattlerId);
|
||||
TRY_SIDE_TIMER_BATTLER_ID_SWAP(battlerAtk, battlerPartner, atkSide, mistBattlerId);
|
||||
TRY_SIDE_TIMER_BATTLER_ID_SWAP(battlerAtk, battlerPartner, atkSide, safeguardBattlerId);
|
||||
TRY_SIDE_TIMER_BATTLER_ID_SWAP(battlerAtk, battlerPartner, atkSide, auroraVeilBattlerId);
|
||||
TRY_SIDE_TIMER_BATTLER_ID_SWAP(battlerAtk, battlerPartner, atkSide, tailwindBattlerId);
|
||||
TRY_SIDE_TIMER_BATTLER_ID_SWAP(battlerAtk, battlerPartner, atkSide, luckyChantBattlerId);
|
||||
|
||||
// if we've set sticky web on the opposing side, need to swap stickyWebBattlerId for mirror armor
|
||||
TRY_SIDE_TIMER_BATTLER_ID_SWAP(battlerAtk, battlerPartner, oppSide, stickyWebBattlerId);
|
||||
}
|
||||
#undef TRY_SIDE_TIMER_BATTLER_ID_SWAP
|
||||
|
||||
static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner)
|
||||
{
|
||||
u32 i, temp;
|
||||
u32 oppSide = GetBattlerSide(BATTLE_OPPOSITE(battlerAtk));
|
||||
|
||||
// if used future sight on opposing side, properly track who used it
|
||||
if (gSideStatuses[oppSide] & SIDE_STATUS_FUTUREATTACK) {
|
||||
for (i = 0; i < gBattlersCount; i++) {
|
||||
if (IsAlly(i,battlerAtk))
|
||||
continue; // only on opposing side
|
||||
if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerAtk) {
|
||||
// if target was attacked with future sight from us, now they'll be the partner slot
|
||||
gWishFutureKnock.futureSightBattlerIndex[i] = battlerPartner;
|
||||
gWishFutureKnock.futureSightPartyIndex[i] = gBattlerPartyIndexes[battlerPartner];
|
||||
break;
|
||||
} else if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerPartner) {
|
||||
gWishFutureKnock.futureSightBattlerIndex[i] = battlerAtk;
|
||||
gWishFutureKnock.futureSightPartyIndex[i] = gBattlerPartyIndexes[battlerAtk];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// swap wish party indices
|
||||
if (gWishFutureKnock.wishCounter[battlerAtk] > 0
|
||||
|| gWishFutureKnock.wishCounter[battlerPartner] > 0) {
|
||||
SWAP(gWishFutureKnock.wishPartyId[battlerAtk], gWishFutureKnock.wishPartyId[battlerPartner], temp);
|
||||
}
|
||||
}
|
||||
|
||||
static void AnimTask_AllySwitchDataSwap(u8 taskId)
|
||||
{
|
||||
s32 i, j;
|
||||
@@ -6694,6 +6767,7 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId)
|
||||
SwapStructData(&gSpecialStatuses[battlerAtk], &gSpecialStatuses[battlerPartner], data, sizeof(struct SpecialStatus));
|
||||
SwapStructData(&gProtectStructs[battlerAtk], &gProtectStructs[battlerPartner], data, sizeof(struct ProtectStruct));
|
||||
SwapStructData(&gBattleSpritesDataPtr->battlerData[battlerAtk], &gBattleSpritesDataPtr->battlerData[battlerPartner], data, sizeof(struct BattleSpriteInfo));
|
||||
SwapStructData(&gBattleStruct->illusion[battlerAtk], &gBattleStruct->illusion[battlerPartner], data, sizeof(struct Illusion));
|
||||
|
||||
SWAP(gBattleSpritesDataPtr->battlerData[battlerAtk].invisible, gBattleSpritesDataPtr->battlerData[battlerPartner].invisible, temp);
|
||||
SWAP(gTransformedPersonalities[battlerAtk], gTransformedPersonalities[battlerPartner], temp);
|
||||
@@ -6717,6 +6791,7 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId)
|
||||
break;
|
||||
}
|
||||
SWAP(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], temp);
|
||||
SWAP(gActionsByTurnOrder[i], gActionsByTurnOrder[j], temp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -6725,6 +6800,10 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId)
|
||||
SwitchTwoBattlersInParty(battlerAtk, battlerPartner);
|
||||
SWAP(gBattlerPartyIndexes[battlerAtk], gBattlerPartyIndexes[battlerPartner], temp);
|
||||
|
||||
TrySwapSkyDropTargets(battlerAtk, battlerPartner);
|
||||
TrySwapStickyWebBattlerId(battlerAtk, battlerPartner);
|
||||
TrySwapWishBattlerIds(battlerAtk, battlerPartner);
|
||||
|
||||
// For Snipe Shot and abilities Stalwart/Propeller Tail - keep the original target.
|
||||
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
|
||||
{
|
||||
|
||||
@@ -243,39 +243,59 @@ void SoundTask_PlayNormalCry(u8 taskId)
|
||||
#define tSpecies data[1]
|
||||
#define tPan data[2]
|
||||
#define tState data[9]
|
||||
#define tLastCry data[10] // If it's not the last cry, don't try to restore the BGM, because another is coming
|
||||
|
||||
void SoundTask_PlayCryWithEcho(u8 taskId)
|
||||
{
|
||||
u16 species;
|
||||
s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
|
||||
s8 pan;
|
||||
|
||||
gTasks[taskId].tLastCry = gBattleAnimArgs[0];
|
||||
pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
|
||||
|
||||
species = (GetIllusionMonSpecies(gBattleAnimAttacker) != SPECIES_NONE) ? GetIllusionMonSpecies(gBattleAnimAttacker) : gAnimBattlerSpecies[gBattleAnimAttacker];
|
||||
|
||||
gTasks[taskId].tSpecies = species;
|
||||
gTasks[taskId].tPan = pan;
|
||||
|
||||
if (species != SPECIES_NONE)
|
||||
{
|
||||
PlayCry_ByMode(species, pan, CRY_MODE_ECHO_START);
|
||||
gTasks[taskId].func = SoundTask_PlayCryWithEcho_Step;
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void SoundTask_PlayCryWithEcho_Step(u8 taskId)
|
||||
{
|
||||
u16 species = gTasks[taskId].tSpecies;
|
||||
s8 pan = gTasks[taskId].tPan;
|
||||
|
||||
if (gTasks[taskId].tState < 2)
|
||||
// Note the cases are not in order of execution
|
||||
switch (gTasks[taskId].tState)
|
||||
{
|
||||
case 2:
|
||||
PlayCry_DuckNoRestore(species, pan, CRY_MODE_ECHO_START);
|
||||
gTasks[taskId].tState++;
|
||||
}
|
||||
else if (!IsCryPlaying())
|
||||
{
|
||||
u16 species = gTasks[taskId].tSpecies;
|
||||
s8 pan = gTasks[taskId].tPan;
|
||||
|
||||
PlayCry_ByMode(species, pan, CRY_MODE_ECHO_END);
|
||||
break;
|
||||
case 1:
|
||||
case 3:
|
||||
case 4:
|
||||
gTasks[taskId].tState++;
|
||||
break;
|
||||
case 5:
|
||||
if (IsCryPlaying())
|
||||
break;
|
||||
case 0:
|
||||
StopCryAndClearCrySongs();
|
||||
gTasks[taskId].tState++;
|
||||
break;
|
||||
default:
|
||||
if (!gTasks[taskId].tLastCry)
|
||||
PlayCry_DuckNoRestore(species, pan, CRY_MODE_ECHO_END);
|
||||
else
|
||||
PlayCry_ByMode(species, pan, CRY_MODE_ECHO_END);
|
||||
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ bool32 IsGimmickSelected(u32 battler, enum Gimmick gimmick)
|
||||
{
|
||||
// There's no player select in tests, but some gimmicks need to test choice before they are fully activated.
|
||||
if (TESTING)
|
||||
return (gBattleStruct->gimmick.toActivate & gBitTable[battler]) && gBattleStruct->gimmick.usableGimmick[battler] == gimmick;
|
||||
return (gBattleStruct->gimmick.toActivate & (1u << battler)) && gBattleStruct->gimmick.usableGimmick[battler] == gimmick;
|
||||
else
|
||||
return gBattleStruct->gimmick.usableGimmick[battler] == gimmick && gBattleStruct->gimmick.playerSelect;
|
||||
}
|
||||
@@ -65,9 +65,6 @@ enum Gimmick GetActiveGimmick(u32 battler)
|
||||
// Returns whether a trainer mon is intended to use an unrestrictive gimmick via .useGimmick (i.e Tera).
|
||||
bool32 ShouldTrainerBattlerUseGimmick(u32 battler, enum Gimmick gimmick)
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)
|
||||
return FALSE;
|
||||
|
||||
// There are no trainer party settings in battles, but the AI needs to know which gimmick to use.
|
||||
if (TESTING)
|
||||
{
|
||||
@@ -99,10 +96,10 @@ bool32 ShouldTrainerBattlerUseGimmick(u32 battler, enum Gimmick gimmick)
|
||||
bool32 HasTrainerUsedGimmick(u32 battler, enum Gimmick gimmick)
|
||||
{
|
||||
// Check whether partner battler has used gimmick or plans to during turn.
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
|
||||
if (IsDoubleBattle()
|
||||
&& IsPartnerMonFromSameTrainer(battler)
|
||||
&& (gBattleStruct->gimmick.activated[BATTLE_PARTNER(battler)][gimmick]
|
||||
|| ((gBattleStruct->gimmick.toActivate & gBitTable[BATTLE_PARTNER(battler)]
|
||||
|| ((gBattleStruct->gimmick.toActivate & (1u << BATTLE_PARTNER(battler))
|
||||
&& gBattleStruct->gimmick.usableGimmick[BATTLE_PARTNER(battler)] == gimmick))))
|
||||
{
|
||||
return TRUE;
|
||||
@@ -118,7 +115,7 @@ bool32 HasTrainerUsedGimmick(u32 battler, enum Gimmick gimmick)
|
||||
void SetGimmickAsActivated(u32 battler, enum Gimmick gimmick)
|
||||
{
|
||||
gBattleStruct->gimmick.activated[battler][gimmick] = TRUE;
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && IsPartnerMonFromSameTrainer(battler))
|
||||
if (IsDoubleBattle() && IsPartnerMonFromSameTrainer(battler))
|
||||
gBattleStruct->gimmick.activated[BATTLE_PARTNER(battler)][gimmick] = TRUE;
|
||||
}
|
||||
|
||||
@@ -147,7 +144,8 @@ void CreateGimmickTriggerSprite(u32 battler)
|
||||
// Exit if there shouldn't be a sprite produced.
|
||||
if (GetBattlerSide(battler) == B_SIDE_OPPONENT
|
||||
|| gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_NONE
|
||||
|| gimmick->triggerSheet == NULL)
|
||||
|| gimmick->triggerSheet == NULL
|
||||
|| HasTrainerUsedGimmick(battler, gBattleStruct->gimmick.usableGimmick[battler]))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -158,7 +156,7 @@ void CreateGimmickTriggerSprite(u32 battler)
|
||||
|
||||
if (gBattleStruct->gimmick.triggerSpriteId == 0xFF)
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
|
||||
if (IsDoubleBattle())
|
||||
gBattleStruct->gimmick.triggerSpriteId = CreateSprite(gimmick->triggerTemplate,
|
||||
gSprites[gHealthboxSpriteIds[battler]].x - DOUBLES_GIMMICK_TRIGGER_POS_X_SLIDE,
|
||||
gSprites[gHealthboxSpriteIds[battler]].y - DOUBLES_GIMMICK_TRIGGER_POS_Y_DIFF, 0);
|
||||
@@ -207,7 +205,7 @@ static void SpriteCb_GimmickTrigger(struct Sprite *sprite)
|
||||
s32 xSlide, xPriority, xOptimal;
|
||||
s32 yDiff;
|
||||
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
|
||||
if (IsDoubleBattle())
|
||||
{
|
||||
xSlide = DOUBLES_GIMMICK_TRIGGER_POS_X_SLIDE;
|
||||
xPriority = DOUBLES_GIMMICK_TRIGGER_POS_X_PRIORITY;
|
||||
|
||||
@@ -163,7 +163,6 @@ EWRAM_DATA u16 gLastResultingMoves[MAX_BATTLERS_COUNT] = {0};
|
||||
EWRAM_DATA u16 gLockedMoves[MAX_BATTLERS_COUNT] = {0};
|
||||
EWRAM_DATA u8 gLastHitBy[MAX_BATTLERS_COUNT] = {0};
|
||||
EWRAM_DATA u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT] = {0};
|
||||
EWRAM_DATA u16 gMoveResultFlags = 0;
|
||||
EWRAM_DATA u32 gHitMarker = 0;
|
||||
EWRAM_DATA u32 gSideStatuses[NUM_BATTLE_SIDES] = {0};
|
||||
EWRAM_DATA struct SideTimer gSideTimers[NUM_BATTLE_SIDES] = {0};
|
||||
@@ -1742,7 +1741,9 @@ void ModifyPersonalityForNature(u32 *personality, u32 newNature)
|
||||
u32 GeneratePersonalityForGender(u32 gender, u32 species)
|
||||
{
|
||||
const struct SpeciesInfo *speciesInfo = &gSpeciesInfo[species];
|
||||
if (gender == MON_MALE)
|
||||
if (gender == MON_GENDERLESS)
|
||||
return 0;
|
||||
else if (gender == MON_MALE)
|
||||
return ((255 - speciesInfo->genderRatio) / 2) + speciesInfo->genderRatio;
|
||||
else
|
||||
return speciesInfo->genderRatio / 2;
|
||||
@@ -1766,8 +1767,9 @@ void CustomTrainerPartyAssignMoves(struct Pokemon *mon, const struct TrainerMon
|
||||
|
||||
for (j = 0; j < MAX_MON_MOVES; ++j)
|
||||
{
|
||||
u32 pp = GetMovePP(partyEntry->moves[j]);
|
||||
SetMonData(mon, MON_DATA_MOVE1 + j, &partyEntry->moves[j]);
|
||||
SetMonData(mon, MON_DATA_PP1 + j, &gMovesInfo[partyEntry->moves[j]].pp);
|
||||
SetMonData(mon, MON_DATA_PP1 + j, &pp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3336,7 +3338,7 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
u32 side = GetBattlerSide(i);
|
||||
u32 partyIndex = gBattlerPartyIndexes[i];
|
||||
if (TestRunner_Battle_GetForcedAbility(side, partyIndex))
|
||||
gBattleMons[i].ability = gBattleStruct->overwrittenAbilities[i] = TestRunner_Battle_GetForcedAbility(side, partyIndex);
|
||||
gBattleMons[i].ability = gDisableStructs[i].overwrittenAbility = TestRunner_Battle_GetForcedAbility(side, partyIndex);
|
||||
}
|
||||
}
|
||||
#endif // TESTING
|
||||
@@ -3404,11 +3406,11 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
case FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES:
|
||||
while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest
|
||||
{
|
||||
gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++];
|
||||
i = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++];
|
||||
|
||||
if (TryPrimalReversion(gBattlerAttacker))
|
||||
if (TryPrimalReversion(i))
|
||||
return;
|
||||
if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattlerAttacker, 0, 0, 0) != 0)
|
||||
if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, 0, 0, 0) != 0)
|
||||
return;
|
||||
}
|
||||
gBattleStruct->switchInBattlerCounter = 0;
|
||||
@@ -3422,7 +3424,7 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
case FIRST_TURN_EVENTS_ITEM_EFFECTS:
|
||||
while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest
|
||||
{
|
||||
if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++], FALSE))
|
||||
if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN, gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++], FALSE))
|
||||
return;
|
||||
}
|
||||
gBattleStruct->switchInBattlerCounter = 0;
|
||||
@@ -3466,7 +3468,6 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
gBattleScripting.moveendState = 0;
|
||||
gBattleStruct->faintedActionsState = 0;
|
||||
gBattleStruct->turnCountersTracker = 0;
|
||||
gMoveResultFlags = 0;
|
||||
|
||||
memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts));
|
||||
SetShellSideArmCategory();
|
||||
@@ -3499,7 +3500,6 @@ static void HandleEndTurn_ContinueBattle(void)
|
||||
gBattleStruct->wishPerishSongState = 0;
|
||||
gBattleStruct->wishPerishSongBattlerId = 0;
|
||||
gBattleStruct->turnCountersTracker = 0;
|
||||
gMoveResultFlags = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3531,8 +3531,6 @@ void BattleTurnPassed(void)
|
||||
gBattleScripting.animTurn = 0;
|
||||
gBattleScripting.animTargetsHit = 0;
|
||||
gBattleScripting.moveendState = 0;
|
||||
gBattleMoveDamage = 0;
|
||||
gMoveResultFlags = 0;
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
gBattleCommunication[i] = 0;
|
||||
@@ -4645,7 +4643,11 @@ static void TurnValuesCleanUp(bool8 var0)
|
||||
gSideTimers[B_SIDE_OPPONENT].followmeTimer = 0;
|
||||
|
||||
gBattleStruct->usedEjectItem = 0;
|
||||
gBattleStruct->pursuitTarget = 0;
|
||||
gBattleStruct->pursuitSwitchByMove = FALSE;
|
||||
gBattleStruct->pursuitStoredSwitch = 0;
|
||||
gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceller
|
||||
ClearDamageCalcResults();
|
||||
}
|
||||
|
||||
void SpecialStatusesClear(void)
|
||||
@@ -4660,11 +4662,26 @@ static void PopulateArrayWithBattlers(u8 *battlers)
|
||||
battlers[i] = i;
|
||||
}
|
||||
|
||||
static bool32 TryActivateGimmick(u32 battler)
|
||||
{
|
||||
if ((gBattleStruct->gimmick.toActivate & (1u << battler)) && !(gProtectStructs[battler].noValidMoves))
|
||||
{
|
||||
gBattlerAttacker = gBattleScripting.battler = battler;
|
||||
gBattleStruct->gimmick.toActivate &= ~(1u << battler);
|
||||
if (gGimmicksInfo[gBattleStruct->gimmick.usableGimmick[battler]].ActivateGimmick != NULL)
|
||||
{
|
||||
gGimmicksInfo[gBattleStruct->gimmick.usableGimmick[battler]].ActivateGimmick(battler);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool32 TryDoGimmicksBeforeMoves(void)
|
||||
{
|
||||
if (!(gHitMarker & HITMARKER_RUN) && gBattleStruct->gimmick.toActivate)
|
||||
{
|
||||
u32 i, battler;
|
||||
u32 i;
|
||||
u8 order[MAX_BATTLERS_COUNT];
|
||||
|
||||
PopulateArrayWithBattlers(order);
|
||||
@@ -4672,16 +4689,8 @@ static bool32 TryDoGimmicksBeforeMoves(void)
|
||||
for (i = 0; i < gBattlersCount; i++)
|
||||
{
|
||||
// Search through each battler and activate their gimmick if they have one prepared.
|
||||
if ((gBattleStruct->gimmick.toActivate & (1u << order[i])) && !(gProtectStructs[order[i]].noValidMoves))
|
||||
{
|
||||
battler = gBattlerAttacker = gBattleScripting.battler = order[i];
|
||||
gBattleStruct->gimmick.toActivate &= ~(1u << battler);
|
||||
if (gGimmicksInfo[gBattleStruct->gimmick.usableGimmick[battler]].ActivateGimmick != NULL)
|
||||
{
|
||||
gGimmicksInfo[gBattleStruct->gimmick.usableGimmick[battler]].ActivateGimmick(battler);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
if (TryActivateGimmick(order[i]))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4708,7 +4717,7 @@ static bool32 TryDoMoveEffectsBeforeMoves(void)
|
||||
{
|
||||
gBattleStruct->focusPunchBattlers |= 1u << battlers[i];
|
||||
gBattlerAttacker = battlers[i];
|
||||
switch (gMovesInfo[gChosenMoveByBattler[gBattlerAttacker]].effect)
|
||||
switch (GetMoveEffect(gChosenMoveByBattler[gBattlerAttacker]))
|
||||
{
|
||||
case EFFECT_FOCUS_PUNCH:
|
||||
BattleScriptExecute(BattleScript_FocusPunchSetUp);
|
||||
@@ -4731,7 +4740,7 @@ static bool32 TryDoMoveEffectsBeforeMoves(void)
|
||||
static void TryChangeTurnOrder(void)
|
||||
{
|
||||
u32 i, j;
|
||||
for (i = 0; i < gBattlersCount - 1; i++)
|
||||
for (i = gCurrentTurnActionNumber; i < gBattlersCount - 1; i++)
|
||||
{
|
||||
for (j = i + 1; j < gBattlersCount; j++)
|
||||
{
|
||||
@@ -4849,11 +4858,19 @@ static void RunTurnActionsFunctions(void)
|
||||
// Mega Evolve / Focus Punch-like moves after switching, items, running, but before using a move.
|
||||
if (gCurrentActionFuncId == B_ACTION_USE_MOVE && !gBattleStruct->effectsBeforeUsingMoveDone)
|
||||
{
|
||||
if (TryDoGimmicksBeforeMoves())
|
||||
return;
|
||||
else if (TryDoMoveEffectsBeforeMoves())
|
||||
return;
|
||||
gBattleStruct->effectsBeforeUsingMoveDone = TRUE;
|
||||
if (!gBattleStruct->pursuitTarget)
|
||||
{
|
||||
if (TryDoGimmicksBeforeMoves())
|
||||
return;
|
||||
else if (TryDoMoveEffectsBeforeMoves())
|
||||
return;
|
||||
gBattleStruct->effectsBeforeUsingMoveDone = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (TryActivateGimmick(gBattlerByTurnOrder[gCurrentTurnActionNumber]))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
*(&gBattleStruct->savedTurnActionNumber) = gCurrentTurnActionNumber;
|
||||
@@ -5036,7 +5053,7 @@ static void HandleEndTurn_FinishBattle(void)
|
||||
bool8 changedForm = FALSE;
|
||||
|
||||
// Appeared in battle and didn't faint
|
||||
if ((gBattleStruct->appearedInBattle & gBitTable[i]) && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0)
|
||||
if ((gBattleStruct->appearedInBattle & (1u << i)) && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0)
|
||||
changedForm = TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE_TERRAIN);
|
||||
|
||||
if (!changedForm)
|
||||
@@ -5091,6 +5108,7 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void)
|
||||
else
|
||||
{
|
||||
gBattleMainFunc = ReturnFromBattleToOverworld;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5105,8 +5123,8 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void)
|
||||
}
|
||||
ResetDynamicAiFunc();
|
||||
FreeMonSpritesGfx();
|
||||
FreeBattleSpritesData();
|
||||
FreeBattleResources();
|
||||
FreeBattleSpritesData();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5210,7 +5228,7 @@ bool32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility)
|
||||
{
|
||||
u32 ateType;
|
||||
|
||||
switch (gMovesInfo[move].effect)
|
||||
switch (GetMoveEffect(move))
|
||||
{
|
||||
case EFFECT_TERA_BLAST:
|
||||
if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA)
|
||||
@@ -5478,7 +5496,6 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost)
|
||||
return TYPE_NONE;
|
||||
}
|
||||
|
||||
|
||||
void SetTypeBeforeUsingMove(u32 move, u32 battler)
|
||||
{
|
||||
u32 moveType;
|
||||
@@ -5496,13 +5513,13 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler)
|
||||
if (moveType != TYPE_NONE)
|
||||
gBattleStruct->dynamicMoveType = moveType | F_DYNAMIC_TYPE_SET;
|
||||
|
||||
moveType = GetMoveType(move);
|
||||
moveType = GetBattleMoveType(move);
|
||||
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.
|
||||
if (holdEffect == HOLD_EFFECT_GEMS && GetMoveType(move) == ItemId_GetSecondaryId(heldItem))
|
||||
if (holdEffect == HOLD_EFFECT_GEMS && GetBattleMoveType(move) == ItemId_GetSecondaryId(heldItem))
|
||||
{
|
||||
gSpecialStatuses[battler].gemParam = GetBattlerHoldEffectParam(battler);
|
||||
gSpecialStatuses[battler].gemBoost = TRUE;
|
||||
|
||||
@@ -78,29 +78,29 @@ static const u8 sText_PlayerWhiteout2[] = _("You panicked and dropped ¥{B_BUFF1
|
||||
#else
|
||||
static const u8 sText_PlayerWhiteout2[] = _("You were overwhelmed by your defeat!{PAUSE_UNTIL_PRESS}");
|
||||
#endif
|
||||
static const u8 sText_PreventsEscape[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} prevents escape with {B_SCR_ACTIVE_ABILITY}!\p");
|
||||
static const u8 sText_PreventsEscape[] = _("{B_SCR_NAME_WITH_PREFIX} prevents escape with {B_SCR_ACTIVE_ABILITY}!\p");
|
||||
static const u8 sText_CantEscape2[] = _("You couldn't get away!\p");
|
||||
static const u8 sText_AttackerCantEscape[] = _("{B_ATK_NAME_WITH_PREFIX} can't escape!");
|
||||
static const u8 sText_HitXTimes[] = _("The Pokémon was hit {B_BUFF1} time(s)!"); //SV has dynamic plural here
|
||||
static const u8 sText_PkmnFellAsleep[] = _("{B_EFF_NAME_WITH_PREFIX} fell asleep!");
|
||||
static const u8 sText_PkmnMadeSleep[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} made {B_EFF_NAME_WITH_PREFIX2} sleep!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnMadeSleep[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} made {B_EFF_NAME_WITH_PREFIX2} sleep!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnAlreadyAsleep[] = _("{B_DEF_NAME_WITH_PREFIX} is already asleep!");
|
||||
static const u8 sText_PkmnAlreadyAsleep2[] = _("{B_ATK_NAME_WITH_PREFIX} is already asleep!");
|
||||
static const u8 sText_PkmnWasntAffected[] = _("{B_DEF_NAME_WITH_PREFIX} wasn't affected!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnWasPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX} was poisoned!");
|
||||
static const u8 sText_PkmnPoisonedBy[] = _("{B_EFF_NAME_WITH_PREFIX} was poisoned by {B_SCR_ACTIVE_NAME_WITH_PREFIX2}'s {B_BUFF1}!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnPoisonedBy[] = _("{B_EFF_NAME_WITH_PREFIX} was poisoned by {B_SCR_NAME_WITH_PREFIX2}'s {B_BUFF1}!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnHurtByPoison[] = _("{B_ATK_NAME_WITH_PREFIX} was hurt by its poisoning!");
|
||||
static const u8 sText_PkmnAlreadyPoisoned[] = _("{B_DEF_NAME_WITH_PREFIX} is already poisoned!");
|
||||
static const u8 sText_PkmnBadlyPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX} was badly poisoned!");
|
||||
static const u8 sText_PkmnEnergyDrained[] = _("{B_DEF_NAME_WITH_PREFIX} had its energy drained!");
|
||||
static const u8 sText_PkmnWasBurned[] = _("{B_EFF_NAME_WITH_PREFIX} was burned!");
|
||||
static const u8 sText_PkmnGotFrostbite[] = _("{B_EFF_NAME_WITH_PREFIX} got frostbite!");
|
||||
static const u8 sText_PkmnBurnedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} burned {B_EFF_NAME_WITH_PREFIX2}!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnBurnedBy[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} burned {B_EFF_NAME_WITH_PREFIX2}!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnHurtByBurn[] = _("{B_ATK_NAME_WITH_PREFIX} was hurt by its burn!");
|
||||
static const u8 sText_PkmnHurtByFrostbite[] = _("{B_ATK_NAME_WITH_PREFIX} was hurt by its frostbite!");
|
||||
static const u8 sText_PkmnAlreadyHasBurn[] = _("{B_DEF_NAME_WITH_PREFIX} is already burned!");
|
||||
static const u8 sText_PkmnWasFrozen[] = _("{B_EFF_NAME_WITH_PREFIX} was frozen solid!");
|
||||
static const u8 sText_PkmnFrozenBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} froze {B_EFF_NAME_WITH_PREFIX2} solid!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnFrozenBy[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} froze {B_EFF_NAME_WITH_PREFIX2} solid!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnIsFrozen[] = _("{B_ATK_NAME_WITH_PREFIX} is frozen solid!");
|
||||
static const u8 sText_PkmnWasDefrosted[] = _("{B_DEF_NAME_WITH_PREFIX} thawed out!");
|
||||
static const u8 sText_PkmnWasDefrosted2[] = _("{B_ATK_NAME_WITH_PREFIX} thawed out!");
|
||||
@@ -109,7 +109,7 @@ static const u8 sText_PkmnFrostbiteHealed[] = _("{B_DEF_NAME_WITH_PREFIX}'s fros
|
||||
static const u8 sText_PkmnFrostbiteHealed2[] = _("{B_ATK_NAME_WITH_PREFIX}'s frostbite was cured!");
|
||||
static const u8 sText_PkmnFrostbiteHealedBy[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} cured its frostbite!");
|
||||
static const u8 sText_PkmnWasParalyzed[] = _("{B_EFF_NAME_WITH_PREFIX} is paralyzed, so it may be unable to move!");
|
||||
static const u8 sText_PkmnWasParalyzedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} paralyzed {B_EFF_NAME_WITH_PREFIX2}, so it may be unable to move!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnWasParalyzedBy[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} paralyzed {B_EFF_NAME_WITH_PREFIX2}, so it may be unable to move!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnIsParalyzed[] = _("{B_ATK_NAME_WITH_PREFIX} couldn't move because it's paralyzed!");
|
||||
static const u8 sText_PkmnIsAlreadyParalyzed[] = _("{B_DEF_NAME_WITH_PREFIX} is already paralyzed!");
|
||||
static const u8 sText_PkmnHealedParalysis[] = _("{B_DEF_NAME_WITH_PREFIX} was cured of paralysis!");
|
||||
@@ -123,7 +123,7 @@ static const u8 sText_PkmnHealedConfusion[] = _("{B_ATK_NAME_WITH_PREFIX} snappe
|
||||
static const u8 sText_PkmnWasConfused[] = _("{B_EFF_NAME_WITH_PREFIX} became confused!");
|
||||
static const u8 sText_PkmnAlreadyConfused[] = _("{B_DEF_NAME_WITH_PREFIX} is already confused!");
|
||||
static const u8 sText_PkmnFellInLove[] = _("{B_DEF_NAME_WITH_PREFIX} fell in love!");
|
||||
static const u8 sText_PkmnInLove[] = _("{B_ATK_NAME_WITH_PREFIX} is in love with {B_SCR_ACTIVE_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_PkmnInLove[] = _("{B_ATK_NAME_WITH_PREFIX} is in love with {B_SCR_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_PkmnImmobilizedByLove[] = _("{B_ATK_NAME_WITH_PREFIX} is immobilized by love!");
|
||||
static const u8 sText_PkmnBlownAway[] = _("{B_DEF_NAME_WITH_PREFIX} was blown away!"); //unused
|
||||
static const u8 sText_PkmnChangedType[] = _("{B_ATK_NAME_WITH_PREFIX} transformed into the {B_BUFF1} type!");
|
||||
@@ -135,7 +135,7 @@ static const u8 sText_PkmnRaisedSpDefALittle[] = _("{B_ATK_PREFIX1}'s {B_CURRENT
|
||||
static const u8 sText_PkmnRaisedDef[] = _("Reflect made {B_ATK_TEAM2} team stronger against physical moves!");
|
||||
static const u8 sText_PkmnRaisedDefALittle[] = _("{B_ATK_PREFIX1}'s {B_CURRENT_MOVE} raised DEFENSE a little!"); //expansion doesn't use anymore
|
||||
static const u8 sText_PkmnCoveredByVeil[] = _("{B_ATK_TEAM1} team cloaked itself in a mystical veil!");
|
||||
static const u8 sText_PkmnUsedSafeguard[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is protected by Safeguard!");
|
||||
static const u8 sText_PkmnUsedSafeguard[] = _("{B_SCR_NAME_WITH_PREFIX} is protected by Safeguard!");
|
||||
static const u8 sText_PkmnSafeguardExpired[] = _("{B_ATK_TEAM1} team is no longer protected by Safeguard!");
|
||||
static const u8 sText_PkmnWentToSleep[] = _("{B_ATK_NAME_WITH_PREFIX} went to sleep!"); //not in gen 5+
|
||||
static const u8 sText_PkmnSleptHealthy[] = _("{B_ATK_NAME_WITH_PREFIX} slept and restored its HP!");
|
||||
@@ -158,7 +158,7 @@ static const u8 sText_PkmnHurtBy[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt by {B_B
|
||||
static const u8 sText_PkmnFreedFrom[] = _("{B_ATK_NAME_WITH_PREFIX} was freed from {B_BUFF1}!");
|
||||
static const u8 sText_PkmnCrashed[] = _("{B_ATK_NAME_WITH_PREFIX} kept going and crashed!");
|
||||
const u8 gText_PkmnShroudedInMist[] = _("{B_ATK_TEAM1} team became shrouded in mist!");
|
||||
static const u8 sText_PkmnProtectedByMist[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is protected by the mist!");
|
||||
static const u8 sText_PkmnProtectedByMist[] = _("{B_SCR_NAME_WITH_PREFIX} is protected by the mist!");
|
||||
const u8 gText_PkmnGettingPumped[] = _("{B_DEF_NAME_WITH_PREFIX} is getting pumped!");
|
||||
static const u8 sText_PkmnHitWithRecoil[] = _("{B_ATK_NAME_WITH_PREFIX} was damaged by the recoil!");
|
||||
static const u8 sText_PkmnProtectedItself2[] = _("{B_ATK_NAME_WITH_PREFIX} protected itself!");
|
||||
@@ -170,7 +170,7 @@ static const u8 sText_PkmnEvadedAttack[] = _("{B_DEF_NAME_WITH_PREFIX} avoided t
|
||||
static const u8 sText_PkmnSappedByLeechSeed[] = _("{B_ATK_NAME_WITH_PREFIX}'s health is sapped by Leech Seed!");
|
||||
static const u8 sText_PkmnFastAsleep[] = _("{B_ATK_NAME_WITH_PREFIX} is fast asleep.");
|
||||
static const u8 sText_PkmnWokeUp[] = _("{B_ATK_NAME_WITH_PREFIX} woke up!");
|
||||
static const u8 sText_PkmnUproarKeptAwake[] = _("But the uproar kept {B_SCR_ACTIVE_NAME_WITH_PREFIX2} awake!");
|
||||
static const u8 sText_PkmnUproarKeptAwake[] = _("But the uproar kept {B_SCR_NAME_WITH_PREFIX2} awake!");
|
||||
static const u8 sText_PkmnWokeUpInUproar[] = _("The uproar woke {B_ATK_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_PkmnCausedUproar[] = _("{B_ATK_NAME_WITH_PREFIX} caused an uproar!");
|
||||
static const u8 sText_PkmnMakingUproar[] = _("{B_ATK_NAME_WITH_PREFIX} is making an uproar!");
|
||||
@@ -209,7 +209,7 @@ static const u8 sText_PkmnLockedInNightmare[] = _("{B_ATK_NAME_WITH_PREFIX} is l
|
||||
static const u8 sText_PkmnLaidCurse[] = _("{B_ATK_NAME_WITH_PREFIX} cut its own HP and put a curse on {B_DEF_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_PkmnAfflictedByCurse[] = _("{B_ATK_NAME_WITH_PREFIX} is afflicted by the curse!");
|
||||
static const u8 sText_SpikesScattered[] = _("Spikes were scattered on the ground all around {B_DEF_TEAM2} team!");
|
||||
static const u8 sText_PkmnHurtBySpikes[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} was hurt by the spikes!");
|
||||
static const u8 sText_PkmnHurtBySpikes[] = _("{B_SCR_NAME_WITH_PREFIX} was hurt by the spikes!");
|
||||
static const u8 sText_PkmnIdentified[] = _("{B_DEF_NAME_WITH_PREFIX} was identified!");
|
||||
static const u8 sText_PkmnPerishCountFell[] = _("{B_ATK_NAME_WITH_PREFIX}'s perish count fell to {B_BUFF1}!");
|
||||
static const u8 sText_PkmnBracedItself[] = _("{B_ATK_NAME_WITH_PREFIX} braced itself!");
|
||||
@@ -252,14 +252,14 @@ static const u8 sText_PkmnLostPPGrudge[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF
|
||||
static const u8 sText_PkmnShroudedItself[] = _("{B_ATK_NAME_WITH_PREFIX} shrouded itself with Magic Coat!");
|
||||
static const u8 sText_PkmnMoveBounced[] = _("{B_EFF_NAME_WITH_PREFIX} bounced the {B_CURRENT_MOVE} back!");
|
||||
static const u8 sText_PkmnWaitsForTarget[] = _("{B_ATK_NAME_WITH_PREFIX} waits for a target to make a move!");
|
||||
static const u8 sText_PkmnSnatchedMove[] = _("{B_DEF_NAME_WITH_PREFIX} snatched {B_SCR_ACTIVE_NAME_WITH_PREFIX2}'s move!");
|
||||
static const u8 sText_PkmnSnatchedMove[] = _("{B_DEF_NAME_WITH_PREFIX} snatched {B_SCR_NAME_WITH_PREFIX2}'s move!");
|
||||
static const u8 sText_ElectricityWeakened[] = _("Electricity's power was weakened!");
|
||||
static const u8 sText_FireWeakened[] = _("Fire's power was weakened!");
|
||||
static const u8 sText_XFoundOneY[] = _("{B_ATK_NAME_WITH_PREFIX} found one {B_LAST_ITEM}!");
|
||||
static const u8 sText_SoothingAroma[] = _("A soothing aroma wafted through the area!");
|
||||
static const u8 sText_ItemsCantBeUsedNow[] = _("Items can't be used now.{PAUSE 64}"); //not in gen 5+, i think
|
||||
static const u8 sText_ForXCommaYZ[] = _("For {B_SCR_ACTIVE_NAME_WITH_PREFIX2}, {B_LAST_ITEM} {B_BUFF1}"); //not in gen 5+, expansion doesn't use anymore
|
||||
static const u8 sText_PkmnUsedXToGetPumped[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used the {B_LAST_ITEM} to get pumped!");
|
||||
static const u8 sText_ForXCommaYZ[] = _("For {B_SCR_NAME_WITH_PREFIX2}, {B_LAST_ITEM} {B_BUFF1}"); //not in gen 5+, expansion doesn't use anymore
|
||||
static const u8 sText_PkmnUsedXToGetPumped[] = _("{B_SCR_NAME_WITH_PREFIX} used the {B_LAST_ITEM} to get pumped!");
|
||||
static const u8 sText_PkmnLostFocus[] = _("{B_ATK_NAME_WITH_PREFIX} lost its focus and couldn't move!");
|
||||
static const u8 sText_PkmnWasDraggedOut[] = _("{B_DEF_NAME_WITH_PREFIX} was dragged out!\p");
|
||||
static const u8 sText_TheWallShattered[] = _("The wall shattered!"); //not in gen5+, uses "your teams light screen wore off!" etc instead
|
||||
@@ -270,8 +270,8 @@ static const u8 sText_PkmnCantUseMoveTorment[] = _("{B_ATK_NAME_WITH_PREFIX} can
|
||||
static const u8 sText_PkmnCantUseMoveTaunt[] = _("{B_ATK_NAME_WITH_PREFIX} can't use {B_CURRENT_MOVE} after the taunt!\p");
|
||||
static const u8 sText_PkmnCantUseMoveSealed[] = _("{B_ATK_NAME_WITH_PREFIX} can't use its sealed {B_CURRENT_MOVE}!\p");
|
||||
static const u8 sText_PkmnCantUseMoveThroatChop[] = _("The effects of Throat Chop prevent {B_ATK_NAME_WITH_PREFIX2} from using certain moves!\p");
|
||||
static const u8 sText_PkmnMadeItRain[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} made it rain!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnRaisedSpeed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its Speed!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnMadeItRain[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} made it rain!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnRaisedSpeed[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its Speed!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnProtectedBy[] = _("{B_DEF_NAME_WITH_PREFIX} was protected by {B_DEF_ABILITY}!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnPreventsUsage[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents {B_ATK_NAME_WITH_PREFIX2} from using {B_CURRENT_MOVE}!"); //I don't see this in SV text
|
||||
static const u8 sText_PkmnRestoredHPUsing[] = _("{B_DEF_NAME_WITH_PREFIX} restored HP using its {B_DEF_ABILITY}!"); //not in gen 5+, ability popup
|
||||
@@ -283,38 +283,38 @@ static const u8 sText_PkmnPreventsPoisoningWith[] = _("{B_EFF_NAME_WITH_PREFIX}'
|
||||
static const u8 sText_PkmnPreventsConfusionWith[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents confusion!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnRaisedFirePowerWith[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} raised the power of Fire-type moves!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnAnchorsItselfWith[] = _("{B_DEF_NAME_WITH_PREFIX} anchors itself with {B_DEF_ABILITY}!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnCutsAttackWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cuts {B_DEF_NAME_WITH_PREFIX2}'s Attack!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnPreventsStatLossWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents stat loss!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnCutsAttackWith[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cuts {B_DEF_NAME_WITH_PREFIX2}'s Attack!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnPreventsStatLossWith[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents stat loss!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnHurtsWith[] = _("{B_ATK_NAME_WITH_PREFIX} was hurt by {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!");
|
||||
static const u8 sText_PkmnTraced[] = _("It traced {B_BUFF1}'s {B_BUFF2}!");
|
||||
static const u8 sText_PkmnsXPreventsBurns[] = _("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY} prevents burns!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXBlocksY[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} blocks {B_CURRENT_MOVE}!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXBlocksY2[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} blocks {B_CURRENT_MOVE}!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXBlocksY2[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} blocks {B_CURRENT_MOVE}!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXRestoredHPALittle2[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} restored its HP a little!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXWhippedUpSandstorm[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} whipped up a sandstorm!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXIntensifiedSun[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} intensified the sun's rays!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXPreventsYLoss[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_BUFF1} loss!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXWhippedUpSandstorm[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} whipped up a sandstorm!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXIntensifiedSun[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} intensified the sun's rays!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXPreventsYLoss[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_BUFF1} loss!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXInfatuatedY[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} infatuated {B_ATK_NAME_WITH_PREFIX2}!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXMadeYIneffective[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} made {B_CURRENT_MOVE} ineffective!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXCuredYProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXCuredYProblem[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_ItSuckedLiquidOoze[] = _("{B_ATK_NAME_WITH_PREFIX} sucked up the liquid ooze!");
|
||||
static const u8 sText_PkmnTransformed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} transformed!");
|
||||
static const u8 sText_PkmnTransformed[] = _("{B_SCR_NAME_WITH_PREFIX} transformed!");
|
||||
static const u8 sText_PkmnsXTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} took the attack!"); //In gen 5+ but without naming the ability
|
||||
const u8 gText_PkmnsXPreventsSwitching[] = _("{B_BUFF1} is preventing switching out with its {B_LAST_ABILITY} Ability!\p");
|
||||
static const u8 sText_PreventedFromWorking[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevented {B_SCR_ACTIVE_NAME_WITH_PREFIX2}'s {B_BUFF1} from working!"); //unused
|
||||
static const u8 sText_PkmnsXMadeItIneffective[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} made it ineffective!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PreventedFromWorking[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevented {B_SCR_NAME_WITH_PREFIX2}'s {B_BUFF1} from working!"); //unused
|
||||
static const u8 sText_PkmnsXMadeItIneffective[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} made it ineffective!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXPreventsFlinching[] = _("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY} prevents flinching!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXPreventsYsZ[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!");
|
||||
static const u8 sText_PkmnsAbilityPreventsAbility[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXCuredItsYProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXHadNoEffectOnY[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} had no effect on {B_EFF_NAME_WITH_PREFIX2}!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsAbilityPreventsAbility[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXCuredItsYProblem[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"); //not in gen 5+, ability popup
|
||||
static const u8 sText_PkmnsXHadNoEffectOnY[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} had no effect on {B_EFF_NAME_WITH_PREFIX2}!"); //not in gen 5+, ability popup
|
||||
const u8 gText_StatSharply[] = _("sharply ");
|
||||
const u8 gText_StatRose[] = _("rose!");
|
||||
static const u8 sText_StatHarshly[] = _("harshly ");
|
||||
const u8 sText_StatFell[] = _("fell!");
|
||||
const u8 gText_StatFell[] = _("fell!");
|
||||
static const u8 sText_AttackersStatRose[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}");
|
||||
const u8 gText_DefendersStatRose[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}");
|
||||
static const u8 sText_UsingItemTheStatOfPkmnRose[] = _("Using {B_LAST_ITEM}, the {B_BUFF1} of {B_SCR_ACTIVE_NAME_WITH_PREFIX2} {B_BUFF2}"); //todo: update this, will require code changes
|
||||
static const u8 sText_UsingItemTheStatOfPkmnRose[] = _("Using {B_LAST_ITEM}, the {B_BUFF1} of {B_SCR_NAME_WITH_PREFIX2} {B_BUFF2}"); //todo: update this, will require code changes
|
||||
static const u8 sText_AttackersStatFell[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}");
|
||||
static const u8 sText_DefendersStatFell[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}");
|
||||
static const u8 sText_StatsWontIncrease2[] = _("{B_ATK_NAME_WITH_PREFIX}'s stats won't go any higher!");
|
||||
@@ -507,19 +507,19 @@ static const u8 sText_SeemsWeird[] = _("The battlefield seems weird!");
|
||||
static const u8 sText_BoxIsFull[] = _("The Box is full! You can't catch any more!\p");
|
||||
static const u8 sText_EnigmaBerry[] = _("ENIGMA BERRY"); //no decapitalize until it is everywhere
|
||||
static const u8 sText_BerrySuffix[] = _(" BERRY"); //no decapitalize until it is everywhere
|
||||
static const u8 sText_PkmnsItemCuredParalysis[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its paralysis!");
|
||||
static const u8 sText_PkmnsItemCuredPoison[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its poison!");
|
||||
static const u8 sText_PkmnsItemHealedBurn[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its burn!");
|
||||
static const u8 sText_PkmnsItemHealedFrostbite[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its frostbite!");
|
||||
static const u8 sText_PkmnsItemDefrostedIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} defrosted it!");
|
||||
static const u8 sText_PkmnsItemWokeIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} woke it up!");
|
||||
static const u8 sText_PkmnsItemSnappedOut[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} snapped it out of its confusion!");
|
||||
static const u8 sText_PkmnsItemCuredProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its {B_BUFF1} problem!");
|
||||
static const u8 sText_PkmnsItemNormalizedStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} normalized its status!");
|
||||
static const u8 sText_PkmnsItemRestoredHealth[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} restored its health using its {B_LAST_ITEM}!");
|
||||
static const u8 sText_PkmnsItemRestoredPP[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} restored PP to its move {B_BUFF1} using its {B_LAST_ITEM}!");
|
||||
static const u8 sText_PkmnsItemRestoredStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} returned its stats to normal using its {B_LAST_ITEM}!");
|
||||
static const u8 sText_PkmnsItemRestoredHPALittle[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} restored a little HP using its {B_LAST_ITEM}!");
|
||||
static const u8 sText_PkmnsItemCuredParalysis[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its paralysis!");
|
||||
static const u8 sText_PkmnsItemCuredPoison[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its poison!");
|
||||
static const u8 sText_PkmnsItemHealedBurn[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its burn!");
|
||||
static const u8 sText_PkmnsItemHealedFrostbite[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its frostbite!");
|
||||
static const u8 sText_PkmnsItemDefrostedIt[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} defrosted it!");
|
||||
static const u8 sText_PkmnsItemWokeIt[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} woke it up!");
|
||||
static const u8 sText_PkmnsItemSnappedOut[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} snapped it out of its confusion!");
|
||||
static const u8 sText_PkmnsItemCuredProblem[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its {B_BUFF1} problem!");
|
||||
static const u8 sText_PkmnsItemNormalizedStatus[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} normalized its status!");
|
||||
static const u8 sText_PkmnsItemRestoredHealth[] = _("{B_SCR_NAME_WITH_PREFIX} restored its health using its {B_LAST_ITEM}!");
|
||||
static const u8 sText_PkmnsItemRestoredPP[] = _("{B_SCR_NAME_WITH_PREFIX} restored PP to its move {B_BUFF1} using its {B_LAST_ITEM}!");
|
||||
static const u8 sText_PkmnsItemRestoredStatus[] = _("{B_SCR_NAME_WITH_PREFIX} returned its stats to normal using its {B_LAST_ITEM}!");
|
||||
static const u8 sText_PkmnsItemRestoredHPALittle[] = _("{B_SCR_NAME_WITH_PREFIX} restored a little HP using its {B_LAST_ITEM}!");
|
||||
static const u8 sText_ItemAllowsOnlyYMove[] = _("{B_LAST_ITEM} only allows the use of {B_CURRENT_MOVE}!\p");
|
||||
static const u8 sText_PkmnHungOnWithX[] = _("{B_DEF_NAME_WITH_PREFIX} hung on using its {B_LAST_ITEM}!");
|
||||
const u8 gText_EmptyString3[] = _("");
|
||||
@@ -574,7 +574,7 @@ static const u8 sText_TargetChangedType[] =_("{B_DEF_NAME_WITH_PREFIX} transform
|
||||
static const u8 sText_PkmnAcquiredSimple[] =_("{B_DEF_NAME_WITH_PREFIX} acquired Simple!"); //shouldn't directly use the name
|
||||
static const u8 sText_KindOffer[] =_("{B_DEF_NAME_WITH_PREFIX} took the kind offer!");
|
||||
static const u8 sText_ResetsTargetsStatLevels[] =_("{B_DEF_NAME_WITH_PREFIX}'s stat changes were removed!");
|
||||
static const u8 sText_AllySwitchPosition[] =_("{B_ATK_NAME_WITH_PREFIX} and {B_SCR_ACTIVE_NAME_WITH_PREFIX2} switched places!");
|
||||
static const u8 sText_AllySwitchPosition[] =_("{B_ATK_NAME_WITH_PREFIX} and {B_SCR_NAME_WITH_PREFIX2} switched places!");
|
||||
static const u8 sText_RestoreTargetsHealth[] =_("{B_DEF_NAME_WITH_PREFIX}'s HP was restored!");
|
||||
static const u8 sText_TookPkmnIntoTheSky[] =_("{B_ATK_NAME_WITH_PREFIX} took {B_DEF_NAME_WITH_PREFIX2} into the sky!");
|
||||
static const u8 sText_FreedFromSkyDrop[] =_("{B_DEF_NAME_WITH_PREFIX} was freed from the Sky Drop!");
|
||||
@@ -598,7 +598,7 @@ static const u8 sText_AquaRingHeal[] = _("A veil of water restored {B_ATK_NAME_W
|
||||
static const u8 sText_TargetAbilityRaisedStat[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} raised its {B_BUFF1}!");
|
||||
static const u8 sText_TargetAbilityLoweredStat[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} lowered its {B_BUFF1}!");
|
||||
static const u8 sText_AttackerAbilityRaisedStat[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} raised its {B_BUFF1}!");
|
||||
static const u8 sText_ScriptingAbilityRaisedStat[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its {B_BUFF1}!");
|
||||
static const u8 sText_ScriptingAbilityRaisedStat[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its {B_BUFF1}!");
|
||||
static const u8 sText_ElectricTerrainEnds[] = _("The electricity disappeared from the battlefield.");
|
||||
static const u8 sText_MistyTerrainEnds[] = _("The mist disappeared from the battlefield.");
|
||||
static const u8 sText_PsychicTerrainEnds[] = _("The weirdness disappeared from the battlefield!");
|
||||
@@ -606,15 +606,15 @@ static const u8 sText_GrassyTerrainEnds[] = _("The grass disappeared from the ba
|
||||
static const u8 sText_TargetsStatWasMaxedOut[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} maxed its {B_BUFF1}!");
|
||||
static const u8 sText_PoisonHealHpUp[] = _("The poisoning healed {B_ATK_NAME_WITH_PREFIX2} a little bit!"); //don't think this message is displayed anymore
|
||||
static const u8 sText_BadDreamsDmg[] = _("{B_DEF_NAME_WITH_PREFIX} is tormented!");
|
||||
static const u8 sText_MoldBreakerEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} breaks the mold!");
|
||||
static const u8 sText_TeravoltEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating a bursting aura!");
|
||||
static const u8 sText_TurboblazeEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating a blazing aura!");
|
||||
static const u8 sText_SlowStartEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is slow to get going!");
|
||||
static const u8 sText_MoldBreakerEnters[] = _("{B_SCR_NAME_WITH_PREFIX} breaks the mold!");
|
||||
static const u8 sText_TeravoltEnters[] = _("{B_SCR_NAME_WITH_PREFIX} is radiating a bursting aura!");
|
||||
static const u8 sText_TurboblazeEnters[] = _("{B_SCR_NAME_WITH_PREFIX} is radiating a blazing aura!");
|
||||
static const u8 sText_SlowStartEnters[] = _("{B_SCR_NAME_WITH_PREFIX} is slow to get going!");
|
||||
static const u8 sText_SlowStartEnd[] = _("{B_ATK_NAME_WITH_PREFIX} finally got its act together!");
|
||||
static const u8 sText_SolarPowerHpDrop[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} takes its toll!"); //don't think this message is displayed anymore
|
||||
static const u8 sText_AftermathDmg[] = _("{B_ATK_NAME_WITH_PREFIX} was hurt!");
|
||||
static const u8 sText_AnticipationActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} shuddered!");
|
||||
static const u8 sText_ForewarnActivates[] = _("{B_SCR_ACTIVE_ABILITY} alerted {B_SCR_ACTIVE_NAME_WITH_PREFIX2} to {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!");
|
||||
static const u8 sText_AnticipationActivates[] = _("{B_SCR_NAME_WITH_PREFIX} shuddered!");
|
||||
static const u8 sText_ForewarnActivates[] = _("{B_SCR_ACTIVE_ABILITY} alerted {B_SCR_NAME_WITH_PREFIX2} to {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!");
|
||||
static const u8 sText_IceBodyHpGain[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} healed it a little bit!"); //don't think this message is displayed anymore
|
||||
static const u8 sText_SnowWarningHail[] = _("It started to hail!");
|
||||
static const u8 sText_SnowWarningSnow[] = _("It started to snow!");
|
||||
@@ -624,11 +624,11 @@ static const u8 sText_HarvestBerry[] = _("{B_ATK_NAME_WITH_PREFIX} harvested its
|
||||
static const u8 sText_LastAbilityRaisedBuff1[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} raised its {B_BUFF1}!");
|
||||
static const u8 sText_MagicBounceActivates[] = _("{B_DEF_NAME_WITH_PREFIX} bounced the {B_ATK_NAME_WITH_PREFIX2} back!");
|
||||
static const u8 sText_ProteanTypeChange[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} transformed it into the {B_BUFF1} type!");
|
||||
static const u8 sText_SymbiosisItemPass[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} passed its {B_LAST_ITEM} to {B_ATK_NAME_WITH_PREFIX2} through {B_LAST_ABILITY}!");
|
||||
static const u8 sText_StealthRockDmg[] = _("Pointed stones dug into {B_SCR_ACTIVE_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_SymbiosisItemPass[] = _("{B_SCR_NAME_WITH_PREFIX} passed its {B_LAST_ITEM} to {B_ATK_NAME_WITH_PREFIX2} through {B_LAST_ABILITY}!");
|
||||
static const u8 sText_StealthRockDmg[] = _("Pointed stones dug into {B_SCR_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_ToxicSpikesAbsorbed[] = _("The poison spikes disappeared from the ground around {B_ATK_TEAM2} team!");
|
||||
static const u8 sText_ToxicSpikesPoisoned[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} was poisoned!");
|
||||
static const u8 sText_StickyWebSwitchIn[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} was caught in a sticky web!");
|
||||
static const u8 sText_ToxicSpikesPoisoned[] = _("{B_SCR_NAME_WITH_PREFIX} was poisoned!");
|
||||
static const u8 sText_StickyWebSwitchIn[] = _("{B_SCR_NAME_WITH_PREFIX} was caught in a sticky web!");
|
||||
static const u8 sText_HealingWishCameTrue[] = _("The healing wish came true for {B_ATK_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_HealingWishHealed[] = _("{B_ATK_NAME_WITH_PREFIX} regained health!");
|
||||
static const u8 sText_LunarDanceCameTrue[] = _("{B_ATK_NAME_WITH_PREFIX} became cloaked in mystical moonlight!");
|
||||
@@ -660,11 +660,11 @@ static const u8 sText_HealBlockPreventsUsage[] = _("{B_ATK_NAME_WITH_PREFIX} was
|
||||
static const u8 sText_MegaEvoReacting[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ITEM} is reacting to {B_ATK_TRAINER_NAME}'s Mega Ring!"); //actually displays the type of mega ring in inventory, but we didnt implement them :(
|
||||
static const u8 sText_FerventWishReached[] = _("{B_ATK_TRAINER_NAME}'s fervent wish has reached {B_ATK_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_MegaEvoEvolved[] = _("{B_ATK_NAME_WITH_PREFIX} has Mega Evolved into Mega {B_BUFF1}!");
|
||||
const u8 sText_drastically[] = _("drastically ");
|
||||
const u8 sText_severely[] = _("severely ");
|
||||
const u8 gText_drastically[] = _("drastically ");
|
||||
const u8 gText_severely[] = _("severely ");
|
||||
static const u8 sText_Infestation[] = _("{B_DEF_NAME_WITH_PREFIX} has been afflicted with an infestation by {B_ATK_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_NoEffectOnTarget[] = _("It won't have any effect on {B_DEF_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_BurstingFlames[] = _("The bursting flames hit {B_SCR_ACTIVE_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_BurstingFlames[] = _("The bursting flames hit {B_SCR_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_BestowItemGiving[] = _("{B_DEF_NAME_WITH_PREFIX} received {B_LAST_ITEM} from {B_ATK_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_ThirdTypeAdded[] = _("{B_BUFF1} type was added to {B_DEF_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_FellForFeint[] = _("{B_DEF_NAME_WITH_PREFIX} fell for the feint!");
|
||||
@@ -686,56 +686,54 @@ static const u8 sText_CelebrateMessage[] = _("Congratulations, {B_PLAYER_NAME}!"
|
||||
static const u8 sText_UsedInstructedMove[] = _("{B_ATK_NAME_WITH_PREFIX} followed {B_BUFF1}'s instructions!");
|
||||
static const u8 sText_LaserFocusMessage[] = _("{B_ATK_NAME_WITH_PREFIX} concentrated intensely!");
|
||||
static const u8 sText_GemActivates[] = _("The {B_LAST_ITEM} strengthened {B_ATK_NAME_WITH_PREFIX2}'s power!");
|
||||
static const u8 sText_BerryDmgReducing[] = _("The {B_LAST_ITEM} weakened the damage to {B_DEF_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_TargetAteItem[] = _("{B_DEF_NAME_WITH_PREFIX} ate its {B_LAST_ITEM}!");
|
||||
static const u8 sText_AirBalloonFloat[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} floats in the air with its Air Balloon!");
|
||||
static const u8 sText_AirBalloonFloat[] = _("{B_SCR_NAME_WITH_PREFIX} floats in the air with its Air Balloon!");
|
||||
static const u8 sText_AirBalloonPop[] = _("{B_DEF_NAME_WITH_PREFIX}'s Air Balloon popped!");
|
||||
static const u8 sText_IncinerateBurn[] = _("{B_EFF_NAME_WITH_PREFIX}'s {B_LAST_ITEM} was burnt up!");
|
||||
static const u8 sText_BugBite[] = _("{B_ATK_NAME_WITH_PREFIX} stole and ate its target's {B_LAST_ITEM}!");
|
||||
static const u8 sText_IllusionWoreOff[] = _("{B_DEF_NAME_WITH_PREFIX}'s illusion wore off!");
|
||||
static const u8 sText_AttackerCuredTargetStatus[] = _("{B_ATK_NAME_WITH_PREFIX} cured {B_DEF_NAME_WITH_PREFIX2}'s problem!");
|
||||
static const u8 sText_AttackerLostFireType[] = _("{B_ATK_NAME_WITH_PREFIX} burned itself out!");
|
||||
static const u8 sText_HealerCure[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} cured {B_SCR_ACTIVE_NAME_WITH_PREFIX2}'s problem!");
|
||||
static const u8 sText_ReceiverAbilityTakeOver[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} was taken over!");
|
||||
static const u8 sText_HealerCure[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} cured {B_SCR_NAME_WITH_PREFIX2}'s problem!");
|
||||
static const u8 sText_ReceiverAbilityTakeOver[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} was taken over!");
|
||||
static const u8 sText_PkmnAbsorbingPower[] = _("{B_ATK_NAME_WITH_PREFIX} is absorbing power!");
|
||||
static const u8 sText_NoOneWillBeAbleToRun[] = _("No one will be able to run away during the next turn!");
|
||||
static const u8 sText_DestinyKnotActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} fell in love because of the {B_LAST_ITEM}!");
|
||||
static const u8 sText_DestinyKnotActivates[] = _("{B_SCR_NAME_WITH_PREFIX} fell in love because of the {B_LAST_ITEM}!");
|
||||
static const u8 sText_CloakedInAFreezingLight[] = _("{B_ATK_NAME_WITH_PREFIX} became cloaked in a freezing light!");
|
||||
static const u8 sText_ClearAmuletWontLowerStats[] = _("The effects of the {B_LAST_ITEM} held by {B_DEF_NAME_WITH_PREFIX2} prevents its stats from being lowered!");
|
||||
static const u8 sText_AuraFlaredToLife[] = _("{B_DEF_NAME_WITH_PREFIX}'s aura flared to life!");
|
||||
static const u8 sText_AirLockActivates[] = _("The effects of the weather disappeared.");
|
||||
static const u8 sText_PressureActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is exerting its pressure!");
|
||||
static const u8 sText_DarkAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating a dark aura!");
|
||||
static const u8 sText_FairyAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating a fairy aura!");
|
||||
static const u8 sText_AuraBreakActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} reversed all other Pokémon's auras!");
|
||||
static const u8 sText_ComatoseActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is drowsing!");
|
||||
static const u8 sText_PressureActivates[] = _("{B_SCR_NAME_WITH_PREFIX} is exerting its pressure!");
|
||||
static const u8 sText_DarkAuraActivates[] = _("{B_SCR_NAME_WITH_PREFIX} is radiating a dark aura!");
|
||||
static const u8 sText_FairyAuraActivates[] = _("{B_SCR_NAME_WITH_PREFIX} is radiating a fairy aura!");
|
||||
static const u8 sText_AuraBreakActivates[] = _("{B_SCR_NAME_WITH_PREFIX} reversed all other Pokémon's auras!");
|
||||
static const u8 sText_ComatoseActivates[] = _("{B_SCR_NAME_WITH_PREFIX} is drowsing!");
|
||||
static const u8 sText_ScreenCleanerActivates[] = _("All screens on the field were cleansed!");
|
||||
static const u8 sText_FetchedPokeBall[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} found a {B_LAST_ITEM}!");
|
||||
static const u8 sText_BattlerAbilityRaisedStat[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its {B_BUFF1}!");
|
||||
static const u8 sText_FetchedPokeBall[] = _("{B_SCR_NAME_WITH_PREFIX} found a {B_LAST_ITEM}!");
|
||||
static const u8 sText_BattlerAbilityRaisedStat[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its {B_BUFF1}!");
|
||||
static const u8 sText_ASandstormKickedUp[] = _("A sandstorm kicked up!");
|
||||
static const u8 sText_PkmnsWillPerishIn3Turns[] = _("Both Pokémon will perish in three turns!"); //don't think this message is displayed anymore
|
||||
static const u8 sText_AbilityRaisedStatDrastically[] = _("{B_DEF_ABILITY} raised {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1} drastically!");
|
||||
static const u8 sText_AsOneEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} has two Abilities!");
|
||||
static const u8 sText_AsOneEnters[] = _("{B_SCR_NAME_WITH_PREFIX} has two Abilities!");
|
||||
static const u8 sText_PkmnMadeShellGleam[] = _("{B_DEF_NAME_WITH_PREFIX} made its shell gleam! It's distorting type matchups!");
|
||||
static const u8 sText_CuriousMedicineEnters[] = _("{B_EFF_NAME_WITH_PREFIX}'s stat changes were removed!");
|
||||
static const u8 sText_CanActFaster[] = _("{B_ATK_NAME_WITH_PREFIX} can act faster than normal, thanks to its {B_BUFF1}!");
|
||||
static const u8 sText_MicleBerryActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted the accuracy of its next move using {B_LAST_ITEM}!");
|
||||
static const u8 sText_PkmnShookOffTheTaunt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} shook off the taunt!");
|
||||
static const u8 sText_PkmnGotOverItsInfatuation[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} got over its infatuation!");
|
||||
static const u8 sText_MicleBerryActivates[] = _("{B_SCR_NAME_WITH_PREFIX} boosted the accuracy of its next move using {B_LAST_ITEM}!");
|
||||
static const u8 sText_PkmnShookOffTheTaunt[] = _("{B_SCR_NAME_WITH_PREFIX} shook off the taunt!");
|
||||
static const u8 sText_PkmnGotOverItsInfatuation[] = _("{B_SCR_NAME_WITH_PREFIX} got over its infatuation!");
|
||||
static const u8 sText_ZPowerSurrounds[] = _("{B_ATK_NAME_WITH_PREFIX} surrounded itself with its Z-Power!");
|
||||
static const u8 sText_ZPowerUnleashed[] = _("{B_ATK_NAME_WITH_PREFIX} unleashes its full-force Z-Move!");
|
||||
static const u8 sText_ZMoveResetsStats[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} returned its decreased stats to normal using its Z-Power!");
|
||||
static const u8 sText_ZMoveAllStatsUp[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted its stats using its Z-Power!");
|
||||
static const u8 sText_ZMoveBoostCrit[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted its critical-hit ratio using its Z-Power!");
|
||||
static const u8 sText_ZMoveRestoreHp[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} restored its HP using its Z-Power!");
|
||||
static const u8 sText_ZMoveStatUp[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted its stats using its Z-Power!");
|
||||
static const u8 sText_ZMoveHpSwitchInTrap[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s HP was restored by the Z-Power!");
|
||||
static const u8 sText_ZMoveResetsStats[] = _("{B_SCR_NAME_WITH_PREFIX} returned its decreased stats to normal using its Z-Power!");
|
||||
static const u8 sText_ZMoveAllStatsUp[] = _("{B_SCR_NAME_WITH_PREFIX} boosted its stats using its Z-Power!");
|
||||
static const u8 sText_ZMoveBoostCrit[] = _("{B_SCR_NAME_WITH_PREFIX} boosted its critical-hit ratio using its Z-Power!");
|
||||
static const u8 sText_ZMoveRestoreHp[] = _("{B_SCR_NAME_WITH_PREFIX} restored its HP using its Z-Power!");
|
||||
static const u8 sText_ZMoveStatUp[] = _("{B_SCR_NAME_WITH_PREFIX} boosted its stats using its Z-Power!");
|
||||
static const u8 sText_ZMoveHpSwitchInTrap[] = _("{B_SCR_NAME_WITH_PREFIX}'s HP was restored by the Z-Power!");
|
||||
static const u8 sText_TerrainReturnedToNormal[] = _("The terrain returned to normal!");
|
||||
static const u8 sText_ItemCannotBeRemoved[] = _("{B_ATK_NAME_WITH_PREFIX}'s item cannot be removed!");
|
||||
static const u8 sText_StickyBarbTransfer[] = _("The {B_LAST_ITEM} attached itself to {B_ATK_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_PkmnBurnHealed[] = _("{B_DEF_NAME_WITH_PREFIX}'s burn was cured!");
|
||||
static const u8 sText_RedCardActivate[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} held up its Red Card against {B_ATK_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_EjectButtonActivate[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is switched out with the {B_LAST_ITEM}!");
|
||||
static const u8 sText_RedCardActivate[] = _("{B_SCR_NAME_WITH_PREFIX} held up its Red Card against {B_ATK_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_EjectButtonActivate[] = _("{B_SCR_NAME_WITH_PREFIX} is switched out with the {B_LAST_ITEM}!");
|
||||
static const u8 sText_AttackerGotOverInfatuation[] =_("{B_ATK_NAME_WITH_PREFIX} got over its infatuation!");
|
||||
static const u8 sText_TormentedNoMore[] = _("{B_ATK_NAME_WITH_PREFIX} is no longer tormented!");
|
||||
static const u8 sText_HealBlockedNoMore[] = _("{B_ATK_NAME_WITH_PREFIX} is cured of its heal block!");
|
||||
@@ -754,7 +752,6 @@ static const u8 sText_StrongWindsDissipated[] = _("The mysterious strong winds h
|
||||
static const u8 sText_MysteriousAirCurrentBlowsOn[] = _("The mysterious strong winds blow on regardless!");
|
||||
static const u8 sText_AttackWeakenedByStrongWinds[] = _("The mysterious strong winds weakened the attack!");
|
||||
static const u8 sText_StuffCheeksCantSelect[] = _("It can't use the move because it doesn't have a Berry!\p");
|
||||
static const u8 sText_PkmnRevertedToPrimal[] = _("{B_ATK_NAME_WITH_PREFIX}'s Primal Reversion! It reverted to its primal state!");
|
||||
static const u8 sText_ButPokemonCantUseTheMove[] = _("But {B_ATK_NAME_WITH_PREFIX2} can't use the move!");
|
||||
static const u8 sText_ButHoopaCantUseIt[] = _("But {B_ATK_NAME_WITH_PREFIX2} can't use it the way it is now!");
|
||||
static const u8 sText_BrokeThroughProtection[] = _("It broke through {B_DEF_NAME_WITH_PREFIX2}'s protection!");
|
||||
@@ -762,7 +759,7 @@ static const u8 sText_AbilityAllowsOnlyMove[] = _("{B_ATK_ABILITY} only allows t
|
||||
static const u8 sText_SwappedAbilities[] = _("{B_DEF_NAME_WITH_PREFIX} swapped Abilities with its target!");
|
||||
static const u8 sText_PastelVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is protected by a pastel veil!");
|
||||
static const u8 sText_PastelVeilEnters[] = _("{B_DEF_NAME_WITH_PREFIX} was cured of its poisoning!");
|
||||
static const u8 sText_BattlerTypeChangedTo[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s type changed to {B_BUFF1}!");
|
||||
static const u8 sText_BattlerTypeChangedTo[] = _("{B_SCR_NAME_WITH_PREFIX}'s type changed to {B_BUFF1}!");
|
||||
static const u8 sText_BothCanNoLongerEscape[] = _("Neither Pokémon can run away!");
|
||||
static const u8 sText_CantEscapeDueToUsedMove[] = _("{B_ATK_NAME_WITH_PREFIX} can no longer escape because it used No Retreat!");
|
||||
static const u8 sText_PkmnBecameWeakerToFire[] = _("{B_DEF_NAME_WITH_PREFIX} became weaker to fire!");
|
||||
@@ -785,12 +782,12 @@ static const u8 sText_TargetToughedItOut[] = _("{B_DEF_NAME_WITH_PREFIX} toughed
|
||||
static const u8 sText_AttackerLostElectricType[] = _("{B_ATK_NAME_WITH_PREFIX} used up all its electricity!");
|
||||
static const u8 sText_AttackerSwitchedStatWithTarget[] = _("{B_ATK_NAME_WITH_PREFIX} switched {B_BUFF1} with its target!");
|
||||
static const u8 sText_BeingHitChargedPkmnWithPower[] = _("Being hit by {B_CURRENT_MOVE} charged {B_DEF_NAME_WITH_PREFIX2} with power!");
|
||||
static const u8 sText_SunlightActivatedAbility[] = _("The harsh sunlight activated {B_SCR_ACTIVE_NAME_WITH_PREFIX2}'s Protosynthesis!");
|
||||
static const u8 sText_StatWasHeightened[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} was heightened!");
|
||||
static const u8 sText_BoosterEnergyActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used its {B_LAST_ITEM} to activate {B_SCR_ACTIVE_ABILITY}!");
|
||||
static const u8 sText_ElectricTerrainActivatedAbility[] = _("The Electric Terrain activated {B_SCR_ACTIVE_NAME_WITH_PREFIX2}'s Quark Drive!");
|
||||
static const u8 sText_AbilityWeakenedSurroundingMonsStat[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} weakened the {B_BUFF1} of all surrounding Pokémon!\p");
|
||||
static const u8 sText_AttackerGainedStrengthFromTheFallen[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} gained strength from the fallen!");
|
||||
static const u8 sText_SunlightActivatedAbility[] = _("The harsh sunlight activated {B_SCR_NAME_WITH_PREFIX2}'s Protosynthesis!");
|
||||
static const u8 sText_StatWasHeightened[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} was heightened!");
|
||||
static const u8 sText_BoosterEnergyActivates[] = _("{B_SCR_NAME_WITH_PREFIX} used its {B_LAST_ITEM} to activate {B_SCR_ACTIVE_ABILITY}!");
|
||||
static const u8 sText_ElectricTerrainActivatedAbility[] = _("The Electric Terrain activated {B_SCR_NAME_WITH_PREFIX2}'s Quark Drive!");
|
||||
static const u8 sText_AbilityWeakenedSurroundingMonsStat[] = _("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} weakened the {B_BUFF1} of all surrounding Pokémon!\p");
|
||||
static const u8 sText_AttackerGainedStrengthFromTheFallen[] = _("{B_SCR_NAME_WITH_PREFIX} gained strength from the fallen!");
|
||||
static const u8 sText_PrepareShellTrap[] = _("{B_ATK_NAME_WITH_PREFIX} set a shell trap!");
|
||||
static const u8 sText_ShellTrapDidntWork[] = _("{B_ATK_NAME_WITH_PREFIX}'s shell trap didn't work!");
|
||||
static const u8 sText_SharpSteelFloats[] = _("Sharp-pointed pieces of steel started floating around {B_DEF_TEAM2} Pokémon!");
|
||||
@@ -813,7 +810,7 @@ static const u8 sText_ItemRestoredSpeciesHealth[] = _("{B_BUFF1} had its HP rest
|
||||
static const u8 sText_ItemCuredSpeciesStatus[] = _("{B_BUFF1} had its status healed!");
|
||||
static const u8 sText_ItemRestoredSpeciesPP[] = _("{B_BUFF1} had its PP restored!");
|
||||
static const u8 sText_AtkTrappedDef[] = _("{B_ATK_NAME_WITH_PREFIX} trapped {B_DEF_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_MirrorHerbCopied[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used its Mirror Herb to mirror its opponent's stat changes!");
|
||||
static const u8 sText_MirrorHerbCopied[] = _("{B_SCR_NAME_WITH_PREFIX} used its Mirror Herb to mirror its opponent's stat changes!");
|
||||
static const u8 sText_PkmnItemMelted[] = _("{B_ATK_NAME_WITH_PREFIX} corroded {B_DEF_NAME_WITH_PREFIX2}'s {B_LAST_ITEM}!");
|
||||
static const u8 sText_UltraBurstReacting[] = _("Bright light is about to burst out of {B_ATK_NAME_WITH_PREFIX2}!");
|
||||
static const u8 sText_UltraBurstCompleted[] = _("{B_ATK_NAME_WITH_PREFIX} regained its true power through Ultra Burst!");
|
||||
@@ -823,8 +820,8 @@ static const u8 sText_TargetIsBeingSaltCured[] = _("{B_DEF_NAME_WITH_PREFIX} is
|
||||
static const u8 sText_TargetIsHurtBySaltCure[] = _("{B_DEF_NAME_WITH_PREFIX} is hurt by {B_BUFF1}!");
|
||||
static const u8 sText_TargetCoveredInStickyCandySyrup[] = _("{B_DEF_NAME_WITH_PREFIX} got covered in sticky candy syrup!");
|
||||
static const u8 sText_PkmnTellChillingReceptionJoke[] = _("{B_ATK_NAME_WITH_PREFIX} is preparing to tell a chillingly bad joke!");
|
||||
static const u8 sText_ZeroToHeroTransformation[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} underwent a heroic transformation!");
|
||||
static const u8 sText_CommanderActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} was swallowed by Dondozo and became Dondozo's commander!");
|
||||
static const u8 sText_ZeroToHeroTransformation[] = _("{B_SCR_NAME_WITH_PREFIX} underwent a heroic transformation!");
|
||||
static const u8 sText_CommanderActivates[] = _("{B_SCR_NAME_WITH_PREFIX} was swallowed by Dondozo and became Dondozo's commander!");
|
||||
static const u8 sText_TheTwoMovesBecomeOne[] = _("The two moves have become one! It's a combined move!{PAUSE 16}");
|
||||
static const u8 sText_ARainbowAppearedOnSide[] = _("A rainbow appeared in the sky on {B_ATK_TEAM2} team's side!");
|
||||
static const u8 sText_TheRainbowDisappeared[] = _("The rainbow on {B_ATK_TEAM2} team's side disappeared!");
|
||||
@@ -915,10 +912,10 @@ static const u8 sText_InGamePartnerSentOutZGoN[] = _("{B_PARTNER_CLASS} {B_PARTN
|
||||
static const u8 sText_TwoInGameTrainersDefeated[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} and\n{B_TRAINER2_CLASS} {B_TRAINER2_NAME}\lwere defeated!\p");
|
||||
static const u8 sText_Trainer2LoseText[] = _("{B_TRAINER2_LOSE_TEXT}");
|
||||
static const u8 sText_PkmnIncapableOfPower[] = _("{B_ATK_NAME_WITH_PREFIX} appears incapable\nof using its power!");
|
||||
static const u8 sText_GlintAppearsInEye[] = _("A glint appears in\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s eyes!");
|
||||
static const u8 sText_PkmnGettingIntoPosition[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is getting into\nposition!");
|
||||
static const u8 sText_PkmnBeganGrowlingDeeply[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} began growling deeply!");
|
||||
static const u8 sText_PkmnEagerForMore[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is eager for more!");
|
||||
static const u8 sText_GlintAppearsInEye[] = _("A glint appears in\n{B_SCR_NAME_WITH_PREFIX}'s eyes!");
|
||||
static const u8 sText_PkmnGettingIntoPosition[] = _("{B_SCR_NAME_WITH_PREFIX} is getting into\nposition!");
|
||||
static const u8 sText_PkmnBeganGrowlingDeeply[] = _("{B_SCR_NAME_WITH_PREFIX} began growling deeply!");
|
||||
static const u8 sText_PkmnEagerForMore[] = _("{B_SCR_NAME_WITH_PREFIX} is eager for more!");
|
||||
static const u8 sText_RefIfNothingIsDecided[] = _("REFEREE: If nothing is decided in\n3 turns, we will go to judging!");
|
||||
static const u8 sText_RefThatsIt[] = _("REFEREE: That's it! We will now go to\njudging to determine the winner!");
|
||||
static const u8 sText_RefJudgeMind[] = _("REFEREE: Judging category 1, Mind!\nThe POKéMON showing the most guts!\p");
|
||||
@@ -1085,7 +1082,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_ST
|
||||
[STRINGID_BROKETHROUGHPROTECTION - BATTLESTRINGS_TABLE_START] = sText_BrokeThroughProtection,
|
||||
[STRINGID_BUTPOKEMONCANTUSETHEMOVE - BATTLESTRINGS_TABLE_START] = sText_ButPokemonCantUseTheMove,
|
||||
[STRINGID_BUTHOOPACANTUSEIT - BATTLESTRINGS_TABLE_START] = sText_ButHoopaCantUseIt,
|
||||
[STRINGID_PKMNREVERTEDTOPRIMAL - BATTLESTRINGS_TABLE_START] = sText_PkmnRevertedToPrimal,
|
||||
[STRINGID_PKMNREVERTEDTOPRIMAL - BATTLESTRINGS_TABLE_START] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s Primal Reversion! It reverted to its primal state!"),
|
||||
[STRINGID_STUFFCHEEKSCANTSELECT - BATTLESTRINGS_TABLE_START] = sText_StuffCheeksCantSelect,
|
||||
[STRINGID_ATTACKWEAKENEDBSTRONGWINDS - BATTLESTRINGS_TABLE_START] = sText_AttackWeakenedByStrongWinds,
|
||||
[STRINGID_MYSTERIOUSAIRCURRENTBLOWSON - BATTLESTRINGS_TABLE_START] = sText_MysteriousAirCurrentBlowsOn,
|
||||
@@ -1121,7 +1118,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_ST
|
||||
[STRINGID_ASANDSTORMKICKEDUP - BATTLESTRINGS_TABLE_START] = sText_ASandstormKickedUp,
|
||||
[STRINGID_BATTLERABILITYRAISEDSTAT - BATTLESTRINGS_TABLE_START] = sText_BattlerAbilityRaisedStat,
|
||||
[STRINGID_FETCHEDPOKEBALL - BATTLESTRINGS_TABLE_START] = sText_FetchedPokeBall,
|
||||
[STRINGID_CLEARAMULETWONTLOWERSTATS - BATTLESTRINGS_TABLE_START] = sText_ClearAmuletWontLowerStats,
|
||||
[STRINGID_CLEARAMULETWONTLOWERSTATS - BATTLESTRINGS_TABLE_START] = COMPOUND_STRING("The effects of the {B_LAST_ITEM} held by {B_SCR_NAME_WITH_PREFIX2} prevents its stats from being lowered!"),
|
||||
[STRINGID_CLOAKEDINAFREEZINGLIGHT - BATTLESTRINGS_TABLE_START] = sText_CloakedInAFreezingLight,
|
||||
[STRINGID_DESTINYKNOTACTIVATES - BATTLESTRINGS_TABLE_START] = sText_DestinyKnotActivates,
|
||||
[STRINGID_NOONEWILLBEABLETORUNAWAY - BATTLESTRINGS_TABLE_START] = sText_NoOneWillBeAbleToRun,
|
||||
@@ -1137,7 +1134,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_ST
|
||||
[STRINGID_AIRBALLOONPOP - BATTLESTRINGS_TABLE_START] = sText_AirBalloonPop,
|
||||
[STRINGID_AIRBALLOONFLOAT - BATTLESTRINGS_TABLE_START] = sText_AirBalloonFloat,
|
||||
[STRINGID_TARGETATEITEM - BATTLESTRINGS_TABLE_START] = sText_TargetAteItem,
|
||||
[STRINGID_BERRYDMGREDUCES - BATTLESTRINGS_TABLE_START] = sText_BerryDmgReducing,
|
||||
[STRINGID_BERRYDMGREDUCES - BATTLESTRINGS_TABLE_START] = COMPOUND_STRING("The {B_LAST_ITEM} weakened the damage to {B_SCR_NAME_WITH_PREFIX2}!"),
|
||||
[STRINGID_GEMACTIVATES - BATTLESTRINGS_TABLE_START] = sText_GemActivates,
|
||||
[STRINGID_LASERFOCUS - BATTLESTRINGS_TABLE_START] = sText_LaserFocusMessage,
|
||||
[STRINGID_THROATCHOPENDS - BATTLESTRINGS_TABLE_START] = sText_ThroatChopEnds,
|
||||
@@ -1350,7 +1347,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_ST
|
||||
[STRINGID_STATSHARPLY - BATTLESTRINGS_TABLE_START] = gText_StatSharply,
|
||||
[STRINGID_STATROSE - BATTLESTRINGS_TABLE_START] = gText_StatRose,
|
||||
[STRINGID_STATHARSHLY - BATTLESTRINGS_TABLE_START] = sText_StatHarshly,
|
||||
[STRINGID_STATFELL - BATTLESTRINGS_TABLE_START] = sText_StatFell,
|
||||
[STRINGID_STATFELL - BATTLESTRINGS_TABLE_START] = gText_StatFell,
|
||||
[STRINGID_ATTACKERSSTATROSE - BATTLESTRINGS_TABLE_START] = sText_AttackersStatRose,
|
||||
[STRINGID_DEFENDERSSTATROSE - BATTLESTRINGS_TABLE_START] = gText_DefendersStatRose,
|
||||
[STRINGID_ATTACKERSSTATFELL - BATTLESTRINGS_TABLE_START] = sText_AttackersStatFell,
|
||||
@@ -1659,8 +1656,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_ST
|
||||
[STRINGID_MEGAEVOREACTING - BATTLESTRINGS_TABLE_START] = sText_MegaEvoReacting,
|
||||
[STRINGID_FERVENTWISHREACHED - BATTLESTRINGS_TABLE_START] = sText_FerventWishReached,
|
||||
[STRINGID_MEGAEVOEVOLVED - BATTLESTRINGS_TABLE_START] = sText_MegaEvoEvolved,
|
||||
[STRINGID_DRASTICALLY - BATTLESTRINGS_TABLE_START] = sText_drastically,
|
||||
[STRINGID_SEVERELY - BATTLESTRINGS_TABLE_START] = sText_severely,
|
||||
[STRINGID_DRASTICALLY - BATTLESTRINGS_TABLE_START] = gText_drastically,
|
||||
[STRINGID_SEVERELY - BATTLESTRINGS_TABLE_START] = gText_severely,
|
||||
[STRINGID_INFESTATION - BATTLESTRINGS_TABLE_START] = sText_Infestation,
|
||||
[STRINGID_NOEFFECTONTARGET - BATTLESTRINGS_TABLE_START] = sText_NoEffectOnTarget,
|
||||
[STRINGID_BURSTINGFLAMESHIT - BATTLESTRINGS_TABLE_START] = sText_BurstingFlames,
|
||||
|
||||
@@ -789,9 +789,12 @@ static const struct FormChange sFurfrouFormChangeTable[] = {
|
||||
|
||||
#if P_FAMILY_HONEDGE
|
||||
static const struct FormChange sAegislashFormChangeTable[] = {
|
||||
{FORM_CHANGE_BATTLE_SWITCH, SPECIES_AEGISLASH_SHIELD},
|
||||
{FORM_CHANGE_FAINT, SPECIES_AEGISLASH_SHIELD},
|
||||
{FORM_CHANGE_END_BATTLE, SPECIES_AEGISLASH_SHIELD},
|
||||
{FORM_CHANGE_BATTLE_BEFORE_MOVE_CATEGORY, SPECIES_AEGISLASH_BLADE, DAMAGE_CATEGORY_PHYSICAL, ABILITY_STANCE_CHANGE},
|
||||
{FORM_CHANGE_BATTLE_BEFORE_MOVE_CATEGORY, SPECIES_AEGISLASH_BLADE, DAMAGE_CATEGORY_SPECIAL, ABILITY_STANCE_CHANGE},
|
||||
{FORM_CHANGE_BATTLE_BEFORE_MOVE, SPECIES_AEGISLASH_SHIELD, MOVE_KINGS_SHIELD, ABILITY_STANCE_CHANGE},
|
||||
{FORM_CHANGE_BATTLE_SWITCH, SPECIES_AEGISLASH_SHIELD},
|
||||
{FORM_CHANGE_FAINT, SPECIES_AEGISLASH_SHIELD},
|
||||
{FORM_CHANGE_END_BATTLE, SPECIES_AEGISLASH_SHIELD},
|
||||
{FORM_CHANGE_TERMINATOR},
|
||||
};
|
||||
#endif //P_FAMILY_HONEDGE
|
||||
|
||||
@@ -861,27 +861,6 @@ static void UNUSED TriggerPendingDaycareMaleEgg(void)
|
||||
_TriggerPendingDaycareMaleEgg(&gSaveBlock1Ptr->daycare);
|
||||
}
|
||||
|
||||
// Removes the selected index from the given IV list and shifts the remaining
|
||||
// elements to the left.
|
||||
static void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv)
|
||||
{
|
||||
s32 i, j;
|
||||
u8 temp[NUM_STATS];
|
||||
|
||||
ivs[selectedIv] = 0xFF;
|
||||
for (i = 0; i < NUM_STATS; i++)
|
||||
{
|
||||
temp[i] = ivs[i];
|
||||
}
|
||||
|
||||
j = 0;
|
||||
for (i = 0; i < NUM_STATS; i++)
|
||||
{
|
||||
if (temp[i] != 0xFF)
|
||||
ivs[j++] = temp[i];
|
||||
}
|
||||
}
|
||||
|
||||
static void InheritIVs(struct Pokemon *egg, struct DayCare *daycare)
|
||||
{
|
||||
u16 motherItem = GetBoxMonData(&daycare->mons[0].mon, MON_DATA_HELD_ITEM);
|
||||
|
||||
@@ -74,7 +74,6 @@ static void EncryptBoxMon(struct BoxPokemon *boxMon);
|
||||
static u8 GetLevelFromMonExp(struct Pokemon *mon);
|
||||
static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon);
|
||||
static bool8 ShouldSkipFriendshipChange(void);
|
||||
static void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv);
|
||||
|
||||
#include "data/abilities.h"
|
||||
|
||||
@@ -1943,6 +1942,27 @@ u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Removes the selected index from the given IV list and shifts the remaining
|
||||
// elements to the left.
|
||||
void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv)
|
||||
{
|
||||
s32 i, j;
|
||||
u8 temp[NUM_STATS];
|
||||
|
||||
ivs[selectedIv] = 0xFF;
|
||||
for (i = 0; i < NUM_STATS; i++)
|
||||
{
|
||||
temp[i] = ivs[i];
|
||||
}
|
||||
|
||||
j = 0;
|
||||
for (i = 0; i < NUM_STATS; i++)
|
||||
{
|
||||
if (temp[i] != 0xFF)
|
||||
ivs[j++] = temp[i];
|
||||
}
|
||||
}
|
||||
|
||||
u8 CountAliveMonsInBattle(u8 caseId, u32 battler)
|
||||
{
|
||||
s32 i;
|
||||
@@ -1953,18 +1973,26 @@ u8 CountAliveMonsInBattle(u8 caseId, u32 battler)
|
||||
case BATTLE_ALIVE_EXCEPT_BATTLER:
|
||||
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
|
||||
{
|
||||
if (i != battler && !(gAbsentBattlerFlags & gBitTable[i]))
|
||||
if (i != battler && !(gAbsentBattlerFlags & (1u << i)))
|
||||
retVal++;
|
||||
}
|
||||
break;
|
||||
case BATTLE_ALIVE_EXCEPT_BATTLER_SIDE:
|
||||
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
|
||||
{
|
||||
if (i != battler && i != BATTLE_PARTNER(battler) && !(gAbsentBattlerFlags & (1u << i)))
|
||||
retVal++;
|
||||
}
|
||||
break;
|
||||
case BATTLE_ALIVE_SIDE:
|
||||
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
|
||||
{
|
||||
if (GetBattlerSide(i) == GetBattlerSide(battler) && !(gAbsentBattlerFlags & gBitTable[i]))
|
||||
if (GetBattlerSide(i) == GetBattlerSide(battler) && !(gAbsentBattlerFlags & (1u << i)))
|
||||
retVal++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
@@ -4001,16 +4029,32 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
|
||||
return retVal;
|
||||
}
|
||||
|
||||
bool8 HealStatusConditions(struct Pokemon *mon, u32 healMask, u8 battleId)
|
||||
bool8 HealStatusConditions(struct Pokemon *mon, u32 healMask, u8 battlerId)
|
||||
{
|
||||
u32 status = GetMonData(mon, MON_DATA_STATUS, NULL);
|
||||
u32 status = GetMonData(mon, MON_DATA_STATUS, 0);
|
||||
|
||||
if (status & healMask)
|
||||
{
|
||||
status &= ~healMask;
|
||||
SetMonData(mon, MON_DATA_STATUS, &status);
|
||||
if (gMain.inBattle && battleId != MAX_BATTLERS_COUNT) {
|
||||
gBattleMons[battleId].status1 &= ~healMask;
|
||||
if (gMain.inBattle && battlerId != MAX_BATTLERS_COUNT)
|
||||
{
|
||||
gBattleMons[battlerId].status1 &= ~healMask;
|
||||
if((healMask & STATUS1_SLEEP))
|
||||
{
|
||||
u32 i = 0;
|
||||
u32 battlerSide = GetBattlerSide(battlerId);
|
||||
struct Pokemon *party = GetSideParty(battlerSide);
|
||||
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
if (&party[i] == mon)
|
||||
{
|
||||
TryDeactivateSleepClause(battlerSide, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
@@ -6121,25 +6165,6 @@ static bool8 ShouldSkipFriendshipChange(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv)
|
||||
{
|
||||
s32 i, j;
|
||||
u8 temp[NUM_STATS];
|
||||
|
||||
ivs[selectedIv] = 0xFF;
|
||||
for (i = 0; i < NUM_STATS; i++)
|
||||
{
|
||||
temp[i] = ivs[i];
|
||||
}
|
||||
|
||||
j = 0;
|
||||
for (i = 0; i < NUM_STATS; i++)
|
||||
{
|
||||
if (temp[i] != 0xFF)
|
||||
ivs[j++] = temp[i];
|
||||
}
|
||||
}
|
||||
|
||||
u16 GetFormSpeciesId(u16 speciesId, u8 formId)
|
||||
{
|
||||
if (GetSpeciesFormTable(speciesId) != NULL)
|
||||
|
||||
@@ -304,12 +304,49 @@ void ScrCmd_createmon(struct ScriptContext *ctx)
|
||||
u8 speedEv = PARSE_FLAG(8, 0);
|
||||
u8 spAtkEv = PARSE_FLAG(9, 0);
|
||||
u8 spDefEv = PARSE_FLAG(10, 0);
|
||||
u8 hpIv = PARSE_FLAG(11, Random() % (MAX_PER_STAT_IVS + 1));
|
||||
u8 atkIv = PARSE_FLAG(12, Random() % (MAX_PER_STAT_IVS + 1));
|
||||
u8 defIv = PARSE_FLAG(13, Random() % (MAX_PER_STAT_IVS + 1));
|
||||
u8 speedIv = PARSE_FLAG(14, Random() % (MAX_PER_STAT_IVS + 1));
|
||||
u8 spAtkIv = PARSE_FLAG(15, Random() % (MAX_PER_STAT_IVS + 1));
|
||||
u8 spDefIv = PARSE_FLAG(16, Random() % (MAX_PER_STAT_IVS + 1));
|
||||
u8 hpIv = Random() % (MAX_PER_STAT_IVS + 1);
|
||||
u8 atkIv = Random() % (MAX_PER_STAT_IVS + 1);
|
||||
u8 defIv = Random() % (MAX_PER_STAT_IVS + 1);
|
||||
u8 speedIv = Random() % (MAX_PER_STAT_IVS + 1);
|
||||
u8 spAtkIv = Random() % (MAX_PER_STAT_IVS + 1);
|
||||
u8 spDefIv = Random() % (MAX_PER_STAT_IVS + 1);
|
||||
|
||||
// Perfect IV calculation
|
||||
u32 i;
|
||||
u8 availableIVs[NUM_STATS];
|
||||
u8 selectedIvs[NUM_STATS];
|
||||
if (gSpeciesInfo[species].perfectIVCount != 0)
|
||||
{
|
||||
// Initialize a list of IV indices.
|
||||
for (i = 0; i < NUM_STATS; i++)
|
||||
availableIVs[i] = i;
|
||||
|
||||
// Select the IVs that will be perfected.
|
||||
for (i = 0; i < NUM_STATS && i < gSpeciesInfo[species].perfectIVCount; i++)
|
||||
{
|
||||
u8 index = Random() % (NUM_STATS - i);
|
||||
selectedIvs[i] = availableIVs[index];
|
||||
RemoveIVIndexFromList(availableIVs, index);
|
||||
}
|
||||
for (i = 0; i < NUM_STATS && i < gSpeciesInfo[species].perfectIVCount; i++)
|
||||
{
|
||||
switch (selectedIvs[i])
|
||||
{
|
||||
case STAT_HP: hpIv = MAX_PER_STAT_IVS; break;
|
||||
case STAT_ATK: atkIv = MAX_PER_STAT_IVS; break;
|
||||
case STAT_DEF: defIv = MAX_PER_STAT_IVS; break;
|
||||
case STAT_SPEED: speedIv = MAX_PER_STAT_IVS; break;
|
||||
case STAT_SPATK: spAtkIv = MAX_PER_STAT_IVS; break;
|
||||
case STAT_SPDEF: spDefIv = MAX_PER_STAT_IVS; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
hpIv = PARSE_FLAG(11, hpIv);
|
||||
atkIv = PARSE_FLAG(12, atkIv);
|
||||
defIv = PARSE_FLAG(13, defIv);
|
||||
speedIv = PARSE_FLAG(14, speedIv);
|
||||
spAtkIv = PARSE_FLAG(15, spAtkIv);
|
||||
spDefIv = PARSE_FLAG(16, spDefIv);
|
||||
u16 move1 = PARSE_FLAG(17, MOVE_NONE);
|
||||
u16 move2 = PARSE_FLAG(18, MOVE_NONE);
|
||||
u16 move3 = PARSE_FLAG(19, MOVE_NONE);
|
||||
|
||||
21
src/sound.c
21
src/sound.c
@@ -349,6 +349,21 @@ void PlayCry_ReleaseDouble(u16 species, s8 pan, u8 mode)
|
||||
}
|
||||
}
|
||||
|
||||
// Duck the BGM but don't restore it. Not present in R/S
|
||||
void PlayCry_DuckNoRestore(u16 species, s8 pan, u8 mode)
|
||||
{
|
||||
if (mode == CRY_MODE_DOUBLES)
|
||||
{
|
||||
PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode);
|
||||
}
|
||||
else
|
||||
{
|
||||
m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 85);
|
||||
PlayCryInternal(species, pan, CRY_VOLUME, CRY_PRIORITY_NORMAL, mode);
|
||||
gPokemonCryBGMDuckingCounter = 2;
|
||||
}
|
||||
}
|
||||
|
||||
void PlayCry_Script(u16 species, u8 mode)
|
||||
{
|
||||
if (!QL_IS_PLAYBACK_STATE) // This check is exclusive to FR/LG
|
||||
@@ -370,7 +385,7 @@ void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode)
|
||||
|
||||
// Set default values
|
||||
// May be overridden depending on mode.
|
||||
length = 140;
|
||||
length = 210;
|
||||
reverse = FALSE;
|
||||
release = 0;
|
||||
pitch = 15360;
|
||||
@@ -454,10 +469,6 @@ void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode)
|
||||
SetPokemonCryChorus(chorus);
|
||||
SetPokemonCryPriority(priority);
|
||||
|
||||
// This is a fancy way to get a cry of a pokemon.
|
||||
// It creates 4 sets of 128 mini cry tables.
|
||||
// If you wish to expand pokemon, you need to
|
||||
// append new cases to the switch.
|
||||
species = GetCryIdBySpecies(species);
|
||||
if (species != CRY_NONE)
|
||||
{
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].power > 0);
|
||||
ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL);
|
||||
ASSUME(GetMovePower(MOVE_TACKLE) > 0);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Aerilate turns a Normal-type move into Flying-type move")
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
SINGLE_BATTLE_TEST("Anger Point raises Attack stage to maximum after receiving a critical hit")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit);
|
||||
ASSUME(MoveAlwaysCrits(MOVE_FROST_BREATH));
|
||||
PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); }
|
||||
OPPONENT(SPECIES_SNORUNT);
|
||||
} WHEN {
|
||||
@@ -23,8 +23,8 @@ SINGLE_BATTLE_TEST("Anger Point raises Attack stage to maximum after receiving a
|
||||
SINGLE_BATTLE_TEST("Anger Point does not trigger when already at maximum Attack stage")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit);
|
||||
ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM);
|
||||
ASSUME(MoveAlwaysCrits(MOVE_FROST_BREATH));
|
||||
ASSUME(GetMoveEffect(MOVE_BELLY_DRUM) == EFFECT_BELLY_DRUM);
|
||||
PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); Speed(2); }
|
||||
OPPONENT(SPECIES_SNORUNT) { Speed(1); }
|
||||
} WHEN {
|
||||
@@ -50,8 +50,8 @@ TO_DO_BATTLE_TEST("Anger Point triggers when a substitute takes the hit (Gen4)")
|
||||
SINGLE_BATTLE_TEST("Anger Point does not trigger when a substitute takes the hit (Gen5+)")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit);
|
||||
ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE);
|
||||
ASSUME(MoveAlwaysCrits(MOVE_FROST_BREATH));
|
||||
ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE);
|
||||
PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); Speed(2); }
|
||||
OPPONENT(SPECIES_SNORUNT) { Speed(1); }
|
||||
} WHEN {
|
||||
|
||||
@@ -14,7 +14,7 @@ SINGLE_BATTLE_TEST("Anger Shell activates only if the target had more than 50% o
|
||||
PARAMETRIZE { hp = 254; activates = TRUE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].power != 0);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_KLAWF) { Ability(ABILITY_ANGER_SHELL); MaxHP(maxHp); HP(hp); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Anger Shell lowers Def/Sp.Def by 1 and raises Atk/Sp.Atk/Spd
|
||||
{
|
||||
u16 maxHp = 500;
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].power != 0);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_KLAWF) { Ability(ABILITY_ANGER_SHELL); MaxHP(maxHp); HP(maxHp / 2 + 1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -73,7 +73,7 @@ SINGLE_BATTLE_TEST("Anger Shell activates after all hits from a multi-hit move")
|
||||
u32 j;
|
||||
u16 maxHp = 500;
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DOUBLE_SLAP].effect == EFFECT_MULTI_HIT);
|
||||
ASSUME(GetMoveEffect(MOVE_DOUBLE_SLAP) == EFFECT_MULTI_HIT);
|
||||
PLAYER(SPECIES_KLAWF) { Ability(ABILITY_ANGER_SHELL); MaxHP(maxHp); HP(maxHp / 2 + 1); }
|
||||
OPPONENT(SPECIES_SHELLDER) { Ability(ABILITY_SKILL_LINK); } // Always hits 5 times.
|
||||
} WHEN {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_WATER_GUN].power != 0);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_WATER_GUN));
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Battle Bond does not transform species other than Greninja")
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_WATER_GUN].category == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(gMovesInfo[MOVE_ROLE_PLAY].effect == EFFECT_ROLE_PLAY);
|
||||
ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveEffect(MOVE_ROLE_PLAY) == EFFECT_ROLE_PLAY);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Beads of Ruin reduces Sp. Def if opposing mon's ability doesn't match")
|
||||
@@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Beads of Ruin reduces Sp. Def if opposing mon's ability does
|
||||
SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battlers fainted - Player")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
|
||||
ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(1);}
|
||||
PLAYER(SPECIES_CHI_YU);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battler
|
||||
SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battlers fainted - Opponent")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
|
||||
ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { HP(1);}
|
||||
|
||||
@@ -14,7 +14,7 @@ SINGLE_BATTLE_TEST("Berserk activates only if the target had more than 50% of it
|
||||
PARAMETRIZE { hp = 254; activates = TRUE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].power != 0);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); MaxHP(maxHp); HP(hp); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Berserk raises Sp.Atk by 1")
|
||||
{
|
||||
u16 maxHp = 500;
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].power != 0);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); MaxHP(maxHp); HP(maxHp / 2 + 1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -57,7 +57,7 @@ SINGLE_BATTLE_TEST("Berserk activates after all hits from a multi-hit move")
|
||||
u32 j;
|
||||
u16 maxHp = 500;
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DOUBLE_SLAP].effect == EFFECT_MULTI_HIT);
|
||||
ASSUME(GetMoveEffect(MOVE_DOUBLE_SLAP) == EFFECT_MULTI_HIT);
|
||||
PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); MaxHP(maxHp); HP(maxHp / 2 + 1); }
|
||||
OPPONENT(SPECIES_SHELLDER) { Ability(ABILITY_SKILL_LINK); } // Always hits 5 times.
|
||||
} WHEN {
|
||||
|
||||
@@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Blaze boosts Fire-type moves in a pinch", s16 damage)
|
||||
PARAMETRIZE { hp = 99; }
|
||||
PARAMETRIZE { hp = 33; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE);
|
||||
ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE);
|
||||
PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); MaxHP(99); HP(hp); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -58,13 +58,13 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent stat st
|
||||
}
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN);
|
||||
ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN);
|
||||
ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN);
|
||||
ASSUME(gMovesInfo[MOVE_FAKE_TEARS].effect == EFFECT_SPECIAL_DEFENSE_DOWN_2);
|
||||
ASSUME(gMovesInfo[MOVE_SCARY_FACE].effect == EFFECT_SPEED_DOWN_2);
|
||||
ASSUME(gMovesInfo[MOVE_SWEET_SCENT].effect == (B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN));
|
||||
ASSUME(gMovesInfo[MOVE_SAND_ATTACK].effect == EFFECT_ACCURACY_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_CONFIDE) == EFFECT_SPECIAL_ATTACK_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_FAKE_TEARS) == EFFECT_SPECIAL_DEFENSE_DOWN_2);
|
||||
ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2);
|
||||
ASSUME(GetMoveEffect(MOVE_SWEET_SCENT) == (B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN));
|
||||
ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN);
|
||||
PLAYER(SPECIES_WOBBUFFET)
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
} WHEN {
|
||||
@@ -91,7 +91,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent Sticky
|
||||
PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; }
|
||||
PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_STICKY_WEB].effect == EFFECT_STICKY_WEB);
|
||||
ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB);
|
||||
PLAYER(SPECIES_WOBBUFFET)
|
||||
OPPONENT(SPECIES_WOBBUFFET)
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
@@ -166,13 +166,13 @@ SINGLE_BATTLE_TEST("Mold Breaker, Teravolt, and Turboblaze ignore Clear Body and
|
||||
}
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN);
|
||||
ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN);
|
||||
ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN);
|
||||
ASSUME(gMovesInfo[MOVE_FAKE_TEARS].effect == EFFECT_SPECIAL_DEFENSE_DOWN_2);
|
||||
ASSUME(gMovesInfo[MOVE_SCARY_FACE].effect == EFFECT_SPEED_DOWN_2);
|
||||
ASSUME(gMovesInfo[MOVE_SWEET_SCENT].effect == (B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN));
|
||||
ASSUME(gMovesInfo[MOVE_SAND_ATTACK].effect == EFFECT_ACCURACY_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_CONFIDE) == EFFECT_SPECIAL_ATTACK_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_FAKE_TEARS) == EFFECT_SPECIAL_DEFENSE_DOWN_2);
|
||||
ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2);
|
||||
ASSUME(GetMoveEffect(MOVE_SWEET_SCENT) == (B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN));
|
||||
ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Ability(breakerAbility); }
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
} WHEN {
|
||||
@@ -284,7 +284,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent A
|
||||
PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; burned = FALSE; }
|
||||
PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; burned = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET)
|
||||
OPPONENT(species) { Ability(ability); if (burned) Status1(STATUS1_BURN); }
|
||||
} WHEN {
|
||||
@@ -306,8 +306,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent r
|
||||
PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SCARY_FACE].effect == EFFECT_SPEED_DOWN_2);
|
||||
ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS);
|
||||
ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2);
|
||||
ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(4); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(3); }
|
||||
OPPONENT(species) { Speed(6); Ability(ability); }
|
||||
@@ -336,9 +336,9 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent T
|
||||
PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOPSY_TURVY].effect == EFFECT_TOPSY_TURVY);
|
||||
ASSUME(gMovesInfo[MOVE_SCARY_FACE].effect == EFFECT_SPEED_DOWN_2);
|
||||
ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS);
|
||||
ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY);
|
||||
ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2);
|
||||
ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(4); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(3); }
|
||||
OPPONENT(species) { Speed(6); Ability(ability); }
|
||||
@@ -378,7 +378,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S
|
||||
|
||||
GIVEN {
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_SPECTRAL_THIEF) == TRUE);
|
||||
ASSUME(gMovesInfo[MOVE_AGILITY].effect == EFFECT_SPEED_UP_2);
|
||||
ASSUME(GetMoveEffect(MOVE_AGILITY) == EFFECT_SPEED_UP_2);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(4); }
|
||||
OPPONENT(species) { Speed(5); Ability(ability); }
|
||||
} WHEN {
|
||||
|
||||
@@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but witho
|
||||
PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; }
|
||||
PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SANDSTORM].effect == EFFECT_SANDSTORM);
|
||||
ASSUME(GetMoveEffect(MOVE_SANDSTORM) == EFFECT_SANDSTORM);
|
||||
PLAYER(species) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -175,7 +175,7 @@ DOUBLE_BATTLE_TEST("Commander prevents Red Card from working while Commander is
|
||||
DOUBLE_BATTLE_TEST("Commander Tatsugiri is not damaged by a double target move if Dondozo faints")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY);
|
||||
PLAYER(SPECIES_DONDOZO) { HP(1); };
|
||||
PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); }
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
@@ -187,9 +187,9 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri is not damaged by a double target move i
|
||||
ABILITY_POPUP(playerRight, ABILITY_COMMANDER);
|
||||
MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!");
|
||||
HP_BAR(playerLeft);
|
||||
MESSAGE("Dondozo fainted!");
|
||||
NOT HP_BAR(playerRight);
|
||||
HP_BAR(opponentRight);
|
||||
NOT HP_BAR(playerRight);
|
||||
MESSAGE("Dondozo fainted!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -308,7 +308,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri is still affected by Haze while controll
|
||||
DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Left Slot)")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); }
|
||||
PLAYER(SPECIES_DONDOZO);
|
||||
@@ -323,15 +323,15 @@ DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Left Slot)")
|
||||
MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!");
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, opponentLeft);
|
||||
HP_BAR(playerLeft);
|
||||
MESSAGE("The opposing Wobbuffet's attack missed!");
|
||||
HP_BAR(opponentRight);
|
||||
MESSAGE("The opposing Wobbuffet's attack missed!");
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Right Slot)")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY);
|
||||
PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_DONDOZO);
|
||||
@@ -380,7 +380,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri does not attack if Dondozo faints the sa
|
||||
DOUBLE_BATTLE_TEST("Commander Tatsugiri does not get hit by Dragon Darts when a commanded Dondozo faints")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_DARTS].effect == EFFECT_DRAGON_DARTS);
|
||||
ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_DONDOZO) { HP(1); }
|
||||
PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); }
|
||||
@@ -402,7 +402,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri does not get hit by Dragon Darts when co
|
||||
PARAMETRIZE { targetPlayerRight = TRUE; }
|
||||
PARAMETRIZE { targetPlayerRight = FALSE; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_DARTS].effect == EFFECT_DRAGON_DARTS);
|
||||
ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS);
|
||||
PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); }
|
||||
PLAYER(SPECIES_DONDOZO);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
||||
@@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Compound Eyes raises accuracy")
|
||||
{
|
||||
PASSES_RANDOMLY(91, 100, RNG_ACCURACY);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_THUNDER].accuracy == 70);
|
||||
ASSUME(GetMoveAccuracy(MOVE_THUNDER) == 70);
|
||||
PLAYER(SPECIES_BUTTERFREE) { Ability(ABILITY_COMPOUND_EYES); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -20,8 +20,8 @@ SINGLE_BATTLE_TEST("Compound Eyes does not affect OHKO moves")
|
||||
{
|
||||
PASSES_RANDOMLY(30, 100, RNG_ACCURACY);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FISSURE].accuracy == 30);
|
||||
ASSUME(gMovesInfo[MOVE_FISSURE].effect == EFFECT_OHKO);
|
||||
ASSUME(GetMoveAccuracy(MOVE_FISSURE) == 30);
|
||||
ASSUME(GetMoveEffect(MOVE_FISSURE) == EFFECT_OHKO);
|
||||
PLAYER(SPECIES_BUTTERFREE) { Ability(ABILITY_COMPOUND_EYES); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a single battle", s16 damage)
|
||||
@@ -83,7 +83,7 @@ SINGLE_BATTLE_TEST("Contrary raises stats after using a move which would normall
|
||||
PARAMETRIZE { ability = ABILITY_TANGLED_FEET; }
|
||||
GIVEN {
|
||||
ASSUME(MoveHasAdditionalEffectSelf(MOVE_OVERHEAT, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE);
|
||||
ASSUME(gMovesInfo[MOVE_OVERHEAT].category == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveCategory(MOVE_OVERHEAT) == DAMAGE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_SPINDA) { Ability(ability); }
|
||||
} WHEN {
|
||||
@@ -126,7 +126,7 @@ SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normal
|
||||
PARAMETRIZE { ability = ABILITY_CONTRARY; }
|
||||
PARAMETRIZE { ability = ABILITY_TANGLED_FEET; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2);
|
||||
ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Defense(102); }
|
||||
OPPONENT(SPECIES_SPINDA) { Ability(ability); Attack(100); }
|
||||
} WHEN {
|
||||
@@ -163,7 +163,7 @@ SINGLE_BATTLE_TEST("Contrary raises a stat after using a move which would normal
|
||||
PARAMETRIZE { ability = ABILITY_CONTRARY; }
|
||||
PARAMETRIZE { ability = ABILITY_TANGLED_FEET; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(3); }
|
||||
OPPONENT(SPECIES_SPINDA) { Ability(ability); Speed(2); }
|
||||
} WHEN {
|
||||
@@ -194,7 +194,7 @@ SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normal
|
||||
PARAMETRIZE { ability = ABILITY_CONTRARY; }
|
||||
PARAMETRIZE { ability = ABILITY_TANGLED_FEET; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM);
|
||||
ASSUME(GetMoveEffect(MOVE_BELLY_DRUM) == EFFECT_BELLY_DRUM);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_SPINDA) { Ability(ability); }
|
||||
} WHEN {
|
||||
|
||||
@@ -30,8 +30,8 @@ SINGLE_BATTLE_TEST("Corrosion can poison or badly poison a Steel type with a sta
|
||||
PARAMETRIZE { move = MOVE_TOXIC; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON);
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); }
|
||||
OPPONENT(SPECIES_BELDUM);
|
||||
} WHEN {
|
||||
@@ -72,7 +72,7 @@ SINGLE_BATTLE_TEST("Corrosion can poison Poison- and Steel-type targets if it us
|
||||
PARAMETRIZE { heldItem = ITEM_TOXIC_ORB; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING);
|
||||
ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING);
|
||||
ASSUME(gItemsInfo[ITEM_POISON_BARB].holdEffect == HOLD_EFFECT_POISON_POWER);
|
||||
ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB);
|
||||
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(heldItem); }
|
||||
@@ -110,8 +110,8 @@ SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion poisons a
|
||||
PARAMETRIZE { move = MOVE_TOXIC; }
|
||||
PARAMETRIZE { move = MOVE_POISON_POWDER; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON);
|
||||
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); }
|
||||
OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); }
|
||||
} WHEN {
|
||||
@@ -137,8 +137,8 @@ SINGLE_BATTLE_TEST("Corrosion cannot bypass moves that prevent poisoning such as
|
||||
PARAMETRIZE { move = MOVE_TOXIC; }
|
||||
PARAMETRIZE { move = MOVE_POISON_POWDER; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON);
|
||||
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -159,8 +159,8 @@ SINGLE_BATTLE_TEST("Corrosion cannot bypass abilities that prevent poisoning suc
|
||||
PARAMETRIZE { move = MOVE_TOXIC; }
|
||||
PARAMETRIZE { move = MOVE_POISON_POWDER; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON);
|
||||
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); }
|
||||
OPPONENT(SPECIES_SNORLAX) { Ability(ABILITY_IMMUNITY); }
|
||||
} WHEN {
|
||||
@@ -181,9 +181,9 @@ SINGLE_BATTLE_TEST("Corrosion allows the Pokémon with the ability to poison a S
|
||||
PARAMETRIZE { move = MOVE_TOXIC; }
|
||||
PARAMETRIZE { move = MOVE_POISON_POWDER; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON);
|
||||
ASSUME(gMovesInfo[MOVE_MAGIC_COAT].effect == EFFECT_MAGIC_COAT);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON);
|
||||
ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT);
|
||||
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); }
|
||||
OPPONENT(SPECIES_BELDUM);
|
||||
} WHEN {
|
||||
@@ -205,9 +205,9 @@ SINGLE_BATTLE_TEST("Corrosion's effect is lost if the move used by the Pokémon
|
||||
PARAMETRIZE { move = MOVE_TOXIC; }
|
||||
PARAMETRIZE { move = MOVE_POISON_POWDER; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(gMovesInfo[MOVE_POISON_POWDER].effect == EFFECT_POISON);
|
||||
ASSUME(gMovesInfo[MOVE_MAGIC_COAT].effect == EFFECT_MAGIC_COAT);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON);
|
||||
ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT);
|
||||
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -62,3 +62,37 @@ DOUBLE_BATTLE_TEST("Cotton Down drops speed by one of all other battlers on the
|
||||
EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1);
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Cotton Down correctly gets blocked by stat reduction preventing abilities")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_METAGROSS) { Ability(ABILITY_CLEAR_BODY); }
|
||||
PLAYER(SPECIES_WYNAUT) { Item(ITEM_CLEAR_AMULET); }
|
||||
OPPONENT(SPECIES_ELDEGOSS) { Ability(ABILITY_COTTON_DOWN); }
|
||||
OPPONENT(SPECIES_CORVIKNIGHT) { Ability(ABILITY_MIRROR_ARMOR); }
|
||||
} WHEN {
|
||||
TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerLeft);
|
||||
ABILITY_POPUP(opponentLeft, ABILITY_COTTON_DOWN);
|
||||
NONE_OF {
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft);
|
||||
MESSAGE("Metagross's Speed fell!");
|
||||
}
|
||||
ABILITY_POPUP(playerLeft, ABILITY_CLEAR_BODY);
|
||||
NONE_OF {
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight);
|
||||
MESSAGE("Wynaut's Speed fell!");
|
||||
}
|
||||
MESSAGE("The effects of the Clear Amulet held by Wynaut prevents its stats from being lowered!");
|
||||
NONE_OF {
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight);
|
||||
MESSAGE("The opposing Corviknight's Speed fell!");
|
||||
}
|
||||
ABILITY_POPUP(opponentRight, ABILITY_MIRROR_ARMOR);
|
||||
} THEN {
|
||||
EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE);
|
||||
EXPECT_EQ(playerRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE);
|
||||
EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Kee Berry effect again on the next tu
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gItemsInfo[ITEM_KEE_BERRY].holdEffect == HOLD_EFFECT_KEE_BERRY);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_TAUROS_PALDEA_COMBAT) { Ability(ABILITY_CUD_CHEW); Item(ITEM_KEE_BERRY); }
|
||||
} WHEN {
|
||||
@@ -28,8 +28,8 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Oran Berry effect again on the next t
|
||||
GIVEN {
|
||||
ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP);
|
||||
ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffectParam == 10);
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG);
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_RAGE].argument == 40);
|
||||
ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_DAMAGE_ARG);
|
||||
ASSUME(GetMoveFixedDamage(MOVE_DRAGON_RAGE) == 40);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_TAUROS_PALDEA_COMBAT) { MaxHP(60); HP(60); Ability(ABILITY_CUD_CHEW); Item(ITEM_ORAN_BERRY); }
|
||||
} WHEN {
|
||||
|
||||
@@ -7,15 +7,15 @@ SINGLE_BATTLE_TEST("Cute Charm inflicts infatuation on contact")
|
||||
PARAMETRIZE { move = MOVE_TACKLE; }
|
||||
PARAMETRIZE { move = MOVE_SWIFT; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(!gMovesInfo[MOVE_SWIFT].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
ASSUME(!MoveMakesContact(MOVE_SWIFT));
|
||||
PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); }
|
||||
OPPONENT(SPECIES_CLEFAIRY) { Gender(MON_FEMALE); Ability(ABILITY_CUTE_CHARM); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
TURN { MOVE(player, move); }
|
||||
} SCENE {
|
||||
if (gMovesInfo[move].makesContact) {
|
||||
if (MoveMakesContact(move)) {
|
||||
ABILITY_POPUP(opponent, ABILITY_CUTE_CHARM);
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_INFATUATION, player);
|
||||
MESSAGE("The opposing Clefairy's Cute Charm infatuated Wobbuffet!");
|
||||
@@ -51,7 +51,7 @@ SINGLE_BATTLE_TEST("Cute Charm triggers 30% of the time")
|
||||
PASSES_RANDOMLY(3, 10, RNG_CUTE_CHARM);
|
||||
GIVEN {
|
||||
ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_4);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); }
|
||||
OPPONENT(SPECIES_CLEFAIRY) { Gender(MON_FEMALE); Ability(ABILITY_CUTE_CHARM); }
|
||||
} WHEN {
|
||||
|
||||
@@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from self")
|
||||
SINGLE_BATTLE_TEST("Damp prevents damage from Aftermath")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_PARAS) { Ability(ABILITY_DAMP); }
|
||||
OPPONENT(SPECIES_VOLTORB) { Ability(ABILITY_AFTERMATH); HP(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
SINGLE_BATTLE_TEST("Dancer can copy a dance move immediately after it was used and allow the user of Dancer to still use its move")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_QUIVER_DANCE].danceMove == TRUE);
|
||||
ASSUME(IsDanceMove(MOVE_QUIVER_DANCE));
|
||||
PLAYER(SPECIES_WOBBUFFET)
|
||||
OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); }
|
||||
} WHEN {
|
||||
@@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Dancer can copy a dance move immediately after it was used a
|
||||
SINGLE_BATTLE_TEST("Dancer can copy Teeter Dance")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TEETER_DANCE].danceMove == TRUE);
|
||||
ASSUME(IsDanceMove(MOVE_TEETER_DANCE));
|
||||
PLAYER(SPECIES_WOBBUFFET)
|
||||
OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Item(ITEM_LUM_BERRY); }
|
||||
} WHEN {
|
||||
@@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Dancer can copy Teeter Dance")
|
||||
DOUBLE_BATTLE_TEST("Dancer can copy Teeter Dance and confuse both opposing targets")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TEETER_DANCE].danceMove == TRUE);
|
||||
ASSUME(IsDanceMove(MOVE_TEETER_DANCE));
|
||||
ASSUME(gItemsInfo[ITEM_LUM_BERRY].holdEffect == HOLD_EFFECT_CURE_STATUS);
|
||||
PLAYER(SPECIES_WOBBUFFET)
|
||||
PLAYER(SPECIES_WYNAUT) { Item(ITEM_LUM_BERRY); }
|
||||
@@ -57,7 +57,7 @@ DOUBLE_BATTLE_TEST("Dancer can copy Teeter Dance and confuse both opposing targe
|
||||
DOUBLE_BATTLE_TEST("Dancer triggers from slowest to fastest")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE);
|
||||
ASSUME(IsDanceMove(MOVE_DRAGON_DANCE));
|
||||
PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_DANCER); Speed(10); }
|
||||
PLAYER(SPECIES_WYNAUT) { Speed(50); }
|
||||
OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(20); }
|
||||
@@ -83,7 +83,7 @@ SINGLE_BATTLE_TEST("Dancer doesn't trigger if the original user flinches")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(MoveHasAdditionalEffectWithChance(MOVE_FAKE_OUT, MOVE_EFFECT_FLINCH, 100));
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE);
|
||||
ASSUME(IsDanceMove(MOVE_DRAGON_DANCE));
|
||||
PLAYER(SPECIES_WOBBUFFET)
|
||||
OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); }
|
||||
} WHEN {
|
||||
@@ -102,7 +102,7 @@ DOUBLE_BATTLE_TEST("Dancer still triggers if another dancer flinches")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(MoveHasAdditionalEffectWithChance(MOVE_FAKE_OUT, MOVE_EFFECT_FLINCH, 100));
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE);
|
||||
ASSUME(IsDanceMove(MOVE_DRAGON_DANCE));
|
||||
PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_DANCER); Speed(10); }
|
||||
PLAYER(SPECIES_WYNAUT) { Speed(5); }
|
||||
OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(20); }
|
||||
@@ -130,8 +130,8 @@ DOUBLE_BATTLE_TEST("Dancer still triggers if another dancer flinches")
|
||||
SINGLE_BATTLE_TEST("Dancer-called attacks have their type updated")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].danceMove == TRUE);
|
||||
ASSUME(gMovesInfo[MOVE_REVELATION_DANCE].effect == EFFECT_REVELATION_DANCE);
|
||||
ASSUME(IsDanceMove(MOVE_REVELATION_DANCE));
|
||||
ASSUME(GetMoveEffect(MOVE_REVELATION_DANCE) == EFFECT_REVELATION_DANCE);
|
||||
PLAYER(SPECIES_TANGROWTH);
|
||||
OPPONENT(SPECIES_ORICORIO_BAILE);
|
||||
} WHEN {
|
||||
@@ -149,8 +149,8 @@ SINGLE_BATTLE_TEST("Dancer-called attacks have their type updated")
|
||||
DOUBLE_BATTLE_TEST("Dancer doesn't trigger on a snatched move")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE);
|
||||
ASSUME(gMovesInfo[MOVE_SNATCH].effect == EFFECT_SNATCH);
|
||||
ASSUME(IsDanceMove(MOVE_DRAGON_DANCE));
|
||||
ASSUME(GetMoveEffect(MOVE_SNATCH) == EFFECT_SNATCH);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_ORICORIO);
|
||||
@@ -173,9 +173,9 @@ DOUBLE_BATTLE_TEST("Dancer doesn't trigger on a snatched move")
|
||||
DOUBLE_BATTLE_TEST("Dancer triggers on Instructed dance moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE);
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].instructBanned == FALSE);
|
||||
ASSUME(gMovesInfo[MOVE_INSTRUCT].effect == EFFECT_INSTRUCT);
|
||||
ASSUME(IsDanceMove(MOVE_DRAGON_DANCE));
|
||||
ASSUME(!IsMoveInstructBanned(MOVE_DRAGON_DANCE));
|
||||
ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_ORICORIO);
|
||||
@@ -200,9 +200,9 @@ DOUBLE_BATTLE_TEST("Dancer triggers on Instructed dance moves")
|
||||
DOUBLE_BATTLE_TEST("Dancer-called move doesn't update move to be Instructed")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].instructBanned == FALSE);
|
||||
ASSUME(gMovesInfo[MOVE_INSTRUCT].effect == EFFECT_INSTRUCT);
|
||||
ASSUME(IsDanceMove(MOVE_DRAGON_DANCE));
|
||||
ASSUME(!IsMoveInstructBanned(MOVE_TACKLE));
|
||||
ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_ORICORIO);
|
||||
@@ -228,8 +228,8 @@ DOUBLE_BATTLE_TEST("Dancer-called move doesn't update move to be Instructed")
|
||||
DOUBLE_BATTLE_TEST("Dancer doesn't call a move that didn't execute due to Powder")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FIERY_DANCE].danceMove == TRUE);
|
||||
ASSUME(gMovesInfo[MOVE_FIERY_DANCE].type == TYPE_FIRE);
|
||||
ASSUME(IsDanceMove(MOVE_FIERY_DANCE));
|
||||
ASSUME(GetMoveType(MOVE_FIERY_DANCE) == TYPE_FIRE);
|
||||
PLAYER(SPECIES_VOLCARONA);
|
||||
PLAYER(SPECIES_ORICORIO);
|
||||
OPPONENT(SPECIES_WYNAUT);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(B_PROTEAN_LIBERO == GEN_9);
|
||||
ASSUME(B_DAUNTLESS_SHIELD == GEN_9);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage")
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority > 0);
|
||||
ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) > 0);
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect the user from priority moves")
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gMovesInfo[MOVE_ECHOED_VOICE].category == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_ECHOED_VOICE) == DAMAGE_CATEGORY_SPECIAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Defeatist halves Attack when HP <= 50%", s16 damage)
|
||||
|
||||
@@ -277,7 +277,7 @@ SINGLE_BATTLE_TEST("Defiant activates before White Herb")
|
||||
SINGLE_BATTLE_TEST("Defiant activates for each stat that is lowered")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TICKLE].effect == EFFECT_TICKLE);
|
||||
ASSUME(GetMoveEffect(MOVE_TICKLE) == EFFECT_TICKLE);
|
||||
PLAYER(SPECIES_MANKEY) { Ability(ABILITY_DEFIANT); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_WATER_GUN].power != 0);
|
||||
ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_WATER_GUN));
|
||||
ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves")
|
||||
@@ -32,9 +32,9 @@ SINGLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves")
|
||||
DOUBLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves and prints the message only once with moves hitting multiple targets")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SURF].power != 0);
|
||||
ASSUME(gMovesInfo[MOVE_SURF].type == TYPE_WATER);
|
||||
ASSUME(gMovesInfo[MOVE_SURF].target == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_SURF));
|
||||
ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER);
|
||||
ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY);
|
||||
PLAYER(SPECIES_GROUDON) {Item(ITEM_RED_ORB); {Speed(5);}}
|
||||
PLAYER(SPECIES_WOBBUFFET) {Speed(5);}
|
||||
OPPONENT(SPECIES_WOBBUFFET) {Speed(10);}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_AERIAL_ACE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_AERIAL_ACE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Disguised Mimikyu will lose 1/8 of its max HP upon changing to its busted form")
|
||||
@@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu will lose 1/8 of its max HP upon changing
|
||||
SINGLE_BATTLE_TEST("Disguised Mimikyu takes no damage from a confusion hit and changes to its busted form")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE);
|
||||
ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE);
|
||||
PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -69,7 +69,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu's Air Balloon will pop upon changing to it
|
||||
SINGLE_BATTLE_TEST("Disguised Mimikyu takes damage from secondary damage without breaking the disguise")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].effect == EFFECT_STEALTH_ROCK);
|
||||
ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@@ -138,7 +138,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu is ignored by Mold Breaker")
|
||||
SINGLE_BATTLE_TEST("Disguised Mimikyu's types revert back to Ghost/Fairy when Disguise is broken")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SHADOW_CLAW].type == TYPE_GHOST);
|
||||
ASSUME(GetMoveType(MOVE_SHADOW_CLAW) == TYPE_GHOST);
|
||||
PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -158,7 +158,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu's types revert back to Ghost/Fairy when Di
|
||||
SINGLE_BATTLE_TEST("Disguised Mimikyu blocks a move after getting Gastro Acid Batton Passed")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS);
|
||||
ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@@ -173,3 +173,19 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu blocks a move after getting Gastro Acid Ba
|
||||
ABILITY_POPUP(player, ABILITY_DISGUISE);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Disguise does not break from a teammate's Wish")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_WISH) == EFFECT_WISH);
|
||||
PLAYER(SPECIES_JIRACHI);
|
||||
PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); HP(219); MaxHP(220); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_WISH); }
|
||||
TURN { SWITCH(player, 1); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player);
|
||||
NOT ABILITY_POPUP(player, ABILITY_DISGUISE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gMovesInfo[MOVE_TRI_ATTACK].category == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TRI_ATTACK) == DAMAGE_CATEGORY_SPECIAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Download raises Attack if player has lower Def than Sp. Def", s16 damage)
|
||||
@@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Download doesn't activate if target hasn't been sent out yet
|
||||
PARAMETRIZE { ability = ABILITY_TRACE; }
|
||||
PARAMETRIZE { ability = ABILITY_DOWNLOAD; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
|
||||
ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(100); }
|
||||
PLAYER(SPECIES_PORYGON) { Ability(ability); Defense(400); SpDefense(300); Speed(300); Attack(100); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); }
|
||||
|
||||
@@ -14,11 +14,11 @@ SINGLE_BATTLE_TEST("Dragon's Maw increases Dragon-type move damage", s16 damage)
|
||||
PARAMETRIZE { move = MOVE_DRAGON_BREATH; ability = ABILITY_DRAGONS_MAW; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].type != TYPE_DRAGON);
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_CLAW].type == TYPE_DRAGON);
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_BREATH].type == TYPE_DRAGON);
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_CLAW].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_BREATH].category == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveType(MOVE_TACKLE) != TYPE_DRAGON);
|
||||
ASSUME(GetMoveType(MOVE_DRAGON_CLAW) == TYPE_DRAGON);
|
||||
ASSUME(GetMoveType(MOVE_DRAGON_BREATH) == TYPE_DRAGON);
|
||||
ASSUME(GetMoveCategory(MOVE_DRAGON_CLAW) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_DRAGON_BREATH) == DAMAGE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_REGIDRAGO) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -39,8 +39,8 @@ SINGLE_BATTLE_TEST("Dry Skin increases damage taken from Fire-type moves by 25%"
|
||||
PARAMETRIZE { ability = ABILITY_EFFECT_SPORE; }
|
||||
PARAMETRIZE { ability = ABILITY_DRY_SKIN; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE);
|
||||
ASSUME(gMovesInfo[MOVE_EMBER].power == 40);
|
||||
ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE);
|
||||
ASSUME(GetMovePower(MOVE_EMBER) == 40);
|
||||
ASSUME(gSpeciesInfo[SPECIES_PARASECT].types[0] == TYPE_BUG);
|
||||
ASSUME(gSpeciesInfo[SPECIES_PARASECT].types[1] == TYPE_GRASS);
|
||||
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC);
|
||||
@@ -64,7 +64,7 @@ SINGLE_BATTLE_TEST("Dry Skin increases damage taken from Fire-type moves by 25%"
|
||||
SINGLE_BATTLE_TEST("Dry Skin heals 25% when hit by water type moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_BUBBLE].type == TYPE_WATER);
|
||||
ASSUME(GetMoveType(MOVE_BUBBLE) == TYPE_WATER);
|
||||
PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); HP(100); MaxHP(200); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -79,7 +79,7 @@ SINGLE_BATTLE_TEST("Dry Skin heals 25% when hit by water type moves")
|
||||
SINGLE_BATTLE_TEST("Dry Skin does not activate if protected")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_BUBBLE].type == TYPE_WATER);
|
||||
ASSUME(GetMoveType(MOVE_BUBBLE) == TYPE_WATER);
|
||||
PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); HP(100); MaxHP(200); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -92,8 +92,8 @@ SINGLE_BATTLE_TEST("Dry Skin does not activate if protected")
|
||||
SINGLE_BATTLE_TEST("Dry Skin is only triggered once on multi strike moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_WATER_SHURIKEN].type == TYPE_WATER);
|
||||
ASSUME(gMovesInfo[MOVE_WATER_SHURIKEN].effect == EFFECT_MULTI_HIT);
|
||||
ASSUME(GetMoveType(MOVE_WATER_SHURIKEN) == TYPE_WATER);
|
||||
ASSUME(GetMoveEffect(MOVE_WATER_SHURIKEN) == EFFECT_MULTI_HIT);
|
||||
PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); HP(100); MaxHP(200); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -111,7 +111,7 @@ SINGLE_BATTLE_TEST("Dry Skin prevents Absorb Bulb and Luminous Moss from activat
|
||||
PARAMETRIZE { item = ITEM_ABSORB_BULB; }
|
||||
PARAMETRIZE { item = ITEM_LUMINOUS_MOSS; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_BUBBLE].type == TYPE_WATER);
|
||||
ASSUME(GetMoveType(MOVE_BUBBLE) == TYPE_WATER);
|
||||
PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); HP(100); MaxHP(200); Item(item); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
SINGLE_BATTLE_TEST("Earth Eater heals 25% when hit by ground type moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_MUD_SLAP].type == TYPE_GROUND);
|
||||
ASSUME(GetMoveType(MOVE_MUD_SLAP) == TYPE_GROUND);
|
||||
PLAYER(SPECIES_ORTHWORM) { Ability(ABILITY_EARTH_EATER); HP(1); MaxHP(100); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Earth Eater heals 25% when hit by ground type moves")
|
||||
SINGLE_BATTLE_TEST("Earth Eater does not activate if protected")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_MUD_SLAP].type == TYPE_GROUND);
|
||||
ASSUME(GetMoveType(MOVE_MUD_SLAP) == TYPE_GROUND);
|
||||
PLAYER(SPECIES_ORTHWORM) { Ability(ABILITY_EARTH_EATER); HP(1); MaxHP(100); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -35,8 +35,8 @@ SINGLE_BATTLE_TEST("Earth Eater does not activate if protected")
|
||||
SINGLE_BATTLE_TEST("Earth Eater activates on status moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SAND_ATTACK].type == TYPE_GROUND);
|
||||
ASSUME(gMovesInfo[MOVE_SAND_ATTACK].category == DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveType(MOVE_SAND_ATTACK) == TYPE_GROUND);
|
||||
ASSUME(GetMoveCategory(MOVE_SAND_ATTACK) == DAMAGE_CATEGORY_STATUS);
|
||||
PLAYER(SPECIES_ORTHWORM) { Ability(ABILITY_EARTH_EATER); HP(1); MaxHP(100); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -8,15 +8,15 @@ SINGLE_BATTLE_TEST("Effect Spore only inflicts status on contact")
|
||||
PARAMETRIZE { move = MOVE_TACKLE; }
|
||||
PARAMETRIZE { move = MOVE_SWIFT; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(!gMovesInfo[MOVE_SWIFT].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
ASSUME(!MoveMakesContact(MOVE_SWIFT));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move, WITH_RNG(RNG_EFFECT_SPORE, 1)); }
|
||||
TURN {}
|
||||
} SCENE {
|
||||
if (gMovesInfo[move].makesContact) {
|
||||
if (MoveMakesContact(move)) {
|
||||
ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE);
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, player);
|
||||
MESSAGE("Wobbuffet was poisoned by the opposing Breloom's Effect Spore!");
|
||||
@@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Effect Spore causes poison 9% of the time")
|
||||
PASSES_RANDOMLY(9, 100, RNG_EFFECT_SPORE);
|
||||
GIVEN {
|
||||
ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); }
|
||||
} WHEN {
|
||||
@@ -56,7 +56,7 @@ SINGLE_BATTLE_TEST("Effect Spore causes paralysis 10% of the time")
|
||||
PASSES_RANDOMLY(10, 100, RNG_EFFECT_SPORE);
|
||||
GIVEN {
|
||||
ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); }
|
||||
} WHEN {
|
||||
@@ -75,7 +75,7 @@ SINGLE_BATTLE_TEST("Effect Spore causes sleep 11% of the time")
|
||||
PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE);
|
||||
GIVEN {
|
||||
ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); }
|
||||
} WHEN {
|
||||
|
||||
4
test/battle/ability/electric_surge.c
Normal file
4
test/battle/ability/electric_surge.c
Normal file
@@ -0,0 +1,4 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
TO_DO_BATTLE_TEST("Electric Surge creates Electric Terrain when entering the battle");
|
||||
@@ -10,12 +10,12 @@ SINGLE_BATTLE_TEST("Electromorphosis sets up Charge when hit by any move")
|
||||
PARAMETRIZE {move = MOVE_GUST; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].power != 0);
|
||||
ASSUME(gMovesInfo[MOVE_GUST].power != 0);
|
||||
ASSUME(gMovesInfo[MOVE_GUST].category == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gMovesInfo[MOVE_THUNDER_SHOCK].power != 0);
|
||||
ASSUME(gMovesInfo[MOVE_THUNDER_SHOCK].type == TYPE_ELECTRIC);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_TACKLE));
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_GUST));
|
||||
ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_THUNDER_SHOCK));
|
||||
ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC);
|
||||
|
||||
PLAYER(SPECIES_BELLIBOLT) { Ability(ABILITY_ELECTROMORPHOSIS); Speed(10); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed.
|
||||
|
||||
@@ -7,14 +7,14 @@ SINGLE_BATTLE_TEST("Flame Body inflicts burn on contact")
|
||||
PARAMETRIZE { move = MOVE_TACKLE; }
|
||||
PARAMETRIZE { move = MOVE_SWIFT; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(!gMovesInfo[MOVE_SWIFT].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
ASSUME(!MoveMakesContact(MOVE_SWIFT));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_MAGMAR) { Ability(ABILITY_FLAME_BODY); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
} SCENE {
|
||||
if (gMovesInfo[move].makesContact) {
|
||||
if (MoveMakesContact(move)) {
|
||||
ABILITY_POPUP(opponent, ABILITY_FLAME_BODY);
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, player);
|
||||
MESSAGE("The opposing Magmar's Flame Body burned Wobbuffet!");
|
||||
@@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Flame Body triggers 30% of the time")
|
||||
PASSES_RANDOMLY(3, 10, RNG_FLAME_BODY);
|
||||
GIVEN {
|
||||
ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_4);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_MAGMAR) { Ability(ABILITY_FLAME_BODY); }
|
||||
} WHEN {
|
||||
|
||||
@@ -63,7 +63,32 @@ SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal when its abili
|
||||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Forecast transforms Castform back to normal under Cloud Nine/Air Lock");
|
||||
SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal under Cloud Nine/Air Lock")
|
||||
{
|
||||
u32 species = 0, ability = 0;
|
||||
PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; }
|
||||
PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CHERRIM_OVERCAST) { Ability(ABILITY_FLOWER_GIFT); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SUNNY_DAY); }
|
||||
TURN { SWITCH(opponent, 1); }
|
||||
} SCENE {
|
||||
// transforms
|
||||
ABILITY_POPUP(player, ABILITY_FLOWER_GIFT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Cherrim transformed!");
|
||||
// back to normal
|
||||
ABILITY_POPUP(opponent, ability);
|
||||
ABILITY_POPUP(player, ABILITY_FLOWER_GIFT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Cherrim transformed!");
|
||||
} THEN {
|
||||
EXPECT_EQ(player->species, SPECIES_CHERRIM_OVERCAST);
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Flower Gift increases the attack of Cherrim and its allies by 1.5x", s16 damageL, s16 damageR)
|
||||
{
|
||||
@@ -71,7 +96,7 @@ DOUBLE_BATTLE_TEST("Flower Gift increases the attack of Cherrim and its allies b
|
||||
PARAMETRIZE { sunny = FALSE; }
|
||||
PARAMETRIZE { sunny = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_CHERRIM_OVERCAST) { Ability(ABILITY_FLOWER_GIFT); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@@ -106,7 +131,7 @@ DOUBLE_BATTLE_TEST("Flower Gift increases the Sp. Def of Cherrim and its allies
|
||||
PARAMETRIZE { sunny = FALSE; }
|
||||
PARAMETRIZE { sunny = TRUE; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_HYPER_VOICE].category == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveCategory(MOVE_HYPER_VOICE) == DAMAGE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_CHERRIM_OVERCAST) { Ability(ABILITY_FLOWER_GIFT); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(gMovesInfo[MOVE_FIRE_PUNCH].makesContact);
|
||||
ASSUME(gMovesInfo[MOVE_FIRE_PUNCH].type == TYPE_FIRE);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
ASSUME(MoveMakesContact(MOVE_FIRE_PUNCH));
|
||||
ASSUME(GetMoveType(MOVE_FIRE_PUNCH) == TYPE_FIRE);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct contact", s16 damage)
|
||||
|
||||
@@ -42,7 +42,7 @@ DOUBLE_BATTLE_TEST("Frisk triggers for player in a Double Battle after switching
|
||||
PARAMETRIZE { target = playerRight; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_POUND].power != 0);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_POUND));
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(1); }
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(1); }
|
||||
PLAYER(SPECIES_FURRET) { Ability(ABILITY_FRISK); };
|
||||
@@ -65,7 +65,7 @@ DOUBLE_BATTLE_TEST("Frisk triggers for opponent in a Double Battle after switchi
|
||||
PARAMETRIZE { target = opponentRight; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_POUND].power != 0);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_POUND));
|
||||
PLAYER(SPECIES_WYNAUT) { Item(ITEM_POTION); }
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
|
||||
|
||||
@@ -1,20 +1,22 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
SINGLE_BATTLE_TEST("Gale Wings only grants priority at full HP")
|
||||
SINGLE_BATTLE_TEST("Gale Wings only grants priority at full HP (Gen 7+)")
|
||||
{
|
||||
u16 hp;
|
||||
PARAMETRIZE { hp = 100; }
|
||||
PARAMETRIZE { hp = 99; }
|
||||
u32 hp, config;
|
||||
PARAMETRIZE { hp = 100; config = GEN_7; }
|
||||
PARAMETRIZE { hp = 99; config = GEN_7; }
|
||||
PARAMETRIZE { hp = 100; config = GEN_6; }
|
||||
PARAMETRIZE { hp = 99; config = GEN_6; }
|
||||
GIVEN {
|
||||
ASSUME(B_GALE_WINGS >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_AERIAL_ACE].type == TYPE_FLYING);
|
||||
WITH_CONFIG(GEN_CONFIG_GALE_WINGS, config);
|
||||
ASSUME(GetMoveType(MOVE_AERIAL_ACE) == TYPE_FLYING);
|
||||
PLAYER(SPECIES_TALONFLAME) { Ability(ABILITY_GALE_WINGS); HP(hp); MaxHP(100); Speed(1);}
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(100);};
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_AERIAL_ACE); }
|
||||
} SCENE {
|
||||
if (hp == 100) {
|
||||
if (hp == 100 || config <= GEN_6) {
|
||||
MESSAGE("Talonflame used Aerial Ace!");
|
||||
MESSAGE("The opposing Wobbuffet used Celebrate!");
|
||||
}
|
||||
@@ -31,9 +33,8 @@ SINGLE_BATTLE_TEST("Gale Wings only grants priority to Flying-type moves")
|
||||
PARAMETRIZE { move = MOVE_AERIAL_ACE; }
|
||||
PARAMETRIZE { move = MOVE_FLARE_BLITZ; }
|
||||
GIVEN {
|
||||
ASSUME(B_GALE_WINGS >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_AERIAL_ACE].type == TYPE_FLYING);
|
||||
ASSUME(gMovesInfo[MOVE_FLARE_BLITZ].type == TYPE_FIRE);
|
||||
ASSUME(GetMoveType(MOVE_AERIAL_ACE) == TYPE_FLYING);
|
||||
ASSUME(GetMoveType(MOVE_FLARE_BLITZ) == TYPE_FIRE);
|
||||
PLAYER(SPECIES_TALONFLAME) { Ability(ABILITY_GALE_WINGS); HP(100); MaxHP(100); Speed(1);}
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(100);};
|
||||
} WHEN {
|
||||
@@ -58,12 +59,11 @@ SINGLE_BATTLE_TEST("Gale Wings doesn't increase priority of Flying-type Natural
|
||||
PARAMETRIZE { move = MOVE_JUDGMENT; heldItem = ITEM_SKY_PLATE; }
|
||||
PARAMETRIZE { move = MOVE_HIDDEN_POWER; heldItem = ITEM_NONE; }
|
||||
GIVEN {
|
||||
ASSUME(B_GALE_WINGS >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT);
|
||||
ASSUME(gMovesInfo[MOVE_JUDGMENT].effect == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
|
||||
ASSUME(GetMoveEffect(MOVE_JUDGMENT) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
// IV combinations sourced from https://www.smogon.com/forums/threads/hidden-power-iv-combinations.78083/
|
||||
ASSUME(gMovesInfo[MOVE_HIDDEN_POWER].effect == EFFECT_HIDDEN_POWER);
|
||||
ASSUME(gMovesInfo[MOVE_TERA_BLAST].effect == EFFECT_TERA_BLAST);
|
||||
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
|
||||
ASSUME(GetMoveEffect(MOVE_TERA_BLAST) == EFFECT_TERA_BLAST);
|
||||
ASSUME(gItemsInfo[ITEM_SKY_PLATE].holdEffect == HOLD_EFFECT_PLATE);
|
||||
ASSUME(gItemsInfo[ITEM_SKY_PLATE].secondaryId == TYPE_FLYING);
|
||||
ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_LUM_BERRY)].type == TYPE_FLYING);
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].power > 0);
|
||||
ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL);
|
||||
ASSUME(GetMovePower(MOVE_TACKLE) > 0);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Galvanize turns a normal type move into Electric")
|
||||
@@ -29,9 +29,9 @@ SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type move
|
||||
PARAMETRIZE { move = MOVE_MULTI_ATTACK; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_HIDDEN_POWER].effect == EFFECT_HIDDEN_POWER);
|
||||
ASSUME(gMovesInfo[MOVE_WEATHER_BALL].effect == EFFECT_WEATHER_BALL);
|
||||
ASSUME(gMovesInfo[MOVE_MULTI_ATTACK].effect == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
|
||||
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
|
||||
ASSUME(GetMoveEffect(MOVE_MULTI_ATTACK) == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
PLAYER(SPECIES_KRABBY);
|
||||
OPPONENT(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); }
|
||||
} WHEN {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
SINGLE_BATTLE_TEST("Good as Gold protects from status moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].category == DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveCategory(MOVE_TOXIC) == DAMAGE_CATEGORY_STATUS);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_GHOLDENGO) { Ability(ABILITY_GOOD_AS_GOLD); }
|
||||
} WHEN {
|
||||
@@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Good as Gold protects from status moves")
|
||||
SINGLE_BATTLE_TEST("Good as Gold doesn't protect the user from it's own moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_NASTY_PLOT].category == DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveCategory(MOVE_NASTY_PLOT) == DAMAGE_CATEGORY_STATUS);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_GHOLDENGO) { Ability(ABILITY_GOOD_AS_GOLD); }
|
||||
} WHEN {
|
||||
@@ -37,8 +37,8 @@ SINGLE_BATTLE_TEST("Good as Gold doesn't protect the user from it's own moves")
|
||||
SINGLE_BATTLE_TEST("Good as Gold doesn't protect from moves that target the field")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].category == DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].target == MOVE_TARGET_OPPONENTS_FIELD);
|
||||
ASSUME(GetMoveCategory(MOVE_STEALTH_ROCK) == DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveTarget(MOVE_STEALTH_ROCK) == MOVE_TARGET_OPPONENTS_FIELD);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_GHOLDENGO) { Ability(ABILITY_GOOD_AS_GOLD); }
|
||||
} WHEN {
|
||||
@@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Good as Gold doesn't protect from moves that target the fiel
|
||||
DOUBLE_BATTLE_TEST("Good as Gold protects from partner's status moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_HELPING_HAND].category == DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveCategory(MOVE_HELPING_HAND) == DAMAGE_CATEGORY_STATUS);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_GHOLDENGO) { Ability(ABILITY_GOOD_AS_GOLD); }
|
||||
|
||||
4
test/battle/ability/grassy_surge.c
Normal file
4
test/battle/ability/grassy_surge.c
Normal file
@@ -0,0 +1,4 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
TO_DO_BATTLE_TEST("Grassy Surge creates Grassy Terrain when entering the battle");
|
||||
@@ -7,7 +7,7 @@ DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly cau
|
||||
PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; }
|
||||
PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY);
|
||||
PLAYER(species) { Ability(ability); }
|
||||
PLAYER(SPECIES_SNORUNT) { HP(1); }
|
||||
OPPONENT(SPECIES_GLALIE) { HP(1); }
|
||||
@@ -80,9 +80,8 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th
|
||||
PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; }
|
||||
PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; }
|
||||
|
||||
KNOWN_FAILING; // Requires simultaneous damage implementation
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY);
|
||||
PLAYER(species) { Ability(ability); }
|
||||
PLAYER(SPECIES_ABRA) { HP(1); }
|
||||
OPPONENT(SPECIES_GLALIE);
|
||||
@@ -94,6 +93,7 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft);
|
||||
HP_BAR(opponentLeft, captureDamage: &damage[0]);
|
||||
HP_BAR(playerRight);
|
||||
HP_BAR(opponentRight, captureDamage: &damage[1]);
|
||||
MESSAGE("Abra fainted!");
|
||||
ABILITY_POPUP(playerLeft, abilityPopUp);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft);
|
||||
@@ -101,7 +101,6 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th
|
||||
MESSAGE("Spectrier's Grim Neigh raised its Sp. Atk!");
|
||||
else
|
||||
MESSAGE("Calyrex's Grim Neigh raised its Sp. Atk!");
|
||||
HP_BAR(opponentRight, captureDamage: &damage[1]);
|
||||
} THEN {
|
||||
EXPECT_EQ(playerLeft->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1);
|
||||
EXPECT_EQ(damage[0], damage[1]);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
// ASSUME(gMovesInfo[MOVE_AERIAL_ACE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
// ASSUME(GetMoveCategory(MOVE_AERIAL_ACE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("(Gulp Missile) If base Cramorant hits target with Surf it transforms into Gulping form if max HP is over 1/2")
|
||||
@@ -92,6 +92,7 @@ SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant deal 1/4 of damage oppo
|
||||
MESSAGE("The opposing Wobbuffet's Defense fell!");
|
||||
} THEN {
|
||||
EXPECT_EQ(gulpMissileDamage, opponent->maxHP / 4);
|
||||
EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -133,3 +134,59 @@ SINGLE_BATTLE_TEST("(Gulp Missile) triggers even if the user is fainted by oppos
|
||||
STATUS_ICON(opponent, paralysis: TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense but is prevented by stat reduction preventing abilities")
|
||||
{
|
||||
u32 species, ability;
|
||||
PARAMETRIZE { species = SPECIES_METAGROSS; ability = ABILITY_CLEAR_BODY; }
|
||||
PARAMETRIZE { species = SPECIES_CORVIKNIGHT; ability = ABILITY_MIRROR_ARMOR; }
|
||||
PARAMETRIZE { species = SPECIES_CHATOT; ability = ABILITY_BIG_PECKS; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CRAMORANT) { Ability(ABILITY_GULP_MISSILE); }
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SURF); MOVE(opponent, MOVE_TACKLE); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, player);
|
||||
HP_BAR(opponent);
|
||||
ABILITY_POPUP(player, ABILITY_GULP_MISSILE);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent);
|
||||
HP_BAR(player);
|
||||
ABILITY_POPUP(player, ABILITY_GULP_MISSILE);
|
||||
ABILITY_POPUP(opponent, ability);
|
||||
NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
|
||||
} THEN {
|
||||
EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense and still triggers other effects after")
|
||||
{
|
||||
// Make sure attacker and target are correct after triggering the ability
|
||||
u32 ability;
|
||||
PARAMETRIZE { ability = ABILITY_INFILTRATOR; }
|
||||
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; }
|
||||
GIVEN {
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_CRAMORANT) { Ability(ABILITY_GULP_MISSILE); Item(ITEM_ROCKY_HELMET); }
|
||||
OPPONENT(SPECIES_DRAGAPULT) { Ability(ability); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SURF); MOVE(opponent, MOVE_TACKLE); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, player);
|
||||
HP_BAR(opponent);
|
||||
ABILITY_POPUP(player, ABILITY_GULP_MISSILE);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent);
|
||||
HP_BAR(player);
|
||||
ABILITY_POPUP(player, ABILITY_GULP_MISSILE);
|
||||
HP_BAR(opponent);
|
||||
if (ability == ABILITY_INFILTRATOR) {
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
|
||||
MESSAGE("The opposing Dragapult's Defense fell!");
|
||||
} else {
|
||||
ABILITY_POPUP(opponent, ABILITY_CLEAR_BODY);
|
||||
}
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player);
|
||||
HP_BAR(opponent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gItemsInfo[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP);
|
||||
ASSUME(I_SITRUS_BERRY_HEAL >= GEN_4);
|
||||
ASSUME(gMovesInfo[MOVE_SUNNY_DAY].effect == EFFECT_SUNNY_DAY);
|
||||
ASSUME(GetMoveEffect(MOVE_SUNNY_DAY) == EFFECT_SUNNY_DAY);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Harvest has a 50% chance to restore a Berry at the end of the turn")
|
||||
@@ -61,7 +61,7 @@ SINGLE_BATTLE_TEST("Harvest doesn't always restore a Berry if Cloud Nine/Air Loc
|
||||
SINGLE_BATTLE_TEST("Harvest restores a Berry even after being switched out and back in")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT);
|
||||
ASSUME(GetMoveEffect(MOVE_PARTING_SHOT) == EFFECT_PARTING_SHOT);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@@ -80,7 +80,7 @@ SINGLE_BATTLE_TEST("Harvest restores a Berry even after being switched out and b
|
||||
SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Fling")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING);
|
||||
ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@@ -97,7 +97,7 @@ SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Fling")
|
||||
SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Natural Gift")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT);
|
||||
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@@ -209,7 +209,7 @@ DOUBLE_BATTLE_TEST("Harvest order is affected by speed")
|
||||
SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when transfered to another Pokémon")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK);
|
||||
ASSUME(GetMoveEffect(MOVE_TRICK) == EFFECT_TRICK);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@@ -226,7 +226,7 @@ SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when transfered to another P
|
||||
SINGLE_BATTLE_TEST("Harvest can restore a Berry that was transferred from another Pokémon")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK);
|
||||
ASSUME(GetMoveEffect(MOVE_TRICK) == EFFECT_TRICK);
|
||||
PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); }
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); }
|
||||
} WHEN {
|
||||
@@ -245,7 +245,7 @@ SINGLE_BATTLE_TEST("Harvest can restore a Berry that was transferred from anothe
|
||||
SINGLE_BATTLE_TEST("Harvest can only restore the newest berry consumed that was transferred from another Pokémon instead of its original Berry")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK);
|
||||
ASSUME(GetMoveEffect(MOVE_TRICK) == EFFECT_TRICK);
|
||||
ASSUME(gItemsInfo[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP);
|
||||
PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); }
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); Item(ITEM_APICOT_BERRY); }
|
||||
|
||||
@@ -82,9 +82,9 @@ DOUBLE_BATTLE_TEST("Hospitality does not trigger if there is no ally on the fiel
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_BLIZZARD, opponentLeft);
|
||||
HP_BAR(playerLeft);
|
||||
MESSAGE("Wobbuffet fainted!");
|
||||
HP_BAR(playerRight);
|
||||
MESSAGE("Wobbuffet fainted!");
|
||||
MESSAGE("Wobbuffet fainted!");
|
||||
SEND_IN_MESSAGE("Poltchageist");
|
||||
NOT ABILITY_POPUP(playerLeft, ABILITY_HOSPITALITY);
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter prevents intimidate")
|
||||
SINGLE_BATTLE_TEST("Hyper Cutter prevents Attack stage reduction from moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); }
|
||||
} WHEN {
|
||||
@@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter prevents Attack stage reduction from moves")
|
||||
SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Attack reduction from burn")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_WILL_O_WISP].effect == EFFECT_WILL_O_WISP);
|
||||
ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); }
|
||||
} WHEN {
|
||||
@@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Attack reduction from burn")
|
||||
SINGLE_BATTLE_TEST("Hyper Cutter is ignored by Mold Breaker")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN);
|
||||
PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); }
|
||||
OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); }
|
||||
} WHEN {
|
||||
@@ -97,8 +97,8 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Attack stage reduction from mov
|
||||
SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Topsy-Turvy")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2);
|
||||
ASSUME(gMovesInfo[MOVE_TOPSY_TURVY].effect == EFFECT_TOPSY_TURVY);
|
||||
ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2);
|
||||
ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); }
|
||||
} WHEN {
|
||||
@@ -116,7 +116,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Topsy-Turvy")
|
||||
SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Spectral Thief from resetting positive Attack stage changes")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2);
|
||||
ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2);
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_SPECTRAL_THIEF));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); }
|
||||
@@ -135,8 +135,8 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Spectral Thief from resetting p
|
||||
SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent receiving negative Attack stage changes from Baton Pass")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN);
|
||||
ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS);
|
||||
ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); }
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
#include "test/battle.h"
|
||||
|
||||
ASSUMPTIONS {
|
||||
ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL);
|
||||
ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE);
|
||||
ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL);
|
||||
ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Ice Body prevents damage from hail")
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
SINGLE_BATTLE_TEST("Ice Face blocks physical moves, changing Eiscue into its Noice Face form")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_EISCUE);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -18,8 +18,8 @@ SINGLE_BATTLE_TEST("Ice Face blocks physical moves, changing Eiscue into its Noi
|
||||
SINGLE_BATTLE_TEST("Ice Face does not block special moves, Eiscue stays in Ice Face form")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gMovesInfo[MOVE_EMBER].category == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_EMBER) == DAMAGE_CATEGORY_SPECIAL);
|
||||
PLAYER(SPECIES_EISCUE);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -35,9 +35,9 @@ SINGLE_BATTLE_TEST("Ice Face is restored if hail or snow begins while Noice Face
|
||||
PARAMETRIZE { move = MOVE_SNOWSCAPE; }
|
||||
PARAMETRIZE { move = MOVE_HAIL; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE);
|
||||
ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE);
|
||||
ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL);
|
||||
PLAYER(SPECIES_EISCUE);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -60,9 +60,9 @@ SINGLE_BATTLE_TEST("Ice Face is restored if Noice Face Eiscue is sent in while h
|
||||
PARAMETRIZE { move = MOVE_SNOWSCAPE; }
|
||||
PARAMETRIZE { move = MOVE_HAIL; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE);
|
||||
ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE);
|
||||
ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL);
|
||||
PLAYER(SPECIES_EISCUE);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@@ -86,9 +86,9 @@ SINGLE_BATTLE_TEST("Ice Face is not restored if Eiscue changes into Noice Face f
|
||||
PARAMETRIZE { move = MOVE_SNOWSCAPE; }
|
||||
PARAMETRIZE { move = MOVE_HAIL; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE);
|
||||
ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE);
|
||||
ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL);
|
||||
PLAYER(SPECIES_EISCUE) { HP(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -105,7 +105,7 @@ SINGLE_BATTLE_TEST("Ice Face is not restored if Eiscue changes into Noice Face f
|
||||
SINGLE_BATTLE_TEST("Ice Face form change persists after switching out")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_EISCUE) { HP(1); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@@ -123,7 +123,7 @@ SINGLE_BATTLE_TEST("Ice Face form change persists after switching out")
|
||||
SINGLE_BATTLE_TEST("Ice Face doesn't transform Eiscue if Cloud Nine/Air Lock is on the field")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_EISCUE) { HP(1); }
|
||||
OPPONENT(SPECIES_RAYQUAZA) { Ability(ABILITY_AIR_LOCK); }
|
||||
} WHEN {
|
||||
@@ -135,3 +135,33 @@ SINGLE_BATTLE_TEST("Ice Face doesn't transform Eiscue if Cloud Nine/Air Lock is
|
||||
MESSAGE("Eiscue fainted!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Ice Face is not restored if hail or snow and Eiscue are already out")
|
||||
{
|
||||
u32 move;
|
||||
PARAMETRIZE { move = MOVE_SNOWSCAPE; }
|
||||
PARAMETRIZE { move = MOVE_HAIL; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE);
|
||||
ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL);
|
||||
PLAYER(SPECIES_EISCUE);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WYNAUT);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, move); }
|
||||
TURN { MOVE(opponent, MOVE_TACKLE); }
|
||||
TURN { SWITCH(opponent, 1); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(player, ABILITY_ICE_FACE);
|
||||
MESSAGE("Eiscue transformed!");
|
||||
ABILITY_POPUP(player, ABILITY_ICE_FACE);
|
||||
MESSAGE("Eiscue transformed!");
|
||||
ABILITY_POPUP(player, ABILITY_ICE_FACE);
|
||||
MESSAGE("Eiscue transformed!");
|
||||
NONE_OF {
|
||||
ABILITY_POPUP(player, ABILITY_ICE_FACE);
|
||||
MESSAGE("Eiscue transformed!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,10 +12,10 @@ SINGLE_BATTLE_TEST("Ice Scales halves the damage from special moves", s16 damage
|
||||
PARAMETRIZE { ability = ABILITY_SHIELD_DUST; move = MOVE_TACKLE; }
|
||||
PARAMETRIZE { ability = ABILITY_ICE_SCALES; move = MOVE_TACKLE; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_PSYCHIC].category == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(gMovesInfo[MOVE_PSYSHOCK].category == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(gMovesInfo[MOVE_PSYSHOCK].effect == EFFECT_PSYSHOCK);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_PSYCHIC) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveCategory(MOVE_PSYSHOCK) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveEffect(MOVE_PSYSHOCK) == EFFECT_PSYSHOCK);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_FROSMOTH) { Ability(ability); }
|
||||
} WHEN {
|
||||
|
||||
@@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Immunity prevents Poison Sting poison")
|
||||
SINGLE_BATTLE_TEST("Immunity prevents Toxic bad poison")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_SNORLAX) { Ability(ABILITY_IMMUNITY); }
|
||||
} WHEN {
|
||||
@@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Immunity prevents Toxic bad poison")
|
||||
SINGLE_BATTLE_TEST("Immunity prevents Toxic Spikes poison")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_SNORLAX) { Ability(ABILITY_IMMUNITY); }
|
||||
|
||||
@@ -14,8 +14,8 @@ SINGLE_BATTLE_TEST("Innards Out deal dmg on fainting equal to the amount of dmg
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { HP(70); SpAttack(1000); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
ASSUME(gMovesInfo[MOVE_PSYCHIC].power != 0);
|
||||
ASSUME(gMovesInfo[MOVE_PSYCHIC].category == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_PSYCHIC));
|
||||
ASSUME(GetMoveCategory(MOVE_PSYCHIC) == DAMAGE_CATEGORY_SPECIAL);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_PSYCHIC); SEND_OUT(player, 1); if (hp == 100) { SEND_OUT(opponent, 1); } }
|
||||
} SCENE {
|
||||
@@ -32,8 +32,8 @@ SINGLE_BATTLE_TEST("Innards Out does not trigger after Gastro Acid has been used
|
||||
PLAYER(SPECIES_PYUKUMUKU) { HP(1); Ability(ABILITY_INNARDS_OUT); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
ASSUME(gMovesInfo[MOVE_PSYCHIC].power != 0);
|
||||
ASSUME(gMovesInfo[MOVE_GASTRO_ACID].effect == EFFECT_GASTRO_ACID);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_PSYCHIC));
|
||||
ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_GASTRO_ACID); }
|
||||
TURN { MOVE(opponent, MOVE_PSYCHIC); SEND_OUT(player, 1); }
|
||||
@@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Innards Out does not damage Magic Guard Pokemon")
|
||||
PLAYER(SPECIES_PYUKUMUKU) { HP(1); Ability(ABILITY_INNARDS_OUT); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); }
|
||||
ASSUME(gMovesInfo[MOVE_PSYCHIC].power != 0);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_PSYCHIC));
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_PSYCHIC); SEND_OUT(player, 1); }
|
||||
} SCENE {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
SINGLE_BATTLE_TEST("Insomnia prevents sleep")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SPORE].effect == EFFECT_SLEEP);
|
||||
ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP);
|
||||
PLAYER(SPECIES_DROWZEE) { Ability(ABILITY_INSOMNIA); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Insomnia prevents sleep")
|
||||
SINGLE_BATTLE_TEST("Insomnia prevents yawn")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_YAWN].effect == EFFECT_YAWN);
|
||||
ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN);
|
||||
PLAYER(SPECIES_DROWZEE) { Ability(ABILITY_INSOMNIA); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Insomnia prevents yawn")
|
||||
SINGLE_BATTLE_TEST("Insomnia prevents rest")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_REST].effect == EFFECT_REST);
|
||||
ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST);
|
||||
PLAYER(SPECIES_DROWZEE) { Ability(ABILITY_INSOMNIA); HP(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after switch out", s16 damage)
|
||||
@@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after KO", s16
|
||||
DOUBLE_BATTLE_TEST("Intimidate doesn't activate on an empty field in a double battle")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_EXPLOSION].effect == EFFECT_EXPLOSION);
|
||||
ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(1); }
|
||||
PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }
|
||||
@@ -246,7 +246,7 @@ DOUBLE_BATTLE_TEST("Intimidate is not going to trigger if a mon switches out thr
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Intimidate activates when it's no longer effected by Neutralizing Gas")
|
||||
SINGLE_BATTLE_TEST("Intimidate activates when it's no longer effected by Neutralizing Gas - switching out")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); }
|
||||
@@ -263,3 +263,91 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer effected by Neutral
|
||||
SEND_IN_MESSAGE("Wobbuffet");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - switching moves")
|
||||
{
|
||||
u32 move;
|
||||
PARAMETRIZE { move = MOVE_U_TURN; }
|
||||
PARAMETRIZE { move = MOVE_HEALING_WISH; }
|
||||
PARAMETRIZE { move = MOVE_BATON_PASS; }
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE);
|
||||
ASSUME(GetMoveEffect(MOVE_HEALING_WISH) == EFFECT_HEALING_WISH);
|
||||
ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS);
|
||||
PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); }
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(1); }
|
||||
OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); SEND_OUT(player, 1); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS);
|
||||
MESSAGE("Neutralizing gas filled the area!");
|
||||
ANIMATION(ANIM_TYPE_MOVE, move, player);
|
||||
MESSAGE("The effects of the neutralizing gas wore off!");
|
||||
ABILITY_POPUP(opponent, ABILITY_INTIMIDATE);
|
||||
SEND_IN_MESSAGE("Wobbuffet");
|
||||
} THEN {
|
||||
if (move == MOVE_HEALING_WISH)
|
||||
EXPECT_EQ(player->hp, player->maxHP);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - opponent caused switches")
|
||||
{
|
||||
u32 move, item;
|
||||
PARAMETRIZE { move = MOVE_TACKLE; item = ITEM_EJECT_BUTTON; }
|
||||
PARAMETRIZE { move = MOVE_GROWL; item = ITEM_EJECT_PACK; }
|
||||
PARAMETRIZE { move = MOVE_ROAR; item = ITEM_NONE; }
|
||||
PARAMETRIZE { move = MOVE_DRAGON_TAIL; item = ITEM_NONE; }
|
||||
GIVEN {
|
||||
ASSUME(gItemsInfo[ITEM_EJECT_BUTTON].holdEffect == HOLD_EFFECT_EJECT_BUTTON);
|
||||
ASSUME(gItemsInfo[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK);
|
||||
ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN);
|
||||
ASSUME(GetMoveEffect(MOVE_ROAR) == EFFECT_ROAR);
|
||||
ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET);
|
||||
PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); Item(item); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); }
|
||||
} WHEN {
|
||||
if (item != ITEM_NONE) {
|
||||
TURN { MOVE(opponent, move); SEND_OUT(player, 1); }
|
||||
} else {
|
||||
TURN { MOVE(opponent, move); }
|
||||
}
|
||||
} SCENE {
|
||||
ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS);
|
||||
MESSAGE("Neutralizing gas filled the area!");
|
||||
ANIMATION(ANIM_TYPE_MOVE, move, opponent);
|
||||
if (item != ITEM_NONE)
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player);
|
||||
MESSAGE("The effects of the neutralizing gas wore off!");
|
||||
ABILITY_POPUP(opponent, ABILITY_INTIMIDATE);
|
||||
if (item != ITEM_NONE) {
|
||||
SEND_IN_MESSAGE("Wobbuffet");
|
||||
} else {
|
||||
MESSAGE("Wobbuffet was dragged out!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - fainted")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_FELL_STINGER) == EFFECT_FELL_STINGER);
|
||||
PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); HP(1); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); }
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_FELL_STINGER); SEND_OUT(player, 1); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS);
|
||||
MESSAGE("Neutralizing gas filled the area!");
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_FELL_STINGER, opponent);
|
||||
MESSAGE("The effects of the neutralizing gas wore off!");
|
||||
ABILITY_POPUP(opponent, ABILITY_INTIMIDATE);
|
||||
MESSAGE("Weezing fainted!");
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
|
||||
SEND_IN_MESSAGE("Wobbuffet");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ SINGLE_BATTLE_TEST("Intrepid Sword activates when it's no longer effected by Neu
|
||||
SINGLE_BATTLE_TEST("Intrepid Sword and Dauntless Shield both can be Skill Swapped and active their effects on the Skill Swap user")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SKILL_SWAP].effect == EFFECT_SKILL_SWAP);
|
||||
ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); }
|
||||
OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); }
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].accuracy == 100);
|
||||
ASSUME(gMovesInfo[MOVE_SAND_ATTACK].effect == EFFECT_ACCURACY_DOWN);
|
||||
ASSUME(GetMoveAccuracy(MOVE_TACKLE) == 100);
|
||||
ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN);
|
||||
ASSUME(B_ILLUMINATE_EFFECT >= GEN_9);
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasi
|
||||
|
||||
PASSES_RANDOMLY(100, 100, RNG_ACCURACY);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DOUBLE_TEAM].effect == EFFECT_EVASION_UP);
|
||||
ASSUME(GetMoveEffect(MOVE_DOUBLE_TEAM) == EFFECT_EVASION_UP);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
} WHEN {
|
||||
@@ -78,7 +78,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold B
|
||||
PARAMETRIZE { speciesOpponent = SPECIES_URSALUNA_BLOODMOON; abilityOpponent = ABILITY_MINDS_EYE; }
|
||||
}
|
||||
|
||||
PASSES_RANDOMLY(gMovesInfo[MOVE_TACKLE].accuracy * 3 / 4, 100, RNG_ACCURACY);
|
||||
PASSES_RANDOMLY(GetMoveAccuracy(MOVE_TACKLE) * 3 / 4, 100, RNG_ACCURACY);
|
||||
GIVEN {
|
||||
PLAYER(speciesPlayer) { Ability(abilityPlayer); }
|
||||
OPPONENT(speciesOpponent) { Ability(abilityOpponent); }
|
||||
@@ -102,8 +102,8 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-T
|
||||
PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_HONE_CLAWS].effect == EFFECT_ATTACK_ACCURACY_UP);
|
||||
ASSUME(gMovesInfo[MOVE_TOPSY_TURVY].effect == EFFECT_TOPSY_TURVY);
|
||||
ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP);
|
||||
ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
} WHEN {
|
||||
@@ -141,7 +141,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent receivi
|
||||
PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS);
|
||||
ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
@@ -173,7 +173,7 @@ SINGLE_BATTLE_TEST("Keen Eye & Gen9+ Illuminate don't prevent Spectral Thief fro
|
||||
PARAMETRIZE { species = SPECIES_STARYU; ability = ABILITY_ILLUMINATE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_HONE_CLAWS].effect == EFFECT_ATTACK_ACCURACY_UP);
|
||||
ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP);
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_SPECTRAL_THIEF) == TRUE);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
|
||||
@@ -11,10 +11,10 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents non-volatile status conditions in sun")
|
||||
PARAMETRIZE { move = MOVE_TOXIC; status = STATUS1_TOXIC_POISON; }
|
||||
// PARAMETRIZE { move = MOVE_POWDER_SNOW; status = STATUS1_FREEZE; } // Pointless since you can't freeze in sunlight anyway
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_WILL_O_WISP].effect == EFFECT_WILL_O_WISP);
|
||||
ASSUME(gMovesInfo[MOVE_HYPNOSIS].effect == EFFECT_SLEEP);
|
||||
ASSUME(gMovesInfo[MOVE_THUNDER_WAVE].effect == EFFECT_PARALYZE);
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP);
|
||||
ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_SLEEP);
|
||||
ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_PARALYZE);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -57,7 +57,7 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents Rest during sun")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(B_LEAF_GUARD_PREVENTS_REST >= GEN_5);
|
||||
ASSUME(gMovesInfo[MOVE_REST].effect == EFFECT_REST);
|
||||
ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST);
|
||||
PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); HP(100); MaxHP(200); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the Sp. Attack [Gen5+]")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC);
|
||||
ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); }
|
||||
} WHEN {
|
||||
@@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the
|
||||
DOUBLE_BATTLE_TEST("Lightning Rod forces single-target Electric-type moves to target the Pokémon with this Ability.")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_THUNDERBOLT].type == TYPE_ELECTRIC);
|
||||
ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); }
|
||||
|
||||
112
test/battle/ability/liquid_ooze.c
Normal file
112
test/battle/ability/liquid_ooze.c
Normal file
@@ -0,0 +1,112 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
SINGLE_BATTLE_TEST("Liquid Ooze causes Absorb users to lose HP instead of heal")
|
||||
{
|
||||
s16 damage;
|
||||
s16 healed;
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_ABSORB); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_ABSORB, player);
|
||||
HP_BAR(opponent, captureDamage: &damage);
|
||||
HP_BAR(player, captureDamage: &healed);
|
||||
MESSAGE("Wobbuffet sucked up the liquid ooze!");
|
||||
} THEN {
|
||||
EXPECT_MUL_EQ(damage, Q_4_12(0.5), healed);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Liquid Ooze causes Leech Seed users to lose HP instead of heal")
|
||||
{
|
||||
s16 damage;
|
||||
s16 healed;
|
||||
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_LEECH_SEED); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, player);
|
||||
HP_BAR(opponent, captureDamage: &damage);
|
||||
HP_BAR(player, captureDamage: &healed);
|
||||
} THEN {
|
||||
EXPECT_EQ(damage, healed);
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Liquid Ooze causes Matcha Gatcha users to lose HP instead of heal")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_MATCHA_GOTCHA) == EFFECT_ABSORB);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(1); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(playerLeft, MOVE_MATCHA_GOTCHA); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft);
|
||||
HP_BAR(opponentLeft);
|
||||
HP_BAR(playerLeft);
|
||||
MESSAGE("Wobbuffet sucked up the liquid ooze!");
|
||||
MESSAGE("Wobbuffet fainted!");
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Liquid Ooze will faint Matcha Gatcha users if it deals enough damage")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_MATCHA_GOTCHA) == EFFECT_ABSORB);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(1); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(playerLeft, MOVE_MATCHA_GOTCHA); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft);
|
||||
HP_BAR(opponentLeft);
|
||||
HP_BAR(playerLeft);
|
||||
MESSAGE("Wobbuffet sucked up the liquid ooze!");
|
||||
MESSAGE("Wobbuffet fainted!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Liquid Ooze causes Strength Sap users to lose HP instead of heal")
|
||||
{
|
||||
s16 lostHp;
|
||||
s32 atkStat;
|
||||
|
||||
PARAMETRIZE { atkStat = 100; }
|
||||
PARAMETRIZE { atkStat = 490; } // Checks that attacker can faint with no problems.
|
||||
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Attack(atkStat); Ability(ABILITY_LIQUID_OOZE); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_STRENGTH_SAP); if (atkStat == 490) { SEND_OUT(player, 1); } }
|
||||
} SCENE {
|
||||
MESSAGE("Wobbuffet used Strength Sap!");
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_STRENGTH_SAP, player);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
|
||||
MESSAGE("The opposing Wobbuffet's Attack fell!");
|
||||
ABILITY_POPUP(opponent, ABILITY_LIQUID_OOZE);
|
||||
HP_BAR(player, captureDamage: &lostHp);
|
||||
MESSAGE("Wobbuffet sucked up the liquid ooze!");
|
||||
if (atkStat >= 490) {
|
||||
MESSAGE("Wobbuffet fainted!");
|
||||
SEND_IN_MESSAGE("Wobbuffet");
|
||||
}
|
||||
} THEN {
|
||||
EXPECT_EQ(lostHp, atkStat);
|
||||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Liquid Ooze does not cause Dream Eater users to lose HP instead of heal (Gen 3-4");
|
||||
TO_DO_BATTLE_TEST("Liquid Ooze causes Dream Eater users to lose HP instead of heal (Gen 5+");
|
||||
@@ -5,7 +5,7 @@
|
||||
SINGLE_BATTLE_TEST("Magic Bounce bounces back status moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); }
|
||||
} WHEN {
|
||||
@@ -22,8 +22,8 @@ SINGLE_BATTLE_TEST("Magic Bounce bounces back status moves")
|
||||
SINGLE_BATTLE_TEST("Magic Bounce bounces back powder moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove);
|
||||
ASSUME(gMovesInfo[MOVE_STUN_SPORE].effect == EFFECT_PARALYZE);
|
||||
ASSUME(IsPowderMove(MOVE_STUN_SPORE));
|
||||
ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_PARALYZE);
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); }
|
||||
} WHEN {
|
||||
@@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Magic Bounce bounces back powder moves")
|
||||
SINGLE_BATTLE_TEST("Magic Bounce cannot bounce back powder moves against Grass Types")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove);
|
||||
ASSUME(IsPowderMove(MOVE_STUN_SPORE));
|
||||
ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS);
|
||||
PLAYER(SPECIES_ODDISH);
|
||||
OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); }
|
||||
@@ -59,8 +59,8 @@ SINGLE_BATTLE_TEST("Magic Bounce cannot bounce back powder moves against Grass T
|
||||
DOUBLE_BATTLE_TEST("Magic Bounce bounces back moves hitting both foes at two foes")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_LEER].effect == EFFECT_DEFENSE_DOWN);
|
||||
ASSUME(gMovesInfo[MOVE_LEER].target == MOVE_TARGET_BOTH);
|
||||
ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN);
|
||||
ASSUME(GetMoveTarget(MOVE_LEER) == MOVE_TARGET_BOTH);
|
||||
PLAYER(SPECIES_ABRA);
|
||||
PLAYER(SPECIES_KADABRA);
|
||||
OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); }
|
||||
@@ -92,7 +92,7 @@ DOUBLE_BATTLE_TEST("Magic Bounce bounces back moves hitting foes field")
|
||||
battlerTwo = SPECIES_ESPEON; abilityBattlerTwo = ABILITY_MAGIC_BOUNCE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_STEALTH_ROCK].target == MOVE_TARGET_OPPONENTS_FIELD);
|
||||
ASSUME(GetMoveTarget(MOVE_STEALTH_ROCK) == MOVE_TARGET_OPPONENTS_FIELD);
|
||||
PLAYER(SPECIES_ABRA);
|
||||
PLAYER(SPECIES_KADABRA);
|
||||
OPPONENT(battlerOne) { Ability(abilityBattlerOne); }
|
||||
@@ -118,7 +118,7 @@ DOUBLE_BATTLE_TEST("Magic Bounce bounces back moves hitting foes field")
|
||||
SINGLE_BATTLE_TEST("Magic Bounce bounced back status moves can not be bounced back by Magic Bounce")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
PLAYER(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); }
|
||||
OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); }
|
||||
} WHEN {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
SINGLE_BATTLE_TEST("Magic Guard prevents recoil damage to the user")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DOUBLE_EDGE].recoil == 33);
|
||||
ASSUME(GetMoveRecoil(MOVE_DOUBLE_EDGE) == 33);
|
||||
PLAYER(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -15,3 +15,32 @@ SINGLE_BATTLE_TEST("Magic Guard prevents recoil damage to the user")
|
||||
NOT HP_BAR(player);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Magic Guard ignores immobilization that can be caused by paralysis")
|
||||
{
|
||||
if (B_MAGIC_GUARD >= GEN_4)
|
||||
PASSES_RANDOMLY(1, 1, RNG_PARALYSIS);
|
||||
else
|
||||
PASSES_RANDOMLY(75, 100, RNG_PARALYSIS);
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); Status1(STATUS1_PARALYSIS);}
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_CELEBRATE); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Magic Guard does not ignore speed stat changes caused by paralysis")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CLEFABLE) { Speed(100); Ability(ABILITY_MAGIC_GUARD); Status1(STATUS1_PARALYSIS);}
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(99); }
|
||||
} WHEN {
|
||||
TURN { }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Magician does not get self-damage recoil after stealing Life
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gItemsInfo[ITEM_LIFE_ORB].holdEffect == HOLD_EFFECT_LIFE_ORB);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].power != 0);
|
||||
ASSUME(!IsBattleMoveStatus(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_DELPHOX) { Ability(ABILITY_MAGICIAN); Item(ITEM_NONE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); }
|
||||
} WHEN {
|
||||
|
||||
72
test/battle/ability/mimicry.c
Normal file
72
test/battle/ability/mimicry.c
Normal file
@@ -0,0 +1,72 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
static const u16 terrainData[][2] =
|
||||
{
|
||||
{ MOVE_ELECTRIC_TERRAIN, TYPE_ELECTRIC, },
|
||||
{ MOVE_PSYCHIC_TERRAIN, TYPE_PSYCHIC, },
|
||||
{ MOVE_GRASSY_TERRAIN, TYPE_GRASS, },
|
||||
{ MOVE_MISTY_TERRAIN, TYPE_FAIRY, },
|
||||
};
|
||||
|
||||
SINGLE_BATTLE_TEST("Mimicry changes the battler's type based on Terrain")
|
||||
{
|
||||
u32 j;
|
||||
u32 terrainMove = MOVE_NONE;
|
||||
u32 terrainType = TYPE_NONE;
|
||||
|
||||
for (j = 0; j < ARRAY_COUNT(terrainData); j++)
|
||||
PARAMETRIZE { terrainMove = terrainData[j][0]; terrainType = terrainData[j][1]; }
|
||||
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_STUNFISK_GALAR) { Ability(ABILITY_MIMICRY); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, terrainMove); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(opponent);
|
||||
switch (terrainMove)
|
||||
{
|
||||
case MOVE_ELECTRIC_TERRAIN: MESSAGE("The opposing Stunfisk's type changed to Electric!"); break;
|
||||
case MOVE_PSYCHIC_TERRAIN: MESSAGE("The opposing Stunfisk's type changed to Psychic!"); break;
|
||||
case MOVE_GRASSY_TERRAIN: MESSAGE("The opposing Stunfisk's type changed to Grass!"); break;
|
||||
case MOVE_MISTY_TERRAIN: MESSAGE("The opposing Stunfisk's type changed to Fairy!"); break;
|
||||
}
|
||||
} THEN {
|
||||
EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].types[0], terrainType);
|
||||
EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].types[1], terrainType);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Mimicry restores the battler's types when terrain is removed by Steel Roller and Ice Spinner")
|
||||
{
|
||||
u32 j;
|
||||
u32 terrainMove = MOVE_NONE;
|
||||
u32 removeTerrainMove = MOVE_NONE;
|
||||
|
||||
for (j = 0; j < ARRAY_COUNT(terrainData); j++)
|
||||
{
|
||||
PARAMETRIZE { removeTerrainMove = MOVE_STEEL_ROLLER; terrainMove = terrainData[j][0]; }
|
||||
PARAMETRIZE { removeTerrainMove = MOVE_ICE_SPINNER; terrainMove = terrainData[j][0]; }
|
||||
}
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gSpeciesInfo[SPECIES_STUNFISK_GALAR].types[0] == TYPE_GROUND);
|
||||
ASSUME(gSpeciesInfo[SPECIES_STUNFISK_GALAR].types[1] == TYPE_STEEL);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_STUNFISK_GALAR) { Ability(ABILITY_MIMICRY); }
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, terrainMove); MOVE(player, removeTerrainMove); }
|
||||
} SCENE {
|
||||
switch (terrainMove)
|
||||
{
|
||||
case MOVE_ELECTRIC_TERRAIN: MESSAGE("The electricity disappeared from the battlefield."); break;
|
||||
case MOVE_PSYCHIC_TERRAIN: MESSAGE("The weirdness disappeared from the battlefield!"); break;
|
||||
case MOVE_GRASSY_TERRAIN: MESSAGE("The grass disappeared from the battlefield."); break;
|
||||
case MOVE_MISTY_TERRAIN: MESSAGE("The mist disappeared from the battlefield."); break;
|
||||
}
|
||||
} THEN {
|
||||
EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].types[0], TYPE_GROUND);
|
||||
EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].types[1], TYPE_STEEL);
|
||||
}
|
||||
}
|
||||
@@ -48,7 +48,7 @@ AI_SINGLE_BATTLE_TEST("AI doesn't use accuracy-lowering moves if it knows that t
|
||||
|
||||
for (j = MOVE_NONE + 1; j < MOVES_COUNT; j++)
|
||||
{
|
||||
if (gMovesInfo[j].effect == EFFECT_ACCURACY_DOWN || gMovesInfo[j].effect == EFFECT_ACCURACY_DOWN_2) {
|
||||
if (GetMoveEffect(j) == EFFECT_ACCURACY_DOWN || GetMoveEffect(j) == EFFECT_ACCURACY_DOWN_2) {
|
||||
PARAMETRIZE { moveAI = j; abilityAI = ABILITY_SWIFT_SWIM; }
|
||||
PARAMETRIZE { moveAI = j; abilityAI = ABILITY_MOLD_BREAKER; }
|
||||
}
|
||||
|
||||
@@ -171,8 +171,8 @@ DOUBLE_BATTLE_TEST("Mirror Armor lowers Speed of the partner Pokemon after Court
|
||||
{
|
||||
KNOWN_FAILING;
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_STICKY_WEB].effect == EFFECT_STICKY_WEB);
|
||||
ASSUME(gMovesInfo[MOVE_COURT_CHANGE].effect == EFFECT_COURT_CHANGE);
|
||||
ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB);
|
||||
ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_CORVIKNIGHT) {Ability(ABILITY_MIRROR_ARMOR); Item(ITEM_IRON_BALL); }
|
||||
|
||||
4
test/battle/ability/misty_surge.c
Normal file
4
test/battle/ability/misty_surge.c
Normal file
@@ -0,0 +1,4 @@
|
||||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
TO_DO_BATTLE_TEST("Misty Surge creates Misty Terrain when entering the battle");
|
||||
@@ -8,7 +8,7 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after direct
|
||||
PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; }
|
||||
PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY);
|
||||
PLAYER(species) { Ability(ability); }
|
||||
PLAYER(SPECIES_SNORUNT) { HP(1); }
|
||||
OPPONENT(SPECIES_GLALIE) { HP(1); }
|
||||
@@ -84,7 +84,7 @@ SINGLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger when already at maximu
|
||||
PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; }
|
||||
PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM);
|
||||
ASSUME(GetMoveEffect(MOVE_BELLY_DRUM) == EFFECT_BELLY_DRUM);
|
||||
PLAYER(species) { Ability(ability); }
|
||||
OPPONENT(SPECIES_SNORUNT) { HP(1); }
|
||||
OPPONENT(SPECIES_SNORUNT);
|
||||
@@ -122,9 +122,8 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa
|
||||
PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; }
|
||||
PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; }
|
||||
|
||||
KNOWN_FAILING; // Requires simultaneous damage implementation
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY);
|
||||
PLAYER(species) { Ability(ability); }
|
||||
PLAYER(SPECIES_ABRA) { HP(1); }
|
||||
OPPONENT(SPECIES_GLALIE);
|
||||
@@ -136,6 +135,7 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft);
|
||||
HP_BAR(opponentLeft, captureDamage: &damage[0]);
|
||||
HP_BAR(playerRight);
|
||||
HP_BAR(opponentRight, captureDamage: &damage[1]);
|
||||
MESSAGE("Abra fainted!");
|
||||
ABILITY_POPUP(playerLeft, abilityPopUp);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft);
|
||||
@@ -145,7 +145,6 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa
|
||||
MESSAGE("Glastrier's Chilling Neigh raised its Attack!");
|
||||
else
|
||||
MESSAGE("Calyrex's Chilling Neigh raised its Attack!");
|
||||
HP_BAR(opponentRight, captureDamage: &damage[1]);
|
||||
} THEN {
|
||||
EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1);
|
||||
EXPECT_EQ(damage[0], damage[1]);
|
||||
|
||||
@@ -10,14 +10,14 @@ SINGLE_BATTLE_TEST("Mummy/Lingering Aroma replace the attacker's ability on cont
|
||||
PARAMETRIZE { move = MOVE_AQUA_JET; ability = ABILITY_LINGERING_AROMA; species = SPECIES_OINKOLOGNE; }
|
||||
PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_LINGERING_AROMA; species = SPECIES_OINKOLOGNE; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_AQUA_JET].makesContact);
|
||||
ASSUME(!gMovesInfo[MOVE_WATER_GUN].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_AQUA_JET));
|
||||
ASSUME(!MoveMakesContact(MOVE_WATER_GUN));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
} SCENE {
|
||||
if (gMovesInfo[move].makesContact) {
|
||||
if (MoveMakesContact(move)) {
|
||||
ABILITY_POPUP(opponent, ability);
|
||||
if (ability == ABILITY_MUMMY)
|
||||
MESSAGE("Wobbuffet acquired Mummy!");
|
||||
@@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Mummy and Lingering Aroma don't replace each other")
|
||||
PARAMETRIZE { ability1 = ABILITY_MUMMY; species1 = SPECIES_YAMASK; ability2 = ABILITY_LINGERING_AROMA; species2 = SPECIES_OINKOLOGNE; }
|
||||
PARAMETRIZE { ability1 = ability2 = ABILITY_LINGERING_AROMA; species1 = species2 = SPECIES_OINKOLOGNE; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_AQUA_JET].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_AQUA_JET));
|
||||
PLAYER(species1) { Ability(ability1); Speed(2); }
|
||||
OPPONENT(species2) { Ability(ability2); Speed(1); }
|
||||
} WHEN {
|
||||
|
||||
@@ -10,8 +10,8 @@ SINGLE_BATTLE_TEST("Neuroforce increases the strength of super-effective moves b
|
||||
PARAMETRIZE { ability = ABILITY_NEUROFORCE; move = MOVE_TACKLE; }
|
||||
PARAMETRIZE { ability = ABILITY_KLUTZ; move = MOVE_TACKLE; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SHADOW_BALL].type == TYPE_GHOST);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL);
|
||||
ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST);
|
||||
ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL);
|
||||
PLAYER(SPECIES_NECROZMA_ULTRA) { Ability(ability); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
SINGLE_BATTLE_TEST("Oblivious prevents Infatuation")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_ATTRACT].effect == EFFECT_ATTRACT);
|
||||
ASSUME(GetMoveEffect(MOVE_ATTRACT) == EFFECT_ATTRACT);
|
||||
PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); Gender(MON_MALE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); }
|
||||
} WHEN {
|
||||
@@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Oblivious prevents Infatuation")
|
||||
SINGLE_BATTLE_TEST("Oblivious prevents Captivate")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_CAPTIVATE].effect == EFFECT_CAPTIVATE);
|
||||
ASSUME(GetMoveEffect(MOVE_CAPTIVATE) == EFFECT_CAPTIVATE);
|
||||
PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); Gender(MON_MALE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); }
|
||||
} WHEN {
|
||||
@@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Oblivious prevents Captivate")
|
||||
SINGLE_BATTLE_TEST("Oblivious prevents Taunt")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TAUNT].effect == EFFECT_TAUNT);
|
||||
ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT);
|
||||
ASSUME(B_OBLIVIOUS_TAUNT >= GEN_6);
|
||||
PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Opportunist only copies foe's positive stat changes in a turn", s16 damage)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
SINGLE_BATTLE_TEST("Overcoat blocks powder and spore moves")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_STUN_SPORE].powderMove);
|
||||
ASSUME(IsPowderMove(MOVE_STUN_SPORE));
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_PINECO) { Ability(ABILITY_OVERCOAT); }
|
||||
} WHEN {
|
||||
|
||||
@@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Overgrow boosts Grass-type moves in a pinch", s16 damage)
|
||||
PARAMETRIZE { hp = 99; }
|
||||
PARAMETRIZE { hp = 33; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_VINE_WHIP].type == TYPE_GRASS);
|
||||
ASSUME(GetMoveType(MOVE_VINE_WHIP) == TYPE_GRASS);
|
||||
PLAYER(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); MaxHP(99); HP(hp); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Own Tempo prevents Intimidate but no other stat down changes
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(B_UPDATED_INTIMIDATE >= GEN_8);
|
||||
ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE);
|
||||
ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE);
|
||||
PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); };
|
||||
OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); };
|
||||
} WHEN {
|
||||
@@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Own Tempo prevents Intimidate but no other stat down changes
|
||||
SINGLE_BATTLE_TEST("Own Tempo prevents confusion from moves by the opponent")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE);
|
||||
ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); };
|
||||
} WHEN {
|
||||
@@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Own Tempo is ignored by Mold Breaker")
|
||||
{
|
||||
KNOWN_FAILING; // Ideally the func CanBeConfused should be split into AttackerCanBeConfused and TargetCanBeConfused or we do it in the same func but have a check for when battlerAtk == battlerDef
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE);
|
||||
ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE);
|
||||
PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); }
|
||||
OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); };
|
||||
} WHEN {
|
||||
@@ -77,7 +77,7 @@ SINGLE_BATTLE_TEST("Own Tempo cures confusion obtained from an opponent with Mol
|
||||
{
|
||||
KNOWN_FAILING;
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE);
|
||||
ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE);
|
||||
PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); };
|
||||
OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); };
|
||||
} WHEN {
|
||||
@@ -96,8 +96,8 @@ SINGLE_BATTLE_TEST("Own Tempo cures confusion obtained from an opponent with Mol
|
||||
SINGLE_BATTLE_TEST("Own Tempo cures confusion if it's obtained via Skill Swap")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE);
|
||||
ASSUME(gMovesInfo[MOVE_SKILL_SWAP].effect == EFFECT_SKILL_SWAP);
|
||||
ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE);
|
||||
ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP);
|
||||
PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
SINGLE_BATTLE_TEST("Parental Bond converts Tackle into a two-strike move")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].category != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].strikeCount < 2);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].effect == EFFECT_HIT);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveStrikeCount(MOVE_TACKLE) < 2);
|
||||
ASSUME(GetMoveEffect(MOVE_TACKLE) == EFFECT_HIT);
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -27,8 +27,8 @@ SINGLE_BATTLE_TEST("Parental Bond converts Tackle into a two-strike move")
|
||||
SINGLE_BATTLE_TEST("Parental Bond does not convert a move with three or more strikes to a two-strike move")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TRIPLE_KICK].category != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(gMovesInfo[MOVE_TRIPLE_KICK].strikeCount == 3);
|
||||
ASSUME(GetMoveCategory(MOVE_TRIPLE_KICK) != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveStrikeCount(MOVE_TRIPLE_KICK) == 3);
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -54,10 +54,10 @@ SINGLE_BATTLE_TEST("Parental Bond converts multi-target moves into a two-strike
|
||||
PARAMETRIZE { move = MOVE_ICY_WIND; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_EARTHQUAKE].strikeCount < 2);
|
||||
ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(gMovesInfo[MOVE_ICY_WIND].strikeCount < 2);
|
||||
ASSUME(gMovesInfo[MOVE_ICY_WIND].target == MOVE_TARGET_BOTH);
|
||||
ASSUME(GetMoveStrikeCount(MOVE_EARTHQUAKE) < 2);
|
||||
ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(GetMoveStrikeCount(MOVE_ICY_WIND) < 2);
|
||||
ASSUME(GetMoveTarget(MOVE_ICY_WIND) == MOVE_TARGET_BOTH);
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -78,8 +78,8 @@ SINGLE_BATTLE_TEST("Parental Bond converts multi-target moves into a two-strike
|
||||
DOUBLE_BATTLE_TEST("Parental Bond does not convert multi-target moves into a two-strike move in Double Battles, even if it only damages one")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_EARTHQUAKE].strikeCount < 2);
|
||||
ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(GetMoveStrikeCount(MOVE_EARTHQUAKE) < 2);
|
||||
ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY);
|
||||
ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING);
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
PLAYER(SPECIES_PIDGEY);
|
||||
@@ -109,8 +109,8 @@ SINGLE_BATTLE_TEST("Parental Bond-converted moves only hit once on Lightning Rod
|
||||
PARAMETRIZE { move = MOVE_THUNDERBOLT; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; type = TYPE_ELECTRIC; }
|
||||
PARAMETRIZE { move = MOVE_SURF; ability = ABILITY_STORM_DRAIN; species = SPECIES_LILEEP; type = TYPE_WATER; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[move].strikeCount < 2);
|
||||
ASSUME(gMovesInfo[move].type == type);
|
||||
ASSUME(GetMoveStrikeCount(move) < 2);
|
||||
ASSUME(GetMoveType(move) == type);
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
} WHEN {
|
||||
@@ -137,8 +137,8 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil
|
||||
|
||||
GIVEN {
|
||||
ASSUME(B_MULTI_HIT_CHANCE >= GEN_5);
|
||||
ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT);
|
||||
ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT);
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -163,8 +163,8 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil
|
||||
|
||||
GIVEN {
|
||||
ASSUME(B_MULTI_HIT_CHANCE >= GEN_5);
|
||||
ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT);
|
||||
ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT);
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -190,8 +190,8 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil
|
||||
|
||||
GIVEN {
|
||||
ASSUME(B_MULTI_HIT_CHANCE >= GEN_5);
|
||||
ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT);
|
||||
ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT);
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -218,8 +218,8 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil
|
||||
|
||||
GIVEN {
|
||||
ASSUME(B_MULTI_HIT_CHANCE >= GEN_5);
|
||||
ASSUME(gMovesInfo[MOVE_COMET_PUNCH].category != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(gMovesInfo[MOVE_COMET_PUNCH].effect == EFFECT_MULTI_HIT);
|
||||
ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT);
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -242,8 +242,8 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil
|
||||
SINGLE_BATTLE_TEST("Parental Bond Smack Down effect triggers after 2nd hit")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SMACK_DOWN].category != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(gMovesInfo[MOVE_SMACK_DOWN].strikeCount < 2);
|
||||
ASSUME(GetMoveCategory(MOVE_SMACK_DOWN) != DAMAGE_CATEGORY_STATUS);
|
||||
ASSUME(GetMoveStrikeCount(MOVE_SMACK_DOWN) < 2);
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_SMACK_DOWN, MOVE_EFFECT_SMACK_DOWN));
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
OPPONENT(SPECIES_SKARMORY);
|
||||
@@ -267,7 +267,7 @@ SINGLE_BATTLE_TEST("Parental Bond Snore strikes twice while asleep")
|
||||
{
|
||||
s16 damage[2];
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SNORE].effect == EFFECT_SNORE);
|
||||
ASSUME(GetMoveEffect(MOVE_SNORE) == EFFECT_SNORE);
|
||||
PLAYER(SPECIES_KANGASKHAN_MEGA) { Status1(STATUS1_SLEEP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -286,6 +286,26 @@ SINGLE_BATTLE_TEST("Parental Bond Snore strikes twice while asleep")
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Parental Bond only triggers Dragon Tail's target switch out on the second hit")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET);
|
||||
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WYNAUT);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_DRAGON_TAIL, gimmick: GIMMICK_MEGA); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, player);
|
||||
HP_BAR(opponent);
|
||||
HP_BAR(opponent);
|
||||
MESSAGE("The opposing Wynaut was dragged out!");
|
||||
}
|
||||
THEN {
|
||||
EXPECT_EQ(player->species, SPECIES_KANGASKHAN_MEGA);
|
||||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Parental Bond tests");
|
||||
|
||||
// Temporary TODO: Convert Bulbapedia description into tests.
|
||||
|
||||
@@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Pastel Veil immediately cures Mold Breaker poison")
|
||||
{
|
||||
KNOWN_FAILING;
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); }
|
||||
OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); }
|
||||
} WHEN {
|
||||
@@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Pastel Veil immediately cures Mold Breaker poison")
|
||||
DOUBLE_BATTLE_TEST("Pastel Veil does not cure Mold Breaker poison on partner")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); }
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); }
|
||||
@@ -70,7 +70,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil does not cure Mold Breaker poison on partner")
|
||||
SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); }
|
||||
} WHEN {
|
||||
@@ -86,7 +86,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison")
|
||||
DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison on partner")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); }
|
||||
@@ -104,7 +104,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison on partner")
|
||||
SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic Spikes poison")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); }
|
||||
@@ -120,7 +120,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic Spikes poison")
|
||||
DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic Spikes poison on partner")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
OPPONENT(SPECIES_PONYTA_GALAR) { Ability(ABILITY_PASTEL_VEIL); }
|
||||
|
||||
@@ -23,7 +23,24 @@ SINGLE_BATTLE_TEST("Pickup grants an item used by another Pokémon")
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Pickup doesn't grant the user their item")
|
||||
WILD_BATTLE_TEST("Pickup grants an item used by itself in wild battles (Gen 9)")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(B_PICKUP_WILD >= GEN_9);
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_TACKLE); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent);
|
||||
ABILITY_POPUP(player, ABILITY_PICKUP);
|
||||
MESSAGE("Zigzagoon found one Sitrus Berry!");
|
||||
} THEN {
|
||||
EXPECT_EQ(player->item, ITEM_SITRUS_BERRY);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Pickup doesn't grant the user their item outside wild battles")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
@@ -103,7 +120,7 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item after its holder faints")
|
||||
SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if holder is replaced")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT);
|
||||
ASSUME(GetMoveEffect(MOVE_PARTING_SHOT) == EFFECT_PARTING_SHOT);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { MaxHP(300); HP(151); Item(ITEM_SITRUS_BERRY); }
|
||||
@@ -185,7 +202,7 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item if the user eats it with Bug Bi
|
||||
SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if its user already restored it")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_RECYCLE].effect == EFFECT_RECYCLE);
|
||||
ASSUME(GetMoveEffect(MOVE_RECYCLE) == EFFECT_RECYCLE);
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@@ -205,7 +222,7 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if its user already restor
|
||||
SINGLE_BATTLE_TEST("Pickup restores an item that has been Flinged")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING);
|
||||
ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING);
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@@ -222,7 +239,7 @@ SINGLE_BATTLE_TEST("Pickup restores an item that has been Flinged")
|
||||
SINGLE_BATTLE_TEST("Pickup restores an item that was used by Natural Gift")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT);
|
||||
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].type == TYPE_NORMAL);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].power > 0);
|
||||
ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL);
|
||||
ASSUME(GetMovePower(MOVE_TACKLE) > 0);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Pixilate turns a Normal-type move into a Fairy-type move")
|
||||
|
||||
@@ -7,15 +7,15 @@ SINGLE_BATTLE_TEST("Poison Point inflicts poison on contact")
|
||||
PARAMETRIZE { move = MOVE_TACKLE; }
|
||||
PARAMETRIZE { move = MOVE_SWIFT; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(!gMovesInfo[MOVE_SWIFT].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
ASSUME(!MoveMakesContact(MOVE_SWIFT));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_NIDORAN_M) { Ability(ABILITY_POISON_POINT); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
TURN {}
|
||||
} SCENE {
|
||||
if (gMovesInfo[move].makesContact) {
|
||||
if (MoveMakesContact(move)) {
|
||||
ABILITY_POPUP(opponent, ABILITY_POISON_POINT);
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, player);
|
||||
MESSAGE("Wobbuffet was poisoned by the opposing Nidoran♂'s Poison Point!");
|
||||
@@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Poison Point triggers 30% of the time")
|
||||
PASSES_RANDOMLY(3, 10, RNG_POISON_POINT);
|
||||
GIVEN {
|
||||
ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_4);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_NIDORAN_M) { Ability(ABILITY_POISON_POINT); }
|
||||
} WHEN {
|
||||
|
||||
@@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Poison Puppeteer confuses target if it was (badly) poisoned
|
||||
SINGLE_BATTLE_TEST("Poison Puppeteer does not trigger if poison is Toxic Spikes induced")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TOXIC_SPIKES].effect == EFFECT_TOXIC_SPIKES);
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES);
|
||||
PLAYER(SPECIES_PECHARUNT) { Ability(ABILITY_POISON_PUPPETEER); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
||||
@@ -5,8 +5,8 @@ SINGLE_BATTLE_TEST("Poison Touch has a 30% chance to poison when attacking with
|
||||
{
|
||||
PASSES_RANDOMLY(3, 10, RNG_POISON_TOUCH);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].power > 0);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(GetMovePower(MOVE_TACKLE) > 0);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_GRIMER) { Ability(ABILITY_POISON_TOUCH); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@@ -27,15 +27,15 @@ SINGLE_BATTLE_TEST("Poison Touch only applies when using contact moves")
|
||||
PARAMETRIZE { move = MOVE_TACKLE; }
|
||||
PARAMETRIZE { move = MOVE_SWIFT; }
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].makesContact);
|
||||
ASSUME(!gMovesInfo[MOVE_SWIFT].makesContact);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
ASSUME(!MoveMakesContact(MOVE_SWIFT));
|
||||
PLAYER(SPECIES_GRIMER) { Ability(ABILITY_POISON_TOUCH); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, move, player);
|
||||
if (gMovesInfo[move].makesContact) {
|
||||
if (MoveMakesContact(move)) {
|
||||
ABILITY_POPUP(player, ABILITY_POISON_TOUCH);
|
||||
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent);
|
||||
MESSAGE("The opposing Wobbuffet was poisoned by Grimer's Poison Touch!");
|
||||
@@ -54,8 +54,8 @@ SINGLE_BATTLE_TEST("Poison Touch only applies when using contact moves")
|
||||
SINGLE_BATTLE_TEST("Poison Touch applies between multi-hit move hits")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_ARM_THRUST].effect == EFFECT_MULTI_HIT);
|
||||
ASSUME(gMovesInfo[MOVE_ARM_THRUST].makesContact);
|
||||
ASSUME(GetMoveEffect(MOVE_ARM_THRUST) == EFFECT_MULTI_HIT);
|
||||
ASSUME(MoveMakesContact(MOVE_ARM_THRUST));
|
||||
ASSUME(gItemsInfo[ITEM_PECHA_BERRY].holdEffect == HOLD_EFFECT_CURE_PSN);
|
||||
PLAYER(SPECIES_GRIMER) { Ability(ABILITY_POISON_TOUCH); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_PECHA_BERRY); };
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user