diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2589811252..b6008134c0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4163,7 +4163,7 @@ BattleScript_MagicCoatBounce:: attackstring ppreduce pause 0x20 - printstring STRINGID_PKMNMOVEBOUNCED + printfromtable gMagicCoatBounceStringIds waitmessage 0x40 orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_x800000 setmagiccoattarget BS_ATTACKER diff --git a/include/battle.h b/include/battle.h index facd30c0b0..7705cd22f0 100644 --- a/include/battle.h +++ b/include/battle.h @@ -209,8 +209,7 @@ struct ProtectStruct u32 flag_x20:1; // 0x20 u32 flag_x40:1; // 0x40 u32 flag_x80:1; // 0x80 - /* field_3 */ - u32 field3:8; + u32 usesBouncedMove:1; /* field_4 */ u32 physicalDmg; /* field_8 */ u32 specialDmg; diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index ad4ffd8921..92040daf49 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -484,6 +484,7 @@ #define STRINGID_ATTACKERACQUIREDABILITY 481 #define STRINGID_TARGETABILITYSTATLOWER 482 #define STRINGID_TARGETSTATWONTGOHIGHER 483 +#define STRINGID_PKMNMOVEBOUNCEDABILITY 484 #define BATTLESTRINGS_COUNT 496 diff --git a/src/battle_main.c b/src/battle_main.c index 39ce130856..21ac3a39e6 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -52,7 +52,7 @@ #include "international_string_util.h" #include "pokeball.h" #include "party_menu.h" -#include "constants\battle_config.h" +#include "constants/battle_config.h" struct UnknownPokemonStruct4 { diff --git a/src/battle_message.c b/src/battle_message.c index ed713e961f..af10c7bf59 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -625,6 +625,7 @@ static const u8 sText_LunarDanceCameTrue[] = _("{B_ATK_NAME_WITH_PREFIX} became static const u8 sText_CursedBodyDisabled[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1} was disabled\nby {B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}!"); static const u8 sText_AttackerAquiredAbility[] = _("{B_ATK_NAME_WITH_PREFIX} acquired {B_LAST_ABILITY}!"); static const u8 sText_TargetStatWontGoHigher[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\nwon’t go higher!"); +static const u8 sText_PkmnMoveBouncedViaAbility[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_CURRENT_MOVE} was\nbounced back by {B_DEF_NAME_WITH_PREFIX}’s\l{B_DEF_ABILITY}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1101,6 +1102,12 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_AttackerAquiredAbility, sText_TargetAbilityLoweredStat, sText_TargetStatWontGoHigher, + sText_PkmnMoveBouncedViaAbility, +}; + +const u16 gMagicCoatBounceStringIds[] = +{ + STRINGID_PKMNMOVEBOUNCED, STRINGID_PKMNMOVEBOUNCEDABILITY }; const u16 gHealingWishStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 139ffcd6e2..b1b75c6e3e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -968,10 +968,25 @@ static void atk00_attackcanceler(void) gHitMarker |= HITMARKER_OBEYS; - if (gProtectStructs[gBattlerTarget].bounceMove && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED) + if (gProtectStructs[gBattlerTarget].bounceMove + && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED + && !gProtectStructs[gBattlerAttacker].usesBouncedMove) { PressurePPLose(gBattlerAttacker, gBattlerTarget, MOVE_MAGIC_COAT); gProtectStructs[gBattlerTarget].bounceMove = 0; + gProtectStructs[gBattlerTarget].usesBouncedMove = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; + return; + } + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_MAGIC_BOUNCE + && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED + && !gProtectStructs[gBattlerAttacker].usesBouncedMove) + { + RecordAbilityBattle(gBattlerTarget, ABILITY_MAGIC_BOUNCE); + gProtectStructs[gBattlerTarget].usesBouncedMove = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; return; @@ -4031,7 +4046,7 @@ static void atk48_playstatchangeanimation(void) } } -#define ATK49_LAST_CASE 17 +#define ATK49_LAST_CASE 18 static void atk49_moveend(void) { @@ -4307,6 +4322,10 @@ static void atk49_moveend(void) } gBattleScripting.atk49_state++; break; + case 17: // Clear bits active just while using a move. + gProtectStructs[gBattlerAttacker].usesBouncedMove = 0; + gBattleScripting.atk49_state++; + break; case ATK49_LAST_CASE: break; }