From d8f1b4a4cac3be5ab4d5fbeb96c2fded2fd6ee76 Mon Sep 17 00:00:00 2001 From: Daniel Bomar Date: Fri, 15 Apr 2022 06:18:56 -0500 Subject: [PATCH] [SNC] Implemented Sanguine Spy --- Mage.Sets/src/mage/cards/s/SanguineSpy.java | 108 ++++++++++++++++++ .../src/mage/sets/StreetsOfNewCapenna.java | 1 + 2 files changed, 109 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SanguineSpy.java diff --git a/Mage.Sets/src/mage/cards/s/SanguineSpy.java b/Mage.Sets/src/mage/cards/s/SanguineSpy.java new file mode 100644 index 00000000000..b93456eecd7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SanguineSpy.java @@ -0,0 +1,108 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfYourEndStepTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.common.DifferentManaValuesInGraveCondition; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.hint.common.DifferentManaValuesInGraveHint; +import mage.cards.Card; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.abilities.keyword.MenaceAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author weirddan455 + */ +public final class SanguineSpy extends CardImpl { + + public SanguineSpy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add(SubType.VAMPIRE); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Menace + this.addAbility(new MenaceAbility()); + + // Lifelink + this.addAbility(LifelinkAbility.getInstance()); + + // {1}, Sacrifice another creature: Look at the top card of your library. You may put that card into your graveyard. + Ability ability = new SimpleActivatedAbility(new SanguineSpyEffect(), new GenericManaCost(1)); + ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)); + this.addAbility(ability); + + // At the beginning of your end step, if there are five or more mana values among cards in your graveyard, you may pay 2 life. If you do, draw a card. + this.addAbility(new ConditionalInterveningIfTriggeredAbility( + new BeginningOfYourEndStepTriggeredAbility( + new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new PayLifeCost(2)), + false + ), + DifferentManaValuesInGraveCondition.FIVE, + "At the beginning of your end step, if there are five or more mana values among cards in your graveyard, you may pay 2 life. If you do, draw a card." + ).addHint(DifferentManaValuesInGraveHint.instance)); + } + + private SanguineSpy(final SanguineSpy card) { + super(card); + } + + @Override + public SanguineSpy copy() { + return new SanguineSpy(this); + } +} + +class SanguineSpyEffect extends OneShotEffect { + + public SanguineSpyEffect() { + super(Outcome.Benefit); + this.staticText = "Look at the top card of your library. You may put that card into your graveyard"; + } + + private SanguineSpyEffect(final SanguineSpyEffect effect) { + super(effect); + } + + @Override + public SanguineSpyEffect copy() { + return new SanguineSpyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Card card = player.getLibrary().getFromTop(game); + if (card == null) { + return false; + } + player.lookAtCards("Top card of your library", card, game); + if (player.chooseUse(Outcome.AIDontUseIt, "Put the top card of your library into your graveyard?", source, game)) { + player.moveCards(card, Zone.GRAVEYARD, source, game); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java b/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java index 66ec1a41ac1..097ef76f7e4 100644 --- a/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java +++ b/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java @@ -154,6 +154,7 @@ public final class StreetsOfNewCapenna extends ExpansionSet { cards.add(new SetCardInfo("Rogues' Gallery", 92, Rarity.UNCOMMON, mage.cards.r.RoguesGallery.class)); cards.add(new SetCardInfo("Rooftop Nuisance", 57, Rarity.COMMON, mage.cards.r.RooftopNuisance.class)); cards.add(new SetCardInfo("Rumor Gatherer", 29, Rarity.UNCOMMON, mage.cards.r.RumorGatherer.class)); + cards.add(new SetCardInfo("Sanguine Spy", 93, Rarity.RARE, mage.cards.s.SanguineSpy.class)); cards.add(new SetCardInfo("Security Bypass", 59, Rarity.COMMON, mage.cards.s.SecurityBypass.class)); cards.add(new SetCardInfo("Shadow of Mortality", 94, Rarity.RARE, mage.cards.s.ShadowOfMortality.class)); cards.add(new SetCardInfo("Shakedown Heavy", 95, Rarity.RARE, mage.cards.s.ShakedownHeavy.class));