diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index f9da963107..d0a8dbc9c2 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2247,6 +2247,16 @@ .4byte \ptr .endm + .macro tryhealsixthhealth, ptr:req + various 0, VARIOUS_TRY_HEAL_SIXTH_HP + .4byte \ptr + .endm + + .macro tryrecycleberry, ptr:req + various 0, VARIOUS_TRY_RECYCLE_BERRY + .4byte \ptr + .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_scripts_1.s b/data/battle_scripts_1.s index 1667e7a1a8..802dd78ffe 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -10358,6 +10358,7 @@ BattleScript_EffectMaxMove:: tryfaintmon BS_TARGET goto BattleScript_MoveEnd +@ TODO: Maybe rework to use setallytonexttarget. BattleScript_EffectRaiseStatAllies:: savetarget setbyte gBattlerTarget, 0 @@ -10535,6 +10536,61 @@ BattleScript_RaiseCritAlliesEnd: restoretarget return +BattleScript_EffectHealOneSixthAllies:: + jumpifteamhealthy BS_ATTACKER, BattleScript_MoveEnd + setbyte gBattlerTarget, 0 +BattleScript_HealOneSixthAlliesLoop: + jumpiftargetnotally BattleScript_HealOneSixthAlliesIncrement + jumpiftargetabsent BattleScript_HealOneSixthAlliesIncrement + tryhealsixthhealth BattleScript_HealOneSixthAlliesIncrement + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + printstring STRINGID_PKMNREGAINEDHEALTH + waitmessage B_WAIT_TIME_LONG +BattleScript_HealOneSixthAlliesIncrement: + addbyte gBattlerTarget, 1 + jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_HealOneSixthAlliesLoop +BattleScript_HealOneSixthAlliesEnd: + restoretarget + return + +BattleScript_EffectCureStatusAllies:: + jumpifteamhealthy BS_ATTACKER, BattleScript_MoveEnd + setbyte gBattlerTarget, 0 +BattleScript_CureStatusAlliesLoop: + jumpiftargetnotally BattleScript_CureStatusAlliesIncrement + jumpiftargetabsent BattleScript_CureStatusAlliesIncrement + jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_CureStatusActivate +BattleScript_CureStatusAlliesIncrement: + addbyte gBattlerTarget, 1 + jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_CureStatusAlliesLoop +BattleScript_CureStatusAlliesEnd: + restoretarget + return +BattleScript_CureStatusActivate: + curestatus BS_TARGET + updatestatusicon BS_TARGET + printstring STRINGID_PKMNSTATUSNORMAL + waitmessage B_WAIT_TIME_LONG + goto BattleScript_CureStatusAlliesIncrement + +BattleScript_EffectRecycleBerriesAllies:: + jumpifteamhealthy BS_ATTACKER, BattleScript_MoveEnd + setbyte gBattlerTarget, 0 +BattleScript_RecycleBerriesAlliesLoop: + jumpiftargetnotally BattleScript_RecycleBerriesAlliesIncrement + jumpiftargetabsent BattleScript_RecycleBerriesAlliesIncrement + tryrecycleberry BattleScript_RecycleBerriesAlliesIncrement + printstring STRINGID_XFOUNDONEY + waitmessage B_WAIT_TIME_LONG +BattleScript_RecycleBerriesAlliesIncrement: + addbyte gBattlerTarget, 1 + jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_RecycleBerriesAlliesLoop +BattleScript_RecycleBerriesAlliesEnd: + restoretarget + return + BattleScript_PokemonCantUseTheMove:: attackstring ppreduce diff --git a/include/battle_dynamax.h b/include/battle_dynamax.h index bd13397c58..faa7a0dd99 100644 --- a/include/battle_dynamax.h +++ b/include/battle_dynamax.h @@ -51,6 +51,7 @@ enum MaxMoveEffect MAX_EFFECT_LOWER_SPEED_2_FOES, MAX_EFFECT_FIRE_SPIN_FOES, MAX_EFFECT_FIXED_POWER, + MAX_EFFECT_BYPASS_PROTECT, }; bool8 ShouldUseMaxMove(u16 battlerId, u16 baseMove); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 9941288cc4..4606b0649a 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -482,5 +482,8 @@ extern const u8 BattleScript_EffectStatus1Foes[]; extern const u8 BattleScript_EffectStatus2Foes[]; extern const u8 BattleScript_TormentEnds[]; extern const u8 BattleScript_EffectRaiseCritAlliesAnim[]; +extern const u8 BattleScript_EffectHealOneSixthAllies[]; +extern const u8 BattleScript_EffectCureStatusAllies[]; +extern const u8 BattleScript_EffectRecycleBerriesAllies[]; #endif // GUARD_BATTLE_SCRIPTS_H \ No newline at end of file diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index dd6892b254..7452d22057 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -267,6 +267,8 @@ #define VARIOUS_DAMAGE_NON_TYPES 175 #define VARIOUS_TRY_SET_STATUS1 176 #define VARIOUS_TRY_SET_STATUS2 177 +#define VARIOUS_TRY_HEAL_SIXTH_HP 178 +#define VARIOUS_TRY_RECYCLE_BERRY 179 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index a14a9c65af..edb41c6e5c 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -29,8 +29,8 @@ static const u16 sMaxMoveTable[] = [TYPE_STEEL] = MOVE_MAX_STEELSPIKE, [TYPE_FIRE] = MOVE_MAX_FLARE, [TYPE_WATER] = MOVE_MAX_GEYSER, - [TYPE_GRASS] = MOVE_G_MAX_CHI_STRIKE, - [TYPE_ELECTRIC] = MOVE_G_MAX_DEPLETION, + [TYPE_GRASS] = MOVE_MAX_OVERGROWTH, + [TYPE_ELECTRIC] = MOVE_MAX_LIGHTNING, [TYPE_PSYCHIC] = MOVE_MAX_MINDSTORM, [TYPE_ICE] = MOVE_MAX_HAILSTORM, [TYPE_DRAGON] = MOVE_MAX_WYRMWIND, @@ -92,7 +92,7 @@ bool8 ShouldUseMaxMove(u16 battlerId, u16 baseMove) // return !IsRaidBossUsingRegularMove(battlerId, baseMove); if (gBattleStruct->dynamax.dynamaxTurns[battlerId] > 0) return TRUE; - return battlerId == B_POSITION_PLAYER_LEFT; + return FALSE; } // Returns the appropriate Max Move or G-Max Move for a battler to use. @@ -517,6 +517,22 @@ u16 SetMaxMoveEffect(u16 move) gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; effect++; break; + case MAX_EFFECT_HEAL_TEAM: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectHealOneSixthAllies; + effect++; + break; + case MAX_EFFECT_AROMATHERAPY: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectCureStatusAllies; + effect++; + break; + case MAX_EFFECT_RECYCLE_BERRIES: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_EffectRecycleBerriesAllies; + effect++; + break; + } return effect; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 23204ccdc5..acde0e0089 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11325,6 +11325,44 @@ static void Cmd_various(void) } return; } + case VARIOUS_TRY_HEAL_SIXTH_HP: + { + VARIOUS_ARGS(const u8 *failInstr); + gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 6; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + + if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) + gBattlescriptCurrInstr = cmd->failInstr; // fail + else + gBattlescriptCurrInstr = cmd->nextInstr; // can heal + return; + } + case VARIOUS_TRY_RECYCLE_BERRY: + { + VARIOUS_ARGS(const u8 *failInstr); + u16* usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; + if (gBattleMons[gBattlerTarget].item == ITEM_NONE + && gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item + && ItemId_GetPocket(*usedHeldItem) == POCKET_BERRIES + && Random() % 2 == 0) + { + gLastUsedItem = *usedHeldItem; + *usedHeldItem = ITEM_NONE; + gBattleMons[gActiveBattler].item = gLastUsedItem; + + BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + MarkBattlerForControllerExec(gActiveBattler); + + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->failInstr; + } + return; + } } // End of switch (cmd->id) gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/src/battle_util.c b/src/battle_util.c index 2af89f63ab..ab4d2f623e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8295,7 +8295,8 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move) // Max Moves bypass any protection except Max Guard. if (IsMaxMove(move)) { - if (gProtectStructs[battlerId].maxGuarded) + if (gProtectStructs[battlerId].maxGuarded + && gBattleMoves[move].argument != MAX_EFFECT_BYPASS_PROTECT) return TRUE; else return FALSE; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index cbb39caadd..658436cea2 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -15779,7 +15779,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .priority = 0, .flags = 0, .split = SPLIT_PHYSICAL, - .argument = MAX_EFFECT_TORMENT_FOES, //EFFECT TODO + .argument = MAX_EFFECT_BYPASS_PROTECT, //EFFECT TODO }, [MOVE_G_MAX_RAPID_FLOW] = @@ -15794,7 +15794,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .priority = 0, .flags = 0, .split = SPLIT_PHYSICAL, - .argument = MAX_EFFECT_TORMENT_FOES, //EFFECT TODO + .argument = MAX_EFFECT_BYPASS_PROTECT, //EFFECT TODO }, };