From 2f22780c173077d856cbd3ae615166089e788405 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 12 Sep 2025 17:42:41 +0200 Subject: [PATCH] Fixes Uproar not waking up mons (#7714) --- data/battle_scripts_1.s | 2 +- src/battle_end_turn.c | 21 +++++++++------------ src/battle_message.c | 2 +- src/battle_util.c | 1 + src/battle_util2.c | 1 + test/battle/move_effect/uproar.c | 14 ++++++++++++++ test/battle/sleep_clause.c | 2 +- 7 files changed, 28 insertions(+), 15 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 1fc7d7a674..89c1961022 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6735,7 +6735,7 @@ BattleScript_MoveUsedWokeUp:: BattleScript_MonWokeUpInUproar:: printstring STRINGID_PKMNWOKEUPINUPROAR waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_ATTACKER + updatestatusicon BS_EFFECT_BATTLER end2 BattleScript_PoisonTurnDmg:: diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index d0f504ae5a..85a77399c0 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -1370,25 +1370,22 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) case THIRD_EVENT_BLOCK_UPROAR: if (gBattleMons[battler].volatiles.uproarTurns) { - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) + for (gEffectBattler = 0; gEffectBattler < gBattlersCount; gEffectBattler++) { - if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_SOUNDPROOF) + if ((gBattleMons[gEffectBattler].status1 & STATUS1_SLEEP) + && GetBattlerAbility(gEffectBattler) != ABILITY_SOUNDPROOF) { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; - gBattleMons[gBattlerAttacker].volatiles.nightmare = FALSE; + gBattleMons[gEffectBattler].status1 &= ~STATUS1_SLEEP; + gBattleMons[gEffectBattler].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptExecute(BattleScript_MonWokeUpInUproar); - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerAttacker].status1); - MarkBattlerForControllerExec(gBattlerAttacker); + BtlController_EmitSetMonData(gEffectBattler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerAttacker].status1); + MarkBattlerForControllerExec(gEffectBattler); + effect = TRUE; break; } } - if (gBattlerAttacker != gBattlersCount) - { - break; - } - else + if (effect == FALSE) { gBattlerAttacker = battler; gBattleMons[battler].volatiles.uproarTurns--; // uproar timer goes down diff --git a/src/battle_message.c b/src/battle_message.c index 4cbadf0379..7ba4d2d47f 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -270,7 +270,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNFASTASLEEP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is fast asleep."), [STRINGID_PKMNWOKEUP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} woke up!"), [STRINGID_PKMNUPROARKEPTAWAKE] = COMPOUND_STRING("But the uproar kept {B_SCR_NAME_WITH_PREFIX2} awake!"), - [STRINGID_PKMNWOKEUPINUPROAR] = COMPOUND_STRING("The uproar woke {B_ATK_NAME_WITH_PREFIX2}!"), + [STRINGID_PKMNWOKEUPINUPROAR] = COMPOUND_STRING("The uproar woke {B_EFF_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNCAUSEDUPROAR] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} caused an uproar!"), [STRINGID_PKMNMAKINGUPROAR] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is making an uproar!"), [STRINGID_PKMNCALMEDDOWN] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} calmed down."), diff --git a/src/battle_util.c b/src/battle_util.c index e77639524d..52de1e838a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1956,6 +1956,7 @@ static enum MoveCanceller CancellerAsleepOrFrozen(void) TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; gBattleMons[gBattlerAttacker].volatiles.nightmare = FALSE; + gEffectBattler = gBattlerAttacker; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; BattleScriptCall(BattleScript_MoveUsedWokeUp); return MOVE_STEP_REMOVES_STATUS; diff --git a/src/battle_util2.c b/src/battle_util2.c index 3a05e5ac13..3f25271300 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -132,6 +132,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battler) if (UproarWakeUpCheck(battler)) { // Wake up from Uproar + gEffectBattler = battler; gBattleMons[battler].status1 &= ~(STATUS1_SLEEP); gBattleMons[battler].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; diff --git a/test/battle/move_effect/uproar.c b/test/battle/move_effect/uproar.c index 23bcdce458..93f8be9c5b 100644 --- a/test/battle/move_effect/uproar.c +++ b/test/battle/move_effect/uproar.c @@ -27,3 +27,17 @@ DOUBLE_BATTLE_TEST("Uproar status causes sleeping Pokémon to wake up during an ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); } } + +SINGLE_BATTLE_TEST("Uproar wakes up other pokemon on field") +{ + GIVEN { + ASSUME(B_UPROAR_TURNS >= GEN_5); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_UPROAR); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_UPROAR, opponent); + MESSAGE("The uproar woke Wobbuffet!"); + } +} diff --git a/test/battle/sleep_clause.c b/test/battle/sleep_clause.c index ca416d230e..73f419289c 100644 --- a/test/battle/sleep_clause.c +++ b/test/battle/sleep_clause.c @@ -690,7 +690,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo ASSUME(GetMoveEffect(MOVE_UPROAR) == EFFECT_UPROAR); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); - PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE); } OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); } WHEN {