diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index e2588e46ab..d8e13baae1 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -274,7 +274,6 @@ enum MoveEndEffects MOVEEND_SYMBIOSIS, MOVEEND_HIT_SWITCH_TARGET, MOVEEND_KINGSROCK, // These item effects will occur each strike of a multi-hit move - MOVEEND_NUM_HITS, MOVEEND_SUBSTITUTE, MOVEEND_SKY_DROP_CONFUSE, MOVEEND_UPDATE_LAST_MOVES, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b333d9abb0..1c0e470cde 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2108,6 +2108,7 @@ static void Cmd_adjustdamage(void) gSpecialStatuses[battlerDef].enduredDamage = TRUE; continue; } + if (GetBattlerAbility(battlerDef) == ABILITY_ICE_FACE && IsBattleMovePhysical(gCurrentMove) && gBattleMons[battlerDef].species == SPECIES_EISCUE) { // Damage deals typeless 0 HP. @@ -2118,6 +2119,7 @@ static void Cmd_adjustdamage(void) // Form change will be done after attack animation in Cmd_resultmessage. continue; } + if (gBattleMons[gBattlerTarget].hp > gBattleStruct->moveDamage[battlerDef]) continue; @@ -2669,6 +2671,11 @@ static void Cmd_datahpupdate(void) BtlController_EmitSetMonData(battler, BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[battler].hp), &gBattleMons[battler].hp); MarkBattlerForControllerExec(battler); } + + if (gBattlerAttacker != gBattlerTarget + && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS + && IsBattlerTurnDamaged(gBattlerTarget)) + gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]]++; } TryRestoreDamageAfterCheeckPouch(battler); @@ -6749,16 +6756,6 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; - case MOVEEND_NUM_HITS: - if (gBattlerAttacker != gBattlerTarget - && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerTurnDamaged(gBattlerTarget)) - { - gBattleStruct->timesGotHit[GetBattlerSide(gBattlerTarget)][gBattlerPartyIndexes[gBattlerTarget]]++; - } - gBattleScripting.moveendState++; - break; case MOVEEND_SUBSTITUTE: // update substitute for (i = 0; i < gBattlersCount; i++) { diff --git a/test/battle/move_effect/rage_fist.c b/test/battle/move_effect/rage_fist.c index 7a87f3e34d..eb00a3c1b7 100644 --- a/test/battle/move_effect/rage_fist.c +++ b/test/battle/move_effect/rage_fist.c @@ -296,3 +296,49 @@ SINGLE_BATTLE_TEST("Rage Fist number of hits is copied by Transform") EXPECT_MUL_EQ(timesGotHit[0], Q_4_12(2.0), timesGotHit[1]); } } + +SINGLE_BATTLE_TEST("Rage Fist base power is increased by 50 if user was hit and forces out") +{ + s16 timesGotHit[2]; + + GIVEN { + PLAYER(SPECIES_REGIROCK); + OPPONENT(SPECIES_REGIROCK); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_RAGE_FIST); MOVE(player, MOVE_DRAGON_TAIL); } + TURN { MOVE(player, MOVE_CELEBRATE); SWITCH(opponent, 0); } + TURN { MOVE(opponent, MOVE_RAGE_FIST); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, opponent); + HP_BAR(player, captureDamage: ×GotHit[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, opponent); + HP_BAR(player, captureDamage: ×GotHit[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } THEN { + EXPECT_MUL_EQ(timesGotHit[0], Q_4_12(2.0), timesGotHit[1]); + } +} + +SINGLE_BATTLE_TEST("Rage Fist doesn't get increased power if Substitute is hit") +{ + s16 timesGotHit[2]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_RAGE_FIST); MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_TACKLE); } + TURN { MOVE(opponent, MOVE_RAGE_FIST); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, opponent); + HP_BAR(player, captureDamage: ×GotHit[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, opponent); + HP_BAR(player, captureDamage: ×GotHit[1]); + } THEN { + EXPECT_EQ(timesGotHit[0], timesGotHit[1]); + } +}