Moved some fields to BattlerState/PartyState (#7409)
This commit is contained in:
parent
e7cf162180
commit
cf4bb3e286
@ -582,7 +582,9 @@ struct BattlerState
|
||||
u32 stompingTantrumTimer:2;
|
||||
u32 canPickupItem:1;
|
||||
u32 itemCanBeKnockedOff:1;
|
||||
u32 padding:16;
|
||||
u32 ateBoost:1;
|
||||
u32 commanderSpecies:11;
|
||||
u32 padding:4;
|
||||
// End of Word
|
||||
};
|
||||
|
||||
@ -594,7 +596,9 @@ struct PartyState
|
||||
u32 battleBondBoost:1;
|
||||
u32 transformZeroToHero:1;
|
||||
u32 supersweetSyrup:1;
|
||||
u32 padding:26;
|
||||
u32 timesGotHit:5;
|
||||
u32 changedSpecies:11; // For forms when multiple mons can change into the same pokemon.
|
||||
u32 padding:10;
|
||||
};
|
||||
|
||||
// Cleared at the beginning of the battle. Fields need to be cleared when needed manually otherwise.
|
||||
@ -702,7 +706,6 @@ struct BattleStruct
|
||||
u8 savedBattlerAttacker[5];
|
||||
u8 savedTargetCount:4;
|
||||
u8 savedAttackerCount:4;
|
||||
bool8 ateBoost[MAX_BATTLERS_COUNT];
|
||||
u8 abilityPopUpSpriteIds[MAX_BATTLERS_COUNT][NUM_BATTLE_SIDES]; // two per battler
|
||||
struct ZMoveData zmove;
|
||||
struct DynamaxData dynamax;
|
||||
@ -717,7 +720,6 @@ struct BattleStruct
|
||||
u8 soulheartBattlerId;
|
||||
u8 friskedBattler; // Frisk needs to identify 2 battlers in double battles.
|
||||
u8 sameMoveTurns[MAX_BATTLERS_COUNT]; // For Metronome, number of times the same moves has been SUCCESFULLY used.
|
||||
u16 changedSpecies[NUM_BATTLE_SIDES][PARTY_SIZE]; // For forms when multiple mons can change into the same pokemon.
|
||||
u8 quickClawBattlerId;
|
||||
struct LostItem itemLost[NUM_BATTLE_SIDES][PARTY_SIZE]; // Pokemon that had items consumed or stolen (two bytes per party member per side)
|
||||
u8 blunderPolicy:1; // should blunder policy activate
|
||||
@ -745,13 +747,11 @@ struct BattleStruct
|
||||
s32 aiDelayTimer; // Counts number of frames AI takes to choose an action.
|
||||
s32 aiDelayFrames; // Number of frames it took to choose an action.
|
||||
s32 aiDelayCycles; // Number of cycles it took to choose an action.
|
||||
u8 timesGotHit[NUM_BATTLE_SIDES][PARTY_SIZE];
|
||||
u8 stickySyrupdBy[MAX_BATTLERS_COUNT];
|
||||
u8 supremeOverlordCounter[MAX_BATTLERS_COUNT];
|
||||
u8 shellSideArmCategory[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT];
|
||||
u8 speedTieBreaks; // MAX_BATTLERS_COUNT! values.
|
||||
enum DamageCategory categoryOverride:8; // for Z-Moves and Max Moves
|
||||
u16 commanderActive[MAX_BATTLERS_COUNT];
|
||||
u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side
|
||||
u8 monCausingSleepClause[NUM_BATTLE_SIDES]; // Stores which pokemon on a given side is causing Sleep Clause to be active as the mon's index in the party
|
||||
u16 opponentMonCanTera:6;
|
||||
@ -1218,6 +1218,11 @@ static inline struct Pokemon *GetBattlerParty(u32 battler)
|
||||
return GetSideParty(GetBattlerSide(battler));
|
||||
}
|
||||
|
||||
static inline struct PartyState *GetBattlerPartyState(u32 battler)
|
||||
{
|
||||
return &gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]];
|
||||
}
|
||||
|
||||
static inline bool32 IsDoubleBattle(void)
|
||||
{
|
||||
return gBattleTypeFlags & BATTLE_TYPE_DOUBLE;
|
||||
|
||||
@ -48,7 +48,7 @@ enum FormChanges
|
||||
FORM_CHANGE_WITHDRAW,
|
||||
// Form change that activates when the Pokémon faints, either in battle or in the overworld by poison.
|
||||
// If species is not specified and it's on the player's side, it will try to use the value
|
||||
// saved in gBattleStruct->changedSpecies from a previous form change.
|
||||
// saved in gBattleStruct->partyState[x][y].changedSpecies from a previous form change.
|
||||
// - No parameters.
|
||||
FORM_CHANGE_FAINT,
|
||||
// Form change that activates when the Pokémon is sent out at the beginning of a battle
|
||||
@ -56,7 +56,7 @@ enum FormChanges
|
||||
// param2: a move that will be replaced, optional
|
||||
// param3: a new move to replace it with, optional
|
||||
FORM_CHANGE_BEGIN_BATTLE,
|
||||
// Form change that activates at the end of a battle. If species is not specified and it's on the player's side, it will try to use the value saved in gBattleStruct->changedSpecies from a previous form change.
|
||||
// Form change that activates at the end of a battle. If species is not specified and it's on the player's side, it will try to use the value saved in gBattleStruct->partyState[x][y].changedSpecies from a previous form change.
|
||||
// param1: item to hold, optional
|
||||
// param2: a move that will be replaced, optional
|
||||
// param3: a new move to replace it with, optional
|
||||
|
||||
@ -3878,6 +3878,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
|
||||
ADJUST_SCORE(DECENT_EFFECT);
|
||||
break;
|
||||
case EFFECT_STRENGTH_SAP:
|
||||
{
|
||||
u32 atkStat = gBattleMons[battlerDef].attack;
|
||||
u32 atkStage = gBattleMons[battlerDef].statStages[STAT_ATK];
|
||||
atkStat *= gStatStageRatios[atkStage][0];
|
||||
@ -3890,6 +3891,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
|
||||
ADJUST_SCORE(WEAK_EFFECT);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EFFECT_EXPLOSION:
|
||||
case EFFECT_MISTY_EXPLOSION:
|
||||
case EFFECT_MEMENTO:
|
||||
|
||||
@ -9632,7 +9632,7 @@ void AnimTask_RandomBool(u8 taskId)
|
||||
// Credit to Skeli
|
||||
#define PRIMAL_PULSE_SCALE_SIZE 16
|
||||
#define PRIMAL_PULSE_FRAME_COUNT 4
|
||||
static const union AffineAnimCmd sSpriteAffineAnim_PrimalSymbol[] =
|
||||
static const union AffineAnimCmd sSpriteAffineAnim_PrimalSymbol[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(16, 16, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(32, 32, 0, 15),
|
||||
@ -9679,7 +9679,7 @@ const union AffineAnimCmd* const gSpriteAffineAnimTable_MegaSymbol[] =
|
||||
// Used for determining which animation to use for Order Up
|
||||
void AnimTask_GetCommanderType(u8 taskId)
|
||||
{
|
||||
switch (gBattleStruct->commanderActive[gEffectBattler])
|
||||
switch (gBattleStruct->battlerState[gEffectBattler].commanderSpecies)
|
||||
{
|
||||
case SPECIES_TATSUGIRI_CURLY:
|
||||
gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_CURLY;
|
||||
@ -9694,6 +9694,6 @@ void AnimTask_GetCommanderType(u8 taskId)
|
||||
gBattleAnimArgs[ARG_RET_ID] = ANIM_ORDER_UP_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
@ -940,7 +940,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bo
|
||||
{
|
||||
// Get base form if its currently Gigantamax
|
||||
if (IsGigantamaxed(battlerDef))
|
||||
targetSpecies = gBattleStruct->changedSpecies[GetBattlerSide(battlerDef)][gBattlerPartyIndexes[battlerDef]];
|
||||
targetSpecies = GetBattlerPartyState(battlerDef)->changedSpecies;
|
||||
else if (gBattleStruct->illusion[battlerDef].state == ILLUSION_ON)
|
||||
targetSpecies = GetIllusionMonSpecies(battlerDef);
|
||||
else
|
||||
|
||||
@ -3367,7 +3367,7 @@ const u8* FaintClearSetData(u32 battler)
|
||||
|
||||
ClearPursuitValuesIfSet(battler);
|
||||
|
||||
if (gBattleStruct->commanderActive[battler] != SPECIES_NONE)
|
||||
if (gBattleStruct->battlerState[battler].commanderSpecies != SPECIES_NONE)
|
||||
{
|
||||
u32 partner = BATTLE_PARTNER(battler);
|
||||
if (IsBattlerAlive(partner))
|
||||
@ -5340,7 +5340,7 @@ static void CheckChangingTurnOrderEffects(void)
|
||||
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
|
||||
{
|
||||
gBattleStruct->battlerState[i].focusPunchBattlers = FALSE;
|
||||
gBattleStruct->ateBoost[i] = FALSE;
|
||||
gBattleStruct->battlerState[i].ateBoost = FALSE;
|
||||
gSpecialStatuses[i].gemBoost = FALSE;
|
||||
}
|
||||
|
||||
@ -5612,8 +5612,8 @@ static void HandleEndTurn_FinishBattle(void)
|
||||
changedForm = TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE);
|
||||
|
||||
// Clear original species field
|
||||
gBattleStruct->changedSpecies[B_SIDE_PLAYER][i] = SPECIES_NONE;
|
||||
gBattleStruct->changedSpecies[B_SIDE_OPPONENT][i] = SPECIES_NONE;
|
||||
gBattleStruct->partyState[B_SIDE_PLAYER][i].changedSpecies = SPECIES_NONE;
|
||||
gBattleStruct->partyState[B_SIDE_OPPONENT][i].changedSpecies = SPECIES_NONE;
|
||||
|
||||
// Recalculate the stats of every party member before the end
|
||||
if (!changedForm && B_RECALCULATE_STATS >= GEN_5)
|
||||
@ -6045,7 +6045,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState
|
||||
{
|
||||
u32 ateType = TrySetAteType(move, battler, ability);
|
||||
if (ateType != TYPE_NONE && state == MON_IN_BATTLE)
|
||||
gBattleStruct->ateBoost[battler] = TRUE;
|
||||
gBattleStruct->battlerState[battler].ateBoost = TRUE;
|
||||
return ateType;
|
||||
}
|
||||
else if (moveEffect != EFFECT_CHANGE_TYPE_ON_ITEM
|
||||
@ -6057,7 +6057,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState
|
||||
&& gimmick != GIMMICK_Z_MOVE)
|
||||
{
|
||||
if (state == MON_IN_BATTLE && gimmick != GIMMICK_DYNAMAX)
|
||||
gBattleStruct->ateBoost[battler] = TRUE;
|
||||
gBattleStruct->battlerState[battler].ateBoost = TRUE;
|
||||
return TYPE_NORMAL;
|
||||
}
|
||||
|
||||
@ -6071,7 +6071,7 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler)
|
||||
enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE);
|
||||
|
||||
gBattleStruct->dynamicMoveType = 0;
|
||||
gBattleStruct->ateBoost[battler] = FALSE;
|
||||
gBattleStruct->battlerState[battler].ateBoost = FALSE;
|
||||
gSpecialStatuses[battler].gemBoost = FALSE;
|
||||
|
||||
moveType = GetDynamicMoveType(GetBattlerMon(battler),
|
||||
@ -6165,4 +6165,4 @@ void BattleDebug_WonBattle(void)
|
||||
{
|
||||
gBattleOutcome |= B_OUTCOME_WON;
|
||||
gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F];
|
||||
}
|
||||
}
|
||||
|
||||
@ -2107,7 +2107,7 @@ static inline bool32 TryActivateWeaknessBerry(u32 battlerDef)
|
||||
{
|
||||
gBattleScripting.battler = battlerDef;
|
||||
gLastUsedItem = gBattleMons[battlerDef].item;
|
||||
gBattleStruct->partyState[GetBattlerSide(battlerDef)][gBattlerPartyIndexes[battlerDef]].ateBerry = TRUE;
|
||||
GetBattlerPartyState(battlerDef)->ateBerry = TRUE;
|
||||
BattleScriptCall(BattleScript_BerryReduceDmg);
|
||||
return TRUE;
|
||||
}
|
||||
@ -2361,10 +2361,9 @@ static void Cmd_datahpupdate(void)
|
||||
else if (DoesDisguiseBlockMove(battler, gCurrentMove))
|
||||
{
|
||||
// TODO: Convert this to a proper FORM_CHANGE type.
|
||||
u32 side = GetBattlerSide(battler);
|
||||
gBattleScripting.battler = battler;
|
||||
if (gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battler]] == SPECIES_NONE)
|
||||
gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battler]] = gBattleMons[battler].species;
|
||||
if (GetBattlerPartyState(battler)->changedSpecies == SPECIES_NONE)
|
||||
GetBattlerPartyState(battler)->changedSpecies = gBattleMons[battler].species;
|
||||
if (gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED)
|
||||
gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED_TOTEM;
|
||||
else
|
||||
@ -2445,7 +2444,7 @@ static void Cmd_datahpupdate(void)
|
||||
if (gBattlerAttacker != gBattlerTarget
|
||||
&& GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS
|
||||
&& IsBattlerTurnDamaged(gBattlerTarget))
|
||||
gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]]++;
|
||||
GetBattlerPartyState(gBattlerTarget)->timesGotHit++;
|
||||
|
||||
if (GetMoveEffect(gCurrentMove) == EFFECT_KNOCK_OFF
|
||||
&& IsBattlerTurnDamaged(gBattlerTarget)
|
||||
@ -2574,9 +2573,8 @@ static void Cmd_resultmessage(void)
|
||||
if (gDisableStructs[gBattlerTarget].iceFaceActivationPrevention)
|
||||
{
|
||||
gDisableStructs[gBattlerTarget].iceFaceActivationPrevention = FALSE;
|
||||
u32 side = GetBattlerSide(gBattlerTarget);
|
||||
if (gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] == SPECIES_NONE)
|
||||
gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] = gBattleMons[gBattlerTarget].species;
|
||||
if (GetBattlerPartyState(gBattlerTarget)->changedSpecies == SPECIES_NONE)
|
||||
GetBattlerPartyState(gBattlerTarget)->changedSpecies = gBattleMons[gBattlerTarget].species;
|
||||
gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE;
|
||||
gBattleScripting.battler = gBattlerTarget; // For STRINGID_PKMNTRANSFORMED
|
||||
BattleScriptCall(BattleScript_IceFaceNullsDamage);
|
||||
@ -3016,7 +3014,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai
|
||||
gBattleScripting.moveEffect = MOVE_EFFECT_NONE;
|
||||
else if (!(gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT)
|
||||
&& TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)
|
||||
&& !(GetMoveEffect(gCurrentMove) == EFFECT_ORDER_UP && gBattleStruct->commanderActive[gBattlerAttacker])
|
||||
&& !(GetMoveEffect(gCurrentMove) == EFFECT_ORDER_UP && gBattleStruct->battlerState[gBattlerAttacker].commanderSpecies != SPECIES_NONE)
|
||||
&& !primary)
|
||||
gBattleScripting.moveEffect = MOVE_EFFECT_NONE;
|
||||
else if (!IsBattlerAlive(gEffectBattler) && !activateAfterFaint)
|
||||
@ -3602,7 +3600,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai
|
||||
{
|
||||
u32 stat = 0;
|
||||
bool32 commanderAffected = TRUE;
|
||||
switch (gBattleStruct->commanderActive[gEffectBattler])
|
||||
switch (gBattleStruct->battlerState[gEffectBattler].commanderSpecies)
|
||||
{
|
||||
case SPECIES_TATSUGIRI_CURLY:
|
||||
stat = STAT_ATK;
|
||||
@ -5664,18 +5662,16 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move
|
||||
|| NumFaintedBattlersByAttacker(battlerAtk) == 0)
|
||||
break;
|
||||
|
||||
u32 side = GetBattlerSide(battlerAtk);
|
||||
|
||||
if (gBattleStruct->partyState[side][gBattlerPartyIndexes[battlerAtk]].battleBondBoost)
|
||||
if (GetBattlerPartyState(battlerAtk)->battleBondBoost)
|
||||
break;
|
||||
|
||||
if (GetGenConfig(GEN_CONFIG_BATTLE_BOND) < GEN_9 && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_BATTLE_BOND)
|
||||
{
|
||||
// TODO: Convert this to a proper FORM_CHANGE type.
|
||||
gLastUsedAbility = abilityAtk;
|
||||
gBattleStruct->partyState[side][gBattlerPartyIndexes[battlerAtk]].battleBondBoost = TRUE;
|
||||
GetBattlerPartyState(battlerAtk)->battleBondBoost = TRUE;
|
||||
PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battlerAtk].species);
|
||||
gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[battlerAtk]] = gBattleMons[battlerAtk].species;
|
||||
GetBattlerPartyState(battlerAtk)->changedSpecies = gBattleMons[battlerAtk].species;
|
||||
gBattleMons[battlerAtk].species = SPECIES_GRENINJA_ASH;
|
||||
BattleScriptCall(BattleScript_BattleBondActivatesOnMoveEndAttacker);
|
||||
effect = TRUE;
|
||||
@ -5706,7 +5702,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move
|
||||
|
||||
gLastUsedAbility = abilityAtk;
|
||||
gBattlerAbility = battlerAtk;
|
||||
gBattleStruct->partyState[side][gBattlerPartyIndexes[battlerAtk]].battleBondBoost = TRUE;
|
||||
GetBattlerPartyState(battlerAtk)->battleBondBoost = TRUE;
|
||||
BattleScriptCall(BattleScript_EffectBattleBondStatIncrease);
|
||||
effect = TRUE;
|
||||
}
|
||||
@ -6558,7 +6554,7 @@ static void Cmd_moveend(void)
|
||||
gBattleScripting.battler = battler;
|
||||
gEffectBattler = gBattlerAttacker;
|
||||
BattleScriptPushCursor();
|
||||
if (gBattleStruct->commanderActive[gBattlerAttacker] != SPECIES_NONE
|
||||
if (gBattleStruct->battlerState[gBattlerAttacker].commanderSpecies != SPECIES_NONE
|
||||
|| GetBattlerAbility(gBattlerAttacker) == ABILITY_GUARD_DOG
|
||||
|| GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX)
|
||||
gBattlescriptCurrInstr = BattleScript_RedCardActivationNoSwitch;
|
||||
@ -6911,7 +6907,7 @@ static void Cmd_moveend(void)
|
||||
// #endif
|
||||
}
|
||||
gProtectStructs[gBattlerAttacker].shellTrap = FALSE;
|
||||
gBattleStruct->ateBoost[gBattlerAttacker] = FALSE;
|
||||
gBattleStruct->battlerState[gBattlerAttacker].ateBoost = FALSE;
|
||||
gSpecialStatuses[gBattlerAttacker].gemBoost = FALSE;
|
||||
gSpecialStatuses[gBattlerTarget].berryReduced = FALSE;
|
||||
gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = FALSE;
|
||||
@ -6943,10 +6939,10 @@ static void Cmd_moveend(void)
|
||||
gBattleStruct->battlerState[gBattlerAttacker].targetsDone[i] = FALSE;
|
||||
gProtectStructs[i].tryEjectPack = FALSE;
|
||||
|
||||
if (gBattleStruct->commanderActive[i] != SPECIES_NONE && !IsBattlerAlive(i))
|
||||
if (gBattleStruct->battlerState[i].commanderSpecies != SPECIES_NONE && !IsBattlerAlive(i))
|
||||
{
|
||||
u32 partner = BATTLE_PARTNER(i);
|
||||
gBattleStruct->commanderActive[i] = SPECIES_NONE;
|
||||
gBattleStruct->battlerState[i].commanderSpecies = SPECIES_NONE;
|
||||
if (IsBattlerAlive(partner))
|
||||
gStatuses3[partner] &= ~STATUS3_COMMANDER;
|
||||
}
|
||||
@ -8586,7 +8582,7 @@ static bool32 TryCheekPouch(u32 battler, u32 itemId)
|
||||
if (GetItemPocket(itemId) == POCKET_BERRIES
|
||||
&& GetBattlerAbility(battler) == ABILITY_CHEEK_POUCH
|
||||
&& !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)
|
||||
&& gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry
|
||||
&& GetBattlerPartyState(battler)->ateBerry
|
||||
&& !IsBattlerAtMaxHp(battler))
|
||||
{
|
||||
gBattleStruct->cheekPouchActivated = TRUE;
|
||||
@ -11186,8 +11182,8 @@ static void Cmd_transformdataexecution(void)
|
||||
gDisableStructs[gBattlerAttacker].mimickedMoves = 0;
|
||||
gDisableStructs[gBattlerAttacker].usedMoves = 0;
|
||||
|
||||
timesGotHit = gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]];
|
||||
gBattleStruct->timesGotHit[GetBattlerSide(gBattlerAttacker)][gBattlerPartyIndexes[gBattlerAttacker]] = timesGotHit;
|
||||
timesGotHit = GetBattlerPartyState(gBattlerTarget)->timesGotHit;
|
||||
GetBattlerPartyState(gBattlerAttacker)->timesGotHit = timesGotHit;
|
||||
|
||||
PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].species)
|
||||
|
||||
@ -16121,7 +16117,7 @@ void BS_JumpIfCommanderActive(void)
|
||||
{
|
||||
NATIVE_ARGS(const u8 *jumpInstr);
|
||||
|
||||
if (gBattleStruct->commanderActive[gBattlerTarget] != SPECIES_NONE)
|
||||
if (gBattleStruct->battlerState[gBattlerTarget].commanderSpecies != SPECIES_NONE)
|
||||
gBattlescriptCurrInstr = cmd->jumpInstr;
|
||||
else if (gStatuses3[gBattlerTarget] & STATUS3_COMMANDER)
|
||||
gBattlescriptCurrInstr = cmd->jumpInstr;
|
||||
@ -18160,7 +18156,7 @@ void BS_ConsumeBerry(void)
|
||||
if (cmd->fromBattler)
|
||||
gLastUsedItem = gBattleMons[battler].item;
|
||||
|
||||
gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry = TRUE;
|
||||
GetBattlerPartyState(battler)->ateBerry = TRUE;
|
||||
gBattleScripting.battler = gEffectBattler = gBattlerTarget = battler; // Cover all berry effect battler cases. e.g. ChangeStatBuffs uses target ID
|
||||
if (ItemBattleEffects(ITEMEFFECT_USE_LAST_ITEM, battler))
|
||||
return;
|
||||
|
||||
@ -1292,7 +1292,7 @@ bool32 IsBelchPreventingMove(u32 battler, u32 move)
|
||||
if (GetMoveEffect(move) != EFFECT_BELCH)
|
||||
return FALSE;
|
||||
|
||||
return !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry;
|
||||
return !GetBattlerPartyState(battler)->ateBerry;
|
||||
}
|
||||
|
||||
// Dynamax bypasses all selection prevention except Taunt and Assault Vest.
|
||||
@ -3291,7 +3291,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
u32 side = 0;
|
||||
u32 i = 0, j = 0;
|
||||
u32 partner = 0;
|
||||
struct Pokemon *mon;
|
||||
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
|
||||
return 0;
|
||||
@ -3915,12 +3914,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
break;
|
||||
case ABILITY_SUPERSWEET_SYRUP:
|
||||
if (!gSpecialStatuses[battler].switchInAbilityDone
|
||||
&& !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].supersweetSyrup)
|
||||
&& !GetBattlerPartyState(battler)->supersweetSyrup)
|
||||
{
|
||||
SaveBattlerAttacker(gBattlerAttacker);
|
||||
gBattlerAttacker = battler;
|
||||
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
|
||||
gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].supersweetSyrup = TRUE;
|
||||
GetBattlerPartyState(battler)->supersweetSyrup = TRUE;
|
||||
BattleScriptPushCursorAndCallback(BattleScript_SupersweetSyrupActivates);
|
||||
effect++;
|
||||
}
|
||||
@ -3956,10 +3955,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
break;
|
||||
case ABILITY_INTREPID_SWORD:
|
||||
if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)
|
||||
&& !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].intrepidSwordBoost)
|
||||
&& !GetBattlerPartyState(battler)->intrepidSwordBoost)
|
||||
{
|
||||
if (B_INTREPID_SWORD == GEN_9)
|
||||
gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].intrepidSwordBoost = TRUE;
|
||||
GetBattlerPartyState(battler)->intrepidSwordBoost = TRUE;
|
||||
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
|
||||
SET_STATCHANGER(STAT_ATK, 1, FALSE);
|
||||
BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn);
|
||||
@ -3968,10 +3967,10 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
break;
|
||||
case ABILITY_DAUNTLESS_SHIELD:
|
||||
if (!gSpecialStatuses[battler].switchInAbilityDone && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN)
|
||||
&& !gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].dauntlessShieldBoost)
|
||||
&& !GetBattlerPartyState(battler)->dauntlessShieldBoost)
|
||||
{
|
||||
if (B_DAUNTLESS_SHIELD == GEN_9)
|
||||
gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].dauntlessShieldBoost = TRUE;
|
||||
GetBattlerPartyState(battler)->dauntlessShieldBoost = TRUE;
|
||||
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
|
||||
SET_STATCHANGER(STAT_DEF, 1, FALSE);
|
||||
BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn);
|
||||
@ -4080,15 +4079,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
}
|
||||
break;
|
||||
case ABILITY_ZERO_TO_HERO:
|
||||
side = GetBattlerSide(battler);
|
||||
mon = GetBattlerMon(battler);
|
||||
|
||||
if (!gSpecialStatuses[battler].switchInAbilityDone
|
||||
&& GetMonData(mon, MON_DATA_SPECIES) == SPECIES_PALAFIN_HERO
|
||||
&& !gBattleStruct->partyState[side][gBattlerPartyIndexes[battler]].transformZeroToHero)
|
||||
&& GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES) == SPECIES_PALAFIN_HERO
|
||||
&& !GetBattlerPartyState(battler)->transformZeroToHero)
|
||||
{
|
||||
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
|
||||
gBattleStruct->partyState[side][gBattlerPartyIndexes[battler]].transformZeroToHero = TRUE;
|
||||
GetBattlerPartyState(battler)->transformZeroToHero = TRUE;
|
||||
BattleScriptPushCursorAndCallback(BattleScript_ZeroToHeroActivates);
|
||||
effect++;
|
||||
}
|
||||
@ -4162,7 +4158,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
if (!gSpecialStatuses[battler].switchInAbilityDone
|
||||
&& IsBattlerAlive(partner)
|
||||
&& IsBattlerAlive(battler)
|
||||
&& gBattleStruct->commanderActive[partner] == SPECIES_NONE
|
||||
&& gBattleStruct->battlerState[partner].commanderSpecies == SPECIES_NONE
|
||||
&& gBattleMons[partner].species == SPECIES_DONDOZO
|
||||
&& GET_BASE_SPECIES_ID(GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)) == SPECIES_TATSUGIRI)
|
||||
{
|
||||
@ -4170,7 +4166,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
|
||||
gBattlerAttacker = partner;
|
||||
gBattleStruct->battlerState[battler].commandingDondozo = TRUE;
|
||||
gBattleStruct->commanderActive[partner] = gBattleMons[battler].species;
|
||||
gBattleStruct->battlerState[partner].commanderSpecies = gBattleMons[battler].species;
|
||||
gStatuses3[battler] |= STATUS3_COMMANDER;
|
||||
if (gBattleMons[battler].volatiles.confusionTurns > 0
|
||||
&& !(gStatuses4[battler] & STATUS4_INFINITE_CONFUSION))
|
||||
@ -4708,6 +4704,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_POISON_POINT, 30) : RandomChance(RNG_POISON_POINT, 1, 3))
|
||||
{
|
||||
POISON_POINT:
|
||||
{
|
||||
u32 abilityAtk = GetBattlerAbility(gBattlerAttacker);
|
||||
if (IsBattlerAlive(gBattlerAttacker)
|
||||
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
||||
@ -4723,11 +4720,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
effect++;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ABILITY_STATIC:
|
||||
if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_STATIC, 30) : RandomChance(RNG_STATIC, 1, 3))
|
||||
{
|
||||
STATIC:
|
||||
{
|
||||
u32 abilityAtk = GetBattlerAbility(gBattlerAttacker);
|
||||
if (IsBattlerAlive(gBattlerAttacker)
|
||||
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
||||
@ -4743,6 +4742,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
|
||||
effect++;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ABILITY_FLAME_BODY:
|
||||
if (IsBattlerAlive(gBattlerAttacker)
|
||||
@ -5490,7 +5490,7 @@ u32 IsAbilityPreventingEscape(u32 battler)
|
||||
|
||||
bool32 CanBattlerEscape(u32 battler) // no ability check
|
||||
{
|
||||
if (gBattleStruct->commanderActive[battler] != SPECIES_NONE)
|
||||
if (gBattleStruct->battlerState[battler].commanderSpecies != SPECIES_NONE)
|
||||
return FALSE;
|
||||
else if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SHED_SHELL)
|
||||
return TRUE;
|
||||
@ -7289,7 +7289,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler)
|
||||
|
||||
// Berry was successfully used on a Pokemon.
|
||||
if (effect && (gLastUsedItem >= FIRST_BERRY_INDEX && gLastUsedItem <= LAST_BERRY_INDEX))
|
||||
gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].ateBerry = TRUE;
|
||||
GetBattlerPartyState(battler)->ateBerry = TRUE;
|
||||
|
||||
return effect;
|
||||
}
|
||||
@ -8213,7 +8213,7 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx)
|
||||
basePower = GetMaxMovePower(gBattleMons[battlerAtk].moves[gBattleStruct->chosenMovePositions[battlerAtk]]);
|
||||
break;
|
||||
case EFFECT_RAGE_FIST:
|
||||
basePower += 50 * gBattleStruct->timesGotHit[GetBattlerSide(battlerAtk)][gBattlerPartyIndexes[battlerAtk]];
|
||||
basePower += 50 * GetBattlerPartyState(battlerAtk)->timesGotHit;
|
||||
basePower = (basePower > 350) ? 350 : basePower;
|
||||
break;
|
||||
case EFFECT_FICKLE_BEAM:
|
||||
@ -8382,23 +8382,23 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx)
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(1.5));
|
||||
break;
|
||||
case ABILITY_PIXILATE:
|
||||
if (moveType == TYPE_FAIRY && gBattleStruct->ateBoost[battlerAtk])
|
||||
if (moveType == TYPE_FAIRY && gBattleStruct->battlerState[battlerAtk].ateBoost)
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3));
|
||||
break;
|
||||
case ABILITY_GALVANIZE:
|
||||
if (moveType == TYPE_ELECTRIC && gBattleStruct->ateBoost[battlerAtk])
|
||||
if (moveType == TYPE_ELECTRIC && gBattleStruct->battlerState[battlerAtk].ateBoost)
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3));
|
||||
break;
|
||||
case ABILITY_REFRIGERATE:
|
||||
if (moveType == TYPE_ICE && gBattleStruct->ateBoost[battlerAtk])
|
||||
if (moveType == TYPE_ICE && gBattleStruct->battlerState[battlerAtk].ateBoost)
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3));
|
||||
break;
|
||||
case ABILITY_AERILATE:
|
||||
if (moveType == TYPE_FLYING && gBattleStruct->ateBoost[battlerAtk])
|
||||
if (moveType == TYPE_FLYING && gBattleStruct->battlerState[battlerAtk].ateBoost)
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3));
|
||||
break;
|
||||
case ABILITY_NORMALIZE:
|
||||
if (moveType == TYPE_NORMAL && gBattleStruct->ateBoost[battlerAtk] && GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7)
|
||||
if (moveType == TYPE_NORMAL && gBattleStruct->battlerState[battlerAtk].ateBoost && GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7)
|
||||
modifier = uq4_12_multiply(modifier, UQ_4_12(1.2));
|
||||
break;
|
||||
case ABILITY_PUNK_ROCK:
|
||||
@ -10160,7 +10160,6 @@ bool32 CanBattlerFormChange(u32 battler, enum FormChanges method)
|
||||
bool32 TryBattleFormChange(u32 battler, enum FormChanges method)
|
||||
{
|
||||
u32 monId = gBattlerPartyIndexes[battler];
|
||||
u32 side = GetBattlerSide(battler);
|
||||
struct Pokemon *party = GetBattlerParty(battler);
|
||||
u32 currentSpecies = GetMonData(&party[monId], MON_DATA_SPECIES);
|
||||
u32 targetSpecies;
|
||||
@ -10174,8 +10173,9 @@ bool32 TryBattleFormChange(u32 battler, enum FormChanges method)
|
||||
if (targetSpecies != currentSpecies)
|
||||
{
|
||||
// Saves the original species on the first form change.
|
||||
if (gBattleStruct->changedSpecies[side][monId] == SPECIES_NONE)
|
||||
gBattleStruct->changedSpecies[side][monId] = gBattleMons[battler].species;
|
||||
|
||||
if (GetBattlerPartyState(battler)->changedSpecies == SPECIES_NONE)
|
||||
GetBattlerPartyState(battler)->changedSpecies = gBattleMons[battler].species;
|
||||
|
||||
TryToSetBattleFormChangeMoves(&party[monId], method);
|
||||
SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies);
|
||||
@ -10183,7 +10183,7 @@ bool32 TryBattleFormChange(u32 battler, enum FormChanges method)
|
||||
RecalcBattlerStats(battler, &party[monId], method == FORM_CHANGE_BATTLE_GIGANTAMAX);
|
||||
return TRUE;
|
||||
}
|
||||
else if (gBattleStruct->changedSpecies[side][monId] != SPECIES_NONE)
|
||||
else if (GetBattlerPartyState(battler)->changedSpecies != SPECIES_NONE)
|
||||
{
|
||||
bool32 restoreSpecies = FALSE;
|
||||
|
||||
@ -10204,7 +10204,8 @@ bool32 TryBattleFormChange(u32 battler, enum FormChanges method)
|
||||
u32 abilityForm = gBattleMons[battler].ability;
|
||||
// Reverts the original species
|
||||
TryToSetBattleFormChangeMoves(&party[monId], method);
|
||||
SetMonData(&party[monId], MON_DATA_SPECIES, &gBattleStruct->changedSpecies[side][monId]);
|
||||
u32 changedSpecies = GetBattlerPartyState(battler)->changedSpecies;
|
||||
SetMonData(&party[monId], MON_DATA_SPECIES, &changedSpecies);
|
||||
RecalcBattlerStats(battler, &party[monId], method == FORM_CHANGE_BATTLE_GIGANTAMAX);
|
||||
// Battler data is not updated with regular form's ability, not doing so could cause wrong ability activation.
|
||||
if (method == FORM_CHANGE_FAINT)
|
||||
|
||||
@ -6829,8 +6829,8 @@ bool32 TryFormChange(u32 monId, u32 side, enum FormChanges method)
|
||||
u32 currentSpecies = GetMonData(&party[monId], MON_DATA_SPECIES);
|
||||
u32 targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0);
|
||||
|
||||
if (targetSpecies == currentSpecies && gBattleStruct != NULL && gBattleStruct->changedSpecies[side][monId] != SPECIES_NONE)
|
||||
targetSpecies = gBattleStruct->changedSpecies[side][monId];
|
||||
if (targetSpecies == currentSpecies && gBattleStruct != NULL && gBattleStruct->partyState[side][monId].changedSpecies != SPECIES_NONE)
|
||||
targetSpecies = gBattleStruct->partyState[side][monId].changedSpecies;
|
||||
|
||||
if (targetSpecies != currentSpecies)
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user