Create BattleStruct sub struct for event states (#8131)
This commit is contained in:
parent
be5f6d4801
commit
80b5d81a9a
@ -2,6 +2,7 @@
|
||||
#define GUARD_BATTLE_H
|
||||
|
||||
// should they be included here or included individually by every file?
|
||||
#include "constants/battle_end_turn.h"
|
||||
#include "constants/abilities.h"
|
||||
#include "constants/battle.h"
|
||||
#include "constants/form_change_types.h"
|
||||
@ -605,15 +606,28 @@ struct PartyState
|
||||
u16 usedHeldItem;
|
||||
};
|
||||
|
||||
struct EventStates
|
||||
{
|
||||
enum EndTurnResolutionOrder endTurn:8;
|
||||
u32 endTurnBlock:8; // FirstEventBlock, SecondEventBlock, ThirdEventBlock
|
||||
enum BattlerId endTurnBattler:4;
|
||||
u32 arenaTurn:8;
|
||||
enum BattleSide battlerSide:4;
|
||||
enum BattlerId moveEndBattler:4;
|
||||
enum FirstTurnEventsStates beforeFristTurn:8;
|
||||
enum FaintedActions faintedAction:8;
|
||||
enum BattlerId faintedActionBattler:4;
|
||||
enum MoveSuccessOrder atkCanceller:8;
|
||||
enum BattleIntroStates battleIntro:8;
|
||||
u32 padding:24;
|
||||
};
|
||||
|
||||
// Cleared at the beginning of the battle. Fields need to be cleared when needed manually otherwise.
|
||||
struct BattleStruct
|
||||
{
|
||||
struct BattlerState battlerState[MAX_BATTLERS_COUNT];
|
||||
struct PartyState partyState[NUM_BATTLE_SIDES][PARTY_SIZE];
|
||||
u8 eventBlockCounter;
|
||||
u8 endTurnEventsCounter;
|
||||
u8 turnEffectsBattlerId:4;
|
||||
u8 moveEndBattlerId:4;
|
||||
struct EventStates eventState;
|
||||
u16 wrappedMove[MAX_BATTLERS_COUNT];
|
||||
u16 moveTarget[MAX_BATTLERS_COUNT];
|
||||
u32 expShareExpValue;
|
||||
@ -633,9 +647,6 @@ struct BattleStruct
|
||||
u8 moneyMultiplierItem:1;
|
||||
u8 moneyMultiplierMove:1;
|
||||
u8 savedTurnActionNumber;
|
||||
u8 eventsBeforeFirstTurnState;
|
||||
u8 faintedActionsState;
|
||||
u8 faintedActionsBattlerId;
|
||||
u8 scriptPartyIdx; // for printing the nickname
|
||||
bool8 selectionScriptFinished[MAX_BATTLERS_COUNT];
|
||||
u8 battlerPartyIndexes[MAX_BATTLERS_COUNT];
|
||||
@ -676,8 +687,6 @@ struct BattleStruct
|
||||
u16 choicedMove[MAX_BATTLERS_COUNT];
|
||||
u16 changedItems[MAX_BATTLERS_COUNT];
|
||||
u8 switchInBattlerCounter;
|
||||
u8 arenaTurnCounter;
|
||||
u8 turnSideTracker;
|
||||
u16 lastTakenMoveFrom[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT]; // a 2-D array [target][attacker]
|
||||
union {
|
||||
struct LinkBattlerHeader linkBattlerHeader;
|
||||
@ -691,7 +700,6 @@ struct BattleStruct
|
||||
u8 toxicChainPriority:1; // If Toxic Chain will trigger on target, all other non volatiles will be blocked
|
||||
u8 padding1:1;
|
||||
u16 startingStatusTimer;
|
||||
u8 atkCancellerTracker;
|
||||
struct BattleTvMovePoints tvMovePoints;
|
||||
struct BattleTv tv;
|
||||
u8 AI_monToSwitchIntoId[MAX_BATTLERS_COUNT];
|
||||
@ -712,7 +720,6 @@ struct BattleStruct
|
||||
struct DynamaxData dynamax;
|
||||
struct BattleGimmickData gimmick;
|
||||
const u8 *trainerSlideMsg;
|
||||
enum BattleIntroStates introState:8;
|
||||
u8 stolenStats[NUM_BATTLE_STATS]; // hp byte is used for which stats to raise, other inform about by how many stages
|
||||
u8 lastMoveTarget[MAX_BATTLERS_COUNT]; // The last target on which each mon used a move, for the sake of Instruct
|
||||
enum Ability tracedAbility[MAX_BATTLERS_COUNT];
|
||||
|
||||
@ -649,6 +649,17 @@ enum BattleEnvironments
|
||||
// Constants for Torment
|
||||
#define PERMANENT_TORMENT 0xF
|
||||
|
||||
enum FaintedActions
|
||||
{
|
||||
FAINTED_ACTIONS_NO_MONS_TO_SWITCH,
|
||||
FAINTED_ACTIONS_GIVE_EXP,
|
||||
FAINTED_ACTIONS_SET_ABSENT_FLAGS,
|
||||
FAINTED_ACTIONS_WAIT_STATE,
|
||||
FAINTED_ACTIONS_HANDLE_FAINTED_MON,
|
||||
FAINTED_ACTIONS_HANDLE_NEXT_BATTLER,
|
||||
FAINTED_ACTIONS_MAX_CASE,
|
||||
};
|
||||
|
||||
// Constants for B_VAR_STARTING_STATUS
|
||||
// Timer value controlled by B_VAR_STARTING_STATUS_TIMER
|
||||
enum StartingStatus
|
||||
|
||||
92
include/constants/battle_end_turn.h
Normal file
92
include/constants/battle_end_turn.h
Normal file
@ -0,0 +1,92 @@
|
||||
#ifndef GUARD_CONSTANTS_BATTLE_END_TURN_H
|
||||
#define GUARD_CONSTANTS_BATTLE_END_TURN_H
|
||||
|
||||
// General End Turn Effects based on research from smogon from vanilla games:
|
||||
// https://www.smogon.com/forums/threads/sword-shield-battle-mechanics-research.3655528/page-64#post-9244179
|
||||
enum EndTurnResolutionOrder
|
||||
{
|
||||
ENDTURN_ORDER,
|
||||
ENDTURN_VARIOUS,
|
||||
ENDTURN_WEATHER,
|
||||
ENDTURN_WEATHER_DAMAGE,
|
||||
ENDTURN_EMERGENCY_EXIT_1,
|
||||
ENDTURN_AFFECTION,
|
||||
ENDTURN_FUTURE_SIGHT,
|
||||
ENDTURN_WISH,
|
||||
ENDTURN_FIRST_EVENT_BLOCK,
|
||||
ENDTURN_EMERGENCY_EXIT_2,
|
||||
ENDTURN_AQUA_RING,
|
||||
ENDTURN_INGRAIN,
|
||||
ENDTURN_LEECH_SEED,
|
||||
ENDTURN_POISON,
|
||||
ENDTURN_BURN,
|
||||
ENDTURN_FROSTBITE,
|
||||
ENDTURN_NIGHTMARE,
|
||||
ENDTURN_CURSE,
|
||||
ENDTURN_WRAP,
|
||||
ENDTURN_SALT_CURE,
|
||||
ENDTURN_OCTOLOCK,
|
||||
ENDTURN_SYRUP_BOMB,
|
||||
ENDTURN_TAUNT,
|
||||
ENDTURN_TORMENT,
|
||||
ENDTURN_ENCORE,
|
||||
ENDTURN_DISABLE,
|
||||
ENDTURN_MAGNET_RISE,
|
||||
ENDTURN_TELEKINESIS,
|
||||
ENDTURN_HEAL_BLOCK,
|
||||
ENDTURN_EMBARGO,
|
||||
ENDTURN_YAWN,
|
||||
ENDTURN_PERISH_SONG,
|
||||
ENDTURN_ROOST,
|
||||
ENDTURN_EMERGENCY_EXIT_3,
|
||||
ENDTURN_SECOND_EVENT_BLOCK,
|
||||
ENDTURN_TRICK_ROOM,
|
||||
ENDTURN_GRAVITY,
|
||||
ENDTURN_WATER_SPORT,
|
||||
ENDTURN_MUD_SPORT,
|
||||
ENDTURN_WONDER_ROOM,
|
||||
ENDTURN_MAGIC_ROOM,
|
||||
ENDTURN_TERRAIN,
|
||||
ENDTURN_THIRD_EVENT_BLOCK,
|
||||
ENDTURN_EMERGENCY_EXIT_4,
|
||||
ENDTURN_FORM_CHANGE_ABILITIES,
|
||||
ENDTURN_EJECT_PACK,
|
||||
ENDTURN_DYNAMAX,
|
||||
ENDTURN_COUNT,
|
||||
};
|
||||
|
||||
// Block that handles effects for each individual battler on the field (eg residual damage)
|
||||
enum FirstEventBlock
|
||||
{
|
||||
FIRST_EVENT_BLOCK_GMAX_MOVE_RESIDUAL, // Needs to be split
|
||||
FIRST_EVENT_BLOCK_SEA_OF_FIRE_DAMAGE,
|
||||
FIRST_EVENT_BLOCK_THRASH, // Thrash isn't handled here in vanilla but for now it is that best place for it.
|
||||
FIRST_EVENT_BLOCK_GRASSY_TERRAIN_HEAL,
|
||||
FIRST_EVENT_BLOCK_ABILITIES,
|
||||
FIRST_EVENT_BLOCK_HEAL_ITEMS,
|
||||
};
|
||||
|
||||
// Block that tries to remove side statuses
|
||||
enum SecondEventBlock
|
||||
{
|
||||
SECOND_EVENT_BLOCK_REFLECT,
|
||||
SECOND_EVENT_BLOCK_LIGHT_SCREEN,
|
||||
SECOND_EVENT_BLOCK_SAFEGUARD,
|
||||
SECOND_EVENT_BLOCK_MIST,
|
||||
SECOND_EVENT_BLOCK_TAILWIND,
|
||||
SECOND_EVENT_BLOCK_LUCKY_CHANT,
|
||||
SECOND_EVENT_BLOCK_RAINBOW,
|
||||
SECOND_EVENT_BLOCK_SEA_OF_FIRE,
|
||||
SECOND_EVENT_BLOCK_SWAMP,
|
||||
SECOND_EVENT_BLOCK_AURORA_VEIL,
|
||||
};
|
||||
|
||||
// Block that handles Uproar, items and non-form changing abilities
|
||||
enum ThirdEventBlock
|
||||
{
|
||||
THIRD_EVENT_BLOCK_UPROAR,
|
||||
THIRD_EVENT_BLOCK_ABILITIES,
|
||||
THIRD_EVENT_BLOCK_ITEMS,
|
||||
};
|
||||
|
||||
#endif // GUARD_CONSTANTS_BATTLE_END_TURN_H
|
||||
@ -12,94 +12,6 @@
|
||||
#include "constants/items.h"
|
||||
#include "constants/moves.h"
|
||||
|
||||
// General End Turn Effects based on research from smogon from vanilla games:
|
||||
// https://www.smogon.com/forums/threads/sword-shield-battle-mechanics-research.3655528/page-64#post-9244179
|
||||
enum EndTurnResolutionOrder
|
||||
{
|
||||
ENDTURN_ORDER,
|
||||
ENDTURN_VARIOUS,
|
||||
ENDTURN_WEATHER,
|
||||
ENDTURN_WEATHER_DAMAGE,
|
||||
ENDTURN_EMERGENCY_EXIT_1,
|
||||
ENDTURN_AFFECTION,
|
||||
ENDTURN_FUTURE_SIGHT,
|
||||
ENDTURN_WISH,
|
||||
ENDTURN_FIRST_EVENT_BLOCK,
|
||||
ENDTURN_EMERGENCY_EXIT_2,
|
||||
ENDTURN_AQUA_RING,
|
||||
ENDTURN_INGRAIN,
|
||||
ENDTURN_LEECH_SEED,
|
||||
ENDTURN_POISON,
|
||||
ENDTURN_BURN,
|
||||
ENDTURN_FROSTBITE,
|
||||
ENDTURN_NIGHTMARE,
|
||||
ENDTURN_CURSE,
|
||||
ENDTURN_WRAP,
|
||||
ENDTURN_SALT_CURE,
|
||||
ENDTURN_OCTOLOCK,
|
||||
ENDTURN_SYRUP_BOMB,
|
||||
ENDTURN_TAUNT,
|
||||
ENDTURN_TORMENT,
|
||||
ENDTURN_ENCORE,
|
||||
ENDTURN_DISABLE,
|
||||
ENDTURN_MAGNET_RISE,
|
||||
ENDTURN_TELEKINESIS,
|
||||
ENDTURN_HEAL_BLOCK,
|
||||
ENDTURN_EMBARGO,
|
||||
ENDTURN_YAWN,
|
||||
ENDTURN_PERISH_SONG,
|
||||
ENDTURN_ROOST,
|
||||
ENDTURN_EMERGENCY_EXIT_3,
|
||||
ENDTURN_SECOND_EVENT_BLOCK,
|
||||
ENDTURN_TRICK_ROOM,
|
||||
ENDTURN_GRAVITY,
|
||||
ENDTURN_WATER_SPORT,
|
||||
ENDTURN_MUD_SPORT,
|
||||
ENDTURN_WONDER_ROOM,
|
||||
ENDTURN_MAGIC_ROOM,
|
||||
ENDTURN_TERRAIN,
|
||||
ENDTURN_THIRD_EVENT_BLOCK,
|
||||
ENDTURN_EMERGENCY_EXIT_4,
|
||||
ENDTURN_FORM_CHANGE_ABILITIES,
|
||||
ENDTURN_EJECT_PACK,
|
||||
ENDTURN_DYNAMAX,
|
||||
ENDTURN_COUNT,
|
||||
};
|
||||
|
||||
// Block that handles effects for each individual battler on the field (eg residual damage)
|
||||
enum FirstEventBlock
|
||||
{
|
||||
FIRST_EVENT_BLOCK_GMAX_MOVE_RESIDUAL, // Needs to be split
|
||||
FIRST_EVENT_BLOCK_SEA_OF_FIRE_DAMAGE,
|
||||
FIRST_EVENT_BLOCK_THRASH, // Thrash isn't handled here in vanilla but for now it is that best place for it.
|
||||
FIRST_EVENT_BLOCK_GRASSY_TERRAIN_HEAL,
|
||||
FIRST_EVENT_BLOCK_ABILITIES,
|
||||
FIRST_EVENT_BLOCK_HEAL_ITEMS,
|
||||
};
|
||||
|
||||
// Block that tries to remove side statuses
|
||||
enum SecondEventBlock
|
||||
{
|
||||
SECOND_EVENT_BLOCK_REFLECT,
|
||||
SECOND_EVENT_BLOCK_LIGHT_SCREEN,
|
||||
SECOND_EVENT_BLOCK_SAFEGUARD,
|
||||
SECOND_EVENT_BLOCK_MIST,
|
||||
SECOND_EVENT_BLOCK_TAILWIND,
|
||||
SECOND_EVENT_BLOCK_LUCKY_CHANT,
|
||||
SECOND_EVENT_BLOCK_RAINBOW,
|
||||
SECOND_EVENT_BLOCK_SEA_OF_FIRE,
|
||||
SECOND_EVENT_BLOCK_SWAMP,
|
||||
SECOND_EVENT_BLOCK_AURORA_VEIL,
|
||||
};
|
||||
|
||||
// Block that handles Uproar, items and non-form changing abilities
|
||||
enum ThirdEventBlock
|
||||
{
|
||||
THIRD_EVENT_BLOCK_UPROAR,
|
||||
THIRD_EVENT_BLOCK_ABILITIES,
|
||||
THIRD_EVENT_BLOCK_ITEMS,
|
||||
};
|
||||
|
||||
static u32 GetBattlerSideForMessage(u32 side)
|
||||
{
|
||||
u32 battler = 0;
|
||||
@ -118,7 +30,7 @@ static bool32 HandleEndTurnOrder(u32 battler)
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleTurnCounter++;
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
|
||||
u32 i, j;
|
||||
struct BattleContext ctx = {0};
|
||||
@ -148,7 +60,7 @@ static bool32 HandleEndTurnVarious(u32 battler)
|
||||
u32 i;
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
|
||||
if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK && gFieldTimers.fairyLockTimer == gBattleTurnCounter)
|
||||
gFieldStatuses &= ~STATUS_FIELD_FAIRY_LOCK;
|
||||
@ -189,7 +101,7 @@ static bool32 HandleEndTurnVarious(u32 battler)
|
||||
|
||||
static bool32 HandleEndTurnWeather(u32 battler)
|
||||
{
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
return EndOrContinueWeather();
|
||||
}
|
||||
|
||||
@ -203,12 +115,12 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler)
|
||||
if (currBattleWeather == 0xFF)
|
||||
{
|
||||
// If there is no weather on the field, no need to check other battlers so go to next state
|
||||
gBattleStruct->turnEffectsBattlerId = 0;
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurnBattler = 0;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
return effect;
|
||||
}
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (!IsBattlerAlive(battler) || !HasWeatherEffect())
|
||||
return effect;
|
||||
@ -287,7 +199,7 @@ static bool32 HandleEndTurnEmergencyExit(u32 battler)
|
||||
bool32 effect = FALSE;
|
||||
enum Ability ability = GetBattlerAbility(battler);
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (EmergencyExitCanBeTriggered(battler))
|
||||
{
|
||||
@ -309,7 +221,7 @@ static bool32 HandleEndTurnAffection(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (!B_AFFECTION_MECHANICS
|
||||
|| !IsBattlerAlive(battler)
|
||||
@ -332,7 +244,7 @@ static bool32 HandleEndTurnFutureSight(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter)
|
||||
{
|
||||
@ -370,7 +282,7 @@ static bool32 HandleEndTurnWish(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gWishFutureKnock.wishCounter[battler] == gBattleTurnCounter && IsBattlerAlive(battler))
|
||||
{
|
||||
@ -410,12 +322,12 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler)
|
||||
|
||||
if (!IsBattlerAlive(battler))
|
||||
{
|
||||
gBattleStruct->eventBlockCounter = 0;
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBlock = 0;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
return effect;
|
||||
}
|
||||
|
||||
switch (gBattleStruct->eventBlockCounter)
|
||||
switch (gBattleStruct->eventState.endTurnBlock)
|
||||
{
|
||||
case FIRST_EVENT_BLOCK_GMAX_MOVE_RESIDUAL: // TODO: Has to be split into 3 statuses and needs a queue
|
||||
side = GetBattlerSide(battler);
|
||||
@ -430,7 +342,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler)
|
||||
effect = TRUE;
|
||||
}
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case FIRST_EVENT_BLOCK_SEA_OF_FIRE_DAMAGE:
|
||||
if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE)
|
||||
@ -442,7 +354,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler)
|
||||
BattleScriptExecute(BattleScript_HurtByTheSeaOfFire);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case FIRST_EVENT_BLOCK_THRASH:
|
||||
if (gBattleMons[battler].volatiles.lockConfusionTurns && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP)
|
||||
@ -464,7 +376,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler)
|
||||
}
|
||||
}
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case FIRST_EVENT_BLOCK_GRASSY_TERRAIN_HEAL:
|
||||
if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN
|
||||
@ -477,7 +389,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler)
|
||||
BattleScriptExecute(BattleScript_GrassyTerrainHeals);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case FIRST_EVENT_BLOCK_ABILITIES:
|
||||
{
|
||||
@ -493,14 +405,14 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
}
|
||||
case FIRST_EVENT_BLOCK_HEAL_ITEMS:
|
||||
if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsLeftoversActivation))
|
||||
effect = TRUE;
|
||||
gBattleStruct->eventBlockCounter = 0;
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBlock = 0;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -511,7 +423,7 @@ static bool32 HandleEndTurnAquaRing(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.aquaRing
|
||||
&& !gBattleMons[battler].volatiles.healBlock
|
||||
@ -530,7 +442,7 @@ static bool32 HandleEndTurnIngrain(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.root
|
||||
&& !gBattleMons[battler].volatiles.healBlock
|
||||
@ -549,7 +461,7 @@ static bool32 HandleEndTurnLeechSeed(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.leechSeed
|
||||
&& IsBattlerAlive(gBattleMons[battler].volatiles.leechSeed - 1)
|
||||
@ -591,7 +503,7 @@ static bool32 HandleEndTurnPoison(u32 battler)
|
||||
|
||||
enum Ability ability = GetBattlerAbility(battler);
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if ((gBattleMons[battler].status1 & STATUS1_POISON || gBattleMons[battler].status1 & STATUS1_TOXIC_POISON)
|
||||
&& IsBattlerAlive(battler)
|
||||
@ -632,7 +544,7 @@ static bool32 HandleEndTurnBurn(u32 battler)
|
||||
|
||||
enum Ability ability = GetBattlerAbility(battler);
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].status1 & STATUS1_BURN
|
||||
&& IsBattlerAlive(battler)
|
||||
@ -657,7 +569,7 @@ static bool32 HandleEndTurnFrostbite(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].status1 & STATUS1_FROSTBITE
|
||||
&& IsBattlerAlive(battler)
|
||||
@ -675,7 +587,7 @@ static bool32 HandleEndTurnNightmare(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.nightmare
|
||||
&& IsBattlerAlive(battler)
|
||||
@ -700,7 +612,7 @@ static bool32 HandleEndTurnCurse(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.cursed
|
||||
&& IsBattlerAlive(battler)
|
||||
@ -718,7 +630,7 @@ static bool32 HandleEndTurnWrap(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.wrapped && IsBattlerAlive(battler))
|
||||
{
|
||||
@ -755,7 +667,7 @@ static bool32 HandleEndTurnSaltCure(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.saltCure
|
||||
&& IsBattlerAlive(battler)
|
||||
@ -779,7 +691,7 @@ static bool32 HandleEndTurnOctolock(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gDisableStructs[battler].octolock)
|
||||
{
|
||||
@ -796,7 +708,7 @@ static bool32 HandleEndTurnSyrupBomb(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.syrupBomb && (IsBattlerAlive(battler)))
|
||||
{
|
||||
@ -815,7 +727,7 @@ static bool32 HandleEndTurnTaunt(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gDisableStructs[battler].tauntTimer && --gDisableStructs[battler].tauntTimer == 0)
|
||||
{
|
||||
@ -832,7 +744,7 @@ static bool32 HandleEndTurnTorment(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gDisableStructs[battler].tormentTimer == gBattleTurnCounter)
|
||||
{
|
||||
@ -849,7 +761,7 @@ static bool32 HandleEndTurnEncore(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gDisableStructs[battler].encoreTimer != 0)
|
||||
{
|
||||
@ -877,7 +789,7 @@ static bool32 HandleEndTurnDisable(u32 battler)
|
||||
bool32 effect = FALSE;
|
||||
|
||||
u32 moveIndex = 0;
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gDisableStructs[battler].disableTimer != 0)
|
||||
{
|
||||
@ -907,7 +819,7 @@ static bool32 HandleEndTurnMagnetRise(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.magnetRise && gDisableStructs[battler].magnetRiseTimer == gBattleTurnCounter)
|
||||
{
|
||||
@ -924,7 +836,7 @@ static bool32 HandleEndTurnTelekinesis(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.telekinesis && gDisableStructs[battler].telekinesisTimer == gBattleTurnCounter)
|
||||
{
|
||||
@ -940,7 +852,7 @@ static bool32 HandleEndTurnHealBlock(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.healBlock && gDisableStructs[battler].healBlockTimer == gBattleTurnCounter)
|
||||
{
|
||||
@ -958,7 +870,7 @@ static bool32 HandleEndTurnEmbargo(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.embargo && gDisableStructs[battler].embargoTimer == gBattleTurnCounter)
|
||||
{
|
||||
@ -976,7 +888,7 @@ static bool32 HandleEndTurnYawn(u32 battler)
|
||||
|
||||
enum Ability ability = GetBattlerAbility(battler);
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gBattleMons[battler].volatiles.yawn > 0)
|
||||
{
|
||||
@ -1036,7 +948,7 @@ static bool32 HandleEndTurnPerishSong(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (IsBattlerAlive(battler) && gBattleMons[battler].volatiles.perishSong)
|
||||
{
|
||||
@ -1062,7 +974,7 @@ static bool32 HandleEndTurnRoost(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (gDisableStructs[battler].roostActive)
|
||||
gDisableStructs[battler].roostActive = FALSE;
|
||||
@ -1074,9 +986,9 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
u32 side = gBattleStruct->turnSideTracker;
|
||||
u32 side = gBattleStruct->eventState.battlerSide;
|
||||
|
||||
switch (gBattleStruct->eventBlockCounter)
|
||||
switch (gBattleStruct->eventState.endTurnBlock)
|
||||
{
|
||||
case SECOND_EVENT_BLOCK_REFLECT:
|
||||
if (gSideStatuses[side] & SIDE_STATUS_REFLECT && gSideTimers[side].reflectTimer == gBattleTurnCounter)
|
||||
@ -1088,7 +1000,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
|
||||
PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_REFLECT);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case SECOND_EVENT_BLOCK_LIGHT_SCREEN:
|
||||
if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN && gSideTimers[side].lightscreenTimer == gBattleTurnCounter)
|
||||
@ -1100,7 +1012,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
|
||||
PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_LIGHT_SCREEN);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case SECOND_EVENT_BLOCK_SAFEGUARD:
|
||||
if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD && gSideTimers[side].safeguardTimer == gBattleTurnCounter)
|
||||
@ -1110,7 +1022,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
|
||||
BattleScriptExecute(BattleScript_SafeguardEnds);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case SECOND_EVENT_BLOCK_MIST:
|
||||
if (gSideTimers[side].mistTimer != 0 && gSideTimers[side].mistTimer == gBattleTurnCounter)
|
||||
@ -1122,7 +1034,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
|
||||
PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_MIST);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case SECOND_EVENT_BLOCK_TAILWIND:
|
||||
if (gSideStatuses[side] & SIDE_STATUS_TAILWIND && gSideTimers[side].tailwindTimer == gBattleTurnCounter)
|
||||
@ -1132,7 +1044,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
|
||||
BattleScriptExecute(BattleScript_TailwindEnds);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case SECOND_EVENT_BLOCK_LUCKY_CHANT:
|
||||
if (gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT && gSideTimers[side].luckyChantTimer == gBattleTurnCounter)
|
||||
@ -1142,7 +1054,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
|
||||
BattleScriptExecute(BattleScript_LuckyChantEnds);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case SECOND_EVENT_BLOCK_RAINBOW:
|
||||
gBattlerAttacker = GetBattlerSideForMessage(side);
|
||||
@ -1152,7 +1064,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
|
||||
BattleScriptExecute(BattleScript_TheRainbowDisappeared);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case SECOND_EVENT_BLOCK_SEA_OF_FIRE:
|
||||
if (gSideStatuses[side] & SIDE_STATUS_SEA_OF_FIRE && gSideTimers[side].seaOfFireTimer == gBattleTurnCounter)
|
||||
@ -1161,7 +1073,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
|
||||
BattleScriptExecute(BattleScript_TheSeaOfFireDisappeared);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case SECOND_EVENT_BLOCK_SWAMP:
|
||||
gBattlerAttacker = GetBattlerSideForMessage(side);
|
||||
@ -1171,7 +1083,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
|
||||
BattleScriptExecute(BattleScript_TheSwampDisappeared);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case SECOND_EVENT_BLOCK_AURORA_VEIL:
|
||||
if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL && gSideTimers[side].auroraVeilTimer == gBattleTurnCounter)
|
||||
@ -1183,8 +1095,8 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
|
||||
PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_AURORA_VEIL);
|
||||
effect = TRUE;
|
||||
}
|
||||
gBattleStruct->turnSideTracker++;
|
||||
gBattleStruct->eventBlockCounter = 0;
|
||||
gBattleStruct->eventState.battlerSide++;
|
||||
gBattleStruct->eventState.endTurnBlock = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1195,7 +1107,7 @@ static bool32 HandleEndTurnTrickRoom(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
|
||||
if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter)
|
||||
{
|
||||
@ -1211,7 +1123,7 @@ static bool32 HandleEndTurnGravity(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
|
||||
if (gFieldStatuses & STATUS_FIELD_GRAVITY && gFieldTimers.gravityTimer == gBattleTurnCounter)
|
||||
{
|
||||
@ -1227,7 +1139,7 @@ static bool32 HandleEndTurnWaterSport(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
|
||||
if (gFieldStatuses & STATUS_FIELD_WATERSPORT && gFieldTimers.waterSportTimer == gBattleTurnCounter)
|
||||
{
|
||||
@ -1243,7 +1155,7 @@ static bool32 HandleEndTurnMudSport(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
|
||||
if (gFieldStatuses & STATUS_FIELD_MUDSPORT && gFieldTimers.mudSportTimer == gBattleTurnCounter)
|
||||
{
|
||||
@ -1259,7 +1171,7 @@ static bool32 HandleEndTurnWonderRoom(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
|
||||
if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && gFieldTimers.wonderRoomTimer == gBattleTurnCounter)
|
||||
{
|
||||
@ -1275,7 +1187,7 @@ static bool32 HandleEndTurnMagicRoom(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
|
||||
if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && gFieldTimers.magicRoomTimer == gBattleTurnCounter)
|
||||
{
|
||||
@ -1305,7 +1217,7 @@ static bool32 HandleEndTurnTerrain(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
|
||||
if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)
|
||||
effect = EndTurnTerrain(STATUS_FIELD_ELECTRIC_TERRAIN, B_MSG_TERRAIN_END_ELECTRIC);
|
||||
@ -1325,11 +1237,11 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler)
|
||||
|
||||
if (!IsBattlerAlive(battler))
|
||||
{
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
return effect;
|
||||
}
|
||||
|
||||
switch (gBattleStruct->eventBlockCounter)
|
||||
switch (gBattleStruct->eventState.endTurnBlock)
|
||||
{
|
||||
case THIRD_EVENT_BLOCK_UPROAR:
|
||||
if (gBattleMons[battler].volatiles.uproarTurns)
|
||||
@ -1372,7 +1284,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler)
|
||||
effect = TRUE;
|
||||
}
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
case THIRD_EVENT_BLOCK_ABILITIES:
|
||||
{
|
||||
@ -1394,7 +1306,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter++;
|
||||
gBattleStruct->eventState.endTurnBlock++;
|
||||
break;
|
||||
}
|
||||
case THIRD_EVENT_BLOCK_ITEMS:
|
||||
@ -1416,8 +1328,8 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
gBattleStruct->eventBlockCounter = 0;
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBlock = 0;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1431,7 +1343,7 @@ static bool32 HandleEndTurnFormChangeAbilities(u32 battler)
|
||||
|
||||
enum Ability ability = GetBattlerAbility(battler);
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
switch (ability)
|
||||
{
|
||||
@ -1451,7 +1363,7 @@ static bool32 HandleEndTurnFormChangeAbilities(u32 battler)
|
||||
|
||||
static bool32 HandleEndTurnEjectPack(u32 battler)
|
||||
{
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
return TrySwitchInEjectPack(END_TURN);
|
||||
}
|
||||
|
||||
@ -1459,7 +1371,7 @@ static bool32 HandleEndTurnDynamax(u32 battler)
|
||||
{
|
||||
bool32 effect = FALSE;
|
||||
|
||||
gBattleStruct->turnEffectsBattlerId++;
|
||||
gBattleStruct->eventState.endTurnBattler++;
|
||||
|
||||
if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && gBattleStruct->dynamax.dynamaxTurns[battler] == gBattleTurnCounter)
|
||||
{
|
||||
@ -1543,21 +1455,21 @@ u32 DoEndTurnEffects(void)
|
||||
for (;;)
|
||||
{
|
||||
// If either turnEffectsBattlerId or turnSideTracker are at max count, reest values and go to the next state
|
||||
if (gBattleStruct->turnEffectsBattlerId == gBattlersCount || gBattleStruct->turnSideTracker == NUM_BATTLE_SIDES)
|
||||
if (gBattleStruct->eventState.endTurnBattler == gBattlersCount || gBattleStruct->eventState.battlerSide == NUM_BATTLE_SIDES)
|
||||
{
|
||||
gBattleStruct->turnEffectsBattlerId = 0;
|
||||
gBattleStruct->turnSideTracker = 0;
|
||||
gBattleStruct->eventBlockCounter = 0;
|
||||
gBattleStruct->endTurnEventsCounter++;
|
||||
gBattleStruct->eventState.endTurnBattler = 0;
|
||||
gBattleStruct->eventState.battlerSide = 0;
|
||||
gBattleStruct->eventState.endTurnBlock = 0;
|
||||
gBattleStruct->eventState.endTurn++;
|
||||
}
|
||||
|
||||
// Jump out if possible after endTurnEventsCounter was increased in the above code block
|
||||
if (gBattleStruct->endTurnEventsCounter == ENDTURN_COUNT)
|
||||
if (gBattleStruct->eventState.endTurn == ENDTURN_COUNT)
|
||||
return FALSE;
|
||||
|
||||
battler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId];
|
||||
battler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->eventState.endTurnBattler];
|
||||
|
||||
if (sEndTurnEffectHandlers[gBattleStruct->endTurnEventsCounter](battler))
|
||||
if (sEndTurnEffectHandlers[gBattleStruct->eventState.endTurn](battler))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2984,7 +2984,7 @@ void BeginBattleIntro(void)
|
||||
{
|
||||
BattleStartClearSetData();
|
||||
gBattleCommunication[1] = 0;
|
||||
gBattleStruct->introState = 0;
|
||||
gBattleStruct->eventState.battleIntro = 0;
|
||||
gBattleMainFunc = DoBattleIntro;
|
||||
}
|
||||
|
||||
@ -3261,7 +3261,7 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy)
|
||||
|
||||
gBattleStruct->choicedMove[battler] = MOVE_NONE;
|
||||
gCurrentMove = MOVE_NONE;
|
||||
gBattleStruct->arenaTurnCounter = 0xFF;
|
||||
gBattleStruct->eventState.arenaTurn = 0xFF;
|
||||
|
||||
// Restore struct member so replacement does not miss timing
|
||||
gSpecialStatuses[battler].switchInAbilityDone = FALSE;
|
||||
@ -3443,21 +3443,21 @@ static void DoBattleIntro(void)
|
||||
s32 i;
|
||||
u32 battler;
|
||||
|
||||
switch ((enum BattleIntroStates)gBattleStruct->introState)
|
||||
switch ((enum BattleIntroStates)gBattleStruct->eventState.battleIntro)
|
||||
{
|
||||
case BATTLE_INTRO_STATE_GET_MON_DATA:
|
||||
battler = gBattleCommunication[1];
|
||||
BtlController_EmitGetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0);
|
||||
MarkBattlerForControllerExec(battler);
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_LOOP_BATTLER_DATA:
|
||||
if (!gBattleControllerExecFlags)
|
||||
{
|
||||
if (++gBattleCommunication[1] == gBattlersCount)
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
else
|
||||
gBattleStruct->introState = BATTLE_INTRO_STATE_GET_MON_DATA;
|
||||
gBattleStruct->eventState.battleIntro = BATTLE_INTRO_STATE_GET_MON_DATA;
|
||||
}
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_PREPARE_BG_SLIDE:
|
||||
@ -3468,12 +3468,12 @@ static void DoBattleIntro(void)
|
||||
MarkBattlerForControllerExec(battler);
|
||||
gBattleCommunication[0] = 0;
|
||||
gBattleCommunication[1] = 0;
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
}
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_WAIT_FOR_BG_SLIDE:
|
||||
if (!gBattleControllerExecFlags)
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_DRAW_SPRITES:
|
||||
for (battler = 0; battler < gBattlersCount; battler++)
|
||||
@ -3554,9 +3554,9 @@ static void DoBattleIntro(void)
|
||||
}
|
||||
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
else // Skip party summary since it is a wild battle.
|
||||
gBattleStruct->introState = BATTLE_INTRO_STATE_INTRO_TEXT;
|
||||
gBattleStruct->eventState.battleIntro = BATTLE_INTRO_STATE_INTRO_TEXT;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_DRAW_PARTY_SUMMARY:
|
||||
if (!gBattleControllerExecFlags)
|
||||
@ -3601,18 +3601,18 @@ static void DoBattleIntro(void)
|
||||
BtlController_EmitDrawPartyStatusSummary(battler, B_COMM_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY);
|
||||
MarkBattlerForControllerExec(battler);
|
||||
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
}
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_WAIT_FOR_PARTY_SUMMARY:
|
||||
if (!gBattleControllerExecFlags)
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_INTRO_TEXT:
|
||||
if (!IsBattlerMarkedForControllerExec(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)))
|
||||
{
|
||||
PrepareStringBattle(STRINGID_INTROMSG, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT));
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
}
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_WAIT_FOR_INTRO_TEXT:
|
||||
@ -3620,14 +3620,14 @@ static void DoBattleIntro(void)
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
||||
{
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (B_FAST_INTRO_PKMN_TEXT == TRUE)
|
||||
gBattleStruct->introState = BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT;
|
||||
gBattleStruct->eventState.battleIntro = BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT;
|
||||
else
|
||||
gBattleStruct->introState = BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_2_SEND_OUT_ANIM;
|
||||
gBattleStruct->eventState.battleIntro = BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_2_SEND_OUT_ANIM;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -3636,11 +3636,11 @@ static void DoBattleIntro(void)
|
||||
PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT));
|
||||
else
|
||||
PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT));
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_SEND_OUT_TEXT:
|
||||
if (!gBattleControllerExecFlags)
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_TRAINER_1_SEND_OUT_ANIM:
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && !(gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER))
|
||||
@ -3650,7 +3650,7 @@ static void DoBattleIntro(void)
|
||||
|
||||
BtlController_EmitIntroTrainerBallThrow(battler, B_COMM_TO_CONTROLLER);
|
||||
MarkBattlerForControllerExec(battler);
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_TRAINER_2_SEND_OUT_ANIM:
|
||||
if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT)
|
||||
@ -3665,17 +3665,17 @@ static void DoBattleIntro(void)
|
||||
}
|
||||
if (B_FAST_INTRO_PKMN_TEXT == TRUE
|
||||
&& !(gBattleTypeFlags & (BATTLE_TYPE_RECORDED | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_LINK)))
|
||||
gBattleStruct->introState = BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT; // Print at the same time as trainer sends out second mon.
|
||||
gBattleStruct->eventState.battleIntro = BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT; // Print at the same time as trainer sends out second mon.
|
||||
else
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_WAIT_FOR_TRAINER_2_SEND_OUT_ANIM:
|
||||
if (!gBattleControllerExecFlags)
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_WAIT_FOR_WILD_BATTLE_TEXT:
|
||||
if (!IsBattlerMarkedForControllerExec(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)))
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_PRINT_PLAYER_SEND_OUT_TEXT:
|
||||
if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))
|
||||
@ -3696,7 +3696,7 @@ static void DoBattleIntro(void)
|
||||
|
||||
PrepareStringBattle(STRINGID_INTROSENDOUT, battler);
|
||||
}
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_WAIT_FOR_PLAYER_SEND_OUT_TEXT:
|
||||
if (!(gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleControllerExecFlags))
|
||||
@ -3707,7 +3707,7 @@ static void DoBattleIntro(void)
|
||||
battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
|
||||
|
||||
if (!IsBattlerMarkedForControllerExec(battler))
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
}
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_PRINT_PLAYER_1_SEND_OUT_TEXT:
|
||||
@ -3718,7 +3718,7 @@ static void DoBattleIntro(void)
|
||||
|
||||
BtlController_EmitIntroTrainerBallThrow(battler, B_COMM_TO_CONTROLLER);
|
||||
MarkBattlerForControllerExec(battler);
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_PRINT_PLAYER_2_SEND_OUT_TEXT:
|
||||
if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER))
|
||||
@ -3731,12 +3731,12 @@ static void DoBattleIntro(void)
|
||||
BtlController_EmitIntroTrainerBallThrow(battler, B_COMM_TO_CONTROLLER);
|
||||
MarkBattlerForControllerExec(battler);
|
||||
}
|
||||
gBattleStruct->introState++;
|
||||
gBattleStruct->eventState.battleIntro++;
|
||||
break;
|
||||
case BATTLE_INTRO_STATE_SET_DEX_AND_BATTLE_VARS:
|
||||
if (!gBattleControllerExecFlags)
|
||||
{
|
||||
gBattleStruct->eventsBeforeFirstTurnState = 0;
|
||||
gBattleStruct->eventState.beforeFristTurn = 0;
|
||||
gBattleStruct->switchInBattlerCounter = 0;
|
||||
Ai_InitPartyStruct(); // Save mons party counts, and first 2/4 mons on the battlefield.
|
||||
|
||||
@ -3774,7 +3774,7 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
if (gBattleControllerExecFlags)
|
||||
return;
|
||||
|
||||
switch ((enum FirstTurnEventsStates)gBattleStruct->eventsBeforeFirstTurnState)
|
||||
switch (gBattleStruct->eventState.beforeFristTurn)
|
||||
{
|
||||
case FIRST_TURN_EVENTS_START:
|
||||
// Set invalid mons as absent(for example when starting a double battle with only one pokemon).
|
||||
@ -3824,20 +3824,20 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
SwapTurnOrder(i, j);
|
||||
}
|
||||
}
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
break;
|
||||
case FIRST_TURN_EVENTS_OVERWORLD_WEATHER:
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
if (TryFieldEffects(FIELD_EFFECT_OVERWORLD_WEATHER))
|
||||
return;
|
||||
break;
|
||||
case FIRST_TURN_EVENTS_TERRAIN:
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
if (TryFieldEffects(FIELD_EFFECT_OVERWORLD_TERRAIN))
|
||||
return;
|
||||
break;
|
||||
case FIRST_TURN_EVENTS_STARTING_STATUS:
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
if (TryFieldEffects(FIELD_EFFECT_TRAINER_STATUSES))
|
||||
return;
|
||||
break;
|
||||
@ -3852,7 +3852,7 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
}
|
||||
}
|
||||
memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); // erase all totem boosts for Mirror Herb and Opportunist
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
break;
|
||||
case FIRST_TURN_EVENTS_NEUTRALIZING_GAS:
|
||||
while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest
|
||||
@ -3864,7 +3864,7 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
return;
|
||||
}
|
||||
gBattleStruct->switchInBattlerCounter = 0;
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
break;
|
||||
case FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES:
|
||||
while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest
|
||||
@ -3879,7 +3879,7 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
return;
|
||||
}
|
||||
gBattleStruct->switchInBattlerCounter = 0;
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
break;
|
||||
case FIRST_TURN_EVENTS_ITEM_EFFECTS:
|
||||
while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest
|
||||
@ -3889,7 +3889,7 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
return;
|
||||
}
|
||||
gBattleStruct->switchInBattlerCounter = 0;
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
break;
|
||||
case FIRST_TURN_EVENTS_WHITE_HERB:
|
||||
while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest
|
||||
@ -3899,7 +3899,7 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
return;
|
||||
}
|
||||
gBattleStruct->switchInBattlerCounter = 0;
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
break;
|
||||
case FIRST_TURN_EVENTS_OPPORTUNIST:
|
||||
while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest
|
||||
@ -3909,7 +3909,7 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
return;
|
||||
}
|
||||
gBattleStruct->switchInBattlerCounter = 0;
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
break;
|
||||
case FIRST_TURN_EVENTS_MIRROR_HERB:
|
||||
while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest
|
||||
@ -3919,10 +3919,10 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
return;
|
||||
}
|
||||
gBattleStruct->switchInBattlerCounter = 0;
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
break;
|
||||
case FIRST_TURN_EVENTS_EJECT_PACK:
|
||||
gBattleStruct->eventsBeforeFirstTurnState++;
|
||||
gBattleStruct->eventState.beforeFristTurn++;
|
||||
if (TrySwitchInEjectPack(FIRST_TURN))
|
||||
return;
|
||||
break;
|
||||
@ -3943,11 +3943,11 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++)
|
||||
gBattleCommunication[i] = 0;
|
||||
|
||||
gBattleStruct->eventBlockCounter = 0;
|
||||
gBattleStruct->turnEffectsBattlerId = 0;
|
||||
gBattleStruct->eventState.endTurnBlock = 0;
|
||||
gBattleStruct->eventState.endTurnBattler = 0;
|
||||
gBattleScripting.moveendState = 0;
|
||||
gBattleStruct->faintedActionsState = 0;
|
||||
gBattleStruct->endTurnEventsCounter = 0;
|
||||
gBattleStruct->eventState.faintedAction = 0;
|
||||
gBattleStruct->eventState.endTurn = 0;
|
||||
|
||||
memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts));
|
||||
SetShellSideArmCategory();
|
||||
@ -3961,7 +3961,7 @@ static void TryDoEventsBeforeFirstTurn(void)
|
||||
|
||||
if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_BEFORE_FIRST_TURN)))
|
||||
BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2);
|
||||
gBattleStruct->eventsBeforeFirstTurnState = 0;
|
||||
gBattleStruct->eventState.beforeFristTurn = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -3981,9 +3981,9 @@ static void HandleEndTurn_ContinueBattle(void)
|
||||
if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].volatiles.multipleTurns))
|
||||
CancelMultiTurnMoves(i, SKY_DROP_IGNORE);
|
||||
}
|
||||
gBattleStruct->eventBlockCounter = 0;
|
||||
gBattleStruct->turnEffectsBattlerId = 0;
|
||||
gBattleStruct->endTurnEventsCounter = 0;
|
||||
gBattleStruct->eventState.endTurnBlock = 0;
|
||||
gBattleStruct->eventState.endTurnBattler = 0;
|
||||
gBattleStruct->eventState.endTurn = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -4002,7 +4002,7 @@ void BattleTurnPassed(void)
|
||||
if (HandleFaintedMonActions())
|
||||
return;
|
||||
|
||||
gBattleStruct->faintedActionsState = 0;
|
||||
gBattleStruct->eventState.faintedAction = 0;
|
||||
|
||||
TurnValuesCleanUp(FALSE);
|
||||
gHitMarker &= ~HITMARKER_UNABLE_TO_USE_MOVE;
|
||||
@ -4025,7 +4025,7 @@ void BattleTurnPassed(void)
|
||||
if (gBattleResults.battleTurnCounter < 0xFF)
|
||||
{
|
||||
gBattleResults.battleTurnCounter++;
|
||||
gBattleStruct->arenaTurnCounter++;
|
||||
gBattleStruct->eventState.arenaTurn++;
|
||||
}
|
||||
|
||||
for (i = 0; i < gBattlersCount; i++)
|
||||
@ -4057,7 +4057,7 @@ void BattleTurnPassed(void)
|
||||
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
|
||||
BattleScriptExecute(BattleScript_PalacePrintFlavorText);
|
||||
else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaTurnCounter == 0)
|
||||
else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->eventState.arenaTurn == 0)
|
||||
BattleScriptExecute(BattleScript_ArenaTurnBeginning);
|
||||
else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_LAST_LOW_HP)))
|
||||
BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2);
|
||||
@ -5643,7 +5643,7 @@ static void HandleEndTurn_FinishBattle(void)
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
bool32 changedForm = TryRevertPartyMonFormChange(i);
|
||||
|
||||
|
||||
// Recalculate the stats of every party member before the end
|
||||
if (!changedForm && B_RECALCULATE_STATS >= GEN_5)
|
||||
CalculateMonStats(&gPlayerParty[i]);
|
||||
|
||||
@ -5939,7 +5939,7 @@ static void Cmd_moveend(void)
|
||||
{
|
||||
case MOVEEND_SET_VALUES:
|
||||
gBattleScripting.savedDmg += gBattleStruct->moveDamage[gBattlerTarget];
|
||||
gBattleStruct->moveEndBattlerId = 0;
|
||||
gBattleStruct->eventState.moveEndBattler = 0;
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
case MOVEEND_PROTECT_LIKE_EFFECT:
|
||||
@ -6556,21 +6556,21 @@ static void Cmd_moveend(void)
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
case MOVEEND_COLOR_CHANGE:
|
||||
while (gBattleStruct->moveEndBattlerId < gBattlersCount)
|
||||
while (gBattleStruct->eventState.moveEndBattler < gBattlersCount)
|
||||
{
|
||||
u32 battler = gBattleStruct->moveEndBattlerId++;
|
||||
u32 battler = gBattleStruct->eventState.moveEndBattler++;
|
||||
if (battler == gBattlerAttacker)
|
||||
continue;
|
||||
if (AbilityBattleEffects(ABILITYEFFECT_COLOR_CHANGE, battler, GetBattlerAbility(battler), 0, 0))
|
||||
return;
|
||||
}
|
||||
gBattleStruct->moveEndBattlerId = 0;
|
||||
gBattleStruct->eventState.moveEndBattler = 0;
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
case MOVEEND_KEE_MARANGA_HP_THRESHOLD_ITEM_TARGET:
|
||||
while (gBattleStruct->moveEndBattlerId < gBattlersCount)
|
||||
while (gBattleStruct->eventState.moveEndBattler < gBattlersCount)
|
||||
{
|
||||
u32 battlerDef = gBattleStruct->moveEndBattlerId++;
|
||||
u32 battlerDef = gBattleStruct->eventState.moveEndBattler++;
|
||||
if (battlerDef == gBattlerAttacker)
|
||||
continue;
|
||||
enum HoldEffect holdEffect = GetBattlerHoldEffect(battlerDef);
|
||||
@ -6805,53 +6805,53 @@ static void Cmd_moveend(void)
|
||||
break;
|
||||
|
||||
case MOVEEND_ITEMS_EFFECTS_ALL:
|
||||
while (gBattleStruct->moveEndBattlerId < gBattlersCount)
|
||||
while (gBattleStruct->eventState.moveEndBattler < gBattlersCount)
|
||||
{
|
||||
u32 battler = gBattleStruct->moveEndBattlerId++;
|
||||
u32 battler = gBattleStruct->eventState.moveEndBattler++;
|
||||
enum HoldEffect holdEffect = GetBattlerHoldEffect(battler);
|
||||
if (ItemBattleEffects(battler, 0, holdEffect, IsOnStatusChangeActivation)
|
||||
|| ItemBattleEffects(battler, 0, holdEffect, IsOnHpThresholdActivation))
|
||||
return;
|
||||
}
|
||||
gBattleStruct->moveEndBattlerId = 0;
|
||||
gBattleStruct->eventState.moveEndBattler = 0;
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
case MOVEEND_WHITE_HERB:
|
||||
while (gBattleStruct->moveEndBattlerId < gBattlersCount)
|
||||
while (gBattleStruct->eventState.moveEndBattler < gBattlersCount)
|
||||
{
|
||||
u32 battler = gBattleStruct->moveEndBattlerId++;
|
||||
u32 battler = gBattleStruct->eventState.moveEndBattler++;
|
||||
if (!IsBattlerAlive(battler))
|
||||
continue;
|
||||
|
||||
if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsWhiteHerbActivation))
|
||||
return;
|
||||
}
|
||||
gBattleStruct->moveEndBattlerId = 0;
|
||||
gBattleStruct->eventState.moveEndBattler = 0;
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
case MOVEEND_OPPORTUNIST:
|
||||
while (gBattleStruct->moveEndBattlerId < gBattlersCount)
|
||||
while (gBattleStruct->eventState.moveEndBattler < gBattlersCount)
|
||||
{
|
||||
u32 battler = gBattleStruct->moveEndBattlerId++;
|
||||
u32 battler = gBattleStruct->eventState.moveEndBattler++;
|
||||
if (!IsBattlerAlive(battler))
|
||||
continue;
|
||||
if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, GetBattlerAbility(battler), 0, 0))
|
||||
return;
|
||||
}
|
||||
gBattleStruct->moveEndBattlerId = 0;
|
||||
gBattleStruct->eventState.moveEndBattler = 0;
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
case MOVEEND_MIRROR_HERB:
|
||||
while (gBattleStruct->moveEndBattlerId < gBattlersCount)
|
||||
while (gBattleStruct->eventState.moveEndBattler < gBattlersCount)
|
||||
{
|
||||
u32 battler = gBattleStruct->moveEndBattlerId++;
|
||||
u32 battler = gBattleStruct->eventState.moveEndBattler++;
|
||||
if (!IsBattlerAlive(battler))
|
||||
continue;
|
||||
|
||||
if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsMirrorHerbActivation))
|
||||
return;
|
||||
}
|
||||
gBattleStruct->moveEndBattlerId = 0;
|
||||
gBattleStruct->eventState.moveEndBattler = 0;
|
||||
gBattleScripting.moveendState++;
|
||||
break;
|
||||
case MOVEEND_PICKPOCKET:
|
||||
@ -8541,9 +8541,9 @@ static void Cmd_hidepartystatussummary(void)
|
||||
static void ResetValuesForCalledMove(void)
|
||||
{
|
||||
if (gBattlerByTurnOrder[gCurrentTurnActionNumber] != gBattlerAttacker)
|
||||
gBattleStruct->atkCancellerTracker = 0;
|
||||
gBattleStruct->eventState.atkCanceller = 0;
|
||||
else
|
||||
gBattleStruct->atkCancellerTracker = CANCELLER_VOLATILE_BLOCKED;
|
||||
gBattleStruct->eventState.atkCanceller = CANCELLER_VOLATILE_BLOCKED;
|
||||
gBattleScripting.animTurn = 0;
|
||||
gBattleScripting.animTargetsHit = 0;
|
||||
SetTypeBeforeUsingMove(gCurrentMove, gBattlerAttacker);
|
||||
|
||||
@ -433,7 +433,7 @@ void HandleAction_UseMove(void)
|
||||
return;
|
||||
}
|
||||
|
||||
gBattleStruct->atkCancellerTracker = 0;
|
||||
gBattleStruct->eventState.atkCanceller = 0;
|
||||
ClearDamageCalcResults();
|
||||
gMultiHitCounter = 0;
|
||||
gBattleScripting.savedDmg = 0;
|
||||
@ -904,7 +904,7 @@ void HandleAction_TryFinish(void)
|
||||
{
|
||||
if (!HandleFaintedMonActions())
|
||||
{
|
||||
gBattleStruct->faintedActionsState = 0;
|
||||
gBattleStruct->eventState.faintedAction = 0;
|
||||
gCurrentActionFuncId = B_ACTION_FINISHED;
|
||||
}
|
||||
}
|
||||
@ -1787,7 +1787,7 @@ void TryToRevertMimicryAndFlags(void)
|
||||
bool32 BattleArenaTurnEnd(void)
|
||||
{
|
||||
if ((gBattleTypeFlags & BATTLE_TYPE_ARENA)
|
||||
&& gBattleStruct->arenaTurnCounter == 2
|
||||
&& gBattleStruct->eventState.arenaTurn == 2
|
||||
&& IsBattlerAlive(B_POSITION_PLAYER_LEFT) && IsBattlerAlive(B_POSITION_OPPONENT_LEFT))
|
||||
{
|
||||
for (u32 battler = 0; battler < 2; battler++)
|
||||
@ -1821,7 +1821,6 @@ bool32 IsAbilityAndRecord(u32 battler, enum Ability battlerAbility, enum Ability
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#define FAINTED_ACTIONS_MAX_CASE 6
|
||||
bool32 HandleFaintedMonActions(void)
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
|
||||
@ -1829,38 +1828,38 @@ bool32 HandleFaintedMonActions(void)
|
||||
do
|
||||
{
|
||||
s32 i;
|
||||
switch (gBattleStruct->faintedActionsState)
|
||||
switch (gBattleStruct->eventState.faintedAction)
|
||||
{
|
||||
case 0:
|
||||
gBattleStruct->faintedActionsBattlerId = 0;
|
||||
gBattleStruct->faintedActionsState++;
|
||||
case FAINTED_ACTIONS_NO_MONS_TO_SWITCH:
|
||||
gBattleStruct->eventState.faintedActionBattler = 0;
|
||||
gBattleStruct->eventState.faintedAction++;
|
||||
for (i = 0; i < gBattlersCount; i++)
|
||||
{
|
||||
if (gAbsentBattlerFlags & (1u << i) && !HasNoMonsToSwitch(i, PARTY_SIZE, PARTY_SIZE))
|
||||
gAbsentBattlerFlags &= ~(1u << i);
|
||||
}
|
||||
// fall through
|
||||
case 1:
|
||||
case FAINTED_ACTIONS_GIVE_EXP:
|
||||
do
|
||||
{
|
||||
gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId;
|
||||
if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0
|
||||
&& !(gBattleStruct->givenExpMons & (1u << gBattlerPartyIndexes[gBattleStruct->faintedActionsBattlerId]))
|
||||
&& !(gAbsentBattlerFlags & (1u << gBattleStruct->faintedActionsBattlerId)))
|
||||
gBattlerFainted = gBattlerTarget = gBattleStruct->eventState.faintedActionBattler;
|
||||
if (gBattleMons[gBattleStruct->eventState.faintedActionBattler].hp == 0
|
||||
&& !(gBattleStruct->givenExpMons & (1u << gBattlerPartyIndexes[gBattleStruct->eventState.faintedActionBattler]))
|
||||
&& !(gAbsentBattlerFlags & (1u << gBattleStruct->eventState.faintedActionBattler)))
|
||||
{
|
||||
BattleScriptExecute(BattleScript_GiveExp);
|
||||
gBattleStruct->faintedActionsState = 2;
|
||||
gBattleStruct->eventState.faintedAction = 2;
|
||||
return TRUE;
|
||||
}
|
||||
} while (++gBattleStruct->faintedActionsBattlerId != gBattlersCount);
|
||||
gBattleStruct->faintedActionsState = 3;
|
||||
} while (++gBattleStruct->eventState.faintedActionBattler != gBattlersCount);
|
||||
gBattleStruct->eventState.faintedAction = 3;
|
||||
break;
|
||||
case 2:
|
||||
case FAINTED_ACTIONS_SET_ABSENT_FLAGS:
|
||||
OpponentSwitchInResetSentPokesToOpponentValue(gBattlerFainted);
|
||||
if (++gBattleStruct->faintedActionsBattlerId == gBattlersCount)
|
||||
gBattleStruct->faintedActionsState = 3;
|
||||
if (++gBattleStruct->eventState.faintedActionBattler == gBattlersCount)
|
||||
gBattleStruct->eventState.faintedAction = 3;
|
||||
else
|
||||
gBattleStruct->faintedActionsState = 1;
|
||||
gBattleStruct->eventState.faintedAction = 1;
|
||||
// Don't switch mons until all pokemon performed their actions or the battle's over.
|
||||
if (B_FAINT_SWITCH_IN >= GEN_4
|
||||
&& gBattleOutcome == 0
|
||||
@ -1868,11 +1867,11 @@ bool32 HandleFaintedMonActions(void)
|
||||
&& gCurrentTurnActionNumber != gBattlersCount)
|
||||
{
|
||||
gAbsentBattlerFlags |= 1u << gBattlerFainted;
|
||||
if (gBattleStruct->faintedActionsState != 1)
|
||||
if (gBattleStruct->eventState.faintedAction != 1)
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
case FAINTED_ACTIONS_WAIT_STATE:
|
||||
// Don't switch mons until all pokemon performed their actions or the battle's over.
|
||||
if (B_FAINT_SWITCH_IN >= GEN_4
|
||||
&& gBattleOutcome == 0
|
||||
@ -1881,33 +1880,33 @@ bool32 HandleFaintedMonActions(void)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
gBattleStruct->faintedActionsBattlerId = 0;
|
||||
gBattleStruct->faintedActionsState++;
|
||||
gBattleStruct->eventState.faintedActionBattler = 0;
|
||||
gBattleStruct->eventState.faintedAction++;
|
||||
// fall through
|
||||
case 4:
|
||||
case FAINTED_ACTIONS_HANDLE_FAINTED_MON:
|
||||
do
|
||||
{
|
||||
gBattlerFainted = gBattlerTarget = gBattleStruct->faintedActionsBattlerId;
|
||||
if (gBattleMons[gBattleStruct->faintedActionsBattlerId].hp == 0
|
||||
&& !(gAbsentBattlerFlags & (1u << gBattleStruct->faintedActionsBattlerId)))
|
||||
gBattlerFainted = gBattlerTarget = gBattleStruct->eventState.faintedActionBattler;
|
||||
if (gBattleMons[gBattleStruct->eventState.faintedActionBattler].hp == 0
|
||||
&& !(gAbsentBattlerFlags & (1u << gBattleStruct->eventState.faintedActionBattler)))
|
||||
{
|
||||
BattleScriptExecute(BattleScript_HandleFaintedMon);
|
||||
gBattleStruct->faintedActionsState = 5;
|
||||
gBattleStruct->eventState.faintedAction = 5;
|
||||
return TRUE;
|
||||
}
|
||||
} while (++gBattleStruct->faintedActionsBattlerId != gBattlersCount);
|
||||
gBattleStruct->faintedActionsState = FAINTED_ACTIONS_MAX_CASE;
|
||||
} while (++gBattleStruct->eventState.faintedActionBattler != gBattlersCount);
|
||||
gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_MAX_CASE;
|
||||
break;
|
||||
case 5:
|
||||
if (++gBattleStruct->faintedActionsBattlerId == gBattlersCount)
|
||||
gBattleStruct->faintedActionsState = FAINTED_ACTIONS_MAX_CASE;
|
||||
case FAINTED_ACTIONS_HANDLE_NEXT_BATTLER:
|
||||
if (++gBattleStruct->eventState.faintedActionBattler == gBattlersCount)
|
||||
gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_MAX_CASE;
|
||||
else
|
||||
gBattleStruct->faintedActionsState = 4;
|
||||
gBattleStruct->eventState.faintedAction = 4;
|
||||
break;
|
||||
case FAINTED_ACTIONS_MAX_CASE:
|
||||
break;
|
||||
}
|
||||
} while (gBattleStruct->faintedActionsState != FAINTED_ACTIONS_MAX_CASE);
|
||||
} while (gBattleStruct->eventState.faintedAction != FAINTED_ACTIONS_MAX_CASE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -2977,10 +2976,10 @@ enum MoveCanceller AtkCanceller_MoveSuccessOrder(struct BattleContext *ctx)
|
||||
{
|
||||
enum MoveCanceller effect = MOVE_STEP_SUCCESS;
|
||||
|
||||
while (gBattleStruct->atkCancellerTracker < CANCELLER_END && effect == MOVE_STEP_SUCCESS)
|
||||
while (gBattleStruct->eventState.atkCanceller < CANCELLER_END && effect == MOVE_STEP_SUCCESS)
|
||||
{
|
||||
effect = sMoveSuccessOrderCancellers[gBattleStruct->atkCancellerTracker](ctx);
|
||||
gBattleStruct->atkCancellerTracker++;
|
||||
effect = sMoveSuccessOrderCancellers[gBattleStruct->eventState.atkCanceller](ctx);
|
||||
gBattleStruct->eventState.atkCanceller++;
|
||||
}
|
||||
|
||||
if (effect == MOVE_STEP_REMOVES_STATUS)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user