Misc moves + cmd_seteffectwithchance fix

Added check to prevent loops in cmd_seteffectwithchance. Updated Pay Day, Tri Attack, Spectral Thief, Clear Smog, V Create, Core Enforcer
This commit is contained in:
Nephrite 2023-11-27 00:32:40 +09:00
parent 4058d16f2f
commit 2d0ec53cb6
8 changed files with 102 additions and 117 deletions

View File

@ -56,9 +56,9 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_31
.4byte BattleScript_EffectRestoreHp @ EFFECT_RESTORE_HP
.4byte BattleScript_EffectToxic @ EFFECT_TOXIC
.4byte BattleScript_EffectPayDay @ EFFECT_PAY_DAY
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_34
.4byte BattleScript_EffectLightScreen @ EFFECT_LIGHT_SCREEN
.4byte BattleScript_EffectTriAttack @ EFFECT_TRI_ATTACK
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_36
.4byte BattleScript_EffectRest @ EFFECT_REST
.4byte BattleScript_EffectOHKO @ EFFECT_OHKO
.4byte BattleScript_EffectHit @ EFFECT_FUSION_COMBO
@ -247,7 +247,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectHit @ EFFECT_GYRO_BALL
.4byte BattleScript_EffectHit @ EFFECT_ECHOED_VOICE
.4byte BattleScript_EffectHit @ EFFECT_PAYBACK
.4byte BattleScript_EffectRound @ EFFECT_ROUND
.4byte BattleScript_EffectHit @ EFFECT_ROUND
.4byte BattleScript_EffectHit @ EFFECT_BRINE
.4byte BattleScript_EffectHit @ EFFECT_VENOSHOCK
.4byte BattleScript_EffectHit @ EFFECT_RETALIATE
@ -312,7 +312,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectNobleRoar @ EFFECT_NOBLE_ROAR
.4byte BattleScript_EffectVenomDrench @ EFFECT_VENOM_DRENCH
.4byte BattleScript_EffectToxicThread @ EFFECT_TOXIC_THREAD
.4byte BattleScript_EffectClearSmog @ EFFECT_CLEAR_SMOG
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_290
.4byte BattleScript_EffectHitSwitchTarget @ EFFECT_HIT_SWITCH_TARGET
.4byte BattleScript_EffectFinalGambit @ EFFECT_FINAL_GAMBIT
.4byte BattleScript_EffectHit @ EFFECT_CHANGE_TYPE_ON_ITEM
@ -343,11 +343,11 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectSpAtkUpHit @ EFFECT_SP_ATTACK_UP_HIT
.4byte BattleScript_EffectHit @ EFFECT_BELCH
.4byte BattleScript_EffectPartingShot @ EFFECT_PARTING_SHOT
.4byte BattleScript_EffectSpectralThief @ EFFECT_SPECTRAL_THIEF
.4byte BattleScript_EffectVCreate @ EFFECT_V_CREATE
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_321
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_322
.4byte BattleScript_EffectMatBlock @ EFFECT_MAT_BLOCK
.4byte BattleScript_EffectHit @ EFFECT_STOMPING_TANTRUM
.4byte BattleScript_EffectCoreEnforcer @ EFFECT_CORE_ENFORCER
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_325
.4byte BattleScript_EffectInstruct @ EFFECT_INSTRUCT
.4byte BattleScript_EffectThroatChop @ EFFECT_THROAT_CHOP
.4byte BattleScript_EffectLaserFocus @ EFFECT_LASER_FOCUS
@ -1468,10 +1468,6 @@ BattleScript_MoveEffectBugBite::
restoretarget
return
BattleScript_EffectCoreEnforcer:
setmoveeffect MOVE_EFFECT_CORE_ENFORCER | MOVE_EFFECT_CERTAIN
goto BattleScript_EffectHit
BattleScript_MoveEffectCoreEnforcer::
setgastroacid BattleScript_CoreEnforcerRet
printstring STRINGID_PKMNSABILITYSUPPRESSED
@ -1493,10 +1489,6 @@ BattleScript_EffectLaserFocus:
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
BattleScript_EffectVCreate:
setmoveeffect MOVE_EFFECT_V_CREATE | MOVE_EFFECT_AFFECTS_USER
goto BattleScript_EffectHit
BattleScript_VCreateStatLoss::
jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_VCreateStatAnim
jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPDEF, MIN_STAT_STAGE, BattleScript_VCreateStatAnim
@ -1532,10 +1524,6 @@ BattleScript_SpectralThiefSteal::
spectralthiefprintstats
return
BattleScript_EffectSpectralThief:
setmoveeffect MOVE_EFFECT_SPECTRAL_THIEF
goto BattleScript_EffectHit
BattleScript_EffectPartingShot::
attackcanceler
attackstring
@ -2089,10 +2077,6 @@ BattleScript_HitSwitchTargetForceRandomSwitchFailed:
setbyte sSWITCH_CASE, B_SWITCH_NORMAL
goto BattleScript_MoveEnd
BattleScript_EffectClearSmog:
setmoveeffect MOVE_EFFECT_CLEAR_SMOG
goto BattleScript_EffectHit
BattleScript_EffectToxicThread:
setstatchanger STAT_SPEED, 2, TRUE
attackcanceler
@ -3066,10 +3050,6 @@ BattleScript_EffectPlaceholder:
printstring STRINGID_NOTDONEYET
goto BattleScript_MoveEnd
BattleScript_EffectRound:
setmoveeffect MOVE_EFFECT_ROUND
goto BattleScript_EffectHit
BattleScript_EffectHit::
BattleScript_HitFromAtkCanceler::
attackcanceler
@ -3771,10 +3751,6 @@ BattleScript_ImmunityProtected::
call BattleScript_PSNPrevention
goto BattleScript_MoveEnd
BattleScript_EffectPayDay::
setmoveeffect MOVE_EFFECT_PAYDAY
goto BattleScript_EffectHit
BattleScript_EffectAuroraVeil:
attackcanceler
attackstring
@ -3789,10 +3765,6 @@ BattleScript_EffectLightScreen::
setlightscreen
goto BattleScript_PrintReflectLightScreenSafeguardString
BattleScript_EffectTriAttack::
setmoveeffect MOVE_EFFECT_TRI_ATTACK
goto BattleScript_EffectHit
BattleScript_EffectRest::
attackcanceler
attackstring

