Rapid Spin uses additional effects + test

This commit is contained in:
Nephrite 2023-12-30 17:02:59 +09:00
parent e7de08eca2
commit f5ae8e0686
7 changed files with 75 additions and 73 deletions

View file

@ -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

View file

@ -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

View file

@ -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;
}

View file

@ -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

View file

@ -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] =

View file

@ -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);

View 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
}
}