From 81428811fe52b48623079fdef91f582256238424 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 10 Nov 2021 09:26:41 -0500 Subject: [PATCH] [VOW] Implemented Cipherbound Spirit --- .../src/mage/cards/c/CipherboundSpirit.java | 50 +++++++++++++ .../src/mage/cards/s/SoulcipherBoard.java | 74 +++++++++++++++++++ .../src/mage/sets/InnistradCrimsonVow.java | 2 + 3 files changed, 126 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CipherboundSpirit.java create mode 100644 Mage.Sets/src/mage/cards/s/SoulcipherBoard.java diff --git a/Mage.Sets/src/mage/cards/c/CipherboundSpirit.java b/Mage.Sets/src/mage/cards/c/CipherboundSpirit.java new file mode 100644 index 00000000000..6046bb3bbfb --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CipherboundSpirit.java @@ -0,0 +1,50 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.common.CanBlockOnlyFlyingAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawDiscardControllerEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CipherboundSpirit extends CardImpl { + + public CipherboundSpirit(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); + + this.subtype.add(SubType.SPIRIT); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + this.color.setBlue(true); + this.nightCard = true; + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Cipherbound Spirit can block only creatures with flying. + this.addAbility(new CanBlockOnlyFlyingAbility()); + + // {3}{U}: Draw two cards, then discard a card. + this.addAbility(new SimpleActivatedAbility( + new DrawDiscardControllerEffect(2, 1), new ManaCostsImpl<>("{3}{U}") + )); + } + + private CipherboundSpirit(final CipherboundSpirit card) { + super(card); + } + + @Override + public CipherboundSpirit copy() { + return new CipherboundSpirit(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SoulcipherBoard.java b/Mage.Sets/src/mage/cards/s/SoulcipherBoard.java new file mode 100644 index 00000000000..e92358b766d --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SoulcipherBoard.java @@ -0,0 +1,74 @@ +package mage.cards.s; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.SourceHasCounterCondition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SoulcipherBoard extends CardImpl { + + private static final Condition condition = new SourceHasCounterCondition(CounterType.OMEN, 0); + + public SoulcipherBoard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{U}"); + this.secondSideCardClazz = mage.cards.c.CipherboundSpirit.class; + + // Soulcipher Board enters the battlefield with three omen counters on it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.OMEN.createInstance(3)), + "with three omen counters on it" + )); + + // {1}{U}, {T}: Look at the top two cards of your library. Put one of them into your graveyard. + Ability ability = new SimpleActivatedAbility(new LookLibraryAndPickControllerEffect( + StaticValue.get(2), false, StaticValue.get(1), StaticFilters.FILTER_CARD, + Zone.LIBRARY, true, false, false, Zone.GRAVEYARD, false + ).setText("look at the top two cards of your library. Put one of them into your graveyard"), new ManaCostsImpl<>("{1}{U}")); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + + // Whenever a creature card is put into your graveyard from anywhere, remove an omen counter from Soulcipher Board. Then if it has no omen counters on it, transform it. + this.addAbility(new TransformAbility()); + ability = new PutCardIntoGraveFromAnywhereAllTriggeredAbility( + new RemoveCounterSourceEffect(CounterType.OMEN.createInstance()), + false, StaticFilters.FILTER_CARD_CREATURE_A, TargetController.YOU + ); + ability.addEffect(new ConditionalOneShotEffect( + new TransformSourceEffect(), condition, + "Then if it has no omen counters on it, transform it" + )); + this.addAbility(ability); + } + + private SoulcipherBoard(final SoulcipherBoard card) { + super(card); + } + + @Override + public SoulcipherBoard copy() { + return new SoulcipherBoard(this); + } +} diff --git a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java index 9e7f359a878..c77f206c2b9 100644 --- a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java +++ b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java @@ -79,6 +79,7 @@ public final class InnistradCrimsonVow extends ExpansionSet { cards.add(new SetCardInfo("Change of Fortune", 150, Rarity.RARE, mage.cards.c.ChangeOfFortune.class)); cards.add(new SetCardInfo("Child of the Pack", 234, Rarity.UNCOMMON, mage.cards.c.ChildOfThePack.class)); cards.add(new SetCardInfo("Chill of the Grave", 51, Rarity.COMMON, mage.cards.c.ChillOfTheGrave.class)); + cards.add(new SetCardInfo("Cipherbound Spirit", 79, Rarity.UNCOMMON, mage.cards.c.CipherboundSpirit.class)); cards.add(new SetCardInfo("Circle of Confinement", 7, Rarity.UNCOMMON, mage.cards.c.CircleOfConfinement.class)); cards.add(new SetCardInfo("Clever Distraction", 9, Rarity.UNCOMMON, mage.cards.c.CleverDistraction.class)); cards.add(new SetCardInfo("Cloaked Cadet", 192, Rarity.UNCOMMON, mage.cards.c.CloakedCadet.class)); @@ -266,6 +267,7 @@ public final class InnistradCrimsonVow extends ExpansionSet { cards.add(new SetCardInfo("Skywarp Skaab", 78, Rarity.COMMON, mage.cards.s.SkywarpSkaab.class)); cards.add(new SetCardInfo("Snarling Wolf", 219, Rarity.COMMON, mage.cards.s.SnarlingWolf.class)); cards.add(new SetCardInfo("Sorin the Mirthless", 131, Rarity.MYTHIC, mage.cards.s.SorinTheMirthless.class)); + cards.add(new SetCardInfo("Soulcipher Board", 79, Rarity.UNCOMMON, mage.cards.s.SoulcipherBoard.class)); cards.add(new SetCardInfo("Spectral Binding", 48, Rarity.COMMON, mage.cards.s.SpectralBinding.class)); cards.add(new SetCardInfo("Spiked Ripsaw", 220, Rarity.UNCOMMON, mage.cards.s.SpikedRipsaw.class)); cards.add(new SetCardInfo("Splendid Reclamation", 221, Rarity.RARE, mage.cards.s.SplendidReclamation.class));