optimize battle util and item functions by setting u32 variables

This commit is contained in:
DizzyEggg 2023-09-13 00:02:26 +02:00
parent 44bd830d2a
commit 9778587935
5 changed files with 211 additions and 204 deletions

View File

@ -65,7 +65,6 @@ s8 GetMovePriority(u32 battlerId, u16 move);
u8 GetWhoStrikesFirst(u8 battlerId1, u8 battlerId2, bool8 ignoreChosenMoves);
void RunBattleScriptCommands_PopCallbacksStack(void);
void RunBattleScriptCommands(void);
bool8 TryRunFromBattle(u8 battlerId);
void SpecialStatusesClear(void);
void SetTypeBeforeUsingMove(u16 move, u32 battlerAtk);
bool32 IsWildMonSmart(void);

View File

@ -101,6 +101,7 @@ bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move);
void HandleAction_UseMove(void);
void HandleAction_Switch(void);
void HandleAction_UseItem(void);
bool32 TryRunFromBattle(u32 battler);
void HandleAction_Run(void);
void HandleAction_WatchesCarefully(void);
void HandleAction_SafariZoneBallThrow(void);
@ -115,59 +116,59 @@ u8 GetBattlerForBattleScript(u8 caseId);
void PressurePPLose(u8 target, u8 attacker, u16 move);
void PressurePPLoseOnUsingPerishSong(u8 attacker);
void PressurePPLoseOnUsingImprison(u8 attacker);
bool32 IsBattlerMarkedForControllerExec(u8 battler);
void MarkBattlerForControllerExec(u8 battler);
void MarkBattlerReceivedLinkData(u8 battler);
void CancelMultiTurnMoves(u8 battler);
bool8 WasUnableToUseMove(u8 battler);
void PrepareStringBattle(u16 stringId, u8 battler);
bool32 IsBattlerMarkedForControllerExec(u32 battler);
void MarkBattlerForControllerExec(u32 battler);
void MarkBattlerReceivedLinkData(u32 battler);
void CancelMultiTurnMoves(u32 battler);
bool32 WasUnableToUseMove(u32 battler);
void PrepareStringBattle(u16 stringId, u32 battler);
void ResetSentPokesToOpponentValue(void);
void OpponentSwitchInResetSentPokesToOpponentValue(u8 battler);
void UpdateSentPokesToOpponentValue(u8 battler);
void OpponentSwitchInResetSentPokesToOpponentValue(u32 battler);
void UpdateSentPokesToOpponentValue(u32 battler);
void BattleScriptPush(const u8 *bsPtr);
void BattleScriptPushCursor(void);
void BattleScriptPop(void);
u32 TrySetCantSelectMoveBattleScript(u32 battler);
u8 CheckMoveLimitations(u8 battler, u8 unusableMoves, u16 check);
u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check);
bool32 AreAllMovesUnusable(u32 battler);
u8 GetImprisonedMovesCount(u8 battler, u16 move);
u8 GetImprisonedMovesCount(u32 battler, u16 move);
u8 DoFieldEndTurnEffects(void);
s32 GetDrainedBigRootHp(u32 battler, s32 hp);
u8 DoBattlerEndTurnEffects(void);
bool8 HandleWishPerishSongOnTurnEnd(void);
bool8 HandleFaintedMonActions(void);
bool32 HandleWishPerishSongOnTurnEnd(void);
bool32 HandleFaintedMonActions(void);
void TryClearRageAndFuryCutter(void);
u8 AtkCanceller_UnableToUseMove(u32 moveType);
void SetAtkCancellerForCalledMove(void);
u8 AtkCanceller_UnableToUseMove2(void);
bool8 HasNoMonsToSwitch(u8 battler, u8 r1, u8 r2);
bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility);
u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 moveArg);
bool32 TryPrimalReversion(u8 battler);
bool32 HasNoMonsToSwitch(u32 battler, u8 r1, u8 r2);
bool32 TryChangeBattleWeather(u32 battler, u32 weatherEnumId, bool32 viaAbility);
u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg);
bool32 TryPrimalReversion(u32 battler);
bool32 IsNeutralizingGasOnField(void);
u32 GetBattlerAbility(u8 battler);
u32 GetBattlerAbility(u32 battler);
u32 IsAbilityOnSide(u32 battler, u32 ability);
u32 IsAbilityOnOpposingSide(u32 battler, u32 ability);
u32 IsAbilityOnField(u32 ability);
u32 IsAbilityOnFieldExcept(u32 battler, u32 ability);
u32 IsAbilityPreventingEscape(u32 battler);
bool32 IsBattlerProtected(u8 battler, u16 move);
bool32 IsBattlerProtected(u32 battler, u32 move);
bool32 CanBattlerEscape(u32 battler); // no ability check
void BattleScriptExecute(const u8 *BS_ptr);
void BattleScriptPushCursorAndCallback(const u8 *BS_ptr);
u8 ItemBattleEffects(u8 caseID, u8 battler, bool8 moveTurn);
void ClearFuryCutterDestinyBondGrudge(u8 battler);
u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn);
void ClearFuryCutterDestinyBondGrudge(u32 battler);
void HandleAction_RunBattleScript(void);
u32 SetRandomTarget(u32 battler);
u32 GetMoveTarget(u16 move, u8 setTarget);
u8 IsMonDisobedient(void);
u32 GetBattlerHoldEffect(u32 battler, bool32 checkNegating);
u32 GetBattlerHoldEffectParam(u8 battler);
bool32 IsMoveMakingContact(u16 move, u32 battlerAtk);
bool32 IsBattlerGrounded(u8 battler);
bool32 IsBattlerAlive(u8 battler);
u8 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u16 move);
u32 GetBattlerWeight(u8 battler);
u32 GetBattlerHoldEffectParam(u32 battler);
bool32 IsMoveMakingContact(u32 move, u32 battlerAtk);
bool32 IsBattlerGrounded(u32 battler);
bool32 IsBattlerAlive(u32 battler);
u32 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u32 move);
u32 GetBattlerWeight(u32 battler);
u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer);
u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter);
s32 CalculateMoveDamage(u32 move, u32 battlerAtk, u32 battlerDef, u32 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor, bool32 updateFlags);
@ -175,46 +176,46 @@ s32 CalculateMoveDamageAndEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef
uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, bool32 recordAbilities);
uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef);
uq4_12_t GetTypeModifier(u32 atkType, u32 defType);
s32 GetStealthHazardDamage(u8 hazardType, u8 battler);
s32 GetStealthHazardDamage(u8 hazardType, u32 battler);
s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 maxHp);
bool32 CanMegaEvolve(u8 battler);
bool32 CanUltraBurst(u8 battler);
bool32 IsBattlerMegaEvolved(u8 battler);
bool32 IsBattlerPrimalReverted(u8 battler);
bool32 IsBattlerUltraBursted(u8 battler);
u16 GetBattleFormChangeTargetSpecies(u8 battler, u16 method);
bool32 TryBattleFormChange(u8 battler, u16 method);
bool32 CanMegaEvolve(u32 battler);
bool32 CanUltraBurst(u32 battler);
bool32 IsBattlerMegaEvolved(u32 battler);
bool32 IsBattlerPrimalReverted(u32 battler);
bool32 IsBattlerUltraBursted(u32 battler);
u16 GetBattleFormChangeTargetSpecies(u32 battler, u16 method);
bool32 TryBattleFormChange(u32 battler, u16 method);
bool32 DoBattlersShareType(u32 battler1, u32 battler2);
bool32 CanBattlerGetOrLoseItem(u8 battler, u16 itemId);
bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId);
u32 GetIllusionMonSpecies(u32 battler);
struct Pokemon *GetIllusionMonPtr(u32 battler);
void ClearIllusionMon(u32 battler);
bool32 SetIllusionMon(struct Pokemon *mon, u32 battler);
bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 battler);
bool32 ShouldGetStatBadgeBoost(u16 flagId, u32 battler);
u8 GetBattleMoveSplit(u32 moveId);
bool32 CanFling(u32 battler);
bool32 IsTelekinesisBannedSpecies(u16 species);
bool32 IsHealBlockPreventingMove(u32 battler, u32 move);
bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId);
bool32 IsPartnerMonFromSameTrainer(u8 battler);
u8 GetSplitBasedOnStats(u8 battler);
bool32 TestSheerForceFlag(u8 battler, u16 move);
bool32 IsPartnerMonFromSameTrainer(u32 battler);
u8 GetSplitBasedOnStats(u32 battler);
bool32 TestSheerForceFlag(u32 battler, u16 move);
void TryRestoreHeldItems(void);
bool32 CanStealItem(u8 battlerStealing, u8 battlerItem, u16 item);
void TrySaveExchangedItem(u8 battler, u16 stolenItem);
bool32 IsPartnerMonFromSameTrainer(u8 battler);
u8 TryHandleSeed(u8 battler, u32 terrainFlag, u8 statId, u16 itemId, bool32 execute);
bool32 IsBattlerAffectedByHazards(u8 battler, bool32 toxicSpikes);
void SortBattlersBySpeed(u8 *battlers, bool8 slowToFast);
bool32 CompareStat(u8 battler, u8 statId, u8 cmpTo, u8 cmpKind);
bool32 TryRoomService(u8 battler);
void BufferStatChange(u8 battler, u8 statId, u8 stringId);
bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u32 battlerDef, bool32 checkTarget);
u16 GetUsedHeldItem(u8 battler);
bool32 IsBattlerWeatherAffected(u8 battler, u32 weatherFlags);
u32 GetBattlerMoveTargetType(u8 battler, u16 move);
bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item);
void TrySaveExchangedItem(u32 battler, u16 stolenItem);
bool32 IsPartnerMonFromSameTrainer(u32 battler);
u8 TryHandleSeed(u32 battler, u32 terrainFlag, u8 statId, u16 itemId, bool32 execute);
bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes);
void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast);
bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind);
bool32 TryRoomService(u32 battler);
void BufferStatChange(u32 battler, u8 statId, u8 stringId);
bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget);
u16 GetUsedHeldItem(u32 battler);
bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags);
u32 GetBattlerMoveTargetType(u32 battler, u32 move);
bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move);
bool8 IsMoveAffectedByParentalBond(u16 move, u8 battler);
bool32 IsMoveAffectedByParentalBond(u16 move, u32 battler);
void CopyMonLevelAndBaseStatsToBattleMon(u32 battler, struct Pokemon *mon);
void CopyMonAbilityAndTypesToBattleMon(u32 battler, struct Pokemon *mon);
void RecalcBattlerStats(u32 battler, struct Pokemon *mon);
@ -230,21 +231,21 @@ bool32 IsGastroAcidBannedAbility(u16 ability);
bool32 IsEntrainmentBannedAbilityAttacker(u16 ability);
bool32 IsEntrainmentTargetOrSimpleBeamBannedAbility(u16 ability);
bool32 CanSleep(u8 battler);
bool32 CanBePoisoned(u8 battlerAttacker, u8 battlerTarget);
bool32 CanBeBurned(u8 battler);
bool32 CanBeParalyzed(u8 battler);
bool32 CanBeFrozen(u8 battler);
bool32 CanGetFrostbite(u8 battler);
bool32 CanBeConfused(u8 battler);
bool32 IsBattlerTerrainAffected(u8 battler, u32 terrainFlag);
u32 GetBattlerFriendshipScore(u8 battler);
u32 CountBattlerStatIncreases(u8 battler, bool32 countEvasionAcc);
bool32 CanSleep(u32 battler);
bool32 CanBePoisoned(u32 battlerAttacker, u32 battlerTarget);
bool32 CanBeBurned(u32 battler);
bool32 CanBeParalyzed(u32 battler);
bool32 CanBeFrozen(u32 battler);
bool32 CanGetFrostbite(u32 battler);
bool32 CanBeConfused(u32 battler);
bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag);
u32 GetBattlerFriendshipScore(u32 battler);
u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc);
bool32 IsMyceliumMightOnField(void);
bool8 ChangeTypeBasedOnTerrain(u8 battler);
void RemoveConfusionStatus(u8 battler);
u8 GetBattlerGender(u8 battler);
bool8 AreBattlersOfOppositeGender(u8 battler1, u8 battler2);
u32 CalcSecondaryEffectChance(u8 battler, u8 secondaryEffectChance);
bool32 ChangeTypeBasedOnTerrain(u32 battler);
void RemoveConfusionStatus(u32 battler);
u8 GetBattlerGender(u32 battler);
bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2);
u32 CalcSecondaryEffectChance(u32 battler, u8 secondaryEffectChance);
#endif // GUARD_BATTLE_UTIL_H

