From c5061f01611281107d8751d0e2d6a1d5174c22f5 Mon Sep 17 00:00:00 2001 From: Nephrite Date: Tue, 26 Dec 2023 13:12:11 +0900 Subject: [PATCH] Updated remaining moves which use secondaryEffectChance secondaryEffectChance is no longer considered anywhere in the code; tidied up scripts and more --- asm/macros/battle_script.inc | 4 - data/battle_scripts_1.s | 126 +++------------ include/battle_scripts.h | 2 - include/constants/battle_move_effects.h | 51 +++--- include/constants/battle_script_commands.h | 2 +- src/battle_ai_main.c | 177 ++++++++++----------- src/battle_dome.c | 2 +- src/battle_script_commands.c | 53 +----- src/data/battle_moves.h | 41 +++-- test/battle/ability/sheer_force.c | 2 +- test/battle/move_effect/bug_bite.c | 2 +- 11 files changed, 162 insertions(+), 300 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index b6a5decdff..40738560f0 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1808,10 +1808,6 @@ .4byte \jumpInstr .endm - .macro argumentstatuseffect - various BS_ATTACKER, VARIOUS_ARGUMENT_STATUS_EFFECT - .endm - .macro tryhitswitchtarget failInstr:req various BS_ATTACKER, VARIOUS_TRY_HIT_SWITCH_TARGET .4byte \failInstr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b535a2e269..8ca71ad48e 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -146,7 +146,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectPsychUp @ EFFECT_PSYCH_UP .4byte BattleScript_EffectMirrorCoat @ EFFECT_MIRROR_COAT .4byte BattleScript_EffectSkullBash @ EFFECT_SKULL_BASH - .4byte BattleScript_EffectEarthquake @ EFFECT_EARTHQUAKE + .4byte BattleScript_EffectHit @ EFFECT_EARTHQUAKE .4byte BattleScript_EffectFutureSight @ EFFECT_FUTURE_SIGHT .4byte BattleScript_EffectGust @ EFFECT_GUST .4byte BattleScript_EffectSolarBeam @ EFFECT_SOLAR_BEAM @@ -228,7 +228,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_BRINE .4byte BattleScript_EffectHit @ EFFECT_VENOSHOCK .4byte BattleScript_EffectHit @ EFFECT_RETALIATE - .4byte BattleScript_EffectBulldoze @ EFFECT_BULLDOZE + .4byte BattleScript_EffectHit @ EFFECT_BULLDOZE .4byte BattleScript_EffectHit @ EFFECT_FOUL_PLAY .4byte BattleScript_EffectHit @ EFFECT_PSYSHOCK .4byte BattleScript_EffectRoost @ EFFECT_ROOST @@ -305,7 +305,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_REVELATION_DANCE .4byte BattleScript_EffectAuroraVeil @ EFFECT_AURORA_VEIL .4byte BattleScript_EffectThirdType @ EFFECT_THIRD_TYPE - .4byte BattleScript_EffectFeint @ EFFECT_FEINT + .4byte BattleScript_EffectHit @ EFFECT_FEINT .4byte BattleScript_EffectSparklingAria @ EFFECT_SPARKLING_ARIA .4byte BattleScript_EffectAcupressure @ EFFECT_ACUPRESSURE .4byte BattleScript_EffectAromaticMist @ EFFECT_AROMATIC_MIST @@ -319,8 +319,8 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectLaserFocus @ EFFECT_LASER_FOCUS .4byte BattleScript_EffectMagneticFlux @ EFFECT_MAGNETIC_FLUX .4byte BattleScript_EffectGearUp @ EFFECT_GEAR_UP - .4byte BattleScript_EffectIncinerate @ EFFECT_INCINERATE - .4byte BattleScript_EffectBugBite @ EFFECT_BUG_BITE + .4byte BattleScript_EffectHit @ EFFECT_INCINERATE + .4byte BattleScript_EffectHit @ EFFECT_BUG_BITE .4byte BattleScript_EffectStrengthSap @ EFFECT_STRENGTH_SAP .4byte BattleScript_EffectMindBlown @ EFFECT_MIND_BLOWN .4byte BattleScript_EffectPurify @ EFFECT_PURIFY @@ -369,7 +369,6 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectExtremeEvoboost @ EFFECT_EXTREME_EVOBOOST .4byte BattleScript_EffectHitSetRemoveTerrain @ EFFECT_HIT_SET_REMOVE_TERRAIN .4byte BattleScript_EffectDarkVoid @ EFFECT_DARK_VOID - .4byte BattleScript_EffectHit @ EFFET_UNUSED_384 .4byte BattleScript_EffectDoubleShock @ EFFECT_DOUBLE_SHOCK .4byte BattleScript_EffectVictoryDance @ EFFECT_VICTORY_DANCE .4byte BattleScript_EffectTeatime @ EFFECT_TEATIME @@ -572,23 +571,7 @@ BattleScript_EffectHit_Pledge:: pause B_WAIT_TIME_MED printstring STRINGID_THETWOMOVESBECOMEONE waitmessage B_WAIT_TIME_LONG - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - seteffectwithchance + call BattleScript_EffectHit_RetFromAccCheck tryfaintmon BS_TARGET return @@ -643,7 +626,7 @@ BattleScript_CorrosiveGasFail: BattleScript_EffectMakeItRain: jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_MakeItRainDoubles BattleScript_MakeItRainContinuous: - setmoveeffect MOVE_EFFECT_PAYDAY + setmoveeffect MOVE_EFFECT_PAYDAY | MOVE_EFFECT_CERTAIN call BattleScript_EffectHit_Ret tryfaintmon BS_TARGET setmoveeffect MOVE_EFFECT_SP_ATK_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN @@ -873,21 +856,7 @@ BattleScript_EffectSteelBeam:: attackstring ppreduce accuracycheck BattleScript_SteelBeamMiss, ACC_CURR_MOVE - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - seteffectwithchance + call BattleScript_EffectHit_RetFromCritCalc jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_SteelBeamAfterSelfDamage call BattleScript_SteelBeamSelfDamage BattleScript_SteelBeamAfterSelfDamage:: @@ -1129,24 +1098,11 @@ BattleScript_EffectPhotonGeyser: damagecalc adjustdamage photongeysercheck BS_ATTACKER - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - seteffectwithchance - tryfaintmon BS_TARGET - goto BattleScript_MoveEnd + goto BattleScript_HitFromAtkAnimation BattleScript_EffectAuraWheel: @ Aura Wheel can only be used by Morpeko - jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_FULL_BELLY, BattleScript_EffectSpeedUpHit - jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_HANGRY, BattleScript_EffectSpeedUpHit + jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_FULL_BELLY, BattleScript_EffectHit + jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_HANGRY, BattleScript_EffectHit goto BattleScript_PokemonCantUseTheMove BattleScript_EffectClangorousSoul: @@ -1254,8 +1210,7 @@ BattleScript_EffectHyperspaceFuryUnbound:: pause B_WAIT_TIME_LONG ppreduce setmoveeffect MOVE_EFFECT_FEINT - seteffectwithchance - setmoveeffect MOVE_EFFECT_DEF_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + seteffectprimary goto BattleScript_HitFromCritCalc BattleScript_ButHoopaCantUseIt: @@ -1578,14 +1533,6 @@ BattleScript_StrengthSapMustLower: waitanimation goto BattleScript_StrengthSapLower -BattleScript_EffectBugBite: - setmoveeffect MOVE_EFFECT_BUG_BITE | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - -BattleScript_EffectIncinerate: - setmoveeffect MOVE_EFFECT_INCINERATE | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - BattleScript_MoveEffectIncinerate:: printstring STRINGID_INCINERATEBURN waitmessage B_WAIT_TIME_LONG @@ -1827,10 +1774,6 @@ BattleScript_MoveEffectFeint:: waitmessage B_WAIT_TIME_LONG return -BattleScript_EffectFeint: - setmoveeffect MOVE_EFFECT_FEINT - goto BattleScript_EffectHit - BattleScript_EffectThirdType: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -2546,10 +2489,6 @@ BattleScript_VictoryDanceTrySpeed:: BattleScript_VictoryDanceEnd:: goto BattleScript_MoveEnd -BattleScript_EffectSpeedUpHit: - setmoveeffect MOVE_EFFECT_SPD_PLUS_1 | MOVE_EFFECT_AFFECTS_USER - goto BattleScript_EffectHit - BattleScript_EffectMeFirst: attackcanceler attackstring @@ -3133,7 +3072,6 @@ BattleScript_EffectHitEscape: call BattleScript_EffectHit_Ret jumpifmovehadnoeffect BattleScript_MoveEnd jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_MoveEnd - seteffectwithchance tryfaintmon BS_TARGET moveendto MOVEEND_ATTACKER_VISIBLE moveendfrom MOVEEND_TARGET_VISIBLE @@ -3165,18 +3103,7 @@ BattleScript_HitFromCritCalc:: damagecalc adjustdamage BattleScript_HitFromAtkAnimation:: - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - seteffectwithchance + call BattleScript_Hit_RetFromAtkAnimation BattleScript_TryFaintMon:: tryfaintmon BS_TARGET BattleScript_MoveEnd:: @@ -3185,12 +3112,15 @@ BattleScript_MoveEnd:: BattleScript_EffectHit_Ret:: attackcanceler +BattleScript_EffectHit_RetFromAccCheck:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce +BattleScript_EffectHit_RetFromCritCalc:: critcalc damagecalc adjustdamage +BattleScript_Hit_RetFromAtkAnimation:: attackanimation waitanimation effectivenesssound @@ -3214,21 +3144,7 @@ BattleScript_EffectNaturalGift: jumpifability BS_ATTACKER, ABILITY_KLUTZ, BattleScript_ButItFailed jumpifstatus3 BS_ATTACKER, STATUS3_EMBARGO, BattleScript_ButItFailed accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - seteffectwithchance + call BattleScript_EffectHit_RetFromCritCalc jumpifmovehadnoeffect BattleScript_EffectNaturalGiftEnd checkparentalbondcounter 2, BattleScript_EffectNaturalGiftEnd removeitem BS_ATTACKER @@ -4972,7 +4888,7 @@ BattleScript_EffectRapidSpin:: 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 - seteffectwithchance + 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 @@ -8198,8 +8114,6 @@ BattleScript_MoveEffectConfusion:: waitmessage B_WAIT_TIME_LONG return -BattleScript_MoveEffectRecoilWithStatus:: - argumentstatuseffect BattleScript_MoveEffectRecoil:: jumpifmove MOVE_STRUGGLE, BattleScript_DoRecoil jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd @@ -8213,10 +8127,6 @@ BattleScript_DoRecoil:: BattleScript_RecoilEnd:: return -BattleScript_EffectWithChance:: - seteffectwithchance - return - BattleScript_ItemSteal:: playanimation BS_TARGET, B_ANIM_ITEM_STEAL printstring STRINGID_PKMNSTOLEITEM diff --git a/include/battle_scripts.h b/include/battle_scripts.h index bc534b69af..d9eaa629bc 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -303,8 +303,6 @@ extern const u8 BattleScript_StickyWebDefog[]; extern const u8 BattleScript_StealthRockDefog[]; extern const u8 BattleScript_MegaEvolution[]; extern const u8 BattleScript_WishMegaEvolution[]; -extern const u8 BattleScript_MoveEffectRecoilWithStatus[]; -extern const u8 BattleScript_EffectWithChance[]; extern const u8 BattleScript_MoveEffectClearSmog[]; extern const u8 BattleScript_SideStatusWoreOffReturn[]; extern const u8 BattleScript_MoveEffectSmackDown[]; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 99c600e3ab..ca5b640c85 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -348,32 +348,31 @@ #define EFFECT_EXTREME_EVOBOOST 344 #define EFFECT_HIT_SET_REMOVE_TERRAIN 345 #define EFFECT_DARK_VOID 346 -#define EFFET_UNUSED_384 347 -#define EFFECT_DOUBLE_SHOCK 348 -#define EFFECT_VICTORY_DANCE 349 -#define EFFECT_TEATIME 350 -#define EFFECT_ATTACK_UP_USER_ALLY 351 -#define EFFECT_SHELL_TRAP 352 -#define EFFECT_PSYBLADE 353 -#define EFFECT_HYDRO_STEAM 354 -#define EFFECT_HIT_SET_ENTRY_HAZARD 355 -#define EFFECT_BARB_BARRAGE 356 -#define EFFECT_REVIVAL_BLESSING 357 -#define EFFECT_SNOWSCAPE 358 -#define EFFECT_INFERNAL_PARADE 359 -#define EFFECT_TAKE_HEART 360 -#define EFFECT_COLLISION_COURSE 361 -#define EFFECT_MAKE_IT_RAIN 362 -#define EFFECT_CORROSIVE_GAS 363 -#define EFFECT_POPULATION_BOMB 364 -#define EFFECT_SALT_CURE 365 -#define EFFECT_CHILLY_RECEPTION 366 -#define EFFECT_MAX_MOVE 367 -#define EFFECT_GLAIVE_RUSH 368 -#define EFFECT_RAGING_BULL 369 -#define EFFECT_RAGE_FIST 370 -#define EFFECT_DOODLE 371 +#define EFFECT_DOUBLE_SHOCK 347 +#define EFFECT_VICTORY_DANCE 348 +#define EFFECT_TEATIME 349 +#define EFFECT_ATTACK_UP_USER_ALLY 350 +#define EFFECT_SHELL_TRAP 351 +#define EFFECT_PSYBLADE 352 +#define EFFECT_HYDRO_STEAM 353 +#define EFFECT_HIT_SET_ENTRY_HAZARD 354 +#define EFFECT_BARB_BARRAGE 355 +#define EFFECT_REVIVAL_BLESSING 356 +#define EFFECT_SNOWSCAPE 357 +#define EFFECT_INFERNAL_PARADE 358 +#define EFFECT_TAKE_HEART 359 +#define EFFECT_COLLISION_COURSE 360 +#define EFFECT_MAKE_IT_RAIN 361 +#define EFFECT_CORROSIVE_GAS 362 +#define EFFECT_POPULATION_BOMB 363 +#define EFFECT_SALT_CURE 364 +#define EFFECT_CHILLY_RECEPTION 365 +#define EFFECT_MAX_MOVE 366 +#define EFFECT_GLAIVE_RUSH 367 +#define EFFECT_RAGING_BULL 368 +#define EFFECT_RAGE_FIST 369 +#define EFFECT_DOODLE 370 -#define NUM_BATTLE_MOVE_EFFECTS 372 +#define NUM_BATTLE_MOVE_EFFECTS 371 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 207fbd0fab..4ca21a47f4 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -140,7 +140,7 @@ #define VARIOUS_TRY_SOAK 48 #define VARIOUS_HANDLE_MEGA_EVO 49 #define VARIOUS_TRY_LAST_RESORT 50 -#define VARIOUS_ARGUMENT_STATUS_EFFECT 51 +#define VARIOUS_UNUSED_51 51 #define VARIOUS_TRY_HIT_SWITCH_TARGET 52 #define VARIOUS_TRY_AUTOTOMIZE 53 #define VARIOUS_ABILITY_POPUP 54 diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 655430218c..92d1852d23 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3755,58 +3755,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (ShouldUseWishAromatherapy(battlerAtk, battlerDef, move)) ADJUST_SCORE(3); break; - case EFFECT_THIEF: - { - bool32 canSteal = FALSE; - - if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE) - canSteal = TRUE; - if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER || GetBattlerSide(battlerAtk) == B_SIDE_PLAYER) - canSteal = TRUE; - - if (canSteal && aiData->items[battlerAtk] == ITEM_NONE - && aiData->items[battlerDef] != ITEM_NONE - && CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) - && CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) - && !HasMoveEffect(battlerAtk, EFFECT_ACROBATICS) - && aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD) - { - switch (aiData->holdEffects[battlerDef]) - { - case HOLD_EFFECT_NONE: - break; - case HOLD_EFFECT_CHOICE_BAND: - case HOLD_EFFECT_CHOICE_SCARF: - case HOLD_EFFECT_CHOICE_SPECS: - ADJUST_SCORE(2); - break; - case HOLD_EFFECT_TOXIC_ORB: - if (ShouldPoisonSelf(battlerAtk, aiData->abilities[battlerAtk])) - ADJUST_SCORE(2); - break; - case HOLD_EFFECT_FLAME_ORB: - if (ShouldBurnSelf(battlerAtk, aiData->abilities[battlerAtk])) - ADJUST_SCORE(2); - break; - case HOLD_EFFECT_BLACK_SLUDGE: - if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) - ADJUST_SCORE(2); - break; - case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerAtk, EFFECT_FLING)) - ADJUST_SCORE(2); - break; - case HOLD_EFFECT_LAGGING_TAIL: - case HOLD_EFFECT_STICKY_BARB: - break; - default: - ADJUST_SCORE(1); - break; - } - } - break; - } - break; case EFFECT_NIGHTMARE: if (aiData->abilities[battlerDef] != ABILITY_MAGIC_GUARD && !(gBattleMons[battlerDef].status2 & STATUS2_NIGHTMARE) @@ -4107,8 +4055,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_SCORE(3);*/ break; case EFFECT_RAPID_SPIN: - IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPEED, &score); // Gen 8 increases speed - //fallthrough case EFFECT_DEFOG: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) { @@ -4319,24 +4265,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_AURORA_VEIL) ADJUST_SCORE(1); break; - case EFFECT_KNOCK_OFF: - if (CanKnockOffItem(battlerDef, aiData->items[battlerDef])) - { - switch (aiData->holdEffects[battlerDef]) - { - case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerDef, EFFECT_FLING)) - ADJUST_SCORE(4); - break; - case HOLD_EFFECT_LAGGING_TAIL: - case HOLD_EFFECT_STICKY_BARB: - break; - default: - ADJUST_SCORE(3); - break; - } - } - break; case EFFECT_SKILL_SWAP: if (GetAbilityRating(aiData->abilities[battlerDef]) > GetAbilityRating(aiData->abilities[battlerAtk])) ADJUST_SCORE(1); @@ -4511,22 +4439,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_SCORE(1); } break; - case EFFECT_BUG_BITE: // And pluck - if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) - break; - else if (ItemId_GetPocket(aiData->items[battlerDef]) == POCKET_BERRIES) - ADJUST_SCORE(3); - break; - case EFFECT_INCINERATE: - if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) - break; - else if (ItemId_GetPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS) - ADJUST_SCORE(3); - break; - case EFFECT_SMACK_DOWN: - if (!IsBattlerGrounded(battlerDef)) - ADJUST_SCORE(3); - break; case EFFECT_RELIC_SONG: if (!(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) // Don't try to change form if it's transformed. { @@ -4802,9 +4714,9 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (!MoveEffectIsGuaranteed(AI_CalcSecondaryEffectChance(battlerAtk, gBattleMoves[move].additionalEffects[i].chance))) continue; + // Consider move effects that target self if (gBattleMoves[move].additionalEffects[i].self) { - // Consider move effects that target self switch (gBattleMoves[move].additionalEffects[i].moveEffect) { case MOVE_EFFECT_SPD_PLUS_2: @@ -4835,7 +4747,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score } else // consider move effects that hinder the target { - // Only consider the below if they're certain to happen switch (gBattleMoves[move].additionalEffects[i].moveEffect) { case MOVE_EFFECT_FLINCH: @@ -4862,6 +4773,92 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score case MOVE_EFFECT_SPECTRAL_THIEF: score += AI_ShouldCopyStatChanges(battlerAtk, battlerDef); break; + case MOVE_EFFECT_BUG_BITE: // And pluck + if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) + break; + else if (ItemId_GetPocket(aiData->items[battlerDef]) == POCKET_BERRIES) + ADJUST_SCORE(3); + break; + case MOVE_EFFECT_INCINERATE: + if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) + break; + else if (ItemId_GetPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS) + ADJUST_SCORE(3); + break; + case MOVE_EFFECT_SMACK_DOWN: + if (!IsBattlerGrounded(battlerDef)) + ADJUST_SCORE(3); + break; + case MOVE_EFFECT_KNOCK_OFF: + if (CanKnockOffItem(battlerDef, aiData->items[battlerDef])) + { + switch (aiData->holdEffects[battlerDef]) + { + case HOLD_EFFECT_IRON_BALL: + if (HasMoveEffect(battlerDef, EFFECT_FLING)) + ADJUST_SCORE(4); + break; + case HOLD_EFFECT_LAGGING_TAIL: + case HOLD_EFFECT_STICKY_BARB: + break; + default: + ADJUST_SCORE(3); + break; + } + } + break; + case MOVE_EFFECT_STEAL_ITEM: + { + bool32 canSteal = FALSE; + + if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE) + canSteal = TRUE; + if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER || GetBattlerSide(battlerAtk) == B_SIDE_PLAYER) + canSteal = TRUE; + + if (canSteal && aiData->items[battlerAtk] == ITEM_NONE + && aiData->items[battlerDef] != ITEM_NONE + && CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) + && CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) + && !HasMoveEffect(battlerAtk, EFFECT_ACROBATICS) + && aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD) + { + switch (aiData->holdEffects[battlerDef]) + { + case HOLD_EFFECT_NONE: + break; + case HOLD_EFFECT_CHOICE_BAND: + case HOLD_EFFECT_CHOICE_SCARF: + case HOLD_EFFECT_CHOICE_SPECS: + ADJUST_SCORE(2); + break; + case HOLD_EFFECT_TOXIC_ORB: + if (ShouldPoisonSelf(battlerAtk, aiData->abilities[battlerAtk])) + ADJUST_SCORE(2); + break; + case HOLD_EFFECT_FLAME_ORB: + if (ShouldBurnSelf(battlerAtk, aiData->abilities[battlerAtk])) + ADJUST_SCORE(2); + break; + case HOLD_EFFECT_BLACK_SLUDGE: + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) + ADJUST_SCORE(2); + break; + case HOLD_EFFECT_IRON_BALL: + if (HasMoveEffect(battlerAtk, EFFECT_FLING)) + ADJUST_SCORE(2); + break; + case HOLD_EFFECT_LAGGING_TAIL: + case HOLD_EFFECT_STICKY_BARB: + break; + default: + ADJUST_SCORE(1); + break; + } + } + break; + } + break; } } } diff --git a/src/battle_dome.c b/src/battle_dome.c index 05b8ebec4a..fd5890b281 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -4392,7 +4392,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) allocatedArray[k] = (gBattleMoves[move].pp <= 5) ? 1 : 0; break; case MOVE_POINTS_EFFECT: - allocatedArray[k] = (gBattleMoves[move].secondaryEffectChance > 0) ? 1 : 0; + allocatedArray[k] = gBattleMoves[move].sheerForceBoost; break; } } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 675c556e0a..4ce8ee1ecc 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3716,20 +3716,14 @@ static void Cmd_seteffectwithchance(void) { if (gBattleScripting.moveEffect &= ~(MOVE_EFFECT_CONTINUE)) { - u32 percentChance = gBattleMoves[gCurrentMove].secondaryEffectChance; // CalcSecondaryEffectChance(gBattlerAttacker, gBattleMoves[gCurrentMove].secondaryEffectChance, gCurrentMove); - if (gBattleScripting.moveEffect & MOVE_EFFECT_CERTAIN - || percentChance >= 100) + if (gBattleScripting.moveEffect & MOVE_EFFECT_CERTAIN) { gBattleScripting.moveEffect &= ~MOVE_EFFECT_CERTAIN; SetMoveEffect(FALSE, MOVE_EFFECT_CERTAIN); } - else if (RandomPercentage(RNG_SECONDARY_EFFECT, percentChance)) - { - SetMoveEffect(FALSE, 0); - } else { - gBattlescriptCurrInstr = cmd->nextInstr; + SetMoveEffect(FALSE, 0); } gBattleScripting.moveEffect = 0; } @@ -5424,10 +5418,7 @@ static void Cmd_moveend(void) case EFFECT_RECOIL: gBattleMoveDamage = max(1, gBattleScripting.savedDmg * max(1, gBattleMoves[gCurrentMove].recoil) / 100); BattleScriptPushCursor(); - if (gBattleMoves[gCurrentMove].argument) // Flare Blitz - can burn, Volt Tackle - can paralyze - gBattlescriptCurrInstr = BattleScript_MoveEffectRecoilWithStatus; - else - gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; + gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; effect = TRUE; break; } @@ -9522,44 +9513,6 @@ static void Cmd_various(void) gBattlescriptCurrInstr = cmd->failInstr; return; } - case VARIOUS_ARGUMENT_STATUS_EFFECT: - { - VARIOUS_ARGS(); - switch (gBattleMoves[gCurrentMove].argument) - { - case STATUS1_SLEEP: - gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; - break; - case STATUS1_BURN: - gBattleScripting.moveEffect = MOVE_EFFECT_BURN; - break; - case STATUS1_FREEZE: - gBattleScripting.moveEffect = MOVE_EFFECT_FREEZE; - break; - case STATUS1_PARALYSIS: - gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; - break; - case STATUS1_POISON: - gBattleScripting.moveEffect = MOVE_EFFECT_POISON; - break; - case STATUS1_TOXIC_POISON: - gBattleScripting.moveEffect = MOVE_EFFECT_TOXIC; - break; - case STATUS1_FROSTBITE: - gBattleScripting.moveEffect = MOVE_EFFECT_FROSTBITE; - break; - default: - gBattleScripting.moveEffect = 0; - break; - } - if (gBattleScripting.moveEffect != 0) - { - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_EffectWithChance; - return; - } - break; - } case VARIOUS_TRY_HIT_SWITCH_TARGET: { VARIOUS_ARGS(const u8 *failInstr); diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 345de2c102..1106bed53d 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -6032,7 +6032,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6113,16 +6112,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FEINT] = { - #if B_UPDATED_MOVE_DATA >= GEN_5 - .power = 30, - #else - .power = 50, - #endif .effect = EFFECT_FEINT, + .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 30 : 50, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 2, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6131,6 +6125,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, + ADDITIONAL_EFFECTS( + PRIMARY_EFFECT(MOVE_EFFECT_FEINT) + ), }, [MOVE_PLUCK] = @@ -6140,11 +6137,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + ADDITIONAL_EFFECTS( + PRIMARY_EFFECT(MOVE_EFFECT_BUG_BITE) + ), }, [MOVE_TAILWIND] = @@ -7506,11 +7505,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + ADDITIONAL_EFFECTS( + PRIMARY_EFFECT(MOVE_EFFECT_BUG_BITE) + ), }, [MOVE_CHARGE_BEAM] = @@ -8468,10 +8469,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + ADDITIONAL_EFFECTS( + PRIMARY_EFFECT(MOVE_EFFECT_INCINERATE) + ), }, [MOVE_QUASH] = @@ -8667,12 +8670,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, .skyBattleBanned = TRUE, + ADDITIONAL_EFFECTS( + SECONDARY_EFFECT(MOVE_EFFECT_SPD_MINUS_1, 100) + ), }, [MOVE_FROST_BREATH] = @@ -10255,13 +10260,16 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .ignoresProtect = TRUE, .ignoresSubstitute = TRUE, .metronomeBanned = TRUE, + ADDITIONAL_EFFECTS( + // Feint move effect handled in script as it goes before animation + PRIMARY_EFFECT_SELF(MOVE_EFFECT_DEF_MINUS_1) + ), }, [MOVE_SHORE_UP] = @@ -10354,7 +10362,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -10633,7 +10640,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11710,11 +11716,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, + .sheerForceBoost = TRUE, .metronomeBanned = TRUE, + ADDITIONAL_EFFECTS( + SECONDARY_EFFECT_SELF(MOVE_EFFECT_SPD_PLUS_1, 100) + ), }, [MOVE_BREAKING_SWIPE] = @@ -13165,11 +13174,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, + // additional effects handled in script due to weird behaviour in doubles }, [MOVE_RUINATION] = diff --git a/test/battle/ability/sheer_force.c b/test/battle/ability/sheer_force.c index f98b292b89..e0c5427925 100644 --- a/test/battle/ability/sheer_force.c +++ b/test/battle/ability/sheer_force.c @@ -8,7 +8,7 @@ SINGLE_BATTLE_TEST("Sheer Force boosts power, but removes secondary effects of m for (j = 1; j < MOVES_COUNT; j++) { - if (gBattleMoves[j].sheerForceBoost && j != MOVE_ORDER_UP) + if (gBattleMoves[j].sheerForceBoost && j != MOVE_ORDER_UP && j != MOVE_AURA_WHEEL) { PARAMETRIZE { ability = ABILITY_ANGER_POINT; move = j; } PARAMETRIZE { ability = ABILITY_SHEER_FORCE; move = j; } diff --git a/test/battle/move_effect/bug_bite.c b/test/battle/move_effect/bug_bite.c index 8f59e6f003..3f22b238df 100644 --- a/test/battle/move_effect/bug_bite.c +++ b/test/battle/move_effect/bug_bite.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_BUG_BITE].effect == EFFECT_BUG_BITE); + ASSUME(MoveHasMoveEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE, FALSE)); ASSUME(gBattleMoves[MOVE_BUG_BITE].pp == 20); }