diff --git a/Mage.Sets/src/mage/cards/g/GrunnTheLonelyKing.java b/Mage.Sets/src/mage/cards/g/GrunnTheLonelyKing.java new file mode 100644 index 0000000000..d718a8655a --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GrunnTheLonelyKing.java @@ -0,0 +1,62 @@ +package mage.cards.g; + +import java.util.UUID; + +import mage.MageInt; +import mage.abilities.common.AttacksAloneTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount; +import mage.abilities.dynamicvalue.common.SourcePermanentToughnessValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.KickerAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.counters.CounterType; + +/** + * @author JRHerlehy + * Created on 4/5/18. + */ +public class GrunnTheLonelyKing extends CardImpl { + + public GrunnTheLonelyKing(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.APE, SubType.WARRIOR); + + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + //Kicker {3} (You may pay an additional {3} as you cast this spell.) + this.addAbility(new KickerAbility("{3}")); + + //If Grunn, the Lonely King was kicked, it enters the battlefield with five +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance(5)), KickedCondition.instance))); + + //Whenever Grunn attacks alone, double its power and toughness until end of turn. + SourcePermanentPowerCount power = new SourcePermanentPowerCount(); + SourcePermanentToughnessValue toughness = new SourcePermanentToughnessValue(); + Effect effect = new BoostSourceEffect(power, toughness, Duration.EndOfTurn, true); + effect.setText("double its power and toughness until end of turn"); + this.addAbility(new AttacksAloneTriggeredAbility(effect)); + } + + public GrunnTheLonelyKing(final GrunnTheLonelyKing card) { + super(card); + } + + @Override + public GrunnTheLonelyKing copy() { + return new GrunnTheLonelyKing(this); + } +} diff --git a/Mage.Sets/src/mage/cards/n/NaruMehaMasterWizard.java b/Mage.Sets/src/mage/cards/n/NaruMehaMasterWizard.java new file mode 100644 index 0000000000..6ff2848877 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NaruMehaMasterWizard.java @@ -0,0 +1,102 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.n; + +import java.util.UUID; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.keyword.FlashAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterSpell; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.TargetSpell; + +/** + * @author JRHerlehy + * Created on 4/5/18. + */ +public class NaruMehaMasterWizard extends CardImpl { + + private static final FilterSpell spellFilter = new FilterSpell("instant or sorcery you control"); + private static final FilterCreaturePermanent wizardFilter = new FilterCreaturePermanent(SubType.WIZARD, "Wizards"); + + static { + wizardFilter.add(new ControllerPredicate(TargetController.YOU)); + spellFilter.add(new ControllerPredicate(TargetController.YOU)); + spellFilter.add(Predicates.or( + new CardTypePredicate(CardType.INSTANT), + new CardTypePredicate(CardType.SORCERY) + )); + } + + public NaruMehaMasterWizard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{U}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN, SubType.WIZARD); + + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + //Flash + this.addAbility(FlashAbility.getInstance()); + + //When Naru Meha, Master Wizard enters the battlefield, copy target instant or sorcery spell you control. You may choose new targets for the copy. + Ability ability = new EntersBattlefieldTriggeredAbility(new CopyTargetSpellEffect()); + ability.addTarget(new TargetSpell(spellFilter)); + this.addAbility(ability); + + //Other Wizards you control get +1/+1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, wizardFilter, true))); + } + + public NaruMehaMasterWizard(final NaruMehaMasterWizard card) { + super(card); + } + + @Override + public NaruMehaMasterWizard copy() { + return new NaruMehaMasterWizard(this); + } + +} diff --git a/Mage.Sets/src/mage/cards/s/SealAway.java b/Mage.Sets/src/mage/cards/s/SealAway.java index d489fa250c..4b360558e5 100644 --- a/Mage.Sets/src/mage/cards/s/SealAway.java +++ b/Mage.Sets/src/mage/cards/s/SealAway.java @@ -51,7 +51,7 @@ import mage.target.TargetPermanent; */ public class SealAway extends CardImpl { - private final static FilterCreaturePermanent filter = new FilterCreaturePermanent(); + private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature"); static { filter.add(new ControllerPredicate(TargetController.OPPONENT)); diff --git a/Mage.Sets/src/mage/cards/v/VerixBladewing.java b/Mage.Sets/src/mage/cards/v/VerixBladewing.java new file mode 100644 index 0000000000..e9f22e2546 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VerixBladewing.java @@ -0,0 +1,55 @@ +package mage.cards.v; + +import java.util.UUID; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.KickerAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.game.permanent.token.KaroxBladewingDragonToken; + +/** + * @author JRHerlehy + * Created on 4/5/18. + */ +public class VerixBladewing extends CardImpl { + + public VerixBladewing(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}"); + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.DRAGON); + + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Kicker {3} + this.addAbility(new KickerAbility("{3}")); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Verix Bladewing enters the battlefield, if it was kicked, create Karox Bladewing, + // a legendary 4/4 red Dragon creature token with flying. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ConditionalOneShotEffect( + new CreateTokenEffect(new KaroxBladewingDragonToken()), KickedCondition.instance, + "create Karox Bladewing, a legendary 4/4 red Dragon creature token with flying."))); + } + + public VerixBladewing(final VerixBladewing card) { + super(card); + } + + @Override + public VerixBladewing copy() { + return new VerixBladewing(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Dominaria.java b/Mage.Sets/src/mage/sets/Dominaria.java index 9a956df376..8e89762825 100644 --- a/Mage.Sets/src/mage/sets/Dominaria.java +++ b/Mage.Sets/src/mage/sets/Dominaria.java @@ -60,23 +60,29 @@ public class Dominaria extends ExpansionSet { cards.add(new SetCardInfo("Cabal Evangel", 78, Rarity.COMMON, mage.cards.c.CabalEvangel.class)); cards.add(new SetCardInfo("Cast Down", 81, Rarity.UNCOMMON, mage.cards.c.CastDown.class)); cards.add(new SetCardInfo("Charge", 11, Rarity.COMMON, mage.cards.c.Charge.class)); - cards.add(new SetCardInfo("Goblin Warchief", 130, Rarity.UNCOMMON, mage.cards.g.GoblinWarchief.class)); cards.add(new SetCardInfo("Gilded Lotus", 215, Rarity.RARE, mage.cards.g.GildedLotus.class)); + cards.add(new SetCardInfo("Goblin Warchief", 130, Rarity.UNCOMMON, mage.cards.g.GoblinWarchief.class)); + cards.add(new SetCardInfo("Grunn, the Lonely King", 165, Rarity.UNCOMMON, mage.cards.g.GrunnTheLonelyKing.class)); cards.add(new SetCardInfo("Homarid Explorer", 53, Rarity.UNCOMMON, mage.cards.h.HomaridExplorer.class)); cards.add(new SetCardInfo("Icy Manipulator", 219, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); cards.add(new SetCardInfo("Invoke the Divine", 13, Rarity.COMMON, mage.cards.i.InvokeTheDivine.class)); cards.add(new SetCardInfo("Jhoira, Weatherlight Captain", 200, Rarity.MYTHIC, mage.cards.j.JhoiraWeatherlightCaptain.class)); cards.add(new SetCardInfo("Jodah, Archmage Eternal", 198, Rarity.RARE, mage.cards.j.JodahArchmageEternal.class)); + cards.add(new SetCardInfo("Juggernaut", 222, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class)); cards.add(new SetCardInfo("Karn, Scion of Urza", 554, Rarity.MYTHIC, mage.cards.k.KarnScionOfUrza.class)); cards.add(new SetCardInfo("Knight of Grace", 23, Rarity.UNCOMMON, mage.cards.k.KnightOfGrace.class)); cards.add(new SetCardInfo("Knight of Malice", 52, Rarity.UNCOMMON, mage.cards.k.KnightOfMalice.class)); cards.add(new SetCardInfo("Llanowar Elves", 168, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); cards.add(new SetCardInfo("Lyra Dawnbringer", 14, Rarity.MYTHIC, mage.cards.l.LyraDawnbringer.class)); cards.add(new SetCardInfo("Meandering River", 274, Rarity.COMMON, mage.cards.m.MeanderingRiver.class)); + cards.add(new SetCardInfo("Naru Meha, Master Wizard", 59, Rarity.MYTHIC, mage.cards.n.NaruMehaMasterWizard.class)); cards.add(new SetCardInfo("Opt", 60, Rarity.COMMON, mage.cards.o.Opt.class)); cards.add(new SetCardInfo("Seal Away", 31, Rarity.UNCOMMON, mage.cards.s.SealAway.class)); cards.add(new SetCardInfo("Serra Angel", 33, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); cards.add(new SetCardInfo("Serra Disciple", 34, Rarity.COMMON, mage.cards.s.SerraDisciple.class)); + cards.add(new SetCardInfo("Syncopate", 67, Rarity.UNCOMMON, mage.cards.s.Syncopate.class)); + cards.add(new SetCardInfo("Thorn Elemental", 185, Rarity.UNCOMMON, mage.cards.t.ThornElemental.class)); + cards.add(new SetCardInfo("Verix Bladewing", 149, Rarity.MYTHIC, mage.cards.v.VerixBladewing.class)); cards.add(new SetCardInfo("Zhalfirin Void", 249, Rarity.UNCOMMON, mage.cards.z.ZhalfirinVoid.class)); } } diff --git a/Mage/src/main/java/mage/game/permanent/token/KaroxBladewingDragonToken.java b/Mage/src/main/java/mage/game/permanent/token/KaroxBladewingDragonToken.java new file mode 100644 index 0000000000..5830be0b35 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/KaroxBladewingDragonToken.java @@ -0,0 +1,61 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com AS IS AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.permanent.token; + +import mage.abilities.keyword.FlyingAbility; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; + +/** + * @author JRHerlehy + * Created on 4/5/18. + */ +public class KaroxBladewingDragonToken extends TokenImpl { + + public KaroxBladewingDragonToken() { + super("Karox Bladewing", "legendary 4/4 red Dragon creature token with flying", 4, 4); + + this.setOriginalExpansionSetCode("DOM"); + + this.addSuperType(SuperType.LEGENDARY); + this.cardType.add(CardType.CREATURE); + this.subtype.add(SubType.DRAGON); + + this.addAbility(FlyingAbility.getInstance()); + } + + public KaroxBladewingDragonToken(final KaroxBladewingDragonToken token) { + super(token); + } + + @Override + public KaroxBladewingDragonToken copy() { + return new KaroxBladewingDragonToken(this); + } +}