View File

@ -35,9 +35,9 @@
#define EFFECT_UNUSED_31 31
#define EFFECT_RESTORE_HP 32
#define EFFECT_TOXIC 33
#define EFFECT_PAY_DAY 34
#define EFFECT_UNUSED_34 34
#define EFFECT_LIGHT_SCREEN 35
#define EFFECT_TRI_ATTACK 36
#define EFFECT_UNUSED_36 36
#define EFFECT_REST 37
#define EFFECT_OHKO 38
#define EFFECT_FUSION_COMBO 39
@ -293,7 +293,7 @@
#define EFFECT_NOBLE_ROAR 287
#define EFFECT_VENOM_DRENCH 288
#define EFFECT_TOXIC_THREAD 289
#define EFFECT_CLEAR_SMOG 290
#define EFFECT_UNUSED_290 290
#define EFFECT_HIT_SWITCH_TARGET 291
#define EFFECT_FINAL_GAMBIT 292
#define EFFECT_CHANGE_TYPE_ON_ITEM 293
@ -324,11 +324,11 @@
#define EFFECT_SP_ATTACK_UP_HIT 318
#define EFFECT_BELCH 319
#define EFFECT_PARTING_SHOT 320
#define EFFECT_SPECTRAL_THIEF 321
#define EFFECT_V_CREATE 322
#define EFFECT_UNUSED_321 321
#define EFFECT_UNUSED_322 322
#define EFFECT_MAT_BLOCK 323
#define EFFECT_STOMPING_TANTRUM 324
#define EFFECT_CORE_ENFORCER 325
#define EFFECT_UNUSED_325 325
#define EFFECT_INSTRUCT 326
#define EFFECT_THROAT_CHOP 327
#define EFFECT_LASER_FOCUS 328

View File

