diff --git a/include/battle.h b/include/battle.h index b834fc195b..176adf7343 100644 --- a/include/battle.h +++ b/include/battle.h @@ -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; diff --git a/include/constants/form_change_types.h b/include/constants/form_change_types.h index 10de5f785f..f43f3bddc6 100644 --- a/include/constants/form_change_types.h +++ b/include/constants/form_change_types.h @@ -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 diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 1b22be4ac5..f06a4e8f6d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -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: diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 00281253fa..1263632ab7 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -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); } diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 7135cb8905..37c5b12d60 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -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 diff --git a/src/battle_main.c b/src/battle_main.c index 8c4ba46261..2b3edabad2 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -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]; -} \ No newline at end of file +} diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f834742279..8a1e1a1740 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -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; diff --git a/src/battle_util.c b/src/battle_util.c index d62d41af58..1346b9f0da 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -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) diff --git a/src/pokemon.c b/src/pokemon.c index 85ef8a2fc9..6433acd701 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -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) {