Merge branch 'master' into war-of-the-spark

This commit is contained in:
Thomas Winwood 2019-04-01 18:34:27 +01:00 committed by GitHub
commit fdea72aecd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 451 additions and 1 deletions

View file

@ -0,0 +1,49 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.keyword.ScryEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BurningProphet extends CardImpl {
public BurningProphet(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(1);
this.toughness = new MageInt(3);
// Whenever you cast a noncreature spell, Burning Prophet gets +1/+0 until end of turn, then scry 1.
Ability ability = new SpellCastControllerTriggeredAbility(
new BoostSourceEffect(
1, 0, Duration.EndOfTurn
).setText("{this} gets +1/+0 until end of turn, then"),
StaticFilters.FILTER_SPELL_NON_CREATURE, false
);
ability.addEffect(new ScryEffect(1));
this.addAbility(ability);
}
private BurningProphet(final BurningProphet card) {
super(card);
}
@Override
public BurningProphet copy() {
return new BurningProphet(this);
}
}

View file

@ -0,0 +1,41 @@
package mage.cards.d;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.CantBeCounteredSourceEffect;
import mage.abilities.effects.common.CounterTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.target.TargetSpell;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DovinsVeto extends CardImpl {
public DovinsVeto(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}{U}");
// This spell can't be countered.
this.addAbility(new SimpleStaticAbility(
Zone.STACK, new CantBeCounteredSourceEffect()
).setRuleAtTheTop(true));
// Counter target noncreature spell.
this.getSpellAbility().addEffect(new CounterTargetEffect());
this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_NON_CREATURE));
}
private DovinsVeto(final DovinsVeto card) {
super(card);
}
@Override
public DovinsVeto copy() {
return new DovinsVeto(this);
}
}

View file

@ -0,0 +1,45 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
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 ErraticVisionary extends CardImpl {
public ErraticVisionary(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(1);
this.toughness = new MageInt(3);
// {1}{U}, {T}: Draw a card, then discard a card.
Ability ability = new SimpleActivatedAbility(
new DrawDiscardControllerEffect(), new ManaCostsImpl("{1}{U}")
);
ability.addCost(new TapSourceCost());
this.addAbility(ability);
}
private ErraticVisionary(final ErraticVisionary card) {
super(card);
}
@Override
public ErraticVisionary copy() {
return new ErraticVisionary(this);
}
}

View file

@ -0,0 +1,36 @@
package mage.cards.h;
import mage.abilities.costs.common.DiscardCardCost;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.keyword.AmassEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class HonorTheGodPharaoh extends CardImpl {
public HonorTheGodPharaoh(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}");
// As an additional cost to cast this spell, discard a card.
this.getSpellAbility().addCost(new DiscardCardCost(false));
// Draw two cards. Amass 1.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2).setText("draw two cards."));
this.getSpellAbility().addEffect(new AmassEffect(1));
}
private HonorTheGodPharaoh(final HonorTheGodPharaoh card) {
super(card);
}
@Override
public HonorTheGodPharaoh copy() {
return new HonorTheGodPharaoh(this);
}
}

View file

@ -0,0 +1,40 @@
package mage.cards.k;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.counter.ProliferateEffect;
import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class KarnsBastion extends CardImpl {
public KarnsBastion(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// {T}: Add {C}.
this.addAbility(new ColorlessManaAbility());
// {4}, {T}: Proliferate.
Ability ability = new SimpleActivatedAbility(new ProliferateEffect(), new GenericManaCost(4));
ability.addCost(new TapSourceCost());
this.addAbility(ability);
}
private KarnsBastion(final KarnsBastion card) {
super(card);
}
@Override
public KarnsBastion copy() {
return new KarnsBastion(this);
}
}

View file

@ -0,0 +1,57 @@
package mage.cards.k;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.UntapTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.PowerPredicate;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class KioraBehemothBeckoner extends CardImpl {
private static final FilterPermanent filter
= new FilterCreaturePermanent("a creature with power 4 or greater");
static {
filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 3));
}
public KioraBehemothBeckoner(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{G/U}");
this.addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.KIORA);
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(7));
// Whenever a creature with power 4 or greater enters the battlefield under your control, draw a card.
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), filter, false
));
// -1: Untap target permanent.
Ability ability = new LoyaltyAbility(new UntapTargetEffect(), -1);
ability.addTarget(new TargetPermanent());
this.addAbility(ability);
}
private KioraBehemothBeckoner(final KioraBehemothBeckoner card) {
super(card);
}
@Override
public KioraBehemothBeckoner copy() {
return new KioraBehemothBeckoner(this);
}
}

View file

