diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2cd41309a..a31fbc7ef 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -406,6 +406,7 @@ BattleScript_EffectSaltCure:: call BattleScript_EffectHit_Ret tryfaintmon BS_TARGET jumpiffainted BS_TARGET, TRUE, BattleScript_EffectSaltCure_End + jumpifsubstituteblocks BattleScript_EffectSaltCure_End applysaltcure BS_TARGET printstring STRINGID_TARGETISBEINGSALTCURED waitmessage B_WAIT_TIME_LONG diff --git a/include/battle_scripts.h b/include/battle_scripts.h index daef0658b..256220aff 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -534,6 +534,7 @@ extern const u8 BattleScript_EncoredNoMore[]; extern const u8 BattleScript_DestinyBondTakesLife[]; extern const u8 BattleScript_DmgHazardsOnAttacker[]; extern const u8 BattleScript_DmgHazardsOnTarget[]; +extern const u8 BattleScript_DmgHazardsOnBattlerScripting[]; extern const u8 BattleScript_DmgHazardsOnFaintedBattler[]; extern const u8 BattleScript_PerishSongTakesLife[]; extern const u8 BattleScript_PerishSongCountGoesDown[]; diff --git a/include/battle_util.h b/include/battle_util.h index 1271ce469..aad7a0a40 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -105,6 +105,7 @@ enum CANCELLER_POWDER_MOVE, CANCELLER_POWDER_STATUS, CANCELLER_THROAT_CHOP, + CANCELLER_EXPLODING_DAMP, CANCELLER_MULTIHIT_MOVES, CANCELLER_Z_MOVES, CANCELLER_END, diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index a932c747d..59f60576b 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -169,7 +169,7 @@ void InitAndLaunchChosenStatusAnimation(u32 battler, bool8 isStatus2, u32 status gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 1; if (!isStatus2) { - if (status == STATUS1_FREEZE) + if (status == STATUS1_FREEZE || status == STATUS1_FROSTBITE) LaunchStatusAnimation(battler, B_ANIM_STATUS_FRZ); else if (status == STATUS1_POISON || status & STATUS1_TOXIC_POISON) LaunchStatusAnimation(battler, B_ANIM_STATUS_PSN); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 82ebf2838..89cc7544b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7068,6 +7068,8 @@ static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId) gBattlescriptCurrInstr = BattleScript_DmgHazardsOnTarget; else if (gBattlescriptCurrInstr[1] == BS_ATTACKER) gBattlescriptCurrInstr = BattleScript_DmgHazardsOnAttacker; + else if (gBattlescriptCurrInstr[1] == BS_SCRIPTING) + gBattlescriptCurrInstr = BattleScript_DmgHazardsOnBattlerScripting; else gBattlescriptCurrInstr = BattleScript_DmgHazardsOnFaintedBattler; } diff --git a/src/battle_util.c b/src/battle_util.c index e8fa0bcba..54e2f456f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -750,11 +750,20 @@ void MarkBattlerReceivedLinkData(u8 battlerId) const u8* CancelMultiTurnMoves(u32 battler) { const u8 *result = NULL; - gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); - gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE); gBattleMons[battler].status2 &= ~(STATUS2_UPROAR); gBattleMons[battler].status2 &= ~(STATUS2_BIDE); + if (B_RAMPAGE_CANCELLING < GEN_5) + { + gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); + gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE); + } + else if (!(gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) + || ((gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) > STATUS2_LOCK_CONFUSE_TURN(1))) + { + gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); + } + // Clear battler's semi-invulnerable bits if they are not held by Sky Drop. if (!(gStatuses3[battler] & STATUS3_SKY_DROPPED)) gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE); @@ -2722,7 +2731,7 @@ bool8 HandleFaintedMonActions(void) u8 AtkCanceller_UnableToUseMove(u32 moveType) { -u8 effect = 0; + u8 effect = 0; do { switch (gBattleStruct->atkCancellerTracker) @@ -3112,6 +3121,20 @@ u8 effect = 0; } gBattleStruct->atkCancellerTracker++; break; + case CANCELLER_EXPLODING_DAMP: + { + u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); + if (dampBattler && (gMovesInfo[gCurrentMove].effect == EFFECT_EXPLOSION + || gMovesInfo[gCurrentMove].effect == EFFECT_MIND_BLOWN)) + { + gBattleScripting.battler = dampBattler - 1; + gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + gBattleStruct->atkCancellerTracker++; + break; + } case CANCELLER_MULTIHIT_MOVES: if (gMovesInfo[gCurrentMove].effect == EFFECT_MULTI_HIT) { @@ -8634,8 +8657,11 @@ static inline u32 CalcMoveBasePower(u32 move, u32 battlerAtk, u32 battlerDef, u3 break; case EFFECT_DOUBLE_POWER_ON_ARG_STATUS: // Comatose targets treated as if asleep - if ((gBattleMons[battlerDef].status1 | (STATUS1_SLEEP * (abilityDef == ABILITY_COMATOSE))) & gMovesInfo[move].argument) + if ((gBattleMons[battlerDef].status1 | (STATUS1_SLEEP * (abilityDef == ABILITY_COMATOSE))) & gMovesInfo[move].argument + && !((gMovesInfo[move].additionalEffects->moveEffect == MOVE_EFFECT_REMOVE_STATUS) && DoesSubstituteBlockMove(battlerAtk, battlerDef, move))) + { basePower *= 2; + } break; case EFFECT_VARY_POWER_BASED_ON_HP: basePower = gMovesInfo[move].argument * gBattleMons[battlerDef].hp / gBattleMons[battlerDef].maxHP;