Create BattleStruct sub struct for event states (#8131)

This commit is contained in:
Alex 2025-11-04 19:34:54 +01:00 committed by GitHub
parent be5f6d4801
commit 80b5d81a9a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 312 additions and 291 deletions

View File

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

View File

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

View 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

View File

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

View File

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

View File

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

View File

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