reorganized max move functionality to remove redundant move effects

This commit is contained in:
AgustinGDLV 2023-02-27 11:54:49 -08:00
parent c6c92da19c
commit 92c8503869
5 changed files with 201 additions and 201 deletions

View File

@ -10334,11 +10334,26 @@ BattleScript_SymbiosisActivates::
@@@ MAX MOVES @@@
BattleScript_EffectMaxMove::
attackcanceler
setmaxmoveeffect
accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON
attackstring
ppreduce
goto BattleScript_HitFromCritCalc
critcalc
damagecalc
adjustdamage
attackanimation
waitanimation
effectivenesssound
hitanimation BS_TARGET
waitstate
healthbarupdate BS_TARGET
datahpupdate BS_TARGET
critmessage
waitmessage B_WAIT_TIME_LONG
resultmessage
waitmessage B_WAIT_TIME_LONG
setmaxmoveeffect
tryfaintmon BS_TARGET
goto BattleScript_MoveEnd
BattleScript_EffectRaiseSideStats::
savetarget

View File

@ -57,5 +57,6 @@ u16 GetMaxMove(u16 battlerId, u16 baseMove);
bool8 IsMaxMove(u16 move);
const u8 *GetMaxMoveName(u16 move);
void ChooseDamageNonTypesString(u8 move);
u16 SetMaxMoveEffect(u16 move);
#endif

View File

@ -374,16 +374,8 @@
#define MOVE_EFFECT_TRAP_BOTH 70
#define MOVE_EFFECT_DOUBLE_SHOCK 71
#define MOVE_EFFECT_ROUND 72
#define MOVE_EFFECT_RAISE_SIDE_STATS 73
#define MOVE_EFFECT_LOWER_SIDE_STATS 74
#define MOVE_EFFECT_WEATHER 75
#define MOVE_EFFECT_TERRAIN 76
#define MOVE_EFFECT_STEALTH_ROCK 77
#define MOVE_EFFECT_STEELSURGE 78
#define MOVE_EFFECT_DAMAGE_NON_TYPES 79
#define MOVE_EFFECT_DEFOG 80
#define NUM_MOVE_EFFECTS 81
#define NUM_MOVE_EFFECTS 73
#define MOVE_EFFECT_AFFECTS_USER 0x4000
#define MOVE_EFFECT_CERTAIN 0x8000

View File

@ -1,7 +1,12 @@
#include "global.h"
#include "battle.h"
#include "battle_anim.h"
#include "battle_scripts.h"
#include "battle_script_commands.h"
#include "data.h"
#include "pokemon.h"
#include "constants/battle_string_ids.h"
#include "constants/hold_effects.h"
#include "constants/moves.h"
// Constant Data
@ -79,7 +84,7 @@ bool8 ShouldUseMaxMove(u16 battlerId, u16 baseMove)
// return !IsRaidBossUsingRegularMove(battlerId, baseMove);
if (gBattleStruct->dynamax.dynamaxTurns[battlerId] > 0)
return TRUE;
return FALSE;
return TRUE;
}
// Returns the appropriate Max Move or G-Max Move for a battler to use.
@ -137,3 +142,177 @@ void ChooseDamageNonTypesString(u8 type)
break;
}
}
// Activates the secondary effect of a Max Move.
u16 SetMaxMoveEffect(u16 move)
{
u16 effect = 0;
u8 maxEffect = gBattleMoves[move].argument;
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(gBattleMoves[gCurrentMove].argument, 1, FALSE);
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_EffectRaiseSideStats;
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 = gBattleMoves[gCurrentMove].argument - MAX_EFFECT_LOWER_ATTACK + 1;
break;
}
SET_STATCHANGER(statId, stage, TRUE);
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_EffectLowerSideStats;
effect++;
}
break;
case MAX_EFFECT_SUN:
case MAX_EFFECT_RAIN:
case MAX_EFFECT_SANDSTORM:
case MAX_EFFECT_HAIL:
{
u8 weather, msg;
switch (maxEffect)
{
case MAX_EFFECT_SUN:
weather = ENUM_WEATHER_SUN;
msg = B_MSG_STARTED_SUNLIGHT;
break;
case MAX_EFFECT_RAIN:
weather = ENUM_WEATHER_RAIN;
msg = B_MSG_STARTED_RAIN;
break;
case MAX_EFFECT_SANDSTORM:
weather = ENUM_WEATHER_SANDSTORM;
msg = B_MSG_STARTED_SANDSTORM;
break;
case MAX_EFFECT_HAIL:
weather = ENUM_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;
u8 *timer = NULL;
switch (gBattleMoves[gCurrentMove].argument)
{
case MAX_EFFECT_MISTY_TERRAIN:
statusFlag = STATUS_FIELD_MISTY_TERRAIN, timer = &gFieldTimers.terrainTimer;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
break;
case MAX_EFFECT_GRASSY_TERRAIN:
statusFlag = STATUS_FIELD_GRASSY_TERRAIN, timer = &gFieldTimers.terrainTimer;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
break;
case MAX_EFFECT_ELECTRIC_TERRAIN:
statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN, timer = &gFieldTimers.terrainTimer;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
break;
case MAX_EFFECT_PSYCHIC_TERRAIN:
statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN, timer = &gFieldTimers.terrainTimer;
gBattleCommunication[MULTISTRING_CHOOSER] = 3;
break;
}
if (!(gFieldStatuses & statusFlag) && statusFlag != 0)
{
gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY;
gFieldStatuses |= statusFlag;
if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER)
*timer = 8;
else
*timer = 5;
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_EffectSetTerrain;
}
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))
{
gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES;
gSideTimers[side].damageNonTypesTimer = 4;
gSideTimers[side].damageNonTypesType = gBattleMoves[gCurrentMove].type;
BattleScriptPush(gBattlescriptCurrInstr + 1);
ChooseDamageNonTypesString(gBattleMoves[gCurrentMove].type);
gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts;
effect++;
}
break;
}
case MAX_EFFECT_STEALTH_ROCK:
if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEALTH_ROCK))
{
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_StealthRockActivates;
effect++;
}
break;
case MAX_EFFECT_STEELSURGE:
if (!(gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_STEELSURGE))
{
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_SteelsurgeActivates;
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;
}
return effect;
}

