Implement optional Gen1 type immunity logic. (#3627)
* Implement optional Gen1 type immunity logic. * Add tests against Gen1 burn, freeze and paralysis. * !fixup Expand tests with Gen1 paths. * Fixup tests. Remove superflous defines. Explicitly ASSUME used move type and effect. * Fix flipped definitions on Freezing Glare test. --------- Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
This commit is contained in:
parent
72615a7c35
commit
f700466e8d
@ -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.)
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user