diff --git a/src/data/move.ts b/src/data/move.ts index df6f32427..b9a02fd7a 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1518,7 +1518,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { : null; } - getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getTagTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { switch (this.tagType) { case BattlerTagType.RECHARGING: return -16; @@ -1566,12 +1566,19 @@ export class AddBattlerTagAttr extends MoveEffectAttr { return 3; } } + + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + let chance = this.getTagChance(user, target, move); + if (chance < 0) + chance = 100; + return Math.floor(this.getTagTargetBenefitScore(user, target, move) * (chance / 100)); + } } export class LapseBattlerTagAttr extends MoveEffectAttr { public tagTypes: BattlerTagType[]; - constructor(tagTypes: BattlerTagType[], selfTarget?: boolean) { + constructor(tagTypes: BattlerTagType[], selfTarget: boolean = false) { super(selfTarget); this.tagTypes = tagTypes; @@ -1588,6 +1595,27 @@ export class LapseBattlerTagAttr extends MoveEffectAttr { } } + +export class RemoveBattlerTagAttr extends MoveEffectAttr { + public tagTypes: BattlerTagType[]; + + constructor(tagTypes: BattlerTagType[], selfTarget: boolean = false) { + super(selfTarget); + + this.tagTypes = tagTypes; + } + + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) + return false; + + for (let tagType of this.tagTypes) + (this.selfTarget ? user : target).removeTag(tagType); + + return true; + } +} + export class FlinchAttr extends AddBattlerTagAttr { constructor() { super(BattlerTagType.FLINCHED, false); @@ -3064,7 +3092,7 @@ export function initMoves() { new AttackMove(Moves.NATURAL_GIFT, "Natural Gift (N)", Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, "The user draws power to attack by using its held Berry. The Berry determines the move's type and power.", -1, 0, 4) .makesContact(false), new AttackMove(Moves.FEINT, "Feint", Type.NORMAL, MoveCategory.PHYSICAL, 30, 100, 10, -1, "This attack hits a target using a move such as Protect or Detect. This also lifts the effects of those moves.", -1, 2, 4) - .condition((user, target, move) => !!target.getTag(BattlerTagType.PROTECTED)) + .attr(RemoveBattlerTagAttr, [ BattlerTagType.PROTECTED ]) .makesContact(false) .ignoresProtect(), new AttackMove(Moves.PLUCK, "Pluck (N)", Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 20, -1, "The user pecks the target. If the target is holding a Berry, the user eats it and gains its effect.", -1, 0, 4), diff --git a/src/pokemon.ts b/src/pokemon.ts index 0eba28788..b6933c659 100644 --- a/src/pokemon.ts +++ b/src/pokemon.ts @@ -1262,6 +1262,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }); } + removeTag(tagType: BattlerTagType): boolean { + const tags = this.summonData.tags; + const tag = tags.find(t => t.tagType === tagType); + if (tag) { + tag.turnCount = 0; + tag.onRemove(this); + tags.splice(tags.indexOf(tag), 1); + } + return !!tag; + } + removeTagsBySourceId(sourceId: integer): void { const tags = this.summonData.tags; tags.filter(t => t.sourceId === sourceId).forEach(t => {