Convert max effects to normal move effects (#6143)

This commit is contained in:
Alex 2025-02-07 01:02:39 +01:00 committed by GitHub
parent 473cf265a4
commit 765a12f520
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 1151 additions and 838 deletions

View File

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

View File

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

View File

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

View File

@ -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[];

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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