From 00b005fcb83e6099c98fcde74e1d4b3847e502c0 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Mon, 17 Jun 2024 23:44:23 +0200 Subject: [PATCH] battle_util.h aligned with expansion --- include/battle_util.h | 192 +++++++++++++++++++++--------------------- src/battle_util.c | 22 ++--- 2 files changed, 109 insertions(+), 105 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index d707a51ae..8b255b1bb 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -1,8 +1,6 @@ #ifndef GUARD_BATTLE_UTIL_H #define GUARD_BATTLE_UTIL_H -#include "global.h" - #define MOVE_LIMITATION_ZEROMOVE (1 << 0) #define MOVE_LIMITATION_PP (1 << 1) #define MOVE_LIMITATION_DISABLED (1 << 2) @@ -51,7 +49,7 @@ enum { #define ABILITYEFFECT_MUD_SPORT 252 // Only used if B_SPORT_TURNS >= GEN_6 #define ABILITYEFFECT_WATER_SPORT 253 // Only used if B_SPORT_TURNS >= GEN_6 -/// For the first argument of ItemBattleEffects, to deteremine which block of item effects to try +// For the first argument of ItemBattleEffects, to deteremine which block of item effects to try #define ITEMEFFECT_ON_SWITCH_IN 0 #define ITEMEFFECT_NORMAL 1 #define ITEMEFFECT_DUMMY 2 // Unused, empty @@ -113,6 +111,8 @@ enum extern const struct TypePower gNaturalGiftTable[]; +void HandleAction_ThrowBall(void); +bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move); void HandleAction_UseMove(void); void HandleAction_Switch(void); void HandleAction_UseItem(void); @@ -127,42 +127,37 @@ void HandleAction_OldManBallThrow(void); void HandleAction_TryFinish(void); void HandleAction_NothingIsFainted(void); void HandleAction_ActionFinished(void); - u8 GetBattlerForBattleScript(u8 caseId); bool32 IsBattlerMarkedForControllerExec(u32 battler); -void MarkBattlerForControllerExec(u8 battlerId); -void MarkBattlerReceivedLinkData(u8 battlerId); +void MarkBattlerForControllerExec(u32 battler); +void MarkBattlerReceivedLinkData(u32 battler); const u8* 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(u32 battler, u8 unusableMoves, u16 check); bool32 AreAllMovesUnusable(u32 battler); -u8 GetImprisonedMovesCount(u8 battlerId, u16 move); +u8 GetImprisonedMovesCount(u32 battler, u16 move); u8 DoFieldEndTurnEffects(void); +s32 GetDrainedBigRootHp(u32 battler, s32 hp); u8 DoBattlerEndTurnEffects(void); bool32 HandleWishPerishSongOnTurnEnd(void); -bool8 HandleFaintedMonActions(void); +bool32 HandleFaintedMonActions(void); +void TryClearRageAndFuryCutter(void); u8 AtkCanceller_UnableToUseMove(u32 moveType); -bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2); +void SetAtkCancellerForCalledMove(void); +u8 AtkCanceller_UnableToUseMove2(void); +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); -void BattleScriptExecute(const u8 *BS_ptr); -void BattleScriptPushCursorAndCallback(const u8 *BS_ptr); -u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn); -void ClearVariousBattlerFlags(u32 battler); -void HandleAction_RunBattleScript(void); -u32 GetMoveTarget(u16 move, u8 setTarget); -u8 IsMonDisobedient(void); -// new -bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move); +bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); -bool32 IsMyceliumMightOnField(void); bool32 IsMoldBreakerTypeAbility(u32 ability); u32 GetBattlerAbility(u32 battler); u32 IsAbilityOnSide(u32 battler, u32 ability); @@ -170,51 +165,89 @@ u32 IsAbilityOnOpposingSide(u32 battler, u32 ability); u32 IsAbilityOnField(u32 ability); u32 IsAbilityOnFieldExcept(u32 battler, u32 ability); u32 IsAbilityPreventingEscape(u32 battler); -bool32 IsBattlerAlive(u32 battler); -bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind); -u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect); -bool32 MoveHasAdditionalEffect(u32 move, u32 moveEffect); -u8 GetBattleMoveCategory(u32 moveId); -bool32 CanFling(u32 battler); -u32 GetBattlerMoveTargetType(u32 battler, u32 move); -bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag); -bool32 IsBattlerGrounded(u32 battler); -u8 AtkCanceller_UnableToUseMove2(void); -void SetAtkCancellerForCalledMove(void); -bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget); bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, 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, u32 battler, bool32 moveTurn); +void ClearVariousBattlerFlags(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 GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating); +u32 GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility); +u32 GetBattlerHoldEffectParam(u32 battler); bool32 IsMoveMakingContact(u32 move, u32 battlerAtk); -bool32 IsHealBlockPreventingMove(u32 battler, u32 move); -bool32 IsBelchPreventingMove(u32 battler, u32 move); -s32 CalculateMoveDamage(u32 move, u32 battlerAtk, u32 battlerDef, u32 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor, bool32 updateFlags); -bool32 MoveHasAdditionalEffectWithChance(u32 move, u32 moveEffect, u32 chance); -bool32 MoveHasAdditionalEffectSelfArg(u32 move, u32 moveEffect, u32 argument); +bool32 IsBattlerGrounded(u32 battler); +bool32 IsBattlerAlive(u32 battler); u32 GetMoveSlot(u16 *moves, u32 move); u32 GetBattlerWeight(u32 battler); -u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc); -bool32 ShouldGetStatBadgeBoost(u16 flagId, u32 battler); -bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags); -bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId); -bool32 MoveIsAffectedBySheerForce(u32 move); -u8 GetBattlerGender(u32 battler); -bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2); -bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2); -u32 GetBattlerHoldEffectParam(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); +s32 CalculateMoveDamageVars(u32 move, u32 battlerAtk, u32 battlerDef, u32 moveType, s32 fixedBasePower, uq4_12_t typeEffectivenessModifier, + u32 weather, bool32 isCrit, u32 holdEffectAtk, u32 holdEffectDef, u32 abilityAtk, u32 abilityDef); uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 defAbility, bool32 recordAbilities); uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); -bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect); uq4_12_t GetTypeModifier(u32 atkType, u32 defType); -u8 GetBattlerType(u32 battler, u8 typeIndex, bool32 ignoreTera); +uq4_12_t GetTypeEffectiveness(struct Pokemon *mon, u8 moveType); +s32 GetStealthHazardDamage(u8 hazardType, u32 battler); +s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 maxHp); +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(u32 battler, u16 itemId); u32 GetIllusionMonSpecies(u32 battler); struct Pokemon *GetIllusionMonPtr(u32 battler); void ClearIllusionMon(u32 battler); bool32 SetIllusionMon(struct Pokemon *mon, u32 battler); -u32 GetBattlerAffectionHearts(u32 battler); -u32 GetBattlerHoldEffect(u32 battler, bool32 checkNegating); -u32 GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating); -u32 GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility); -void RecalcBattlerStats(u32 battler, struct Pokemon *mon); +bool32 ShouldGetStatBadgeBoost(u16 flagId, u32 battler); +u8 GetBattleMoveCategory(u32 moveId); +bool32 CanFling(u32 battler); +bool32 IsTelekinesisBannedSpecies(u16 species); +bool32 IsHealBlockPreventingMove(u32 battler, u32 move); +bool32 IsBelchPreventingMove(u32 battler, u32 move); +bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId); +bool32 IsPartnerMonFromSameTrainer(u32 battler); +u8 GetCategoryBasedOnStats(u32 battler); +void SetShellSideArmCategory(void); +bool32 MoveIsAffectedBySheerForce(u32 move); bool32 TestIfSheerForceAffected(u32 battler, u16 move); +void TryRestoreHeldItems(void); +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); +void CopyMonLevelAndBaseStatsToBattleMon(u32 battler, struct Pokemon *mon); +void CopyMonAbilityAndTypesToBattleMon(u32 battler, struct Pokemon *mon); +void RecalcBattlerStats(u32 battler, struct Pokemon *mon); +bool32 IsAlly(u32 battlerAtk, u32 battlerDef); +bool32 IsGen6ExpShareEnabled(void); +bool32 MoveHasAdditionalEffect(u32 move, u32 moveEffect); +bool32 MoveHasAdditionalEffectWithChance(u32 move, u32 moveEffect, u32 chance); +bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect); +bool32 MoveHasAdditionalEffectSelfArg(u32 move, u32 moveEffect, u32 argument); +bool32 MoveHasChargeTurnAdditionalEffect(u32 move); +bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef); +bool32 TargetFullyImmuneToCurrMove(u32 BattlerAtk, u32 battlerDef); + bool32 CanSleep(u32 battler); bool32 CanBePoisoned(u32 battlerAttacker, u32 battlerTarget); bool32 CanBeBurned(u32 battler); @@ -222,48 +255,19 @@ bool32 CanBeParalyzed(u32 battler); bool32 CanBeFrozen(u32 battler); bool32 CanGetFrostbite(u32 battler); bool32 CanBeConfused(u32 battler); -void TryRestoreHeldItems(void); -bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item); -void TrySaveExchangedItem(u32 battler, u16 stolenItem); -void RemoveBattlerType(u32 battler, u8 type); -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 TryChangeBattleWeather(u32 battler, u32 weatherEnumId, bool32 viaAbility); -u16 GetUsedHeldItem(u32 battler); -void RemoveConfusionStatus(u32 battler); +bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag); +u32 GetBattlerAffectionHearts(u32 battler); +u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc); bool32 ChangeTypeBasedOnTerrain(u32 battler); -bool32 TryRoomService(u32 battler); -void BufferStatChange(u32 battler, u8 statId, u8 stringId); -s32 GetDrainedBigRootHp(u32 battler, s32 hp); -u8 TryHandleSeed(u32 battler, u32 terrainFlag, u8 statId, u16 itemId, bool32 execute); -bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId); -bool32 IsGen6ExpShareEnabled(void); -void CopyMonLevelAndBaseStatsToBattleMon(u32 battler, struct Pokemon *mon); -void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast); -bool32 CanBattlerEscape(u32 battler); // no ability check -bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes); -bool32 TryPrimalReversion(u32 battler); -s32 GetStealthHazardDamage(u8 hazardType, u32 battler); -s32 GetStealthHazardDamageByTypesAndHP(u8 hazardType, u8 type1, u8 type2, u32 maxHp); -bool32 DoBattlersShareType(u32 battler1, u32 battler2); -bool32 MoveHasChargeTurnAdditionalEffect(u32 move); -bool32 IsPartnerMonFromSameTrainer(u32 battler); -u8 GetCategoryBasedOnStats(u32 battler); -void TryClearRageAndFuryCutter(void); -bool32 CanMegaEvolve(u32 battler); -bool32 CanUltraBurst(u32 battler); -bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move); -u32 SetRandomTarget(u32 battler); +void RemoveConfusionStatus(u32 battler); +u8 GetBattlerGender(u32 battler); +bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2); +bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2); +u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect); bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect); -u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); -u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter); -s32 CalculateMoveDamageVars(u32 move, u32 battlerAtk, u32 battlerDef, u32 moveType, s32 fixedBasePower, uq4_12_t typeEffectivenessModifier, - u32 weather, bool32 isCrit, u32 holdEffectAtk, u32 holdEffectDef, u32 abilityAtk, u32 abilityDef); +u8 GetBattlerType(u32 battler, u8 typeIndex, bool32 ignoreTera); +bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon); bool8 IsMonBannedFromSkyBattles(u16 species); -bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef); -bool32 TargetFullyImmuneToCurrMove(u32 BattlerAtk, u32 battlerDef); +void RemoveBattlerType(u32 battler, u8 type); #endif // GUARD_BATTLE_UTIL_H diff --git a/src/battle_util.c b/src/battle_util.c index 39b6db9bd..2734093cc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -856,22 +856,22 @@ bool32 IsBattlerMarkedForControllerExec(u32 battler) return (gBattleControllerExecFlags & (gBitTable[battler])) != 0; } -void MarkBattlerForControllerExec(u8 battlerId) +void MarkBattlerForControllerExec(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) - gBattleControllerExecFlags |= gBitTable[battlerId] << (32 - MAX_BATTLERS_COUNT); + gBattleControllerExecFlags |= gBitTable[battler] << (32 - MAX_BATTLERS_COUNT); else - gBattleControllerExecFlags |= gBitTable[battlerId]; + gBattleControllerExecFlags |= gBitTable[battler]; } -void MarkBattlerReceivedLinkData(u8 battlerId) +void MarkBattlerReceivedLinkData(u32 battler) { s32 i; for (i = 0; i < GetLinkPlayerCount(); i++) - gBattleControllerExecFlags |= gBitTable[battlerId] << (i << 2); + gBattleControllerExecFlags |= gBitTable[battler] << (i << 2); - gBattleControllerExecFlags &= ~((1 << 28) << battlerId); + gBattleControllerExecFlags &= ~((1 << 28) << battler); } const u8* CancelMultiTurnMoves(u32 battler) @@ -1055,7 +1055,7 @@ void ResetSentPokesToOpponentValue(void) gSentPokesToOpponent[(i & BIT_FLANK) >> 1] = bits; } -void OpponentSwitchInResetSentPokesToOpponentValue(u8 battler) +void OpponentSwitchInResetSentPokesToOpponentValue(u32 battler) { s32 i = 0; u32 bits = 0; @@ -1074,7 +1074,7 @@ void OpponentSwitchInResetSentPokesToOpponentValue(u8 battler) } } -void UpdateSentPokesToOpponentValue(u8 battler) +void UpdateSentPokesToOpponentValue(u32 battler) { if (GetBattlerSide(battler) == B_SIDE_OPPONENT) { @@ -1341,11 +1341,11 @@ bool32 AreAllMovesUnusable(u32 battler) return (unusable == ALL_MOVES_MASK); } -u8 GetImprisonedMovesCount(u8 battlerId, u16 move) +u8 GetImprisonedMovesCount(u32 battler, u16 move) { s32 i; u8 imprisonedMoves = 0; - u8 battlerSide = GetBattlerSide(battlerId); + u32 battlerSide = GetBattlerSide(battler); for (i = 0; i < gBattlersCount; i++) { @@ -2780,7 +2780,7 @@ bool32 HandleWishPerishSongOnTurnEnd(void) #define FAINTED_ACTIONS_MAX_CASE 7 -bool8 HandleFaintedMonActions(void) +bool32 HandleFaintedMonActions(void) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) return FALSE;