View File

@ -2868,7 +2868,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR);
u32 flags = 0;
u16 battlerAbility;
bool8 activateAfterFaint = FALSE;
if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT
&& gBattleMons[gBattlerTarget].hp != 0
@ -2886,10 +2885,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
gBattleStruct->moveEffect2 = gBattleScripting.moveEffect;
gBattlescriptCurrInstr++;
return;
case MOVE_EFFECT_STEALTH_ROCK:
case MOVE_EFFECT_STEELSURGE:
activateAfterFaint = TRUE;
break;
}
if (gBattleScripting.moveEffect & MOVE_EFFECT_AFFECTS_USER)
@ -2931,7 +2926,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
INCREMENT_RESET_RETURN
if (gBattleMons[gEffectBattler].hp == 0
&& !activateAfterFaint
&& gBattleScripting.moveEffect != MOVE_EFFECT_PAYDAY
&& gBattleScripting.moveEffect != MOVE_EFFECT_STEAL_ITEM
&& gBattleScripting.moveEffect != MOVE_EFFECT_BUG_BITE)
@ -3748,143 +3742,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
case MOVE_EFFECT_ROUND:
TryUpdateRoundTurnOrder(); // If another Pokémon uses Round before the user this turn, the user will use Round directly after it
gBattlescriptCurrInstr++;
break;// MAX MOVE EFFECTS
case MOVE_EFFECT_RAISE_SIDE_STATS:
if (!NoAliveMonsForEitherParty())
{
// Max Effects are ordered by stat ID.
SET_STATCHANGER(gBattleMoves[gCurrentMove].argument, 1, FALSE);
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_EffectRaiseSideStats;
break;
}
case MOVE_EFFECT_LOWER_SIDE_STATS:
if (!NoAliveMonsForEitherParty())
{
u8 statId = 0;
u8 stage = 1;
switch (gBattleMoves[gCurrentMove].argument)
{
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 = gBattleMoves[gCurrentMove].argument - MAX_EFFECT_LOWER_ATTACK + 1;
break;
}
SET_STATCHANGER(statId, stage, TRUE);
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_EffectLowerSideStats;
break;
}
case MOVE_EFFECT_WEATHER:
{
u8 weather, msg;
switch (gBattleMoves[gCurrentMove].argument)
{
case MAX_EFFECT_SUN:
weather = ENUM_WEATHER_SUN;
msg = B_MSG_STARTED_SUNLIGHT;
break;
case MAX_EFFECT_RAIN:
weather = ENUM_WEATHER_RAIN;
msg = B_MSG_STARTED_RAIN;
break;
case MAX_EFFECT_SANDSTORM:
weather = ENUM_WEATHER_SANDSTORM;
msg = B_MSG_STARTED_SANDSTORM;
break;
case MAX_EFFECT_HAIL:
weather = ENUM_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_TERRAIN:
{
u32 statusFlag = 0;
u8 *timer = NULL;
switch (gBattleMoves[gCurrentMove].argument)
{
case MAX_EFFECT_MISTY_TERRAIN:
statusFlag = STATUS_FIELD_MISTY_TERRAIN, timer = &gFieldTimers.terrainTimer;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
break;
case MAX_EFFECT_GRASSY_TERRAIN:
statusFlag = STATUS_FIELD_GRASSY_TERRAIN, timer = &gFieldTimers.terrainTimer;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
break;
case MAX_EFFECT_ELECTRIC_TERRAIN:
statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN, timer = &gFieldTimers.terrainTimer;
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
break;
case MAX_EFFECT_PSYCHIC_TERRAIN:
statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN, timer = &gFieldTimers.terrainTimer;
gBattleCommunication[MULTISTRING_CHOOSER] = 3;
break;
}
if (!(gFieldStatuses & statusFlag) && statusFlag != 0)
{
gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY;
gFieldStatuses |= statusFlag;
if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER)
*timer = 8;
else
*timer = 5;
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_EffectSetTerrain;
}
break;
}
case MOVE_EFFECT_DAMAGE_NON_TYPES:
{
side = GetBattlerSide(gBattlerTarget);
if (!(gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES))
{
gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES;
gSideTimers[side].damageNonTypesTimer = 4;
gSideTimers[side].damageNonTypesType = gBattleMoves[gCurrentMove].type;
BattleScriptPush(gBattlescriptCurrInstr + 1);
ChooseDamageNonTypesString(gBattleMoves[gCurrentMove].type);
gBattlescriptCurrInstr = BattleScript_DamageNonTypesStarts;
}
break;
}
case MOVE_EFFECT_STEALTH_ROCK:
if (!(gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_STEALTH_ROCK))
{
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_StealthRockActivates;
}
break;
case MOVE_EFFECT_STEELSURGE:
if (!(gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_STEELSURGE))
{
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_SteelsurgeActivates;
}
break;
case MOVE_EFFECT_DEFOG:
if (gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_SCREEN_ANY
|| gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_HAZARDS_ANY
|| gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_HAZARDS_ANY
|| gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)
{
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_DefogTryHazards;
}
break;
}
}
@ -11299,52 +11156,8 @@ static void Cmd_various(void)
case VARIOUS_SET_MAX_MOVE_EFFECT:
{
VARIOUS_ARGS();
switch (gBattleMoves[gCurrentMove].argument)
{
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:
gBattleScripting.moveEffect = MOVE_EFFECT_RAISE_SIDE_STATS;
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:
gBattleScripting.moveEffect = MOVE_EFFECT_LOWER_SIDE_STATS;
break;
case MAX_EFFECT_SUN:
case MAX_EFFECT_RAIN:
case MAX_EFFECT_SANDSTORM:
case MAX_EFFECT_HAIL:
gBattleScripting.moveEffect = MOVE_EFFECT_WEATHER;
break;
case MAX_EFFECT_MISTY_TERRAIN:
case MAX_EFFECT_GRASSY_TERRAIN:
case MAX_EFFECT_ELECTRIC_TERRAIN:
case MAX_EFFECT_PSYCHIC_TERRAIN:
gBattleScripting.moveEffect = MOVE_EFFECT_TERRAIN;
break;
case MAX_EFFECT_VINE_LASH:
case MAX_EFFECT_CANNONADE:
case MAX_EFFECT_WILDFIRE:
case MAX_EFFECT_VOLCALITH:
gBattleScripting.moveEffect = MOVE_EFFECT_DAMAGE_NON_TYPES;
break;
case MAX_EFFECT_STEALTH_ROCK:
gBattleScripting.moveEffect = MOVE_EFFECT_STEALTH_ROCK;
break;
case MAX_EFFECT_STEELSURGE:
gBattleScripting.moveEffect = MOVE_EFFECT_STEELSURGE;
break;
case MAX_EFFECT_DEFOG:
gBattleScripting.moveEffect = MOVE_EFFECT_DEFOG;
break;
}
if(SetMaxMoveEffect(gCurrentMove))
return;
break;
}
case VARIOUS_JUMP_IF_TARGET_NOT_ALLY: