diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 56c3c7b49d..656283851e 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2213,7 +2213,7 @@ various BS_ATTACKER, VARIOUS_TRY_SYMBIOSIS .endm - @ The next few macros are used by Max Moves. + @ Used to active a different Max Move effects. .macro setmaxmoveeffect various 0, VARIOUS_SET_MAX_MOVE_EFFECT .endm @@ -2228,6 +2228,11 @@ .4byte \ptr .endm + .macro setsteelsurge, failInstr:req + various 0, VARIOUS_SET_STEELSURGE + .4byte \failInstr + .endm + @ Tries to increase or decrease a battler's stat's stat stage by a specified amount. If impossible, jumps to \script. .macro modifybattlerstatstage battler:req, stat:req, mode:req, amount:req, script:req, animation:req, customString diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index a4e50ec7ae..9055aed3b9 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -910,6 +910,40 @@ gBattleAnims_Moves:: .4byte Move_MAX_WYRMWIND .4byte Move_MAX_DARKNESS .4byte Move_MAX_STARFALL +@@@@ G-MAX MOVES + .4byte Move_G_MAX_VINE_LASH + .4byte Move_G_MAX_WILDFIRE + .4byte Move_G_MAX_CANNONADE + .4byte Move_G_MAX_BEFUDDLE + .4byte Move_G_MAX_VOLT_CRASH + .4byte Move_G_MAX_GOLD_RUSH + .4byte Move_G_MAX_CHI_STRIKE + .4byte Move_G_MAX_TERROR + .4byte Move_G_MAX_FOAM_BURST + .4byte Move_G_MAX_RESONANCE + .4byte Move_G_MAX_CUDDLE + .4byte Move_G_MAX_REPLENISH + .4byte Move_G_MAX_MALODOR + .4byte Move_G_MAX_MELTDOWN + .4byte Move_G_MAX_DRUM_SOLO + .4byte Move_G_MAX_FIREBALL + .4byte Move_G_MAX_HYDROSNIPE + .4byte Move_G_MAX_WIND_RAGE + .4byte Move_G_MAX_GRAVITAS + .4byte Move_G_MAX_STONESURGE + .4byte Move_G_MAX_VOLCALITH + .4byte Move_G_MAX_TARTNESS + .4byte Move_G_MAX_SWEETNESS + .4byte Move_G_MAX_SANDBLAST + .4byte Move_G_MAX_STUN_SHOCK + .4byte Move_G_MAX_CENTIFERNO + .4byte Move_G_MAX_SMITE + .4byte Move_G_MAX_SNOOZE + .4byte Move_G_MAX_FINALE + .4byte Move_G_MAX_STEELSURGE + .4byte Move_G_MAX_DEPLETION + .4byte Move_G_MAX_ONE_BLOW + .4byte Move_G_MAX_RAPID_FLOW @@@ Last Move - cannot be reached .4byte Move_COUNT @@ -30821,6 +30855,8 @@ Move_MAX_MINDSTORM: Move_MAX_WYRMWIND: Move_MAX_DARKNESS: Move_MAX_STARFALL: + launchtask AnimTask_DynamaxGrowth 0x5 0x1 0x1 + waitforvisualfinish end Move_MAX_GUARD: @@ -30870,3 +30906,40 @@ Move_MAX_LIGHTNING:: waitforvisualfinish goto Move_ZAP_CANNON end + +Move_G_MAX_VINE_LASH: +Move_G_MAX_WILDFIRE: +Move_G_MAX_CANNONADE: +Move_G_MAX_BEFUDDLE: +Move_G_MAX_VOLT_CRASH: +Move_G_MAX_GOLD_RUSH: +Move_G_MAX_CHI_STRIKE: +Move_G_MAX_TERROR: +Move_G_MAX_FOAM_BURST: +Move_G_MAX_RESONANCE: +Move_G_MAX_CUDDLE: +Move_G_MAX_REPLENISH: +Move_G_MAX_MALODOR: +Move_G_MAX_MELTDOWN: +Move_G_MAX_DRUM_SOLO: +Move_G_MAX_FIREBALL: +Move_G_MAX_HYDROSNIPE: +Move_G_MAX_WIND_RAGE: +Move_G_MAX_GRAVITAS: +Move_G_MAX_STONESURGE: +Move_G_MAX_VOLCALITH: +Move_G_MAX_TARTNESS: +Move_G_MAX_SWEETNESS: +Move_G_MAX_SANDBLAST: +Move_G_MAX_STUN_SHOCK: +Move_G_MAX_CENTIFERNO: +Move_G_MAX_SMITE: +Move_G_MAX_SNOOZE: +Move_G_MAX_FINALE: +Move_G_MAX_STEELSURGE: +Move_G_MAX_DEPLETION: +Move_G_MAX_ONE_BLOW: +Move_G_MAX_RAPID_FLOW: + launchtask AnimTask_DynamaxGrowth 0x5 0x1 0x1 + waitforvisualfinish + end diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e1821e9a2f..9efe349025 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -420,7 +420,18 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectShellTrap @ EFFECT_SHELL_TRAP .4byte BattleScript_EffectMaxMove @ EFFECT_MAX_MOVE - +BattleScript_StealthRockActivates:: + setstealthrock BattleScript_MoveEnd + printstring STRINGID_POINTEDSTONESFLOAT + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + +BattleScript_SteelsurgeActivates:: + setsteelsurge BattleScript_MoveEnd + printstring STRINGID_SHARPSTEELFLOATS + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd + BattleScript_EffectAttackUpUserAlly: jumpifnoally BS_ATTACKER, BattleScript_EffectAttackUp attackcanceler @@ -7454,6 +7465,11 @@ BattleScript_StealthRockFree:: waitmessage B_WAIT_TIME_LONG return +BattleScript_SteelsurgeFree:: + printstring STRINGID_PKMNBLEWAWAYSHARPSTEEL + waitmessage B_WAIT_TIME_LONG + return + BattleScript_MonTookFutureAttack:: printstring STRINGID_PKMNTOOKATTACK waitmessage B_WAIT_TIME_LONG diff --git a/include/battle.h b/include/battle.h index 20fd67a4fa..483d3cdb50 100644 --- a/include/battle.h +++ b/include/battle.h @@ -218,6 +218,7 @@ struct SideTimer u8 tailwindBattlerId; u8 luckyChantTimer; u8 luckyChantBattlerId; + u8 steelsurgeAmount; // Timers below this point are not swapped by Court Change u8 followmeTimer; u8 followmeTarget:3; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 91999a6d7e..1c10989261 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -453,6 +453,9 @@ extern const u8 BattleScript_DampPreventsAftermath[]; extern const u8 BattleScript_HealingWishActivates[]; extern const u8 BattleScript_LunarDanceActivates[]; extern const u8 BattleScript_ShellTrapSetUp[]; +extern const u8 BattleScript_StealthRockActivates[]; +extern const u8 BattleScript_SteelsurgeActivates[]; +extern const u8 BattleScript_SteelsurgeFree[]; // zmoves extern const u8 BattleScript_ZMoveActivateDamaging[]; diff --git a/include/config/debug.h b/include/config/debug.h index b427fcb513..82516ef4ec 100644 --- a/include/config/debug.h +++ b/include/config/debug.h @@ -5,7 +5,7 @@ #define DEBUG_OVERWORLD_MENU TRUE // Enables a overworld debug menu for changing flags, variables, giving pokemon and more, accessed by holding R and pressing START while in the overworld by default. #define DEBUG_OVERWORLD_HELD_KEYS (R_BUTTON) // The keys required to be held to open the debug menu. #define DEBUG_OVERWORLD_TRIGGER_EVENT pressedStartButton // The event that opens the menu when holding the key(s) defined in DEBUG_OVERWORLD_HELD_KEYS. -#define DEBUG_OVERWORLD_IN_MENU FALSE // Replaces the overworld debug menu button combination with a start menu entry (above Pokédex). +#define DEBUG_OVERWORLD_IN_MENU TRUE // Replaces the overworld debug menu button combination with a start menu entry (above Pokédex). // Debug Flags // To use the following debug features, replace the 0s with the flag ID you're assigning it to. diff --git a/include/constants/battle.h b/include/constants/battle.h index 5df71f57a3..b9909fbfc6 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -233,8 +233,10 @@ #define SIDE_STATUS_WIDE_GUARD (1 << 19) #define SIDE_STATUS_CRAFTY_SHIELD (1 << 20) #define SIDE_STATUS_MAT_BLOCK (1 << 21) +#define SIDE_STATUS_STEELSURGE (1 << 22) +#define SIDE_STATUS_STEELSURGE_DAMAGED (1 << 23) -#define SIDE_STATUS_HAZARDS_ANY (SIDE_STATUS_SPIKES | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_STEALTH_ROCK) +#define SIDE_STATUS_HAZARDS_ANY (SIDE_STATUS_SPIKES | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STEELSURGE) #define SIDE_STATUS_SCREEN_ANY (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL) // Field affecting statuses. @@ -375,8 +377,10 @@ #define MOVE_EFFECT_LOWER_SIDE_STATS 74 #define MOVE_EFFECT_WEATHER 75 #define MOVE_EFFECT_TERRAIN 76 +#define MOVE_EFFECT_STEALTH_ROCK 77 +#define MOVE_EFFECT_STEELSURGE 78 -#define NUM_MOVE_EFFECTS 77 +#define NUM_MOVE_EFFECTS 79 #define MOVE_EFFECT_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 3c020f5c40..258e74b154 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -263,6 +263,7 @@ #define VARIOUS_JUMP_IF_NO_VALID_TARGETS 171 #define VARIOUS_JUMP_IF_TARGET_NOT_ALLY 172 #define VARIOUS_JUMP_IF_TARGET_ABSENT 173 +#define VARIOUS_SET_STEELSURGE 174 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index e561a9cb98..9a0a6e4d1c 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -641,8 +641,11 @@ #define STRINGID_PKMNSABILITYPREVENTSABILITY 639 #define STRINGID_PREPARESHELLTRAP 640 #define STRINGID_SHELLTRAPDIDNTWORK 641 +#define STRINGID_SHARPSTEELFLOATS 642 +#define STRINGID_SHARPSTEELDMG 643 +#define STRINGID_PKMNBLEWAWAYSHARPSTEEL 644 -#define BATTLESTRINGS_COUNT 642 +#define BATTLESTRINGS_COUNT 645 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, diff --git a/src/battle_debug.c b/src/battle_debug.c index 027be03a45..3c2d9977cd 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -154,6 +154,7 @@ enum LIST_SIDE_STEALTH_ROCK, LIST_SIDE_TOXIC_SPIKES, LIST_SIDE_STICKY_WEB, + LIST_SIDE_STEELSURGE, }; enum @@ -228,6 +229,7 @@ static const u8 sText_PP[] = _("PP"); static const u8 sText_StealthRock[] = _("Stealth Rock"); static const u8 sText_ToxicSpikes[] = _("Toxic Spikes"); static const u8 sText_StickyWeb[] = _("Sticky Web"); +static const u8 sText_Steelsurge[] = _("Steelsurge"); static const u8 sText_AI[] = _("AI"); static const u8 sText_NoBadMoves[] = _("No Bad Moves"); static const u8 sText_Viability[] = _("Viability"); @@ -454,6 +456,7 @@ static const struct ListMenuItem sSideStatusListItems[] = {sText_StealthRock, LIST_SIDE_STEALTH_ROCK}, {sText_ToxicSpikes, LIST_SIDE_TOXIC_SPIKES}, {sText_StickyWeb, LIST_SIDE_STICKY_WEB}, + {sText_Steelsurge, LIST_SIDE_STEELSURGE}, }; static const struct ListMenuItem sSecondaryListItems[] = @@ -1744,6 +1747,15 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_STICKY_WEB; } return &sideTimer->stickyWebAmount; + case LIST_SIDE_STEELSURGE: + if (changeStatus) + { + if (statusTrue) + *(u32 *)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_STEELSURGE; + else + *(u32 *)(data->modifyArrows.modifiedValPtr) &= ~SIDE_STATUS_STEELSURGE; + } + return &sideTimer->steelsurgeAmount; default: return NULL; } diff --git a/src/battle_message.c b/src/battle_message.c index 8d170b5524..1fb075ef70 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -776,9 +776,15 @@ static const u8 sText_AbilityWeakenedSurroundingMonsStat[] = _("{B_ATK_NAME_WITH static const u8 sText_AttackerGainedStrengthFromTheFallen[] = _("{B_ATK_NAME_WITH_PREFIX} gained strength\nfrom the fallen!"); static const u8 sText_PrepareShellTrap[] = _("{B_ATK_NAME_WITH_PREFIX} set a shell trap!"); static const u8 sText_ShellTrapDidntWork[] = _("{B_ATK_NAME_WITH_PREFIX}'s shell trap didn't work!"); +static const u8 sText_SharpSteelFloats[] = _("Sharp-pointed steel floats\naround {B_DEF_TEAM2} team!"); +static const u8 sText_SharpSteelDmg[] = _("Sharp steel bit into {B_DEF_NAME_WITH_PREFIX}!"); +static const u8 sText_PkmnBlewAwaySharpSteel[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nsharp steel!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_PKMNBLEWAWAYSHARPSTEEL - BATTLESTRINGS_TABLE_START] = sText_PkmnBlewAwaySharpSteel, + [STRINGID_SHARPSTEELDMG - BATTLESTRINGS_TABLE_START] = sText_SharpSteelDmg, + [STRINGID_SHARPSTEELFLOATS - BATTLESTRINGS_TABLE_START] = sText_SharpSteelFloats, [STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN - BATTLESTRINGS_TABLE_START] = sText_AttackerGainedStrengthFromTheFallen, [STRINGID_ABILITYWEAKENEDFSURROUNDINGMONSSTAT - BATTLESTRINGS_TABLE_START] = sText_AbilityWeakenedSurroundingMonsStat, [STRINGID_ELECTRICTERRAINACTIVATEDABILITY - BATTLESTRINGS_TABLE_START] = sText_ElectricTerrainActivatedAbility, @@ -1460,7 +1466,7 @@ const u16 gHealingWishStringIds[] = const u16 gDmgHazardsStringIds[] = { - STRINGID_PKMNHURTBYSPIKES, STRINGID_STEALTHROCKDMG + STRINGID_PKMNHURTBYSPIKES, STRINGID_STEALTHROCKDMG, STRINGID_SHARPSTEELDMG }; const u16 gSwitchInAbilityStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ed8e8fdf4b..c8ac3c6719 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2868,6 +2868,7 @@ void SetMoveEffect(bool32 primary, u32 certain) bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR); u32 flags = 0; u16 battlerAbility; + bool8 activateAfterFaint = FALSE; if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT && gBattleMons[gBattlerTarget].hp != 0 @@ -2885,6 +2886,10 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleStruct->moveEffect2 = gBattleScripting.moveEffect; gBattlescriptCurrInstr++; return; + case MOVE_EFFECT_STEALTH_ROCK: + case MOVE_EFFECT_STEELSURGE: + activateAfterFaint = TRUE; + break; } if (gBattleScripting.moveEffect & MOVE_EFFECT_AFFECTS_USER) @@ -2926,6 +2931,7 @@ void SetMoveEffect(bool32 primary, u32 certain) INCREMENT_RESET_RETURN if (gBattleMons[gEffectBattler].hp == 0 + && !activateAfterFaint && gBattleScripting.moveEffect != MOVE_EFFECT_PAYDAY && gBattleScripting.moveEffect != MOVE_EFFECT_STEAL_ITEM && gBattleScripting.moveEffect != MOVE_EFFECT_BUG_BITE) @@ -3825,6 +3831,20 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; } + case MOVE_EFFECT_STEALTH_ROCK: + if (!(gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_STEALTH_ROCK)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_StealthRockActivates; + } + break; + case MOVE_EFFECT_STEELSURGE: + if (!(gSideStatuses[GetBattlerSide(gEffectBattler)] & SIDE_STATUS_STEELSURGE)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_SteelsurgeActivates; + } + break; } } } @@ -3911,7 +3931,7 @@ static void Cmd_tryfaintmon(void) BattleScriptPop(); gBattlescriptCurrInstr = instr; - gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED | SIDE_STATUS_TOXIC_SPIKES_DAMAGED | SIDE_STATUS_STEALTH_ROCK_DAMAGED | SIDE_STATUS_STICKY_WEB_DAMAGED); + gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED | SIDE_STATUS_TOXIC_SPIKES_DAMAGED | SIDE_STATUS_STEALTH_ROCK_DAMAGED | SIDE_STATUS_STICKY_WEB_DAMAGED | SIDE_STATUS_STEELSURGE_DAMAGED); } else { @@ -7150,6 +7170,17 @@ static void Cmd_switchineffects(void) BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_StickyWebOnSwitchIn; } + else if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_STEELSURGE_DAMAGED) + && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_STEELSURGE) + && IsBattlerAffectedByHazards(gActiveBattler, FALSE) + && GetBattlerAbility(gActiveBattler) != ABILITY_MAGIC_GUARD) + { + gSideStatuses[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_STEELSURGE_DAMAGED; + gBattleMoveDamage = GetStealthHazardDamage(gBattleMoves[MOVE_G_MAX_STEELSURGE].type, gActiveBattler); + + if (gBattleMoveDamage != 0) + SetDmgHazardsBattlescript(gActiveBattler, 2); + } else if (gBattleMons[gActiveBattler].hp != gBattleMons[gActiveBattler].maxHP && gBattleStruct->zmove.healReplacement) { gBattleStruct->zmove.healReplacement = FALSE; @@ -7183,7 +7214,7 @@ static void Cmd_switchineffects(void) return; } - gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED | SIDE_STATUS_TOXIC_SPIKES_DAMAGED | SIDE_STATUS_STEALTH_ROCK_DAMAGED | SIDE_STATUS_STICKY_WEB_DAMAGED); + gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED | SIDE_STATUS_TOXIC_SPIKES_DAMAGED | SIDE_STATUS_STEALTH_ROCK_DAMAGED | SIDE_STATUS_STICKY_WEB_DAMAGED | SIDE_STATUS_STEELSURGE_DAMAGED); for (i = 0; i < gBattlersCount; i++) { @@ -8514,6 +8545,7 @@ static bool32 ClearDefogHazards(u8 battlerAtk, bool32 clear) DEFOG_CLEAR(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, BattleScript_StealthRockFree, 0); DEFOG_CLEAR(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, BattleScript_ToxicSpikesFree, 0); DEFOG_CLEAR(SIDE_STATUS_STICKY_WEB, stickyWebAmount, BattleScript_StickyWebFree, 0); + DEFOG_CLEAR(SIDE_STATUS_STEELSURGE, steelsurgeAmount, BattleScript_SteelsurgeFree, 0); } return FALSE; @@ -8698,6 +8730,7 @@ static bool32 CourtChangeSwapSideStatuses(void) COURTCHANGE_SWAP(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, temp); COURTCHANGE_SWAP(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, temp); COURTCHANGE_SWAP(SIDE_STATUS_STICKY_WEB, stickyWebAmount, temp); + COURTCHANGE_SWAP(SIDE_STATUS_STEELSURGE, stickyWebAmount, temp); // Change battler IDs of swapped effects. Needed for the correct string when they expire // E.g. "Foe's Reflect wore off!" @@ -11206,6 +11239,22 @@ static void Cmd_various(void) gBattlescriptCurrInstr = cmd->nextInstr; return; } + case VARIOUS_STORE_HEALING_WISH: + { + VARIOUS_ARGS(); + if (gCurrentMove == MOVE_LUNAR_DANCE) + gBattleStruct->storedLunarDance |= gBitTable[gActiveBattler]; + else + gBattleStruct->storedHealingWish |= gBitTable[gActiveBattler]; + break; + } + case VARIOUS_HIT_SWITCH_TARGET_FAILED: + { + VARIOUS_ARGS(); + gBattleStruct->hitSwitchTargetFailed = TRUE; + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } case VARIOUS_SET_MAX_MOVE_EFFECT: { VARIOUS_ARGS(); @@ -11237,6 +11286,12 @@ static void Cmd_various(void) case MAX_EFFECT_PSYCHIC_TERRAIN: gBattleScripting.moveEffect = MOVE_EFFECT_TERRAIN; break; + case MAX_EFFECT_STEALTH_ROCK: + gBattleScripting.moveEffect = MOVE_EFFECT_STEALTH_ROCK; + break; + case MAX_EFFECT_STEELSURGE: + gBattleScripting.moveEffect = MOVE_EFFECT_STEELSURGE; + break; } break; } @@ -11258,20 +11313,20 @@ static void Cmd_various(void) gBattlescriptCurrInstr = cmd->nextInstr; return; } - case VARIOUS_STORE_HEALING_WISH: + case VARIOUS_SET_STEELSURGE: { - VARIOUS_ARGS(); - if (gCurrentMove == MOVE_LUNAR_DANCE) - gBattleStruct->storedLunarDance |= gBitTable[gActiveBattler]; + VARIOUS_ARGS(const u8 *failInstr); + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (gSideStatuses[targetSide] & SIDE_STATUS_STEELSURGE) + { + gBattlescriptCurrInstr = cmd->failInstr; + } else - gBattleStruct->storedHealingWish |= gBitTable[gActiveBattler]; - break; - } - case VARIOUS_HIT_SWITCH_TARGET_FAILED: - { - VARIOUS_ARGS(); - gBattleStruct->hitSwitchTargetFailed = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; + { + gSideStatuses[targetSide] |= SIDE_STATUS_STEELSURGE; + gSideTimers[targetSide].steelsurgeAmount = 1; + gBattlescriptCurrInstr = cmd->nextInstr; + } return; } } // End of switch (cmd->id) @@ -14065,6 +14120,13 @@ static void Cmd_rapidspinfree(void) BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_StealthRockFree; } + else if (gSideStatuses[atkSide] & SIDE_STATUS_STEELSURGE) + { + gSideStatuses[atkSide] &= ~SIDE_STATUS_STEELSURGE; + gSideTimers[atkSide].steelsurgeAmount = 0; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SteelsurgeFree; + } else { gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 309977b841..966f164b23 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -15233,7 +15233,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15248,7 +15248,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15278,7 +15278,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15293,7 +15293,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15308,7 +15308,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15323,7 +15323,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15338,7 +15338,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15353,7 +15353,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15368,7 +15368,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15383,7 +15383,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15398,7 +15398,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15413,7 +15413,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15428,7 +15428,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15443,7 +15443,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15458,7 +15458,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15473,7 +15473,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15488,7 +15488,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15503,7 +15503,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15518,7 +15518,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15533,7 +15533,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15548,7 +15548,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15563,7 +15563,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15578,7 +15578,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15593,7 +15593,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15608,7 +15608,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15623,7 +15623,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15638,7 +15638,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15653,7 +15653,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15668,7 +15668,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15683,7 +15683,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15698,7 +15698,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15714,7 +15714,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15729,7 +15729,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15744,7 +15744,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15759,7 +15759,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15774,7 +15774,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, @@ -15789,7 +15789,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0,