diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index f9063c5717..f77a0d9799 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -308,7 +308,6 @@ enum BattleMoveEffects EFFECT_BEAK_BLAST, EFFECT_COURT_CHANGE, EFFECT_MAX_HP_50_RECOIL, - EFFECT_MIND_BLOWN, // Same as EFFECT_MAX_HP_50_RECOIL but is cancelled by Damp EFFECT_CHLOROBLAST, // Same effect as EFFECT_MAX_HP_50_RECOIL but follows the same rules as EFFECT_RECOIL EFFECT_EXTREME_EVOBOOST, EFFECT_HIT_SET_REMOVE_TERRAIN, diff --git a/include/move.h b/include/move.h index 6fb342df63..b8c99257b2 100644 --- a/include/move.h +++ b/include/move.h @@ -131,9 +131,10 @@ struct MoveInfo bool32 parentalBondBanned:1; bool32 skyBattleBanned:1; bool32 sketchBanned:1; + bool32 dampBanned:1; //Other bool32 validApprenticeMove:1; - u32 padding:7; + u32 padding:6; // end of word union { @@ -474,6 +475,11 @@ static inline bool32 IsMoveSketchBanned(u32 moveId) return gMovesInfo[SanitizeMoveId(moveId)].sketchBanned; } +static inline bool32 IsMoveDampBanned(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].dampBanned; +} + static inline bool32 IsValidApprenticeMove(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].validApprenticeMove; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 7e3f3bfa6d..92292c1bcb 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2746,17 +2746,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - enum BattleMoveEffects instructedEffect = GetMoveEffect(instructedMove); if (GetBattlerMoveTargetType(battlerDef, instructedMove) & (MOVE_TARGET_SELECTED | MOVE_TARGET_DEPENDS | MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD) - && instructedEffect != EFFECT_MIND_BLOWN && instructedEffect != EFFECT_MAX_HP_50_RECOIL) + && GetMoveEffect(instructedMove) != EFFECT_MAX_HP_50_RECOIL) ADJUST_SCORE(-10); //Don't force the enemy to attack you again unless it can kill itself with Mind Blown - else if (instructedEffect != EFFECT_MIND_BLOWN) - ADJUST_SCORE(-5); //Do something better } } break; @@ -5496,7 +5493,6 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(AVERAGE_RISKY_EFFECT); break; case EFFECT_MAX_HP_50_RECOIL: - case EFFECT_MIND_BLOWN: case EFFECT_CHLOROBLAST: case EFFECT_SWAGGER: case EFFECT_FLATTER: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 091bd6ecf1..01dab74882 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -535,6 +535,9 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx) return TRUE; } + if (IsMoveDampBanned(ctx->move) && (battlerDefAbility == ABILITY_DAMP || partnerDefAbility == ABILITY_DAMP)) + return TRUE; + switch (GetMoveEffect(ctx->move)) { case EFFECT_DREAM_EATER: @@ -570,12 +573,6 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx) if (!gDisableStructs[ctx->battlerAtk].isFirstTurn) return TRUE; break; - case EFFECT_EXPLOSION: - case EFFECT_MISTY_EXPLOSION: - case EFFECT_MIND_BLOWN: - if (battlerDefAbility == ABILITY_DAMP || partnerDefAbility == ABILITY_DAMP) - return TRUE; - break; default: break; } @@ -1007,7 +1004,6 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s switch (GetMoveEffect(move)) { case EFFECT_MAX_HP_50_RECOIL: - case EFFECT_MIND_BLOWN: case EFFECT_CHLOROBLAST: case EFFECT_EXPLOSION: case EFFECT_MISTY_EXPLOSION: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a6b76ac213..b00f6801bd 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6982,7 +6982,6 @@ static void Cmd_moveend(void) effect = TRUE; break; case EFFECT_MAX_HP_50_RECOIL: - case EFFECT_MIND_BLOWN: if (IsBattlerAlive(gBattlerAttacker) && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) diff --git a/src/battle_util.c b/src/battle_util.c index 09c021cebb..029d1d4361 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2354,11 +2354,8 @@ static void CancellerPsychicTerrain(u32 *effect) static void CancellerExplodingDamp(u32 *effect) { - enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); - if (dampBattler && (moveEffect == EFFECT_EXPLOSION - || moveEffect == EFFECT_MISTY_EXPLOSION - || moveEffect == EFFECT_MIND_BLOWN)) + if (dampBattler && IsMoveDampBanned(gCurrentMove)) { gBattleScripting.battler = dampBattler - 1; gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 578444a380..685ea8447d 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1966,12 +1966,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_MIND_BLOWN] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_CHLOROBLAST] = { .battleScript = BattleScript_EffectHit, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 836b9e5466..532d4eb6bb 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -3221,6 +3221,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .parentalBondBanned = TRUE, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, @@ -4082,6 +4083,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .parentalBondBanned = TRUE, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, @@ -17135,7 +17137,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "It explodes the user's head\n" "to damage everything around."), - .effect = EFFECT_MIND_BLOWN, + .effect = EFFECT_MAX_HP_50_RECOIL, .power = 150, .type = TYPE_FIRE, .accuracy = 100, @@ -17144,6 +17146,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, @@ -18552,6 +18555,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, diff --git a/test/battle/move_effect/mind_blown.c b/test/battle/move_effects_combined/mind_blown.c similarity index 98% rename from test/battle/move_effect/mind_blown.c rename to test/battle/move_effects_combined/mind_blown.c index 0a34198777..79ce35d126 100644 --- a/test/battle/move_effect/mind_blown.c +++ b/test/battle/move_effects_combined/mind_blown.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_MIND_BLOWN) == EFFECT_MIND_BLOWN); + ASSUME(GetMoveEffect(MOVE_MIND_BLOWN) == EFFECT_MAX_HP_50_RECOIL); + ASSUME(IsMoveDampBanned(MOVE_MIND_BLOWN)); } SINGLE_BATTLE_TEST("Mind Blown makes the user lose 1/2 of its Max HP")