From 47f289fb3400cb551c47a7b93c29b215b7606c17 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 29 Jan 2021 09:23:42 -0500 Subject: [PATCH] [MIR] Implemented Unerring Sling (#7459) --- Mage.Sets/src/mage/cards/u/UnerringSling.java | 94 +++++++++++++++++++ Mage.Sets/src/mage/sets/Mirage.java | 1 + .../abilities/costs/common/TapTargetCost.java | 5 + 3 files changed, 100 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/u/UnerringSling.java diff --git a/Mage.Sets/src/mage/cards/u/UnerringSling.java b/Mage.Sets/src/mage/cards/u/UnerringSling.java new file mode 100644 index 00000000000..1133255b064 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnerringSling.java @@ -0,0 +1,94 @@ +package mage.cards.u; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.common.TapTargetCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterAttackingOrBlockingCreature; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledPermanent; + +import java.util.List; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class UnerringSling extends CardImpl { + + private static final FilterControlledPermanent filter + = new FilterControlledCreaturePermanent("untapped creature you control"); + private static final FilterPermanent filter2 + = new FilterAttackingOrBlockingCreature("attacking or blocking creature with flying"); + + static { + filter.add(Predicates.not(TappedPredicate.instance)); + filter2.add(new AbilityPredicate(FlyingAbility.class)); + } + + public UnerringSling(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); + + // {3}, {T}, Tap an untapped creature you control: Unerring Sling deals damage equal to the tapped creature's power to target attacking or blocking creature with flying. + Ability ability = new SimpleActivatedAbility(new UnerringSlingEffect(), new GenericManaCost(3)); + ability.addCost(new TapSourceCost()); + ability.addCost(new TapTargetCost(new TargetControlledPermanent(filter))); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + private UnerringSling(final UnerringSling card) { + super(card); + } + + @Override + public UnerringSling copy() { + return new UnerringSling(this); + } +} + +class UnerringSlingEffect extends OneShotEffect { + + UnerringSlingEffect() { + super(Outcome.Benefit); + staticText = "{this} deals damage equal to the tapped creature's power " + + "to target attacking or blocking creature with flying"; + } + + private UnerringSlingEffect(final UnerringSlingEffect effect) { + super(effect); + } + + @Override + public UnerringSlingEffect copy() { + return new UnerringSlingEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getFirstTarget()); + List permanents = (List) getValue("tappedPermanents"); + if (permanent == null + || permanents == null + || permanents.isEmpty() + || permanents.get(0) == null) { + return false; + } + return permanent.damage(permanents.get(0).getPower().getValue(), source.getSourceId(), source, game) > 0; + } +} diff --git a/Mage.Sets/src/mage/sets/Mirage.java b/Mage.Sets/src/mage/sets/Mirage.java index cd660e1d35b..9f99be49255 100644 --- a/Mage.Sets/src/mage/sets/Mirage.java +++ b/Mage.Sets/src/mage/sets/Mirage.java @@ -318,6 +318,7 @@ public final class Mirage extends ExpansionSet { cards.add(new SetCardInfo("Tropical Storm", 246, Rarity.UNCOMMON, mage.cards.t.TropicalStorm.class)); cards.add(new SetCardInfo("Uktabi Faerie", 247, Rarity.COMMON, mage.cards.u.UktabiFaerie.class)); cards.add(new SetCardInfo("Uktabi Wildcats", 248, Rarity.RARE, mage.cards.u.UktabiWildcats.class)); + cards.add(new SetCardInfo("Unerring Sling", 322, Rarity.UNCOMMON, mage.cards.u.UnerringSling.class)); cards.add(new SetCardInfo("Unfulfilled Desires", 285, Rarity.RARE, mage.cards.u.UnfulfilledDesires.class)); cards.add(new SetCardInfo("Unseen Walker", 249, Rarity.UNCOMMON, mage.cards.u.UnseenWalker.class)); cards.add(new SetCardInfo("Unyaro Bee Sting", 250, Rarity.UNCOMMON, mage.cards.u.UnyaroBeeSting.class)); diff --git a/Mage/src/main/java/mage/abilities/costs/common/TapTargetCost.java b/Mage/src/main/java/mage/abilities/costs/common/TapTargetCost.java index 90cec6d387e..dba40f06758 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/TapTargetCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/TapTargetCost.java @@ -9,6 +9,8 @@ import mage.game.permanent.Permanent; import mage.target.common.TargetControlledPermanent; import mage.util.CardUtil; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; /** @@ -36,6 +38,7 @@ public class TapTargetCost extends CostImpl { @Override public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) { + List permanents = new ArrayList<>(); if (target.choose(Outcome.Tap, controllerId, source.getSourceId(), game)) { for (UUID targetId : target.getTargets()) { Permanent permanent = game.getPermanent(targetId); @@ -43,8 +46,10 @@ public class TapTargetCost extends CostImpl { return false; } paid |= permanent.tap(source, game); + permanents.add(permanent); } } + source.getEffects().setValue("tappedPermanents", permanents); return paid; }