Rapid Spin uses additional effects + test
This commit is contained in:
parent
e7de08eca2
commit
f5ae8e0686
7 changed files with 75 additions and 73 deletions
|
@ -131,7 +131,7 @@ gBattleScriptsForMoveEffects::
|
|||
.4byte BattleScript_EffectMagnitude @ EFFECT_MAGNITUDE
|
||||
.4byte BattleScript_EffectBatonPass @ EFFECT_BATON_PASS
|
||||
.4byte BattleScript_EffectHit @ EFFECT_PURSUIT
|
||||
.4byte BattleScript_EffectRapidSpin @ EFFECT_RAPID_SPIN
|
||||
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_109
|
||||
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_110
|
||||
.4byte BattleScript_EffectCaptivate @ EFFECT_CAPTIVATE
|
||||
.4byte BattleScript_EffectMorningSun @ EFFECT_MORNING_SUN
|
||||
|
@ -4821,28 +4821,6 @@ BattleScript_EffectBatonPass::
|
|||
switchineffects BS_ATTACKER
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_EffectRapidSpin::
|
||||
.if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8
|
||||
call BattleScript_EffectHit_Ret
|
||||
jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd
|
||||
setmoveeffect MOVE_EFFECT_RAPIDSPIN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
|
||||
seteffectsecondary
|
||||
setstatchanger STAT_SPEED, 1, FALSE
|
||||
statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectRapidSpinEnd
|
||||
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectRapidSpinEnd
|
||||
setgraphicalstatchangevalues
|
||||
playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
|
||||
printfromtable gStatUpStringIds
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
BattleScript_EffectRapidSpinEnd::
|
||||
tryfaintmon BS_TARGET
|
||||
moveendall
|
||||
end
|
||||
.else
|
||||
setmoveeffect MOVE_EFFECT_RAPIDSPIN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
|
||||
goto BattleScript_EffectHit
|
||||
.endif
|
||||
|
||||
BattleScript_EffectArgFixedDamage::
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
|
|
|
@ -110,7 +110,7 @@
|
|||
#define EFFECT_MAGNITUDE 106
|
||||
#define EFFECT_BATON_PASS 107
|
||||
#define EFFECT_PURSUIT 108
|
||||
#define EFFECT_RAPID_SPIN 109
|
||||
#define EFFECT_UNUSED_109 109
|
||||
#define EFFECT_UNUSED_110 110
|
||||
#define EFFECT_CAPTIVATE 111
|
||||
#define EFFECT_MORNING_SUN 112
|
||||
|
|
|
@ -1666,13 +1666,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
|||
break;
|
||||
case EFFECT_HIT_ESCAPE:
|
||||
break;
|
||||
case EFFECT_RAPID_SPIN:
|
||||
if ((gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED) || (gStatuses3[battlerAtk] & STATUS3_LEECHSEED))
|
||||
break; // check damage/accuracy
|
||||
//Spin checks
|
||||
if (!(gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY))
|
||||
ADJUST_SCORE(-6);
|
||||
break;
|
||||
case EFFECT_BELLY_DRUM:
|
||||
if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY)
|
||||
ADJUST_SCORE(-10);
|
||||
|
@ -3682,7 +3675,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
|||
case EFFECT_LEECH_SEED:
|
||||
if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS)
|
||||
|| gStatuses3[battlerDef] & STATUS3_LEECHSEED
|
||||
|| HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN)
|
||||
|| HasMoveWithMoveEffect(battlerDef, MOVE_EFFECT_RAPIDSPIN, FALSE)
|
||||
|| aiData->abilities[battlerDef] == ABILITY_LIQUID_OOZE
|
||||
|| aiData->abilities[battlerDef] == ABILITY_MAGIC_GUARD)
|
||||
break;
|
||||
|
@ -4086,18 +4079,9 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
|||
else if (IsPredictedToUsePursuitableMove(battlerDef, battlerAtk) && !MoveWouldHitFirst(move, battlerAtk, battlerDef)) //Pursuit against fast U-Turn
|
||||
ADJUST_SCORE(3);*/
|
||||
break;
|
||||
case EFFECT_RAPID_SPIN:
|
||||
case EFFECT_DEFOG:
|
||||
if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0)
|
||||
{
|
||||
ADJUST_SCORE(3);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (move)
|
||||
{
|
||||
case MOVE_DEFOG:
|
||||
if (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST))
|
||||
if ((gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0)
|
||||
|| (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST)))
|
||||
{
|
||||
ADJUST_SCORE(3);
|
||||
}
|
||||
|
@ -4121,13 +4105,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
|||
}
|
||||
}
|
||||
break;
|
||||
case MOVE_RAPID_SPIN:
|
||||
case MOVE_MORTAL_SPIN:
|
||||
if (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED)
|
||||
ADJUST_SCORE(3);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case EFFECT_TORMENT:
|
||||
break;
|
||||
case EFFECT_WILL_O_WISP:
|
||||
|
@ -4771,6 +4748,17 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
|||
if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY)
|
||||
ADJUST_SCORE(3);
|
||||
break;
|
||||
case MOVE_EFFECT_RAPIDSPIN:
|
||||
if ((gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0)
|
||||
|| (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED))
|
||||
{
|
||||
ADJUST_SCORE(3);
|
||||
break;
|
||||
}
|
||||
//Spin checks
|
||||
if (!(gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY))
|
||||
ADJUST_SCORE(-6);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else // consider move effects that hinder the target
|
||||
|
@ -4922,7 +4910,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
|
|||
}
|
||||
break;
|
||||
case MOVE_EFFECT_WRAP:
|
||||
if (!HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) && !IsBattlerTrapped(battlerDef, TRUE) && ShouldTrap(battlerAtk, battlerDef, move))
|
||||
if (!HasMoveWithMoveEffect(battlerDef, MOVE_EFFECT_RAPIDSPIN, FALSE) && !IsBattlerTrapped(battlerDef, TRUE) && ShouldTrap(battlerAtk, battlerDef, move))
|
||||
ADJUST_SCORE(5);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -191,7 +191,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
|
|||
[EFFECT_MAGNITUDE] = 1,
|
||||
[EFFECT_BATON_PASS] = 7,
|
||||
[EFFECT_PURSUIT] = 2,
|
||||
[EFFECT_RAPID_SPIN] = 2,
|
||||
[EFFECT_ARG_FIXED_DAMAGE] = 1,
|
||||
[EFFECT_MORNING_SUN] = 4,
|
||||
[EFFECT_SYNTHESIS] = 4,
|
||||
|
@ -1276,6 +1275,8 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3)
|
|||
// various cases add/remove points
|
||||
if (gBattleMoves[arg2].recoil > 0)
|
||||
baseFromEffect++; // recoil moves
|
||||
if (MoveHasMoveEffect(arg2, MOVE_EFFECT_RAPIDSPIN, FALSE))
|
||||
baseFromEffect++;
|
||||
if (MoveHasMoveEffect(arg2, MOVE_EFFECT_SP_ATK_TWO_DOWN, FALSE)
|
||||
|| MoveHasMoveEffect(arg2, MOVE_EFFECT_ATK_DEF_DOWN, FALSE))
|
||||
baseFromEffect += 2; // Overheat etc & Superpower
|
||||
|
|
|
@ -3860,12 +3860,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
|||
|
||||
[MOVE_RAPID_SPIN] =
|
||||
{
|
||||
#if B_UPDATED_MOVE_DATA >= GEN_8
|
||||
.power = 50,
|
||||
#else
|
||||
.power = 20,
|
||||
#endif
|
||||
.effect = EFFECT_RAPID_SPIN,
|
||||
.effect = EFFECT_HIT,
|
||||
.power = B_UPDATED_MOVE_DATA >= GEN_8 ? 50 : 20,
|
||||
.type = TYPE_NORMAL,
|
||||
.accuracy = 100,
|
||||
.pp = 40,
|
||||
|
@ -3873,6 +3869,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
|
|||
.priority = 0,
|
||||
.category = BATTLE_CATEGORY_PHYSICAL,
|
||||
.makesContact = TRUE,
|
||||
ADDITIONAL_EFFECTS(
|
||||
PRIMARY_EFFECT_SELF(MOVE_EFFECT_RAPIDSPIN)
|
||||
#if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8
|
||||
, SECONDARY_EFFECT_SELF(MOVE_EFFECT_SPD_PLUS_1, 100)
|
||||
#endif
|
||||
),
|
||||
},
|
||||
|
||||
[MOVE_SWEET_SCENT] =
|
||||
|
|
|
@ -3,20 +3,22 @@
|
|||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(MoveHasMoveEffect(MOVE_MORTAL_SPIN, MOVE_EFFECT_RAPIDSPIN, FALSE) == TRUE);
|
||||
ASSUME(MoveHasMoveEffectSelf(MOVE_MORTAL_SPIN, MOVE_EFFECT_RAPIDSPIN) == TRUE);
|
||||
ASSUME(MoveHasMoveEffect(MOVE_MORTAL_SPIN, MOVE_EFFECT_POISON, FALSE) == TRUE);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Mortal Spin blows away hazards and poisons foe")
|
||||
SINGLE_BATTLE_TEST("Mortal Spin blows away Wrap, hazards and poisons foe")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_WRAP); }
|
||||
TURN { MOVE(opponent, MOVE_STEALTH_ROCK); MOVE(player, MOVE_MORTAL_SPIN); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_MORTAL_SPIN, player);
|
||||
MESSAGE("Wobbuffet got free of Foe Wobbuffet's Wrap!");
|
||||
MESSAGE("Wobbuffet blew away Stealth Rock!");
|
||||
MESSAGE("Foe Wobbuffet was poisoned!");
|
||||
STATUS_ICON(opponent, poison: TRUE);
|
||||
|
|
31
test/battle/move_effect/rapid_spin.c
Normal file
31
test/battle/move_effect/rapid_spin.c
Normal file
|
@ -0,0 +1,31 @@
|
|||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(MoveHasMoveEffectSelf(MOVE_RAPID_SPIN, MOVE_EFFECT_RAPIDSPIN) == TRUE);
|
||||
#if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8
|
||||
ASSUME(MoveHasMoveEffectSelf(MOVE_RAPID_SPIN, MOVE_EFFECT_SPD_PLUS_1) == TRUE);
|
||||
#endif
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Rapin Spin blows away Wrap, hazards and raises Speed (Gen 8+)")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_WRAP); }
|
||||
TURN { MOVE(opponent, MOVE_STEALTH_ROCK); MOVE(player, MOVE_RAPID_SPIN); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_RAPID_SPIN, player);
|
||||
MESSAGE("Wobbuffet got free of Foe Wobbuffet's Wrap!");
|
||||
MESSAGE("Wobbuffet blew away Stealth Rock!");
|
||||
#if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Wobbuffet's Speed rose!");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in a new issue