@ -0,0 +1,33 @@
package mage.cards.n;
import mage.MageInt;
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 NagaEternal extends CardImpl {
public NagaEternal(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
this.subtype.add(SubType.ZOMBIE);
this.subtype.add(SubType.NAGA);
this.power = new MageInt(3);
this.toughness = new MageInt(2);
}
private NagaEternal(final NagaEternal card) {
super(card);
}
@Override
public NagaEternal copy() {
return new NagaEternal(this);
}
}

View file

@ -0,0 +1,61 @@
package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.keyword.ScryEffect;
import mage.abilities.keyword.HasteAbility;
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.filter.StaticFilters;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SamutTyrantSmasher extends CardImpl {
public SamutTyrantSmasher(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{R/G}{R/G}");
this.addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.SAMUT);
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5));
// Creatures you control have haste.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
HasteAbility.getInstance(), Duration.WhileOnBattlefield,
StaticFilters.FILTER_PERMANENT_CREATURES
)));
// -1: Target creature gets +2/+1 and gains haste until end of turn. Scry 1.
Ability ability = new LoyaltyAbility(new BoostTargetEffect(
2, 1, Duration.EndOfTurn
).setText("target creature gets +2/+1"), -1);
ability.addEffect(new GainAbilityTargetEffect(
HasteAbility.getInstance(), Duration.EndOfTurn
).setText("and gains haste until end of turn."));
ability.addEffect(new ScryEffect(1));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
private SamutTyrantSmasher(final SamutTyrantSmasher card) {
super(card);
}
@Override
public SamutTyrantSmasher copy() {
return new SamutTyrantSmasher(this);
}
}

View file

@ -0,0 +1,42 @@
package mage.cards.s;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.keyword.ScryEffect;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SamutsSprint extends CardImpl {
public SamutsSprint(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}");
// Target creature gets +2/+1 and gains haste until end of turn. Scry 1.
this.getSpellAbility().addEffect(new BoostTargetEffect(
2, 1, Duration.EndOfTurn
).setText("target creature gets +2/+1"));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(
HasteAbility.getInstance(), Duration.EndOfTurn
).setText("and gains haste until end of turn."));
this.getSpellAbility().addEffect(new ScryEffect(1));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
private SamutsSprint(final SamutsSprint card) {
super(card);
}
@Override
public SamutsSprint copy() {
return new SamutsSprint(this);
}
}

View file

@ -0,0 +1,38 @@
package mage.cards.w;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.effects.common.counter.ProliferateEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class WanderersStrike extends CardImpl {
public WanderersStrike(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W}");
// Exile target creature, then proliferate.
this.getSpellAbility().addEffect(new ExileTargetEffect());
this.getSpellAbility().addEffect(new ProliferateEffect().setText(
"then proliferate <i>(Choose any number of permanents and/or players, " +
"then give each another counter of each kind already there.)</i>"
));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
private WanderersStrike(final WanderersStrike card) {
super(card);
}
@Override
public WanderersStrike copy() {
return new WanderersStrike(this);
}
}

View file

