From ed9d51526eccf2e863c965dcf3ee954087e89b24 Mon Sep 17 00:00:00 2001 From: Noah Gleason Date: Fri, 29 Jun 2018 23:46:35 -0400 Subject: [PATCH 1/6] Implement Conjurer's Ban --- Mage.Sets/src/mage/cards/c/ConjurersBan.java | 85 ++++++++++++++++++++ Mage.Sets/src/mage/sets/Guildpact.java | 1 + 2 files changed, 86 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/ConjurersBan.java diff --git a/Mage.Sets/src/mage/cards/c/ConjurersBan.java b/Mage.Sets/src/mage/cards/c/ConjurersBan.java new file mode 100644 index 00000000000..f7624da9e81 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ConjurersBan.java @@ -0,0 +1,85 @@ +package mage.cards.c; + +import java.util.UUID; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.common.ChooseACardNameEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * + * @author noahg + */ +public final class ConjurersBan extends CardImpl { + + public ConjurersBan(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{W}{B}"); + + + // Choose a card name. Until your next turn, spells with the chosen name can’t be cast and lands with the chosen name can’t be played. + this.getSpellAbility().addEffect(new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.ALL)); + this.getSpellAbility().addEffect(new ConjurersBanEffect()); + + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public ConjurersBan(final ConjurersBan card) { + super(card); + } + + @Override + public ConjurersBan copy() { + return new ConjurersBan(this); + } +} + +class ConjurersBanEffect extends ContinuousRuleModifyingEffectImpl { + + public ConjurersBanEffect() { + super(Duration.UntilYourNextTurn, Outcome.Detriment, true, false); + this.staticText = "spells with the chosen name can't be cast and lands with the chosen name can't be played"; + } + + public ConjurersBanEffect(final ConjurersBanEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public ConjurersBanEffect copy() { + return new ConjurersBanEffect(this); + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getType() == GameEvent.EventType.CAST_SPELL || event.getType() == GameEvent.EventType.PLAY_LAND) { + MageObject object = game.getObject(event.getSourceId()); + return object != null && object.getName().equals(game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY)); + } + return false; + } + + @Override + public String getInfoMessage(Ability source, GameEvent event, Game game) { + String namedCard = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + String playerName = game.getPlayer(source.getControllerId()).getName(); + if (namedCard == null || playerName == null || source.getSourceObject(game) == null){ + return super.getInfoMessage(source, event, game); + } + return "Until "+playerName+"'s next turn, spells named "+namedCard+" can't be cast and lands named "+namedCard+" can't be played ("+source.getSourceObject(game).getIdName()+")."; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Guildpact.java b/Mage.Sets/src/mage/sets/Guildpact.java index 5eadbe6723e..16e31256091 100644 --- a/Mage.Sets/src/mage/sets/Guildpact.java +++ b/Mage.Sets/src/mage/sets/Guildpact.java @@ -44,6 +44,7 @@ public final class Guildpact extends ExpansionSet { cards.add(new SetCardInfo("Castigate", 106, Rarity.COMMON, mage.cards.c.Castigate.class)); cards.add(new SetCardInfo("Caustic Rain", 44, Rarity.UNCOMMON, mage.cards.c.CausticRain.class)); cards.add(new SetCardInfo("Cerebral Vortex", 107, Rarity.RARE, mage.cards.c.CerebralVortex.class)); + cards.add(new SetCardInfo("Conjurer's Ban", 108, Rarity.UNCOMMON, mage.cards.c.ConjurersBan.class)); cards.add(new SetCardInfo("Crash Landing", 82, Rarity.UNCOMMON, mage.cards.c.CrashLanding.class)); cards.add(new SetCardInfo("Cremate", 45, Rarity.COMMON, mage.cards.c.Cremate.class)); cards.add(new SetCardInfo("Cry of Contrition", 46, Rarity.COMMON, mage.cards.c.CryOfContrition.class)); From 83e417aa9c51e7c11d5b3cf41758f56283d7e227 Mon Sep 17 00:00:00 2001 From: Noah Gleason Date: Sat, 30 Jun 2018 19:23:42 -0400 Subject: [PATCH 2/6] Implement Azorius Ploy --- Mage.Sets/src/mage/cards/a/AzoriusPloy.java | 57 +++++++++++++++++++++ Mage.Sets/src/mage/sets/Dissension.java | 1 + 2 files changed, 58 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AzoriusPloy.java diff --git a/Mage.Sets/src/mage/cards/a/AzoriusPloy.java b/Mage.Sets/src/mage/cards/a/AzoriusPloy.java new file mode 100644 index 00000000000..c7e1c996d58 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AzoriusPloy.java @@ -0,0 +1,57 @@ +package mage.cards.a; + +import java.util.UUID; + +import mage.abilities.Ability; +import mage.abilities.AbilityImpl; +import mage.abilities.SpellAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.PreventCombatDamageBySourceEffect; +import mage.abilities.effects.common.PreventDamageByTargetEffect; +import mage.abilities.effects.common.PreventDamageToTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.Target; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.SecondTargetPointer; + +/** + * + * @author noahg + */ +public final class AzoriusPloy extends CardImpl { + + public AzoriusPloy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}{W}{U}"); + + + // Prevent all combat damage target creature would deal this turn. + Effect effect = new PreventDamageByTargetEffect( Duration.EndOfTurn, true); + effect.setText("Prevent all combat damage target creature would deal this turn."); + this.getSpellAbility().addEffect(effect); + Target target = new TargetCreaturePermanent(new FilterCreaturePermanent("first creature")); + this.getSpellAbility().addTarget(target); + + // Prevent all combat damage that would be dealt to target creature this turn. + Effect effect2 = new PreventDamageToTargetEffect(Duration.EndOfTurn, true); + effect2.setText("

