Move attack canceler to the move resolution file (#8921)

This commit is contained in:
Alex 2026-01-21 12:11:37 +01:00 committed by GitHub
parent 6c05a08750
commit da62ebcffd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 2134 additions and 2129 deletions

View File

@ -6,6 +6,7 @@
#include "constants/battle_switch_in.h"
#include "constants/abilities.h"
#include "constants/battle.h"
#include "constants/battle_move_resolution.h"
#include "constants/form_change_types.h"
#include "constants/hold_effects.h"
#include "constants/moves.h"
@ -554,7 +555,7 @@ struct EventStates
enum FirstTurnEventsStates beforeFirstTurn:8;
enum FaintedActions faintedAction:8;
enum BattlerId faintedActionBattler:4;
enum MoveSuccessOrder atkCanceler:8;
enum CancelerState atkCanceler:8;
enum BattlerId atkCancelerBattler:4;
enum BattleIntroStates battleIntro:8;
enum SwitchInEvents switchIn:8;

View File

@ -3,6 +3,7 @@
#include "constants/battle.h"
#include "battle_bg.h"
#include "task.h"
struct BattleEnvironment
{

View File

@ -3,7 +3,8 @@
#include "constants/battle_move_resolution.h"
bool32 DoMoveEnd(enum MoveEndState endMode, enum MoveEndState endState);
enum CancelerResult DoAttackCanceler(void);
enum MoveEndResult DoMoveEnd(enum MoveEndState endMode, enum MoveEndState endState);
void MoveValuesCleanUp(void);
#endif // GUARD_BATTLE_MOVE_RESOLUTION_H

View File

@ -86,75 +86,11 @@ enum ItemEffect
// for Natural Gift and Fling
struct TypePower
{
enum Type type;
enum Type type:8;
u8 power;
u16 effect;
};
enum MoveSuccessOrder
{
CANCELER_STANCE_CHANGE_1,
CANCELER_CLEAR_FLAGS,
CANCELER_SKY_DROP,
CANCELER_RECHARGE,
CANCELER_CHILLY_RECEPTION,
CANCELER_ASLEEP_OR_FROZEN,
CANCELER_POWER_POINTS,
CANCELER_OBEDIENCE,
CANCELER_TRUANT,
CANCELER_FOCUS_GEN5,
CANCELER_FLINCH,
CANCELER_DISABLED,
CANCELER_VOLATILE_BLOCKED, // Gravity / Heal Block / Throat Chop
CANCELER_TAUNTED,
CANCELER_IMPRISONED,
CANCELER_CONFUSED,
CANCELER_PARALYZED,
CANCELER_INFATUATION,
CANCELER_BIDE,
CANCELER_Z_MOVES,
CANCELER_CHOICE_LOCK,
CANCELER_CALLSUBMOVE,
CANCELER_THAW,
CANCELER_STANCE_CHANGE_2,
CANCELER_ATTACKSTRING,
CANCELER_PPDEDUCTION,
CANCELER_SKY_BATTLE,
CANCELER_WEATHER_PRIMAL,
CANCELER_FOCUS_PRE_GEN5,
CANCELER_MOVE_FAILURE,
CANCELER_POWDER_STATUS,
CANCELER_PRIORITY_BLOCK,
CANCELER_PROTEAN,
CANCELER_EXPLODING_DAMP,
CANCELER_EXPLOSION,
CANCELER_CHARGING,
CANCELER_NO_TARGET,
CANCELER_TOOK_ATTACK,
CANCELER_TARGET_FAILURE,
CANCELER_NOT_FULLY_PROTECTED,
CANCELER_MULTIHIT_MOVES,
CANCELER_END,
};
enum Obedience
{
OBEYS,
DISOBEYS_LOAFS,
DISOBEYS_HITS_SELF,
DISOBEYS_FALL_ASLEEP,
DISOBEYS_WHILE_ASLEEP,
DISOBEYS_RANDOM_MOVE,
};
enum MoveCanceler
{
MOVE_STEP_SUCCESS,
MOVE_STEP_BREAK, // Runs script. Increments state
MOVE_STEP_PAUSE, // Runs script. Does not increment state
MOVE_STEP_FAILURE, // Move failed, jump to script that handles the failure
};
enum ImmunityHealStatusOutcome
{
IMMUNITY_NO_EFFECT,
@ -240,6 +176,7 @@ void HandleAction_ThrowBall(void);
uq4_12_t CalcTypeEffectivenessMultiplierHelper(enum Move move, enum Type moveType, u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, bool32 recordAbilities);
u32 GetCurrentBattleWeather(void);
bool32 EndOrContinueWeather(void);
enum DamageCategory GetReflectDamageMoveDamageCategory(u32 battler, enum Move move);
bool32 IsUnnerveBlocked(u32 battler, enum Item itemId);
bool32 IsAffectedByFollowMe(u32 battlerAtk, enum BattleSide defSide, enum Move move);
void DetermineTarget(enum MoveTarget moveTarget, bool32 overwriteTarget);
@ -280,7 +217,6 @@ s32 GetDrainedBigRootHp(u32 battler, s32 hp);
bool32 IsAbilityAndRecord(u32 battler, enum Ability battlerAbility, enum Ability abilityToCheck);
bool32 HandleFaintedMonActions(void);
void TryClearRageAndFuryCutter(void);
enum MoveCanceler AtkCanceler_MoveSuccessOrder(void);
bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2);
bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, enum Ability ability);
bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag);
@ -363,6 +299,7 @@ void SetDynamicMoveCategory(u32 battlerAtk, u32 battlerDef, enum Move move);
bool32 CanFling(u32 battlerAtk, u32 battlerDef);
bool32 IsTelekinesisBannedSpecies(u16 species);
bool32 IsHealBlockPreventingMove(u32 battler, enum Move move);
bool32 IsGravityPreventingMove(enum Move move);
bool32 IsBelchPreventingMove(u32 battler, enum Move move);
bool32 HasEnoughHpToEatBerry(u32 battler, enum Ability ability, u32 hpFraction, enum Item itemId);
bool32 IsPartnerMonFromSameTrainer(u32 battler);