@ -31,7 +31,7 @@ public final class WarOfTheSpark extends ExpansionSet {
cards.add(new SetCardInfo("Burning Prophet", 117, Rarity.COMMON, mage.cards.b.BurningProphet.class));
cards.add(new SetCardInfo("Cruel Celebrant", 188, Rarity.UNCOMMON, mage.cards.c.CruelCelebrant.class));
cards.add(new SetCardInfo("Crush Dissent", 47, Rarity.COMMON, mage.cards.c.CrushDissent.class));
cards.add(new SetCardInfo("Dovin's Veto", 193, Rarity.UNCOMMON, mage.cards.d.DovinsVeto.class));
cards.add(new SetCardInfo("Dovin's Veto", 193, Rarity.COMMON, mage.cards.d.DovinsVeto.class));
cards.add(new SetCardInfo("Dreadhorde Invasion", 86, Rarity.RARE, mage.cards.d.DreadhordeInvasion.class));
cards.add(new SetCardInfo("Emergence Zone", 245, Rarity.UNCOMMON, mage.cards.e.EmergenceZone.class));
cards.add(new SetCardInfo("Erratic Visionary", 48, Rarity.COMMON, mage.cards.e.ErraticVisionary.class));
@ -40,6 +40,7 @@ public final class WarOfTheSpark extends ExpansionSet {
cards.add(new SetCardInfo("Forest", 263, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 264, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Herald of the Dreadhorde", 93, Rarity.COMMON, mage.cards.h.HeraldOfTheDreadhorde.class));
cards.add(new SetCardInfo("Honor the God-Pharaoh", 132, Rarity.COMMON, mage.cards.h.HonorTheGodPharaoh.class));
cards.add(new SetCardInfo("Ignite the Beacon", 18, Rarity.RARE, mage.cards.i.IgniteTheBeacon.class));
cards.add(new SetCardInfo("Interplanar Beacon", 247, Rarity.UNCOMMON, mage.cards.i.InterplanarBeacon.class));
cards.add(new SetCardInfo("Invade the City", 201, Rarity.UNCOMMON, mage.cards.i.InvadeTheCity.class));
@ -47,10 +48,13 @@ public final class WarOfTheSpark extends ExpansionSet {
cards.add(new SetCardInfo("Island", 254, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 255, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Jace, Wielder of Mysteries", 54, Rarity.RARE, mage.cards.j.JaceWielderOfMysteries.class));
cards.add(new SetCardInfo("Karn's Bastion", 248, Rarity.RARE, mage.cards.k.KarnsBastion.class));
cards.add(new SetCardInfo("Kiora, Behemoth Beckoner", 232, Rarity.UNCOMMON, mage.cards.k.KioraBehemothBeckoner.class));
cards.add(new SetCardInfo("Liliana, Dreadhorde General", 97, Rarity.MYTHIC, mage.cards.l.LilianaDreadhordeGeneral.class));
cards.add(new SetCardInfo("Mountain", 259, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 260, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 261, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Naga Eternal", 60, Rarity.COMMON, mage.cards.n.NagaEternal.class));
cards.add(new SetCardInfo("No Escape", 63, Rarity.COMMON, mage.cards.n.NoEscape.class));
cards.add(new SetCardInfo("Ob Nixilis's Cruelty", 101, Rarity.COMMON, mage.cards.o.ObNixilissCruelty.class));
cards.add(new SetCardInfo("Ob Nixilis, the Hate-Twisted", 100, Rarity.UNCOMMON, mage.cards.o.ObNixilisTheHateTwisted.class));
@ -60,6 +64,8 @@ public final class WarOfTheSpark extends ExpansionSet {
cards.add(new SetCardInfo("Plains", 252, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ravnica at War", 28, Rarity.RARE, mage.cards.r.RavnicaAtWar.class));
cards.add(new SetCardInfo("Relentless Advance", 64, Rarity.COMMON, mage.cards.r.RelentlessAdvance.class));
cards.add(new SetCardInfo("Samut's Sprint", 142, Rarity.COMMON, mage.cards.s.SamutsSprint.class));
cards.add(new SetCardInfo("Samut, Tyrant Smasher", 235, Rarity.UNCOMMON, mage.cards.s.SamutTyrantSmasher.class));
cards.add(new SetCardInfo("Swamp", 256, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 257, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 258, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
@ -69,6 +75,7 @@ public final class WarOfTheSpark extends ExpansionSet {
cards.add(new SetCardInfo("Time Wipe", 223, Rarity.RARE, mage.cards.t.TimeWipe.class));
cards.add(new SetCardInfo("Vraska's Finisher", 112, Rarity.COMMON, mage.cards.v.VraskasFinisher.class));
cards.add(new SetCardInfo("Vraska, Swarm's Eminence", 236, Rarity.UNCOMMON, mage.cards.v.VraskaSwarmsEminence.class));
cards.add(new SetCardInfo("Wanderer's Strike", 38, Rarity.COMMON, mage.cards.w.WanderersStrike.class));
cards.add(new SetCardInfo("Widespread Brutality", 226, Rarity.RARE, mage.cards.w.WidespreadBrutality.class));
}
}

View file

@ -34852,6 +34852,7 @@ The Haunt of Hightower|Ravnica Allegiance|273|M|{4}{B}{B}|Legendary Creature - V
Serra the Benevolent|Modern Horizons|26|M|{2}{W}{W}|Legendary Planeswalker - Serra|4|+2: Creatures you control with flying get +1/+1 until end of turn.$-3: Create a 4/4 white Angel creature token with flying and vigilance.$-6: You get an emblem with "If you control a creature, damage that would reduce your life total to less than 1 reduces it to 1 instead."|
Cabal Therapist|Modern Horizons|80|R|{B}|Creature - Horror|1|1|Menace$At the beginning of your precombat main phase, you may sacrifice a creature. When you do, choose a nonland card name, then target player reveals their hand and discards all cards with that name.|
Ajani's Pridemate|War of the Spark|4|U|{1}{W}|Creature - Cat Soldier|2|2|Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate.|
Gideon's Triumph|War of the Spark|15|U|{1}{W}|Instant|||Target opponent sacrifices a creature that attacked or blocked this turn. If you control a Gideon planeswalker, that player sacrifices two of those creatures instead.|
Ignite the Beacon|War of the Spark|18|R|{4}{W}|Instant|||Search your library for up to to two planeswalker cards, reveal them, put them into your hand, then shuffle your library.|
Ravnica at War|War of the Spark|28|R|{3}{W}|Sorcery|||Exile all multicolored permanents.|
Rising Populace|War of the Spark|29|C|{2}{W}|Creature - Human|2|2|Whenever another creature or planeswalker you control dies, put a +1/+1 counter on Rising Populace.|