Merge branch 'master' of https://github.com/rh-hideout/pokeemerald-expansion into rh-hideout-master

This commit is contained in:
RoamerX 2025-12-30 12:28:03 +08:00
commit c80ee88388
7 changed files with 356 additions and 50 deletions

View File

@ -1541,10 +1541,10 @@ BattleScript_EffectInstruct::
tryinstruct BattleScript_ButItFailed
attackanimation
waitanimation
copybyte gBattlerAttacker, gBattlerTarget
copybyte gBattlerTarget, gEffectBattler
printstring STRINGID_USEDINSTRUCTEDMOVE
waitmessage B_WAIT_TIME_LONG
copybyte gBattlerAttacker, gBattlerTarget
copybyte gBattlerTarget, gEffectBattler
jumptocalledmove TRUE
BattleScript_EffectAutotomize::

View File

@ -666,7 +666,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] =
[STRINGID_SWEETVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}\n因甜幕而不会睡着!"),
[STRINGID_AROMAVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}\n正受到芳香幕的保护!"),
[STRINGID_CELEBRATEMESSAGE] = COMPOUND_STRING("恭喜恭喜!\n{B_PLAYER_NAME}"),
[STRINGID_USEDINSTRUCTEDMOVE] = COMPOUND_STRING("根据{B_SCR_NAME_WITH_PREFIX2}的指示,\n{B_ATK_NAME_WITH_PREFIX}使出了招式!"),
[STRINGID_USEDINSTRUCTEDMOVE] = COMPOUND_STRING("根据{B_ATK_NAME_WITH_PREFIX2}的指示,\n{B_DEF_NAME_WITH_PREFIX}使出了招式!"),
[STRINGID_THROATCHOPENDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}\n变得可以使出声音的招式了!"),
[STRINGID_PKMNCANTUSEMOVETHROATCHOP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX2}\n因深渊突刺的效果无法使出招式!\p"),
[STRINGID_LASERFOCUS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}\n磨砺了精神!"),

View File