View File

@ -1,11 +1,75 @@
#ifndef GUARD_CONSTANTS_BATTLE_MOVE_RESOLUTION_H
#define GUARD_CONSTANTS_BATTLE_MOVE_RESOLUTION_H
enum Obedience
{
OBEYS,
DISOBEYS_LOAFS,
DISOBEYS_HITS_SELF,
DISOBEYS_FALL_ASLEEP,
DISOBEYS_WHILE_ASLEEP,
DISOBEYS_RANDOM_MOVE,
};
enum CancelerResult
{
CANCELER_RESULT_SUCCESS,
CANCELER_RESULT_BREAK, // Runs script. Increments state
CANCELER_RESULT_PAUSE, // Runs script. Does not increment state
CANCELER_RESULT_FAILURE, // Move failed, jump to script that handles the failure
};
enum CancelerState
{
CANCELER_STANCE_CHANGE_1,
CANCELER_CLEAR_FLAGS,
CANCELER_SKY_DROP,
CANCELER_RECHARGE,
CANCELER_CHILLY_RECEPTION,
CANCELER_ASLEEP_OR_FROZEN,
CANCELER_POWER_POINTS,
CANCELER_OBEDIENCE,
CANCELER_TRUANT,
CANCELER_FOCUS_GEN5,
CANCELER_FLINCH,
CANCELER_DISABLED,
CANCELER_VOLATILE_BLOCKED, // Gravity / Heal Block / Throat Chop
CANCELER_TAUNTED,
CANCELER_IMPRISONED,
CANCELER_CONFUSED,
CANCELER_PARALYZED,
CANCELER_INFATUATION,
CANCELER_BIDE,
CANCELER_Z_MOVES,
CANCELER_CHOICE_LOCK,
CANCELER_CALLSUBMOVE,
CANCELER_THAW,
CANCELER_STANCE_CHANGE_2,
CANCELER_ATTACKSTRING,
CANCELER_PPDEDUCTION,
CANCELER_SKY_BATTLE,
CANCELER_WEATHER_PRIMAL,
CANCELER_FOCUS_PRE_GEN5,
CANCELER_MOVE_FAILURE,
CANCELER_POWDER_STATUS,
CANCELER_PRIORITY_BLOCK,
CANCELER_PROTEAN,
CANCELER_EXPLODING_DAMP,
CANCELER_EXPLOSION,
CANCELER_CHARGING,
CANCELER_NO_TARGET,
CANCELER_TOOK_ATTACK,
CANCELER_TARGET_FAILURE,
CANCELER_NOT_FULLY_PROTECTED,
CANCELER_MULTIHIT_MOVES,
CANCELER_END,
};
enum MoveEndResult
{
MOVEEND_STEP_CONTINUE,
MOVEEND_STEP_RUN_SCRIPT,
MOVEEND_STEP_BREAK,
MOVEEND_RESULT_CONTINUE,
MOVEEND_RESULT_RUN_SCRIPT,
MOVEEND_RESULT_BREAK,
};
// cases for Cmd_moveend - Order matters!

File diff suppressed because it is too large Load Diff

View File

@ -1034,7 +1034,7 @@ static void Cmd_attackcanceler(void)
return;
}
if (AtkCanceler_MoveSuccessOrder() != MOVE_STEP_SUCCESS)
if (DoAttackCanceler() != CANCELER_RESULT_SUCCESS)
return;
if (gBattleStruct->magicBounceActive && !gBattleStruct->bouncedMoveIsUsed)
@ -5010,10 +5010,10 @@ static void Cmd_moveend(void)
enum MoveEndResult result = DoMoveEnd(cmd->endMode, cmd->endState);
if (result == MOVEEND_STEP_BREAK)
if (result == MOVEEND_RESULT_BREAK)
return;
if (gBattleScripting.moveendState == MOVEEND_COUNT && result == MOVEEND_STEP_CONTINUE)
if (gBattleScripting.moveendState == MOVEEND_COUNT && result == MOVEEND_RESULT_CONTINUE)
gBattlescriptCurrInstr = cmd->nextInstr;
}
@ -6249,7 +6249,7 @@ static void Cmd_futuresighttargetfailure(void)
CMD_ARGS(const u8 *failInstr);
// Just do CancelerTargetFailure
if (!DONE_TARGET_FAILURE && AtkCanceler_MoveSuccessOrder() != MOVE_STEP_SUCCESS)
if (!DONE_TARGET_FAILURE && DoAttackCanceler() != CANCELER_RESULT_SUCCESS)
return;
if (IsBattlerUnaffectedByMove(gBattlerTarget))
@ -6257,6 +6257,7 @@ static void Cmd_futuresighttargetfailure(void)
else
gBattlescriptCurrInstr = cmd->nextInstr;
}
#undef DONE_TARGET_FAILURE
static u32 GetPossibleNextTarget(void)
{

File diff suppressed because it is too large Load Diff