diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 999081be6e..659b3de642 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1389,6 +1389,10 @@ various \battler, VARIOUS_TRY_ACTIVATE_MOXIE .endm + .macro tryactivatefellstinger battler + various \battler, VARIOUS_TRY_ACTIVATE_FELL_STINGER + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 459520e096..0ae1c4e013 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -155,7 +155,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectDefenseUpHit .4byte BattleScript_EffectAttackUpHit .4byte BattleScript_EffectAllStatsUpHit - .4byte BattleScript_EffectUnused8d + .4byte BattleScript_EffectFellStinger .4byte BattleScript_EffectBellyDrum .4byte BattleScript_EffectPsychUp .4byte BattleScript_EffectMirrorCoat @@ -590,7 +590,7 @@ BattleScript_EffectUnused60: BattleScript_EffectFalseSwipe: BattleScript_EffectAlwaysCrit: BattleScript_EffectPursuit: -BattleScript_EffectUnused8d: +BattleScript_EffectFellStinger: BattleScript_EffectPlaceholder209: BattleScript_EffectHit:: BattleScript_EffectLowKick: @@ -3202,6 +3202,7 @@ BattleScript_FaintTarget:: cleareffectsonfaint BS_TARGET printstring STRINGID_TARGETFAINTED tryactivatemoxie BS_ATTACKER + tryactivatefellstinger BS_ATTACKER return BattleScript_GiveExp:: @@ -4829,6 +4830,16 @@ BattleScript_AttackerAbilityStatRaise:: waitmessage 0x40 return +BattleScript_FellStingerRaisesStat:: + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, BattleScript_FellStingerRaisesAtkEnd + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, 0x1, BattleScript_FellStingerRaisesAtkEnd + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_FellStingerRaisesAtkEnd: + return + BattleScript_AttackerAbilityStatRaiseEnd3:: call BattleScript_AttackerAbilityStatRaise end3 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index b5835676f1..5850fca067 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -321,5 +321,6 @@ extern const u8 BattleScript_SolarPowerActivates[]; extern const u8 BattleScript_CursedBodyActivates[]; extern const u8 BattleScript_MummyActivates[]; extern const u8 BattleScript_WeakArmorActivates[]; +extern const u8 BattleScript_FellStingerRaisesStat[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index e5f2a678ef..329cd0a999 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -142,7 +142,7 @@ #define EFFECT_DEFENSE_UP_HIT 138 #define EFFECT_ATTACK_UP_HIT 139 #define EFFECT_ALL_STATS_UP_HIT 140 -#define EFFECT_UNUSED_8D 141 +#define EFFECT_FELL_STINGER 141 #define EFFECT_BELLY_DRUM 142 #define EFFECT_PSYCH_UP 143 #define EFFECT_MIRROR_COAT 144 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 5fa34f0b22..ceeb21b196 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -80,6 +80,7 @@ #define VARIOUS_CLEAR_STATUS 32 #define VARIOUS_RESTORE_PP 33 #define VARIOUS_TRY_ACTIVATE_MOXIE 34 +#define VARIOUS_TRY_ACTIVATE_FELL_STINGER 35 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 30583abb0a..21cc9aa5cf 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -6784,7 +6784,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FELL_STINGER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FELL_STINGER, .power = 50, .type = TYPE_BUG, .accuracy = 100, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 180a1161fa..4a0bfa3717 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6160,6 +6160,20 @@ static void atk75_useitemonopponent(void) gBattlescriptCurrInstr += 1; } +static bool32 HasAttackerFaintedTarget(void) +{ + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMoves[gCurrentMove].power != 0 + && (gLastHitBy[gBattlerTarget] == 0xFF || gLastHitBy[gBattlerTarget] == gBattlerAttacker) + && gBattleStruct->moveTarget[gBattlerAttacker] == gBattlerTarget + && gBattlerTarget != gBattlerAttacker + && gCurrentTurnActionNumber == GetBattlerTurnOrderNum(gBattlerAttacker) + && gChosenMove == gChosenMoveByBattler[gBattlerAttacker]) + return TRUE; + else + return FALSE; +} + static void atk76_various(void) { u8 side; @@ -6372,10 +6386,7 @@ static void atk76_various(void) break; case VARIOUS_TRY_ACTIVATE_MOXIE: if (GetBattlerAbility(gActiveBattler) == ABILITY_MOXIE - && (gLastHitBy[gBattlerTarget] == 0xFF || gLastHitBy[gBattlerTarget] == gBattlerAttacker) - && gBattleStruct->moveTarget[gBattlerAttacker] == gBattlerTarget - && gBattlerTarget != gBattlerAttacker - && gCurrentTurnActionNumber == GetBattlerTurnOrderNum(gBattlerAttacker) + && HasAttackerFaintedTarget() && !IsBattleLostForPlayer() && !IsBattleWonForPlayer() && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 0xC) @@ -6388,6 +6399,24 @@ static void atk76_various(void) return; } break; + case VARIOUS_TRY_ACTIVATE_FELL_STINGER: + if (gBattleMoves[gCurrentMove].effect == EFFECT_FELL_STINGER + && HasAttackerFaintedTarget() + && !IsBattleLostForPlayer() + && !IsBattleWonForPlayer() + && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 0xC) + { + if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] >= 0xB) + SET_STATCHANGER(STAT_ATK, 1, FALSE); + else + SET_STATCHANGER(STAT_ATK, 2, FALSE); + + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); + BattleScriptPush(gBattlescriptCurrInstr + 3); + gBattlescriptCurrInstr = BattleScript_FellStingerRaisesStat; + return; + } + break; } gBattlescriptCurrInstr += 3;