summaryrefslogtreecommitdiff
path: root/src/battle_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/battle_util.c')
-rw-r--r--src/battle_util.c455
1 files changed, 180 insertions, 275 deletions
diff --git a/src/battle_util.c b/src/battle_util.c
index 7b47bc994..11fd31524 100644
--- a/src/battle_util.c
+++ b/src/battle_util.c
@@ -99,10 +99,10 @@ void HandleAction_UseMove(void)
// choose move
if (gProtectStructs[gBattlerAttacker].noValidMoves)
{
- gProtectStructs[gBattlerAttacker].noValidMoves = 0;
+ gProtectStructs[gBattlerAttacker].noValidMoves = FALSE;
gCurrentMove = gChosenMove = MOVE_STRUGGLE;
gHitMarker |= HITMARKER_NO_PPDEDUCT;
- *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0);
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, NO_TARGET_OVERRIDE);
}
else if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE)
{
@@ -114,7 +114,7 @@ void HandleAction_UseMove(void)
{
gCurrentMove = gChosenMove = gDisableStructs[gBattlerAttacker].encoredMove;
gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos;
- *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0);
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
}
// check if the encored move wasn't overwritten
else if (gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE
@@ -125,12 +125,12 @@ void HandleAction_UseMove(void)
gDisableStructs[gBattlerAttacker].encoredMove = MOVE_NONE;
gDisableStructs[gBattlerAttacker].encoredMovePos = 0;
gDisableStructs[gBattlerAttacker].encoreTimer = 0;
- *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0);
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
}
else if (gBattleMons[gBattlerAttacker].moves[gCurrMovePos] != gChosenMoveByBattler[gBattlerAttacker])
{
gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];
- *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0);
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
}
else
{
@@ -323,11 +323,11 @@ void HandleAction_UseItem(void)
}
else if (gLastUsedItem == ITEM_POKE_DOLL || gLastUsedItem == ITEM_FLUFFY_TAIL)
{
- gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0];
+ gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0]; // BattleScript_RunByUsingItem
}
else if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
{
- gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0];
+ gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0]; // BattleScript_PlayerUsesItem
}
else
{
@@ -417,7 +417,7 @@ bool8 TryRunFromBattle(u8 battler)
if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN)
{
gLastUsedItem = gBattleMons[battler].item;
- gProtectStructs[battler].fleeFlag = 1;
+ gProtectStructs[battler].fleeType = FLEE_ITEM;
effect++;
}
else if (gBattleMons[battler].ability == ABILITY_RUN_AWAY)
@@ -430,14 +430,14 @@ bool8 TryRunFromBattle(u8 battler)
if (speedVar > (Random() & 0xFF))
{
gLastUsedAbility = ABILITY_RUN_AWAY;
- gProtectStructs[battler].fleeFlag = 2;
+ gProtectStructs[battler].fleeType = FLEE_ABILITY;
effect++;
}
}
else
{
gLastUsedAbility = ABILITY_RUN_AWAY;
- gProtectStructs[battler].fleeFlag = 2;
+ gProtectStructs[battler].fleeType = FLEE_ABILITY;
effect++;
}
}
@@ -562,7 +562,7 @@ void HandleAction_ThrowPokeblock(void)
gBattleCommunication[MULTISTRING_CHOOSER] = gBattleBufferB[gBattlerAttacker][1] - 1;
gLastUsedItem = gBattleBufferB[gBattlerAttacker][2];
- if (gBattleResults.pokeblockThrows < 0xFF)
+ if (gBattleResults.pokeblockThrows < 255)
gBattleResults.pokeblockThrows++;
if (gBattleStruct->safariPkblThrowCounter < 3)
gBattleStruct->safariPkblThrowCounter++;
@@ -653,7 +653,7 @@ void HandleAction_NothingIsFainted(void)
void HandleAction_ActionFinished(void)
{
- *(gBattleStruct->monToSwitchIntoId + gBattlerByTurnOrder[gCurrentTurnActionNumber]) = 6;
+ *(gBattleStruct->monToSwitchIntoId + gBattlerByTurnOrder[gCurrentTurnActionNumber]) = PARTY_SIZE;
gCurrentTurnActionNumber++;
gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber];
SpecialStatusesClear();
@@ -679,7 +679,6 @@ void HandleAction_ActionFinished(void)
gBattleResources->battleScriptsStack->size = 0;
}
-// rom const data
static const u16 sSoundMovesTable[] =
{
MOVE_GROWL, MOVE_ROAR, MOVE_SING, MOVE_SUPERSONIC, MOVE_SCREECH, MOVE_SNORE,
@@ -709,13 +708,13 @@ u8 GetBattlerForBattleScript(u8 caseId)
case BS_FAINTED:
ret = gBattlerFainted;
break;
- case 5:
+ case BS_UNK_5:
ret = gBattlerFainted;
break;
- case 4:
- case 6:
- case 8:
- case 9:
+ case BS_ATTACKER_WITH_PARTNER:
+ case BS_UNK_6:
+ case BS_ATTACKER_SIDE:
+ case BS_NOT_ATTACKER_SIDE:
case BS_PLAYER1:
ret = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
break;
@@ -763,7 +762,7 @@ void PressurePPLose(u8 target, u8 attacker, u16 move)
void PressurePPLoseOnUsingImprison(u8 attacker)
{
int i, j;
- int imprisonPos = 4;
+ int imprisonPos = MAX_MON_MOVES;
u8 atkSide = GetBattlerSide(attacker);
for (i = 0; i < gBattlersCount; i++)
@@ -797,7 +796,7 @@ void PressurePPLoseOnUsingImprison(u8 attacker)
void PressurePPLoseOnUsingPerishSong(u8 attacker)
{
int i, j;
- int perishSongPos = 4;
+ int perishSongPos = MAX_MON_MOVES;
for (i = 0; i < gBattlersCount; i++)
{
@@ -858,17 +857,17 @@ void MarkBattlerReceivedLinkData(u8 battlerId)
for (i = 0; i < GetLinkPlayerCount(); i++)
gBattleControllerExecFlags |= gBitTable[battlerId] << (i << 2);
- gBattleControllerExecFlags &= ~(0x10000000 << battlerId);
+ gBattleControllerExecFlags &= ~((1 << 28) << battlerId);
}
void CancelMultiTurnMoves(u8 battler)
{
- gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS);
- gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE);
- gBattleMons[battler].status2 &= ~(STATUS2_UPROAR);
- gBattleMons[battler].status2 &= ~(STATUS2_BIDE);
+ gBattleMons[battler].status2 &= ~STATUS2_MULTIPLETURNS;
+ gBattleMons[battler].status2 &= ~STATUS2_LOCK_CONFUSE;
+ gBattleMons[battler].status2 &= ~STATUS2_UPROAR;
+ gBattleMons[battler].status2 &= ~STATUS2_BIDE;
- gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE);
+ gStatuses3[battler] &= ~STATUS3_SEMI_INVULNERABLE;
gDisableStructs[battler].rolloutTimer = 0;
gDisableStructs[battler].furyCutterCounter = 0;
@@ -927,7 +926,6 @@ void OpponentSwitchInResetSentPokesToOpponentValue(u8 battler)
if (!(gAbsentBattlerFlags & gBitTable[i]))
bits |= gBitTable[gBattlerPartyIndexes[i]];
}
-
gSentPokesToOpponent[flank] = bits;
}
}
@@ -975,7 +973,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingDisabledMoveInPalace;
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -990,7 +988,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingTormentedMoveInPalace;
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -1005,7 +1003,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveTauntInPalace;
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -1020,7 +1018,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingImprisonedMoveInPalace;
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -1036,13 +1034,13 @@ u8 TrySetCantSelectMoveBattleScript(void)
gPotentialItemEffectBattler = gActiveBattler;
- if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != move)
+ if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != 0xFFFF && *choicedMove != move)
{
gCurrentMove = *choicedMove;
gLastUsedItem = gBattleMons[gActiveBattler].item;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -1055,7 +1053,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -1082,43 +1080,53 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check)
for (i = 0; i < MAX_MON_MOVES; i++)
{
- if (gBattleMons[battlerId].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE)
+ // No move
+ if (gBattleMons[battlerId].moves[i] == MOVE_NONE && check & MOVE_LIMITATION_ZEROMOVE)
unusableMoves |= gBitTable[i];
+ // No PP
if (gBattleMons[battlerId].pp[i] == 0 && check & MOVE_LIMITATION_PP)
unusableMoves |= gBitTable[i];
+ // Disable
if (gBattleMons[battlerId].moves[i] == gDisableStructs[battlerId].disabledMove && check & MOVE_LIMITATION_DISABLED)
unusableMoves |= gBitTable[i];
+ // Torment
if (gBattleMons[battlerId].moves[i] == gLastMoves[battlerId] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[battlerId].status2 & STATUS2_TORMENT)
unusableMoves |= gBitTable[i];
+ // Taunt
if (gDisableStructs[battlerId].tauntTimer && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0)
unusableMoves |= gBitTable[i];
+ // Imprison
if (GetImprisonedMovesCount(battlerId, gBattleMons[battlerId].moves[i]) && check & MOVE_LIMITATION_IMPRISON)
unusableMoves |= gBitTable[i];
+ // Encore
if (gDisableStructs[battlerId].encoreTimer && gDisableStructs[battlerId].encoredMove != gBattleMons[battlerId].moves[i])
unusableMoves |= gBitTable[i];
- if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[battlerId].moves[i])
+ // Choice Band
+ if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[battlerId].moves[i])
unusableMoves |= gBitTable[i];
}
return unusableMoves;
}
+#define ALL_MOVES_MASK ((1 << MAX_MON_MOVES) - 1)
bool8 AreAllMovesUnusable(void)
{
u8 unusable;
- unusable = CheckMoveLimitations(gActiveBattler, 0, 0xFF);
+ unusable = CheckMoveLimitations(gActiveBattler, 0, MOVE_LIMITATIONS_ALL);
- if (unusable == 0xF) // All moves are unusable.
+ if (unusable == ALL_MOVES_MASK) // All moves are unusable.
{
- gProtectStructs[gActiveBattler].noValidMoves = 1;
+ gProtectStructs[gActiveBattler].noValidMoves = TRUE;
gSelectionBattleScripts[gActiveBattler] = BattleScript_NoMovesLeft;
}
else
{
- gProtectStructs[gActiveBattler].noValidMoves = 0;
+ gProtectStructs[gActiveBattler].noValidMoves = FALSE;
}
- return (unusable == 0xF);
+ return (unusable == ALL_MOVES_MASK);
}
+#undef ALL_MOVES_MASK
u8 GetImprisonedMovesCount(u8 battlerId, u16 move)
{
@@ -1475,12 +1483,12 @@ u8 DoBattlerEndTurnEffects(void)
gBattleStruct->turnEffectsTracker++;
break;
case ENDTURN_ITEMS1: // item effects
- if (ItemBattleEffects(1, gActiveBattler, FALSE))
+ if (ItemBattleEffects(ITEMEFFECT_NORMAL, gActiveBattler, FALSE))
effect++;
gBattleStruct->turnEffectsTracker++;
break;
case ENDTURN_ITEMS2: // item effects again
- if (ItemBattleEffects(1, gActiveBattler, TRUE))
+ if (ItemBattleEffects(ITEMEFFECT_NORMAL, gActiveBattler, TRUE))
effect++;
gBattleStruct->turnEffectsTracker++;
break;
@@ -1608,8 +1616,8 @@ u8 DoBattlerEndTurnEffects(void)
if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)
&& gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF)
{
- gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP);
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP;
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
BattleScriptExecute(BattleScript_MonWokeUpInUproar);
gActiveBattler = gBattlerAttacker;
@@ -1658,7 +1666,7 @@ u8 DoBattlerEndTurnEffects(void)
else if (!(gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE)
&& (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS))
{
- gBattleMons[gActiveBattler].status2 &= ~(STATUS2_MULTIPLETURNS);
+ gBattleMons[gActiveBattler].status2 &= ~STATUS2_MULTIPLETURNS;
if (!(gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION))
{
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER;
@@ -1797,7 +1805,7 @@ bool8 HandleWishPerishSongOnTurnEnd(void)
if (gWishFutureKnock.futureSightCounter[gActiveBattler] == 0
&& gWishFutureKnock.futureSightCounter[gActiveBattler ^ BIT_FLANK] == 0)
{
- gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)] &= ~(SIDE_STATUS_FUTUREATTACK);
+ gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)] &= ~SIDE_STATUS_FUTUREATTACK;
}
return TRUE;
}
@@ -1934,7 +1942,10 @@ bool8 HandleFaintedMonActions(void)
gBattleStruct->faintedActionsState = 4;
break;
case 6:
- if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) || AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) || ItemBattleEffects(1, 0, TRUE) || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0))
+ if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0)
+ || AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0)
+ || ItemBattleEffects(ITEMEFFECT_NORMAL, 0, TRUE)
+ || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0))
return TRUE;
gBattleStruct->faintedActionsState++;
break;
@@ -1951,7 +1962,7 @@ void TryClearRageStatuses(void)
for (i = 0; i < gBattlersCount; i++)
{
if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE)
- gBattleMons[i].status2 &= ~(STATUS2_RAGE);
+ gBattleMons[i].status2 &= ~STATUS2_RAGE;
}
}
@@ -1983,8 +1994,8 @@ u8 AtkCanceller_UnableToUseMove(void)
switch (gBattleStruct->atkCancellerTracker)
{
case CANCELLER_FLAGS: // flags clear
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_DESTINY_BOND);
- gStatuses3[gBattlerAttacker] &= ~(STATUS3_GRUDGE);
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_DESTINY_BOND;
+ gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE;
gBattleStruct->atkCancellerTracker++;
break;
case CANCELLER_ASLEEP: // check being asleep
@@ -1992,8 +2003,8 @@ u8 AtkCanceller_UnableToUseMove(void)
{
if (UproarWakeUpCheck(gBattlerAttacker))
{
- gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP);
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP;
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
@@ -2007,7 +2018,7 @@ u8 AtkCanceller_UnableToUseMove(void)
else
toSub = 1;
if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) < toSub)
- gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP);
+ gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP;
else
gBattleMons[gBattlerAttacker].status1 -= toSub;
if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)
@@ -2021,7 +2032,7 @@ u8 AtkCanceller_UnableToUseMove(void)
}
else
{
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
@@ -2049,7 +2060,7 @@ u8 AtkCanceller_UnableToUseMove(void)
}
else // unfreeze
{
- gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_FREEZE);
+ gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED;
@@ -2073,7 +2084,7 @@ u8 AtkCanceller_UnableToUseMove(void)
case CANCELLER_RECHARGE: // recharge
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE)
{
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_RECHARGE);
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RECHARGE;
gDisableStructs[gBattlerAttacker].rechargeTimer = 0;
CancelMultiTurnMoves(gBattlerAttacker);
gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge;
@@ -2085,7 +2096,7 @@ u8 AtkCanceller_UnableToUseMove(void)
case CANCELLER_FLINCH: // flinch
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED)
{
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_FLINCHED);
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_FLINCHED;
gProtectStructs[gBattlerAttacker].flinchImmobility = 1;
CancelMultiTurnMoves(gBattlerAttacker);
gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched;
@@ -2203,14 +2214,14 @@ u8 AtkCanceller_UnableToUseMove(void)
else
{
// This is removed in Emerald for some reason
- //gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_MULTIPLETURNS);
+ //gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS;
if (gTakenDmg[gBattlerAttacker])
{
gCurrentMove = MOVE_BIDE;
*bideDmg = gTakenDmg[gBattlerAttacker] * 2;
gBattlerTarget = gTakenDmgByBattler[gBattlerAttacker];
if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
- gBattlerTarget = GetMoveTarget(MOVE_BIDE, 1);
+ gBattlerTarget = GetMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1);
gBattlescriptCurrInstr = BattleScript_BideAttack;
}
else
@@ -2227,7 +2238,7 @@ u8 AtkCanceller_UnableToUseMove(void)
{
if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT)
{
- gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_FREEZE);
+ gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE;
@@ -2268,14 +2279,14 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
party = gEnemyParty;
id1 = ((battler & BIT_FLANK) / 2);
- for (i = id1 * 3; i < id1 * 3 + 3; i++)
+ for (i = id1 * MULTI_PARTY_SIZE; i < id1 * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) != 0
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG)
break;
}
- return (i == id1 * 3 + 3);
+ return (i == id1 * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE);
}
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
@@ -2308,14 +2319,14 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
id1 = GetLinkTrainerFlankId(id2);
}
- for (i = id1 * 3; i < id1 * 3 + 3; i++)
+ for (i = id1 * MULTI_PARTY_SIZE; i < id1 * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) != 0
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG)
break;
}
- return (i == id1 * 3 + 3);
+ return (i == id1 * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE);
}
else if ((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && GetBattlerSide(battler) == B_SIDE_OPPONENT)
{
@@ -2324,9 +2335,9 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
if (battler == 1)
id1 = 0;
else
- id1 = 3;
+ id1 = MULTI_PARTY_SIZE;
- for (i = id1; i < id1 + 3; i++)
+ for (i = id1; i < id1 + MULTI_PARTY_SIZE; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) != 0
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
@@ -2368,51 +2379,41 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
}
}
-enum
-{
- CASTFORM_NO_CHANGE, //0
- CASTFORM_TO_NORMAL, //1
- CASTFORM_TO_FIRE, //2
- CASTFORM_TO_WATER, //3
- CASTFORM_TO_ICE, //4
-};
-
u8 CastformDataTypeChange(u8 battler)
{
u8 formChange = 0;
if (gBattleMons[battler].species != SPECIES_CASTFORM || gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0)
- return CASTFORM_NO_CHANGE;
+ return 0; // No change
if (!WEATHER_HAS_EFFECT && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
{
SET_BATTLER_TYPE(battler, TYPE_NORMAL);
- return CASTFORM_TO_NORMAL;
+ return CASTFORM_NORMAL + 1;
}
if (!WEATHER_HAS_EFFECT)
- return CASTFORM_NO_CHANGE;
+ return 0; // No change
if (!(gBattleWeather & (B_WEATHER_RAIN | B_WEATHER_SUN | B_WEATHER_HAIL)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
{
SET_BATTLER_TYPE(battler, TYPE_NORMAL);
- formChange = CASTFORM_TO_NORMAL;
+ formChange = CASTFORM_NORMAL + 1;
}
if (gBattleWeather & B_WEATHER_SUN && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE))
{
SET_BATTLER_TYPE(battler, TYPE_FIRE);
- formChange = CASTFORM_TO_FIRE;
+ formChange = CASTFORM_FIRE + 1;
}
if (gBattleWeather & B_WEATHER_RAIN && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER))
{
SET_BATTLER_TYPE(battler, TYPE_WATER);
- formChange = CASTFORM_TO_WATER;
+ formChange = CASTFORM_WATER + 1;
}
if (gBattleWeather & B_WEATHER_HAIL && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE))
{
SET_BATTLER_TYPE(battler, TYPE_ICE);
- formChange = CASTFORM_TO_ICE;
+ formChange = CASTFORM_ICE + 1;
}
return formChange;
}
-// The largest function in the game, but even it could not save itself from decompiling.
u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg)
{
u8 effect = 0;
@@ -2550,7 +2551,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
break;
case ABILITY_FORECAST:
effect = CastformDataTypeChange(battler);
- if (effect != 0)
+ if (effect)
{
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
gBattleScripting.battler = battler;
@@ -2571,7 +2572,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
for (target1 = 0; target1 < gBattlersCount; target1++)
{
effect = CastformDataTypeChange(target1);
- if (effect != 0)
+ if (effect)
{
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
gBattleScripting.battler = target1;
@@ -2616,7 +2617,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
if (gBattleMons[battler].status1 & STATUS1_FREEZE)
StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
gBattleMons[battler].status1 = 0;
- gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); // fix nightmare glitch
+ gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; // fix nightmare glitch
gBattleScripting.battler = gActiveBattler = battler;
BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates);
BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1);
@@ -2884,7 +2885,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
case ABILITY_VITAL_SPIRIT:
if (gBattleMons[battler].status1 & STATUS1_SLEEP)
{
- gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE;
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
effect = 1;
}
@@ -2919,10 +2920,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
gBattleMons[battler].status1 = 0;
break;
case 2: // get rid of confusion
- gBattleMons[battler].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battler].status2 &= ~STATUS2_CONFUSION;
break;
case 3: // get rid of infatuation
- gBattleMons[battler].status2 &= ~(STATUS2_INFATUATION);
+ gBattleMons[battler].status2 &= ~STATUS2_INFATUATION;
break;
}
@@ -2955,7 +2956,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
case ABILITYEFFECT_SYNCHRONIZE: // 7
if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))
{
- gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT);
+ gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT;
gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);
if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC)
gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON;
@@ -2971,7 +2972,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8
if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))
{
- gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT);
+ gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT;
gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);
if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC)
gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON;
@@ -2990,7 +2991,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES)
{
gLastUsedAbility = ABILITY_INTIMIDATE;
- gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES);
+ gStatuses3[i] &= ~STATUS3_INTIMIDATE_POKES;
BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3);
gBattleStruct->intimidateBattler = i;
effect++;
@@ -3045,7 +3046,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
if (effect)
{
BattleScriptPushCursorAndCallback(BattleScript_TraceActivates);
- gStatuses3[i] &= ~(STATUS3_TRACE);
+ gStatuses3[i] &= ~STATUS3_TRACE;
gBattleScripting.battler = i;
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler])
@@ -3061,7 +3062,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES))
{
gLastUsedAbility = ABILITY_INTIMIDATE;
- gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES);
+ gStatuses3[i] &= ~STATUS3_INTIMIDATE_POKES;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_IntimidateActivates;
gBattleStruct->intimidateBattler = i;
@@ -3200,14 +3201,44 @@ void BattleScriptPushCursorAndCallback(const u8 *BS_ptr)
enum
{
- ITEM_NO_EFFECT, // 0
- ITEM_STATUS_CHANGE, // 1
- ITEM_EFFECT_OTHER, // 2
- ITEM_PP_CHANGE, // 3
- ITEM_HP_CHANGE, // 4
- ITEM_STATS_CHANGE, // 5
+ ITEM_NO_EFFECT,
+ ITEM_STATUS_CHANGE,
+ ITEM_EFFECT_OTHER,
+ ITEM_PP_CHANGE,
+ ITEM_HP_CHANGE,
+ ITEM_STATS_CHANGE,
};
+#define TRY_EAT_CONFUSE_BERRY(flavor) \
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) \
+ { \
+ PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavor); \
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; \
+ if (gBattleMoveDamage == 0) \
+ gBattleMoveDamage = 1; \
+ if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) \
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; \
+ gBattleMoveDamage *= -1; \
+ if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, flavor) < 0) \
+ BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); \
+ else \
+ BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); \
+ effect = ITEM_HP_CHANGE; \
+ }
+
+#define TRY_EAT_STAT_UP_BERRY(stat) \
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam \
+ && !moveTurn && gBattleMons[battlerId].statStages[stat] < MAX_STAT_STAGE) \
+ { \
+ PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); \
+ gEffectBattler = battlerId; \
+ SET_STATCHANGER(stat, 1, FALSE); \
+ gBattleScripting.animArg1 = 14 + (stat); \
+ gBattleScripting.animArg2 = 0; \
+ BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); \
+ effect = ITEM_STATS_CHANGE; \
+ }
+
u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
{
int i = 0;
@@ -3282,7 +3313,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
break;
}
break;
- case 1:
+ case ITEMEFFECT_NORMAL:
if (gBattleMons[battlerId].hp)
{
switch (battlerHoldEffect)
@@ -3295,7 +3326,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
gBattleMoveDamage *= -1;
BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = 4;
+ effect = ITEM_HP_CHANGE;
}
break;
case HOLD_EFFECT_RESTORE_PP:
@@ -3365,105 +3396,27 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
RecordItemEffectBattle(battlerId, battlerHoldEffect);
}
break;
- // nice copy/paste there gamefreak, making a function for confuse berries was too much eh?
case HOLD_EFFECT_CONFUSE_SPICY:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
- {
- PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SPICY);
-
- gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
- if (gBattleMoveDamage == 0)
- gBattleMoveDamage = 1;
- if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
- gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
- gBattleMoveDamage *= -1;
- if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SPICY) < 0)
- BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
- else
- BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = ITEM_HP_CHANGE;
- }
+ TRY_EAT_CONFUSE_BERRY(FLAVOR_SPICY);
break;
case HOLD_EFFECT_CONFUSE_DRY:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
- {
- PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_DRY);
-
- gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
- if (gBattleMoveDamage == 0)
- gBattleMoveDamage = 1;
- if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
- gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
- gBattleMoveDamage *= -1;
- if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_DRY) < 0)
- BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
- else
- BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = ITEM_HP_CHANGE;
- }
+ TRY_EAT_CONFUSE_BERRY(FLAVOR_DRY);
break;
case HOLD_EFFECT_CONFUSE_SWEET:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
- {
- PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SWEET);
-
- gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
- if (gBattleMoveDamage == 0)
- gBattleMoveDamage = 1;
- if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
- gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
- gBattleMoveDamage *= -1;
- if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SWEET) < 0)
- BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
- else
- BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = ITEM_HP_CHANGE;
- }
+ TRY_EAT_CONFUSE_BERRY(FLAVOR_SWEET);
break;
case HOLD_EFFECT_CONFUSE_BITTER:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
- {
- PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_BITTER);
-
- gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
- if (gBattleMoveDamage == 0)
- gBattleMoveDamage = 1;
- if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
- gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
- gBattleMoveDamage *= -1;
- if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_BITTER) < 0)
- BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
- else
- BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = ITEM_HP_CHANGE;
- }
+ TRY_EAT_CONFUSE_BERRY(FLAVOR_BITTER);
break;
case HOLD_EFFECT_CONFUSE_SOUR:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
- {
- PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SOUR);
-
- gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
- if (gBattleMoveDamage == 0)
- gBattleMoveDamage = 1;
- if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
- gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
- gBattleMoveDamage *= -1;
- if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SOUR) < 0)
- BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
- else
- BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = ITEM_HP_CHANGE;
- }
+ TRY_EAT_CONFUSE_BERRY(FLAVOR_SOUR);
break;
- // copy/paste again, smh
case HOLD_EFFECT_ATTACK_UP:
if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam
- && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < MAX_STAT_STAGE)
+ && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < MAX_STAT_STAGE)
{
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK);
- PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE);
-
+ PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); // Only the Attack stat-up berry has this
gEffectBattler = battlerId;
SET_STATCHANGER(STAT_ATK, 1, FALSE);
gBattleScripting.animArg1 = 14 + STAT_ATK;
@@ -3473,60 +3426,16 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
}
break;
case HOLD_EFFECT_DEFENSE_UP:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn
- && gBattleMons[battlerId].statStages[STAT_DEF] < MAX_STAT_STAGE)
- {
- PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF);
-
- gEffectBattler = battlerId;
- SET_STATCHANGER(STAT_DEF, 1, FALSE);
- gBattleScripting.animArg1 = 14 + STAT_DEF;
- gBattleScripting.animArg2 = 0;
- BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
- effect = ITEM_STATS_CHANGE;
- }
+ TRY_EAT_STAT_UP_BERRY(STAT_DEF);
break;
case HOLD_EFFECT_SPEED_UP:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn
- && gBattleMons[battlerId].statStages[STAT_SPEED] < MAX_STAT_STAGE)
- {
- PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPEED);
-
- gEffectBattler = battlerId;
- SET_STATCHANGER(STAT_SPEED, 1, FALSE);
- gBattleScripting.animArg1 = 14 + STAT_SPEED;
- gBattleScripting.animArg2 = 0;
- BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
- effect = ITEM_STATS_CHANGE;
- }
+ TRY_EAT_STAT_UP_BERRY(STAT_SPEED);
break;
case HOLD_EFFECT_SP_ATTACK_UP:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn
- && gBattleMons[battlerId].statStages[STAT_SPATK] < MAX_STAT_STAGE)
- {
- PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK);
-
- gEffectBattler = battlerId;
- SET_STATCHANGER(STAT_SPATK, 1, FALSE);
- gBattleScripting.animArg1 = 14 + STAT_SPATK;
- gBattleScripting.animArg2 = 0;
- BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
- effect = ITEM_STATS_CHANGE;
- }
+ TRY_EAT_STAT_UP_BERRY(STAT_SPATK);
break;
case HOLD_EFFECT_SP_DEFENSE_UP:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn
- && gBattleMons[battlerId].statStages[STAT_SPDEF] < MAX_STAT_STAGE)
- {
- PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF);
-
- gEffectBattler = battlerId;
- SET_STATCHANGER(STAT_SPDEF, 1, FALSE);
- gBattleScripting.animArg1 = 14 + STAT_SPDEF;
- gBattleScripting.animArg2 = 0;
- BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
- effect = ITEM_STATS_CHANGE;
- }
+ TRY_EAT_STAT_UP_BERRY(STAT_SPDEF);
break;
case HOLD_EFFECT_CRITICAL_UP:
if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn
@@ -3540,16 +3449,16 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_RANDOM_STAT_UP:
if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam)
{
- for (i = 0; i < 5; i++)
+ for (i = 0; i < NUM_STATS - 1; i++)
{
if (gBattleMons[battlerId].statStages[STAT_ATK + i] < MAX_STAT_STAGE)
break;
}
- if (i != 5)
+ if (i != NUM_STATS - 1)
{
do
{
- i = Random() % 5;
+ i = Random() % (NUM_STATS - 1);
} while (gBattleMons[battlerId].statStages[STAT_ATK + i] == MAX_STAT_STAGE);
PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1);
@@ -3575,7 +3484,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_PAR:
if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS);
+ gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS;
BattleScriptExecute(BattleScript_BerryCurePrlzEnd2);
effect = ITEM_STATUS_CHANGE;
}
@@ -3591,7 +3500,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_BRN:
if (gBattleMons[battlerId].status1 & STATUS1_BURN)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_BURN);
+ gBattleMons[battlerId].status1 &= ~STATUS1_BURN;
BattleScriptExecute(BattleScript_BerryCureBrnEnd2);
effect = ITEM_STATUS_CHANGE;
}
@@ -3599,7 +3508,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_FRZ:
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE);
+ gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE;
BattleScriptExecute(BattleScript_BerryCureFrzEnd2);
effect = ITEM_STATUS_CHANGE;
}
@@ -3607,8 +3516,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_SLP:
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
- gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP;
+ gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
BattleScriptExecute(BattleScript_BerryCureSlpEnd2);
effect = ITEM_STATUS_CHANGE;
}
@@ -3616,7 +3525,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_CONFUSION:
if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
BattleScriptExecute(BattleScript_BerryCureConfusionEnd2);
effect = ITEM_EFFECT_OTHER;
}
@@ -3632,7 +3541,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
}
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
i++;
}
@@ -3656,12 +3565,12 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
i++;
}
- if (!(i > 1))
+ if (i <= 1)
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;
else
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS;
gBattleMons[battlerId].status1 = 0;
- gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2);
effect = ITEM_STATUS_CHANGE;
}
@@ -3669,7 +3578,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_ATTRACT:
if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_INFATUATION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION;
StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2);
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;
@@ -3696,7 +3605,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
}
}
break;
- case 2:
+ case ITEMEFFECT_DUMMY:
break;
case ITEMEFFECT_MOVE_END:
for (battlerId = 0; battlerId < gBattlersCount; battlerId++)
@@ -3717,7 +3626,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_PAR:
if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS);
+ gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureParRet;
effect = ITEM_STATUS_CHANGE;
@@ -3735,7 +3644,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_BRN:
if (gBattleMons[battlerId].status1 & STATUS1_BURN)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_BURN);
+ gBattleMons[battlerId].status1 &= ~STATUS1_BURN;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet;
effect = ITEM_STATUS_CHANGE;
@@ -3744,7 +3653,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_FRZ:
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE);
+ gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet;
effect = ITEM_STATUS_CHANGE;
@@ -3753,8 +3662,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_SLP:
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
- gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP;
+ gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet;
effect = ITEM_STATUS_CHANGE;
@@ -3763,7 +3672,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_CONFUSION:
if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet;
effect = ITEM_EFFECT_OTHER;
@@ -3772,7 +3681,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_ATTRACT:
if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_INFATUATION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION;
StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;
@@ -3784,32 +3693,28 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)
- {
StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
- }
+
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
}
+
if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
- {
StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
- }
+
if (gBattleMons[battlerId].status1 & STATUS1_BURN)
- {
StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
- }
+
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
- {
StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
- }
+
if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
- {
StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
- }
+
gBattleMons[battlerId].status1 = 0;
- gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;
gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet;
@@ -3895,8 +3800,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
void ClearFuryCutterDestinyBondGrudge(u8 battlerId)
{
gDisableStructs[battlerId].furyCutterCounter = 0;
- gBattleMons[battlerId].status2 &= ~(STATUS2_DESTINY_BOND);
- gStatuses3[battlerId] &= ~(STATUS3_GRUDGE);
+ gBattleMons[battlerId].status2 &= ~STATUS2_DESTINY_BOND;
+ gStatuses3[battlerId] &= ~STATUS3_GRUDGE;
}
void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands
@@ -3911,7 +3816,7 @@ u8 GetMoveTarget(u16 move, u8 setTarget)
u8 moveTarget;
u8 side;
- if (setTarget)
+ if (setTarget != NO_TARGET_OVERRIDE)
moveTarget = setTarget - 1;
else
moveTarget = gBattleMoves[move].target;
@@ -4037,7 +3942,7 @@ u8 IsMonDisobedient(void)
// is not obedient
if (gCurrentMove == MOVE_RAGE)
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_RAGE);
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RAGE;
if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK))
{
gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep;
@@ -4048,7 +3953,7 @@ u8 IsMonDisobedient(void)
calc = (gBattleMons[gBattlerAttacker].level + obedienceLevel) * rnd >> 8;
if (calc < obedienceLevel)
{
- calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], 0xFF);
+ calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], MOVE_LIMITATIONS_ALL);
if (calc == 0xF) // all moves cannot be used
{
// Randomly select, then print a disobedient string
@@ -4066,7 +3971,7 @@ u8 IsMonDisobedient(void)
gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];
gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove;
- gBattlerTarget = GetMoveTarget(gCalledMove, 0);
+ gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE);
gHitMarker |= HITMARKER_DISOBEDIENT_MOVE;
return 2;
}