@ -6093,7 +6093,7 @@ static void Cmd_moveend(void)
break;
case PROTECT_BANEFUL_BUNKER:
if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))
&& CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, GetBattlerAbility(gBattlerAttacker)))
&& CanBePoisoned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerTarget), GetBattlerAbility(gBattlerAttacker)))
{
gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE;
gBattleScripting.moveEffect = MOVE_EFFECT_POISON;

View File

@ -4809,7 +4809,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab
}
break;
case ABILITY_BALL_FETCH:
if (gBattleMons[battler].item == ITEM_NONE
if (!(gBattleTypeFlags & BATTLE_TYPE_RAID)
&& gBattleMons[battler].item == ITEM_NONE
&& gBattleResults.catchAttempts[ItemIdToBallId(gLastUsedBall)] >= 1
&& !gHasFetchedBall)
{
@ -5875,6 +5876,7 @@ bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum HoldEffe
u32 GetHighestStatId(u32 battler)
{
u32 highestId = STAT_ATK;
bool32 wonderRoom = (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) != 0;
u32 highestStat = gBattleMons[battler].attack;
for (u32 stat = STAT_DEF; stat < NUM_STATS; stat++)
@ -5882,10 +5884,28 @@ u32 GetHighestStatId(u32 battler)
if (stat == STAT_SPEED)
continue;
u16 *statVal = &gBattleMons[battler].attack + (stat - 1);
if (*statVal > highestStat)
u32 statVal;
switch (stat)
{
highestStat = *statVal;
case STAT_ATK:
statVal = gBattleMons[battler].attack;
break;
case STAT_DEF:
statVal = wonderRoom ? gBattleMons[battler].spDefense : gBattleMons[battler].defense;
break;
case STAT_SPATK:
statVal = gBattleMons[battler].spAttack;
break;
case STAT_SPDEF:
statVal = wonderRoom ? gBattleMons[battler].defense : gBattleMons[battler].spDefense;
break;
default:
continue;
}
if (statVal > highestStat)
{
highestStat = statVal;
highestId = stat;
}
}

View File

@ -17,23 +17,26 @@ SINGLE_BATTLE_TEST("Beast Boost boosts the most proficient stat when knocking ou
TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); }
} SCENE {
ABILITY_POPUP(player, ABILITY_BEAST_BOOST);
switch(i) {
case 0:
MESSAGE("Nihilego's Attack rose!");
break;
case 1:
MESSAGE("Nihilego's Defense rose!");
break;
case 2:
MESSAGE("Nihilego's Sp. Atk rose!");
break;
case 3:
MESSAGE("Nihilego's Sp. Def rose!");
break;
case 4:
MESSAGE("Nihilego's Speed rose!");
break;
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
} THEN {
u32 expectedStat = STAT_ATK;
switch (i) {
case 1:
expectedStat = STAT_DEF;
break;
case 2:
expectedStat = STAT_SPATK;
break;
case 3:
expectedStat = STAT_SPDEF;
break;
case 4:
expectedStat = STAT_SPEED;
break;
}
EXPECT_EQ(player->statStages[expectedStat], DEFAULT_STAT_STAGE + 1);
}
}
@ -73,28 +76,180 @@ SINGLE_BATTLE_TEST("Beast Boost prioritizes stats in the case of a tie in the fo
TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); }
} SCENE {
ABILITY_POPUP(player, ABILITY_BEAST_BOOST);
switch(i) {
case 0:
MESSAGE("Nihilego's Attack rose!");
break;
case 1:
MESSAGE("Nihilego's Defense rose!");
break;
case 2:
MESSAGE("Nihilego's Sp. Atk rose!");
break;
case 3:
MESSAGE("Nihilego's Sp. Def rose!");
break;
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
} THEN {
u32 expectedStat = STAT_ATK;
switch (i) {
case 1:
expectedStat = STAT_DEF;
break;
case 2:
expectedStat = STAT_SPATK;
break;
case 3:
expectedStat = STAT_SPDEF;
break;
}
EXPECT_EQ(player->statStages[expectedStat], DEFAULT_STAT_STAGE + 1);
}
}
TO_DO_BATTLE_TEST("Beast Boost considers Power Split");
TO_DO_BATTLE_TEST("Beast Boost considers Guard Split");
TO_DO_BATTLE_TEST("Beast Boost considers Power Trick");
TO_DO_BATTLE_TEST("Beast Boost considers Wonder Room");
TO_DO_BATTLE_TEST("Beast Boost considers Speed Swap");
TO_DO_BATTLE_TEST("Beast Boost doesn't consider stat stages");
TO_DO_BATTLE_TEST("Beast Boost doesn't consider held items");
TO_DO_BATTLE_TEST("Beast Boost doesn't consider status condition reductions");
SINGLE_BATTLE_TEST("Beast Boost considers Power Split")
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_POWER_SPLIT) == EFFECT_POWER_SPLIT);
PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(200); Defense(30); SpAttack(50); SpDefense(30); }
OPPONENT(SPECIES_WOBBUFFET) { HP(1); Attack(10); SpAttack(250); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_POWER_SPLIT); }
TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_POWER_SPLIT, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player);
ABILITY_POPUP(player, ABILITY_BEAST_BOOST);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
} THEN {
EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1);
}
}
SINGLE_BATTLE_TEST("Beast Boost considers Guard Split")
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_GUARD_SPLIT) == EFFECT_GUARD_SPLIT);
PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(80); Defense(20); SpAttack(70); SpDefense(10); }
OPPONENT(SPECIES_WOBBUFFET) { HP(1); Defense(200); SpDefense(30); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_GUARD_SPLIT); }
TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_GUARD_SPLIT, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player);
ABILITY_POPUP(player, ABILITY_BEAST_BOOST);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
} THEN {
EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1);
}
}
SINGLE_BATTLE_TEST("Beast Boost considers Power Trick")
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_POWER_TRICK) == EFFECT_POWER_TRICK);
PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(40); Defense(200); SpAttack(60); SpDefense(50); }
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_POWER_TRICK); }
TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_POWER_TRICK, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player);
ABILITY_POPUP(player, ABILITY_BEAST_BOOST);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
} THEN {
EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1);
}
}
SINGLE_BATTLE_TEST("Beast Boost considers Wonder Room")
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_WONDER_ROOM) == EFFECT_WONDER_ROOM);
ASSUME(GetMovePower(MOVE_SCRATCH) > 0);
PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(100); Defense(50); SpAttack(70); SpDefense(200); Speed(120); Moves(MOVE_SPLASH, MOVE_EXTREME_SPEED); }
OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(200); Moves(MOVE_WONDER_ROOM, MOVE_SPLASH); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(30); }
} WHEN {
TURN { MOVE(opponent, MOVE_WONDER_ROOM); MOVE(player, MOVE_SPLASH); }
TURN { MOVE(player, MOVE_EXTREME_SPEED); MOVE(opponent, MOVE_SPLASH); SEND_OUT(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_WONDER_ROOM, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_EXTREME_SPEED, player);
ABILITY_POPUP(player, ABILITY_BEAST_BOOST);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
} THEN {
EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1);
}
}
SINGLE_BATTLE_TEST("Beast Boost considers Speed Swap")
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_SPEED_SWAP) == EFFECT_SPEED_SWAP);
PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(60); Defense(60); SpAttack(70); SpDefense(60); Speed(30); }
OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(200); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(50); }
} WHEN {
TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SPEED_SWAP); }
TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPEED_SWAP, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player);
ABILITY_POPUP(player, ABILITY_BEAST_BOOST);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
} THEN {
EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1);
}
}
SINGLE_BATTLE_TEST("Beast Boost doesn't consider stat stages")
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2);
PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(100); Defense(60); SpAttack(150); SpDefense(60); }
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_SWORDS_DANCE); }
TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player);
ABILITY_POPUP(player, ABILITY_BEAST_BOOST);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
} THEN {
EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1);
}
}
SINGLE_BATTLE_TEST("Beast Boost doesn't consider held items")
{
GIVEN {
ASSUME(gItemsInfo[ITEM_CHOICE_BAND].holdEffect == HOLD_EFFECT_CHOICE_BAND);
PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Item(ITEM_CHOICE_BAND); Attack(120); Defense(60); SpAttack(150); SpDefense(60); }
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player);
ABILITY_POPUP(player, ABILITY_BEAST_BOOST);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
} THEN {
EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1);
}
}
SINGLE_BATTLE_TEST("Beast Boost doesn't consider status condition reductions")
{
GIVEN {
PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Status1(STATUS1_BURN); Attack(150); Defense(60); SpAttack(100); SpDefense(60); }
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player);
ABILITY_POPUP(player, ABILITY_BEAST_BOOST);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
} THEN {
EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1);
}
}

