diff --git a/Mage.Sets/src/mage/cards/e/EscapedShapeshifter.java b/Mage.Sets/src/mage/cards/e/EscapedShapeshifter.java new file mode 100644 index 0000000000..93457726f3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EscapedShapeshifter.java @@ -0,0 +1,100 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.Collection; +import java.util.Objects; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EscapedShapeshifter extends CardImpl { + + public EscapedShapeshifter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); + + this.subtype.add(SubType.SHAPESHIFTER); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // As long as an opponent controls a creature with flying not named Escaped Shapeshifter, Escaped Shapeshifter has flying. The same is true for first strike, trample, and protection from any color. + this.addAbility(new SimpleStaticAbility(new EscapedShapeshifterEffect())); + } + + private EscapedShapeshifter(final EscapedShapeshifter card) { + super(card); + } + + @Override + public EscapedShapeshifter copy() { + return new EscapedShapeshifter(this); + } +} + +class EscapedShapeshifterEffect extends ContinuousEffectImpl { + + EscapedShapeshifterEffect() { + super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + this.addDependedToType(DependencyType.AddingAbility); + staticText = "As long as an opponent controls a creature with flying not named Escaped Shapeshifter, " + + "{this} has flying. The same is true for first strike, trample, and protection from any color."; + } + + private EscapedShapeshifterEffect(final EscapedShapeshifterEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (sourcePermanent == null) { + return false; + } + + game.getBattlefield() + .getActivePermanents( + StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, + source.getControllerId(), source.getSourceId(), game + ).stream() + .filter(Objects::nonNull) + .filter(permanent -> permanent.getName() != "Escaped Shapeshifter") + .map(Permanent::getAbilities) + .flatMap(Collection::stream).filter(EscapedShapeshifterEffect::checkAbility) + .forEach(ability -> sourcePermanent.addAbility(ability, source.getSourceId(), game)); + return true; + } + + private static boolean checkAbility(Ability ability) { + if (ability instanceof FlyingAbility + || ability instanceof FirstStrikeAbility + || ability instanceof TrampleAbility) { + return true; + } + return ability instanceof ProtectionAbility + && ((ProtectionAbility) ability) + .getFilter() + .getPredicates() + .stream() + .anyMatch(ColorPredicate.class::isInstance); + } + + @Override + public EscapedShapeshifterEffect copy() { + return new EscapedShapeshifterEffect(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Tempest.java b/Mage.Sets/src/mage/sets/Tempest.java index e1ec411d32..5e2ab52b91 100644 --- a/Mage.Sets/src/mage/sets/Tempest.java +++ b/Mage.Sets/src/mage/sets/Tempest.java @@ -112,6 +112,7 @@ public final class Tempest extends ExpansionSet { cards.add(new SetCardInfo("Energizer", 285, Rarity.RARE, mage.cards.e.Energizer.class)); cards.add(new SetCardInfo("Enfeeblement", 133, Rarity.COMMON, mage.cards.e.Enfeeblement.class)); cards.add(new SetCardInfo("Enraging Licid", 171, Rarity.UNCOMMON, mage.cards.e.EnragingLicid.class)); + cards.add(new SetCardInfo("Escaped Shapeshifter", 62, Rarity.RARE, mage.cards.e.EscapedShapeshifter.class)); cards.add(new SetCardInfo("Essence Bottle", 286, Rarity.UNCOMMON, mage.cards.e.EssenceBottle.class)); cards.add(new SetCardInfo("Evincar's Justice", 134, Rarity.COMMON, mage.cards.e.EvincarsJustice.class)); cards.add(new SetCardInfo("Excavator", 287, Rarity.UNCOMMON, mage.cards.e.Excavator.class));