From b658d60bfd64b43347db7aa67d086419a41bf223 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sun, 10 Apr 2022 09:52:12 -0400 Subject: [PATCH] [SNC] Implemented Graveyard Shift --- .../src/mage/cards/g/GraveyardShift.java | 50 +++++++++++++++ .../src/mage/cards/s/SnoopingNewsie.java | 62 ++----------------- .../src/mage/sets/StreetsOfNewCapenna.java | 1 + .../DifferentManaValuesInGraveCondition.java | 38 ++++++++++++ .../DifferentManaValuesInGraveHint.java | 40 ++++++++++++ 5 files changed, 135 insertions(+), 56 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/g/GraveyardShift.java create mode 100644 Mage/src/main/java/mage/abilities/condition/common/DifferentManaValuesInGraveCondition.java create mode 100644 Mage/src/main/java/mage/abilities/hint/common/DifferentManaValuesInGraveHint.java diff --git a/Mage.Sets/src/mage/cards/g/GraveyardShift.java b/Mage.Sets/src/mage/cards/g/GraveyardShift.java new file mode 100644 index 00000000000..54e28c26314 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GraveyardShift.java @@ -0,0 +1,50 @@ +package mage.cards.g; + +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.DifferentManaValuesInGraveCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.hint.common.DifferentManaValuesInGraveHint; +import mage.abilities.keyword.FlashAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class GraveyardShift extends CardImpl { + + public GraveyardShift(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}"); + + // This spell has flash as long as there are five or more mana values among cards in your graveyard. + this.addAbility(new SimpleStaticAbility( + Zone.ALL, + new ConditionalContinuousEffect(new GainAbilitySourceEffect( + FlashAbility.getInstance(), Duration.WhileOnBattlefield, true + ), DifferentManaValuesInGraveCondition.FIVE, "this spell has flash " + + "as long as there are five or more mana values among cards in your graveyard") + ).setRuleAtTheTop(true).addHint(DifferentManaValuesInGraveHint.instance)); + + // Return target creature card from your graveyard to the battlefield. + this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()); + this.getSpellAbility().addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); + } + + private GraveyardShift(final GraveyardShift card) { + super(card); + } + + @Override + public GraveyardShift copy() { + return new GraveyardShift(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SnoopingNewsie.java b/Mage.Sets/src/mage/cards/s/SnoopingNewsie.java index c96a02ccb31..f5f03d60fec 100644 --- a/Mage.Sets/src/mage/cards/s/SnoopingNewsie.java +++ b/Mage.Sets/src/mage/cards/s/SnoopingNewsie.java @@ -1,28 +1,23 @@ package mage.cards.s; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.Condition; +import mage.abilities.condition.common.DifferentManaValuesInGraveCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.MillCardsControllerEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; -import mage.abilities.hint.Hint; +import mage.abilities.hint.common.DifferentManaValuesInGraveHint; import mage.abilities.keyword.LifelinkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.game.Game; -import mage.players.Player; -import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; /** * @author TheElk801 @@ -43,14 +38,14 @@ public final class SnoopingNewsie extends CardImpl { // As long as there are five or more mana values among cards in your graveyard, Snooping Newsie gets +1/+1 and has lifelink. Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect( new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield), - SnoopingNewsieCondition.instance, "as long as there are five or more " + - "mana values among cards in your graveyard, {this} gets +1/+1" + DifferentManaValuesInGraveCondition.FIVE, "as long as there are " + + "five or more mana values among cards in your graveyard, {this} gets +1/+1" )); ability.addEffect(new ConditionalContinuousEffect( new GainAbilitySourceEffect(LifelinkAbility.getInstance()), - SnoopingNewsieCondition.instance, "and has lifelink" + DifferentManaValuesInGraveCondition.FIVE, "and has lifelink" )); - this.addAbility(ability.addHint(SnoopingNewsieHint.instance)); + this.addAbility(ability.addHint(DifferentManaValuesInGraveHint.instance)); } private SnoopingNewsie(final SnoopingNewsie card) { @@ -62,48 +57,3 @@ public final class SnoopingNewsie extends CardImpl { return new SnoopingNewsie(this); } } - -enum SnoopingNewsieCondition implements Condition { - instance; - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - return player != null - && player - .getGraveyard() - .getCards(game) - .stream() - .mapToInt(MageObject::getManaValue) - .distinct() - .count() >= 5; - } -} - -enum SnoopingNewsieHint implements Hint { - instance;; - - @Override - public String getText(Game game, Ability ability) { - Player player = game.getPlayer(ability.getControllerId()); - if (player == null) { - return null; - } - List values = player - .getGraveyard() - .getCards(game) - .stream() - .mapToInt(MageObject::getManaValue) - .distinct() - .sorted() - .mapToObj(String::valueOf) - .collect(Collectors.toList()); - return "Different mana values among cards in your graveyard: " + values.size() - + (values.size() > 0 ? " (" + String.join(", ", values) + ')' : ""); - } - - @Override - public SnoopingNewsieHint copy() { - return this; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java b/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java index 261497103a5..eee2f4d5af9 100644 --- a/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java +++ b/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java @@ -45,6 +45,7 @@ public final class StreetsOfNewCapenna extends ExpansionSet { cards.add(new SetCardInfo("Forest", 270, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gala Greeters", 148, Rarity.RARE, mage.cards.g.GalaGreeters.class)); cards.add(new SetCardInfo("Getaway Car", 237, Rarity.RARE, mage.cards.g.GetawayCar.class)); + cards.add(new SetCardInfo("Graveyard Shift", 81, Rarity.UNCOMMON, mage.cards.g.GraveyardShift.class)); cards.add(new SetCardInfo("Grisly Sigil", 82, Rarity.UNCOMMON, mage.cards.g.GrislySigil.class)); cards.add(new SetCardInfo("Halo Fountain", 15, Rarity.MYTHIC, mage.cards.h.HaloFountain.class)); cards.add(new SetCardInfo("Incriminate", 84, Rarity.COMMON, mage.cards.i.Incriminate.class)); diff --git a/Mage/src/main/java/mage/abilities/condition/common/DifferentManaValuesInGraveCondition.java b/Mage/src/main/java/mage/abilities/condition/common/DifferentManaValuesInGraveCondition.java new file mode 100644 index 00000000000..7e55bdc07e1 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/condition/common/DifferentManaValuesInGraveCondition.java @@ -0,0 +1,38 @@ +package mage.abilities.condition.common; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.game.Game; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * @author TheElk801 + */ +public enum DifferentManaValuesInGraveCondition implements Condition { + FIVE(5); + private final int amount; + + DifferentManaValuesInGraveCondition(int amount) { + this.amount = amount; + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + return player != null + && player + .getGraveyard() + .getCards(game) + .stream() + .mapToInt(MageObject::getManaValue) + .distinct() + .count() >= amount; + } + + @Override + public String toString() { + return "there are " + CardUtil.numberToText(amount) + " or more mana values among cards in your graveyard"; + } +} diff --git a/Mage/src/main/java/mage/abilities/hint/common/DifferentManaValuesInGraveHint.java b/Mage/src/main/java/mage/abilities/hint/common/DifferentManaValuesInGraveHint.java new file mode 100644 index 00000000000..7c2dc478d9d --- /dev/null +++ b/Mage/src/main/java/mage/abilities/hint/common/DifferentManaValuesInGraveHint.java @@ -0,0 +1,40 @@ +package mage.abilities.hint.common; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.hint.Hint; +import mage.game.Game; +import mage.players.Player; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author TheElk801 + */ +public enum DifferentManaValuesInGraveHint implements Hint { + instance; + + public String getText(Game game, Ability ability) { + Player player = game.getPlayer(ability.getControllerId()); + if (player == null) { + return null; + } + List values = player + .getGraveyard() + .getCards(game) + .stream() + .mapToInt(MageObject::getManaValue) + .distinct() + .sorted() + .mapToObj(String::valueOf) + .collect(Collectors.toList()); + return "Different mana values among cards in your graveyard: " + values.size() + + (values.size() > 0 ? " (" + String.join(", ", values) + ')' : ""); + } + + @Override + public DifferentManaValuesInGraveHint copy() { + return this; + } +}