From 7532d1228be66f8771ac288663aa7eaa33c69533 Mon Sep 17 00:00:00 2001 From: Neil Gentleman Date: Sun, 16 Oct 2016 14:23:54 -0700 Subject: [PATCH] improve PutLandFromHandOntoBattlefieldEffect so that Elvish Pioneer and Terrain Generator can use it --- Mage.Sets/src/mage/cards/e/ElvishPioneer.java | 64 +------------------ .../src/mage/cards/k/KrosanWayfarer.java | 3 +- .../src/mage/cards/s/SkyshroudRanger.java | 4 +- .../src/mage/cards/t/TerrainGenerator.java | 51 +-------------- Mage.Sets/src/mage/cards/w/WalkingAtlas.java | 5 +- .../PutLandFromHandOntoBattlefieldEffect.java | 12 +++- .../mage/filter/common/FilterLandCard.java | 7 ++ 7 files changed, 27 insertions(+), 119 deletions(-) diff --git a/Mage.Sets/src/mage/cards/e/ElvishPioneer.java b/Mage.Sets/src/mage/cards/e/ElvishPioneer.java index 04326615808..77adf19b9af 100644 --- a/Mage.Sets/src/mage/cards/e/ElvishPioneer.java +++ b/Mage.Sets/src/mage/cards/e/ElvishPioneer.java @@ -29,24 +29,13 @@ package mage.cards.e; import java.util.UUID; +import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; import mage.constants.CardType; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.filter.predicate.mageobject.SupertypePredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetCardInHand; +import mage.filter.common.FilterLandCard; /** * @@ -63,7 +52,7 @@ public class ElvishPioneer extends CardImpl { this.toughness = new MageInt(1); // When Elvish Pioneer enters the battlefield, you may put a basic land card from your hand onto the battlefield tapped. - this.addAbility(new EntersBattlefieldTriggeredAbility(new PutLandOnBattlefieldEffect(), false)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new PutLandFromHandOntoBattlefieldEffect(true, FilterLandCard.basicLandCard()), false)); } public ElvishPioneer(final ElvishPioneer card) { @@ -75,50 +64,3 @@ public class ElvishPioneer extends CardImpl { return new ElvishPioneer(this); } } - -class PutLandOnBattlefieldEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCard("card other than a basic land card"); - - static { - filter.add(Predicates.and(new CardTypePredicate(CardType.LAND), new SupertypePredicate("Basic"))); - } - - private static final String choiceText = "Put a basic land card from your hand onto the battlefield?"; - - public PutLandOnBattlefieldEffect() { - super(Outcome.PutLandInPlay); - this.staticText = "put a basic land card from your hand onto the battlefield"; - } - - public PutLandOnBattlefieldEffect(final PutLandOnBattlefieldEffect effect) { - super(effect); - } - - @Override - public PutLandOnBattlefieldEffect copy() { - return new PutLandOnBattlefieldEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null || !player.chooseUse(Outcome.PutLandInPlay, choiceText, source, game)) { - return false; - } - - TargetCardInHand target = new TargetCardInHand(filter); - if (player.choose(Outcome.PutLandInPlay, target, source.getSourceId(), game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId()); - Permanent permanent = game.getPermanent(card.getId()); - if (permanent != null) { - permanent.setTapped(true); - } - return true; - } - } - return false; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/k/KrosanWayfarer.java b/Mage.Sets/src/mage/cards/k/KrosanWayfarer.java index d24f5f30071..514b76319ba 100644 --- a/Mage.Sets/src/mage/cards/k/KrosanWayfarer.java +++ b/Mage.Sets/src/mage/cards/k/KrosanWayfarer.java @@ -52,8 +52,7 @@ public class KrosanWayfarer extends CardImpl { this.toughness = new MageInt(1); // Sacrifice Krosan Wayfarer: You may put a land card from your hand onto the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new SacrificeSourceCost()); - this.addAbility(ability); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new SacrificeSourceCost())); } public KrosanWayfarer(final KrosanWayfarer card) { diff --git a/Mage.Sets/src/mage/cards/s/SkyshroudRanger.java b/Mage.Sets/src/mage/cards/s/SkyshroudRanger.java index e2aeaea23f5..338f5174500 100644 --- a/Mage.Sets/src/mage/cards/s/SkyshroudRanger.java +++ b/Mage.Sets/src/mage/cards/s/SkyshroudRanger.java @@ -54,9 +54,7 @@ public class SkyshroudRanger extends CardImpl { this.toughness = new MageInt(1); // {tap}: You may put a land card from your hand onto the battlefield. Activate this ability only any time you could cast a sorcery. - Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new TapSourceCost()); - ability.addTarget(new TargetCardInHand(0, 1, new FilterLandCard())); - this.addAbility(ability); + this.addAbility(new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new TapSourceCost())); } diff --git a/Mage.Sets/src/mage/cards/t/TerrainGenerator.java b/Mage.Sets/src/mage/cards/t/TerrainGenerator.java index f0568f060e4..69084a04be6 100644 --- a/Mage.Sets/src/mage/cards/t/TerrainGenerator.java +++ b/Mage.Sets/src/mage/cards/t/TerrainGenerator.java @@ -33,6 +33,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutLandFromHandOntoBattlefieldEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.Card; import mage.cards.CardImpl; @@ -41,6 +42,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterCard; +import mage.filter.common.FilterLandCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.SupertypePredicate; @@ -62,7 +64,7 @@ public class TerrainGenerator extends CardImpl { this.addAbility(new ColorlessManaAbility()); // {2}, {tap}: You may put a basic land card from your hand onto the battlefield tapped. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandOnBattlefieldEffect(), new ManaCostsImpl("{2}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(true, FilterLandCard.basicLandCard()), new ManaCostsImpl("{2}")); ability.addCost(new TapSourceCost()); this.addAbility(ability); } @@ -76,50 +78,3 @@ public class TerrainGenerator extends CardImpl { return new TerrainGenerator(this); } } - -class PutLandOnBattlefieldEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCard("card other than a basic land card"); - - static { - filter.add(Predicates.and(new CardTypePredicate(CardType.LAND), new SupertypePredicate("Basic"))); - } - - private static final String choiceText = "Put a basic land card from your hand onto the battlefield?"; - - public PutLandOnBattlefieldEffect() { - super(Outcome.PutLandInPlay); - this.staticText = "put a basic land card from your hand onto the battlefield"; - } - - public PutLandOnBattlefieldEffect(final PutLandOnBattlefieldEffect effect) { - super(effect); - } - - @Override - public PutLandOnBattlefieldEffect copy() { - return new PutLandOnBattlefieldEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null || !player.chooseUse(Outcome.PutLandInPlay, choiceText, source, game)) { - return false; - } - - TargetCardInHand target = new TargetCardInHand(filter); - if (player.choose(Outcome.PutLandInPlay, target, source.getSourceId(), game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId()); - Permanent permanent = game.getPermanent(card.getId()); - if (permanent != null) { - permanent.setTapped(true); - } - return true; - } - } - return false; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/w/WalkingAtlas.java b/Mage.Sets/src/mage/cards/w/WalkingAtlas.java index 4b87e8551c7..8e24c7fd032 100644 --- a/Mage.Sets/src/mage/cards/w/WalkingAtlas.java +++ b/Mage.Sets/src/mage/cards/w/WalkingAtlas.java @@ -52,10 +52,9 @@ public class WalkingAtlas extends CardImpl { this.subtype.add("Construct"); this.power = new MageInt(1); this.toughness = new MageInt(1); + // {tap}: You may put a land card from your hand onto the battlefield. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new TapSourceCost()); - ability.addTarget(new TargetCardInHand(new FilterLandCard())); - this.addAbility(ability); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLandFromHandOntoBattlefieldEffect(), new TapSourceCost())); } public WalkingAtlas (final WalkingAtlas card) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/PutLandFromHandOntoBattlefieldEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PutLandFromHandOntoBattlefieldEffect.java index 15893ba5be5..45edec3a94e 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PutLandFromHandOntoBattlefieldEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PutLandFromHandOntoBattlefieldEffect.java @@ -32,6 +32,7 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.constants.Outcome; import mage.constants.Zone; +import mage.filter.FilterCard; import mage.filter.common.FilterLandCard; import mage.game.Game; import mage.players.Player; @@ -44,6 +45,7 @@ import mage.target.common.TargetCardInHand; */ public class PutLandFromHandOntoBattlefieldEffect extends OneShotEffect { + private FilterCard filter; private boolean tapped; public PutLandFromHandOntoBattlefieldEffect() { @@ -51,21 +53,27 @@ public class PutLandFromHandOntoBattlefieldEffect extends OneShotEffect { } public PutLandFromHandOntoBattlefieldEffect(boolean tapped) { + this(tapped, new FilterLandCard()); + } + + public PutLandFromHandOntoBattlefieldEffect(boolean tapped, FilterCard filter) { super(Outcome.PutLandInPlay); this.tapped = tapped; - staticText = "you may put a land card from your hand onto the battlefield" + (tapped ? " tapped" : ""); + this.filter = filter; + staticText = "you may put a " + filter.getMessage() + " from your hand onto the battlefield" + (tapped ? " tapped" : ""); } public PutLandFromHandOntoBattlefieldEffect(final PutLandFromHandOntoBattlefieldEffect effect) { super(effect); this.tapped = effect.tapped; + this.filter = effect.filter; } @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - Target target = new TargetCardInHand(new FilterLandCard("land card")); + Target target = new TargetCardInHand(filter); if (target.canChoose(source.getSourceId(), source.getControllerId(), game) && controller.chooseUse(outcome, "Put land onto battlefield?", source, game) && controller.choose(outcome, target, source.getSourceId(), game)) { diff --git a/Mage/src/main/java/mage/filter/common/FilterLandCard.java b/Mage/src/main/java/mage/filter/common/FilterLandCard.java index b488debb58c..0d6525cc427 100644 --- a/Mage/src/main/java/mage/filter/common/FilterLandCard.java +++ b/Mage/src/main/java/mage/filter/common/FilterLandCard.java @@ -31,6 +31,7 @@ package mage.filter.common; import mage.constants.CardType; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.SupertypePredicate; /** * @@ -47,6 +48,12 @@ public class FilterLandCard extends FilterCard { this.add(new CardTypePredicate(CardType.LAND)); } + public static FilterLandCard basicLandCard() { + FilterLandCard filter = new FilterLandCard("basic land card"); + filter.add(new SupertypePredicate("Basic")); + return filter; + } + public FilterLandCard(final FilterLandCard filter) { super(filter); }