diff --git a/src/data/ability.ts b/src/data/ability.ts index 2ac7d6be1..3e6e705e7 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2961,8 +2961,14 @@ export function initAbilities() { .ignorable() .unimplemented(), new Ability(Abilities.FLOWER_VEIL, 6) + .conditionalAttr(p => (p.isOfType(Type.GRASS)), StatusEffectImmunityAbAttr, StatusEffect.BURN) + .conditionalAttr(p => (p.isOfType(Type.GRASS)), StatusEffectImmunityAbAttr, StatusEffect.FREEZE) + .conditionalAttr(p => (p.isOfType(Type.GRASS)), StatusEffectImmunityAbAttr, StatusEffect.PARALYSIS) + .conditionalAttr(p => (p.isOfType(Type.GRASS)), StatusEffectImmunityAbAttr, StatusEffect.POISON) + .conditionalAttr(p => (p.isOfType(Type.GRASS)), StatusEffectImmunityAbAttr, StatusEffect.SLEEP) + .conditionalAttr(p => (p.isOfType(Type.GRASS)), StatusEffectImmunityAbAttr, StatusEffect.TOXIC) .ignorable() - .unimplemented(), + .partial(), new Ability(Abilities.CHEEK_POUCH, 6) .unimplemented(), new Ability(Abilities.PROTEAN, 6) @@ -3042,11 +3048,16 @@ export function initAbilities() { .attr(PostBattleInitFormChangeAbAttr, p => p.formIndex % 7 + (p.getHpRatio() <= 0.5 ? 7 : 0)) .attr(PostSummonFormChangeAbAttr, p => p.formIndex % 7 + (p.getHpRatio() <= 0.5 ? 7 : 0)) .attr(PostTurnFormChangeAbAttr, p => p.formIndex % 7 + (p.getHpRatio() <= 0.5 ? 7 : 0)) + .conditionalAttr(p => (p.formIndex < 7), StatusEffectImmunityAbAttr, StatusEffect.BURN) + .conditionalAttr(p => (p.formIndex < 7), StatusEffectImmunityAbAttr, StatusEffect.FREEZE) + .conditionalAttr(p => (p.formIndex < 7), StatusEffectImmunityAbAttr, StatusEffect.PARALYSIS) + .conditionalAttr(p => (p.formIndex < 7), StatusEffectImmunityAbAttr, StatusEffect.POISON) + .conditionalAttr(p => (p.formIndex < 7), StatusEffectImmunityAbAttr, StatusEffect.SLEEP) + .conditionalAttr(p => (p.formIndex < 7), StatusEffectImmunityAbAttr, StatusEffect.TOXIC) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr) - .attr(NoFusionAbilityAbAttr) - .partial(), + .attr(NoFusionAbilityAbAttr), new Ability(Abilities.STAKEOUT, 7) .attr(MovePowerBoostAbAttr, (user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.POKEMON, 2), new Ability(Abilities.WATER_BUBBLE, 7) @@ -3112,10 +3123,17 @@ export function initAbilities() { new Ability(Abilities.CORROSION, 7) .unimplemented(), new Ability(Abilities.COMATOSE, 7) + .attr(StatusEffectImmunityAbAttr, StatusEffect.BURN) + .attr(StatusEffectImmunityAbAttr, StatusEffect.FREEZE) + .attr(StatusEffectImmunityAbAttr, StatusEffect.PARALYSIS) + .attr(StatusEffectImmunityAbAttr, StatusEffect.POISON) + .attr(StatusEffectImmunityAbAttr, StatusEffect.SLEEP) + .attr(StatusEffectImmunityAbAttr, StatusEffect.TOXIC) + .attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.getMove().id == Moves.YAWN) + .attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon == attacker && move.getMove().id == Moves.REST) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(UnsuppressableAbilityAbAttr) - .unimplemented(), + .attr(UnsuppressableAbilityAbAttr), new Ability(Abilities.QUEENLY_MAJESTY, 7) .attr(FieldPriorityMoveImmunityAbAttr) .ignorable(), diff --git a/src/data/move.ts b/src/data/move.ts index 6ece04c70..4110d774a 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -4120,7 +4120,7 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new AttackMove(Moves.DREAM_EATER, Type.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 15, -1, 0, 1) .attr(HitHealAttr) - .condition((user, target, move) => target.status?.effect === StatusEffect.SLEEP) + .condition((user, target, move) => target.status?.effect === StatusEffect.SLEEP || target.hasAbility(Abilities.COMATOSE)) .triageMove(), new StatusMove(Moves.POISON_GAS, Type.POISON, 90, 40, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) @@ -4221,14 +4221,14 @@ export function initMoves() { .attr(IgnoreAccuracyAttr), new StatusMove(Moves.NIGHTMARE, Type.GHOST, 100, 15, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.NIGHTMARE) - .condition((user, target, move) => target.status?.effect === StatusEffect.SLEEP), + .condition((user, target, move) => target.status?.effect === StatusEffect.SLEEP || target.hasAbility(Abilities.COMATOSE)), new AttackMove(Moves.FLAME_WHEEL, Type.FIRE, MoveCategory.PHYSICAL, 60, 100, 25, 10, 0, 2) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN), new AttackMove(Moves.SNORE, Type.NORMAL, MoveCategory.SPECIAL, 50, 100, 15, 30, 0, 2) .attr(BypassSleepAttr) .attr(FlinchAttr) - .condition((user, target, move) => user.status?.effect === StatusEffect.SLEEP) + .condition((user, target, move) => user.status?.effect === StatusEffect.SLEEP || user.hasAbility(Abilities.COMATOSE)) .soundBased(), new StatusMove(Moves.CURSE, Type.GHOST, -1, 10, -1, 0, 2) .attr(StatChangeAttr, BattleStat.SPD, -1, true) @@ -4339,7 +4339,7 @@ export function initMoves() { new SelfStatusMove(Moves.SLEEP_TALK, Type.NORMAL, -1, 10, -1, 0, 2) .attr(BypassSleepAttr) .attr(RandomMovesetMoveAttr) - .condition((user, target, move) => user.status?.effect === StatusEffect.SLEEP) + .condition((user, target, move) => user.status?.effect === StatusEffect.SLEEP || user.hasAbility(Abilities.COMATOSE)) .ignoresVirtual(), new StatusMove(Moves.HEAL_BELL, Type.NORMAL, -1, 5, -1, 0, 2) .soundBased() @@ -4737,7 +4737,7 @@ export function initMoves() { new StatusMove(Moves.MIRACLE_EYE, Type.PSYCHIC, -1, 40, -1, 0, 4) .unimplemented(), new AttackMove(Moves.WAKE_UP_SLAP, Type.FIGHTING, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 4) - .attr(MovePowerMultiplierAttr, (user, target, move) => target.status?.effect === StatusEffect.SLEEP ? 2 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => target.status?.effect === StatusEffect.SLEEP || target.hasAbility(Abilities.COMATOSE) ? 2 : 1) .attr(HealStatusEffectAttr, false, StatusEffect.SLEEP), new AttackMove(Moves.HAMMER_ARM, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 90, 10, 100, 0, 4) .attr(StatChangeAttr, BattleStat.SPD, -1, true) @@ -5141,7 +5141,7 @@ export function initMoves() { .pulseMove() .triageMove(), new AttackMove(Moves.HEX, Type.GHOST, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) - .attr(MovePowerMultiplierAttr, (user, target, move) => target.status ? 2 : 1), + .attr(MovePowerMultiplierAttr, (user, target, move) => target.status || target.hasAbility(Abilities.COMATOSE) ? 2 : 1), new AttackMove(Moves.SKY_DROP, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) .attr(ChargeAttr, ChargeAnim.SKY_DROP_CHARGING, 'took {TARGET}\ninto the sky!', BattlerTagType.FLYING) // TODO: Add 2nd turn message .condition(failOnGravityCondition)