From 31bbc4ddde1fcfe1218d41a9b35743d0ef37a036 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Fri, 17 Dec 2021 10:24:07 -0500 Subject: [PATCH] prevent stat-raising damage effects if battle will end --- data/battle_scripts_1.s | 12 ++--- src/battle_script_commands.c | 100 ++++++++++++++++++++--------------- 2 files changed, 62 insertions(+), 50 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 24a3d16ed..be77907b8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1089,20 +1089,20 @@ BattleScript_VCreateStatAnim: playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT setstatchanger STAT_DEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VCreateTrySpDef - printfromtable gStatUpStringIds + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpDef + printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpDef: setstatchanger STAT_SPDEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VCreateTrySpeed - printfromtable gStatUpStringIds + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpeed + printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpeed: setstatchanger STAT_SPEED, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateStatLossRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VCreateStatLossRet - printfromtable gStatUpStringIds + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateStatLossRet + printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateStatLossRet: return diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b46331be1..e342ca236 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3205,11 +3205,7 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr++; break; case MOVE_EFFECT_ALL_STATS_UP: - if (NoAliveMonsForEitherParty()) - { - gBattlescriptCurrInstr++; - } - else + if (!NoAliveMonsForEitherParty()) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AllStatsUp; @@ -3248,12 +3244,18 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_ATK_DEF_DOWN: // SuperPower - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_AtkDefDown; + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_AtkDefDown; + } break; case MOVE_EFFECT_DEF_SPDEF_DOWN: // Close Combat - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefSpDefDown; + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefSpDefDown; + } break; case MOVE_EFFECT_RECOIL_25: // Take Down, 25% recoil gBattleMoveDamage = (gHpDealt) / 4; @@ -3308,8 +3310,11 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_SP_ATK_TWO_DOWN: // Overheat - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_SAtkDown2; + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_SAtkDown2; + } break; case MOVE_EFFECT_CLEAR_SMOG: for (i = 0; i < NUM_BATTLE_STATS; i++) @@ -3369,51 +3374,58 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_SPECTRAL_THIEF: - gBattleStruct->stolenStats[0] = 0; // Stats to steal. - gBattleScripting.animArg1 = 0; - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + if (!NoAliveMonsForEitherParty()) { - if (gBattleMons[gBattlerTarget].statStages[i] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[i] != MAX_STAT_STAGE) + gBattleStruct->stolenStats[0] = 0; // Stats to steal. + gBattleScripting.animArg1 = 0; + for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { - gBattleStruct->stolenStats[0] |= gBitTable[i]; - // Store by how many stages to raise the stat. - gBattleStruct->stolenStats[i] = gBattleMons[gBattlerTarget].statStages[i] - DEFAULT_STAT_STAGE; - while (gBattleMons[gBattlerAttacker].statStages[i] + gBattleStruct->stolenStats[i] > MAX_STAT_STAGE) - gBattleStruct->stolenStats[i]--; - gBattleMons[gBattlerTarget].statStages[i] = DEFAULT_STAT_STAGE; - - if (gBattleStruct->stolenStats[i] >= 2) - byTwo++; - - if (gBattleScripting.animArg1 == 0) + if (gBattleMons[gBattlerTarget].statStages[i] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[i] != MAX_STAT_STAGE) { - if (byTwo) - gBattleScripting.animArg1 = STAT_ANIM_PLUS2 - 1 + i; + gBattleStruct->stolenStats[0] |= gBitTable[i]; + // Store by how many stages to raise the stat. + gBattleStruct->stolenStats[i] = gBattleMons[gBattlerTarget].statStages[i] - DEFAULT_STAT_STAGE; + while (gBattleMons[gBattlerAttacker].statStages[i] + gBattleStruct->stolenStats[i] > MAX_STAT_STAGE) + gBattleStruct->stolenStats[i]--; + gBattleMons[gBattlerTarget].statStages[i] = DEFAULT_STAT_STAGE; + + if (gBattleStruct->stolenStats[i] >= 2) + byTwo++; + + if (gBattleScripting.animArg1 == 0) + { + if (byTwo) + gBattleScripting.animArg1 = STAT_ANIM_PLUS2 - 1 + i; + else + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 - 1 + i; + } else - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 - 1 + i; - } - else - { - if (byTwo) - gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS2; - else - gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS1; + { + if (byTwo) + gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS2; + else + gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS1; + } } } - } - if (gBattleStruct->stolenStats[0] != 0) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_SpectralThiefSteal; + if (gBattleStruct->stolenStats[0] != 0) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_SpectralThiefSteal; + } } break; case MOVE_EFFECT_V_CREATE: - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; + if (!NoAliveMonsForEitherParty()) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; + } break; case MOVE_EFFECT_CORE_ENFORCER: - if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget) + && !NoAliveMonsForEitherParty()) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectCoreEnforcer;