diff --git a/include/config/battle.h b/include/config/battle.h index fd390debf0ec..7e0f05a81947 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -46,6 +46,7 @@ #define B_PRANKSTER_DARK_TYPES GEN_LATEST // In Gen7+, Prankster-elevated status moves do not affect Dark type Pokémon. #define B_SHEER_COLD_IMMUNITY GEN_LATEST // In Gen7+, Ice-types are immune to Sheer Cold #define B_ROOST_PURE_FLYING GEN_LATEST // In Gen5+, Roost makes pure Flying-types into Normal-type. +#define B_STATUS_TYPE_IMMUNITY GEN_LATEST // In Gen1, Pokémon were immune to paralysis/freeze/burn side effects of attacking moves, if they shared a type with the move. // Turn settings #define B_BINDING_TURNS GEN_LATEST // In Gen5+, binding moves last for 4-5 turns instead of 2-5 turns. (With Grip Claw, 7 and 5 turns respectively.) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 34a3da0857d2..0272aa4108db 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2933,12 +2933,27 @@ void SetMoveEffect(bool32 primary, u32 certain) RESET_RETURN } + if (B_STATUS_TYPE_IMMUNITY == GEN_1) + { + u8 moveType = 0; + GET_MOVE_TYPE(gCurrentMove, moveType); + if (primary == FALSE && certain != MOVE_EFFECT_CERTAIN && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) + break; + } + if (!CanBeBurned(gEffectBattler)) break; statusChanged = TRUE; break; case STATUS1_FREEZE: + if (B_STATUS_TYPE_IMMUNITY == GEN_1) + { + u8 moveType = 0; + GET_MOVE_TYPE(gCurrentMove, moveType); + if (primary == FALSE && certain != MOVE_EFFECT_CERTAIN && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) + break; + } if (!CanBeFrozen(gEffectBattler)) break; @@ -2972,6 +2987,13 @@ void SetMoveEffect(bool32 primary, u32 certain) else break; } + if (B_STATUS_TYPE_IMMUNITY == GEN_1) + { + u8 moveType = 0; + GET_MOVE_TYPE(gCurrentMove, moveType); + if (primary == FALSE && certain != MOVE_EFFECT_CERTAIN && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) + break; + } if (!CanParalyzeType(gBattleScripting.battler, gEffectBattler) && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) @@ -3036,6 +3058,13 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case STATUS1_FROSTBITE: + if (B_STATUS_TYPE_IMMUNITY == GEN_1) + { + u8 moveType = 0; + GET_MOVE_TYPE(gCurrentMove, moveType); + if (primary == FALSE && certain != MOVE_EFFECT_CERTAIN && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) + break; + } if (!CanGetFrostbite(gEffectBattler)) break; diff --git a/test/battle/move_effect/burn_hit.c b/test/battle/move_effect/burn_hit.c index 627a051a53c5..5c5dfa3d6035 100644 --- a/test/battle/move_effect/burn_hit.c +++ b/test/battle/move_effect/burn_hit.c @@ -38,3 +38,32 @@ SINGLE_BATTLE_TEST("Ember cannot burn a Fire-type Pokémon") } } } + +#if B_STATUS_TYPE_IMMUNITY > GEN_1 +SINGLE_BATTLE_TEST("Scald should burn a Water-type Pokémon") +#else +SINGLE_BATTLE_TEST("Scald shouldn't burn a Water-type Pokémon") +#endif +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); + ASSUME(gBattleMoves[MOVE_SCALD].effect == EFFECT_BURN_HIT); + ASSUME(gBattleMoves[MOVE_SCALD].type == TYPE_WATER); + PLAYER(SPECIES_SQUIRTLE); + OPPONENT(SPECIES_SQUIRTLE); + } WHEN { + TURN { MOVE(player, MOVE_SCALD); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALD, player); + HP_BAR(opponent); + #if B_STATUS_TYPE_IMMUNITY > GEN_1 + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponent); + STATUS_ICON(opponent, burn: TRUE); + #else + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponent); + STATUS_ICON(opponent, burn: TRUE); + } + #endif + } +} diff --git a/test/battle/move_effect/freeze_hit.c b/test/battle/move_effect/freeze_hit.c index 4c9ff557e414..991acc5da6d0 100644 --- a/test/battle/move_effect/freeze_hit.c +++ b/test/battle/move_effect/freeze_hit.c @@ -66,3 +66,32 @@ SINGLE_BATTLE_TEST("Blizzard bypasses accuracy checks in Hail and Snow") NOT MESSAGE("Wobbuffet's attack missed!"); } } + +#if B_STATUS_TYPE_IMMUNITY > GEN_1 +SINGLE_BATTLE_TEST("Freezing Glare should freeze Psychic-types") +#else +SINGLE_BATTLE_TEST("Freezing Glare shouldn't freeze Psychic-types") +#endif +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_ARTICUNO_GALARIAN].types[0] == TYPE_PSYCHIC); + ASSUME(gBattleMoves[MOVE_FREEZING_GLARE].effect == EFFECT_FREEZE_HIT); + ASSUME(gBattleMoves[MOVE_FREEZING_GLARE].type == TYPE_PSYCHIC); + PLAYER(SPECIES_ARTICUNO_GALARIAN); + OPPONENT(SPECIES_ARTICUNO_GALARIAN); + } WHEN { + TURN { MOVE(player, MOVE_FREEZING_GLARE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FREEZING_GLARE, player); + HP_BAR(opponent); + #if B_STATUS_TYPE_IMMUNITY > GEN_1 + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + STATUS_ICON(opponent, freeze: TRUE); + #else + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + STATUS_ICON(opponent, freeze: TRUE); + } + #endif + } +} diff --git a/test/battle/move_effect/paralyze_hit.c b/test/battle/move_effect/paralyze_hit.c index c2fa440be144..24ae4bff9834 100644 --- a/test/battle/move_effect/paralyze_hit.c +++ b/test/battle/move_effect/paralyze_hit.c @@ -39,3 +39,32 @@ SINGLE_BATTLE_TEST("Thunder Shock cannot paralyze an Electric-type") } } } + +#if B_STATUS_TYPE_IMMUNITY > GEN_1 +SINGLE_BATTLE_TEST("Body Slam should paralyze Normal-types") +#else +SINGLE_BATTLE_TEST("Body Slam shouldn't paralyze Normal-types") +#endif +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_TAUROS].types[0] == TYPE_NORMAL); + ASSUME(gBattleMoves[MOVE_BODY_SLAM].effect == EFFECT_PARALYZE_HIT); + ASSUME(gBattleMoves[MOVE_BODY_SLAM].type == TYPE_NORMAL); + PLAYER(SPECIES_TAUROS); + OPPONENT(SPECIES_TAUROS); + } WHEN { + TURN { MOVE(player, MOVE_BODY_SLAM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BODY_SLAM, player); + HP_BAR(opponent); + #if B_STATUS_TYPE_IMMUNITY > GEN_1 + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent); + STATUS_ICON(opponent, paralysis: TRUE); + #else + NONE_OF { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent); + STATUS_ICON(opponent, paralysis: TRUE); + } + #endif + } +}