From 6b5c52e926b867c020b92decdf1843255b264a4e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 6 Oct 2018 15:50:35 +0200 Subject: [PATCH] Flower Shield and protect moves --- data/battle_scripts_1.s | 55 ++++++++++++++++++ include/battle.h | 67 +++++++++++----------- include/constants/battle_move_effects.h | 3 + include/constants/battle_string_ids.h | 2 +- include/constants/pokemon.h | 1 + src/battle_ai_script_commands.c | 2 - src/battle_main.c | 10 ++++ src/battle_message.c | 7 +-- src/battle_script_commands.c | 74 ++++++++++++++++++++----- src/data/battle_moves.h | 46 +++++++-------- 10 files changed, 188 insertions(+), 79 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 75a05198d..6022c4f20 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -327,6 +327,45 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectAfterYou .4byte BattleScript_EffectBestow .4byte BattleScript_EffectRototiller + .4byte BattleScript_EffectFlowerShield + .4byte BattleScript_EffectHitPreventEscape + .4byte BattleScript_EffectSpeedSwap + +BattleScript_EffectFlowerShield: + attackcanceler + attackstring + ppreduce + selectfirstvalidtarget +BattleScript_FlowerShieldIsAnyGrass: + jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_FlowerShieldLoopStart + jumpifnexttargetvalid BattleScript_FlowerShieldIsAnyGrass + goto BattleScript_ButItFailed +BattleScript_FlowerShieldLoopStart: + selectfirstvalidtarget +BattleScript_FlowerShieldLoop: + movevaluescleanup + jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_FlowerShieldLoop2 + goto BattleScript_FlowerShieldMoveTargetEnd +BattleScript_FlowerShieldLoop2: + setstatchanger STAT_DEF, 1, FALSE + statbuffchange 0x1, BattleScript_FlowerShieldMoveTargetEnd + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, 0x2, BattleScript_FlowerShieldDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_FlowerShieldMoveTargetEnd + pause 0x15 + goto BattleScript_FlowerShieldString +BattleScript_FlowerShieldDoAnim: + attackanimation + waitanimation + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_FlowerShieldString: + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_FlowerShieldMoveTargetEnd: + setbyte sMOVEEND_STATE, 0x0 + moveend 0x2, 0x10 + jumpifnexttargetvalid BattleScript_FlowerShieldLoop + end BattleScript_EffectRototiller: attackcanceler @@ -1268,6 +1307,18 @@ BattleScript_EffectGuardSwap: waitmessage 0x40 goto BattleScript_MoveEnd +BattleScript_EffectSpeedSwap: + attackcanceler + attackstring + ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + swapstatstages STAT_SPEED + attackanimation + waitanimation + printstring STRINGID_PKMNSWITCHEDSTATCHANGES + waitmessage 0x40 + goto BattleScript_MoveEnd + BattleScript_EffectTelekinesis: attackcanceler accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON @@ -2816,6 +2867,10 @@ BattleScript_TripleKickEnd:: BattleScript_EffectThief:: setmoveeffect MOVE_EFFECT_STEAL_ITEM goto BattleScript_EffectHit + +BattleScript_EffectHitPreventEscape: + setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE + goto BattleScript_EffectHit BattleScript_EffectMeanLook:: attackcanceler diff --git a/include/battle.h b/include/battle.h index d46563a76..a886098bd 100644 --- a/include/battle.h +++ b/include/battle.h @@ -185,41 +185,38 @@ struct DisableStruct struct ProtectStruct { - /* field_0 */ - u32 protected:1; - u32 endured:1; - u32 noValidMoves:1; - u32 helpingHand:1; - u32 bounceMove:1; - u32 stealMove:1; - u32 flag0Unknown:1; - u32 prlzImmobility:1; - /* field_1 */ - u32 confusionSelfDmg:1; - u32 targetNotAffected:1; - u32 chargingTurn:1; - u32 fleeFlag:2; // for RunAway and Smoke Ball - u32 usedImprisionedMove:1; - u32 loveImmobility:1; - u32 usedDisabledMove:1; - /* field_2 */ - u32 usedTauntedMove:1; // 0x1 - u32 flag2Unknown:1; // 0x2 - u32 flinchImmobility:1; // 0x4 - u32 notFirstStrike:1; // 0x8 - u32 flag_x10:1; // 0x10 - u32 flag_x20:1; // 0x20 - u32 flag_x40:1; // 0x40 - u32 flag_x80:1; // 0x80 - u32 usesBouncedMove:1; - u32 usedHealBlockedMove:1; - u32 usedGravityPreventedMove:1; - - /* field_4 */ u32 physicalDmg; - /* field_8 */ u32 specialDmg; - /* field_C */ u8 physicalBattlerId; - /* field_D */ u8 specialBattlerId; - /* field_E */ u16 fieldE; + u8 protected:1; + u8 wideGuarded:1; + u8 quickGuarded:1; + u8 spikyShielded:1; + u8 kingsShielded:1; + u8 banefulBunkered:1; + u8 endured:1; + u8 noValidMoves:1; + u8 helpingHand:1; + u8 bounceMove:1; + u8 stealMove:1; + u8 flag0Unknown:1; + u8 prlzImmobility:1; + u8 confusionSelfDmg:1; + u8 targetNotAffected:1; + u8 chargingTurn:1; + u8 fleeFlag:2; // for RunAway and Smoke Ball + u8 usedImprisionedMove:1; + u8 loveImmobility:1; + u8 usedDisabledMove:1; + u8 usedTauntedMove:1; + u8 flag2Unknown:1; + u8 flinchImmobility:1; + u8 notFirstStrike:1; + u8 flag_x10:1; + u8 usesBouncedMove:1; + u8 usedHealBlockedMove:1; + u8 usedGravityPreventedMove:1; + u32 physicalDmg; + u32 specialDmg; + u8 physicalBattlerId; + u8 specialBattlerId; }; struct SpecialStatus diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index ac179b748..1524353d3 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -316,5 +316,8 @@ #define EFFECT_AFTER_YOU 310 #define EFFECT_BESTOW 311 #define EFFECT_ROTOTILLER 312 +#define EFFECT_FLOWER_SHIELD 313 +#define EFFECT_HIT_PREVENT_ESCAPE 314 +#define EFFECT_SPEED_SWAP 315 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 8f2e52908..ac0b0bc3c 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -424,7 +424,7 @@ #define STRINGID_EMPTYSTRING5 421 #define STRINGID_KINDOFFER 422 #define STRINGID_RESETSTARGETSSTATLEVELS 423 -#define STRINGID_PROTECTSTEAMFROMPRIORITY 424 +#define STRINGID_EMPTYSTRING6 424 #define STRINGID_ALLYSWITCHPOSITION 425 #define STRINGID_RESTORETARGETSHEALTH 426 #define STRINGID_TOOKPJMNINTOTHESKY 427 diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index a0900fff0..94c205bab 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -97,6 +97,7 @@ #define FLAG_DMG_UNDERWATER 0x8000 #define FLAG_SOUND 0x10000 #define FLAG_BALLISTIC 0x20000 +#define FLAG_PROTECTION_MOVE 0x40000 // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index fab8e53c6..abd545f05 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -276,8 +276,6 @@ static const u16 sDiscouragedPowerfulMoveEffects[] = { EFFECT_EXPLOSION, EFFECT_DREAM_EATER, - EFFECT_RAZOR_WIND, - EFFECT_SKY_ATTACK, EFFECT_RECHARGE, EFFECT_SKULL_BASH, EFFECT_SOLARBEAM, diff --git a/src/battle_main.c b/src/battle_main.c index 0f2015bd0..623795219 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3250,6 +3250,11 @@ void FaintClearSetData(void) ptr[i] = 0; gProtectStructs[gActiveBattler].protected = 0; + gProtectStructs[gActiveBattler].wideGuarded = 0; + gProtectStructs[gActiveBattler].quickGuarded = 0; + gProtectStructs[gActiveBattler].spikyShielded = 0; + gProtectStructs[gActiveBattler].kingsShielded = 0; + gProtectStructs[gActiveBattler].banefulBunkered = 0; gProtectStructs[gActiveBattler].endured = 0; gProtectStructs[gActiveBattler].noValidMoves = 0; gProtectStructs[gActiveBattler].helpingHand = 0; @@ -4918,6 +4923,11 @@ static void TurnValuesCleanUp(bool8 var0) { gProtectStructs[gActiveBattler].protected = 0; gProtectStructs[gActiveBattler].endured = 0; + gProtectStructs[gActiveBattler].wideGuarded = 0; + gProtectStructs[gActiveBattler].quickGuarded = 0; + gProtectStructs[gActiveBattler].spikyShielded = 0; + gProtectStructs[gActiveBattler].kingsShielded = 0; + gProtectStructs[gActiveBattler].banefulBunkered = 0; } else { diff --git a/src/battle_message.c b/src/battle_message.c index 0ff8d1806..5594fd7fb 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -553,7 +553,7 @@ static const u8 sText_PointedStonesFloat[] =_("Pointed stones float in the air\n static const u8 sText_CloakedInMysticalMoonlight[] =_("It became cloaked in mystical\nmoonlight!"); static const u8 sText_TrappedBySwirlingMagma[] =_("{B_DEF_NAME_WITH_PREFIX} became\ntrapped by swirling magma!"); static const u8 sText_VanishedInstantly[] =_("{B_ATK_NAME_WITH_PREFIX} Vanished\ninstantly!"); -static const u8 sText_ProtectedTeam[] =_("Wide Guard protected your team!"); +static const u8 sText_ProtectedTeam[] =_("{B_CURRENT_MOVE} protected\nyour team!"); static const u8 sText_SharedItsGuard[] =_("{B_ATK_NAME_WITH_PREFIX} shared its\nguard with the target!"); static const u8 sText_SharedItsPower[] =_("{B_ATK_NAME_WITH_PREFIX} shared its\npower with the target!"); static const u8 sText_SwapsDefAndSpDefOfAllPkmn[] =_("It created a bizarre area in which\nthe Defense and Sp.Def stats are swapped!"); @@ -565,7 +565,6 @@ static const u8 sText_TransformedIntoWaterType[] =_("{B_DEF_NAME_WITH_PREFIX} tr static const u8 sText_PkmnAcquiredSimple[] =_("{B_DEF_NAME_WITH_PREFIX} acquired\nSimple!"); static const u8 sText_KindOffer[] =_("{B_DEF_NAME_WITH_PREFIX}\ntook the kind offer!"); static const u8 sText_ResetsTargetsStatLevels[] =_("{B_DEF_NAME_WITH_PREFIX}’s stat changes\nwere removed!"); -static const u8 sText_ProtectsTeamFromPriority[] =_("Quick Guard protected your team!"); static const u8 sText_AllySwitchPosition[] =_("{B_ATK_NAME_WITH_PREFIX} and\n{B_SCR_ACTIVE_NAME_WITH_PREFIX} switched places!"); static const u8 sText_RestoreTargetsHealth[] =_("{B_DEF_NAME_WITH_PREFIX}’s HP was restored!"); static const u8 sText_TookPkmnIntoTheSky[] =_("{B_ATK_NAME_WITH_PREFIX} took\n{B_DEF_NAME_WITH_PREFIX} into the sky!"); @@ -1067,7 +1066,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_EmptyString4, // 421 sText_KindOffer, // 422 sText_ResetsTargetsStatLevels, // 423 - sText_ProtectsTeamFromPriority, // 424 + sText_EmptyString4, // 424 sText_AllySwitchPosition, // 425 sText_RestoreTargetsHealth, // 426 sText_TookPkmnIntoTheSky, // 427 @@ -1221,7 +1220,7 @@ const u16 gRainContinuesStringIds[] = const u16 gProtectLikeUsedStringIds[] = { - STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF, STRINGID_BUTITFAILED + STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF, STRINGID_BUTITFAILED, STRINGID_PROTECTEDTEAM, }; const u16 gReflectLightScreenSafeguardStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c4ea457b1..a34d066e9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -73,8 +73,6 @@ extern u16 GetBattlePyramidPickupItemId(void); extern u8 sub_813B21C(void); extern u16 get_unknown_box_id(void); -#define DEFENDER_IS_PROTECTED ((gProtectStructs[gBattlerTarget].protected) && (gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED)) - // this file's functions static bool8 IsTwoTurnsMove(u16 move); static void TrySetDestinyBondToHappen(void); @@ -933,6 +931,28 @@ static const u8 sUnknown_0831C4F8[] = 0x03, 0x00, 0x00, 0x00 }; +bool32 IsBattlerProtected(u8 battlerId, u16 move) +{ + if (!(gBattleMoves[move].flags & FLAG_PROTECT_AFFECTED)) + return FALSE; + else if (gProtectStructs[battlerId].protected) + return TRUE; + else if ((gProtectStructs[battlerId].wideGuarded || gProtectStructs[BATTLE_PARTNER(battlerId)].wideGuarded) + && gBattleMoves[move].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)) + return TRUE; + else if (gProtectStructs[battlerId].banefulBunkered) + return TRUE; + else if (gProtectStructs[battlerId].spikyShielded) + return TRUE; + else if (gProtectStructs[battlerId].kingsShielded && gBattleMoves[move].power != 0) + return TRUE; + else if ((gProtectStructs[battlerId].quickGuarded || gProtectStructs[BATTLE_PARTNER(battlerId)].quickGuarded) + && gBattleMoves[move].priority > 0) + return TRUE; + else + return FALSE; +} + static void atk00_attackcanceler(void) { s32 i; @@ -1033,7 +1053,7 @@ static void atk00_attackcanceler(void) gBattlescriptCurrInstr = BattleScript_TookAttack; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } - else if (DEFENDER_IS_PROTECTED + else if (IsBattlerProtected(gBattlerTarget, gCurrentMove) && (gCurrentMove != MOVE_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)))) { @@ -1071,7 +1091,7 @@ static bool32 JumpIfMoveFailed(u8 adder, u16 move) static void atk40_jumpifaffectedbyprotect(void) { - if (DEFENDER_IS_PROTECTED) + if (IsBattlerProtected(gBattlerTarget, gCurrentMove)) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(5, 0); @@ -1086,7 +1106,7 @@ static void atk40_jumpifaffectedbyprotect(void) bool8 JumpIfMoveAffectedByProtect(u16 move) { bool8 affected = FALSE; - if (DEFENDER_IS_PROTECTED) + if (IsBattlerProtected(gBattlerTarget, move)) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(7, move); @@ -7051,10 +7071,9 @@ static void atk76_various(void) static void atk77_setprotectlike(void) // protect and endure { - bool8 notLastTurn = TRUE; - u16 lastMove = gLastResultingMoves[gBattlerAttacker]; + bool32 notLastTurn = TRUE; - if (lastMove != MOVE_PROTECT && lastMove != MOVE_DETECT && lastMove != MOVE_ENDURE) + if (gBattleMoves[gLastResultingMoves[gBattlerAttacker]].flags & FLAG_PROTECTION_MOVE) gDisableStructs[gBattlerAttacker].protectUses = 0; if (gCurrentTurnActionNumber == (gBattlersCount - 1)) @@ -7062,16 +7081,41 @@ static void atk77_setprotectlike(void) // protect and endure if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= Random() && notLastTurn) { - if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT) - { - gProtectStructs[gBattlerAttacker].protected = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) { gProtectStructs[gBattlerAttacker].endured = 1; gBattleCommunication[MULTISTRING_CHOOSER] = 1; } + else if (gCurrentMove == MOVE_DETECT || gCurrentMove == MOVE_PROTECT) + { + gProtectStructs[gBattlerAttacker].protected = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if (gCurrentMove == MOVE_SPIKY_SHIELD) + { + gProtectStructs[gBattlerAttacker].spikyShielded = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if (gCurrentMove == MOVE_KING_S_SHIELD) + { + gProtectStructs[gBattlerAttacker].kingsShielded = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if (gCurrentMove == MOVE_BANEFUL_BUNKER) + { + gProtectStructs[gBattlerAttacker].banefulBunkered = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if (gCurrentMove == MOVE_WIDE_GUARD) + { + gProtectStructs[gBattlerAttacker].wideGuarded = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + } + else if (gCurrentMove == MOVE_QUICK_GUARD) + { + gProtectStructs[gBattlerAttacker].quickGuarded = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + } gDisableStructs[gBattlerAttacker].protectUses++; } else @@ -8428,7 +8472,9 @@ static void atk9E_metronome(void) { s32 i; - gCurrentMove = (Random() % MOVES_COUNT) + 1; + gCurrentMove = (Random() % (MOVES_COUNT - 1)) + 1; + if (gBattleMoves[gCurrentMove].effect == EFFECT_PLACEHOLDER) + continue; i = -1; while (1) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index d4f00fbca..639e9c50b 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -2197,7 +2197,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_MACH_PUNCH @@ -2377,7 +2377,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_BONE_RUSH @@ -2449,7 +2449,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_CHARM @@ -5638,7 +5638,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_WIDE_GUARD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_ROCK, .accuracy = 0, @@ -5646,7 +5646,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_GUARD_SPLIT @@ -6022,7 +6022,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_QUICK_GUARD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_FIGHTING, .accuracy = 0, @@ -6030,7 +6030,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_ALLY_SWITCH @@ -6901,7 +6901,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_DISARMING_VOICE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_HIT, .power = 40, .type = TYPE_FAIRY, .accuracy = 0, @@ -6962,13 +6962,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_FLOWER_SHIELD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_FLOWER_SHIELD, .power = 0, .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_USER | MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -7070,7 +7070,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_KING_S_SHIELD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect, as it changes Aegislash's form + .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_STEEL, .accuracy = 0, @@ -7078,7 +7078,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, - .flags = FLAG_SNATCH_AFFECTED, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_PLAY_NICE @@ -7166,7 +7166,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_SPIKY_SHIELD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_GRASS, .accuracy = 0, @@ -7174,7 +7174,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_AROMATIC_MIST @@ -7395,7 +7395,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_THOUSAND_WAVES - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (not sure if this is like Mean Look lol, might be) + .effect = EFFECT_HIT_PREVENT_ESCAPE, .power = 90, .type = TYPE_GROUND, .accuracy = 100, @@ -7503,7 +7503,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_BANEFUL_BUNKER - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_POISON, .accuracy = 0, @@ -7511,11 +7511,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_SPIRIT_SHACKLE - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_HIT_PREVENT_ESCAPE, .power = 80, .type = TYPE_GHOST, .accuracy = 100, @@ -7540,7 +7540,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_SPARKLING_ARIA .effect = EFFECT_PLACEHOLDER, - .power = 00, + .power = 90, .type = TYPE_WATER, .accuracy = 100, .pp = 10, @@ -7695,7 +7695,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_ANCHOR_SHOT - .effect = EFFECT_MEAN_LOOK, + .effect = EFFECT_HIT_PREVENT_ESCAPE, .power = 80, .type = TYPE_STEEL, .accuracy = 100, @@ -7767,7 +7767,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_SPEED_SWAP - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_SPEED_SWAP, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -7779,7 +7779,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_SMART_STRIKE - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_STEEL, .accuracy = 0, @@ -8043,7 +8043,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_TEARFUL_LOOK - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_NOBLE_ROAR, .power = 0, .type = TYPE_NORMAL, .accuracy = 0,