View File

@ -63,8 +63,8 @@ bool8 AddPyramidBagItem(u16 itemId, u16 count);
bool8 RemovePyramidBagItem(u16 itemId, u16 count);
const u8 *ItemId_GetName(u16 itemId);
u16 ItemId_GetPrice(u16 itemId);
u8 ItemId_GetHoldEffect(u16 itemId);
u8 ItemId_GetHoldEffectParam(u16 itemId);
u32 ItemId_GetHoldEffect(u32 itemId);
u32 ItemId_GetHoldEffectParam(u32 itemId);
const u8 *ItemId_GetDescription(u16 itemId);
u8 ItemId_GetImportance(u16 itemId);
u8 ItemId_GetPocket(u16 itemId);
@ -72,7 +72,7 @@ u8 ItemId_GetType(u16 itemId);
ItemUseFunc ItemId_GetFieldFunc(u16 itemId);
u8 ItemId_GetBattleUsage(u16 itemId);
u8 ItemId_GetSecondaryId(u16 itemId);
u8 ItemId_GetFlingPower(u16 itemId);
u32 ItemId_GetFlingPower(u32 itemId);
u32 GetItemStatus1Mask(u16 itemId);
u32 GetItemStatus2Mask(u16 itemId);

View File

@ -57,14 +57,14 @@ match the ROM; this is also why sSoundMovesTable's declaration is in the middle
functions instead of at the top of the file with the other declarations.
*/
static bool32 TryRemoveScreens(u8 battler);
static bool32 IsUnnerveAbilityOnOpposingSide(u8 battler);
static u8 GetFlingPowerFromItemId(u16 itemId);
static bool32 TryRemoveScreens(u32 battler);
static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler);
static u32 GetFlingPowerFromItemId(u32 itemId);
static void SetRandomMultiHitCounter();
static u32 GetBattlerItemHoldEffectParam(u8 battler, u16 item);
static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item);
static uq4_12_t GetInverseTypeMultiplier(uq4_12_t multiplier);
static uq4_12_t GetSupremeOverlordModifier(u8 battler);
static bool8 CanBeInfinitelyConfused(u8 battler);
static uq4_12_t GetSupremeOverlordModifier(u32 battler);
static bool32 CanBeInfinitelyConfused(u32 battler);
extern const u8 *const gBattleScriptsForMoveEffects[];
extern const u8 *const gBattlescriptsForRunningByItem[];
@ -557,9 +557,9 @@ void HandleAction_UseItem(void)
gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
bool8 TryRunFromBattle(u8 battler)
bool32 TryRunFromBattle(u32 battler)
{
bool8 effect = FALSE;
bool32 effect = FALSE;
u8 holdEffect;
u8 pyramidMultiplier;
u8 speedVar;
@ -864,8 +864,8 @@ void HandleAction_ActionFinished(void)
{
for (j = i + 1; j < gBattlersCount; j++)
{
u8 battler1 = gBattlerByTurnOrder[i];
u8 battler2 = gBattlerByTurnOrder[j];
u32 battler1 = gBattlerByTurnOrder[i];
u32 battler2 = gBattlerByTurnOrder[j];
if (gProtectStructs[battler1].quash || gProtectStructs[battler2].quash
|| gProtectStructs[battler1].shellTrap || gProtectStructs[battler2].shellTrap)
@ -1315,7 +1315,7 @@ static void MarkAllBattlersForControllerExec(void)
}
}
bool32 IsBattlerMarkedForControllerExec(u8 battler)
bool32 IsBattlerMarkedForControllerExec(u32 battler)
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
return (gBattleControllerExecFlags & (gBitTable[battler] << 0x1C)) != 0;
@ -1323,7 +1323,7 @@ bool32 IsBattlerMarkedForControllerExec(u8 battler)
return (gBattleControllerExecFlags & (gBitTable[battler])) != 0;
}
void MarkBattlerForControllerExec(u8 battler)
void MarkBattlerForControllerExec(u32 battler)
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
gBattleControllerExecFlags |= gBitTable[battler] << (32 - MAX_BATTLERS_COUNT);
@ -1331,7 +1331,7 @@ void MarkBattlerForControllerExec(u8 battler)
gBattleControllerExecFlags |= gBitTable[battler];
}
void MarkBattlerReceivedLinkData(u8 battler)
void MarkBattlerReceivedLinkData(u32 battler)
{
s32 i;
@ -1341,7 +1341,7 @@ void MarkBattlerReceivedLinkData(u8 battler)
gBattleControllerExecFlags &= ~((1 << 28) << battler);
}
void CancelMultiTurnMoves(u8 battler)
void CancelMultiTurnMoves(u32 battler)
{
u8 i;
gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS);
@ -1422,7 +1422,7 @@ void CancelMultiTurnMoves(u8 battler)
gDisableStructs[battler].furyCutterCounter = 0;
}
bool8 WasUnableToUseMove(u8 battler)
bool32 WasUnableToUseMove(u32 battler)
{
if (gProtectStructs[battler].prlzImmobility
|| gProtectStructs[battler].usedImprisonedMove
@ -1441,7 +1441,7 @@ bool8 WasUnableToUseMove(u8 battler)
return FALSE;
}
void PrepareStringBattle(u16 stringId, u8 battler)
void PrepareStringBattle(u16 stringId, u32 battler)
{
u32 targetSide = GetBattlerSide(gBattlerTarget);
u16 battlerAbility = GetBattlerAbility(battler);
@ -1512,7 +1512,7 @@ void ResetSentPokesToOpponentValue(void)
gSentPokesToOpponent[(i & BIT_FLANK) >> 1] = bits;
}
void OpponentSwitchInResetSentPokesToOpponentValue(u8 battler)
void OpponentSwitchInResetSentPokesToOpponentValue(u32 battler)
{
s32 i = 0;
u32 bits = 0;
@ -1531,7 +1531,7 @@ void OpponentSwitchInResetSentPokesToOpponentValue(u8 battler)
}
}
void UpdateSentPokesToOpponentValue(u8 battler)
void UpdateSentPokesToOpponentValue(u32 battler)
{
if (GetBattlerSide(battler) == B_SIDE_OPPONENT)
{
@ -1827,7 +1827,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler)
return limitations;
}
u8 CheckMoveLimitations(u8 battler, u8 unusableMoves, u16 check)
u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check)
{
u8 holdEffect = GetBattlerHoldEffect(battler, TRUE);
u16 *choicedMove = &gBattleStruct->choicedMove[battler];
@ -1907,11 +1907,11 @@ bool32 AreAllMovesUnusable(u32 battler)
return (unusable == ALL_MOVES_MASK);
}
u8 GetImprisonedMovesCount(u8 battler, u16 move)
u8 GetImprisonedMovesCount(u32 battler, u16 move)
{
s32 i;
u8 imprisonedMoves = 0;
u8 battlerSide = GetBattlerSide(battler);
u32 battlerSide = GetBattlerSide(battler);
for (i = 0; i < gBattlersCount; i++)
{
@ -1931,7 +1931,7 @@ u8 GetImprisonedMovesCount(u8 battler, u16 move)
return imprisonedMoves;
}
u32 GetBattlerFriendshipScore(u8 battler)
u32 GetBattlerFriendshipScore(u32 battler)
{
u8 side = GetBattlerSide(battler);
struct Pokemon *party = GetSideParty(side);
@ -3100,7 +3100,7 @@ u8 DoBattlerEndTurnEffects(void)
return 0;
}
bool8 HandleWishPerishSongOnTurnEnd(void)
bool32 HandleWishPerishSongOnTurnEnd(void)
{
u32 battler;
@ -3203,7 +3203,7 @@ bool8 HandleWishPerishSongOnTurnEnd(void)
#define FAINTED_ACTIONS_MAX_CASE 8
bool8 HandleFaintedMonActions(void)
bool32 HandleFaintedMonActions(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
return FALSE;
@ -3811,7 +3811,7 @@ u8 AtkCanceller_UnableToUseMove2(void)
return effect;
}
bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
{
u32 i, side, playerId, flankId;
struct Pokemon *party;
@ -3966,7 +3966,7 @@ static const u16 sWeatherFlagsInfo[][3] =
[ENUM_WEATHER_SNOW] = {B_WEATHER_SNOW_TEMPORARY, B_WEATHER_SNOW_PERMANENT, HOLD_EFFECT_ICY_ROCK},
};
static void ShouldChangeFormInWeather(u8 battler)
static void ShouldChangeFormInWeather(u32 battler)
{
int i;
int side = GetBattlerSide(battler);
@ -3981,7 +3981,7 @@ static void ShouldChangeFormInWeather(u8 battler)
}
}
bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility)
bool32 TryChangeBattleWeather(u32 battler, u32 weatherEnumId, bool32 viaAbility)
{
u16 battlerAbility = GetBattlerAbility(battler);
if (gBattleWeather & B_WEATHER_PRIMAL_ANY
@ -4031,10 +4031,10 @@ static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u8 *timer)
return FALSE;
}
static u8 ForewarnChooseMove(u32 battler)
static void ForewarnChooseMove(u32 battler)
{
struct Forewarn {
u8 battler;
u32 battler;
u8 power;
u16 moveId;
};
@ -4089,9 +4089,9 @@ static u8 ForewarnChooseMove(u32 battler)
Free(data);
}
bool8 ChangeTypeBasedOnTerrain(u8 battler)
bool32 ChangeTypeBasedOnTerrain(u32 battler)
{
u8 battlerType;
u32 battlerType;
if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)
battlerType = TYPE_ELECTRIC;
@ -4111,12 +4111,12 @@ bool8 ChangeTypeBasedOnTerrain(u8 battler)
// Supreme Overlord adds a damage boost for each fainted ally.
// The first ally adds a x1.2 boost, and subsequent allies add an extra x0.1 boost each.
static uq4_12_t GetSupremeOverlordModifier(u8 battler)
static uq4_12_t GetSupremeOverlordModifier(u32 battler)
{
u32 i;
struct Pokemon *party = GetBattlerParty(battler);
uq4_12_t modifier = UQ_4_12(1.0);
bool8 appliedFirstBoost = FALSE;
bool32 appliedFirstBoost = FALSE;
for (i = 0; i < PARTY_SIZE; i++)
{
@ -4130,9 +4130,9 @@ static uq4_12_t GetSupremeOverlordModifier(u8 battler)
return modifier;
}
u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 moveArg)
u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg)
{
u8 effect = 0;
u32 effect = 0;
u32 speciesAtk, speciesDef;
u32 moveType, move;
u32 i, j;
@ -5376,7 +5376,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
&& IsBattlerAlive(gBattlerAttacker)
&& IsMoveMakingContact(move, gBattlerAttacker))
{
u8 battler;
u32 battler;
if ((battler = IsAbilityOnField(ABILITY_DAMP)))
{
gBattleScripting.battler = battler - 1;
@ -6065,7 +6065,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
return effect;
}
bool32 TryPrimalReversion(u8 battler)
bool32 TryPrimalReversion(u32 battler)
{
if (GetBattlerHoldEffect(battler, FALSE) == HOLD_EFFECT_PRIMAL_ORB
&& GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) != SPECIES_NONE)
@ -6135,7 +6135,7 @@ bool32 IsMyceliumMightOnField(void)
return FALSE;
}
u32 GetBattlerAbility(u8 battler)
u32 GetBattlerAbility(u32 battler)
{
if (gStatuses3[battler] & STATUS3_GASTRO_ACID)
return ABILITY_NONE;
@ -6268,7 +6268,7 @@ enum
ITEM_STATS_CHANGE,
};
bool32 IsBattlerTerrainAffected(u8 battler, u32 terrainFlag)
bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag)
{
if (!(gFieldStatuses & terrainFlag))
return FALSE;
@ -6278,7 +6278,7 @@ bool32 IsBattlerTerrainAffected(u8 battler, u32 terrainFlag)
return IsBattlerGrounded(battler);
}
bool32 CanSleep(u8 battler)
bool32 CanSleep(u32 battler)
{
u16 ability = GetBattlerAbility(battler);
if (ability == ABILITY_INSOMNIA
@ -6293,7 +6293,7 @@ bool32 CanSleep(u8 battler)
return TRUE;
}
bool32 CanBePoisoned(u8 battlerAttacker, u8 battlerTarget)
bool32 CanBePoisoned(u32 battlerAttacker, u32 battlerTarget)
{
u16 ability = GetBattlerAbility(battlerTarget);
@ -6309,7 +6309,7 @@ bool32 CanBePoisoned(u8 battlerAttacker, u8 battlerTarget)
return TRUE;
}
bool32 CanBeBurned(u8 battler)
bool32 CanBeBurned(u32 battler)
{
u16 ability = GetBattlerAbility(battler);
if (IS_BATTLER_OF_TYPE(battler, TYPE_FIRE)
@ -6325,7 +6325,7 @@ bool32 CanBeBurned(u8 battler)
return TRUE;
}
bool32 CanBeParalyzed(u8 battler)
bool32 CanBeParalyzed(u32 battler)
{
u16 ability = GetBattlerAbility(battler);
if (
@ -6342,7 +6342,7 @@ bool32 CanBeParalyzed(u8 battler)
return TRUE;
}
bool32 CanBeFrozen(u8 battler)
bool32 CanBeFrozen(u32 battler)
{
u16 ability = GetBattlerAbility(battler);
if (IS_BATTLER_OF_TYPE(battler, TYPE_ICE)
@ -6357,7 +6357,7 @@ bool32 CanBeFrozen(u8 battler)
return TRUE;
}
bool32 CanGetFrostbite(u8 battler)
bool32 CanGetFrostbite(u32 battler)
{
u16 ability = GetBattlerAbility(battler);
if (IS_BATTLER_OF_TYPE(battler, TYPE_ICE)
@ -6371,7 +6371,7 @@ bool32 CanGetFrostbite(u8 battler)
return TRUE;
}
bool32 CanBeConfused(u8 battler)
bool32 CanBeConfused(u32 battler)
{
if (GetBattlerAbility(battler) == ABILITY_OWN_TEMPO
|| gBattleMons[battler].status2 & STATUS2_CONFUSION
@ -6411,7 +6411,7 @@ bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId)
#define CONFUSE_BERRY_HP_FRACTION 2
#endif
static u8 HealConfuseBerry(u32 battler, u32 itemId, u8 flavorId, bool32 end2)
static u8 HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, bool32 end2)
{
if (HasEnoughHpToEatBerry(battler, CONFUSE_BERRY_HP_FRACTION, itemId)
#if B_HEAL_BLOCKING >= GEN_5
@ -6554,7 +6554,7 @@ static u8 TrySetMicleBerry(u32 battler, u32 itemId, bool32 end2)
return 0;
}
static u8 DamagedStatBoostBerryEffect(u8 battler, u8 statId, u8 split)
static u8 DamagedStatBoostBerryEffect(u32 battler, u8 statId, u8 split)
{
if (IsBattlerAlive(battler)
&& TARGET_TURN_DAMAGED
@ -6580,7 +6580,7 @@ static u8 DamagedStatBoostBerryEffect(u8 battler, u8 statId, u8 split)
return 0;
}
u8 TryHandleSeed(u8 battler, u32 terrainFlag, u8 statId, u16 itemId, bool32 execute)
u8 TryHandleSeed(u32 battler, u32 terrainFlag, u8 statId, u16 itemId, bool32 execute)
{
if (gFieldStatuses & terrainFlag && CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN))
{
@ -6643,7 +6643,7 @@ static bool32 UnnerveOn(u32 battler, u32 itemId)
return FALSE;
}
static bool32 GetMentalHerbEffect(u8 battler)
static bool32 GetMentalHerbEffect(u32 battler)
{
bool32 ret = FALSE;
@ -6698,7 +6698,7 @@ static bool32 GetMentalHerbEffect(u8 battler)
return ret;
}
static u8 TryConsumeMirrorHerb(u8 battler, bool32 execute)
static u8 TryConsumeMirrorHerb(u32 battler, bool32 execute)
{
u8 effect = 0;
@ -6935,12 +6935,12 @@ static u8 ItemEffectMoveEnd(u32 battler, u16 holdEffect)
return effect;
}
u8 ItemBattleEffects(u8 caseID, u8 battler, bool8 moveTurn)
u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn)
{
int i = 0, moveType;
u8 effect = ITEM_NO_EFFECT;
u8 changedPP = 0;
u8 battlerHoldEffect, atkHoldEffect;
u32 battlerHoldEffect, atkHoldEffect;
u8 atkHoldEffectParam;
u16 atkItem;
@ -7849,7 +7849,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battler, bool8 moveTurn)
return effect;
}
void ClearFuryCutterDestinyBondGrudge(u8 battler)
void ClearFuryCutterDestinyBondGrudge(u32 battler)
{
gDisableStructs[battler].furyCutterCounter = 0;
gBattleMons[battler].status2 &= ~STATUS2_DESTINY_BOND;
@ -7963,7 +7963,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget)
return targetBattler;
}
static bool32 IsBattlerModernFatefulEncounter(u8 battler)
static bool32 IsBattlerModernFatefulEncounter(u32 battler)
{
if (GetBattlerSide(battler) == B_SIDE_OPPONENT)
return TRUE;
@ -8120,7 +8120,7 @@ u32 GetBattlerHoldEffect(u32 battler, bool32 checkNegating)
return ItemId_GetHoldEffect(gBattleMons[battler].item);
}
static u32 GetBattlerItemHoldEffectParam(u8 battler, u16 item)
static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item)
{
if (item == ITEM_ENIGMA_BERRY_E_READER)
return gEnigmaBerries[battler].holdEffectParam;
@ -8128,7 +8128,7 @@ static u32 GetBattlerItemHoldEffectParam(u8 battler, u16 item)
return ItemId_GetHoldEffectParam(item);
}
u32 GetBattlerHoldEffectParam(u8 battler)
u32 GetBattlerHoldEffectParam(u32 battler)
{
if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY_E_READER)
return gEnigmaBerries[battler].holdEffectParam;
@ -8136,9 +8136,9 @@ u32 GetBattlerHoldEffectParam(u8 battler)
return ItemId_GetHoldEffectParam(gBattleMons[battler].item);
}
bool32 IsMoveMakingContact(u16 move, u32 battlerAtk)
bool32 IsMoveMakingContact(u32 move, u32 battlerAtk)
{
u16 atkHoldEffect = GetBattlerHoldEffect(battlerAtk, TRUE);
u32 atkHoldEffect = GetBattlerHoldEffect(battlerAtk, TRUE);
if (!gBattleMoves[move].makesContact)
{
@ -8159,7 +8159,7 @@ bool32 IsMoveMakingContact(u16 move, u32 battlerAtk)
}
}
bool32 IsBattlerProtected(u8 battler, u16 move)
bool32 IsBattlerProtected(u32 battler, u32 move)
{
// Decorate bypasses protect and detect, but not crafty shield
if (move == MOVE_DECORATE)
@ -8217,7 +8217,7 @@ bool32 IsBattlerProtected(u8 battler, u16 move)
}
// Only called directly when calculating damage type effectiveness
static bool32 IsBattlerGrounded2(u8 battler, bool32 considerInverse)
static bool32 IsBattlerGrounded2(u32 battler, bool32 considerInverse)
{
if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_IRON_BALL)
return TRUE;
@ -8242,12 +8242,12 @@ static bool32 IsBattlerGrounded2(u8 battler, bool32 considerInverse)
return TRUE;
}
bool32 IsBattlerGrounded(u8 battler)
bool32 IsBattlerGrounded(u32 battler)
{
IsBattlerGrounded2(battler, FALSE);
}
bool32 IsBattlerAlive(u8 battler)
bool32 IsBattlerAlive(u32 battler)
{
if (gBattleMons[battler].hp == 0)
return FALSE;
@ -8259,9 +8259,9 @@ bool32 IsBattlerAlive(u8 battler)
return TRUE;
}
u8 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u16 move)
u32 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u32 move)
{
u8 i;
u32 i;
for (i = 0; i < MAX_MON_MOVES; i++)
{
@ -8271,7 +8271,7 @@ u8 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u16 move)
return i;
}
u32 GetBattlerWeight(u8 battler)
u32 GetBattlerWeight(u32 battler)
{
u32 i;
u32 weight = GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[battler].species), 1);
@ -8305,7 +8305,7 @@ u32 GetBattlerWeight(u8 battler)
return weight;
}
u32 CountBattlerStatIncreases(u8 battler, bool32 countEvasionAcc)
u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc)
{
u32 i;
u32 count = 0;
@ -8321,7 +8321,7 @@ u32 CountBattlerStatIncreases(u8 battler, bool32 countEvasionAcc)
return count;
}
u32 GetMoveTargetCount(u16 move, u32 battlerAtk, u32 battlerDef)
u32 GetMoveTargetCount(u32 move, u32 battlerAtk, u32 battlerDef)
{
switch (GetBattlerMoveTargetType(gBattlerAttacker, move))
{
@ -8460,10 +8460,10 @@ u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter)
return basePower;
}
static inline u16 CalcMoveBasePower(u16 move, u32 battlerAtk, u32 battlerDef, u32 abilityDef)
static inline u32 CalcMoveBasePower(u32 move, u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 weather)
{
u32 i;
u16 basePower = gBattleMoves[move].power;
u32 basePower = gBattleMoves[move].power;
u32 weight, hpFraction, speed;
if (gBattleStruct->zmove.active)
@ -8524,7 +8524,7 @@ static inline u16 CalcMoveBasePower(u16 move, u32 battlerAtk, u32 battlerDef, u3
basePower *= 2;
break;
case EFFECT_WEATHER_BALL:
if (gBattleWeather & B_WEATHER_ANY && WEATHER_HAS_EFFECT)
if (weather & B_WEATHER_ANY)
basePower *= 2;
break;
case EFFECT_PURSUIT:
@ -8716,11 +8716,11 @@ static inline u16 CalcMoveBasePower(u16 move, u32 battlerAtk, u32 battlerDef, u3
return basePower;
}
static inline u32 CalcMoveBasePowerAfterModifiers(u16 move, u32 battlerAtk, u32 battlerDef, u8 moveType, bool32 updateFlags, u32 atkAbility, u32 defAbility, u32 holdEffectAtk)
static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 battlerDef, u32 moveType, bool32 updateFlags, u32 atkAbility, u32 defAbility, u32 holdEffectAtk, u32 weather)
{
u32 i;
u32 holdEffectParamAtk;
u16 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef, defAbility);
u32 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef, defAbility, weather);
uq4_12_t holdEffectModifier;
uq4_12_t modifier = UQ_4_12(1.0);
u32 atkSide = GET_BATTLER_SIDE(battlerAtk);
@ -8833,7 +8833,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u16 move, u32 battlerAtk, u32
break;
case ABILITY_SAND_FORCE:
if ((moveType == TYPE_STEEL || moveType == TYPE_ROCK || moveType == TYPE_GROUND)
&& gBattleWeather & B_WEATHER_SANDSTORM && WEATHER_HAS_EFFECT)
&& weather & B_WEATHER_SANDSTORM)
modifier = uq4_12_multiply(modifier, UQ_4_12(1.3));
break;
case ABILITY_RIVALRY:
@ -8913,7 +8913,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u16 move, u32 battlerAtk, u32
case ABILITY_PROTOSYNTHESIS:
{
u8 atkHighestStat = GetHighestStatId(battlerAtk);
if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT
if (weather & B_WEATHER_SUN
&& ((IS_MOVE_PHYSICAL(move) && atkHighestStat == STAT_ATK) || (IS_MOVE_SPECIAL(move) && atkHighestStat == STAT_SPATK)))
modifier = uq4_12_multiply(modifier, UQ_4_12(1.3));
}
@ -8927,7 +8927,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u16 move, u32 battlerAtk, u32
}
break;
case ABILITY_ORICHALCUM_PULSE:
if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT)
if (weather & B_WEATHER_SUN)
modifier = uq4_12_multiply(modifier, UQ_4_12(1.3));
break;
case ABILITY_HADRON_ENGINE:
@ -9003,7 +9003,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u16 move, u32 battlerAtk, u32
case ABILITY_PROTOSYNTHESIS:
{
u8 defHighestStat = GetHighestStatId(battlerDef);
if (gBattleWeather & B_WEATHER_SUN && WEATHER_HAS_EFFECT
if (weather & B_WEATHER_SUN
&& ((IS_MOVE_PHYSICAL(move) && defHighestStat == STAT_DEF) || (IS_MOVE_SPECIAL(move) && defHighestStat == STAT_SPDEF)))
modifier = uq4_12_multiply(modifier, UQ_4_12(0.7));
}
@ -9096,7 +9096,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u16 move, u32 battlerAtk, u32
}
#undef TERRAIN_TYPE_BOOST
static inline u32 CalcAttackStat(u16 move, u32 battlerAtk, u32 battlerDef, u8 moveType, bool32 isCrit, bool32 updateFlags, u32 atkAbility, u32 defAbility, u32 holdEffectAtk)
static inline u32 CalcAttackStat(u32 move, u32 battlerAtk, u32 battlerDef, u32 moveType, bool32 isCrit, bool32 updateFlags, u32 atkAbility, u32 defAbility, u32 holdEffectAtk)
{
u8 atkStage;
u32 atkStat;
@ -9300,7 +9300,7 @@ static bool32 CanEvolve(u32 species)
return FALSE;
}
static inline u32 CalcDefenseStat(u16 move, u32 battlerAtk, u32 battlerDef, u8 moveType, bool32 isCrit, bool32 updateFlags, u32 atkAbility, u32 defAbility, u32 holdEffectDef)
static inline u32 CalcDefenseStat(u32 move, u32 battlerAtk, u32 battlerDef, u32 moveType, bool32 isCrit, bool32 updateFlags, u32 atkAbility, u32 defAbility, u32 holdEffectDef, u32 weather)
{
bool32 usesDefStat;
u8 defStage;
@ -9432,10 +9432,10 @@ static inline u32 CalcDefenseStat(u16 move, u32 battlerAtk, u32 battlerDef, u8 m
}
// sandstorm sp.def boost for rock types
if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && gBattleWeather & B_WEATHER_SANDSTORM && WEATHER_HAS_EFFECT && !usesDefStat)
if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && weather & B_WEATHER_SANDSTORM && !usesDefStat)
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5));
// snow def boost for ice types
if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE) && gBattleWeather & B_WEATHER_SNOW && WEATHER_HAS_EFFECT && usesDefStat)
if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE) && weather & B_WEATHER_SNOW && usesDefStat)
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5));
// The defensive stats of a Player's Pokémon are boosted by x1.1 (+10%) if they have the 5th badge and 7th badges.
@ -9500,22 +9500,22 @@ static inline uq4_12_t GetSameTypeAttackBonusModifier(u32 battlerAtk, u32 moveTy
}
// Utility Umbrella holders take normal damage from what would be rain- and sun-weakened attacks.
static uq4_12_t GetWeatherDamageModifier(u32 battlerAtk, u32 move, u32 moveType, u32 holdEffectAtk, u32 holdEffectDef)
static uq4_12_t GetWeatherDamageModifier(u32 battlerAtk, u32 move, u32 moveType, u32 holdEffectAtk, u32 holdEffectDef, u32 weather)
{
if (!WEATHER_HAS_EFFECT)
if (weather == B_WEATHER_NONE)
return UQ_4_12(1.0);
if (gBattleMoves[move].effect == EFFECT_HYDRO_STEAM && (gBattleWeather & B_WEATHER_SUN) && holdEffectAtk != HOLD_EFFECT_UTILITY_UMBRELLA)
if (gBattleMoves[move].effect == EFFECT_HYDRO_STEAM && (weather & B_WEATHER_SUN) && holdEffectAtk != HOLD_EFFECT_UTILITY_UMBRELLA)
return UQ_4_12(1.5);
if (holdEffectDef == HOLD_EFFECT_UTILITY_UMBRELLA)
return UQ_4_12(1.0);
if (gBattleWeather & B_WEATHER_RAIN)
if (weather & B_WEATHER_RAIN)
{
if (moveType != TYPE_FIRE && moveType != TYPE_WATER)
return UQ_4_12(1.0);
return (moveType == TYPE_FIRE) ? UQ_4_12(0.5) : UQ_4_12(1.5);
}
if (gBattleWeather & B_WEATHER_SUN)
if (weather & B_WEATHER_SUN)
{
if (moveType != TYPE_FIRE && moveType != TYPE_WATER)
return UQ_4_12(1.0);
@ -9762,6 +9762,7 @@ static inline s32 DoMoveDamageCalc(u32 move, u32 battlerAtk, u32 battlerDef, u32
bool32 isCrit, bool32 randomFactor, bool32 updateFlags, uq4_12_t typeEffectivenessModifier)
{
s32 dmg;
u32 weather;
u32 userFinalAttack;
u32 targetFinalDefense;
u32 holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE);
@ -9772,18 +9773,24 @@ static inline s32 DoMoveDamageCalc(u32 move, u32 battlerAtk, u32 battlerDef, u32
if (typeEffectivenessModifier == UQ_4_12(0.0))
return 0;
// Store weather in a local variable, so there's no need to call WEATHER_HAS_EFFECT every time weather is checked.
if (gBattleWeather == B_WEATHER_NONE || !WEATHER_HAS_EFFECT)
weather = B_WEATHER_NONE;
else
weather = gBattleWeather;
if (fixedBasePower)
gBattleMovePower = fixedBasePower;
else
gBattleMovePower = CalcMoveBasePowerAfterModifiers(move, battlerAtk, battlerDef, moveType, updateFlags, abilityAtk, abilityDef, holdEffectAtk);
gBattleMovePower = CalcMoveBasePowerAfterModifiers(move, battlerAtk, battlerDef, moveType, updateFlags, abilityAtk, abilityDef, holdEffectAtk, weather);
userFinalAttack = CalcAttackStat(move, battlerAtk, battlerDef, moveType, isCrit, updateFlags, abilityAtk, abilityDef, holdEffectAtk);
targetFinalDefense = CalcDefenseStat(move, battlerAtk, battlerDef, moveType, isCrit, updateFlags, abilityAtk, abilityDef, holdEffectDef);
targetFinalDefense = CalcDefenseStat(move, battlerAtk, battlerDef, moveType, isCrit, updateFlags, abilityAtk, abilityDef, holdEffectDef, weather);
dmg = CalculateBaseDamage(gBattleMovePower, userFinalAttack, gBattleMons[battlerAtk].level, targetFinalDefense);
DAMAGE_APPLY_MODIFIER(GetTargetDamageModifier(move, battlerAtk, battlerDef));
DAMAGE_APPLY_MODIFIER(GetParentalBondModifier(battlerAtk));
DAMAGE_APPLY_MODIFIER(GetWeatherDamageModifier(battlerAtk, move, moveType, holdEffectAtk, holdEffectDef));
DAMAGE_APPLY_MODIFIER(GetWeatherDamageModifier(battlerAtk, move, moveType, holdEffectAtk, holdEffectDef, weather));
DAMAGE_APPLY_MODIFIER(GetCriticalModifier(isCrit));
// TODO: Glaive Rush (Gen IX effect)
if (randomFactor)
@ -10071,7 +10078,7 @@ s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 ma
return dmg;
}
s32 GetStealthHazardDamage(u8 hazardType, u8 battler)
s32 GetStealthHazardDamage(u8 hazardType, u32 battler)
{
u8 type1 = gBattleMons[battler].type1;
u8 type2 = gBattleMons[battler].type2;
@ -10080,7 +10087,7 @@ s32 GetStealthHazardDamage(u8 hazardType, u8 battler)
return GetStealthHazardDamageByTypesAndHP(hazardType, type1, type2, maxHp);
}
bool32 IsPartnerMonFromSameTrainer(u8 battler)
bool32 IsPartnerMonFromSameTrainer(u32 battler)
{
if (GetBattlerSide(battler) == B_SIDE_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
return FALSE;
@ -10116,11 +10123,11 @@ bool32 DoesSpeciesUseHoldItemToChangeForm(u16 species, u16 heldItemId)
return FALSE;
}
bool32 CanMegaEvolve(u8 battler)
bool32 CanMegaEvolve(u32 battler)
{
u32 itemId, holdEffect, species;
struct Pokemon *mon;
u8 battlerPosition = GetBattlerPosition(battler);
u32 battlerPosition = GetBattlerPosition(battler);
u8 partnerPosition = GetBattlerPosition(BATTLE_PARTNER(battler));
struct MegaEvolutionData *mega = &(((struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]))->mega);
@ -10180,11 +10187,11 @@ bool32 CanMegaEvolve(u8 battler)
return FALSE;
}
bool32 CanUltraBurst(u8 battler)
bool32 CanUltraBurst(u32 battler)
{
u32 itemId, holdEffect, species;
struct Pokemon *mon;
u8 battlerPosition = GetBattlerPosition(battler);
u32 battlerPosition = GetBattlerPosition(battler);
u8 partnerPosition = GetBattlerPosition(BATTLE_PARTNER(battler));
// Check if Player has a Z Ring
@ -10235,7 +10242,7 @@ bool32 CanUltraBurst(u8 battler)
return FALSE;
}
bool32 IsBattlerMegaEvolved(u8 battler)
bool32 IsBattlerMegaEvolved(u32 battler)
{
// While Transform does copy stats and visuals, it shouldn't be counted as true Mega Evolution.
if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED)
@ -10243,7 +10250,7 @@ bool32 IsBattlerMegaEvolved(u8 battler)
return (gSpeciesInfo[gBattleMons[battler].species].flags & SPECIES_FLAG_MEGA_EVOLUTION);
}
bool32 IsBattlerPrimalReverted(u8 battler)
bool32 IsBattlerPrimalReverted(u32 battler)
{
// While Transform does copy stats and visuals, it shouldn't be counted as true Primal Revesion.
if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED)
@ -10251,7 +10258,7 @@ bool32 IsBattlerPrimalReverted(u8 battler)
return (gSpeciesInfo[gBattleMons[battler].species].flags & SPECIES_FLAG_PRIMAL_REVERSION);
}
bool32 IsBattlerUltraBursted(u8 battler)
bool32 IsBattlerUltraBursted(u32 battler)
{
// While Transform does copy stats and visuals, it shouldn't be counted as true Ultra Burst.
if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED)
@ -10260,7 +10267,7 @@ bool32 IsBattlerUltraBursted(u8 battler)
}
// Returns SPECIES_NONE if no form change is possible
u16 GetBattleFormChangeTargetSpecies(u8 battler, u16 method)
u16 GetBattleFormChangeTargetSpecies(u32 battler, u16 method)
{
u32 i, j;
u16 targetSpecies = SPECIES_NONE;
@ -10347,7 +10354,7 @@ u16 GetBattleFormChangeTargetSpecies(u8 battler, u16 method)
return targetSpecies;
}
bool32 CanBattlerFormChange(u8 battler, u16 method)
bool32 CanBattlerFormChange(u32 battler, u16 method)
{
// Can't change form if transformed.
if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED
@ -10361,7 +10368,7 @@ bool32 CanBattlerFormChange(u8 battler, u16 method)
return DoesSpeciesHaveFormChangeMethod(gBattleMons[battler].species, method);
}
bool32 TryBattleFormChange(u8 battler, u16 method)
bool32 TryBattleFormChange(u32 battler, u16 method)
{
u8 monId = gBattlerPartyIndexes[battler];
u8 side = GET_BATTLER_SIDE(battler);
@ -10388,7 +10395,7 @@ bool32 TryBattleFormChange(u8 battler, u16 method)
}
else if (gBattleStruct->changedSpecies[side][monId] != SPECIES_NONE)
{
bool8 restoreSpecies = FALSE;
bool32 restoreSpecies = FALSE;
// Mega Evolved and Ultra Bursted Pokémon should always revert to normal upon fainting or ending the battle, so no need to add it to the form change tables.
if ((IsBattlerMegaEvolved(battler) || IsBattlerUltraBursted(battler)) && (method == FORM_CHANGE_FAINT || method == FORM_CHANGE_END_BATTLE))
@ -10431,7 +10438,7 @@ bool32 DoBattlersShareType(u32 battler1, u32 battler2)
return FALSE;
}
bool32 CanBattlerGetOrLoseItem(u8 battler, u16 itemId)
bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId)
{
u16 species = gBattleMons[battler].species;
u16 holdEffect = ItemId_GetHoldEffect(itemId);
@ -10521,7 +10528,7 @@ bool32 SetIllusionMon(struct Pokemon *mon, u32 battler)
return FALSE;
}
bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battler)
bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler)
{
#if B_BADGE_BOOST == GEN_3
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER))
@ -10555,10 +10562,10 @@ u8 GetBattleMoveSplit(u32 moveId)
#endif
}
static bool32 TryRemoveScreens(u8 battler)
static bool32 TryRemoveScreens(u32 battler)
{
bool32 removed = FALSE;
u8 battlerSide = GetBattlerSide(battler);
u32 battlerSide = GetBattlerSide(battler);
u8 enemySide = GetBattlerSide(BATTLE_OPPOSITE(battler));
// try to remove from battler's side
@ -10584,7 +10591,7 @@ static bool32 TryRemoveScreens(u8 battler)
return removed;
}
static bool32 IsUnnerveAbilityOnOpposingSide(u8 battler)
static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler)
{
if (IsAbilityOnOpposingSide(battler, ABILITY_UNNERVE)
|| IsAbilityOnOpposingSide(battler, ABILITY_AS_ONE_ICE_RIDER)
@ -10594,7 +10601,7 @@ static bool32 IsUnnerveAbilityOnOpposingSide(u8 battler)
}
// Photon geyser & light that burns the sky
u8 GetSplitBasedOnStats(u8 battler)
u8 GetSplitBasedOnStats(u32 battler)
{
u32 attack = gBattleMons[battler].attack;
u32 spAttack = gBattleMons[battler].spAttack;
@ -10611,11 +10618,11 @@ u8 GetSplitBasedOnStats(u8 battler)
return SPLIT_PHYSICAL;
}
static u8 GetFlingPowerFromItemId(u16 itemId)
static u32 GetFlingPowerFromItemId(u32 itemId)
{
if (itemId >= ITEM_TM01 && itemId <= ITEM_HM08)
{
u8 power = gBattleMoves[ItemIdToBattleMoveId(itemId)].power;
u32 power = gBattleMoves[ItemIdToBattleMoveId(itemId)].power;
if (power > 1)
return power;
return 10; // Status moves and moves with variable power always return 10 power.
@ -10721,7 +10728,7 @@ bool32 IsEntrainmentTargetOrSimpleBeamBannedAbility(u16 ability)
// Sort an array of battlers by speed
// Useful for effects like pickpocket, eject button, red card, dancer
void SortBattlersBySpeed(u8 *battlers, bool8 slowToFast)
void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast)
{
int i, j, currSpeed, currBattler;
u16 speeds[MAX_BATTLERS_COUNT] = {0};
@ -10777,7 +10784,7 @@ void TryRestoreHeldItems(void)
}
}
bool32 CanStealItem(u8 battlerStealing, u8 battlerItem, u16 item)
bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item)
{
u8 stealerSide = GetBattlerSide(battlerStealing);
@ -10817,7 +10824,7 @@ bool32 CanStealItem(u8 battlerStealing, u8 battlerItem, u16 item)
return TRUE;
}
void TrySaveExchangedItem(u8 battler, u16 stolenItem)
void TrySaveExchangedItem(u32 battler, u16 stolenItem)
{
// Because BtlController_EmitSetMonData does SetMonData, we need to save the stolen item only if it matches the battler's original
// So, if the player steals an item during battle and has it stolen from it, it will not end the battle with it (naturally)
@ -10831,7 +10838,7 @@ void TrySaveExchangedItem(u8 battler, u16 stolenItem)
#endif
}
bool32 IsBattlerAffectedByHazards(u8 battler, bool32 toxicSpikes)
bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes)
{
bool32 ret = TRUE;
u32 holdEffect = GetBattlerHoldEffect(battler, TRUE);
@ -10848,7 +10855,7 @@ bool32 IsBattlerAffectedByHazards(u8 battler, bool32 toxicSpikes)
return ret;
}
bool32 TestSheerForceFlag(u8 battler, u16 move)
bool32 TestSheerForceFlag(u32 battler, u16 move)
{
if (GetBattlerAbility(battler) == ABILITY_SHEER_FORCE && gBattleMoves[move].sheerForceBoost)
return TRUE;
@ -10857,9 +10864,9 @@ bool32 TestSheerForceFlag(u8 battler, u16 move)
}
// This function is the body of "jumpifstat", but can be used dynamically in a function
bool32 CompareStat(u8 battler, u8 statId, u8 cmpTo, u8 cmpKind)
bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind)
{
bool8 ret = FALSE;
bool32 ret = FALSE;
u8 statValue = gBattleMons[battler].statStages[statId];
// Because this command is used as a way of checking if a stat can be lowered/raised,
@ -10908,9 +10915,9 @@ bool32 CompareStat(u8 battler, u8 statId, u8 cmpTo, u8 cmpKind)
return ret;
}
void BufferStatChange(u8 battler, u8 statId, u8 stringId)
void BufferStatChange(u32 battler, u8 statId, u8 stringId)
{
bool8 hasContrary = (GetBattlerAbility(battler) == ABILITY_CONTRARY);
bool32 hasContrary = (GetBattlerAbility(battler) == ABILITY_CONTRARY);
PREPARE_STAT_BUFFER(gBattleTextBuff1, statId);
if (stringId == STRINGID_STATFELL)
@ -10933,7 +10940,7 @@ void BufferStatChange(u8 battler, u8 statId, u8 stringId)
}
}
bool32 TryRoomService(u8 battler)
bool32 TryRoomService(u32 battler)
{
if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && CompareStat(battler, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN))
{
@ -10951,7 +10958,7 @@ bool32 TryRoomService(u8 battler)
}
}
bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u32 battlerDef, bool32 checkTarget)
bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget)
{
#if B_PRANKSTER_DARK_TYPES >= GEN_7
if (!gProtectStructs[battlerPrankster].pranksterElevated)
@ -10970,12 +10977,12 @@ bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u32 battlerDef, bool32 che
return FALSE;
}
u16 GetUsedHeldItem(u8 battler)
u16 GetUsedHeldItem(u32 battler)
{
return gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)];
}
bool32 IsBattlerWeatherAffected(u8 battler, u32 weatherFlags)
bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags)
{
if (gBattleWeather & weatherFlags && WEATHER_HAS_EFFECT)
{
@ -10990,7 +10997,7 @@ bool32 IsBattlerWeatherAffected(u8 battler, u32 weatherFlags)
// Gets move target before redirection effects etc. are applied
// Possible return values are defined in battle.h following MOVE_TARGET_SELECTED
u32 GetBattlerMoveTargetType(u8 battler, u16 move)
u32 GetBattlerMoveTargetType(u32 battler, u32 move)
{
u32 target;
@ -11055,13 +11062,13 @@ void RecalcBattlerStats(u32 battler, struct Pokemon *mon)
CopyMonAbilityAndTypesToBattleMon(battler, mon);
}
void RemoveConfusionStatus(u8 battler)
void RemoveConfusionStatus(u32 battler)
{
gBattleMons[battler].status2 &= ~STATUS2_CONFUSION;
gStatuses4[battler] &= ~STATUS4_INFINITE_CONFUSION;
}
static bool8 CanBeInfinitelyConfused(u8 battler)
static bool32 CanBeInfinitelyConfused(u32 battler)
{
if (gBattleMons[battler].ability == ABILITY_OWN_TEMPO
|| IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)
@ -11072,13 +11079,13 @@ static bool8 CanBeInfinitelyConfused(u8 battler)
return TRUE;
}
u8 GetBattlerGender(u8 battler)
u8 GetBattlerGender(u32 battler)
{
return GetGenderFromSpeciesAndPersonality(gBattleMons[battler].species,
gBattleMons[battler].personality);
}
bool8 AreBattlersOfOppositeGender(u8 battler1, u8 battler2)
bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2)
{
u8 gender1 = GetBattlerGender(battler1);
u8 gender2 = GetBattlerGender(battler2);
@ -11086,7 +11093,7 @@ bool8 AreBattlersOfOppositeGender(u8 battler1, u8 battler2)
return (gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS && gender1 != gender2);
}
u32 CalcSecondaryEffectChance(u8 battler, u8 secondaryEffectChance)
u32 CalcSecondaryEffectChance(u32 battler, u8 secondaryEffectChance)
{
if (GetBattlerAbility(battler) == ABILITY_SERENE_GRACE)
secondaryEffectChance *= 2;

View File

@ -884,12 +884,12 @@ u16 ItemId_GetPrice(u16 itemId)
return gItems[SanitizeItemId(itemId)].price;
}
u8 ItemId_GetHoldEffect(u16 itemId)
u32 ItemId_GetHoldEffect(u32 itemId)
{
return gItems[SanitizeItemId(itemId)].holdEffect;
}
u8 ItemId_GetHoldEffectParam(u16 itemId)
u32 ItemId_GetHoldEffectParam(u32 itemId)
{
return gItems[SanitizeItemId(itemId)].holdEffectParam;
}
@ -956,7 +956,7 @@ u8 ItemId_GetSecondaryId(u16 itemId)
return gItems[SanitizeItemId(itemId)].secondaryId;
}
u8 ItemId_GetFlingPower(u16 itemId)
u32 ItemId_GetFlingPower(u32 itemId)
{
return gItems[SanitizeItemId(itemId)].flingPower;
}