From 6c550cd7490183b25caa294109da057de7824a8f Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 11 Oct 2021 03:16:59 -0300 Subject: [PATCH 1/5] Implemented Retaliate's effect --- include/battle.h | 1 + src/battle_main.c | 3 +++ src/battle_script_commands.c | 1 + src/battle_util.c | 6 +++++- 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/battle.h b/include/battle.h index 826a0929ec..aaecb9ea11 100644 --- a/include/battle.h +++ b/include/battle.h @@ -908,5 +908,6 @@ extern u8 gBattleControllerData[MAX_BATTLERS_COUNT]; extern bool8 gHasFetchedBall; extern u8 gLastUsedBall; extern u16 gLastThrownBall; +extern bool8 gCanRetaliate; #endif // GUARD_BATTLE_H diff --git a/src/battle_main.c b/src/battle_main.c index 055ec9bbe8..7d4ae76dda 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -231,6 +231,7 @@ EWRAM_DATA struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA bool8 gHasFetchedBall = FALSE; EWRAM_DATA u8 gLastUsedBall = 0; EWRAM_DATA u16 gLastThrownBall = 0; +EWRAM_DATA bool8 gCanRetaliate = FALSE; // IWRAM common vars void (*gPreBattleCallback1)(void); @@ -2876,6 +2877,8 @@ static void BattleStartClearSetData(void) gHasFetchedBall = FALSE; gLastUsedBall = 0; + gCanRetaliate = FALSE; + gBattlerAttacker = 0; gBattlerTarget = 0; gBattleWeather = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2c017b2df5..b3ac598635 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3499,6 +3499,7 @@ static void Cmd_tryfaintmon(void) if (gBattleResults.playerFaintCounter < 0xFF) gBattleResults.playerFaintCounter++; AdjustFriendshipOnBattleFaint(gActiveBattler); + gCanRetaliate = TRUE; } else { diff --git a/src/battle_util.c b/src/battle_util.c index 0bca1c0e7c..d588d5b08f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7933,7 +7933,11 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_RETALIATE: - // todo + if (gCanRetaliate) + { + MulModifier(&modifier, UQ_4_12(2.0)); + gCanRetaliate = FALSE; + } break; case EFFECT_SOLARBEAM: if (WEATHER_HAS_EFFECT && gBattleWeather & (WEATHER_HAIL_ANY | WEATHER_SANDSTORM_ANY | WEATHER_RAIN_ANY)) From 1f97198267a4af39788246db08f583df0fc85682 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 15 Oct 2021 05:02:14 -0300 Subject: [PATCH 2/5] Oops, I forgot to take the opponent's side into account --- include/battle.h | 3 ++- src/battle_main.c | 6 ++++-- src/battle_script_commands.c | 3 ++- src/battle_util.c | 7 +++++-- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/include/battle.h b/include/battle.h index aaecb9ea11..7958c40f5b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -908,6 +908,7 @@ extern u8 gBattleControllerData[MAX_BATTLERS_COUNT]; extern bool8 gHasFetchedBall; extern u8 gLastUsedBall; extern u16 gLastThrownBall; -extern bool8 gCanRetaliate; +extern bool8 gCanPlayerRetaliate; +extern bool8 gCanOpponentRetaliate; #endif // GUARD_BATTLE_H diff --git a/src/battle_main.c b/src/battle_main.c index 7d4ae76dda..ffb33da103 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -231,7 +231,8 @@ EWRAM_DATA struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA bool8 gHasFetchedBall = FALSE; EWRAM_DATA u8 gLastUsedBall = 0; EWRAM_DATA u16 gLastThrownBall = 0; -EWRAM_DATA bool8 gCanRetaliate = FALSE; +EWRAM_DATA bool8 gCanPlayerRetaliate = FALSE; +EWRAM_DATA bool8 gCanOpponentRetaliate = FALSE; // IWRAM common vars void (*gPreBattleCallback1)(void); @@ -2877,7 +2878,8 @@ static void BattleStartClearSetData(void) gHasFetchedBall = FALSE; gLastUsedBall = 0; - gCanRetaliate = FALSE; + gCanPlayerRetaliate = FALSE; + gCanOpponentRetaliate = FALSE; gBattlerAttacker = 0; gBattlerTarget = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b3ac598635..132a434cb3 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3499,13 +3499,14 @@ static void Cmd_tryfaintmon(void) if (gBattleResults.playerFaintCounter < 0xFF) gBattleResults.playerFaintCounter++; AdjustFriendshipOnBattleFaint(gActiveBattler); - gCanRetaliate = TRUE; + gCanPlayerRetaliate = TRUE; } else { if (gBattleResults.opponentFaintCounter < 0xFF) gBattleResults.opponentFaintCounter++; gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); + gCanOpponentRetaliate = TRUE; } if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0) { diff --git a/src/battle_util.c b/src/battle_util.c index d588d5b08f..689a846d64 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7933,10 +7933,13 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_RETALIATE: - if (gCanRetaliate) + if (gCanPlayerRetaliate || gCanOpponentRetaliate) { MulModifier(&modifier, UQ_4_12(2.0)); - gCanRetaliate = FALSE; + if (gCanPlayerRetaliate) + gCanPlayerRetaliate = FALSE; + else if (gCanOpponentRetaliate) + gCanOpponentRetaliate = FALSE; } break; case EFFECT_SOLARBEAM: From 3a25bce185635b9887de6eb91a9803b8e9dbb1aa Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 15 Oct 2021 06:00:24 -0300 Subject: [PATCH 3/5] Turned Retaliate's effect into a side status --- include/battle.h | 2 -- include/constants/battle.h | 1 + src/battle_main.c | 5 ----- src/battle_script_commands.c | 4 ++-- src/battle_util.c | 8 +++----- 5 files changed, 6 insertions(+), 14 deletions(-) diff --git a/include/battle.h b/include/battle.h index 7958c40f5b..826a0929ec 100644 --- a/include/battle.h +++ b/include/battle.h @@ -908,7 +908,5 @@ extern u8 gBattleControllerData[MAX_BATTLERS_COUNT]; extern bool8 gHasFetchedBall; extern u8 gLastUsedBall; extern u16 gLastThrownBall; -extern bool8 gCanPlayerRetaliate; -extern bool8 gCanOpponentRetaliate; #endif // GUARD_BATTLE_H diff --git a/include/constants/battle.h b/include/constants/battle.h index a59ea2f1a5..39994a049e 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -220,6 +220,7 @@ #define SIDE_STATUS_WIDE_GUARD (1 << 19) #define SIDE_STATUS_CRAFTY_SHIELD (1 << 20) #define SIDE_STATUS_MAT_BLOCK (1 << 21) +#define SIDE_STATUS_RETALIATE (1 << 22) #define SIDE_STATUS_HAZARDS_ANY (SIDE_STATUS_SPIKES | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_STEALTH_ROCK) #define SIDE_STATUS_SCREEN_ANY (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) diff --git a/src/battle_main.c b/src/battle_main.c index ffb33da103..055ec9bbe8 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -231,8 +231,6 @@ EWRAM_DATA struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA bool8 gHasFetchedBall = FALSE; EWRAM_DATA u8 gLastUsedBall = 0; EWRAM_DATA u16 gLastThrownBall = 0; -EWRAM_DATA bool8 gCanPlayerRetaliate = FALSE; -EWRAM_DATA bool8 gCanOpponentRetaliate = FALSE; // IWRAM common vars void (*gPreBattleCallback1)(void); @@ -2878,9 +2876,6 @@ static void BattleStartClearSetData(void) gHasFetchedBall = FALSE; gLastUsedBall = 0; - gCanPlayerRetaliate = FALSE; - gCanOpponentRetaliate = FALSE; - gBattlerAttacker = 0; gBattlerTarget = 0; gBattleWeather = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 132a434cb3..b301047aac 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3499,14 +3499,14 @@ static void Cmd_tryfaintmon(void) if (gBattleResults.playerFaintCounter < 0xFF) gBattleResults.playerFaintCounter++; AdjustFriendshipOnBattleFaint(gActiveBattler); - gCanPlayerRetaliate = TRUE; + gSideStatuses[0] |= SIDE_STATUS_RETALIATE; } else { if (gBattleResults.opponentFaintCounter < 0xFF) gBattleResults.opponentFaintCounter++; gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); - gCanOpponentRetaliate = TRUE; + gSideStatuses[1] |= SIDE_STATUS_RETALIATE; } if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0) { diff --git a/src/battle_util.c b/src/battle_util.c index 689a846d64..e3bec35080 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7681,6 +7681,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe u16 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef); u16 holdEffectModifier; u16 modifier = UQ_4_12(1.0); + u32 atkSide = GET_BATTLER_SIDE(battlerAtk); // attacker's abilities switch (GetBattlerAbility(battlerAtk)) @@ -7933,13 +7934,10 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_RETALIATE: - if (gCanPlayerRetaliate || gCanOpponentRetaliate) + if (gSideStatuses[atkSide] & SIDE_STATUS_RETALIATE) { MulModifier(&modifier, UQ_4_12(2.0)); - if (gCanPlayerRetaliate) - gCanPlayerRetaliate = FALSE; - else if (gCanOpponentRetaliate) - gCanOpponentRetaliate = FALSE; + gSideStatuses[atkSide] &= ~SIDE_STATUS_RETALIATE; } break; case EFFECT_SOLARBEAM: From 2bf8022673a7754135097215bc16bebcf6aa0d3b Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 15 Oct 2021 07:09:27 -0300 Subject: [PATCH 4/5] Changed how SIDE_STATUS_RETALIATE is cleared --- src/battle_main.c | 1 + src/battle_util.c | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 055ec9bbe8..f3f86d58f4 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3583,6 +3583,7 @@ static void HandleEndTurn_ContinueBattle(void) gBattleMons[i].status2 &= ~(STATUS2_FLINCHED); if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS)) CancelMultiTurnMoves(i); + gSideStatuses[GET_BATTLER_SIDE(i)] &= ~SIDE_STATUS_RETALIATE; } gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId = 0; diff --git a/src/battle_util.c b/src/battle_util.c index e3bec35080..3bf34afd5c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7935,10 +7935,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe break; case EFFECT_RETALIATE: if (gSideStatuses[atkSide] & SIDE_STATUS_RETALIATE) - { MulModifier(&modifier, UQ_4_12(2.0)); - gSideStatuses[atkSide] &= ~SIDE_STATUS_RETALIATE; - } break; case EFFECT_SOLARBEAM: if (WEATHER_HAS_EFFECT && gBattleWeather & (WEATHER_HAIL_ANY | WEATHER_SANDSTORM_ANY | WEATHER_RAIN_ANY)) From 3b6ceb1dfafc3a0d7fb57e4f332a92395b0ad970 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 16 Oct 2021 05:41:50 -0300 Subject: [PATCH 5/5] Turned Retaliate into a side timer --- include/battle.h | 1 + include/constants/battle.h | 1 - src/battle_main.c | 1 - src/battle_script_commands.c | 4 ++-- src/battle_util.c | 9 ++++++++- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/include/battle.h b/include/battle.h index 826a0929ec..49881bacf7 100644 --- a/include/battle.h +++ b/include/battle.h @@ -210,6 +210,7 @@ struct SideTimer u8 tailwindBattlerId; u8 luckyChantTimer; u8 luckyChantBattlerId; + u8 retaliateTimer; }; struct FieldTimer diff --git a/include/constants/battle.h b/include/constants/battle.h index 39994a049e..a59ea2f1a5 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -220,7 +220,6 @@ #define SIDE_STATUS_WIDE_GUARD (1 << 19) #define SIDE_STATUS_CRAFTY_SHIELD (1 << 20) #define SIDE_STATUS_MAT_BLOCK (1 << 21) -#define SIDE_STATUS_RETALIATE (1 << 22) #define SIDE_STATUS_HAZARDS_ANY (SIDE_STATUS_SPIKES | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_STEALTH_ROCK) #define SIDE_STATUS_SCREEN_ANY (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) diff --git a/src/battle_main.c b/src/battle_main.c index f3f86d58f4..055ec9bbe8 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3583,7 +3583,6 @@ static void HandleEndTurn_ContinueBattle(void) gBattleMons[i].status2 &= ~(STATUS2_FLINCHED); if ((gBattleMons[i].status1 & STATUS1_SLEEP) && (gBattleMons[i].status2 & STATUS2_MULTIPLETURNS)) CancelMultiTurnMoves(i); - gSideStatuses[GET_BATTLER_SIDE(i)] &= ~SIDE_STATUS_RETALIATE; } gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b301047aac..8813f2029d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3499,14 +3499,14 @@ static void Cmd_tryfaintmon(void) if (gBattleResults.playerFaintCounter < 0xFF) gBattleResults.playerFaintCounter++; AdjustFriendshipOnBattleFaint(gActiveBattler); - gSideStatuses[0] |= SIDE_STATUS_RETALIATE; + gSideTimers[0].retaliateTimer = 2; } else { if (gBattleResults.opponentFaintCounter < 0xFF) gBattleResults.opponentFaintCounter++; gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); - gSideStatuses[1] |= SIDE_STATUS_RETALIATE; + gSideTimers[1].retaliateTimer = 2; } if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBattlerAttacker].hp != 0) { diff --git a/src/battle_util.c b/src/battle_util.c index 3bf34afd5c..6b43709da4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1881,6 +1881,7 @@ enum ENDTURN_PSYCHIC_TERRAIN, ENDTURN_ION_DELUGE, ENDTURN_FAIRY_LOCK, + ENDTURN_RETALIATE, ENDTURN_FIELD_COUNT, }; @@ -2312,6 +2313,12 @@ u8 DoFieldEndTurnEffects(void) } gBattleStruct->turnCountersTracker++; break; + case ENDTURN_RETALIATE: + gActiveBattler = gBattlerByTurnOrder[gBattleStruct->turnSideTracker]; + if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].retaliateTimer > 0) + gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].retaliateTimer--; + gBattleStruct->turnCountersTracker++; + break; case ENDTURN_FIELD_COUNT: effect++; break; @@ -7934,7 +7941,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_RETALIATE: - if (gSideStatuses[atkSide] & SIDE_STATUS_RETALIATE) + if (gSideTimers[atkSide].retaliateTimer == 1) MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_SOLARBEAM: