diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index d57d95ffcd..ae47761d7c 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1555,13 +1555,43 @@ .4byte \failInstr .endm - .macro trysetstatus1, ptr:req - callnative BS_TrySetStatus1 + .macro trysetparalysis, ptr:req + callnative BS_TrySetParalysis .4byte \ptr .endm - .macro trysetstatus2, ptr:req - callnative BS_TrySetStatus2 + .macro trysetpoison, ptr:req + callnative BS_TrySetPoison + .4byte \ptr + .endm + + .macro trysetpoisonparalysis, ptr:req + callnative BS_TrySetPoisonParalyzis + .4byte \ptr + .endm + + .macro tryseteffectspore, ptr:req + callnative BS_TrySetEffectSpore + .4byte \ptr + .endm + + .macro trysetconfusion, ptr:req + callnative BS_TrySetConfusion + .4byte \ptr + .endm + + .macro trysetinfatuation, ptr:req + callnative BS_TrySetInfatuation + .4byte \ptr + .endm + + .macro trysetescapeprevention, ptr:req + callnative BS_TrySetEscapePrevention + .4byte \ptr + .endm + + .macro trysettorment, ptr:req + callnative BS_TrySetTorment .4byte \ptr .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index eb84d295fe..7f796eb0be 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -9699,7 +9699,7 @@ BattleScript_EffectMaxMove:: resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET - setmaxmoveeffect + setadditionaleffects moveendall end @@ -9773,61 +9773,158 @@ BattleScript_EffectTryReducePP:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectStatus1Foes:: +BattleScript_EffectParalyzeSide:: savetarget copybyte sBATTLER, gBattlerTarget -BattleScript_Status1FoesLoop: - jumpifabsent BS_TARGET, BattleScript_Status1FoesIncrement - trysetstatus1 BattleScript_Status1FoesIncrement +BattleScript_ParalyzeSideLoop: + jumpifabsent BS_TARGET, BattleScript_ParalyzeSideIncrement + trysetparalysis BattleScript_ParalyzeSideIncrement statusanimation BS_TARGET updatestatusicon BS_TARGET printfromtable gStatusConditionsStringIds waitmessage B_WAIT_TIME_LONG updatestatusicon BS_EFFECT_BATTLER waitstate -BattleScript_Status1FoesIncrement: - jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_Status1FoesEnd - setallytonexttarget BattleScript_Status1FoesLoop -BattleScript_Status1FoesEnd: +BattleScript_ParalyzeSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_ParalyzeSideEnd + setallytonexttarget BattleScript_ParalyzeSideLoop +BattleScript_ParalyzeSideEnd: restoretarget goto BattleScript_MoveEnd -BattleScript_EffectStatus2Foes:: +BattleScript_EffectPoisonSide:: savetarget copybyte sBATTLER, gBattlerTarget -BattleScript_Status2FoesLoop: - jumpifabsent BS_TARGET, BattleScript_Status2FoesIncrement - trysetstatus2 BattleScript_Status2FoesIncrement - jumpifbyte CMP_EQUAL, gBattleCommunication, 1, BattleScript_DoConfuseAnim - jumpifbyte CMP_EQUAL, gBattleCommunication, 2, BattleScript_DoInfatuationAnim -BattleScript_Status2FoesPrintMessage: +BattleScript_PoisonSideLoop: + jumpifabsent BS_TARGET, BattleScript_PoisonSideIncrement + trysetpoison BattleScript_PoisonSideIncrement + statusanimation BS_TARGET + updatestatusicon BS_TARGET + printfromtable gStatusConditionsStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_EFFECT_BATTLER + waitstate +BattleScript_PoisonSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_PoisonSideEnd + setallytonexttarget BattleScript_PoisonSideLoop +BattleScript_PoisonSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectPoisonParalyzeSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_PoisonParalyzeSideLoop: + jumpifabsent BS_TARGET, BattleScript_PoisonParalyzeSideIncrement + trysetpoisonparalysis BattleScript_PoisonParalyzeSideIncrement + statusanimation BS_TARGET + updatestatusicon BS_TARGET + printfromtable gStatusConditionsStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_EFFECT_BATTLER + waitstate +BattleScript_PoisonParalyzeSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_PoisonParalyzeSideEnd + setallytonexttarget BattleScript_PoisonParalyzeSideLoop +BattleScript_PoisonParalyzeSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectEffectSporeSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_EffectSporeSideLoop: + jumpifabsent BS_TARGET, BattleScript_EffectSporeSideIncrement + tryseteffectspore BattleScript_EffectSporeSideIncrement + statusanimation BS_TARGET + updatestatusicon BS_TARGET + printfromtable gStatusConditionsStringIds + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_EFFECT_BATTLER + waitstate +BattleScript_EffectSporeSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_EffectSporeSideEnd + setallytonexttarget BattleScript_EffectSporeSideLoop +BattleScript_EffectSporeSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectConfuseSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_ConfuseSideLoop: + jumpifabsent BS_TARGET, BattleScript_ConfuseSideIncrement + trysetconfusion BattleScript_ConfuseSideIncrement + status2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION +BattleScript_ConfuseSidePrintMessage: printfromtable gStatus2StringIds waitmessage B_WAIT_TIME_LONG -BattleScript_Status2FoesIncrement: - jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_Status2FoesEnd - setallytonexttarget BattleScript_Status2FoesLoop -BattleScript_Status2FoesEnd: +BattleScript_ConfuseSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_ConfuseSideEnd + setallytonexttarget BattleScript_ConfuseSideLoop +BattleScript_ConfuseSideEnd: restoretarget jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 1, BattleScript_PrintCoinsScattered @ Gold Rush goto BattleScript_MoveEnd -BattleScript_DoConfuseAnim: - status2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION - goto BattleScript_Status2FoesPrintMessage - -BattleScript_DoInfatuationAnim: - status2animation BS_EFFECT_BATTLER, STATUS2_INFATUATION - goto BattleScript_Status2FoesPrintMessage - BattleScript_PrintCoinsScattered: printstring STRINGID_COINSSCATTERED goto BattleScript_MoveEnd +BattleScript_EffectInfatuateSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_InfatuateSideLoop: + jumpifabsent BS_TARGET, BattleScript_InfatuateSideIncrement + trysetinfatuation BattleScript_InfatuateSideIncrement + status2animation BS_EFFECT_BATTLER, STATUS2_INFATUATION +BattleScript_InfatuateSidePrintMessage: + printfromtable gStatus2StringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_InfatuateSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_InfatuateSideEnd + setallytonexttarget BattleScript_InfatuateSideLoop +BattleScript_InfatuateSideEnd: + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectTormentSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_TormentSideLoop: + jumpifabsent BS_TARGET, BattleScript_TormentSideIncrement + trysettorment BattleScript_TormentSideIncrement +BattleScript_TormentSidePrintMessage: + printfromtable gStatus2StringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_TormentSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_TormentSideEnd + setallytonexttarget BattleScript_TormentSideLoop +BattleScript_TormentSideEnd: + restoretarget + goto BattleScript_MoveEnd + BattleScript_TormentEnds:: printstring STRINGID_TORMENTEDNOMORE waitmessage B_WAIT_TIME_LONG end2 +BattleScript_EffectMeanLookSide:: + savetarget + copybyte sBATTLER, gBattlerTarget +BattleScript_MeanLookSideLoop: + jumpifabsent BS_TARGET, BattleScript_MeanLookSideIncrement + trysetescapeprevention BattleScript_MeanLookSideIncrement +BattleScript_MeanLookSidePrintMessage: + printfromtable gStatus2StringIds + waitmessage B_WAIT_TIME_LONG +BattleScript_MeanLookSideIncrement: + jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_MeanLookSideEnd + setallytonexttarget BattleScript_MeanLookSideLoop +BattleScript_MeanLookSideEnd: + restoretarget + goto BattleScript_MoveEnd + BattleScript_EffectRaiseCritAlliesAnim:: savetarget copybyte gBattlerTarget, gBattlerAttacker @@ -9905,12 +10002,6 @@ BattleScript_RecycleBerriesAlliesEnd: restoretarget goto BattleScript_MoveEnd -BattleScript_EffectStonesurge:: - setstealthrock BattleScript_MoveEnd - printfromtable gDmgHazardsStringIds - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd - BattleScript_EffectSteelsurge:: setsteelsurge BattleScript_MoveEnd printfromtable gDmgHazardsStringIds diff --git a/include/battle_dynamax.h b/include/battle_dynamax.h index 9957c37a10..0762601c89 100644 --- a/include/battle_dynamax.h +++ b/include/battle_dynamax.h @@ -3,59 +3,6 @@ #define DYNAMAX_TURNS_COUNT 3 -enum MaxMoveEffect -{ - MAX_EFFECT_NONE, - MAX_EFFECT_RAISE_TEAM_ATTACK, - MAX_EFFECT_RAISE_TEAM_DEFENSE, - MAX_EFFECT_RAISE_TEAM_SPEED, - MAX_EFFECT_RAISE_TEAM_SP_ATK, - MAX_EFFECT_RAISE_TEAM_SP_DEF, - MAX_EFFECT_LOWER_ATTACK, - MAX_EFFECT_LOWER_DEFENSE, - MAX_EFFECT_LOWER_SPEED, - MAX_EFFECT_LOWER_SP_ATK, - MAX_EFFECT_LOWER_SP_DEF, - MAX_EFFECT_SUN, - MAX_EFFECT_RAIN, - MAX_EFFECT_SANDSTORM, - MAX_EFFECT_HAIL, - MAX_EFFECT_MISTY_TERRAIN, - MAX_EFFECT_GRASSY_TERRAIN, - MAX_EFFECT_ELECTRIC_TERRAIN, - MAX_EFFECT_PSYCHIC_TERRAIN, - MAX_EFFECT_VINE_LASH, - MAX_EFFECT_WILDFIRE, - MAX_EFFECT_CANNONADE, - MAX_EFFECT_EFFECT_SPORE_FOES, - MAX_EFFECT_PARALYZE_FOES, - MAX_EFFECT_CONFUSE_FOES_PAY_DAY, - MAX_EFFECT_CRIT_PLUS, - MAX_EFFECT_MEAN_LOOK, - MAX_EFFECT_AURORA_VEIL, - MAX_EFFECT_INFATUATE_FOES, - MAX_EFFECT_RECYCLE_BERRIES, - MAX_EFFECT_POISON_FOES, - MAX_EFFECT_STEALTH_ROCK, - MAX_EFFECT_DEFOG, - MAX_EFFECT_POISON_PARALYZE_FOES, - MAX_EFFECT_HEAL_TEAM, - MAX_EFFECT_SPITE, - MAX_EFFECT_GRAVITY, - MAX_EFFECT_VOLCALITH, - MAX_EFFECT_SANDBLAST_FOES, - MAX_EFFECT_YAWN_FOE, - MAX_EFFECT_LOWER_EVASIVENESS_FOES, - MAX_EFFECT_AROMATHERAPY, - MAX_EFFECT_CONFUSE_FOES, - MAX_EFFECT_STEELSURGE, - MAX_EFFECT_TORMENT_FOES, - MAX_EFFECT_LOWER_SPEED_2_FOES, - MAX_EFFECT_FIRE_SPIN_FOES, - MAX_EFFECT_FIXED_POWER, - MAX_EFFECT_BYPASS_PROTECT, -}; - bool32 CanDynamax(u32 battler); bool32 IsGigantamaxed(u32 battler); void ApplyDynamaxHPMultiplier(struct Pokemon* mon); @@ -67,12 +14,11 @@ bool32 IsMoveBlockedByMaxGuard(u32 move); bool32 IsMoveBlockedByDynamax(u32 move); u16 GetMaxMove(u32 battler, u32 baseMove); -u8 GetMaxMovePower(u32 move); +u32 GetMaxMovePower(u32 move); bool32 IsMaxMove(u32 move); void ChooseDamageNonTypesString(u8 type); void BS_UpdateDynamax(void); -void BS_SetMaxMoveEffect(void); void BS_SetSteelsurge(void); void BS_TrySetStatus1(void); void BS_TrySetStatus2(void); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 5b02c4a225..64e6018bcb 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -543,8 +543,14 @@ extern const u8 BattleScript_EffectAuroraVeilSuccess[]; extern const u8 BattleScript_EffectGravitySuccess[]; extern const u8 BattleScript_EffectYawnSuccess[]; extern const u8 BattleScript_EffectTryReducePP[]; -extern const u8 BattleScript_EffectStatus1Foes[]; -extern const u8 BattleScript_EffectStatus2Foes[]; +extern const u8 BattleScript_EffectParalyzeSide[]; +extern const u8 BattleScript_EffectPoisonSide[]; +extern const u8 BattleScript_EffectPoisonParalyzeSide[]; +extern const u8 BattleScript_EffectEffectSporeSide[]; +extern const u8 BattleScript_EffectConfuseSide[]; +extern const u8 BattleScript_EffectInfatuateSide[]; +extern const u8 BattleScript_EffectTormentSide[]; +extern const u8 BattleScript_EffectMeanLookSide[]; extern const u8 BattleScript_TormentEnds[]; extern const u8 BattleScript_EffectRaiseCritAlliesAnim[]; extern const u8 BattleScript_EffectHealOneSixthAllies[]; diff --git a/include/constants/battle.h b/include/constants/battle.h index 7f09e7f89b..13a91ade64 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -322,102 +322,150 @@ enum BattleWeather #define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL | B_WEATHER_STRONG_WINDS | B_WEATHER_SNOW | B_WEATHER_FOG) #define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS) -// Move Effects -#define MOVE_EFFECT_SLEEP 1 -#define MOVE_EFFECT_POISON 2 -#define MOVE_EFFECT_BURN 3 -#define MOVE_EFFECT_FREEZE 4 -#define MOVE_EFFECT_PARALYSIS 5 -#define MOVE_EFFECT_TOXIC 6 -#define MOVE_EFFECT_FROSTBITE 7 +enum MoveEffects +{ + MOVE_EFFECT_NONE, + MOVE_EFFECT_SLEEP, + MOVE_EFFECT_POISON, + MOVE_EFFECT_BURN, + MOVE_EFFECT_FREEZE, + MOVE_EFFECT_PARALYSIS, + MOVE_EFFECT_TOXIC, + MOVE_EFFECT_FROSTBITE, + MOVE_EFFECT_CONFUSION, + MOVE_EFFECT_FLINCH, + MOVE_EFFECT_TRI_ATTACK, + MOVE_EFFECT_UPROAR, + MOVE_EFFECT_PAYDAY, + MOVE_EFFECT_CHARGING, + MOVE_EFFECT_WRAP, + MOVE_EFFECT_ATK_PLUS_1, + MOVE_EFFECT_DEF_PLUS_1, + MOVE_EFFECT_SPD_PLUS_1, + MOVE_EFFECT_SP_ATK_PLUS_1, + MOVE_EFFECT_SP_DEF_PLUS_1, + MOVE_EFFECT_ACC_PLUS_1, + MOVE_EFFECT_EVS_PLUS_1, + MOVE_EFFECT_ATK_MINUS_1, + MOVE_EFFECT_DEF_MINUS_1, + MOVE_EFFECT_SPD_MINUS_1, + MOVE_EFFECT_SP_ATK_MINUS_1, + MOVE_EFFECT_SP_DEF_MINUS_1, + MOVE_EFFECT_ACC_MINUS_1, + MOVE_EFFECT_EVS_MINUS_1, + MOVE_EFFECT_REMOVE_ARG_TYPE, + MOVE_EFFECT_RECHARGE, + MOVE_EFFECT_RAGE, + MOVE_EFFECT_STEAL_ITEM, + MOVE_EFFECT_PREVENT_ESCAPE, + MOVE_EFFECT_NIGHTMARE, + MOVE_EFFECT_ALL_STATS_UP, + MOVE_EFFECT_REMOVE_STATUS, + MOVE_EFFECT_ATK_DEF_DOWN, + MOVE_EFFECT_ATK_PLUS_2, + MOVE_EFFECT_DEF_PLUS_2, + MOVE_EFFECT_SPD_PLUS_2, + MOVE_EFFECT_SP_ATK_PLUS_2, + MOVE_EFFECT_SP_DEF_PLUS_2, + MOVE_EFFECT_ACC_PLUS_2, + MOVE_EFFECT_EVS_PLUS_2, + MOVE_EFFECT_ATK_MINUS_2, + MOVE_EFFECT_DEF_MINUS_2, + MOVE_EFFECT_SPD_MINUS_2, + MOVE_EFFECT_SP_ATK_MINUS_2, + MOVE_EFFECT_SP_DEF_MINUS_2, + MOVE_EFFECT_ACC_MINUS_2, + MOVE_EFFECT_EVS_MINUS_2, + MOVE_EFFECT_SCALE_SHOT, + MOVE_EFFECT_THRASH, + MOVE_EFFECT_KNOCK_OFF, + MOVE_EFFECT_DEF_SPDEF_DOWN, + MOVE_EFFECT_CLEAR_SMOG, + MOVE_EFFECT_SMACK_DOWN, + MOVE_EFFECT_FLAME_BURST, + MOVE_EFFECT_FEINT, + MOVE_EFFECT_SPECTRAL_THIEF, + MOVE_EFFECT_V_CREATE, + MOVE_EFFECT_HAPPY_HOUR, + MOVE_EFFECT_CORE_ENFORCER, + MOVE_EFFECT_THROAT_CHOP, + MOVE_EFFECT_INCINERATE, + MOVE_EFFECT_BUG_BITE, + MOVE_EFFECT_RECOIL_HP_25, + MOVE_EFFECT_TRAP_BOTH, + MOVE_EFFECT_ROUND, + MOVE_EFFECT_STOCKPILE_WORE_OFF, + MOVE_EFFECT_DIRE_CLAW, + MOVE_EFFECT_STEALTH_ROCK, + MOVE_EFFECT_SPIKES, + MOVE_EFFECT_SYRUP_BOMB, + MOVE_EFFECT_FLORAL_HEALING, + MOVE_EFFECT_SECRET_POWER, + MOVE_EFFECT_PSYCHIC_NOISE, + MOVE_EFFECT_TERA_BLAST, + MOVE_EFFECT_ORDER_UP, + MOVE_EFFECT_ION_DELUGE, + MOVE_EFFECT_HAZE, + MOVE_EFFECT_LEECH_SEED, + MOVE_EFFECT_REFLECT, + MOVE_EFFECT_LIGHT_SCREEN, + MOVE_EFFECT_SALT_CURE, + MOVE_EFFECT_EERIE_SPELL, + MOVE_EFFECT_RAISE_TEAM_ATTACK, + MOVE_EFFECT_RAISE_TEAM_DEFENSE, + MOVE_EFFECT_RAISE_TEAM_SPEED, + MOVE_EFFECT_RAISE_TEAM_SP_ATK, + MOVE_EFFECT_RAISE_TEAM_SP_DEF, + MOVE_EFFECT_LOWER_ATTACK_SIDE, + MOVE_EFFECT_LOWER_DEFENSE_SIDE, + MOVE_EFFECT_LOWER_SPEED_SIDE, + MOVE_EFFECT_LOWER_SP_ATK_SIDE, + MOVE_EFFECT_LOWER_SP_DEF_SIDE, + MOVE_EFFECT_SUN, + MOVE_EFFECT_RAIN, + MOVE_EFFECT_SANDSTORM, + MOVE_EFFECT_HAIL, + MOVE_EFFECT_MISTY_TERRAIN, + MOVE_EFFECT_GRASSY_TERRAIN, + MOVE_EFFECT_ELECTRIC_TERRAIN, + MOVE_EFFECT_PSYCHIC_TERRAIN, + MOVE_EFFECT_VINE_LASH, + MOVE_EFFECT_WILDFIRE, + MOVE_EFFECT_CANNONADE, + MOVE_EFFECT_EFFECT_SPORE_SIDE, + MOVE_EFFECT_PARALYZE_SIDE, + MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE, + MOVE_EFFECT_CRIT_PLUS_SIDE, + MOVE_EFFECT_PREVENT_ESCAPE_SIDE, + MOVE_EFFECT_AURORA_VEIL, + MOVE_EFFECT_INFATUATE_SIDE, + MOVE_EFFECT_RECYCLE_BERRIES, + MOVE_EFFECT_POISON_SIDE, + MOVE_EFFECT_DEFOG, + MOVE_EFFECT_POISON_PARALYZE_SIDE, + MOVE_EFFECT_HEAL_TEAM, + MOVE_EFFECT_SPITE, + MOVE_EFFECT_GRAVITY, + MOVE_EFFECT_VOLCALITH, + MOVE_EFFECT_SANDBLAST_SIDE, + MOVE_EFFECT_YAWN_FOE, + MOVE_EFFECT_LOWER_EVASIVENESS_SIDE, + MOVE_EFFECT_AROMATHERAPY, + MOVE_EFFECT_CONFUSE_SIDE, + MOVE_EFFECT_STEELSURGE, + MOVE_EFFECT_TORMENT_SIDE, + MOVE_EFFECT_LOWER_SPEED_2_SIDE, + MOVE_EFFECT_FIRE_SPIN_SIDE, + MOVE_EFFECT_FIXED_POWER, + NUM_MOVE_EFFECTS +}; + #define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_FROSTBITE // All above move effects apply primary status #if B_USE_FROSTBITE == TRUE #define MOVE_EFFECT_FREEZE_OR_FROSTBITE MOVE_EFFECT_FROSTBITE #else #define MOVE_EFFECT_FREEZE_OR_FROSTBITE MOVE_EFFECT_FREEZE #endif -#define MOVE_EFFECT_CONFUSION 8 -#define MOVE_EFFECT_FLINCH 9 -#define MOVE_EFFECT_TRI_ATTACK 10 -#define MOVE_EFFECT_UPROAR 11 -#define MOVE_EFFECT_PAYDAY 12 -#define MOVE_EFFECT_CHARGING 13 -#define MOVE_EFFECT_WRAP 14 -#define MOVE_EFFECT_ATK_PLUS_1 15 -#define MOVE_EFFECT_DEF_PLUS_1 16 -#define MOVE_EFFECT_SPD_PLUS_1 17 -#define MOVE_EFFECT_SP_ATK_PLUS_1 18 -#define MOVE_EFFECT_SP_DEF_PLUS_1 19 -#define MOVE_EFFECT_ACC_PLUS_1 20 -#define MOVE_EFFECT_EVS_PLUS_1 21 -#define MOVE_EFFECT_ATK_MINUS_1 22 -#define MOVE_EFFECT_DEF_MINUS_1 23 -#define MOVE_EFFECT_SPD_MINUS_1 24 -#define MOVE_EFFECT_SP_ATK_MINUS_1 25 -#define MOVE_EFFECT_SP_DEF_MINUS_1 26 -#define MOVE_EFFECT_ACC_MINUS_1 27 -#define MOVE_EFFECT_EVS_MINUS_1 28 -#define MOVE_EFFECT_REMOVE_ARG_TYPE 29 -#define MOVE_EFFECT_RECHARGE 30 -#define MOVE_EFFECT_RAGE 31 -#define MOVE_EFFECT_STEAL_ITEM 32 -#define MOVE_EFFECT_PREVENT_ESCAPE 33 -#define MOVE_EFFECT_NIGHTMARE 34 -#define MOVE_EFFECT_ALL_STATS_UP 35 -#define MOVE_EFFECT_REMOVE_STATUS 36 -#define MOVE_EFFECT_ATK_DEF_DOWN 37 -#define MOVE_EFFECT_ATK_PLUS_2 38 -#define MOVE_EFFECT_DEF_PLUS_2 39 -#define MOVE_EFFECT_SPD_PLUS_2 40 -#define MOVE_EFFECT_SP_ATK_PLUS_2 41 -#define MOVE_EFFECT_SP_DEF_PLUS_2 42 -#define MOVE_EFFECT_ACC_PLUS_2 43 -#define MOVE_EFFECT_EVS_PLUS_2 44 -#define MOVE_EFFECT_ATK_MINUS_2 45 -#define MOVE_EFFECT_DEF_MINUS_2 46 -#define MOVE_EFFECT_SPD_MINUS_2 47 -#define MOVE_EFFECT_SP_ATK_MINUS_2 48 -#define MOVE_EFFECT_SP_DEF_MINUS_2 49 -#define MOVE_EFFECT_ACC_MINUS_2 50 -#define MOVE_EFFECT_EVS_MINUS_2 51 -#define MOVE_EFFECT_SCALE_SHOT 52 -#define MOVE_EFFECT_THRASH 53 -#define MOVE_EFFECT_KNOCK_OFF 54 -#define MOVE_EFFECT_DEF_SPDEF_DOWN 55 -#define MOVE_EFFECT_CLEAR_SMOG 56 -#define MOVE_EFFECT_SMACK_DOWN 57 -#define MOVE_EFFECT_FLAME_BURST 58 -#define MOVE_EFFECT_FEINT 59 -#define MOVE_EFFECT_SPECTRAL_THIEF 60 -#define MOVE_EFFECT_V_CREATE 61 -#define MOVE_EFFECT_HAPPY_HOUR 62 -#define MOVE_EFFECT_CORE_ENFORCER 63 -#define MOVE_EFFECT_THROAT_CHOP 64 -#define MOVE_EFFECT_INCINERATE 65 -#define MOVE_EFFECT_BUG_BITE 66 -#define MOVE_EFFECT_RECOIL_HP_25 67 -#define MOVE_EFFECT_TRAP_BOTH 68 -#define MOVE_EFFECT_ROUND 69 -#define MOVE_EFFECT_STOCKPILE_WORE_OFF 70 -#define MOVE_EFFECT_DIRE_CLAW 71 -#define MOVE_EFFECT_STEALTH_ROCK 72 -#define MOVE_EFFECT_SPIKES 73 -#define MOVE_EFFECT_SYRUP_BOMB 74 -#define MOVE_EFFECT_FLORAL_HEALING 75 -#define MOVE_EFFECT_SECRET_POWER 76 -#define MOVE_EFFECT_PSYCHIC_NOISE 77 -#define MOVE_EFFECT_TERA_BLAST 78 -#define MOVE_EFFECT_ORDER_UP 79 -#define MOVE_EFFECT_ION_DELUGE 80 -#define MOVE_EFFECT_AROMATHERAPY 81 // No functionality yet -#define MOVE_EFFECT_HAZE 82 -#define MOVE_EFFECT_LEECH_SEED 83 -#define MOVE_EFFECT_REFLECT 84 -#define MOVE_EFFECT_LIGHT_SCREEN 85 -#define MOVE_EFFECT_SALT_CURE 86 -#define MOVE_EFFECT_EERIE_SPELL 87 - -#define NUM_MOVE_EFFECTS 88 #define MOVE_EFFECT_AFFECTS_USER 0x2000 #define MOVE_EFFECT_CERTAIN 0x4000 diff --git a/include/move.h b/include/move.h index 67206d9ba2..855dba10c3 100644 --- a/include/move.h +++ b/include/move.h @@ -122,7 +122,6 @@ struct MoveInfo u16 type; u16 fixedDamage; u16 absorbPercentage; - u16 maxEffect; } argument; // primary/secondary effects @@ -489,11 +488,6 @@ static inline u32 GetMoveAbsorbPercentage(u32 moveId) return gMovesInfo[moveId].argument.absorbPercentage; } -static inline u32 GetMoveMaxEffect(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.maxEffect; -} - static inline const struct AdditionalEffect *GetMoveAdditionalEffectById(u32 moveId, u32 effect) { return &gMovesInfo[SanitizeMoveId(moveId)].additionalEffects[effect]; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 745c8294e4..a516093a04 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2393,8 +2393,8 @@ static inline bool32 IsMoveSleepClauseTrigger(u32 move) switch (additionalEffect->moveEffect) { // Skip MOVE_EFFECT_SLEEP as moves with a secondary chance of applying sleep are allowed by Smogon's rules (ie. Relic Song) - case MAX_EFFECT_EFFECT_SPORE_FOES: - case MAX_EFFECT_YAWN_FOE: + case MOVE_EFFECT_EFFECT_SPORE_SIDE: + case MOVE_EFFECT_YAWN_FOE: return TRUE; } } diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 426c196141..f344b711d6 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -9267,21 +9267,15 @@ void AnimTask_DynamaxGrowth(u8 taskId) // from CFRU void AnimTask_GetWeatherToSet(u8 taskId) { - switch (GetMoveMaxEffect(gCurrentMove)) - { - case MAX_EFFECT_SUN: - gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SUN; - break; - case MAX_EFFECT_RAIN: - gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_RAIN; - break; - case MAX_EFFECT_SANDSTORM: - gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SANDSTORM; - break; - case MAX_EFFECT_HAIL: - gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_HAIL; - break; - } + if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SUN)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SUN; + else if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_RAIN)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_RAIN; + else if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SANDSTORM)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_SANDSTORM; + else if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_HAIL)) + gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_HAIL; + DestroyAnimVisualTask(taskId); } diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 3a931af470..3e8d0e9db7 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -23,7 +23,7 @@ #include "constants/items.h" #include "constants/moves.h" -static u8 GetMaxPowerTier(u32 move); +static u32 GetMaxPowerTier(u32 move); struct GMaxMove { @@ -315,11 +315,11 @@ enum }; // Gets the base power of a Max Move. -u8 GetMaxMovePower(u32 move) +u32 GetMaxMovePower(u32 move) { - u8 tier; + u32 tier; // G-Max Drum Solo, G-Max Hydrosnipe, and G-Max Fireball always have 160 base power. - if (GetMoveMaxEffect(GetMaxMove(gBattlerAttacker, move)) == MAX_EFFECT_FIXED_POWER) + if (MoveHasAdditionalEffect(move, MOVE_EFFECT_FIXED_POWER)) return 160; // Exceptions to all other rules below: @@ -367,7 +367,7 @@ u8 GetMaxMovePower(u32 move) } } -static u8 GetMaxPowerTier(u32 move) +static u32 GetMaxPowerTier(u32 move) { u32 strikeCount = GetMoveStrikeCount(move); if (strikeCount >= 2 && strikeCount <= 5) @@ -468,42 +468,6 @@ void ChooseDamageNonTypesString(u8 type) } } -// Returns the status effect that should be applied by a G-Max Move. -static u32 GetMaxMoveStatusEffect(u32 move) -{ - u8 maxEffect = GetMoveMaxEffect(move); - switch (maxEffect) - { - // Status 1 - case MAX_EFFECT_PARALYZE_FOES: - return STATUS1_PARALYSIS; - case MAX_EFFECT_POISON_FOES: - return STATUS1_POISON; - case MAX_EFFECT_POISON_PARALYZE_FOES: - { - static const u8 sStunShockEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON}; - return RandomElement(RNG_G_MAX_STUN_SHOCK, sStunShockEffects); - } - case MAX_EFFECT_EFFECT_SPORE_FOES: - { - static const u8 sBefuddleEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON, STATUS1_SLEEP}; - return RandomElement(RNG_G_MAX_BEFUDDLE, sBefuddleEffects); - } - // Status 2 - case MAX_EFFECT_CONFUSE_FOES: - case MAX_EFFECT_CONFUSE_FOES_PAY_DAY: - return STATUS2_CONFUSION; - case MAX_EFFECT_INFATUATE_FOES: - return STATUS2_INFATUATION; - case MAX_EFFECT_MEAN_LOOK: - return STATUS2_ESCAPE_PREVENTION; - case MAX_EFFECT_TORMENT_FOES: - return STATUS2_TORMENT; - default: - return STATUS1_NONE; - } -} - // Updates Dynamax HP multipliers and healthboxes. void BS_UpdateDynamax(void) { @@ -518,502 +482,6 @@ void BS_UpdateDynamax(void) gBattlescriptCurrInstr = cmd->nextInstr; } -// Activates the secondary effect of a Max Move. -void BS_SetMaxMoveEffect(void) -{ - NATIVE_ARGS(); - u16 effect = 0; - u8 maxEffect = GetMoveMaxEffect(gCurrentMove); - - // Don't continue if the move didn't land. - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - { - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - - switch (maxEffect) - { - case MAX_EFFECT_RAISE_TEAM_ATTACK: - case MAX_EFFECT_RAISE_TEAM_DEFENSE: - case MAX_EFFECT_RAISE_TEAM_SPEED: - case MAX_EFFECT_RAISE_TEAM_SP_ATK: - case MAX_EFFECT_RAISE_TEAM_SP_DEF: - if (!NoAliveMonsForEitherParty()) - { - // Max Effects are ordered by stat ID. - SET_STATCHANGER(maxEffect, 1, FALSE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; - effect++; - } - break; - case MAX_EFFECT_LOWER_ATTACK: - case MAX_EFFECT_LOWER_DEFENSE: - case MAX_EFFECT_LOWER_SPEED: - case MAX_EFFECT_LOWER_SP_ATK: - case MAX_EFFECT_LOWER_SP_DEF: - case MAX_EFFECT_LOWER_SPEED_2_FOES: - case MAX_EFFECT_LOWER_EVASIVENESS_FOES: - if (!NoAliveMonsForEitherParty()) - { - u8 statId = 0; - u8 stage = 1; - switch (maxEffect) - { - case MAX_EFFECT_LOWER_SPEED_2_FOES: - statId = STAT_SPEED; - stage = 2; - break; - case MAX_EFFECT_LOWER_EVASIVENESS_FOES: - statId = STAT_EVASION; - break; - default: - // Max Effects are ordered by stat ID. - statId = maxEffect - MAX_EFFECT_LOWER_ATTACK + 1; - break; - } - SET_STATCHANGER(statId, stage, TRUE); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectLowerStatFoes; - effect++; - } - break; - case MAX_EFFECT_SUN: - case MAX_EFFECT_RAIN: - case MAX_EFFECT_SANDSTORM: - case MAX_EFFECT_HAIL: - { - u8 weather = 0, msg = 0; - switch (maxEffect) - { - case MAX_EFFECT_SUN: - weather = BATTLE_WEATHER_SUN; - msg = B_MSG_STARTED_SUNLIGHT; - break; - case MAX_EFFECT_RAIN: - weather = BATTLE_WEATHER_RAIN; - msg = B_MSG_STARTED_RAIN; - break; - case MAX_EFFECT_SANDSTORM: - weather = BATTLE_WEATHER_SANDSTORM; - msg = B_MSG_STARTED_SANDSTORM; - break; - case MAX_EFFECT_HAIL: - weather = BATTLE_WEATHER_HAIL; - msg = B_MSG_STARTED_HAIL; - break; - } - if (TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = msg; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSetWeather; - effect++; - } - break; - } - case MAX_EFFECT_MISTY_TERRAIN: - case MAX_EFFECT_GRASSY_TERRAIN: - case MAX_EFFECT_ELECTRIC_TERRAIN: - case MAX_EFFECT_PSYCHIC_TERRAIN: - { - u32 statusFlag = 0; - switch (GetMoveEffectArg_MoveProperty(gCurrentMove)) - { - case MAX_EFFECT_MISTY_TERRAIN: - statusFlag = STATUS_FIELD_MISTY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; - break; - case MAX_EFFECT_GRASSY_TERRAIN: - statusFlag = STATUS_FIELD_GRASSY_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; - break; - case MAX_EFFECT_ELECTRIC_TERRAIN: - statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; - break; - case MAX_EFFECT_PSYCHIC_TERRAIN: - statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; - break; - } - if (!(gFieldStatuses & statusFlag) && statusFlag != 0) - { - gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; - gFieldStatuses |= statusFlag; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) - gFieldTimers.terrainTimer = gBattleTurnCounter + 8; - else - gFieldTimers.terrainTimer = gBattleTurnCounter + 5; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; - effect++; - } - break; - } - case MAX_EFFECT_VINE_LASH: - case MAX_EFFECT_CANNONADE: - case MAX_EFFECT_WILDFIRE: - case MAX_EFFECT_VOLCALITH: - { - u8 side = GetBattlerSide(gBattlerTarget); - if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES)) - { - u32 moveType = GetMoveType(gCurrentMove); - gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; - gSideTimers[side].damageNonTypesTimer = gBattleTurnCounter + 5; // damage is dealt for 4 turns, ends on 5th - gSideTimers[side].damageNonTypesType = moveType; - BattleScriptPush(gBattlescriptCurrInstr + 1); - ChooseDamageNonTypesString(moveType); - gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts; - effect++; - } - break; - } - case MAX_EFFECT_STEALTH_ROCK: - if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEALTH_ROCK)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectStonesurge; - effect++; - } - break; - case MAX_EFFECT_STEELSURGE: - if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectSteelsurge; - effect++; - } - break; - case MAX_EFFECT_DEFOG: - if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY - || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_HAZARDS_ANY - || gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY - || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefogTryHazards; - effect++; - } - break; - case MAX_EFFECT_AURORA_VEIL: - if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) - { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; - else - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; - gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilBattlerId = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectAuroraVeilSuccess; - effect++; - } - break; - case MAX_EFFECT_GRAVITY: - if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) - { - gFieldStatuses |= STATUS_FIELD_GRAVITY; - gFieldTimers.gravityTimer = gBattleTurnCounter + 5; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; - effect++; - } - break; - case MAX_EFFECT_SANDBLAST_FOES: - case MAX_EFFECT_FIRE_SPIN_FOES: - { - // Affects both opponents, but doesn't print strings so we can handle it here. - u8 battler; - for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) - { - if (GetBattlerSide(battler) != GetBattlerSide(gBattlerTarget)) - continue; - if (!(gBattleMons[battler].status2 & STATUS2_WRAPPED)) - { - gBattleMons[battler].status2 |= STATUS2_WRAPPED; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) - #if B_BINDING_TURNS >= GEN_5 - gDisableStructs[battler].wrapTurns = 7; - else - gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; - #else - gDisableStructs[battler].wrapTurns = 5; - else - gDisableStructs[battler].wrapTurns = (Random() % 4) + 2; - #endif - // The Wrap effect does not expire when the user switches, so here's some cheese. - gBattleStruct->wrappedBy[battler] = gBattlerTarget; - if (maxEffect == MAX_EFFECT_SANDBLAST_FOES) - gBattleStruct->wrappedMove[battler] = MOVE_SAND_TOMB; - else - gBattleStruct->wrappedMove[battler] = MOVE_FIRE_SPIN; - } - } - break; - } - case MAX_EFFECT_YAWN_FOE: - { - static const u8 sSnoozeEffects[] = {TRUE, FALSE}; - if (!(gStatuses3[gBattlerTarget] & STATUS3_YAWN) - && CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE) - && RandomElement(RNG_G_MAX_SNOOZE, sSnoozeEffects)) // 50% chance of success - { - gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectYawnSuccess; - effect++; - } - break; - } - case MAX_EFFECT_SPITE: - if (gLastMoves[gBattlerTarget] != MOVE_NONE - && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectTryReducePP; - effect++; - } - break; - case MAX_EFFECT_PARALYZE_FOES: - case MAX_EFFECT_POISON_FOES: - case MAX_EFFECT_POISON_PARALYZE_FOES: - case MAX_EFFECT_EFFECT_SPORE_FOES: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectStatus1Foes; - effect++; - break; - case MAX_EFFECT_CONFUSE_FOES_PAY_DAY: - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - u16 payday = gPaydayMoney; - gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 100); - if (payday > gPaydayMoney) - gPaydayMoney = 0xFFFF; - gBattleCommunication[CURSOR_POSITION] = 1; // add "Coins scattered." message - } - // fall through - case MAX_EFFECT_CONFUSE_FOES: - case MAX_EFFECT_INFATUATE_FOES: - case MAX_EFFECT_TORMENT_FOES: - case MAX_EFFECT_MEAN_LOOK: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectStatus2Foes; - effect++; - break; - case MAX_EFFECT_CRIT_PLUS: - gBattleStruct->bonusCritStages[gBattlerAttacker]++; - gBattleStruct->bonusCritStages[BATTLE_PARTNER(gBattlerAttacker)]++; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; - effect++; - break; - case MAX_EFFECT_HEAL_TEAM: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; - effect++; - break; - case MAX_EFFECT_AROMATHERAPY: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectCureStatusAllies; - effect++; - break; - case MAX_EFFECT_RECYCLE_BERRIES: - { - static const u8 sReplenishEffects[] = {TRUE, FALSE}; - if (RandomElement(RNG_G_MAX_REPLENISH, sReplenishEffects)) // 50% chance of success - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; - effect++; - } - break; - } - } - - if (!effect) - gBattlescriptCurrInstr = cmd->nextInstr; -} - -// Sets up sharp steel on the target's side. -void BS_SetSteelsurge(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u8 targetSide = GetBattlerSide(gBattlerTarget); - if (gSideStatuses[targetSide] & SIDE_STATUS_STEELSURGE) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gSideStatuses[targetSide] |= SIDE_STATUS_STEELSURGE; - gSideTimers[targetSide].steelsurgeAmount = 1; - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - -// Applies the status1 effect associated with a given G-Max Move. -// Could be expanded to function for any move. -void BS_TrySetStatus1(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u8 effect = 0; - u32 status1 = GetMaxMoveStatusEffect(gCurrentMove); - switch (status1) - { - case STATUS1_POISON: - if (CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget))) - { - gBattleMons[gBattlerTarget].status1 |= STATUS1_POISON; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - effect++; - } - break; - case STATUS1_PARALYSIS: - if (CanBeParalyzed(gBattlerTarget, GetBattlerAbility(gBattlerTarget))) - { - gBattleMons[gBattlerTarget].status1 |= STATUS1_PARALYSIS; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - effect++; - } - break; - case STATUS1_SLEEP: - if (CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE)) - { - if (B_SLEEP_TURNS >= GEN_5) - gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 3) + 2); - else - gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 4) + 3); - - TryActivateSleepClause(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]); - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - effect++; - } - break; - } - if (effect) - { - gEffectBattler = gBattlerTarget; - BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - -// Applies the status2 effect associated with a given G-Max Move. -void BS_TrySetStatus2(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u8 effect = 0; - u32 status2 = GetMaxMoveStatusEffect(gCurrentMove); - switch (status2) - { - case STATUS2_CONFUSION: - if (CanBeConfused(gBattlerTarget)) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattleCommunication[MULTIUSE_STATE] = 1; - effect++; - } - break; - case STATUS2_INFATUATION: - { - u8 atkGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerAttacker].species, gBattleMons[gBattlerAttacker].personality); - u8 defGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerTarget].species, gBattleMons[gBattlerTarget].personality); - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION) - && gBattleMons[gBattlerTarget].ability != ABILITY_OBLIVIOUS - && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL) - && atkGender != defGender - && atkGender != MON_GENDERLESS - && defGender != MON_GENDERLESS) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - gBattleCommunication[MULTIUSE_STATE] = 2; - effect++; - } - break; - } - case STATUS2_ESCAPE_PREVENTION: - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - effect++; - } - break; - case STATUS2_TORMENT: - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT) - && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL)) - { - gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; - gDisableStructs[gBattlerTarget].tormentTimer = 3; // 3 turns excluding current turn - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - effect++; - } - break; - } - if (effect) - { - gEffectBattler = gBattlerTarget; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - -// Heals one-sixth of the target's HP, including for Dynamaxed targets. -void BS_HealOneSixth(void) -{ - NATIVE_ARGS(const u8* failInstr); - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP / 6; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - gBattleStruct->moveDamage[gBattlerTarget] *= -1; - - if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) - gBattlescriptCurrInstr = cmd->failInstr; // fail - else - gBattlescriptCurrInstr = cmd->nextInstr; // can heal -} - -// Recycles the target's item if it is specifically holding a berry. -void BS_TryRecycleBerry(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u16* usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; - if (gBattleMons[gBattlerTarget].item == ITEM_NONE - && gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item - && ItemId_GetPocket(*usedHeldItem) == POCKET_BERRIES) - { - gLastUsedItem = *usedHeldItem; - *usedHeldItem = ITEM_NONE; - gBattleMons[gBattlerTarget].item = gLastUsedItem; - - BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); - MarkBattlerForControllerExec(gBattlerTarget); - - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - // Goes to the jump instruction if the target is Dynamaxed. void BS_JumpIfDynamaxed(void) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 56baac23b5..b0fe3281bf 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4244,9 +4244,6 @@ void SetMoveEffect(bool32 primary, bool32 certain) gBattlescriptCurrInstr = BattleScript_MoveEffectIonDeluge; } break; - // TODO: The moves aromatherapy and heal bell need a refactor first - // case MOVE_EFFECT_AROMATHERAPY: - // break; case MOVE_EFFECT_HAZE: for (i = 0; i < gBattlersCount; i++) TryResetBattlerStatChanges(i); @@ -4321,6 +4318,322 @@ void SetMoveEffect(bool32 primary, bool32 certain) } } break; + case MOVE_EFFECT_RAISE_TEAM_ATTACK: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_ATK, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_DEFENSE: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_DEF, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SPEED: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPEED, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SP_ATK: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_RAISE_TEAM_SP_DEF: + if (!NoAliveMonsForEitherParty()) + { + // Max Effects are ordered by stat ID. + SET_STATCHANGER(STAT_SPDEF, 1, FALSE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseStatAllies; + } + break; + case MOVE_EFFECT_LOWER_ATTACK_SIDE: + case MOVE_EFFECT_LOWER_DEFENSE_SIDE: + case MOVE_EFFECT_LOWER_SPEED_SIDE: + case MOVE_EFFECT_LOWER_SP_ATK_SIDE: + case MOVE_EFFECT_LOWER_SP_DEF_SIDE: + case MOVE_EFFECT_LOWER_SPEED_2_SIDE: + case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: + if (!NoAliveMonsForEitherParty()) + { + u32 statId = 0; + u32 stage = 1; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_LOWER_SPEED_2_SIDE: + statId = STAT_SPEED; + stage = 2; + break; + case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: + statId = STAT_EVASION; + break; + default: + // Max Effects are ordered by stat ID. + statId = gBattleScripting.moveEffect - MOVE_EFFECT_LOWER_ATTACK_SIDE + 1; + break; + } + SET_STATCHANGER(statId, stage, TRUE); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectLowerStatFoes; + } + break; + case MOVE_EFFECT_SUN: + case MOVE_EFFECT_RAIN: + case MOVE_EFFECT_SANDSTORM: + case MOVE_EFFECT_HAIL: + { + u8 weather = 0, msg = 0; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_SUN: + weather = BATTLE_WEATHER_SUN; + msg = B_MSG_STARTED_SUNLIGHT; + break; + case MOVE_EFFECT_RAIN: + weather = BATTLE_WEATHER_RAIN; + msg = B_MSG_STARTED_RAIN; + break; + case MOVE_EFFECT_SANDSTORM: + weather = BATTLE_WEATHER_SANDSTORM; + msg = B_MSG_STARTED_SANDSTORM; + break; + case MOVE_EFFECT_HAIL: + weather = BATTLE_WEATHER_HAIL; + msg = B_MSG_STARTED_HAIL; + break; + } + if (TryChangeBattleWeather(gBattlerAttacker, weather, FALSE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = msg; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSetWeather; + } + break; + } + case MOVE_EFFECT_MISTY_TERRAIN: + case MOVE_EFFECT_GRASSY_TERRAIN: + case MOVE_EFFECT_ELECTRIC_TERRAIN: + case MOVE_EFFECT_PSYCHIC_TERRAIN: + { + u32 statusFlag = 0; + switch (gBattleScripting.moveEffect) + { + case MOVE_EFFECT_MISTY_TERRAIN: + statusFlag = STATUS_FIELD_MISTY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; + break; + case MOVE_EFFECT_GRASSY_TERRAIN: + statusFlag = STATUS_FIELD_GRASSY_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY; + break; + case MOVE_EFFECT_ELECTRIC_TERRAIN: + statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; + break; + case MOVE_EFFECT_PSYCHIC_TERRAIN: + statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; + break; + } + if (!(gFieldStatuses & statusFlag) && statusFlag != 0) + { + gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; + gFieldStatuses |= statusFlag; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + gFieldTimers.terrainTimer = gBattleTurnCounter + 8; + else + gFieldTimers.terrainTimer = gBattleTurnCounter + 5; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; + } + break; + } + case MOVE_EFFECT_VINE_LASH: + case MOVE_EFFECT_CANNONADE: + case MOVE_EFFECT_WILDFIRE: + case MOVE_EFFECT_VOLCALITH: + { + u8 side = GetBattlerSide(gBattlerTarget); + if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES)) + { + u32 moveType = GetMoveType(gCurrentMove); + gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES; + gSideTimers[side].damageNonTypesTimer = gBattleTurnCounter + 5; // damage is dealt for 4 turns, ends on 5th + gSideTimers[side].damageNonTypesType = moveType; + BattleScriptPush(gBattlescriptCurrInstr + 1); + ChooseDamageNonTypesString(moveType); + gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts; + } + break; + } + case MOVE_EFFECT_STEELSURGE: + if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SHARPSTEELFLOATS; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectSteelsurge; + } + break; + case MOVE_EFFECT_DEFOG: + if (gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_SCREEN_ANY + || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_HAZARDS_ANY + || gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY + || gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefogTryHazards; + } + break; + case MOVE_EFFECT_AURORA_VEIL: + if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) + { + gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; + else + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; + gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilBattlerId = gBattlerAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectAuroraVeilSuccess; + } + break; + case MOVE_EFFECT_GRAVITY: + if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) + { + gFieldStatuses |= STATUS_FIELD_GRAVITY; + gFieldTimers.gravityTimer = gBattleTurnCounter + 5; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess; + } + break; + case MOVE_EFFECT_SANDBLAST_SIDE: + case MOVE_EFFECT_FIRE_SPIN_SIDE: + { + // Affects both opponents, but doesn't print strings so we can handle it here. + u8 battler; + for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) + { + if (GetBattlerSide(battler) != GetBattlerSide(gBattlerTarget)) + continue; + if (!(gBattleMons[battler].status2 & STATUS2_WRAPPED)) + { + gBattleMons[battler].status2 |= STATUS2_WRAPPED; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + gDisableStructs[battler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; + else + gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; + // The Wrap effect does not expire when the user switches, so here's some cheese. + gBattleStruct->wrappedBy[battler] = gBattlerTarget; + if (gBattleScripting.moveEffect == MOVE_EFFECT_SANDBLAST_SIDE) + gBattleStruct->wrappedMove[battler] = MOVE_SAND_TOMB; + else + gBattleStruct->wrappedMove[battler] = MOVE_FIRE_SPIN; + } + } + break; + } + case MOVE_EFFECT_YAWN_FOE: + { + if (!(gStatuses3[gBattlerTarget] & STATUS3_YAWN) + && CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE) + && RandomPercentage(RNG_G_MAX_SNOOZE, 50)) + { + gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectYawnSuccess; + } + break; + } + case MOVE_EFFECT_SPITE: + if (gLastMoves[gBattlerTarget] != MOVE_NONE + && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectTryReducePP; + } + break; + case MOVE_EFFECT_PARALYZE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectParalyzeSide; + break; + case MOVE_EFFECT_POISON_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectPoisonSide; + break; + case MOVE_EFFECT_POISON_PARALYZE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectPoisonParalyzeSide; + break; + case MOVE_EFFECT_EFFECT_SPORE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectEffectSporeSide; + break; + case MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE: + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + u32 payday = gPaydayMoney; + gPaydayMoney += (gBattleMons[gBattlerAttacker].level * 100); + if (payday > gPaydayMoney) + gPaydayMoney = 0xFFFF; + gBattleCommunication[CURSOR_POSITION] = 1; // add "Coins scattered." message + } + // fall through + case MOVE_EFFECT_CONFUSE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectConfuseSide; + break; + case MOVE_EFFECT_INFATUATE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectInfatuateSide; + break; + case MOVE_EFFECT_TORMENT_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectTormentSide; + break; + case MOVE_EFFECT_PREVENT_ESCAPE_SIDE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectMeanLookSide; + break; + case MOVE_EFFECT_CRIT_PLUS_SIDE: + gBattleStruct->bonusCritStages[gBattlerAttacker]++; + gBattleStruct->bonusCritStages[BATTLE_PARTNER(gBattlerAttacker)]++; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; + break; + case MOVE_EFFECT_HEAL_TEAM: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; + break; + case MOVE_EFFECT_AROMATHERAPY: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectCureStatusAllies; + break; + case MOVE_EFFECT_RECYCLE_BERRIES: + { + if (RandomPercentage(RNG_G_MAX_REPLENISH, 50)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; + } + break; + } } } } @@ -13580,7 +13893,7 @@ static void Cmd_tryspiteppreduce(void) { s32 ppToDeduct = B_PP_REDUCED_BY_SPITE >= GEN_4 ? 4 : (Random() & 3) + 2; // G-Max Depletion only deducts 2 PP. - if (IsMaxMove(gCurrentMove) && GetMoveMaxEffect(gCurrentMove) == MAX_EFFECT_SPITE) + if (IsMaxMove(gCurrentMove) && MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SPITE)) ppToDeduct = 2; if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) @@ -17996,3 +18309,231 @@ void BS_SwapStats(void) PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); gBattlescriptCurrInstr = cmd->nextInstr; } + +static void TrySetParalysis(const u8 *nextInstr, const u8 *failInstr) +{ + if (CanBeParalyzed(gBattlerTarget, GetBattlerAbility(gBattlerTarget))) + { + gBattleMons[gBattlerTarget].status1 |= STATUS1_PARALYSIS; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gEffectBattler = gBattlerTarget; + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + gBattlescriptCurrInstr = nextInstr; + } + else + { + gBattlescriptCurrInstr = failInstr; + } +} + +static void TrySetPoison(const u8 *nextInstr, const u8 *failInstr) +{ + if (CanBePoisoned(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerTarget))) + { + gBattleMons[gBattlerTarget].status1 |= STATUS1_POISON; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gEffectBattler = gBattlerTarget; + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + gBattlescriptCurrInstr = nextInstr; + } + else + { + gBattlescriptCurrInstr = failInstr; + } +} + +static void TrySetSleep(const u8 *nextInstr, const u8 *failInstr) +{ + if (CanBeSlept(gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE)) + { + if (B_SLEEP_TURNS >= GEN_5) + gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 3) + 2); + else + gBattleMons[gBattlerTarget].status1 |= STATUS1_SLEEP_TURN((Random() % 4) + 3); + + TryActivateSleepClause(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]); + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gEffectBattler = gBattlerTarget; + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + gBattlescriptCurrInstr = nextInstr; + } + else + { + gBattlescriptCurrInstr = failInstr; + } +} + +void BS_TrySetParalysis(void) +{ + NATIVE_ARGS(const u8 *failInstr); + TrySetParalysis(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetPoison(void) +{ + NATIVE_ARGS(const u8 *failInstr); + TrySetPoison(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetPoisonParalyzis(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + static const u32 sStunShockEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON}; + u32 status = RandomElement(RNG_G_MAX_STUN_SHOCK, sStunShockEffects); + + if (status == STATUS1_PARALYSIS) + TrySetParalysis(cmd->nextInstr, cmd->failInstr); + else + TrySetPoison(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetEffectSpore(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + static const u32 sBefuddleEffects[] = {STATUS1_PARALYSIS, STATUS1_POISON, STATUS1_SLEEP}; + u32 status = RandomElement(RNG_G_MAX_BEFUDDLE, sBefuddleEffects); + + if (status == STATUS1_PARALYSIS) + TrySetParalysis(cmd->nextInstr, cmd->failInstr); + else if (status == STATUS1_POISON) + TrySetPoison(cmd->nextInstr, cmd->failInstr); + else + TrySetSleep(cmd->nextInstr, cmd->failInstr); +} + +void BS_TrySetConfusion(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (CanBeConfused(gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTIUSE_STATE] = 1; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TrySetInfatuation(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION) + && gBattleMons[gBattlerTarget].ability != ABILITY_OBLIVIOUS + && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL) + && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_INFATUATED_WITH(gBattlerAttacker); + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTIUSE_STATE] = 2; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TrySetEscapePrevention(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_ESCAPE_PREVENTION)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; + gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +void BS_TrySetTorment(void) +{ + NATIVE_ARGS(const u8 *failInstr); + + if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_TORMENT) + && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL)) + { + gBattleMons[gBattlerTarget].status2 |= STATUS2_TORMENT; + gDisableStructs[gBattlerTarget].tormentTimer = 3; // 3 turns excluding current turn + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gEffectBattler = gBattlerTarget; + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +// Heals one-sixth of the target's HP, including for Dynamaxed targets. +void BS_HealOneSixth(void) +{ + NATIVE_ARGS(const u8* failInstr); + gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP / 6; + if (gBattleStruct->moveDamage[gBattlerTarget] == 0) + gBattleStruct->moveDamage[gBattlerTarget] = 1; + gBattleStruct->moveDamage[gBattlerTarget] *= -1; + + if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) + gBattlescriptCurrInstr = cmd->failInstr; // fail + else + gBattlescriptCurrInstr = cmd->nextInstr; // can heal +} + +// Recycles the target's item if it is specifically holding a berry. +void BS_TryRecycleBerry(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u16* usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; + if (gBattleMons[gBattlerTarget].item == ITEM_NONE + && gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item + && ItemId_GetPocket(*usedHeldItem) == POCKET_BERRIES) + { + gLastUsedItem = *usedHeldItem; + *usedHeldItem = ITEM_NONE; + gBattleMons[gBattlerTarget].item = gLastUsedItem; + + BtlController_EmitSetMonData(gBattlerTarget, BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + MarkBattlerForControllerExec(gBattlerTarget); + + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } +} + +// Sets up sharp steel on the target's side. +void BS_SetSteelsurge(void) +{ + NATIVE_ARGS(const u8 *failInstr); + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (gSideStatuses[targetSide] & SIDE_STATUS_STEELSURGE) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + gSideStatuses[targetSide] |= SIDE_STATUS_STEELSURGE; + gSideTimers[targetSide].steelsurgeAmount = 1; + gBattlescriptCurrInstr = cmd->nextInstr; + } +} diff --git a/src/battle_util.c b/src/battle_util.c index 2b284a27de..d300bd5d2c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8778,7 +8778,7 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) bool32 isProtected = FALSE; if ((IsZMove(move) || IsMaxMove(move)) - && (!gProtectStructs[battlerDef].maxGuarded || GetMoveMaxEffect(move) == MAX_EFFECT_BYPASS_PROTECT)) + && (!gProtectStructs[battlerDef].maxGuarded || MoveIgnoresProtect(move))) isProtected = FALSE; // Z-Moves and Max Moves bypass protection (except Max Guard). else if (gProtectStructs[battlerDef].maxGuarded && IsMoveBlockedByMaxGuard(move)) isProtected = TRUE; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 76ed741f77..0a71a24ab7 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -21249,8 +21249,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_SUN }, .battleAnimScript = gBattleAnimMove_MaxFlare, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SUN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_FLUTTERBY] = @@ -21265,8 +21269,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_SP_ATK }, .battleAnimScript = gBattleAnimMove_MaxFlutterby, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SP_ATK_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_LIGHTNING] = @@ -21281,8 +21289,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_ELECTRIC_TERRAIN }, .battleAnimScript = gBattleAnimMove_MaxLightning, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ELECTRIC_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_STRIKE] = @@ -21297,8 +21309,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_SPEED }, .battleAnimScript = gBattleAnimMove_MaxStrike, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SPEED_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_KNUCKLE] = @@ -21313,8 +21329,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAISE_TEAM_ATTACK }, .battleAnimScript = gBattleAnimMove_MaxKnuckle, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_ATTACK, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_PHANTASM] = @@ -21329,8 +21349,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_DEFENSE }, .battleAnimScript = gBattleAnimMove_MaxPhantasm, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_DEFENSE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_HAILSTORM] = @@ -21345,8 +21369,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_HAIL }, .battleAnimScript = gBattleAnimMove_MaxHailstorm, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_HAIL, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_OOZE] = @@ -21361,8 +21389,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAISE_TEAM_SP_ATK }, .battleAnimScript = gBattleAnimMove_MaxOoze, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_SP_ATK, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_GEYSER] = @@ -21377,8 +21409,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAIN }, .battleAnimScript = gBattleAnimMove_MaxGeyser, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_AIRSTREAM] = @@ -21393,8 +21429,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAISE_TEAM_SPEED }, .battleAnimScript = gBattleAnimMove_MaxAirstream, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_SPEED, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_STARFALL] = @@ -21409,8 +21449,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_MISTY_TERRAIN }, .battleAnimScript = gBattleAnimMove_MaxStarfall, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_MISTY_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_WYRMWIND] = @@ -21425,8 +21469,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_ATTACK }, .battleAnimScript = gBattleAnimMove_MaxWyrmwind, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_ATTACK_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_MINDSTORM] = @@ -21441,8 +21489,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_PSYCHIC_TERRAIN }, .battleAnimScript = gBattleAnimMove_MaxMindstorm, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PSYCHIC_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_ROCKFALL] = @@ -21457,8 +21509,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_SANDSTORM }, .battleAnimScript = gBattleAnimMove_MaxRockfall, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SANDSTORM, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_QUAKE] = @@ -21473,9 +21529,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAISE_TEAM_SP_DEF }, .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, .battleAnimScript = gBattleAnimMove_MaxQuake, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_SP_DEF, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_DARKNESS] = @@ -21490,8 +21550,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_SP_DEF }, .battleAnimScript = gBattleAnimMove_MaxDarkness, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SP_DEF_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_OVERGROWTH] = @@ -21506,8 +21570,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_GRASSY_TERRAIN }, .battleAnimScript = gBattleAnimMove_MaxOvergrowth, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_GRASSY_TERRAIN, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_MAX_STEELSPIKE] = @@ -21522,8 +21590,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RAISE_TEAM_DEFENSE }, .battleAnimScript = gBattleAnimMove_MaxSteelspike, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAISE_TEAM_DEFENSE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_VINE_LASH] = @@ -21538,8 +21610,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_VINE_LASH }, .battleAnimScript = gBattleAnimMove_GMaxVineLash, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_VINE_LASH, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_WILDFIRE] = @@ -21554,8 +21630,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_WILDFIRE }, .battleAnimScript = gBattleAnimMove_GMaxWildfire, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WILDFIRE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CANNONADE] = @@ -21570,8 +21650,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_CANNONADE }, .battleAnimScript = gBattleAnimMove_GMaxCannonade, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CANNONADE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_BEFUDDLE] = @@ -21586,8 +21670,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_EFFECT_SPORE_FOES }, .battleAnimScript = gBattleAnimMove_GMaxBefuddle, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_EFFECT_SPORE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_VOLT_CRASH] = @@ -21602,8 +21690,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_PARALYZE_FOES }, .battleAnimScript = gBattleAnimMove_GMaxVoltCrash, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYZE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_GOLD_RUSH] = @@ -21618,8 +21710,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_CONFUSE_FOES_PAY_DAY }, .battleAnimScript = gBattleAnimMove_GMaxGoldRush, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CHI_STRIKE] = @@ -21634,8 +21730,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_CRIT_PLUS }, .battleAnimScript = gBattleAnimMove_GMaxChiStrike, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CRIT_PLUS_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_TERROR] = @@ -21650,8 +21750,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_MEAN_LOOK }, .battleAnimScript = gBattleAnimMove_GMaxTerror, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PREVENT_ESCAPE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_FOAM_BURST] = @@ -21666,8 +21770,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_SPEED_2_FOES }, .battleAnimScript = gBattleAnimMove_GMaxFoamBurst, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_SPEED_2_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_RESONANCE] = @@ -21682,8 +21790,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_AURORA_VEIL }, .battleAnimScript = gBattleAnimMove_GMaxResonance, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_AURORA_VEIL, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CUDDLE] = @@ -21698,8 +21810,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_INFATUATE_FOES }, .battleAnimScript = gBattleAnimMove_GMaxCuddle, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_INFATUATE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_REPLENISH] = @@ -21714,8 +21830,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_RECYCLE_BERRIES }, .battleAnimScript = gBattleAnimMove_GMaxReplenish, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECYCLE_BERRIES, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_MALODOR] = @@ -21730,8 +21850,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_POISON_FOES }, .battleAnimScript = gBattleAnimMove_GMaxMalodor, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_MELTDOWN] = @@ -21746,8 +21870,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_TORMENT_FOES }, .battleAnimScript = gBattleAnimMove_GMaxMeltdown, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_TORMENT_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_DRUM_SOLO] = @@ -21762,9 +21890,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_FIXED_POWER }, .ignoresTargetAbility = TRUE, .battleAnimScript = gBattleAnimMove_GMaxDrumSolo, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIXED_POWER, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_FIREBALL] = @@ -21779,9 +21911,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_FIXED_POWER }, .ignoresTargetAbility = TRUE, .battleAnimScript = gBattleAnimMove_GMaxFireball, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIXED_POWER, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_HYDROSNIPE] = @@ -21796,9 +21932,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_FIXED_POWER }, .ignoresTargetAbility = TRUE, .battleAnimScript = gBattleAnimMove_GMaxHydrosnipe, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIXED_POWER, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_WIND_RAGE] = @@ -21813,8 +21953,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_DEFOG }, .battleAnimScript = gBattleAnimMove_GMaxWindRage, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEFOG, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_GRAVITAS] = @@ -21829,8 +21973,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_GRAVITY }, .battleAnimScript = gBattleAnimMove_GMaxGravitas, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_GRAVITY, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_STONESURGE] = @@ -21845,8 +21993,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_STEALTH_ROCK }, .battleAnimScript = gBattleAnimMove_GMaxStonesurge, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_STEALTH_ROCK, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_VOLCALITH] = @@ -21861,8 +22013,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_VOLCALITH }, .battleAnimScript = gBattleAnimMove_GMaxVolcalith, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_VOLCALITH, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_TARTNESS] = @@ -21877,8 +22033,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_LOWER_EVASIVENESS_FOES }, .battleAnimScript = gBattleAnimMove_GMaxTartness, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_LOWER_EVASIVENESS_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_SWEETNESS] = @@ -21893,8 +22053,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_AROMATHERAPY }, .battleAnimScript = gBattleAnimMove_GMaxSweetness, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_AROMATHERAPY, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_SANDBLAST] = @@ -21909,8 +22073,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_SANDBLAST_FOES }, .battleAnimScript = gBattleAnimMove_GMaxSandblast, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SANDBLAST_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_STUN_SHOCK] = @@ -21925,8 +22093,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_POISON_PARALYZE_FOES }, .battleAnimScript = gBattleAnimMove_GMaxStunShock, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON_PARALYZE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_CENTIFERNO] = @@ -21941,8 +22113,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_FIRE_SPIN_FOES }, .battleAnimScript = gBattleAnimMove_GMaxCentiferno, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FIRE_SPIN_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_SMITE] = @@ -21957,8 +22133,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_CONFUSE_FOES }, .battleAnimScript = gBattleAnimMove_GMaxSmite, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSE_SIDE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, @@ -21974,8 +22154,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_YAWN_FOE }, .battleAnimScript = gBattleAnimMove_GMaxSnooze, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_YAWN_FOE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_FINALE] = @@ -21990,8 +22174,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_HEAL_TEAM }, .battleAnimScript = gBattleAnimMove_GMaxFinale, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_HEAL_TEAM, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_STEELSURGE] = @@ -22006,8 +22194,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_STEELSURGE }, .battleAnimScript = gBattleAnimMove_GMaxSteelsurge, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_STEELSURGE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_DEPLETION] = @@ -22022,8 +22214,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_SPITE }, .battleAnimScript = gBattleAnimMove_GMaxDepletion, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPITE, + .chance = 100, + .sheerForceBoost = SHEER_FORCE_NO_BOOST, + }), }, [MOVE_G_MAX_ONE_BLOW] = @@ -22038,14 +22234,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_BYPASS_PROTECT }, + .ignoresProtect = TRUE, .battleAnimScript = gBattleAnimMove_GMaxOneBlow, }, [MOVE_G_MAX_RAPID_FLOW] = { .name = COMPOUND_STRING("G-Max Rapid Flow"), - .description = sNullDescription, //ANIM TODO + .description = sNullDescription, .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, @@ -22054,8 +22250,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .maxEffect = MAX_EFFECT_BYPASS_PROTECT }, + .ignoresProtect = TRUE, .battleAnimScript = gBattleAnimMove_GMaxRapidFlow, }, - }; diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 4b5c05dfa7..b2f659faa0 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -683,7 +683,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers single opponent's speed") { GIVEN { // Fails?: ASSUME(GetMaxMove(B_POSITION_PLAYER_LEFT, MOVE_TACKLE) == MOVE_MAX_STRIKE); - ASSUME(GetMoveMaxEffect(MOVE_MAX_STRIKE) == MAX_EFFECT_LOWER_SPEED); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } PLAYER(SPECIES_WOBBUFFET) { Speed(80); } } WHEN { @@ -707,7 +707,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers single opponent's speed") DOUBLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers both opponents' speed") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_STRIKE) == MAX_EFFECT_LOWER_SPEED); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); PLAYER(SPECIES_WOBBUFFET) { Speed(80); } PLAYER(SPECIES_WOBBUFFET) { Speed(79); } OPPONENT(SPECIES_WOBBUFFET) {Speed(100); } @@ -744,7 +744,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) Max Knuckle raises both allies' attack") { s16 damage[4]; GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_KNUCKLE) == MAX_EFFECT_RAISE_TEAM_ATTACK); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_KNUCKLE, MOVE_EFFECT_RAISE_TEAM_ATTACK)); ASSUME(GetMoveCategory(MOVE_CLOSE_COMBAT) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); @@ -786,7 +786,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) Max Knuckle raises both allies' attack") SINGLE_BATTLE_TEST("(DYNAMAX) Max Flare sets up sunlight") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_FLARE) == MAX_EFFECT_SUN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_FLARE, MOVE_EFFECT_SUN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -802,7 +802,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Flare sets up sunlight") SINGLE_BATTLE_TEST("(DYNAMAX) Max Geyser sets up heavy rain") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_GEYSER) == MAX_EFFECT_RAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_GEYSER, MOVE_EFFECT_RAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -818,7 +818,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Geyser sets up heavy rain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Hailstorm sets up hail") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_HAILSTORM) == MAX_EFFECT_HAIL); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_HAILSTORM, MOVE_EFFECT_HAIL)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -834,7 +834,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Hailstorm sets up hail") SINGLE_BATTLE_TEST("(DYNAMAX) Max Rockfall sets up a sandstorm") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_ROCKFALL) == MAX_EFFECT_SANDSTORM); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_ROCKFALL, MOVE_EFFECT_SANDSTORM)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -851,7 +851,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Overgrowth sets up Grassy Terrain") { s32 maxHP = 490; // Because of recalculated stats upon Dynamaxing GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_OVERGROWTH) == MAX_EFFECT_GRASSY_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_OVERGROWTH, MOVE_EFFECT_GRASSY_TERRAIN)); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; @@ -871,7 +871,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Overgrowth sets up Grassy Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Mindstorm sets up Psychic Terrain") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_MINDSTORM) == MAX_EFFECT_PSYCHIC_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_MINDSTORM, MOVE_EFFECT_PSYCHIC_TERRAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -888,7 +888,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Mindstorm sets up Psychic Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Lightning sets up Electric Terrain") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_LIGHTNING) == MAX_EFFECT_ELECTRIC_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_LIGHTNING, MOVE_EFFECT_ELECTRIC_TERRAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -903,7 +903,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Lightning sets up Electric Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) Max Starfall sets up Misty Terrain") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_MAX_STARFALL) == MAX_EFFECT_MISTY_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STARFALL, MOVE_EFFECT_MISTY_TERRAIN)); OPPONENT(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); } WHEN { @@ -918,7 +918,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Starfall sets up Misty Terrain") SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Stonesurge sets up Stealth Rocks") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_STONESURGE) == MAX_EFFECT_STEALTH_ROCK); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STONESURGE, MOVE_EFFECT_STEALTH_ROCK)); PLAYER(SPECIES_DREDNAW) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -938,7 +938,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Stonesurge sets up Stealth Rocks") SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Steelsurge sets up sharp steel") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_STEELSURGE) == MAX_EFFECT_STEELSURGE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STEELSURGE, MOVE_EFFECT_STEELSURGE)); PLAYER(SPECIES_COPPERAJAH) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_HATTERENE); @@ -969,7 +969,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Hydrosnipe has fixed power and ignores abili PARAMETRIZE { move = MOVE_WATER_GUN; } PARAMETRIZE { move = MOVE_HYDRO_CANNON; } GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_HYDROSNIPE) == MAX_EFFECT_FIXED_POWER); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_HYDROSNIPE, MOVE_EFFECT_FIXED_POWER)); PLAYER(SPECIES_INTELEON) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_ARCTOVISH) { Ability(ABILITY_WATER_ABSORB); } } WHEN { @@ -985,7 +985,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Hydrosnipe has fixed power and ignores abili DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Volt Crash paralyzes both opponents") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_VOLT_CRASH) == MAX_EFFECT_PARALYZE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_VOLT_CRASH, MOVE_EFFECT_PARALYZE_SIDE)); PLAYER(SPECIES_PIKACHU) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_PICHU); OPPONENT(SPECIES_WOBBUFFET); @@ -1012,7 +1012,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock paralyzes or poisons both opponen PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = STATUS1_PARALYSIS; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = STATUS1_POISON; } GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_STUN_SHOCK) == MAX_EFFECT_POISON_PARALYZE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STUN_SHOCK, MOVE_EFFECT_POISON_PARALYZE_SIDE)); PLAYER(SPECIES_TOXTRICITY) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_TOXEL); OPPONENT(SPECIES_WOBBUFFET); @@ -1049,7 +1049,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock paralyzes or poisons both opponen DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock chooses statuses before considering immunities") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_STUN_SHOCK) == MAX_EFFECT_POISON_PARALYZE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STUN_SHOCK, MOVE_EFFECT_POISON_PARALYZE_SIDE)); PLAYER(SPECIES_TOXTRICITY) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_TOXEL); OPPONENT(SPECIES_GARBODOR); @@ -1082,7 +1082,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Befuddle paralyzes, poisons, or sleeps both PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = STATUS1_POISON; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = STATUS1_SLEEP; } GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_BEFUDDLE) == MAX_EFFECT_EFFECT_SPORE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_BEFUDDLE, MOVE_EFFECT_EFFECT_SPORE_SIDE)); PLAYER(SPECIES_BUTTERFREE) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_CATERPIE); OPPONENT(SPECIES_WOBBUFFET); @@ -1126,7 +1126,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Befuddle paralyzes, poisons, or sleeps both DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Gold Rush confuses both opponents and generates money") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_GOLD_RUSH) == MAX_EFFECT_CONFUSE_FOES_PAY_DAY); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_GOLD_RUSH, MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE)); PLAYER(SPECIES_MEOWTH) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_PERSIAN); OPPONENT(SPECIES_WOBBUFFET); @@ -1146,7 +1146,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Gold Rush confuses both opponents and genera DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Smite confuses both opponents") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_SMITE) == MAX_EFFECT_CONFUSE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SMITE, MOVE_EFFECT_CONFUSE_SIDE)); PLAYER(SPECIES_HATTERENE) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_HATENNA); OPPONENT(SPECIES_WOBBUFFET); @@ -1165,7 +1165,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Smite confuses both opponents") DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Cuddle infatuates both opponents, if possible") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_CUDDLE) == MAX_EFFECT_INFATUATE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CUDDLE, MOVE_EFFECT_INFATUATE_SIDE)); PLAYER(SPECIES_EEVEE) { Gender(MON_MALE); GigantamaxFactor(TRUE); } PLAYER(SPECIES_EEVEE); OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); } @@ -1186,7 +1186,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Cuddle infatuates both opponents, if possibl DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Terror traps both opponents") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_TERROR) == MAX_EFFECT_MEAN_LOOK); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_TERROR, MOVE_EFFECT_PREVENT_ESCAPE_SIDE)); PLAYER(SPECIES_GENGAR) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_GASTLY); OPPONENT(SPECIES_WOBBUFFET); @@ -1205,7 +1205,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Terror traps both opponents") SINGLE_BATTLE_TEST("(DYNAMAX) Baton Pass passes G-Max Terror's escape prevention effect") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_TERROR) == MAX_EFFECT_MEAN_LOOK); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_TERROR, MOVE_EFFECT_PREVENT_ESCAPE_SIDE)); PLAYER(SPECIES_GENGAR) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -1222,7 +1222,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Baton Pass passes G-Max Terror's escape prevention DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Meltdown torments both opponents for 3 turns") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_MELTDOWN) == MAX_EFFECT_TORMENT_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_MELTDOWN, MOVE_EFFECT_TORMENT_SIDE)); PLAYER(SPECIES_MELMETAL) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_MELTAN); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_CELEBRATE); } @@ -1259,7 +1259,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Wildfire sets a field effect that damages no { s16 damage; GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_WILDFIRE) == MAX_EFFECT_WILDFIRE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_WILDFIRE, MOVE_EFFECT_WILDFIRE)); PLAYER(SPECIES_CHARIZARD) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_CHARMANDER); OPPONENT(SPECIES_WOBBUFFET) { HP(600); MaxHP(600); } @@ -1305,7 +1305,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Replenish recycles allies' berries 50\% of t { PASSES_RANDOMLY(1, 2, RNG_G_MAX_REPLENISH); GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_REPLENISH) == MAX_EFFECT_RECYCLE_BERRIES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_REPLENISH, MOVE_EFFECT_RECYCLE_BERRIES)); PLAYER(SPECIES_SNORLAX) { Item(ITEM_APICOT_BERRY); GigantamaxFactor(TRUE); } PLAYER(SPECIES_MUNCHLAX) { Item(ITEM_APICOT_BERRY); Ability(ABILITY_THICK_FAT); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_APICOT_BERRY); } @@ -1333,7 +1333,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Snooze makes only the target drowsy") { PASSES_RANDOMLY(1, 2, RNG_G_MAX_SNOOZE); GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_SNOOZE) == MAX_EFFECT_YAWN_FOE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SNOOZE, MOVE_EFFECT_YAWN_FOE)); ASSUME(GetMoveCategory(MOVE_DARK_PULSE) == DAMAGE_CATEGORY_SPECIAL); // Otherwise, Blissey faints. PLAYER(SPECIES_GRIMMSNARL) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_IMPIDIMP); @@ -1357,7 +1357,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Finale heals allies by 1/6 of their health") { s16 damage1, damage2; GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_FINALE) == MAX_EFFECT_HEAL_TEAM); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_FINALE, MOVE_EFFECT_HEAL_TEAM)); PLAYER(SPECIES_ALCREMIE) { HP(1); GigantamaxFactor(TRUE); } PLAYER(SPECIES_MILCERY) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -1377,7 +1377,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Finale heals allies by 1/6 of their health") DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_SWEETNESS) == MAX_EFFECT_AROMATHERAPY); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SWEETNESS, MOVE_EFFECT_AROMATHERAPY)); PLAYER(SPECIES_APPLETUN) { Status1(STATUS1_POISON); GigantamaxFactor(TRUE); } PLAYER(SPECIES_APPLIN) { Status1(STATUS1_POISON); } OPPONENT(SPECIES_WOBBUFFET); @@ -1397,7 +1397,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Centiferno traps both opponents in Fire Spin") { GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_CENTIFERNO) == MAX_EFFECT_FIRE_SPIN_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CENTIFERNO, MOVE_EFFECT_FIRE_SPIN_SIDE)); PLAYER(SPECIES_CENTISKORCH) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_SIZZLIPEDE); PLAYER(SPECIES_SIZZLIPEDE); @@ -1426,7 +1426,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Chi Strike boosts allies' crit chance") u32 j; GIVEN { ASSUME(B_CRIT_CHANCE >= GEN_6); - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_CHI_STRIKE) == MAX_EFFECT_CRIT_PLUS); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CHI_STRIKE, MOVE_EFFECT_CRIT_PLUS_SIDE)); PLAYER(SPECIES_MACHAMP) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_MACHOP); OPPONENT(SPECIES_WOBBUFFET); @@ -1458,7 +1458,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Depletion takes away 2 PP from the target's { GIVEN { ASSUME(GetMoveCategory(MOVE_DRAGON_CLAW) == DAMAGE_CATEGORY_PHYSICAL); // Otherwise Sableye faints. - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_DEPLETION) == MAX_EFFECT_SPITE); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_DEPLETION, MOVE_EFFECT_SPITE)); PLAYER(SPECIES_DURALUDON) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_WYNAUT); // Dynamax behaves weird with test turn order because stats are recalculated. @@ -1480,7 +1480,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max One Blow bypasses Max Guard for full damage" PARAMETRIZE { protect = TRUE; } PARAMETRIZE { protect = FALSE; } GIVEN { - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_ONE_BLOW) == MAX_EFFECT_BYPASS_PROTECT); + ASSUME(MoveIgnoresProtect(MOVE_G_MAX_RAPID_FLOW)); PLAYER(SPECIES_URSHIFU) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_KUBFU); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/sleep_clause.c b/test/battle/sleep_clause.c index a5f28f4f22..ae20a0acad 100644 --- a/test/battle/sleep_clause.c +++ b/test/battle/sleep_clause.c @@ -507,7 +507,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: G-Max Befuddle can only sleep one opposing mon { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_BEFUDDLE) == MAX_EFFECT_EFFECT_SPORE_FOES); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_BEFUDDLE, MOVE_EFFECT_EFFECT_SPORE_SIDE)); PLAYER(SPECIES_BUTTERFREE) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_CATERPIE); OPPONENT(SPECIES_WOBBUFFET); @@ -1131,7 +1131,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveMaxEffect(MOVE_G_MAX_SWEETNESS) == MAX_EFFECT_AROMATHERAPY); + ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SWEETNESS, MOVE_EFFECT_AROMATHERAPY)); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); PLAYER(SPECIES_APPLETUN) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_WOBBUFFET);