@ -2089,8 +2089,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
}
}
break;
case EFFECT_SPECTRAL_THIEF:
break;
case EFFECT_SEMI_INVULNERABLE:
if (predictedMove != MOVE_NONE
&& AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_SLOWER
@ -2178,8 +2176,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|| aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ABILITY_SHIELD)
ADJUST_SCORE(-10);
break;
case EFFECT_CORE_ENFORCER:
break;
case EFFECT_SIMPLE_BEAM:
if (aiData->abilities[battlerDef] == ABILITY_SIMPLE
|| IsEntrainmentTargetOrSimpleBeamBannedAbility(aiData->abilities[battlerDef])
@ -3215,7 +3211,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
u32 predictedMove = aiData->predictedMoves[battlerDef];
u32 predictedMoveSlot = GetMoveSlot(GetMovesArray(battlerDef), predictedMove);
bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk);
u32 i;
u32 i = 0;
// We only check for moves that have a 20% chance or more for their secondary effect to happen because moves with a smaller chance are rather worthless. We don't want the AI to use those.
bool32 sereneGraceBoost = (aiData->abilities[battlerAtk] == ABILITY_SERENE_GRACE && (gBattleMoves[move].secondaryEffectChance >= 20 && gBattleMoves[move].secondaryEffectChance < 100));
@ -3511,16 +3507,18 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
case EFFECT_HAZE:
if (AnyStatIsRaised(BATTLE_PARTNER(battlerAtk))
|| PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))
{
ADJUST_SCORE(-3);
break;
// fallthrough
}
goto SHOULD_USE_PHAZING_MOVE;
case EFFECT_ROAR:
case EFFECT_CLEAR_SMOG:
if (isDoubleBattle)
score += min(CountPositiveStatStages(battlerDef) + CountPositiveStatStages(BATTLE_PARTNER(battlerDef)), 7);
else
score += min(CountPositiveStatStages(battlerDef), 4);
break;
if (aiData->abilities[battlerDef] == ABILITY_SOUNDPROOF || aiData->abilities[battlerDef] == ABILITY_SUCTION_CUPS)
{
ADJUST_SCORE(-3);
break;
}
goto SHOULD_USE_PHAZING_MOVE;
case EFFECT_MULTI_HIT:
case EFFECT_TRIPLE_KICK:
if (AI_MoveMakesContact(aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk], move)
@ -4067,36 +4065,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
score += (MAX_STAT_STAGE - gBattleMons[battlerAtk].statStages[STAT_ATK]);
break;
case EFFECT_PSYCH_UP:
case EFFECT_SPECTRAL_THIEF:
// Want to copy positive stat changes
for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++)
{
if (gBattleMons[battlerDef].statStages[i] > gBattleMons[battlerAtk].statStages[i])
{
switch (i)
{
case STAT_ATK:
if (HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
ADJUST_SCORE(1);
break;
case STAT_SPATK:
if (HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL))
ADJUST_SCORE(1);
break;
case STAT_ACC:
case STAT_EVASION:
case STAT_SPEED:
ADJUST_SCORE(1);
break;
case STAT_DEF:
case STAT_SPDEF:
if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_STALL)
ADJUST_SCORE(1);
break;
}
}
}
break;
goto SHOULD_USE_STAT_COPY_MOVE;
case EFFECT_SEMI_INVULNERABLE:
ADJUST_SCORE(1);
if (predictedMove != MOVE_NONE && !isDoubleBattle)
@ -4140,7 +4109,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
case EFFECT_SWAGGER:
if (HasMoveEffect(battlerAtk, EFFECT_FOUL_PLAY)
|| HasMoveEffect(battlerAtk, EFFECT_PSYCH_UP)
|| HasMoveEffect(battlerAtk, EFFECT_SPECTRAL_THIEF))
|| HasMoveWithMoveEffect(battlerAtk, MOVE_EFFECT_SPECTRAL_THIEF, FALSE))
ADJUST_SCORE(1);
if (aiData->abilities[battlerDef] == ABILITY_CONTRARY)
@ -4150,7 +4119,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
break;
case EFFECT_FLATTER:
if (HasMoveEffect(battlerAtk, EFFECT_PSYCH_UP)
|| HasMoveEffect(battlerAtk, EFFECT_SPECTRAL_THIEF))
|| HasMoveWithMoveEffect(battlerAtk, MOVE_EFFECT_SPECTRAL_THIEF, FALSE))
ADJUST_SCORE(2);
if (aiData->abilities[battlerDef] == ABILITY_CONTRARY)
@ -4899,7 +4868,45 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
{
case MOVE_EFFECT_POISON:
IncreasePoisonScore(battlerAtk, battlerDef, move, &score);
break;
break;
case MOVE_EFFECT_CLEAR_SMOG:
SHOULD_USE_PHAZING_MOVE:
if (isDoubleBattle)
score += min(CountPositiveStatStages(battlerDef) + CountPositiveStatStages(BATTLE_PARTNER(battlerDef)), 7);
else
score += min(CountPositiveStatStages(battlerDef), 4);
break;
case MOVE_EFFECT_SPECTRAL_THIEF:
SHOULD_USE_STAT_COPY_MOVE:
// Want to copy positive stat changes
for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++)
{
if (gBattleMons[battlerDef].statStages[i] > gBattleMons[battlerAtk].statStages[i])
{
switch (i)
{
case STAT_ATK:
if (HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
ADJUST_SCORE(1);
break;
case STAT_SPATK:
if (HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL))
ADJUST_SCORE(1);
break;
case STAT_ACC:
case STAT_EVASION:
case STAT_SPEED:
ADJUST_SCORE(1);
break;
case STAT_DEF:
case STAT_SPDEF:
if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_STALL)
ADJUST_SCORE(1);
break;
}
}
}
break;
}
}