View File

@ -239,9 +239,115 @@ SINGLE_BATTLE_TEST("Corrosion's effect is lost if the move used by the Pokémon
}
}
TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Baneful Bunker")
TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Psycho Shift while poisoned")
TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Toxic Orb")
TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Poison Barb")
SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Baneful Bunker")
{
u16 species;
PARAMETRIZE { species = SPECIES_ODDISH; }
PARAMETRIZE { species = SPECIES_BELDUM; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_BANEFUL_BUNKER) == EFFECT_PROTECT);
ASSUME(MoveMakesContact(MOVE_SCRATCH));
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); }
OPPONENT(species);
} WHEN {
TURN { MOVE(player, MOVE_BANEFUL_BUNKER); MOVE(opponent, MOVE_SCRATCH); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_BANEFUL_BUNKER, player);
MESSAGE("Salandit protected itself!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
MESSAGE("Salandit protected itself!");
STATUS_ICON(opponent, poison: TRUE);
}
}
SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Psycho Shift while poisoned")
{
u16 species;
PARAMETRIZE { species = SPECIES_ODDISH; }
PARAMETRIZE { species = SPECIES_BELDUM; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_PSYCHO_SHIFT) == EFFECT_PSYCHO_SHIFT);
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Status1(STATUS1_POISON); }
OPPONENT(species);
} WHEN {
TURN { MOVE(player, MOVE_PSYCHO_SHIFT); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHO_SHIFT, player);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent);
STATUS_ICON(opponent, poison: TRUE);
STATUS_ICON(player, none: TRUE);
}
}
SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Toxic Orb")
{
u16 species;
PARAMETRIZE { species = SPECIES_ODDISH; }
PARAMETRIZE { species = SPECIES_BELDUM; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING);
ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB);
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(ITEM_TOXIC_ORB); }
OPPONENT(species);
} WHEN {
TURN { MOVE(player, MOVE_FLING); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player);
HP_BAR(opponent);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent);
STATUS_ICON(opponent, badPoison: TRUE);
}
}
SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Poison Barb")
{
u16 species;
PARAMETRIZE { species = SPECIES_ODDISH; }
PARAMETRIZE { species = SPECIES_BELDUM; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING);
ASSUME(gItemsInfo[ITEM_POISON_BARB].holdEffect == HOLD_EFFECT_TYPE_POWER);
ASSUME(gItemsInfo[ITEM_POISON_BARB].secondaryId == TYPE_POISON);
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(ITEM_POISON_BARB); }
OPPONENT(species);
} WHEN {
TURN { MOVE(player, MOVE_FLING); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player);
HP_BAR(opponent);
ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent);
STATUS_ICON(opponent, poison: TRUE);
}
}
SINGLE_BATTLE_TEST("Corrosion does not affect Poison Spikes")
{
u16 species;
PARAMETRIZE { species = SPECIES_ODDISH; }
PARAMETRIZE { species = SPECIES_BELDUM; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES);
PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); }
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(species);
} WHEN {
TURN { MOVE(player, MOVE_TOXIC_SPIKES); }
TURN { SWITCH(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, player);
} THEN {
EXPECT_EQ(opponent->status1, STATUS1_NONE);
}
}
TO_DO_BATTLE_TEST("Dynamax: Corrosion can poison Poison/Steel types if the Pokémon uses G-Max Malodor")
TO_DO_BATTLE_TEST("Corrosion does not affect Poison Spikes")

View File

@ -322,3 +322,28 @@ DOUBLE_BATTLE_TEST("Instructed move will be redirected by Rage Powder after inst
HP_BAR(opponentLeft);
}
}
DOUBLE_BATTLE_TEST("Instruct message references the correct battlers")
{
GIVEN {
PLAYER(SPECIES_TREECKO);
PLAYER(SPECIES_SCEPTILE);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN {
MOVE(playerLeft, MOVE_CELEBRATE);
MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft);
MOVE(opponentLeft, MOVE_DRAGON_DARTS, target:playerLeft);
MOVE(opponentRight, MOVE_INSTRUCT, target: playerRight);
}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerRight);
MESSAGE("The opposing Wynaut used Instruct!");
NONE_OF {
MESSAGE("Sceptile followed the opposing Wobbuffet's instructions!");
}
MESSAGE("Sceptile followed the opposing Wynaut's instructions!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerRight);
}
}