diff --git a/Mage.Sets/src/mage/cards/p/PretendersClaim.java b/Mage.Sets/src/mage/cards/p/PretendersClaim.java new file mode 100644 index 0000000000..5d4a412658 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PretendersClaim.java @@ -0,0 +1,87 @@ +package mage.cards.p; + +import java.util.List; +import java.util.UUID; +import mage.constants.SubType; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.common.BecomesBlockedAttachedTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author jeffwadsworth + */ +public final class PretendersClaim extends CardImpl { + + public PretendersClaim(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Benefit)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Whenever enchanted creature becomes blocked, tap all lands defending player controls. + this.addAbility(new BecomesBlockedAttachedTriggeredAbility(new TapDefendingPlayerLandEffect(), false)); + + } + + private PretendersClaim(final PretendersClaim card) { + super(card); + } + + @Override + public PretendersClaim copy() { + return new PretendersClaim(this); + } +} + +class TapDefendingPlayerLandEffect extends OneShotEffect { + + public TapDefendingPlayerLandEffect() { + super(Outcome.Tap); + staticText = "tap all lands defending player controls"; + } + + public TapDefendingPlayerLandEffect(final TapDefendingPlayerLandEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent aura = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (aura != null + && aura.getAttachedTo() != null) { + Player defendingPlayer = game.getPlayer(game.getCombat().getDefendingPlayerId(aura.getAttachedTo(), game)); + if (defendingPlayer != null) { + List permanents = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_CONTROLLED_PERMANENT_LAND, defendingPlayer.getId(), game); + for (Permanent land : permanents) { + land.tap(game); + } + return true; + } + } + return false; + } + + @Override + public TapDefendingPlayerLandEffect copy() { + return new TapDefendingPlayerLandEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/UnnaturalHunger.java b/Mage.Sets/src/mage/cards/u/UnnaturalHunger.java new file mode 100644 index 0000000000..5ded11fe93 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnnaturalHunger.java @@ -0,0 +1,100 @@ +package mage.cards.u; + +import java.util.UUID; +import mage.constants.SubType; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.PermanentIdPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author jeffwadsworth + */ +public final class UnnaturalHunger extends CardImpl { + + public UnnaturalHunger(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // At the beginning of the upkeep of enchanted creature's controller, Unnatural Hunger deals damage to that player equal to that creature's power unless they sacrifice another creature. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new UnnaturalHungerEffect(), + TargetController.CONTROLLER_ATTACHED_TO, false)); + } + + private UnnaturalHunger(final UnnaturalHunger card) { + super(card); + } + + @Override + public UnnaturalHunger copy() { + return new UnnaturalHunger(this); + } +} + +class UnnaturalHungerEffect extends OneShotEffect { + + public UnnaturalHungerEffect() { + super(Outcome.Detriment); + this.staticText = "{this} deals damage to that player equal to that creature's power unless they sacrifice another creature"; + } + + private UnnaturalHungerEffect(UnnaturalHungerEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent aura = game.getPermanent(source.getSourceId()); + if (aura != null) { + Permanent attachedTo = game.getPermanent(aura.getAttachedTo()); + if (attachedTo != null) { + FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); + filter.add(Predicates.not(new PermanentIdPredicate(aura.getAttachedTo()))); // not attached permanent + Cost cost = new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter)); + Player enchantedCreatureController = game.getPlayer(attachedTo.getControllerId()); + if (enchantedCreatureController != null + && cost.canPay(source, source.getSourceId(), enchantedCreatureController.getId(), game) + && enchantedCreatureController.chooseUse(outcome, "Sacrifice another creature to prevent " + attachedTo.getPower().getValue() + " damage?", source, game) + && cost.pay(source, game, source.getSourceId(), enchantedCreatureController.getId(), true)) { + } + if (enchantedCreatureController != null + && !cost.isPaid()) { + enchantedCreatureController.damage(attachedTo.getPower().getValue(), source.getSourceId(), game); + } + return true; + } + } + return false; + } + + @Override + public UnnaturalHungerEffect copy() { + return new UnnaturalHungerEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/MercadianMasques.java b/Mage.Sets/src/mage/sets/MercadianMasques.java index 29b0ff53b5..866c8cb036 100644 --- a/Mage.Sets/src/mage/sets/MercadianMasques.java +++ b/Mage.Sets/src/mage/sets/MercadianMasques.java @@ -239,6 +239,7 @@ public final class MercadianMasques extends ExpansionSet { cards.add(new SetCardInfo("Plains", 334, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Port Inspector", 90, Rarity.COMMON, mage.cards.p.PortInspector.class)); cards.add(new SetCardInfo("Power Matrix", 309, Rarity.RARE, mage.cards.p.PowerMatrix.class)); + cards.add(new SetCardInfo("Pretender's Claim", 151, Rarity.UNCOMMON, mage.cards.p.PretendersClaim.class)); cards.add(new SetCardInfo("Primeval Shambler", 152, Rarity.UNCOMMON, mage.cards.p.PrimevalShambler.class)); cards.add(new SetCardInfo("Puffer Extract", 310, Rarity.UNCOMMON, mage.cards.p.PufferExtract.class)); cards.add(new SetCardInfo("Pulverize", 207, Rarity.RARE, mage.cards.p.Pulverize.class)); @@ -350,6 +351,7 @@ public final class MercadianMasques extends ExpansionSet { cards.add(new SetCardInfo("Two-Headed Dragon", 221, Rarity.RARE, mage.cards.t.TwoHeadedDragon.class)); cards.add(new SetCardInfo("Undertaker", 167, Rarity.COMMON, mage.cards.u.Undertaker.class)); cards.add(new SetCardInfo("Unmask", 168, Rarity.RARE, mage.cards.u.Unmask.class)); + cards.add(new SetCardInfo("Unnatural Hunger", 169, Rarity.RARE, mage.cards.u.UnnaturalHunger.class)); cards.add(new SetCardInfo("Uphill Battle", 222, Rarity.UNCOMMON, mage.cards.u.UphillBattle.class)); cards.add(new SetCardInfo("Vendetta", 170, Rarity.COMMON, mage.cards.v.Vendetta.class)); cards.add(new SetCardInfo("Venomous Breath", 281, Rarity.UNCOMMON, mage.cards.v.VenomousBreath.class)); diff --git a/Mage/src/main/java/mage/abilities/common/BecomesBlockedAttachedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BecomesBlockedAttachedTriggeredAbility.java index 4aa0aea4aa..bfaef45638 100644 --- a/Mage/src/main/java/mage/abilities/common/BecomesBlockedAttachedTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BecomesBlockedAttachedTriggeredAbility.java @@ -6,7 +6,6 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; -import mage.target.targetpointer.FixedTarget; /** * @@ -30,12 +29,11 @@ public class BecomesBlockedAttachedTriggeredAbility extends TriggeredAbilityImpl @Override public boolean checkTrigger(GameEvent event, Game game) { Permanent equipment = game.getPermanent(sourceId); - if (equipment != null && equipment.getAttachedTo() != null) { + if (equipment != null + && equipment.getAttachedTo() != null) { Permanent equipped = game.getPermanent(equipment.getAttachedTo()); - if (equipped.getId().equals(event.getTargetId())) { - getEffects().get(1).setTargetPointer(new FixedTarget(equipped, game)); - return true; - } + return (equipped != null + && equipped.getId().equals(event.getTargetId())); } return false; }