Convert max effects to normal move effects (#6143)
This commit is contained in:
parent
473cf265a4
commit
765a12f520
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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[];
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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,
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user