View File

@ -3584,8 +3584,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
gBattleScripting.moveEffect = RandomElement(RNG_DIRE_CLAW, sDireClawEffects);
SetMoveEffect(TRUE, 0);
}
else
gBattlescriptCurrInstr++;
break;
case MOVE_EFFECT_STEALTH_ROCK:
if (!(gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_STEALTH_ROCK))
@ -3594,8 +3592,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_StealthRockActivates;
}
else
gBattlescriptCurrInstr++;
break;
case MOVE_EFFECT_SPIKES:
if (gSideTimers[GetBattlerSide(gEffectBattler)].spikesAmount < 3)
@ -3604,8 +3600,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_SpikesActivates;
}
else
gBattlescriptCurrInstr++;
break;
case MOVE_EFFECT_SYRUP_BOMB:
if (!(gStatuses4[gEffectBattler] & STATUS4_SYRUP_BOMB))
@ -3648,12 +3642,13 @@ static void Cmd_seteffectwithchance(void)
}
gBattleScripting.moveEffect = 0;
}
else if (gBattleMoves[gCurrentMove].numAdditionalEffects > 0)
else if (gBattleMoves[gCurrentMove].numAdditionalEffects > gBattleStruct->additionalEffectsCounter)
{
u32 percentChance = CalcSecondaryEffectChance(
gBattlerAttacker,
gBattleMoves[gCurrentMove].additionalEffects[gBattleStruct->additionalEffectsCounter].chance
);
const u8 *currentPtr = gBattlescriptCurrInstr;
// Activate effect if it's primary (chance == 0) or if RNGesus says so
if ((percentChance == 0) || RandomPercentage(RNG_SECONDARY_EFFECT + gBattleStruct->additionalEffectsCounter, percentChance))
@ -3666,7 +3661,9 @@ static void Cmd_seteffectwithchance(void)
percentChance >= 100 // certain to happen
);
}
else
// Move script along if we haven't jumped elsewhere
if (gBattlescriptCurrInstr == currentPtr)
gBattlescriptCurrInstr = cmd->nextInstr;
// Call seteffectwithchance again in the case of a move with multiple effects
@ -3676,7 +3673,7 @@ static void Cmd_seteffectwithchance(void)
gBattleScripting.moveEffect = MOVE_EFFECT_CONTINUE;
}
else
gBattleStruct->additionalEffectsCounter = gBattleScripting.moveEffect = 0;
gBattleScripting.moveEffect = 0;
}
else
{
@ -6064,6 +6061,7 @@ static void Cmd_moveend(void)
gBattleStruct->zmove.effect = EFFECT_HIT;
gBattleStruct->hitSwitchTargetFailed = FALSE;
gBattleStruct->isAtkCancelerForCalledMove = FALSE;
gBattleStruct->additionalEffectsCounter = 0;
gBattleScripting.moveendState++;
break;
case MOVEEND_COUNT:

View File

@ -115,9 +115,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_CONVERSION] = 3,
[EFFECT_RESTORE_HP] = 3,
[EFFECT_TOXIC] = 5,
[EFFECT_PAY_DAY] = 1,
[EFFECT_LIGHT_SCREEN] = 7,
[EFFECT_TRI_ATTACK] = 1,
[EFFECT_REST] = 7,
[EFFECT_OHKO] = 7,
// [EFFECT_RAZOR_WIND] = 1,
@ -370,7 +368,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_NOBLE_ROAR] = 0, // TODO: Assign points
[EFFECT_VENOM_DRENCH] = 0, // TODO: Assign points
[EFFECT_TOXIC_THREAD] = 0, // TODO: Assign points
[EFFECT_CLEAR_SMOG] = 0, // TODO: Assign points
[EFFECT_HIT_SWITCH_TARGET] = 0, // TODO: Assign points
[EFFECT_FINAL_GAMBIT] = 0, // TODO: Assign points
[EFFECT_CHANGE_TYPE_ON_ITEM] = 0, // TODO: Assign points
@ -401,11 +398,8 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_SP_ATTACK_UP_HIT] = 0, // TODO: Assign points
[EFFECT_BELCH] = 0, // TODO: Assign points
[EFFECT_PARTING_SHOT] = 0, // TODO: Assign points
[EFFECT_SPECTRAL_THIEF] = 0, // TODO: Assign points
[EFFECT_V_CREATE] = 0, // TODO: Assign points
[EFFECT_MAT_BLOCK] = 0, // TODO: Assign points
[EFFECT_STOMPING_TANTRUM] = 0, // TODO: Assign points
[EFFECT_CORE_ENFORCER] = 0, // TODO: Assign points
[EFFECT_INSTRUCT] = 0, // TODO: Assign points
[EFFECT_THROAT_CHOP] = 0, // TODO: Assign points
[EFFECT_LASER_FOCUS] = 0, // TODO: Assign points

