diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 15d5f09faa..d986dec8cc 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -346,6 +346,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSpectralThief .4byte BattleScript_EffectVCreate .4byte BattleScript_EffectMatBlock + .4byte BattleScript_EffectStompingTantrum BattleScript_EffectVCreate: setmoveeffect MOVE_EFFECT_V_CREATE | MOVE_EFFECT_AFFECTS_USER @@ -1722,6 +1723,7 @@ BattleScript_EffectPlaceholder: printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd +BattleScript_EffectStompingTantrum: BattleScript_EffectEvasionDownHit: BattleScript_EffectVitalThrow: BattleScript_EffectFalseSwipe: diff --git a/include/battle.h b/include/battle.h index ec2670ced8..973ec95ef0 100644 --- a/include/battle.h +++ b/include/battle.h @@ -513,6 +513,7 @@ struct BattleStruct u8 introState; u8 ateBerry[2]; // array id determined by side, each party pokemon as bit u8 stolenStats[NUM_BATTLE_STATS]; // hp byte is used for which stats to raise, other inform about by how many stages + u8 lastMoveFailed; // as bits for each battler, for the sake of Stomping Tantrum }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 36c82ae1fc..7a11f9b14f 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -334,5 +334,6 @@ #define EFFECT_SPECTRAL_THIEF 328 #define EFFECT_V_CREATE 329 #define EFFECT_MAT_BLOCK 330 +#define EFFECT_STOMPING_TANTRUM 331 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 681838f76f..89949560df 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -162,26 +162,27 @@ #define ATK48_DONT_CHECK_LOWER 0x8 // atk49, moveend cases -#define ATK49_SPIKY_SHIELD 0 -#define ATK49_RAGE 1 -#define ATK49_DEFROST 2 -#define ATK49_SYNCHRONIZE_TARGET 3 -#define ATK49_MOVE_END_ABILITIES 4 -#define ATK49_STATUS_IMMUNITY_ABILITIES 5 -#define ATK49_SYNCHRONIZE_ATTACKER 6 -#define ATK49_CHOICE_MOVE 7 -#define ATK49_CHANGED_ITEMS 8 -#define ATK49_ATTACKER_INVISIBLE 9 -#define ATK49_ATTACKER_VISIBLE 10 -#define ATK49_TARGET_VISIBLE 11 -#define ATK49_ITEM_EFFECTS_ALL 12 -#define ATK49_KINGSROCK_SHELLBELL 13 -#define ATK49_SUBSTITUTE 14 -#define ATK49_UPDATE_LAST_MOVES 15 -#define ATK49_MIRROR_MOVE 16 -#define ATK49_NEXT_TARGET 17 -#define ATK49_CLEAR_BITS 18 -#define ATK49_COUNT 19 +#define ATK49_FAILED_MOVE_COUNTER 0 +#define ATK49_SPIKY_SHIELD 1 +#define ATK49_RAGE 2 +#define ATK49_DEFROST 3 +#define ATK49_SYNCHRONIZE_TARGET 4 +#define ATK49_MOVE_END_ABILITIES 5 +#define ATK49_STATUS_IMMUNITY_ABILITIES 6 +#define ATK49_SYNCHRONIZE_ATTACKER 7 +#define ATK49_CHOICE_MOVE 8 +#define ATK49_CHANGED_ITEMS 9 +#define ATK49_ATTACKER_INVISIBLE 10 +#define ATK49_ATTACKER_VISIBLE 11 +#define ATK49_TARGET_VISIBLE 12 +#define ATK49_ITEM_EFFECTS_ALL 13 +#define ATK49_KINGSROCK_SHELLBELL 14 +#define ATK49_SUBSTITUTE 15 +#define ATK49_UPDATE_LAST_MOVES 16 +#define ATK49_MIRROR_MOVE 17 +#define ATK49_NEXT_TARGET 18 +#define ATK49_CLEAR_BITS 19 +#define ATK49_COUNT 20 #define BIT_HP 0x1 #define BIT_ATK 0x2 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6720bd4d1b..342a20a448 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4214,6 +4214,13 @@ static void atk49_moveend(void) { switch (gBattleScripting.atk49_state) { + case ATK49_FAILED_MOVE_COUNTER: + if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker]; + else + gBattleStruct->lastMoveFailed &= ~(gBitTable[gBattlerAttacker]); + gBattleScripting.atk49_state++; + break; case ATK49_SPIKY_SHIELD: if (gProtectStructs[gBattlerTarget].spikyShielded && gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT diff --git a/src/battle_util.c b/src/battle_util.c index 03f5b1cfa4..307006226f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5150,6 +5150,10 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe if (WEATHER_HAS_EFFECT && gBattleWeather & (WEATHER_HAIL_ANY | WEATHER_SANDSTORM_ANY | WEATHER_RAIN_ANY)) MulModifier(&modifier, UQ_4_12(0.5)); break; + case EFFECT_STOMPING_TANTRUM: + if (gBattleStruct->lastMoveFailed & gBitTable[battlerAtk]) + MulModifier(&modifier, UQ_4_12(2.0)); + break; case EFFECT_BULLDOZE: case EFFECT_MAGNITUDE: case EFFECT_EARTHQUAKE: diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index c45336d0ea..737438fa0f 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9278,7 +9278,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_STOMPING_TANTRUM] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_STOMPING_TANTRUM, .power = 75, .type = TYPE_GROUND, .accuracy = 100,