Atk Canceller refactor / reorder / clean up (#5885)
This commit is contained in:
parent
b0b1f449a3
commit
5900a01061
@ -100,33 +100,37 @@ struct TypePower
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
CANCELLER_FLAGS,
|
CANCELLER_FLAGS,
|
||||||
|
CANCELLER_STANCE_CHANGE_1,
|
||||||
CANCELLER_SKY_DROP,
|
CANCELLER_SKY_DROP,
|
||||||
|
CANCELLER_RECHARGE,
|
||||||
CANCELLER_ASLEEP,
|
CANCELLER_ASLEEP,
|
||||||
CANCELLER_FROZEN,
|
CANCELLER_FROZEN,
|
||||||
CANCELLER_OBEDIENCE,
|
CANCELLER_OBEDIENCE,
|
||||||
CANCELLER_TRUANT,
|
CANCELLER_TRUANT,
|
||||||
CANCELLER_RECHARGE,
|
|
||||||
CANCELLER_FLINCH,
|
CANCELLER_FLINCH,
|
||||||
|
CANCELLER_IN_LOVE,
|
||||||
CANCELLER_DISABLED,
|
CANCELLER_DISABLED,
|
||||||
CANCELLER_GRAVITY,
|
|
||||||
CANCELLER_HEAL_BLOCKED,
|
CANCELLER_HEAL_BLOCKED,
|
||||||
|
CANCELLER_GRAVITY,
|
||||||
|
CANCELLER_THROAT_CHOP,
|
||||||
CANCELLER_TAUNTED,
|
CANCELLER_TAUNTED,
|
||||||
CANCELLER_IMPRISONED,
|
CANCELLER_IMPRISONED,
|
||||||
CANCELLER_CONFUSED,
|
CANCELLER_CONFUSED,
|
||||||
CANCELLER_PARALYSED,
|
CANCELLER_PARALYSED,
|
||||||
CANCELLER_IN_LOVE,
|
|
||||||
CANCELLER_BIDE,
|
CANCELLER_BIDE,
|
||||||
CANCELLER_THAW,
|
CANCELLER_THAW,
|
||||||
|
CANCELLER_STANCE_CHANGE_2,
|
||||||
|
CANCELLER_WEATHER_PRIMAL,
|
||||||
|
CANCELLER_DYNAMAX_BLOCKED,
|
||||||
CANCELLER_POWDER_MOVE,
|
CANCELLER_POWDER_MOVE,
|
||||||
CANCELLER_POWDER_STATUS,
|
CANCELLER_POWDER_STATUS,
|
||||||
CANCELLER_THROAT_CHOP,
|
CANCELLER_PROTEAN,
|
||||||
|
CANCELLER_PSYCHIC_TERRAIN,
|
||||||
CANCELLER_EXPLODING_DAMP,
|
CANCELLER_EXPLODING_DAMP,
|
||||||
CANCELLER_MULTIHIT_MOVES,
|
CANCELLER_MULTIHIT_MOVES,
|
||||||
CANCELLER_Z_MOVES,
|
CANCELLER_Z_MOVES,
|
||||||
CANCELLER_MULTI_TARGET_MOVES,
|
CANCELLER_MULTI_TARGET_MOVES,
|
||||||
CANCELLER_END,
|
CANCELLER_END,
|
||||||
CANCELLER_PSYCHIC_TERRAIN,
|
|
||||||
CANCELLER_END2,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -197,9 +201,8 @@ u8 DoBattlerEndTurnEffects(void);
|
|||||||
bool32 HandleWishPerishSongOnTurnEnd(void);
|
bool32 HandleWishPerishSongOnTurnEnd(void);
|
||||||
bool32 HandleFaintedMonActions(void);
|
bool32 HandleFaintedMonActions(void);
|
||||||
void TryClearRageAndFuryCutter(void);
|
void TryClearRageAndFuryCutter(void);
|
||||||
u8 AtkCanceller_UnableToUseMove(u32 moveType);
|
u32 AtkCanceller_MoveSuccessOrder(void);
|
||||||
void SetAtkCancellerForCalledMove(void);
|
void SetAtkCancellerForCalledMove(void);
|
||||||
u8 AtkCanceller_UnableToUseMove2(void);
|
|
||||||
bool32 HasNoMonsToSwitch(u32 battler, u8 r1, u8 r2);
|
bool32 HasNoMonsToSwitch(u32 battler, u8 r1, u8 r2);
|
||||||
bool32 TryChangeBattleWeather(u32 battler, u32 weatherEnumId, bool32 viaAbility);
|
bool32 TryChangeBattleWeather(u32 battler, u32 weatherEnumId, bool32 viaAbility);
|
||||||
u32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef);
|
u32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef);
|
||||||
|
|||||||
@ -1126,19 +1126,6 @@ static bool32 NoTargetPresent(u8 battler, u32 move)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool32 TryFormChangeBeforeMove(void)
|
|
||||||
{
|
|
||||||
bool32 result = TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_BEFORE_MOVE);
|
|
||||||
if (!result)
|
|
||||||
result = TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_BEFORE_MOVE_CATEGORY);
|
|
||||||
if (!result)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
BattleScriptPushCursor();
|
|
||||||
gBattlescriptCurrInstr = BattleScript_AttackerFormChange;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType)
|
bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType)
|
||||||
{
|
{
|
||||||
if ((ability == ABILITY_PROTEAN || ability == ABILITY_LIBERO)
|
if ((ability == ABILITY_PROTEAN || ability == ABILITY_LIBERO)
|
||||||
@ -1177,8 +1164,6 @@ static void Cmd_attackcanceler(void)
|
|||||||
CMD_ARGS();
|
CMD_ARGS();
|
||||||
|
|
||||||
s32 i;
|
s32 i;
|
||||||
u16 attackerAbility = GetBattlerAbility(gBattlerAttacker);
|
|
||||||
u32 moveType = GetMoveType(gCurrentMove);
|
|
||||||
|
|
||||||
if (gBattleStruct->usedEjectItem & (1u << gBattlerAttacker))
|
if (gBattleStruct->usedEjectItem & (1u << gBattlerAttacker))
|
||||||
{
|
{
|
||||||
@ -1187,14 +1172,6 @@ static void Cmd_attackcanceler(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Weight-based moves are blocked by Dynamax.
|
|
||||||
if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && IsMoveBlockedByDynamax(gCurrentMove))
|
|
||||||
{
|
|
||||||
BattleScriptPushCursor();
|
|
||||||
gBattlescriptCurrInstr = BattleScript_MoveBlockedByDynamax;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gBattleOutcome != 0)
|
if (gBattleOutcome != 0)
|
||||||
{
|
{
|
||||||
gCurrentActionFuncId = B_ACTION_FINISHED;
|
gCurrentActionFuncId = B_ACTION_FINISHED;
|
||||||
@ -1207,28 +1184,8 @@ static void Cmd_attackcanceler(void)
|
|||||||
gBattlescriptCurrInstr = BattleScript_MoveEnd;
|
gBattlescriptCurrInstr = BattleScript_MoveEnd;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (B_STANCE_CHANGE_FAIL < GEN_7 && TryFormChangeBeforeMove())
|
if (AtkCanceller_MoveSuccessOrder())
|
||||||
return;
|
return;
|
||||||
if (AtkCanceller_UnableToUseMove(moveType))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (WEATHER_HAS_EFFECT && gMovesInfo[gCurrentMove].power)
|
|
||||||
{
|
|
||||||
if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL))
|
|
||||||
{
|
|
||||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN;
|
|
||||||
BattleScriptPushCursor();
|
|
||||||
gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (moveType == TYPE_WATER && (gBattleWeather & B_WEATHER_SUN_PRIMAL))
|
|
||||||
{
|
|
||||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_EVAPORATED_IN_SUN;
|
|
||||||
BattleScriptPushCursor();
|
|
||||||
gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF
|
if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF
|
||||||
&& GetBattlerAbility(gBattlerAttacker) == ABILITY_PARENTAL_BOND
|
&& GetBattlerAbility(gBattlerAttacker) == ABILITY_PARENTAL_BOND
|
||||||
@ -1242,22 +1199,6 @@ static void Cmd_attackcanceler(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check Protean activation.
|
|
||||||
if (ProteanTryChangeType(gBattlerAttacker, attackerAbility, gCurrentMove, moveType))
|
|
||||||
{
|
|
||||||
if (B_PROTEAN_LIBERO == GEN_9)
|
|
||||||
gDisableStructs[gBattlerAttacker].usedProteanLibero = TRUE;
|
|
||||||
PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType);
|
|
||||||
gBattlerAbility = gBattlerAttacker;
|
|
||||||
BattleScriptPushCursor();
|
|
||||||
PrepareStringBattle(STRINGID_EMPTYSTRING3, gBattlerAttacker);
|
|
||||||
gBattleCommunication[MSG_DISPLAY] = 1;
|
|
||||||
gBattlescriptCurrInstr = BattleScript_ProteanActivates;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (AtkCanceller_UnableToUseMove2())
|
|
||||||
return;
|
|
||||||
if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBattlerTarget, 0, 0, 0))
|
if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBattlerTarget, 0, 0, 0))
|
||||||
return;
|
return;
|
||||||
if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE
|
if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE
|
||||||
@ -1268,8 +1209,6 @@ static void Cmd_attackcanceler(void)
|
|||||||
gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED;
|
gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (B_STANCE_CHANGE_FAIL >= GEN_7 && TryFormChangeBeforeMove())
|
|
||||||
return;
|
|
||||||
|
|
||||||
gHitMarker &= ~HITMARKER_ALLOW_NO_PP;
|
gHitMarker &= ~HITMARKER_ALLOW_NO_PP;
|
||||||
|
|
||||||
|
|||||||
1296
src/battle_util.c
1296
src/battle_util.c
File diff suppressed because it is too large
Load Diff
@ -63,7 +63,6 @@ SINGLE_BATTLE_TEST("Stance Change changes Aegislash from Blade to Shield when us
|
|||||||
|
|
||||||
SINGLE_BATTLE_TEST("Stance Change doesn't change Aegislash to Shield if King's Shield is called by a different move - Sleep Talk")
|
SINGLE_BATTLE_TEST("Stance Change doesn't change Aegislash to Shield if King's Shield is called by a different move - Sleep Talk")
|
||||||
{
|
{
|
||||||
KNOWN_FAILING; // Currently does change form
|
|
||||||
GIVEN {
|
GIVEN {
|
||||||
ASSUME(gMovesInfo[MOVE_SLEEP_TALK].effect == EFFECT_SLEEP_TALK);
|
ASSUME(gMovesInfo[MOVE_SLEEP_TALK].effect == EFFECT_SLEEP_TALK);
|
||||||
PLAYER(SPECIES_AEGISLASH_BLADE) { Moves(MOVE_KINGS_SHIELD, MOVE_SLEEP_TALK); Status1(STATUS1_SLEEP_TURN(3)); }
|
PLAYER(SPECIES_AEGISLASH_BLADE) { Moves(MOVE_KINGS_SHIELD, MOVE_SLEEP_TALK); Status1(STATUS1_SLEEP_TURN(3)); }
|
||||||
|
|||||||
@ -1431,6 +1431,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max One Blow bypasses Max Guard for full damage"
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Bug Testing
|
// Bug Testing
|
||||||
|
// This test will fail if it's the first test a thread runs
|
||||||
DOUBLE_BATTLE_TEST("(DYNAMAX) Max Flare doesn't softlock the game when fainting player partner")
|
DOUBLE_BATTLE_TEST("(DYNAMAX) Max Flare doesn't softlock the game when fainting player partner")
|
||||||
{
|
{
|
||||||
GIVEN {
|
GIVEN {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user