Prevent all combat damage that would be dealt to target creature this turn."); + effect2.setTargetPointer(SecondTargetPointer.getInstance()); + this.getSpellAbility().addEffect(effect2); + target = new TargetCreaturePermanent(new FilterCreaturePermanent("second creature (can be the same as the first)")); + this.getSpellAbility().addTarget(target); + + } + + public AzoriusPloy(final AzoriusPloy card) { + super(card); + } + + @Override + public AzoriusPloy copy() { + return new AzoriusPloy(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Dissension.java b/Mage.Sets/src/mage/sets/Dissension.java index 7fafc036eca..8f436cb17c4 100644 --- a/Mage.Sets/src/mage/sets/Dissension.java +++ b/Mage.Sets/src/mage/sets/Dissension.java @@ -38,6 +38,7 @@ public final class Dissension extends ExpansionSet { cards.add(new SetCardInfo("Azorius First-Wing", 105, Rarity.COMMON, mage.cards.a.AzoriusFirstWing.class)); cards.add(new SetCardInfo("Azorius Guildmage", 141, Rarity.UNCOMMON, mage.cards.a.AzoriusGuildmage.class)); cards.add(new SetCardInfo("Azorius Herald", 2, Rarity.UNCOMMON, mage.cards.a.AzoriusHerald.class)); + cards.add(new SetCardInfo("Azorius Ploy", 106, Rarity.UNCOMMON, mage.cards.a.AzoriusPloy.class)); cards.add(new SetCardInfo("Azorius Signet", 159, Rarity.COMMON, mage.cards.a.AzoriusSignet.class)); cards.add(new SetCardInfo("Beacon Hawk", 3, Rarity.COMMON, mage.cards.b.BeaconHawk.class)); cards.add(new SetCardInfo("Biomantic Mastery", 142, Rarity.RARE, mage.cards.b.BiomanticMastery.class)); From 687c7a2b26089ed51cf4e6f93b005e4f342131e4 Mon Sep 17 00:00:00 2001 From: Noah Gleason Date: Sun, 1 Jul 2018 09:22:21 -0400 Subject: [PATCH 3/6] Implement Flash Foliage --- Mage.Sets/src/mage/cards/f/FlashFoliage.java | 101 +++++++++++++++++++ Mage.Sets/src/mage/sets/Dissension.java | 1 + 2 files changed, 102 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FlashFoliage.java diff --git a/Mage.Sets/src/mage/cards/f/FlashFoliage.java b/Mage.Sets/src/mage/cards/f/FlashFoliage.java new file mode 100644 index 00000000000..2460dffc863 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FlashFoliage.java @@ -0,0 +1,101 @@ +package mage.cards.f; + +import java.util.UUID; + +import mage.abilities.Ability; +import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility; +import mage.abilities.condition.common.AfterBlockersAreDeclaredCondition; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.TurnPhase; +import mage.game.Game; +import mage.game.combat.CombatGroup; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.SaprolingToken; +import mage.game.permanent.token.Token; +import mage.players.Player; +import mage.target.common.FilterCreatureAttackingYou; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author noahg + */ +public final class FlashFoliage extends CardImpl { + + public FlashFoliage(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}"); + + + // Cast Flash Foliage only during combat after blockers are declared. + this.addAbility(new CastOnlyDuringPhaseStepSourceAbility(TurnPhase.COMBAT, AfterBlockersAreDeclaredCondition.instance)); + + // Create a 1/1 green Saproling creature token that’s blocking target creature attacking you. + this.getSpellAbility().addEffect(new FlashFoliageEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreatureAttackingYou())); + + // Draw a card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public FlashFoliage(final FlashFoliage card) { + super(card); + } + + @Override + public FlashFoliage copy() { + return new FlashFoliage(this); + } +} + +class FlashFoliageEffect extends OneShotEffect { + + public FlashFoliageEffect() { + super(Outcome.Benefit); + this.staticText = "create a 1/1 green Saproling creature token that’s blocking target creature attacking you"; + } + + public FlashFoliageEffect(final FlashFoliageEffect effect) { + super(effect); + } + + @Override + public FlashFoliageEffect copy() { + return new FlashFoliageEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + + if (controller != null) { + Token token = new SaprolingToken(); + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); + Permanent attackingCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (attackingCreature != null && game.getState().getCombat() != null) { + // Possible ruling (see Aetherplasm) + // The token you created is blocking the attacking creature, + // even if the block couldn't legally be declared (for example, if that creature + // enters the battlefield tapped, or it can't block, or the attacking creature + // has protection from it) + CombatGroup combatGroup = game.getState().getCombat().findGroup(attackingCreature.getId()); + if (combatGroup != null) { + for (UUID tokenId : token.getLastAddedTokenIds()) { + Permanent saprolingToken = game.getPermanent(tokenId); + if (saprolingToken != null) { + combatGroup.addBlocker(tokenId, source.getControllerId(), game); + game.getCombat().addBlockingGroup(tokenId, attackingCreature.getId(), controller.getId(), game); + } + } + combatGroup.pickBlockerOrder(attackingCreature.getControllerId(), game); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/Dissension.java b/Mage.Sets/src/mage/sets/Dissension.java index 7fafc036eca..a8d18171051 100644 --- a/Mage.Sets/src/mage/sets/Dissension.java +++ b/Mage.Sets/src/mage/sets/Dissension.java @@ -75,6 +75,7 @@ public final class Dissension extends ExpansionSet { cards.add(new SetCardInfo("Experiment Kraj", 110, Rarity.RARE, mage.cards.e.ExperimentKraj.class)); cards.add(new SetCardInfo("Flame-Kin War Scout", 61, Rarity.UNCOMMON, mage.cards.f.FlameKinWarScout.class)); cards.add(new SetCardInfo("Flaring Flame-Kin", 62, Rarity.UNCOMMON, mage.cards.f.FlaringFlameKin.class)); + cards.add(new SetCardInfo("Flash Foliage", 85, Rarity.UNCOMMON, mage.cards.f.FlashFoliage.class)); cards.add(new SetCardInfo("Freewind Equenaut", 9, Rarity.COMMON, mage.cards.f.FreewindEquenaut.class)); cards.add(new SetCardInfo("Ghost Quarter", 173, Rarity.UNCOMMON, mage.cards.g.GhostQuarter.class)); cards.add(new SetCardInfo("Gnat Alley Creeper", 63, Rarity.UNCOMMON, mage.cards.g.GnatAlleyCreeper.class)); From f83abb4fef3f0075ad1277c4c2d91608f48f37f8 Mon Sep 17 00:00:00 2001 From: Noah Gleason Date: Sun, 1 Jul 2018 10:08:32 -0400 Subject: [PATCH 4/6] Implement Nettling Curse --- Mage.Sets/src/mage/cards/n/NettlingCurse.java | 54 +++++++++++++++++++ Mage.Sets/src/mage/sets/Dissension.java | 1 + 2 files changed, 55 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/n/NettlingCurse.java diff --git a/Mage.Sets/src/mage/cards/n/NettlingCurse.java b/Mage.Sets/src/mage/cards/n/NettlingCurse.java new file mode 100644 index 00000000000..062efbbfe3e --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NettlingCurse.java @@ -0,0 +1,54 @@ +package mage.cards.n; + +import java.util.UUID; + +import mage.abilities.common.AttacksOrBlocksEnchantedTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.LoseLifeControllerAttachedEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.abilities.effects.common.combat.AttacksIfAbleAttachedEffect; +import mage.constants.*; +import mage.target.TargetPlayer; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.effects.common.AttachEffect; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; + +/** + * + * @author noahg + */ +public final class NettlingCurse extends CardImpl { + + public NettlingCurse(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Whenever enchanted creature attacks or blocks, its controller loses 3 life. + this.addAbility(new AttacksOrBlocksEnchantedTriggeredAbility(Zone.BATTLEFIELD, new LoseLifeControllerAttachedEffect(3))); + + // {1}{R}: Enchanted creature attacks this turn if able. + this.addAbility(new SimpleActivatedAbility(new AttacksIfAbleAttachedEffect(Duration.EndOfTurn, AttachmentType.AURA), new ManaCostsImpl("{1}{R}"))); + } + + public NettlingCurse(final NettlingCurse card) { + super(card); + } + + @Override + public NettlingCurse copy() { + return new NettlingCurse(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Dissension.java b/Mage.Sets/src/mage/sets/Dissension.java index 7fafc036eca..cee1502119f 100644 --- a/Mage.Sets/src/mage/sets/Dissension.java +++ b/Mage.Sets/src/mage/sets/Dissension.java @@ -105,6 +105,7 @@ public final class Dissension extends ExpansionSet { cards.add(new SetCardInfo("Minister of Impediments", 144, Rarity.COMMON, mage.cards.m.MinisterOfImpediments.class)); cards.add(new SetCardInfo("Mistral Charger", 13, Rarity.UNCOMMON, mage.cards.m.MistralCharger.class)); cards.add(new SetCardInfo("Momir Vig, Simic Visionary", 118, Rarity.RARE, mage.cards.m.MomirVigSimicVisionary.class)); + cards.add(new SetCardInfo("Nettling Curse", 48, Rarity.COMMON, mage.cards.n.NettlingCurse.class)); cards.add(new SetCardInfo("Nihilistic Glee", 50, Rarity.RARE, mage.cards.n.NihilisticGlee.class)); cards.add(new SetCardInfo("Novijen, Heart of Progress", 175, Rarity.UNCOMMON, mage.cards.n.NovijenHeartOfProgress.class)); cards.add(new SetCardInfo("Novijen Sages", 27, Rarity.RARE, mage.cards.n.NovijenSages.class)); From 2720af7b0f9dcd3e1ebecad818827f10128e5399 Mon Sep 17 00:00:00 2001 From: Noah Gleason Date: Sun, 1 Jul 2018 13:36:30 -0400 Subject: [PATCH 5/6] Implement Fertile Imagination --- Mage.Sets/src/mage/cards/b/BloodOath.java | 2 +- .../src/mage/cards/f/FertileImagination.java | 125 ++++++++++++++++++ Mage.Sets/src/mage/sets/Dissension.java | 1 + 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/f/FertileImagination.java diff --git a/Mage.Sets/src/mage/cards/b/BloodOath.java b/Mage.Sets/src/mage/cards/b/BloodOath.java index d9c07dda95a..0edc503b6b6 100644 --- a/Mage.Sets/src/mage/cards/b/BloodOath.java +++ b/Mage.Sets/src/mage/cards/b/BloodOath.java @@ -80,7 +80,7 @@ class BloodOathEffect extends OneShotEffect { if (player != null && opponent != null && sourceObject != null) { Choice choiceImpl = new ChoiceImpl(); choiceImpl.setChoices(choice); - if (!player.choose(Outcome.Neutral, choiceImpl, game)) { + if (player.choose(Outcome.Neutral, choiceImpl, game)) { CardType type = null; String choosenType = choiceImpl.getChoice(); diff --git a/Mage.Sets/src/mage/cards/f/FertileImagination.java b/Mage.Sets/src/mage/cards/f/FertileImagination.java new file mode 100644 index 00000000000..f25b42bef30 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FertileImagination.java @@ -0,0 +1,125 @@ +package mage.cards.f; + +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.UUID; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.choices.Choice; +import mage.choices.ChoiceImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.token.SaprolingToken; +import mage.players.Player; +import mage.target.common.TargetOpponent; + +/** + * + * @author noahg + */ +public final class FertileImagination extends CardImpl { + + public FertileImagination(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}{G}"); + + + // Choose a card type. Target opponent reveals their hand. Create two 1/1 green Saproling creature tokens for each card of the chosen type revealed this way. + this.getSpellAbility().addEffect(new FertileImaginationEffect()); + this.getSpellAbility().addTarget(new TargetOpponent()); + } + + public FertileImagination(final FertileImagination card) { + super(card); + } + + @Override + public FertileImagination copy() { + return new FertileImagination(this); + } +} + +class FertileImaginationEffect extends OneShotEffect { + + private static final Set choice = new LinkedHashSet<>(); + + static { + choice.add(CardType.ARTIFACT.toString()); + choice.add(CardType.CREATURE.toString()); + choice.add(CardType.ENCHANTMENT.toString()); + choice.add(CardType.INSTANT.toString()); + choice.add(CardType.LAND.toString()); + choice.add(CardType.PLANESWALKER.toString()); + choice.add(CardType.SORCERY.toString()); + choice.add(CardType.TRIBAL.toString()); + } + + public FertileImaginationEffect() { + super(Outcome.Benefit); + staticText = "Choose a card type. Target opponent reveals their hand. Create two 1/1 green Saproling creature tokens for each card of the chosen type revealed this way"; + } + + public FertileImaginationEffect(final FertileImaginationEffect effect) { + super(effect); + } + + @Override + public FertileImaginationEffect copy() { + return new FertileImaginationEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + MageObject sourceObject = game.getObject(source.getSourceId()); + Player player = game.getPlayer(source.getControllerId()); + Player opponent = game.getPlayer(source.getFirstTarget()); + if (player != null && opponent != null && sourceObject != null) { + Choice choiceImpl = new ChoiceImpl(); + choiceImpl.setChoices(choice); + if (player.choose(Outcome.Neutral, choiceImpl, game)) { + CardType type = null; + String choosenType = choiceImpl.getChoice(); + + if (choosenType.equals(CardType.ARTIFACT.toString())) { + type = CardType.ARTIFACT; + } else if (choosenType.equals(CardType.LAND.toString())) { + type = CardType.LAND; + } else if (choosenType.equals(CardType.CREATURE.toString())) { + type = CardType.CREATURE; + } else if (choosenType.equals(CardType.ENCHANTMENT.toString())) { + type = CardType.ENCHANTMENT; + } else if (choosenType.equals(CardType.INSTANT.toString())) { + type = CardType.INSTANT; + } else if (choosenType.equals(CardType.SORCERY.toString())) { + type = CardType.SORCERY; + } else if (choosenType.equals(CardType.PLANESWALKER.toString())) { + type = CardType.PLANESWALKER; + } else if (choosenType.equals(CardType.TRIBAL.toString())) { + type = CardType.TRIBAL; + } + if (type != null) { + Cards hand = opponent.getHand(); + SaprolingToken saprolingToken = new SaprolingToken(); + opponent.revealCards(sourceObject.getIdName(), hand, game); + Set cards = hand.getCards(game); + int tokensToMake = 0; + for (Card card : cards) { + if (card != null && card.getCardType().contains(type)) { + tokensToMake += 2; + } + } + game.informPlayers(sourceObject.getLogName() + " creates " + (tokensToMake == 0 ? "no" : "" + tokensToMake) + " 1/1 green Saproling creature tokens."); + saprolingToken.putOntoBattlefield(tokensToMake, game, source.getId(), source.getControllerId()); + return true; + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/Dissension.java b/Mage.Sets/src/mage/sets/Dissension.java index 7fafc036eca..df2bbdbd76c 100644 --- a/Mage.Sets/src/mage/sets/Dissension.java +++ b/Mage.Sets/src/mage/sets/Dissension.java @@ -73,6 +73,7 @@ public final class Dissension extends ExpansionSet { cards.add(new SetCardInfo("Entropic Eidolon", 45, Rarity.COMMON, mage.cards.e.EntropicEidolon.class)); cards.add(new SetCardInfo("Evolution Vat", 161, Rarity.RARE, mage.cards.e.EvolutionVat.class)); cards.add(new SetCardInfo("Experiment Kraj", 110, Rarity.RARE, mage.cards.e.ExperimentKraj.class)); + cards.add(new SetCardInfo("Fertile Imagination", 84, Rarity.UNCOMMON, mage.cards.f.FertileImagination.class)); cards.add(new SetCardInfo("Flame-Kin War Scout", 61, Rarity.UNCOMMON, mage.cards.f.FlameKinWarScout.class)); cards.add(new SetCardInfo("Flaring Flame-Kin", 62, Rarity.UNCOMMON, mage.cards.f.FlaringFlameKin.class)); cards.add(new SetCardInfo("Freewind Equenaut", 9, Rarity.COMMON, mage.cards.f.FreewindEquenaut.class)); From 84365b20066d4a388ec7b3041b28b56f15092138 Mon Sep 17 00:00:00 2001 From: Noah Gleason Date: Sun, 1 Jul 2018 14:52:18 -0400 Subject: [PATCH 6/6] Fix text --- Mage.Sets/src/mage/cards/n/NettlingCurse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/n/NettlingCurse.java b/Mage.Sets/src/mage/cards/n/NettlingCurse.java index 062efbbfe3e..18456d6a31b 100644 --- a/Mage.Sets/src/mage/cards/n/NettlingCurse.java +++ b/Mage.Sets/src/mage/cards/n/NettlingCurse.java @@ -40,7 +40,7 @@ public final class NettlingCurse extends CardImpl { this.addAbility(new AttacksOrBlocksEnchantedTriggeredAbility(Zone.BATTLEFIELD, new LoseLifeControllerAttachedEffect(3))); // {1}{R}: Enchanted creature attacks this turn if able. - this.addAbility(new SimpleActivatedAbility(new AttacksIfAbleAttachedEffect(Duration.EndOfTurn, AttachmentType.AURA), new ManaCostsImpl("{1}{R}"))); + this.addAbility(new SimpleActivatedAbility(new AttacksIfAbleAttachedEffect(Duration.EndOfTurn, AttachmentType.AURA).setText("Enchanted creature attacks this turn if able."), new ManaCostsImpl("{1}{R}"))); } public NettlingCurse(final NettlingCurse card) {