View File

@ -96,16 +96,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_PAY_DAY] =
{
.effect = EFFECT_PAY_DAY,
.effect = EFFECT_HIT,
.power = 40,
.type = TYPE_NORMAL,
.accuracy = 100,
.pp = 20,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
.zMoveEffect = Z_EFFECT_NONE,
ADDITIONAL_EFFECTS(
PRIMARY_EFFECT(MOVE_EFFECT_PAYDAY)
),
},
[MOVE_FIRE_PUNCH] =
@ -2893,17 +2895,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_TRI_ATTACK] =
{
.effect = EFFECT_TRI_ATTACK,
.effect = EFFECT_HIT,
.power = 80,
.type = TYPE_NORMAL,
.accuracy = 100,
.pp = 10,
.secondaryEffectChance = 20,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_TRI_ATTACK, 20)
),
},
[MOVE_SUPER_FANG] =
@ -3119,7 +3123,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.thawsUser = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_BURN, 10)
)
),
},
[MOVE_SNORE] =
@ -8811,13 +8815,15 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.type = TYPE_NORMAL,
.accuracy = 100,
.pp = 15,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE,
.ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6,
.soundMove = TRUE,
ADDITIONAL_EFFECTS(
PRIMARY_EFFECT(MOVE_EFFECT_ROUND)
),
},
[MOVE_ECHOED_VOICE] =
@ -8854,16 +8860,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_CLEAR_SMOG] =
{
.effect = EFFECT_CLEAR_SMOG,
.effect = EFFECT_HIT,
.power = 50,
.type = TYPE_POISON,
.accuracy = 0,
.pp = 15,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE,
ADDITIONAL_EFFECTS(
PRIMARY_EFFECT(MOVE_EFFECT_CLEAR_SMOG)
),
},
[MOVE_STORED_POWER] =
@ -9847,18 +9855,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_V_CREATE] =
{
.effect = EFFECT_V_CREATE,
.effect = EFFECT_HIT,
.power = 180,
.type = TYPE_FIRE,
.accuracy = 95,
.pp = 5,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
.zMoveEffect = Z_EFFECT_NONE,
.makesContact = TRUE,
.metronomeBanned = TRUE,
ADDITIONAL_EFFECTS(
PRIMARY_EFFECT_SELF(MOVE_EFFECT_V_CREATE)
),
},
[MOVE_FUSION_FLARE] =
@ -11410,16 +11420,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_CORE_ENFORCER] =
{
.effect = EFFECT_CORE_ENFORCER,
.effect = EFFECT_HIT,
.power = 100,
.type = TYPE_DRAGON,
.accuracy = 100,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE,
ADDITIONAL_EFFECTS(
PRIMARY_EFFECT(MOVE_EFFECT_CORE_ENFORCER)
),
},
[MOVE_TROP_KICK] =
@ -11670,12 +11682,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_SPECTRAL_THIEF] =
{
.effect = EFFECT_SPECTRAL_THIEF,
.effect = EFFECT_HIT,
.power = 90,
.type = TYPE_GHOST,
.accuracy = 100,
.pp = 10,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
@ -11683,6 +11694,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.ignoresSubstitute = TRUE,
.makesContact = TRUE,
.metronomeBanned = TRUE,
ADDITIONAL_EFFECTS(
PRIMARY_EFFECT(MOVE_EFFECT_SPECTRAL_THIEF)
),
},
[MOVE_SUNSTEEL_STRIKE] =

View File

@ -117,7 +117,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Spectral Thief from resetting p
{
GIVEN {
ASSUME(gBattleMoves[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2);
ASSUME(gBattleMoves[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF);
ASSUME(gBattleMoves[MOVE_SPECTRAL_THIEF].additionalEffects[0].moveEffect == MOVE_EFFECT_SPECTRAL_THIEF);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); }
} WHEN {

View File

@ -3,7 +3,7 @@
ASSUMPTIONS
{
ASSUME(gBattleMoves[MOVE_TRI_ATTACK].effect == EFFECT_TRI_ATTACK);
ASSUME(gBattleMoves[MOVE_TRI_ATTACK].additionalEffects[0].moveEffect == MOVE_EFFECT_TRI_ATTACK);
}
SINGLE_BATTLE_TEST("Tri Attack can inflict paralysis, burn or freeze")