From 2969ba58be88fc299c851270f7ad85c9afe309ec Mon Sep 17 00:00:00 2001 From: xenohedron Date: Sat, 26 Oct 2024 16:20:31 -0400 Subject: [PATCH] refactors: common class for "return all xxx from your graveyard to the battlefield" (#13034) * refactor: new ReturnFromYourGraveyardToBattlefieldAllEffect * refactor: new ShuffleYourGraveyardIntoLibraryEffect also new PutIntoGraveFromLibrarySourceTriggeredAbility --- .../src/mage/cards/a/AftermathAnalyst.java | 35 +---------- .../src/mage/cards/a/AngelOfGlorysRise.java | 59 +++++------------- .../src/mage/cards/a/ArchangelElspeth.java | 43 +++---------- .../src/mage/cards/a/ArchangelsLight.java | 55 +++------------- .../mage/cards/b/BrilliantRestoration.java | 39 ++---------- .../src/mage/cards/c/CalixDestinysHand.java | 42 ++----------- Mage.Sets/src/mage/cards/c/Campfire.java | 7 +-- Mage.Sets/src/mage/cards/c/CreepingChill.java | 40 +++--------- .../src/mage/cards/d/DemigodOfRevenge.java | 51 +++------------ .../mage/cards/e/EnhancedSurveillance.java | 39 ++---------- Mage.Sets/src/mage/cards/f/FeldonsCane.java | 42 ++----------- Mage.Sets/src/mage/cards/g/GaeasBlessing.java | 59 +----------------- Mage.Sets/src/mage/cards/k/KnightsCharge.java | 46 +++----------- .../src/mage/cards/l/LilianaDeathWielder.java | 39 ++---------- .../mage/cards/l/LumraBellowOfTheWoods.java | 37 ++--------- Mage.Sets/src/mage/cards/n/Narcomoeba.java | 34 +++------- .../cards/p/PrimevalsGloriousRebirth.java | 53 ++++------------ Mage.Sets/src/mage/cards/r/RedressFate.java | 49 +++------------ Mage.Sets/src/mage/cards/r/Replenish.java | 45 +++----------- .../src/mage/cards/r/ResurgentBelief.java | 39 ++---------- .../cards/r/ReturnOfTheNightstalkers.java | 62 +++++-------------- .../src/mage/cards/s/SplendidReclamation.java | 45 ++------------ .../mage/cards/t/TheMendingOfDominaria.java | 51 +++------------ .../mage/cards/t/TitaniaGaeaIncarnate.java | 33 +--------- .../src/mage/cards/t/TriumphantReckoning.java | 55 ++++------------ Mage.Sets/src/mage/cards/w/WorldShaper.java | 44 ++----------- .../src/mage/cards/z/ZombieApocalypse.java | 60 ++++-------------- ...raveFromLibrarySourceTriggeredAbility.java | 27 ++++++++ .../effects/common/DestroyAllEffect.java | 11 +--- .../effects/common/ExileAllEffect.java | 7 +-- ...omYourGraveyardToBattlefieldAllEffect.java | 50 +++++++++++++++ ...ShuffleYourGraveyardIntoLibraryEffect.java | 34 ++++++++++ 32 files changed, 308 insertions(+), 1024 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/common/PutIntoGraveFromLibrarySourceTriggeredAbility.java create mode 100644 Mage/src/main/java/mage/abilities/effects/common/ReturnFromYourGraveyardToBattlefieldAllEffect.java create mode 100644 Mage/src/main/java/mage/abilities/effects/common/ShuffleYourGraveyardIntoLibraryEffect.java diff --git a/Mage.Sets/src/mage/cards/a/AftermathAnalyst.java b/Mage.Sets/src/mage/cards/a/AftermathAnalyst.java index 223a3a152d6..3a021ece9e2 100644 --- a/Mage.Sets/src/mage/cards/a/AftermathAnalyst.java +++ b/Mage.Sets/src/mage/cards/a/AftermathAnalyst.java @@ -6,17 +6,13 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.MillCardsControllerEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.StaticFilters; -import mage.game.Game; -import mage.players.Player; import java.util.UUID; @@ -37,7 +33,8 @@ public final class AftermathAnalyst extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new MillCardsControllerEffect(3))); // {3}{G}, Sacrifice Aftermath Analyst: Return all land cards from your graveyard to the battlefield tapped. - Ability ability = new SimpleActivatedAbility(new AftermathAnalystEffect(), new ManaCostsImpl<>("{3}{G}")); + Ability ability = new SimpleActivatedAbility(new ReturnFromYourGraveyardToBattlefieldAllEffect(StaticFilters.FILTER_CARD_LANDS, true), + new ManaCostsImpl<>("{3}{G}")); ability.addCost(new SacrificeSourceCost()); this.addAbility(ability); } @@ -51,29 +48,3 @@ public final class AftermathAnalyst extends CardImpl { return new AftermathAnalyst(this); } } - -class AftermathAnalystEffect extends OneShotEffect { - - AftermathAnalystEffect() { - super(Outcome.Benefit); - staticText = "return all land cards from your graveyard to the battlefield tapped"; - } - - private AftermathAnalystEffect(final AftermathAnalystEffect effect) { - super(effect); - } - - @Override - public AftermathAnalystEffect copy() { - return new AftermathAnalystEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - return player != null && player.moveCards( - player.getGraveyard().getCards(StaticFilters.FILTER_CARD_LAND, game), - Zone.BATTLEFIELD, source, game, true, false, false, null - ); - } -} diff --git a/Mage.Sets/src/mage/cards/a/AngelOfGlorysRise.java b/Mage.Sets/src/mage/cards/a/AngelOfGlorysRise.java index 26e67440a2a..92f3db594a4 100644 --- a/Mage.Sets/src/mage/cards/a/AngelOfGlorysRise.java +++ b/Mage.Sets/src/mage/cards/a/AngelOfGlorysRise.java @@ -1,32 +1,31 @@ - package mage.cards.a; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileAllEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.abilities.keyword.FlyingAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; +import mage.filter.FilterPermanent; import mage.filter.common.FilterCreatureCard; -import mage.filter.common.FilterCreaturePermanent; -import mage.game.Game; -import mage.players.Player; + +import java.util.UUID; /** - * - * @author jeffwadsworth + * @author xenohedron */ public final class AngelOfGlorysRise extends CardImpl { + private static final FilterPermanent filterZombie = new FilterPermanent(SubType.ZOMBIE , "Zombies"); + private static final FilterCreatureCard filterHuman = new FilterCreatureCard("Human creature cards"); + static { + filterHuman.add(SubType.HUMAN.getPredicate()); + } + public AngelOfGlorysRise(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}{W}"); this.subtype.add(SubType.ANGEL); @@ -37,7 +36,8 @@ public final class AngelOfGlorysRise extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Angel of Glory's Rise enters the battlefield, exile all Zombies, then return all Human creature cards from your graveyard to the battlefield. - EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new AngelOfGlorysRiseEffect()); + Ability ability = new EntersBattlefieldTriggeredAbility(new ExileAllEffect(filterZombie)); + ability.addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(filterHuman).concatBy(", then")); this.addAbility(ability); } @@ -50,34 +50,3 @@ public final class AngelOfGlorysRise extends CardImpl { return new AngelOfGlorysRise(this); } } - -class AngelOfGlorysRiseEffect extends OneShotEffect { - - AngelOfGlorysRiseEffect() { - super(Outcome.PutCreatureInPlay); - staticText = "exile all Zombies, then return all Human creature cards from your graveyard to the battlefield"; - } - - private AngelOfGlorysRiseEffect(final AngelOfGlorysRiseEffect effect) { - super(effect); - } - - @Override - public AngelOfGlorysRiseEffect copy() { - return new AngelOfGlorysRiseEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Set toExile = new HashSet<>(game.getBattlefield() - .getActivePermanents(new FilterCreaturePermanent(SubType.ZOMBIE, "Zombie"), source.getControllerId(), source, game)); - controller.moveCards(toExile, Zone.EXILED, source, game); - FilterCreatureCard filterHuman = new FilterCreatureCard(); - filterHuman.add(SubType.HUMAN.getPredicate()); - controller.moveCards(controller.getGraveyard().getCards(filterHuman, game), Zone.BATTLEFIELD, source, game); - } - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/a/ArchangelElspeth.java b/Mage.Sets/src/mage/cards/a/ArchangelElspeth.java index 5d6aa0eddff..4ab39d0dfb0 100644 --- a/Mage.Sets/src/mage/cards/a/ArchangelElspeth.java +++ b/Mage.Sets/src/mage/cards/a/ArchangelElspeth.java @@ -2,8 +2,8 @@ package mage.cards.a; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; @@ -16,9 +16,7 @@ import mage.filter.FilterCard; import mage.filter.common.FilterNonlandCard; import mage.filter.predicate.mageobject.ManaValuePredicate; import mage.filter.predicate.mageobject.PermanentPredicate; -import mage.game.Game; import mage.game.permanent.token.SoldierLifelinkToken; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -28,6 +26,13 @@ import java.util.UUID; */ public final class ArchangelElspeth extends CardImpl { + private static final FilterCard filter = new FilterNonlandCard("nonland permanent cards with mana value 3 or less"); + + static { + filter.add(PermanentPredicate.instance); + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4)); + } + public ArchangelElspeth(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{W}"); @@ -47,7 +52,7 @@ public final class ArchangelElspeth extends CardImpl { this.addAbility(ability); // -6: Return all nonland permanent cards with mana value 3 or less from your graveyard to the battlefield. - this.addAbility(new LoyaltyAbility(new ArchangelElspethEffect(), -6)); + this.addAbility(new LoyaltyAbility(new ReturnFromYourGraveyardToBattlefieldAllEffect(filter), -6)); } private ArchangelElspeth(final ArchangelElspeth card) { @@ -59,33 +64,3 @@ public final class ArchangelElspeth extends CardImpl { return new ArchangelElspeth(this); } } - -class ArchangelElspethEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterNonlandCard(); - - static { - filter.add(PermanentPredicate.instance); - filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4)); - } - - ArchangelElspethEffect() { - super(Outcome.Benefit); - staticText = "return all nonland permanent cards with mana value 3 or less from your graveyard to the battlefield"; - } - - private ArchangelElspethEffect(final ArchangelElspethEffect effect) { - super(effect); - } - - @Override - public ArchangelElspethEffect copy() { - return new ArchangelElspethEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - return player != null && player.moveCards(player.getGraveyard().getCards(filter, game), Zone.BATTLEFIELD, source, game); - } -} diff --git a/Mage.Sets/src/mage/cards/a/ArchangelsLight.java b/Mage.Sets/src/mage/cards/a/ArchangelsLight.java index 0c262f64236..091550abe2d 100644 --- a/Mage.Sets/src/mage/cards/a/ArchangelsLight.java +++ b/Mage.Sets/src/mage/cards/a/ArchangelsLight.java @@ -1,31 +1,29 @@ - package mage.cards.a; -import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.ShuffleYourGraveyardIntoLibraryEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; +import mage.filter.StaticFilters; + +import java.util.UUID; /** - * - * @author BetaSteward + * @author xenohedron */ public final class ArchangelsLight extends CardImpl { + private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD, 2); + public ArchangelsLight(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{7}{W}"); // You gain 2 life for each card in your graveyard, then shuffle your graveyard into your library. - this.getSpellAbility().addEffect(new ArchangelsLightEffect()); + this.getSpellAbility().addEffect(new GainLifeEffect(xValue, "you gain 2 life for each card in your graveyard")); + this.getSpellAbility().addEffect(new ShuffleYourGraveyardIntoLibraryEffect().concatBy(", then")); } @@ -38,36 +36,3 @@ public final class ArchangelsLight extends CardImpl { return new ArchangelsLight(this); } } - -class ArchangelsLightEffect extends OneShotEffect { - - ArchangelsLightEffect() { - super(Outcome.GainLife); - staticText = "You gain 2 life for each card in your graveyard, then shuffle your graveyard into your library"; - } - - private ArchangelsLightEffect(final ArchangelsLightEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - DynamicValue value = new CardsInControllerGraveyardCount(); - if (controller != null) { - controller.gainLife(value.calculate(game, source, this) * 2, game, source); - for (Card card: controller.getGraveyard().getCards(game)) { - controller.moveCardToLibraryWithInfo(card, source, game, Zone.GRAVEYARD, true, true); - } - controller.shuffleLibrary(source, game); - return true; - } - return false; - } - - @Override - public ArchangelsLightEffect copy() { - return new ArchangelsLightEffect(this); - } - -} diff --git a/Mage.Sets/src/mage/cards/b/BrilliantRestoration.java b/Mage.Sets/src/mage/cards/b/BrilliantRestoration.java index 91782aee45d..fd6dd228f27 100644 --- a/Mage.Sets/src/mage/cards/b/BrilliantRestoration.java +++ b/Mage.Sets/src/mage/cards/b/BrilliantRestoration.java @@ -1,16 +1,11 @@ package mage.cards.b; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.common.FilterArtifactOrEnchantmentCard; -import mage.game.Game; -import mage.players.Player; import java.util.UUID; @@ -19,11 +14,13 @@ import java.util.UUID; */ public final class BrilliantRestoration extends CardImpl { + private static final FilterCard filter = new FilterArtifactOrEnchantmentCard("artifact and enchantment cards"); + public BrilliantRestoration(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{W}{W}{W}{W}"); // Return all artifact and enchantment cards from your graveyard to the battlefield. - this.getSpellAbility().addEffect(new BrilliantRestorationEffect()); + this.getSpellAbility().addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(filter)); } private BrilliantRestoration(final BrilliantRestoration card) { @@ -35,31 +32,3 @@ public final class BrilliantRestoration extends CardImpl { return new BrilliantRestoration(this); } } - -class BrilliantRestorationEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterArtifactOrEnchantmentCard(); - - BrilliantRestorationEffect() { - super(Outcome.Benefit); - staticText = "return all artifact and enchantment cards from your graveyard to the battlefield"; - } - - private BrilliantRestorationEffect(final BrilliantRestorationEffect effect) { - super(effect); - } - - @Override - public BrilliantRestorationEffect copy() { - return new BrilliantRestorationEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { - return false; - } - return controller.moveCards(controller.getGraveyard().getCards(filter, game), Zone.BATTLEFIELD, source, game); - } -} diff --git a/Mage.Sets/src/mage/cards/c/CalixDestinysHand.java b/Mage.Sets/src/mage/cards/c/CalixDestinysHand.java index 648f0134504..1fa0cdcce47 100644 --- a/Mage.Sets/src/mage/cards/c/CalixDestinysHand.java +++ b/Mage.Sets/src/mage/cards/c/CalixDestinysHand.java @@ -4,9 +4,9 @@ import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; -import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.abilities.effects.common.ReturnToBattlefieldUnderOwnerControlTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -23,11 +23,9 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; import java.util.UUID; -import java.util.stream.Collectors; - -import mage.util.CardUtil; /** * @author TheElk801 @@ -47,6 +45,7 @@ public final class CalixDestinysHand extends CardImpl { } private static final FilterPermanent filter3 = new FilterControlledEnchantmentPermanent(); + private static final FilterCard filter4 = new FilterEnchantmentCard("enchantment cards"); public CalixDestinysHand(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{G}{W}"); @@ -71,7 +70,7 @@ public final class CalixDestinysHand extends CardImpl { this.addAbility(ability); // −7: Return all enchantment cards from your graveyard to the battlefield. - this.addAbility(new LoyaltyAbility(new CalixDestinysHandReturnEffect(), -7)); + this.addAbility(new LoyaltyAbility(new ReturnFromYourGraveyardToBattlefieldAllEffect(filter4), -7)); } private CalixDestinysHand(final CalixDestinysHand card) { @@ -167,36 +166,3 @@ class CalixDestinysHandDelayedTriggeredAbility extends DelayedTriggeredAbility { return new CalixDestinysHandDelayedTriggeredAbility(this); } } - -class CalixDestinysHandReturnEffect extends OneShotEffect { - - CalixDestinysHandReturnEffect() { - super(Outcome.Benefit); - staticText = "return all enchantment cards from your graveyard to the battlefield"; - } - - private CalixDestinysHandReturnEffect(final CalixDestinysHandReturnEffect effect) { - super(effect); - } - - @Override - public CalixDestinysHandReturnEffect copy() { - return new CalixDestinysHandReturnEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { - return false; - } - return player.moveCards( - player.getGraveyard() - .getCards(game) - .stream() - .filter(card -> card.isEnchantment(game)) - .collect(Collectors.toSet()), - Zone.BATTLEFIELD, source, game - ); - } -} diff --git a/Mage.Sets/src/mage/cards/c/Campfire.java b/Mage.Sets/src/mage/cards/c/Campfire.java index c221bebddf3..beca355edd3 100644 --- a/Mage.Sets/src/mage/cards/c/Campfire.java +++ b/Mage.Sets/src/mage/cards/c/Campfire.java @@ -7,6 +7,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.ShuffleYourGraveyardIntoLibraryEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; @@ -37,6 +38,7 @@ public final class Campfire extends CardImpl { // {2}, {T}: Exile Campfire: Put all commanders you own from the command zone and from your graveyard into your hand. Then shuffle your graveyard into your library. ability = new SimpleActivatedAbility(new CampfireEffect(), new GenericManaCost(2)); + ability.addEffect(new ShuffleYourGraveyardIntoLibraryEffect().concatBy("Then")); ability.addCost(new TapSourceCost()); ability.addCost(new ExileSourceCost()); this.addAbility(ability); @@ -62,8 +64,7 @@ class CampfireEffect extends OneShotEffect { CampfireEffect() { super(Outcome.Benefit); - staticText = "put all commanders you own from the command zone and from " + - "your graveyard into your hand. Then shuffle your graveyard into your library"; + staticText = "put all commanders you own from the command zone and from your graveyard into your hand"; } private CampfireEffect(final CampfireEffect effect) { @@ -84,8 +85,6 @@ class CampfireEffect extends OneShotEffect { Cards cards = new CardsImpl(game.getCommanderCardsFromCommandZone(player, CommanderCardType.ANY)); cards.addAllCards(player.getGraveyard().getCards(filter, game)); player.moveCards(cards, Zone.HAND, source, game); - player.putCardsOnBottomOfLibrary(player.getGraveyard(), game, source, false); - player.shuffleLibrary(source, game); return true; } } diff --git a/Mage.Sets/src/mage/cards/c/CreepingChill.java b/Mage.Sets/src/mage/cards/c/CreepingChill.java index 301def48f5f..c2a2d9662f3 100644 --- a/Mage.Sets/src/mage/cards/c/CreepingChill.java +++ b/Mage.Sets/src/mage/cards/c/CreepingChill.java @@ -1,6 +1,6 @@ package mage.cards.c; -import mage.abilities.common.ZoneChangeTriggeredAbility; +import mage.abilities.common.PutIntoGraveFromLibrarySourceTriggeredAbility; import mage.abilities.costs.common.ExileSourceFromGraveCost; import mage.abilities.effects.common.DamagePlayersEffect; import mage.abilities.effects.common.DoIfCostPaid; @@ -9,7 +9,6 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.TargetController; -import mage.constants.Zone; import java.util.UUID; @@ -30,7 +29,12 @@ public final class CreepingChill extends CardImpl { ); // When Creeping Chill is put into your graveyard from your library, you may exile it. If you do, Creeping Chill deals 3 damage to each opponent and you gain 3 life. - this.addAbility(new CreepingChillAbility()); + this.addAbility(new PutIntoGraveFromLibrarySourceTriggeredAbility( + new DoIfCostPaid( + new DamagePlayersEffect(3, TargetController.OPPONENT), + new ExileSourceFromGraveCost().setText("exile it") + ).addEffect(new GainLifeEffect(3).concatBy("and")) + )); } private CreepingChill(final CreepingChill card) { @@ -42,33 +46,3 @@ public final class CreepingChill extends CardImpl { return new CreepingChill(this); } } - -class CreepingChillAbility extends ZoneChangeTriggeredAbility { - - public CreepingChillAbility() { - super( - Zone.LIBRARY, Zone.GRAVEYARD, - new DoIfCostPaid( - new DamagePlayersEffect(3, TargetController.OPPONENT), - new ExileSourceFromGraveCost() - ).addEffect(new GainLifeEffect(3)), - "", false - ); - } - - private CreepingChillAbility(final CreepingChillAbility ability) { - super(ability); - } - - @Override - public CreepingChillAbility copy() { - return new CreepingChillAbility(this); - } - - @Override - public String getRule() { - return "When {this} is put into your graveyard from your library, " - + "you may exile it. If you do, {this} deals 3 damage " - + "to each opponent and you gain 3 life."; - } -} diff --git a/Mage.Sets/src/mage/cards/d/DemigodOfRevenge.java b/Mage.Sets/src/mage/cards/d/DemigodOfRevenge.java index 7bc87adc645..960880c481a 100644 --- a/Mage.Sets/src/mage/cards/d/DemigodOfRevenge.java +++ b/Mage.Sets/src/mage/cards/d/DemigodOfRevenge.java @@ -1,23 +1,18 @@ - package mage.cards.d; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CastSourceTriggeredAbility; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Outcome; -import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.NamePredicate; -import mage.game.Game; -import mage.players.Player; + +import java.util.UUID; /** * @@ -25,6 +20,12 @@ import mage.players.Player; */ public final class DemigodOfRevenge extends CardImpl { + private static final FilterCard filter = new FilterCard("cards named Demigod of Revenge"); + + static { + filter.add(new NamePredicate("Demigod of Revenge")); + } + public DemigodOfRevenge(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B/R}{B/R}{B/R}{B/R}{B/R}"); this.subtype.add(SubType.SPIRIT); @@ -40,7 +41,7 @@ public final class DemigodOfRevenge extends CardImpl { this.addAbility(HasteAbility.getInstance()); // When you cast Demigod of Revenge, return all cards named Demigod of Revenge from your graveyard to the battlefield. - this.addAbility(new CastSourceTriggeredAbility(new DemigodOfRevengeReturnEffect())); + this.addAbility(new CastSourceTriggeredAbility(new ReturnFromYourGraveyardToBattlefieldAllEffect(filter))); } private DemigodOfRevenge(final DemigodOfRevenge card) { @@ -52,35 +53,3 @@ public final class DemigodOfRevenge extends CardImpl { return new DemigodOfRevenge(this); } } - -class DemigodOfRevengeReturnEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCard(); - - static { - filter.add(new NamePredicate("Demigod of Revenge")); - } - - public DemigodOfRevengeReturnEffect() { - super(Outcome.PutCreatureInPlay); - staticText = "return all cards named Demigod of Revenge from your graveyard to the battlefield"; - } - - private DemigodOfRevengeReturnEffect(final DemigodOfRevengeReturnEffect effect) { - super(effect); - } - - @Override - public DemigodOfRevengeReturnEffect copy() { - return new DemigodOfRevengeReturnEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - return controller.moveCards(controller.getGraveyard().getCards(filter, game), Zone.BATTLEFIELD, source, game); - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/e/EnhancedSurveillance.java b/Mage.Sets/src/mage/cards/e/EnhancedSurveillance.java index 2710154f4f3..d303cc2ac85 100644 --- a/Mage.Sets/src/mage/cards/e/EnhancedSurveillance.java +++ b/Mage.Sets/src/mage/cards/e/EnhancedSurveillance.java @@ -1,13 +1,11 @@ package mage.cards.e; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.ExileSourceCost; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; -import mage.cards.Card; +import mage.abilities.effects.common.ShuffleYourGraveyardIntoLibraryEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -16,7 +14,8 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; -import mage.players.Player; + +import java.util.UUID; /** * @@ -34,7 +33,7 @@ public final class EnhancedSurveillance extends CardImpl { // Exile Enhanced Surveillance: Shuffle your graveyard into your library. this.addAbility(new SimpleActivatedAbility( - new EnhancedSurveillanceShuffleEffect(), new ExileSourceCost() + new ShuffleYourGraveyardIntoLibraryEffect(), new ExileSourceCost() )); } @@ -81,33 +80,3 @@ class EnhancedSurveillanceReplacementEffect extends ReplacementEffectImpl { return false; } } - -class EnhancedSurveillanceShuffleEffect extends OneShotEffect { - - EnhancedSurveillanceShuffleEffect() { - super(Outcome.Neutral); - this.staticText = "Shuffle your graveyard into your library"; - } - - private EnhancedSurveillanceShuffleEffect(final EnhancedSurveillanceShuffleEffect effect) { - super(effect); - } - - @Override - public EnhancedSurveillanceShuffleEffect copy() { - return new EnhancedSurveillanceShuffleEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - for (Card card : controller.getGraveyard().getCards(game)) { - controller.moveCardToLibraryWithInfo(card, source, game, Zone.GRAVEYARD, true, true); - } - controller.shuffleLibrary(source, game); - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/f/FeldonsCane.java b/Mage.Sets/src/mage/cards/f/FeldonsCane.java index 2cb5dc77372..702d3e1afba 100644 --- a/Mage.Sets/src/mage/cards/f/FeldonsCane.java +++ b/Mage.Sets/src/mage/cards/f/FeldonsCane.java @@ -1,20 +1,16 @@ - package mage.cards.f; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.ExileSourceCost; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.effects.common.ShuffleYourGraveyardIntoLibraryEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; + +import java.util.UUID; /** * @@ -26,7 +22,7 @@ public final class FeldonsCane extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); // {tap}, Exile Feldon's Cane: Shuffle your graveyard into your library. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new FeldonsCaneEffect(), new TapSourceCost()); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ShuffleYourGraveyardIntoLibraryEffect(), new TapSourceCost()); ability.addCost(new ExileSourceCost()); this.addAbility(ability); } @@ -40,33 +36,3 @@ public final class FeldonsCane extends CardImpl { return new FeldonsCane(this); } } - -class FeldonsCaneEffect extends OneShotEffect { - - FeldonsCaneEffect() { - super(Outcome.Neutral); - this.staticText = "Shuffle your graveyard into your library"; - } - - private FeldonsCaneEffect(final FeldonsCaneEffect effect) { - super(effect); - } - - @Override - public FeldonsCaneEffect copy() { - return new FeldonsCaneEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - for (Card card: controller.getGraveyard().getCards(game)) { - controller.moveCardToLibraryWithInfo(card, source, game, Zone.GRAVEYARD, true, true); - } - controller.shuffleLibrary(source, game); - return true; - } - return false; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/g/GaeasBlessing.java b/Mage.Sets/src/mage/cards/g/GaeasBlessing.java index ec9d7d9135f..f7d58c77d67 100644 --- a/Mage.Sets/src/mage/cards/g/GaeasBlessing.java +++ b/Mage.Sets/src/mage/cards/g/GaeasBlessing.java @@ -1,17 +1,12 @@ package mage.cards.g; -import mage.abilities.Ability; -import mage.abilities.common.ZoneChangeTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.PutIntoGraveFromLibrarySourceTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.ShuffleYourGraveyardIntoLibraryEffect; import mage.abilities.effects.common.TargetPlayerShufflesTargetCardsEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; import mage.target.TargetPlayer; import mage.target.common.TargetCardInTargetPlayersGraveyard; @@ -34,7 +29,7 @@ public final class GaeasBlessing extends CardImpl { this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
")); // When Gaea's Blessing is put into your graveyard from your library, shuffle your graveyard into your library. - this.addAbility(new GaeasBlessingTriggeredAbility()); + this.addAbility(new PutIntoGraveFromLibrarySourceTriggeredAbility(new ShuffleYourGraveyardIntoLibraryEffect())); } private GaeasBlessing(final GaeasBlessing card) { @@ -46,51 +41,3 @@ public final class GaeasBlessing extends CardImpl { return new GaeasBlessing(this); } } - -class GaeasBlessingTriggeredAbility extends ZoneChangeTriggeredAbility { - - GaeasBlessingTriggeredAbility() { - super(Zone.LIBRARY, Zone.GRAVEYARD, new GaeasBlessingGraveToLibraryEffect(), "", false); - } - - private GaeasBlessingTriggeredAbility(final GaeasBlessingTriggeredAbility ability) { - super(ability); - } - - @Override - public GaeasBlessingTriggeredAbility copy() { - return new GaeasBlessingTriggeredAbility(this); - } - - @Override - public String getRule() { - return "When {this} is put into your graveyard from your library, shuffle your graveyard into your library."; - } -} - -class GaeasBlessingGraveToLibraryEffect extends OneShotEffect { - - GaeasBlessingGraveToLibraryEffect() { - super(Outcome.GainLife); - staticText = "shuffle your graveyard into your library"; - } - - private GaeasBlessingGraveToLibraryEffect(final GaeasBlessingGraveToLibraryEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - return controller.shuffleCardsToLibrary(controller.getGraveyard(), game, source); - } - return false; - } - - @Override - public GaeasBlessingGraveToLibraryEffect copy() { - return new GaeasBlessingGraveToLibraryEffect(this); - } - -} diff --git a/Mage.Sets/src/mage/cards/k/KnightsCharge.java b/Mage.Sets/src/mage/cards/k/KnightsCharge.java index 64f0cd6ac7e..824e77aa8da 100644 --- a/Mage.Sets/src/mage/cards/k/KnightsCharge.java +++ b/Mage.Sets/src/mage/cards/k/KnightsCharge.java @@ -5,22 +5,17 @@ import mage.abilities.common.AttacksCreatureYouControlTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.game.Game; -import mage.players.Player; +import mage.filter.common.FilterCreatureCard; import java.util.UUID; -import java.util.stream.Collectors; /** * @author TheElk801 @@ -30,6 +25,11 @@ public final class KnightsCharge extends CardImpl { private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(SubType.KNIGHT); + private static final FilterCreatureCard filter2 = new FilterCreatureCard("Knight creature cards"); + static { + filter2.add(SubType.KNIGHT.getPredicate()); + } + public KnightsCharge(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{B}"); @@ -41,7 +41,7 @@ public final class KnightsCharge extends CardImpl { this.addAbility(ability); // {6}{W}{B}, Sacrifice Knights' Charge: Return all Knight creature cards from your graveyard to the battlefield. - ability = new SimpleActivatedAbility(new KnightsChargeEffect(), new ManaCostsImpl<>("{6}{W}{B}")); + ability = new SimpleActivatedAbility(new ReturnFromYourGraveyardToBattlefieldAllEffect(filter2), new ManaCostsImpl<>("{6}{W}{B}")); ability.addCost(new SacrificeSourceCost()); this.addAbility(ability); } @@ -55,33 +55,3 @@ public final class KnightsCharge extends CardImpl { return new KnightsCharge(this); } } - -class KnightsChargeEffect extends OneShotEffect { - - KnightsChargeEffect() { - super(Outcome.Benefit); - staticText = "return all Knight creature cards from your graveyard to the battlefield"; - } - - private KnightsChargeEffect(final KnightsChargeEffect effect) { - super(effect); - } - - @Override - public KnightsChargeEffect copy() { - return new KnightsChargeEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - return player != null && player.moveCards(new CardsImpl( - player.getGraveyard() - .getCards(game) - .stream() - .filter(card1 -> card1.isCreature(game)) - .filter(card -> card.hasSubtype(SubType.KNIGHT, game)) - .collect(Collectors.toSet()) - ), Zone.BATTLEFIELD, source, game); - } -} diff --git a/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java b/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java index 7567a70c6aa..e5a56b63e23 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java +++ b/Mage.Sets/src/mage/cards/l/LilianaDeathWielder.java @@ -1,26 +1,21 @@ - package mage.cards.l; -import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Outcome; import mage.constants.SuperType; -import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; -import mage.game.Game; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * * @author fireshoes @@ -51,7 +46,7 @@ public final class LilianaDeathWielder extends CardImpl { this.addAbility(ability); // -10: Return all creature cards from your graveyard to the battlefield. - this.addAbility(new LoyaltyAbility(new LilianaDeathWielderEffect(), -10)); + this.addAbility(new LoyaltyAbility(new ReturnFromYourGraveyardToBattlefieldAllEffect(StaticFilters.FILTER_CARD_CREATURES), -10)); } private LilianaDeathWielder(final LilianaDeathWielder card) { @@ -63,29 +58,3 @@ public final class LilianaDeathWielder extends CardImpl { return new LilianaDeathWielder(this); } } - -class LilianaDeathWielderEffect extends OneShotEffect { - - LilianaDeathWielderEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "Return all creature cards from your graveyard to the battlefield"; - } - - private LilianaDeathWielderEffect(final LilianaDeathWielderEffect effect) { - super(effect); - } - - @Override - public LilianaDeathWielderEffect copy() { - return new LilianaDeathWielderEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - controller.moveCards(controller.getGraveyard().getCards(StaticFilters.FILTER_CARD_CREATURE, game), Zone.BATTLEFIELD, source, game); - } - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/l/LumraBellowOfTheWoods.java b/Mage.Sets/src/mage/cards/l/LumraBellowOfTheWoods.java index 32992983b9b..1fea3a09ada 100644 --- a/Mage.Sets/src/mage/cards/l/LumraBellowOfTheWoods.java +++ b/Mage.Sets/src/mage/cards/l/LumraBellowOfTheWoods.java @@ -5,17 +5,18 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.common.LandsYouControlCount; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.MillCardsControllerEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect; import mage.abilities.keyword.ReachAbility; import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.Zone; import mage.filter.StaticFilters; -import mage.game.Game; -import mage.players.Player; import java.util.UUID; @@ -46,7 +47,7 @@ public final class LumraBellowOfTheWoods extends CardImpl { // When Lumra enters, mill four cards. Then return all land cards from your graveyard to the battlefield tapped. Ability ability = new EntersBattlefieldTriggeredAbility(new MillCardsControllerEffect(4)); - ability.addEffect(new LumraBellowOfTheWoodsEffect()); + ability.addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(StaticFilters.FILTER_CARD_LANDS, true).concatBy("Then")); this.addAbility(ability); } @@ -59,29 +60,3 @@ public final class LumraBellowOfTheWoods extends CardImpl { return new LumraBellowOfTheWoods(this); } } - -class LumraBellowOfTheWoodsEffect extends OneShotEffect { - - LumraBellowOfTheWoodsEffect() { - super(Outcome.Benefit); - staticText = "Then return all land cards from your graveyard to the battlefield tapped"; - } - - private LumraBellowOfTheWoodsEffect(final LumraBellowOfTheWoodsEffect effect) { - super(effect); - } - - @Override - public LumraBellowOfTheWoodsEffect copy() { - return new LumraBellowOfTheWoodsEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - return player != null && player.moveCards( - player.getGraveyard().getCards(StaticFilters.FILTER_CARD_LAND, game), - Zone.BATTLEFIELD, source, game, true, false, false, null - ); - } -} diff --git a/Mage.Sets/src/mage/cards/n/Narcomoeba.java b/Mage.Sets/src/mage/cards/n/Narcomoeba.java index 3cc48354e1a..676996d40f6 100644 --- a/Mage.Sets/src/mage/cards/n/Narcomoeba.java +++ b/Mage.Sets/src/mage/cards/n/Narcomoeba.java @@ -1,16 +1,15 @@ - package mage.cards.n; -import java.util.UUID; import mage.MageInt; -import mage.abilities.common.ZoneChangeTriggeredAbility; +import mage.abilities.common.PutIntoGraveFromLibrarySourceTriggeredAbility; import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; + +import java.util.UUID; /** * @@ -27,8 +26,11 @@ public final class Narcomoeba extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); + // When Narcomoeba is put into your graveyard from your library, you may put it onto the battlefield. - this.addAbility(new NarcomoebaAbility()); + this.addAbility(new PutIntoGraveFromLibrarySourceTriggeredAbility( + new ReturnSourceFromGraveyardToBattlefieldEffect().setText("put it onto the battlefield"), true + )); } private Narcomoeba(final Narcomoeba card) { @@ -40,25 +42,3 @@ public final class Narcomoeba extends CardImpl { return new Narcomoeba(this); } } - - -class NarcomoebaAbility extends ZoneChangeTriggeredAbility { - public NarcomoebaAbility() { - super(Zone.LIBRARY, Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(), "", true); - } - - private NarcomoebaAbility(final NarcomoebaAbility ability) { - super(ability); - } - - @Override - public NarcomoebaAbility copy() { - return new NarcomoebaAbility(this); - } - - - @Override - public String getRule() { - return "When {this} is put into your graveyard from your library, you may put it onto the battlefield."; - } -} diff --git a/Mage.Sets/src/mage/cards/p/PrimevalsGloriousRebirth.java b/Mage.Sets/src/mage/cards/p/PrimevalsGloriousRebirth.java index be13242e3bd..c41a7c8fa05 100644 --- a/Mage.Sets/src/mage/cards/p/PrimevalsGloriousRebirth.java +++ b/Mage.Sets/src/mage/cards/p/PrimevalsGloriousRebirth.java @@ -1,22 +1,26 @@ package mage.cards.p; -import java.util.UUID; - -import mage.abilities.Ability; import mage.abilities.common.LegendarySpellAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.SuperType; import mage.filter.common.FilterPermanentCard; -import mage.game.Game; -import mage.players.Player; + +import java.util.UUID; /** * @author JRHerlehy Created on 4/8/18. */ public final class PrimevalsGloriousRebirth extends CardImpl { + private static final FilterPermanentCard filter = new FilterPermanentCard("legendary permanent cards"); + + static { + filter.add(SuperType.LEGENDARY.getPredicate()); + } + public PrimevalsGloriousRebirth(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{5}{W}{B}"); this.supertype.add(SuperType.LEGENDARY); @@ -25,7 +29,7 @@ public final class PrimevalsGloriousRebirth extends CardImpl { this.addAbility(new LegendarySpellAbility()); // Return all legendary permanent cards from your graveyard to the battlefield. - this.getSpellAbility().addEffect(new PrimevalsGloriousRebirthEffect()); + this.getSpellAbility().addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(filter)); } private PrimevalsGloriousRebirth(final PrimevalsGloriousRebirth card) { @@ -38,36 +42,3 @@ public final class PrimevalsGloriousRebirth extends CardImpl { } } - -class PrimevalsGloriousRebirthEffect extends OneShotEffect { - - private static final FilterPermanentCard filter = new FilterPermanentCard(); - - static { - filter.add(SuperType.LEGENDARY.getPredicate()); - } - - public PrimevalsGloriousRebirthEffect() { - super(Outcome.Benefit); - this.staticText = "Return all legendary permanent cards from your graveyard to the battlefield"; - } - - private PrimevalsGloriousRebirthEffect(final PrimevalsGloriousRebirthEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - controller.moveCards(controller.getGraveyard().getCards(filter, game), Zone.BATTLEFIELD, source, game); - return true; - } - return false; - } - - @Override - public PrimevalsGloriousRebirthEffect copy() { - return new PrimevalsGloriousRebirthEffect(this); - } -} diff --git a/Mage.Sets/src/mage/cards/r/RedressFate.java b/Mage.Sets/src/mage/cards/r/RedressFate.java index c399b0def19..bede1d5f0da 100644 --- a/Mage.Sets/src/mage/cards/r/RedressFate.java +++ b/Mage.Sets/src/mage/cards/r/RedressFate.java @@ -1,32 +1,27 @@ package mage.cards.r; -import java.util.UUID; - -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.abilities.keyword.MiracleAbility; -import mage.filter.FilterCard; -import mage.filter.common.FilterArtifactOrEnchantmentCard; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; +import mage.filter.FilterCard; +import mage.filter.common.FilterArtifactOrEnchantmentCard; + +import java.util.UUID; /** - * * @author RobertFrosty */ public final class RedressFate extends CardImpl { + private static final FilterCard filter = new FilterArtifactOrEnchantmentCard("artifact and enchantment cards"); + public RedressFate(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{6}{W}{W}"); - // Return all artifact and enchantment cards from your graveyard to the battlefield. - this.getSpellAbility().addEffect(new RedressFateEffect()); + this.getSpellAbility().addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(filter)); // Miracle {3}{W} this.addAbility(new MiracleAbility("{3}{W}")); @@ -42,31 +37,3 @@ public final class RedressFate extends CardImpl { return new RedressFate(this); } } - -class RedressFateEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterArtifactOrEnchantmentCard(); - - RedressFateEffect() { - super(Outcome.Benefit); - staticText = "return all artifact and enchantment cards from your graveyard to the battlefield"; - } - - private RedressFateEffect(final RedressFateEffect effect) { - super(effect); - } - - @Override - public RedressFateEffect copy() { - return new RedressFateEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller == null) { - return false; - } - return controller.moveCards(controller.getGraveyard().getCards(filter, game), Zone.BATTLEFIELD, source, game); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/r/Replenish.java b/Mage.Sets/src/mage/cards/r/Replenish.java index c7de892be87..e897a642618 100644 --- a/Mage.Sets/src/mage/cards/r/Replenish.java +++ b/Mage.Sets/src/mage/cards/r/Replenish.java @@ -1,29 +1,25 @@ - package mage.cards.r; -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Zone; import mage.filter.common.FilterEnchantmentCard; -import mage.game.Game; -import mage.players.Player; + +import java.util.UUID; /** - * - * @author emerald000 + * @author xenohedron */ public final class Replenish extends CardImpl { + private static final FilterEnchantmentCard filter = new FilterEnchantmentCard("enchantment cards"); + public Replenish(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{W}"); // Return all enchantment cards from your graveyard to the battlefield. - this.getSpellAbility().addEffect(new ReplenishEffect()); + this.getSpellAbility().addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(filter)); } private Replenish(final Replenish card) { @@ -35,30 +31,3 @@ public final class Replenish extends CardImpl { return new Replenish(this); } } - -class ReplenishEffect extends OneShotEffect { - - ReplenishEffect() { - super(Outcome.PutCardInPlay); - this.staticText = "Return all enchantment cards from your graveyard to the battlefield"; - } - - private ReplenishEffect(final ReplenishEffect effect) { - super(effect); - } - - @Override - public ReplenishEffect copy() { - return new ReplenishEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - return controller.moveCards(controller.getGraveyard().getCards(new FilterEnchantmentCard(), - source.getControllerId(), source, game), Zone.BATTLEFIELD, source, game); - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/r/ResurgentBelief.java b/Mage.Sets/src/mage/cards/r/ResurgentBelief.java index d553855a2b5..5c3523f8193 100644 --- a/Mage.Sets/src/mage/cards/r/ResurgentBelief.java +++ b/Mage.Sets/src/mage/cards/r/ResurgentBelief.java @@ -1,18 +1,12 @@ package mage.cards.r; -import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.abilities.keyword.SuspendAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.FilterCard; import mage.filter.common.FilterEnchantmentCard; -import mage.game.Game; -import mage.players.Player; import java.util.UUID; @@ -21,6 +15,8 @@ import java.util.UUID; */ public final class ResurgentBelief extends CardImpl { + private static final FilterEnchantmentCard filter = new FilterEnchantmentCard("enchantment cards"); + public ResurgentBelief(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, ""); @@ -30,7 +26,7 @@ public final class ResurgentBelief extends CardImpl { this.addAbility(new SuspendAbility(2, new ManaCostsImpl<>("{1}{W}"), this)); // Return all enchantment cards from your graveyard to the battlefield. - this.getSpellAbility().addEffect(new ResurgentBeliefEffect()); + this.getSpellAbility().addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(filter)); } private ResurgentBelief(final ResurgentBelief card) { @@ -42,30 +38,3 @@ public final class ResurgentBelief extends CardImpl { return new ResurgentBelief(this); } } - -class ResurgentBeliefEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterEnchantmentCard(); - - ResurgentBeliefEffect() { - super(Outcome.Benefit); - staticText = "return all enchantment cards from your graveyard to the battlefield"; - } - - private ResurgentBeliefEffect(final ResurgentBeliefEffect effect) { - super(effect); - } - - @Override - public ResurgentBeliefEffect copy() { - return new ResurgentBeliefEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - return player != null && player.moveCards( - player.getGraveyard().getCards(filter, game), Zone.BATTLEFIELD, source, game - ); - } -} diff --git a/Mage.Sets/src/mage/cards/r/ReturnOfTheNightstalkers.java b/Mage.Sets/src/mage/cards/r/ReturnOfTheNightstalkers.java index 63de8e7666d..ae9e1b96812 100644 --- a/Mage.Sets/src/mage/cards/r/ReturnOfTheNightstalkers.java +++ b/Mage.Sets/src/mage/cards/r/ReturnOfTheNightstalkers.java @@ -1,20 +1,15 @@ - package mage.cards.r; -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterPermanentCard; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; + +import java.util.UUID; /** * @@ -22,11 +17,20 @@ import mage.players.Player; */ public final class ReturnOfTheNightstalkers extends CardImpl { + private static final FilterPermanentCard filter1 = new FilterPermanentCard("Nightstalker permanent cards"); + private static final FilterControlledPermanent filter2 = new FilterControlledPermanent("Swamps you control"); + + static { + filter1.add(SubType.NIGHTSTALKER.getPredicate()); + filter2.add(SubType.SWAMP.getPredicate()); + } + public ReturnOfTheNightstalkers(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{5}{B}{B}"); // Return all Nightstalker permanent cards from your graveyard to the battlefield. Then destroy all Swamps you control. - this.getSpellAbility().addEffect(new ReturnOfTheNightstalkersEffect()); + this.getSpellAbility().addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(filter1)); + this.getSpellAbility().addEffect(new DestroyAllEffect(filter2).concatBy("Then")); } private ReturnOfTheNightstalkers(final ReturnOfTheNightstalkers card) { @@ -38,41 +42,3 @@ public final class ReturnOfTheNightstalkers extends CardImpl { return new ReturnOfTheNightstalkers(this); } } - -class ReturnOfTheNightstalkersEffect extends OneShotEffect { - - private static final FilterPermanentCard filter1 = new FilterPermanentCard(); - private static final FilterControlledPermanent filter2 = new FilterControlledPermanent(); - - static { - filter1.add(SubType.NIGHTSTALKER.getPredicate()); - filter2.add(SubType.SWAMP.getPredicate()); - } - - public ReturnOfTheNightstalkersEffect() { - super(Outcome.PutCreatureInPlay); - staticText = "Return all Nightstalker permanent cards from your graveyard to the battlefield. Then destroy all Swamps you control"; - } - - private ReturnOfTheNightstalkersEffect(final ReturnOfTheNightstalkersEffect effect) { - super(effect); - } - - @Override - public ReturnOfTheNightstalkersEffect copy() { - return new ReturnOfTheNightstalkersEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - controller.moveCards(controller.getGraveyard().getCards(filter1, game), Zone.BATTLEFIELD, source, game); - for (Permanent permanent : game.getBattlefield().getActivePermanents(filter2, source.getControllerId(), source, game)) { - permanent.destroy(source, game, false); - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/s/SplendidReclamation.java b/Mage.Sets/src/mage/cards/s/SplendidReclamation.java index 66387bf4944..2cf04a55dd2 100644 --- a/Mage.Sets/src/mage/cards/s/SplendidReclamation.java +++ b/Mage.Sets/src/mage/cards/s/SplendidReclamation.java @@ -1,21 +1,15 @@ - package mage.cards.s; -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.common.FilterLandCard; -import mage.game.Game; -import mage.players.Player; +import mage.filter.StaticFilters; + +import java.util.UUID; /** - * - * @author fireshoes + * @author xenohedron */ public final class SplendidReclamation extends CardImpl { @@ -23,7 +17,7 @@ public final class SplendidReclamation extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{G}"); // Return all land cards from your graveyard to the battlefield tapped. - this.getSpellAbility().addEffect(new ReplenishEffect()); + this.getSpellAbility().addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(StaticFilters.FILTER_CARD_LANDS, true)); } private SplendidReclamation(final SplendidReclamation card) { @@ -35,30 +29,3 @@ public final class SplendidReclamation extends CardImpl { return new SplendidReclamation(this); } } - -class ReplenishEffect extends OneShotEffect { - - ReplenishEffect() { - super(Outcome.PutCardInPlay); - this.staticText = "Return all land cards from your graveyard to the battlefield tapped"; - } - - private ReplenishEffect(final ReplenishEffect effect) { - super(effect); - } - - @Override - public ReplenishEffect copy() { - return new ReplenishEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - return controller.moveCards(controller.getGraveyard().getCards(new FilterLandCard(), - source.getControllerId(), source, game), Zone.BATTLEFIELD, source, game, true, false, false, null); - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/t/TheMendingOfDominaria.java b/Mage.Sets/src/mage/cards/t/TheMendingOfDominaria.java index 5ed53b86e44..79f7b629e1c 100644 --- a/Mage.Sets/src/mage/cards/t/TheMendingOfDominaria.java +++ b/Mage.Sets/src/mage/cards/t/TheMendingOfDominaria.java @@ -1,25 +1,22 @@ - package mage.cards.t; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SagaAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.MillCardsControllerEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; +import mage.abilities.effects.common.ShuffleYourGraveyardIntoLibraryEffect; import mage.cards.Card; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SagaChapter; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.StaticFilters; -import mage.filter.common.FilterLandCard; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; +import java.util.UUID; + /** * * @author TheElk801 @@ -38,7 +35,10 @@ public final class TheMendingOfDominaria extends CardImpl { sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, new TheMendingOfDominariaFirstEffect()); // III — Return all land cards from your graveyard to the battlefield, then shuffle your graveyard into your library. - sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new TheMendingOfDominariaSecondEffect()); + sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, + new ReturnFromYourGraveyardToBattlefieldAllEffect(StaticFilters.FILTER_CARD_LANDS), + new ShuffleYourGraveyardIntoLibraryEffect().concatBy(", then") + ); this.addAbility(sagaAbility); } @@ -88,36 +88,3 @@ class TheMendingOfDominariaFirstEffect extends OneShotEffect { return true; } } - -class TheMendingOfDominariaSecondEffect extends OneShotEffect { - - TheMendingOfDominariaSecondEffect() { - super(Outcome.PutCardInPlay); - this.staticText = "Return all land cards from your graveyard to the battlefield, then shuffle your graveyard into your library"; - } - - private TheMendingOfDominariaSecondEffect(final TheMendingOfDominariaSecondEffect effect) { - super(effect); - } - - @Override - public TheMendingOfDominariaSecondEffect copy() { - return new TheMendingOfDominariaSecondEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - controller.moveCards( - controller.getGraveyard().getCards(new FilterLandCard(), source.getControllerId(), source, game), - Zone.BATTLEFIELD, source, game, false, false, false, null - ); - for (Card card : controller.getGraveyard().getCards(game)) { - controller.moveCardToLibraryWithInfo(card, source, game, Zone.GRAVEYARD, true, true); - } - controller.shuffleLibrary(source, game); - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/t/TitaniaGaeaIncarnate.java b/Mage.Sets/src/mage/cards/t/TitaniaGaeaIncarnate.java index c96a5da30a4..b9ecc7cfcf8 100644 --- a/Mage.Sets/src/mage/cards/t/TitaniaGaeaIncarnate.java +++ b/Mage.Sets/src/mage/cards/t/TitaniaGaeaIncarnate.java @@ -7,7 +7,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.dynamicvalue.common.LandsYouControlCount; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect; import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; @@ -20,9 +20,7 @@ import mage.cards.MeldCard; import mage.constants.*; import mage.counters.CounterType; import mage.filter.StaticFilters; -import mage.game.Game; import mage.game.permanent.token.custom.CreatureToken; -import mage.players.Player; import mage.target.TargetPermanent; import java.util.UUID; @@ -60,7 +58,8 @@ public final class TitaniaGaeaIncarnate extends MeldCard { )); // When Titania, Gaea Incarnate enters the battlefield, return all land cards from your graveyard to the battlefield tapped. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TitaniaGaeaIncarnateEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new ReturnFromYourGraveyardToBattlefieldAllEffect( + StaticFilters.FILTER_CARD_LANDS, true))); // {3}{G}: Put four +1/+1 counters on target land you control. It becomes a 0/0 Elemental creature with haste. It's still a land. Ability ability = new SimpleActivatedAbility( @@ -84,29 +83,3 @@ public final class TitaniaGaeaIncarnate extends MeldCard { return new TitaniaGaeaIncarnate(this); } } - -class TitaniaGaeaIncarnateEffect extends OneShotEffect { - - TitaniaGaeaIncarnateEffect() { - super(Outcome.Benefit); - staticText = "return all land cards from your graveyard to the battlefield tapped"; - } - - private TitaniaGaeaIncarnateEffect(final TitaniaGaeaIncarnateEffect effect) { - super(effect); - } - - @Override - public TitaniaGaeaIncarnateEffect copy() { - return new TitaniaGaeaIncarnateEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - return player != null && player.moveCards( - player.getGraveyard().getCards(StaticFilters.FILTER_CARD_LAND, game), - Zone.BATTLEFIELD, source, game, true, false, false, null - ); - } -} diff --git a/Mage.Sets/src/mage/cards/t/TriumphantReckoning.java b/Mage.Sets/src/mage/cards/t/TriumphantReckoning.java index 5e48f95a659..ecb57a52efa 100644 --- a/Mage.Sets/src/mage/cards/t/TriumphantReckoning.java +++ b/Mage.Sets/src/mage/cards/t/TriumphantReckoning.java @@ -1,16 +1,11 @@ package mage.cards.t; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.Predicates; -import mage.game.Game; -import mage.players.Player; import java.util.UUID; @@ -19,11 +14,21 @@ import java.util.UUID; */ public final class TriumphantReckoning extends CardImpl { + private static final FilterCard filter = new FilterCard("artifact, enchantment, and planeswalker cards"); + + static { + filter.add(Predicates.or( + CardType.ARTIFACT.getPredicate(), + CardType.ENCHANTMENT.getPredicate(), + CardType.PLANESWALKER.getPredicate() + )); + } + public TriumphantReckoning(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{6}{W}{W}{W}"); // Return all artifact, enchantment, and planeswalker cards from your graveyard to the battlefield. - this.getSpellAbility().addEffect(new TriumphantReckoningEffect()); + this.getSpellAbility().addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(filter)); } private TriumphantReckoning(final TriumphantReckoning card) { @@ -35,39 +40,3 @@ public final class TriumphantReckoning extends CardImpl { return new TriumphantReckoning(this); } } - -class TriumphantReckoningEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCard(); - - static { - filter.add(Predicates.or( - CardType.ARTIFACT.getPredicate(), - CardType.ENCHANTMENT.getPredicate(), - CardType.PLANESWALKER.getPredicate() - )); - } - - TriumphantReckoningEffect() { - super(Outcome.Benefit); - staticText = "return all artifact, enchantment, and planeswalker cards from your graveyard to the battlefield"; - } - - private TriumphantReckoningEffect(final TriumphantReckoningEffect effect) { - super(effect); - } - - @Override - public TriumphantReckoningEffect copy() { - return new TriumphantReckoningEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - return player != null && player.moveCards( - player.getGraveyard().getCards(filter, game), Zone.BATTLEFIELD, source, game - ); - } -} -// on your left diff --git a/Mage.Sets/src/mage/cards/w/WorldShaper.java b/Mage.Sets/src/mage/cards/w/WorldShaper.java index f0ceae68271..7bb7364e4d0 100644 --- a/Mage.Sets/src/mage/cards/w/WorldShaper.java +++ b/Mage.Sets/src/mage/cards/w/WorldShaper.java @@ -1,22 +1,17 @@ - package mage.cards.w; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.DiesSourceTriggeredAbility; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.MillCardsControllerEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.StaticFilters; -import mage.game.Game; -import mage.players.Player; + +import java.util.UUID; /** * @@ -35,8 +30,9 @@ public final class WorldShaper extends CardImpl { // Whenever World Shaper attacks, you may put the top three cards of your library into your graveyard. this.addAbility(new AttacksTriggeredAbility(new MillCardsControllerEffect(3), true)); - // When World Shaper dies, put all land cards from your graveyard onto the battlefield tapped. - this.addAbility(new DiesSourceTriggeredAbility(new WorldShaperEffect(), false)); + // When World Shaper dies, return all land cards from your graveyard to the battlefield tapped. + this.addAbility(new DiesSourceTriggeredAbility(new ReturnFromYourGraveyardToBattlefieldAllEffect( + StaticFilters.FILTER_CARD_LANDS, true))); } private WorldShaper(final WorldShaper card) { @@ -48,31 +44,3 @@ public final class WorldShaper extends CardImpl { return new WorldShaper(this); } } - -class WorldShaperEffect extends OneShotEffect { - - WorldShaperEffect() { - super(Outcome.PutLandInPlay); - this.staticText = "return all land cards from your graveyard to the battlefield tapped"; - } - - private WorldShaperEffect(final WorldShaperEffect effect) { - super(effect); - } - - @Override - public WorldShaperEffect copy() { - return new WorldShaperEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - controller.moveCards(controller.getGraveyard().getCards(StaticFilters.FILTER_CARD_LAND, game), - Zone.BATTLEFIELD, source, game, true, false, false, null); // owner param should play no role here - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/z/ZombieApocalypse.java b/Mage.Sets/src/mage/cards/z/ZombieApocalypse.java index 9c5b018e62a..d8c6d939a33 100644 --- a/Mage.Sets/src/mage/cards/z/ZombieApocalypse.java +++ b/Mage.Sets/src/mage/cards/z/ZombieApocalypse.java @@ -1,20 +1,15 @@ - package mage.cards.z; -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreatureCard; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; + +import java.util.UUID; /** * @@ -22,11 +17,18 @@ import mage.players.Player; */ public final class ZombieApocalypse extends CardImpl { + private static final FilterCreatureCard filterZombie = new FilterCreatureCard("Zombie creature cards"); + private static final FilterPermanent filterHuman = new FilterPermanent(SubType.HUMAN, "Humans"); + static { + filterZombie.add(SubType.ZOMBIE.getPredicate()); + } + public ZombieApocalypse(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}{B}{B}"); // Return all Zombie creature cards from your graveyard to the battlefield tapped, then destroy all Humans. - this.getSpellAbility().addEffect(new ZombieApocalypseEffect()); + this.getSpellAbility().addEffect(new ReturnFromYourGraveyardToBattlefieldAllEffect(filterZombie, true)); + this.getSpellAbility().addEffect(new DestroyAllEffect(filterHuman).concatBy(", then")); } private ZombieApocalypse(final ZombieApocalypse card) { @@ -38,41 +40,3 @@ public final class ZombieApocalypse extends CardImpl { return new ZombieApocalypse(this); } } - -class ZombieApocalypseEffect extends OneShotEffect { - - private static final FilterCreatureCard filterZombie = new FilterCreatureCard(); - - static { - filterZombie.add(SubType.ZOMBIE.getPredicate()); - } - - public ZombieApocalypseEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "Return all Zombie creature cards from your graveyard to the battlefield tapped, then destroy all Humans."; - } - - private ZombieApocalypseEffect(final ZombieApocalypseEffect effect) { - super(effect); - } - - @Override - public ZombieApocalypseEffect copy() { - return new ZombieApocalypseEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - controller.moveCards(controller.getGraveyard().getCards(filterZombie, game), Zone.BATTLEFIELD, source, game, true, false, false, null); - game.processAction(); - for (Permanent permanent : game.getBattlefield().getActivePermanents( - new FilterPermanent(SubType.HUMAN, "Humans"), source.getControllerId(), game)) { - permanent.destroy(source, game, false); - } - return true; - } - return false; - } -} diff --git a/Mage/src/main/java/mage/abilities/common/PutIntoGraveFromLibrarySourceTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/PutIntoGraveFromLibrarySourceTriggeredAbility.java new file mode 100644 index 00000000000..22d6e67dd0a --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/PutIntoGraveFromLibrarySourceTriggeredAbility.java @@ -0,0 +1,27 @@ +package mage.abilities.common; + +import mage.abilities.effects.Effect; +import mage.constants.Zone; + +/** + * @author xenohedron + */ +public class PutIntoGraveFromLibrarySourceTriggeredAbility extends ZoneChangeTriggeredAbility { + + public PutIntoGraveFromLibrarySourceTriggeredAbility(Effect effect) { + this(effect, false); + } + + public PutIntoGraveFromLibrarySourceTriggeredAbility(Effect effect, boolean optional) { + super(Zone.LIBRARY, Zone.GRAVEYARD, effect, "When {this} is put into your graveyard from your library, ", optional); + } + + protected PutIntoGraveFromLibrarySourceTriggeredAbility(final PutIntoGraveFromLibrarySourceTriggeredAbility ability) { + super(ability); + } + + @Override + public PutIntoGraveFromLibrarySourceTriggeredAbility copy() { + return new PutIntoGraveFromLibrarySourceTriggeredAbility(this); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/DestroyAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DestroyAllEffect.java index 84b00fc22ee..b0965e43d97 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DestroyAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DestroyAllEffect.java @@ -1,4 +1,3 @@ - package mage.abilities.effects.common; import mage.abilities.Ability; @@ -13,8 +12,8 @@ import mage.game.permanent.Permanent; */ public class DestroyAllEffect extends OneShotEffect { - private FilterPermanent filter; - private boolean noRegen; + private final FilterPermanent filter; + private final boolean noRegen; public DestroyAllEffect(FilterPermanent filter) { this(filter, false); @@ -24,11 +23,7 @@ public class DestroyAllEffect extends OneShotEffect { super(Outcome.DestroyPermanent); this.filter = filter; this.noRegen = noRegen; - if (noRegen) { - staticText = "destroy all " + filter.getMessage() + ". They can't be regenerated"; - } else { - staticText = "destroy all " + filter.getMessage(); - } + this.staticText = "destroy all " + filter.getMessage() + (noRegen ? ". They can't be regenerated" : ""); } protected DestroyAllEffect(final DestroyAllEffect effect) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/ExileAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ExileAllEffect.java index de5ad9d1ae2..149b626a314 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ExileAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ExileAllEffect.java @@ -27,7 +27,7 @@ public class ExileAllEffect extends OneShotEffect { super(Outcome.Exile); this.filter = filter; this.forSource = forSource; - setText(); + this.staticText = "exile all " + filter.getMessage(); } protected ExileAllEffect(final ExileAllEffect effect) { @@ -58,9 +58,4 @@ public class ExileAllEffect extends OneShotEffect { } - private void setText() { - StringBuilder sb = new StringBuilder(); - sb.append("exile all ").append(filter.getMessage()); - staticText = sb.toString(); - } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnFromYourGraveyardToBattlefieldAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromYourGraveyardToBattlefieldAllEffect.java new file mode 100644 index 00000000000..00ef15e7766 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromYourGraveyardToBattlefieldAllEffect.java @@ -0,0 +1,50 @@ +package mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.players.Player; + +/** + * @author xenohedron + */ +public class ReturnFromYourGraveyardToBattlefieldAllEffect extends OneShotEffect { + + private final FilterCard filter; + private final boolean tapped; + + public ReturnFromYourGraveyardToBattlefieldAllEffect(FilterCard filter) { + this(filter, false); + } + + public ReturnFromYourGraveyardToBattlefieldAllEffect(FilterCard filter, boolean tapped) { + super(Outcome.PutCardInPlay); + this.filter = filter; + this.tapped = tapped; + staticText = "return all " + filter.getMessage() + " from your graveyard to the battlefield" + (tapped ? " tapped" : ""); + } + + protected ReturnFromYourGraveyardToBattlefieldAllEffect(final ReturnFromYourGraveyardToBattlefieldAllEffect effect) { + super(effect); + this.filter = effect.filter; + this.tapped = effect.tapped; + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + return controller.moveCards(controller.getGraveyard().getCards(filter, source.getControllerId(), source, game), + Zone.BATTLEFIELD, source, game, tapped, false, false, null); + } + + @Override + public ReturnFromYourGraveyardToBattlefieldAllEffect copy() { + return new ReturnFromYourGraveyardToBattlefieldAllEffect(this); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/ShuffleYourGraveyardIntoLibraryEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ShuffleYourGraveyardIntoLibraryEffect.java new file mode 100644 index 00000000000..5698c096eae --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/ShuffleYourGraveyardIntoLibraryEffect.java @@ -0,0 +1,34 @@ +package mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.game.Game; +import mage.players.Player; + +/** + * @author xenohedron + */ +public class ShuffleYourGraveyardIntoLibraryEffect extends OneShotEffect { + + public ShuffleYourGraveyardIntoLibraryEffect() { + super(Outcome.Neutral); + this.staticText = "shuffle your graveyard into your library"; + } + + protected ShuffleYourGraveyardIntoLibraryEffect(final ShuffleYourGraveyardIntoLibraryEffect effect) { + super(effect); + } + + @Override + public ShuffleYourGraveyardIntoLibraryEffect copy() { + return new ShuffleYourGraveyardIntoLibraryEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + return controller != null && controller.shuffleCardsToLibrary(controller.getGraveyard(), game, source); + } + +}