diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 835ae9ddee..01571f84a7 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -729,8 +729,9 @@ .4byte \param0 .endm - .macro stockpile + .macro stockpile id:req .byte 0x85 + .byte \id .endm .macro stockpiletobasedamage param0:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c2d89a7d56..9dbc7bdba1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3946,11 +3946,30 @@ BattleScript_EffectStockpile:: attackcanceler attackstring ppreduce - stockpile + stockpile 0 attackanimation waitanimation printfromtable gStockpileUsedStringIds waitmessage 0x40 + jumpifmovehadnoeffect BattleScript_EffectStockpileEnd + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, 0xC, BattleScript_EffectStockpileDef + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, 0xC, BattleScript_EffectStockpileEnd +BattleScript_EffectStockpileDef: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, 0x0 + setstatchanger STAT_DEF, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_BS_PTR, BattleScript_EffectStockpileSpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_EffectStockpileSpDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_EffectStockpileSpDef:: + setstatchanger STAT_SPDEF, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_BS_PTR, BattleScript_EffectStockpileEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_EffectStockpileEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_EffectStockpileEnd: + stockpile 1 goto BattleScript_MoveEnd BattleScript_EffectSpitUp:: @@ -3959,9 +3978,10 @@ BattleScript_EffectSpitUp:: attackstring ppreduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - stockpiletobasedamage BattleScript_SpitUpFail - typecalc + setbyte gIsCriticalHit, FALSE + damagecalc adjustdamage + stockpiletobasedamage BattleScript_SpitUpFail goto BattleScript_HitFromAtkAnimation BattleScript_SpitUpFail:: pause 0x20 diff --git a/include/battle.h b/include/battle.h index 43682348ad..552e1446ca 100644 --- a/include/battle.h +++ b/include/battle.h @@ -82,6 +82,10 @@ struct DisableStruct u16 encoredMove; u8 protectUses; u8 stockpileCounter; + s8 stockpileDef; + s8 stockpileSpDef; + s8 stockpileBeforeDef; + s8 stockpileBeforeSpDef; u8 substituteHP; u8 disableTimer:4; u8 disableTimerStartValue:4; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 51f924e24c..f5d921da12 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7962,18 +7962,33 @@ static void atk84_jumpifcantmakeasleep(void) static void atk85_stockpile(void) { - if (gDisableStructs[gBattlerAttacker].stockpileCounter >= 3) + switch (gBattlescriptCurrInstr[1]) { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + case 0: + if (gDisableStructs[gBattlerAttacker].stockpileCounter >= 3) + { + gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else + { + gDisableStructs[gBattlerAttacker].stockpileCounter++; + gDisableStructs[gBattlerAttacker].stockpileBeforeDef = gBattleMons[gBattlerAttacker].statStages[STAT_DEF]; + gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef = gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF]; + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + break; + case 1: // Save def/sp def stats. + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + { + gDisableStructs[gBattlerAttacker].stockpileDef += gBattleMons[gBattlerAttacker].statStages[STAT_DEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeDef; + gDisableStructs[gBattlerAttacker].stockpileSpDef += gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef; + } + break; } - else - { - gDisableStructs[gBattlerAttacker].stockpileCounter++; - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - gBattlescriptCurrInstr++; + + gBattlescriptCurrInstr += 2; } static void atk86_stockpiletobasedamage(void) @@ -7986,11 +8001,12 @@ static void atk86_stockpiletobasedamage(void) else { if (gBattleCommunication[6] != 1) - { gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - } gDisableStructs[gBattlerAttacker].stockpileCounter = 0; + // Restore stat changes from stockpile. + gBattleMons[gBattlerAttacker].statStages[STAT_DEF] -= gDisableStructs[gBattlerAttacker].stockpileDef; + gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] -= gDisableStructs[gBattlerAttacker].stockpileSpDef; gBattlescriptCurrInstr += 5; } } @@ -8004,25 +8020,32 @@ static void atk87_stockpiletohpheal(void) gBattlescriptCurrInstr = jumpPtr; gBattleCommunication[MULTISTRING_CHOOSER] = 0; } - else if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) - { - gDisableStructs[gBattlerAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr = jumpPtr; - gBattlerTarget = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } else { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); + if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) + { + gDisableStructs[gBattlerAttacker].stockpileCounter = 0; + gBattlescriptCurrInstr = jumpPtr; + gBattlerTarget = gBattlerAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else + { + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; - gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - gDisableStructs[gBattlerAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr += 5; - gBattlerTarget = gBattlerAttacker; + gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; + gDisableStructs[gBattlerAttacker].stockpileCounter = 0; + gBattlescriptCurrInstr += 5; + gBattlerTarget = gBattlerAttacker; + } + + // Restore stat changes from stockpile. + gBattleMons[gBattlerAttacker].statStages[STAT_DEF] -= gDisableStructs[gBattlerAttacker].stockpileDef; + gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] -= gDisableStructs[gBattlerAttacker].stockpileSpDef; } } @@ -8276,6 +8299,8 @@ static void atk8A_normalisebuffs(void) // haze for (i = 0; i < gBattlersCount; i++) { + gDisableStructs[i].stockpileDef = 0; + gDisableStructs[i].stockpileSpDef = 0; for (j = 0; j < NUM_BATTLE_STATS; j++) gBattleMons[i].statStages[j] = 6; }