From 882060bf3e420524ebcbda31921521ea0d52757b Mon Sep 17 00:00:00 2001 From: spacemoses Date: Sun, 18 Jun 2017 18:44:59 -0500 Subject: [PATCH 001/160] Enhancement #3222 - Adding scroll to clipboard import in deck builder --- .../mage/client/deckeditor/DeckImportFromClipboardDialog.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckImportFromClipboardDialog.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckImportFromClipboardDialog.java index e0704958d2..1eeb251ad4 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckImportFromClipboardDialog.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckImportFromClipboardDialog.java @@ -141,7 +141,8 @@ public class DeckImportFromClipboardDialog extends JDialog { txtDeckList.setMinimumSize(new Dimension(250, 400)); txtDeckList.setPreferredSize(new Dimension(550, 400)); txtDeckList.setText("// Example:\n//1 Library of Congress\n//1 Cryptic Gateway\n//1 Azami, Lady of Scrolls\n// NB: This is slow as, and will lock your screen :)"); - panel3.add(txtDeckList, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, + JScrollPane txtScrollableDeckList = new JScrollPane(txtDeckList); + panel3.add(txtScrollableDeckList, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); } From ae640ee0b7db61db96fb6441428b440840937f02 Mon Sep 17 00:00:00 2001 From: igoudt Date: Sat, 24 Jun 2017 00:28:34 +0200 Subject: [PATCH 002/160] refactor duplicate code for playing lands from grave --- .../src/mage/cards/c/CrucibleOfWorlds.java | 54 ++--------------- .../src/mage/cards/r/RamunapExcavator.java | 59 ++----------------- .../common/PlayLandFromGraveyardAbility.java | 11 ++++ .../PlayLandsFromGraveyardEffect.java | 49 +++++++++++++++ 4 files changed, 68 insertions(+), 105 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/common/PlayLandFromGraveyardAbility.java create mode 100644 Mage/src/main/java/mage/abilities/effects/common/ruleModifying/PlayLandsFromGraveyardEffect.java diff --git a/Mage.Sets/src/mage/cards/c/CrucibleOfWorlds.java b/Mage.Sets/src/mage/cards/c/CrucibleOfWorlds.java index 225c14bc19..a08b4ba8ca 100644 --- a/Mage.Sets/src/mage/cards/c/CrucibleOfWorlds.java +++ b/Mage.Sets/src/mage/cards/c/CrucibleOfWorlds.java @@ -27,16 +27,12 @@ */ package mage.cards.c; -import mage.abilities.Ability; -import mage.abilities.PlayLandAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.cards.Card; +import mage.abilities.effects.common.ruleModifying.PlayLandsFromGraveyardEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.game.Game; -import mage.players.Player; +import mage.constants.CardType; +import mage.constants.Zone; import java.util.UUID; @@ -50,7 +46,7 @@ public class CrucibleOfWorlds extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}"); // You may play land cards from your graveyard. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CrucibleOfWorldsEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayLandsFromGraveyardEffect())); } public CrucibleOfWorlds(final CrucibleOfWorlds card) { @@ -62,45 +58,3 @@ public class CrucibleOfWorlds extends CardImpl { return new CrucibleOfWorlds(this); } } - -class CrucibleOfWorldsEffect extends ContinuousEffectImpl { - - public CrucibleOfWorldsEffect() { - super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); - this.staticText = "You may play land cards from your graveyard"; - } - - public CrucibleOfWorldsEffect(final CrucibleOfWorldsEffect effect) { - super(effect); - } - - @Override - public CrucibleOfWorldsEffect copy() { - return new CrucibleOfWorldsEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - for (UUID cardId: player.getGraveyard()) { - Card card = game.getCard(cardId); - if(card != null && card.isLand()){ - PlayLandFromGraveyardAbility ability = new PlayLandFromGraveyardAbility(card.getName()); - ability.setSourceId(cardId); - ability.setControllerId(card.getOwnerId()); - game.getState().addOtherAbility(card, ability); - } - } - return true; - } - return false; - } -} - -class PlayLandFromGraveyardAbility extends PlayLandAbility{ - PlayLandFromGraveyardAbility(String name){ - super(name); - zone = Zone.GRAVEYARD; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/r/RamunapExcavator.java b/Mage.Sets/src/mage/cards/r/RamunapExcavator.java index eada850b49..f6e2318437 100644 --- a/Mage.Sets/src/mage/cards/r/RamunapExcavator.java +++ b/Mage.Sets/src/mage/cards/r/RamunapExcavator.java @@ -27,26 +27,17 @@ */ package mage.cards.r; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.PlayLandAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.cards.Card; +import mage.abilities.effects.common.ruleModifying.PlayLandsFromGraveyardEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; import mage.constants.Zone; -import mage.game.Game; -import mage.players.Player; + +import java.util.UUID; /** - * * @author fireshoes */ public class RamunapExcavator extends CardImpl { @@ -60,7 +51,7 @@ public class RamunapExcavator extends CardImpl { this.toughness = new MageInt(3); // You may play land cards from your graveyard. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new RamunapExcavatorEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new PlayLandsFromGraveyardEffect())); } public RamunapExcavator(final RamunapExcavator card) { @@ -71,46 +62,4 @@ public class RamunapExcavator extends CardImpl { public RamunapExcavator copy() { return new RamunapExcavator(this); } -} - -class RamunapExcavatorEffect extends ContinuousEffectImpl { - - public RamunapExcavatorEffect() { - super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); - this.staticText = "You may play land cards from your graveyard"; - } - - public RamunapExcavatorEffect(final RamunapExcavatorEffect effect) { - super(effect); - } - - @Override - public RamunapExcavatorEffect copy() { - return new RamunapExcavatorEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - for (UUID cardId: player.getGraveyard()) { - Card card = game.getCard(cardId); - if(card != null && card.isLand()){ - PlayLandFromGraveyardAbility ability = new PlayLandFromGraveyardAbility(card.getName()); - ability.setSourceId(cardId); - ability.setControllerId(card.getOwnerId()); - game.getState().addOtherAbility(card, ability); - } - } - return true; - } - return false; - } -} - -class PlayLandFromGraveyardAbility extends PlayLandAbility{ - PlayLandFromGraveyardAbility(String name){ - super(name); - zone = Zone.GRAVEYARD; - } } \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/common/PlayLandFromGraveyardAbility.java b/Mage/src/main/java/mage/abilities/common/PlayLandFromGraveyardAbility.java new file mode 100644 index 0000000000..b4c2aefa59 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/PlayLandFromGraveyardAbility.java @@ -0,0 +1,11 @@ +package mage.abilities.common; + +import mage.abilities.PlayLandAbility; +import mage.constants.Zone; + +public class PlayLandFromGraveyardAbility extends PlayLandAbility { + public PlayLandFromGraveyardAbility(String name){ + super(name); + zone = Zone.GRAVEYARD; + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/PlayLandsFromGraveyardEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/PlayLandsFromGraveyardEffect.java new file mode 100644 index 0000000000..cb1000ed73 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/PlayLandsFromGraveyardEffect.java @@ -0,0 +1,49 @@ +package mage.abilities.effects.common.ruleModifying; + +import mage.abilities.Ability; +import mage.abilities.common.PlayLandFromGraveyardAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.cards.Card; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.game.Game; +import mage.players.Player; + +import java.util.UUID; + +public class PlayLandsFromGraveyardEffect extends ContinuousEffectImpl { + + public PlayLandsFromGraveyardEffect() { + super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + this.staticText = "You may play land cards from your graveyard"; + } + + public PlayLandsFromGraveyardEffect(final PlayLandsFromGraveyardEffect effect) { + super(effect); + } + + @Override + public PlayLandsFromGraveyardEffect copy() { + return new PlayLandsFromGraveyardEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + for (UUID cardId: player.getGraveyard()) { + Card card = game.getCard(cardId); + if(card != null && card.isLand()){ + PlayLandFromGraveyardAbility ability = new PlayLandFromGraveyardAbility(card.getName()); + ability.setSourceId(cardId); + ability.setControllerId(card.getOwnerId()); + game.getState().addOtherAbility(card, ability); + } + } + return true; + } + return false; + } +} From 5bcaafd7383f0de910d7a171bc71895fadfa9d1e Mon Sep 17 00:00:00 2001 From: igoudt Date: Sat, 24 Jun 2017 01:13:42 +0200 Subject: [PATCH 003/160] implemented Afflict + simple HOU cards --- .../src/mage/cards/a/AdornedPouncer.java | 33 ++++++++++++++ Mage.Sets/src/mage/cards/k/KhenraEternal.java | 32 ++++++++++++++ .../src/mage/cards/p/ProvenCombatant.java | 37 ++++++++++++++++ .../src/mage/cards/s/SinuousStriker.java | 40 +++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 4 ++ .../cards/abilities/keywords/AfflictTest.java | 43 +++++++++++++++++++ .../abilities/keyword/AfflictAbility.java | 24 +++++++++++ 7 files changed, 213 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AdornedPouncer.java create mode 100644 Mage.Sets/src/mage/cards/k/KhenraEternal.java create mode 100644 Mage.Sets/src/mage/cards/p/ProvenCombatant.java create mode 100644 Mage.Sets/src/mage/cards/s/SinuousStriker.java create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java create mode 100644 Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java diff --git a/Mage.Sets/src/mage/cards/a/AdornedPouncer.java b/Mage.Sets/src/mage/cards/a/AdornedPouncer.java new file mode 100644 index 0000000000..d40fcd32a4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AdornedPouncer.java @@ -0,0 +1,33 @@ +package mage.cards.a; + +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.abilities.keyword.EternalizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +public class AdornedPouncer extends CardImpl{ + + public AdornedPouncer(UUID ownerId, CardSetInfo cardSetInfo){ + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + subtype.add("Cat"); + + //double strike + addAbility(DoubleStrikeAbility.getInstance()); + + //eternalize 3WW + addAbility(new EternalizeAbility(new ManaCostsImpl("{3}{W}{W}"), this)); + } + + public AdornedPouncer(AdornedPouncer adornedPouncer){ + super(adornedPouncer); + } + + public AdornedPouncer copy(){ + return new AdornedPouncer(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KhenraEternal.java b/Mage.Sets/src/mage/cards/k/KhenraEternal.java new file mode 100644 index 0000000000..0a6fd8ab01 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KhenraEternal.java @@ -0,0 +1,32 @@ +package mage.cards.k; + +import mage.MageInt; +import mage.abilities.keyword.AfflictAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +public class KhenraEternal extends CardImpl { + + public KhenraEternal(UUID ownerId, CardSetInfo cardSetInfo){ + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + subtype.add("Zombie"); + subtype.add("Jackal"); + subtype.add("Warrior"); + power = new MageInt(2); + toughness = new MageInt(2); + + addAbility(new AfflictAbility(1)); + + } + + public KhenraEternal(final KhenraEternal khenraEternal){ + super(khenraEternal); + } + + public KhenraEternal copy(){ + return new KhenraEternal(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/ProvenCombatant.java b/Mage.Sets/src/mage/cards/p/ProvenCombatant.java new file mode 100644 index 0000000000..ce4d4f6a79 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/ProvenCombatant.java @@ -0,0 +1,37 @@ +package mage.cards.p; + +import mage.MageInt; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.EternalizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +public class ProvenCombatant extends CardImpl { + + public ProvenCombatant(UUID ownerId, CardSetInfo cardSetInfo){ + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{U}"); + + + subtype.add("Human"); + subtype.add("Warrior"); + + power = new MageInt(1); + toughness = new MageInt(1); + + //Eternalize 4UU + addAbility(new EternalizeAbility(new ManaCostsImpl("{4}{U}{U}"), this)); + } + + public ProvenCombatant(final ProvenCombatant provenCombatant){ + super(provenCombatant); + } + + public ProvenCombatant copy(){ + return new ProvenCombatant(this); + } + + +} diff --git a/Mage.Sets/src/mage/cards/s/SinuousStriker.java b/Mage.Sets/src/mage/cards/s/SinuousStriker.java new file mode 100644 index 0000000000..e5ec07bbce --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SinuousStriker.java @@ -0,0 +1,40 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.EternalizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; + +import java.util.UUID; + +public class SinuousStriker extends CardImpl { + + public SinuousStriker(UUID ownerId, CardSetInfo cardSetInfo){ + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + subtype.add("Naga"); + subtype.add("Warrior"); + + power = new MageInt(2); + toughness = new MageInt(2); + + //U : Sinious Striker gets +1/-1 until end of turn + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(+1, -1, Duration.EndOfTurn), new ManaCostsImpl("{U}"))); + + //Eternalize 3UU + this.addAbility(new EternalizeAbility(new ManaCostsImpl("{3}{U}{U}"), this)); + } + + public SinuousStriker(final SinuousStriker sinuousStriker){ + super(sinuousStriker); + } + + public SinuousStriker copy(){ + return new SinuousStriker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index a0e2177b07..cb6afcdc91 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -65,6 +65,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Abrade", 83, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); + cards.add(new SetCardInfo("Adorned Pouncer", 3, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); @@ -75,12 +76,15 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); + cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); cards.add(new SetCardInfo("Nicol Bolas, God-Pharoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharoh.class)); cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); + cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); + cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java new file mode 100644 index 0000000000..05296b70f8 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java @@ -0,0 +1,43 @@ +package org.mage.test.cards.abilities.keywords; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class AfflictTest extends CardTestPlayerBase { + + private String khenra = "Khenra Eternal"; + private String elves = "Llanowar Elves"; + + @Test + public void testBecomesBlocked(){ + + addCard(Zone.BATTLEFIELD, playerA, khenra); + addCard(Zone.BATTLEFIELD, playerB, elves ); + + attack(1, playerA, khenra); + block(1, playerB, elves, khenra); + + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertLife(playerB, 19); + + } + + @Test + public void testNotBlocked(){ + + addCard(Zone.BATTLEFIELD, playerA, khenra); + addCard(Zone.BATTLEFIELD, playerB, elves ); + + attack(1, playerA, khenra); + + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertLife(playerB, 18); + + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java b/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java new file mode 100644 index 0000000000..c641d22d5b --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java @@ -0,0 +1,24 @@ +package mage.abilities.keyword; + +import mage.abilities.common.BecomesBlockedTriggeredAbility; +import mage.abilities.effects.common.LoseLifeDefendingPlayerEffect; + +public class AfflictAbility extends BecomesBlockedTriggeredAbility { + + private int lifeLoss; + + @Override + public AfflictAbility copy() { + return new AfflictAbility(this); + } + + public AfflictAbility(int amount){ + super(new LoseLifeDefendingPlayerEffect(amount, true), false); + } + + public AfflictAbility(final AfflictAbility afflictAbility){ + super(afflictAbility); + lifeLoss = afflictAbility.lifeLoss; + } + +} From f04a95c63bbce505e53b8fbd7d4444803c010902 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 24 Jun 2017 17:54:41 +1000 Subject: [PATCH 004/160] Implement Solemnity (HOU) --- Mage.Sets/src/mage/cards/s/Solemnity.java | 153 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + Utils/mtg-cards-data.txt | 3 +- 3 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/s/Solemnity.java diff --git a/Mage.Sets/src/mage/cards/s/Solemnity.java b/Mage.Sets/src/mage/cards/s/Solemnity.java new file mode 100644 index 0000000000..701edbe7b2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/Solemnity.java @@ -0,0 +1,153 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author spjspj + */ +public class Solemnity extends CardImpl { + + public Solemnity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + + // Players can't get counters. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SolemnityEffect())); + + // Counters can't be put on artifacts, creatures, enchantments or lands. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SolemnityEffect2())); + } + + public Solemnity(final Solemnity card) { + super(card); + } + + @Override + public Solemnity copy() { + return new Solemnity(this); + } +} + +class SolemnityEffect extends ReplacementEffectImpl { + + public SolemnityEffect() { + super(Duration.WhileOnBattlefield, Outcome.Benefit); + staticText = "Players can't get counters"; + } + + public SolemnityEffect(final SolemnityEffect effect) { + super(effect); + } + + @Override + public SolemnityEffect copy() { + return new SolemnityEffect(this); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + return true; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == EventType.ADD_COUNTER; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Player player = game.getPlayer(event.getTargetId()); + return player != null; + } +} + +class SolemnityEffect2 extends ReplacementEffectImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifacts, creatures, enchantments or lands"); + + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.ENCHANTMENT), + new CardTypePredicate(CardType.LAND))); + } + + public SolemnityEffect2() { + super(Duration.WhileOnBattlefield, Outcome.Benefit); + staticText = "Counters can't be put on artifacts, creatures, enchantments or lands"; + } + + public SolemnityEffect2(final SolemnityEffect2 effect) { + super(effect); + } + + @Override + public SolemnityEffect2 copy() { + return new SolemnityEffect2(this); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + return true; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == EventType.ADD_COUNTER; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + MageObject object = game.getObject(event.getTargetId()); + if (object instanceof Permanent && filter.match((Permanent) object, game)) { + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index cb6afcdc91..0704217560 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -85,6 +85,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); + cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 36970034a2..71dc11c420 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31666,6 +31666,7 @@ Desert of the Mindful|Hour of Devastation|173|C||Land - Desert|||Desert of the M Desert of the True|Hour of Devastation|174|C||Land - Desert|||Desert of the True enters the battlefield tapped.${T}: Add {W} to your mana pool.$Cycling {1}{W}| Nissa, Genesis Mage|Hour of Devastation|200|M|{5}{G}{G}|Planeswalker - Nissa|||+2: Untap up to two target creatures and up to two target lands.$-3: Target creature gets +5/+5 until end of turn.$-10: Look at the top ten cards of your library. You may put any number of creature and/or land cards from among them onto the battlefield. Put the rest on the bottom of your library in a random order.| Nicol Bolas, the Deceiver|Hour of Devastation|205|M|{5}{U}{B}{R}|Planeswalker - Bolas|||+3: Each opponent loses 3 life unless that player sacrifices a nonland permanent or discards a card.$-3: Destroy target creature. Draw a card.$-11: Nicol Bolas, the Deceiver deals 7 damage to each opponent. You draw seven cards.| +Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counters.$Counters can't be put on artifacts, creatures, enchantments or lands.| Arcane Adaptation|Ixalan|44|R|{2}{U}|Enchantment|||As Arcane Adaptation enters the battlefield, choose a creature type.$Creatures you control are the chosen type in addition to their other types. The same is true for creature spells you control and creature cards you own that aren't on the battlefield.| Ashes of the Abhorrent|Ixalan|???|R|{1}{W}|Enchantment|||Players can't cast spells from graveyards or activate abilities from graveyards.$Whenever a creature dies, you gain 1 life.| Bishop of Rebirth|Ixalan|???|R|Creature - Vampire Cleric|3|4|Vigilance$Whenever Bishop of Rebirth attacks, you may return target creature card with converted mana cost 3 or less from your graveyard to the battlefield.| @@ -31699,4 +31700,4 @@ Dragonskull Summit|Ixalan|???|R||Land|||Dragonskull Summit enters the battlefiel Drowned Catacomb|Ixalan|???|R||Land|||Drowned Catacomb enters the battlefield tapped unless you control an Island or a Swamp.${T}: Add {U} or {B} to your mana pool.| Glacial Fortress|Ixalan|???|R||Land|||Glacial Fortress enters the battlefield tapped unless you control a Plains or an Island.${T}: Add {W} or {U} to your mana pool.| Rootbound Crag|Ixalan|???|R||Land|||Rootbound Crag enters the battlefield tapped unless you control a Mountain or a Forest.${T}: Add {R} or {G} to your mana pool.| -Sunpetal Grove|Ixalan|???|R||Land|||Sunpetal Grove enters the battlefield tapped unless you control a Forest or a Plains.${T}: Add {G} or {W} to your mana pool.| \ No newline at end of file +Sunpetal Grove|Ixalan|???|R||Land|||Sunpetal Grove enters the battlefield tapped unless you control a Forest or a Plains.${T}: Add {G} or {W} to your mana pool.| From 7c90bbdd59c52cb7f7d5163966b98267f2733c0b Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 24 Jun 2017 18:32:32 +1000 Subject: [PATCH 005/160] Implement Bontu's Last Reckoning (HOU) --- .../src/mage/cards/b/BontusLastReckoning.java | 107 ++++++++++++++++++ ...dPharoh.java => NicolBolasGodPharaoh.java} | 48 ++++---- .../src/mage/sets/HourOfDevastation.java | 3 +- 3 files changed, 133 insertions(+), 25 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/b/BontusLastReckoning.java rename Mage.Sets/src/mage/cards/n/{NicolBolasGodPharoh.java => NicolBolasGodPharaoh.java} (84%) diff --git a/Mage.Sets/src/mage/cards/b/BontusLastReckoning.java b/Mage.Sets/src/mage/cards/b/BontusLastReckoning.java new file mode 100644 index 0000000000..b8cbfb46d1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BontusLastReckoning.java @@ -0,0 +1,107 @@ +/* + * 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.b; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.common.FilterLandPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTargets; + +/** + * + * @author spjspj + */ +public class BontusLastReckoning extends CardImpl { + + public BontusLastReckoning(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}{B}"); + + // Destroy all creatures. Lands you control don't untap during your next untap step. + this.getSpellAbility().addEffect(new DestroyAllEffect(new FilterCreaturePermanent())); + this.getSpellAbility().addEffect(new BontusLastReckoningEffect()); + } + + public BontusLastReckoning(final BontusLastReckoning card) { + super(card); + } + + @Override + public BontusLastReckoning copy() { + return new BontusLastReckoning(this); + } +} + +class BontusLastReckoningEffect extends OneShotEffect { + + BontusLastReckoningEffect() { + super(Outcome.Detriment); + this.staticText = "Lands you control don't untap during your next untap step."; + } + + BontusLastReckoningEffect(final BontusLastReckoningEffect effect) { + super(effect); + } + + @Override + public BontusLastReckoningEffect copy() { + return new BontusLastReckoningEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + List doNotUntapNextUntapStep = new ArrayList<>(); + for (Permanent land : game.getBattlefield().getAllActivePermanents(new FilterLandPermanent(), controller.getId(), game)) { + doNotUntapNextUntapStep.add(land); + } + if (!doNotUntapNextUntapStep.isEmpty()) { + ContinuousEffect effect = new DontUntapInControllersNextUntapStepTargetEffect("", controller.getId()); + effect.setText("Lands you control don't untap during your next untap step"); + effect.setTargetPointer(new FixedTargets(doNotUntapNextUntapStep, game)); + game.addEffect(effect, source); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/n/NicolBolasGodPharoh.java b/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java similarity index 84% rename from Mage.Sets/src/mage/cards/n/NicolBolasGodPharoh.java rename to Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java index 4f20a18ceb..53cb20aa6b 100644 --- a/Mage.Sets/src/mage/cards/n/NicolBolasGodPharoh.java +++ b/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java @@ -66,28 +66,28 @@ import mage.target.targetpointer.FixedTarget; * * @author Will */ -public class NicolBolasGodPharoh extends CardImpl { +public class NicolBolasGodPharaoh extends CardImpl { private UUID exileId = UUID.randomUUID(); private static final FilterPermanent opponentsNonlandPermanentsFilter = new FilterNonlandPermanent("non-land permanents your opponents control"); static { opponentsNonlandPermanentsFilter.add(new ControllerPredicate(TargetController.OPPONENT)); } - public NicolBolasGodPharoh(UUID ownerId, CardSetInfo setInfo) { + public NicolBolasGodPharaoh(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{4}{U}{B}{R}"); this.subtype.add("Bolas"); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(7)); // +2: Target opponent exiles cards from the top of his or her library until he or she exiles a nonland card. Until end of turn, you may cast that card without paying its mana cost. - LoyaltyAbility ability = new LoyaltyAbility(new NicolBolasGodPharohPlusTwoEffect(exileId), 2); + LoyaltyAbility ability = new LoyaltyAbility(new NicolBolasGodPharaohPlusTwoEffect(exileId), 2); ability.addTarget(new TargetOpponent()); this.addAbility(ability); // +1: Each opponent exiles two cards from his or her hand. - this.addAbility(new LoyaltyAbility(new NicolBolasGodPharohPlusOneEffect(exileId), 1)); + this.addAbility(new LoyaltyAbility(new NicolBolasGodPharaohPlusOneEffect(exileId), 1)); - // -4: Nicol Bolas, God-Pharoh deals 7 damage to target creature or player. + // -4: Nicol Bolas, God-Pharaoh deals 7 damage to target creature or player. ability = new LoyaltyAbility(new DamageTargetEffect(7), -2); ability.addTarget(new TargetCreatureOrPlayer()); this.addAbility(ability); @@ -96,34 +96,34 @@ public class NicolBolasGodPharoh extends CardImpl { this.addAbility(new LoyaltyAbility(new ExileAllEffect(opponentsNonlandPermanentsFilter, exileId, this.getIdName()), -12)); } - public NicolBolasGodPharoh(final NicolBolasGodPharoh card) { + public NicolBolasGodPharaoh(final NicolBolasGodPharaoh card) { super(card); } @Override - public NicolBolasGodPharoh copy() { - return new NicolBolasGodPharoh(this); + public NicolBolasGodPharaoh copy() { + return new NicolBolasGodPharaoh(this); } } -class NicolBolasGodPharohPlusOneEffect extends OneShotEffect { +class NicolBolasGodPharaohPlusOneEffect extends OneShotEffect { private UUID exileId; - NicolBolasGodPharohPlusOneEffect(UUID exileId) { + NicolBolasGodPharaohPlusOneEffect(UUID exileId) { super(Outcome.Exile); this.exileId = exileId; this.staticText = "Each opponent exiles two cards from his or her hand."; } - NicolBolasGodPharohPlusOneEffect(final NicolBolasGodPharohPlusOneEffect effect) { + NicolBolasGodPharaohPlusOneEffect(final NicolBolasGodPharaohPlusOneEffect effect) { super(effect); this.exileId = effect.exileId; } @Override - public NicolBolasGodPharohPlusOneEffect copy() { - return new NicolBolasGodPharohPlusOneEffect(this); + public NicolBolasGodPharaohPlusOneEffect copy() { + return new NicolBolasGodPharaohPlusOneEffect(this); } @Override @@ -162,24 +162,24 @@ class NicolBolasGodPharohPlusOneEffect extends OneShotEffect { } } -class NicolBolasGodPharohPlusTwoEffect extends OneShotEffect { +class NicolBolasGodPharaohPlusTwoEffect extends OneShotEffect { private UUID exileId; - public NicolBolasGodPharohPlusTwoEffect(UUID exileId) { + public NicolBolasGodPharaohPlusTwoEffect(UUID exileId) { super(Outcome.Detriment); this.exileId = exileId; this.staticText = "Target opponent exiles cards from the top of his or her library until he or she exiles a nonland card. Until end of turn, you may cast that card without paying its mana cost"; } - public NicolBolasGodPharohPlusTwoEffect(final NicolBolasGodPharohPlusTwoEffect effect) { + public NicolBolasGodPharaohPlusTwoEffect(final NicolBolasGodPharaohPlusTwoEffect effect) { super(effect); this.exileId = effect.exileId; } @Override - public NicolBolasGodPharohPlusTwoEffect copy() { - return new NicolBolasGodPharohPlusTwoEffect(this); + public NicolBolasGodPharaohPlusTwoEffect copy() { + return new NicolBolasGodPharaohPlusTwoEffect(this); } @Override @@ -197,7 +197,7 @@ class NicolBolasGodPharohPlusTwoEffect extends OneShotEffect { } while (library.hasCards() && card != null && card.isLand()); if (card != null) { - ContinuousEffect effect = new NicolBolasGodPharohFromExileEffect(); + ContinuousEffect effect = new NicolBolasGodPharaohFromExileEffect(); effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); game.addEffect(effect, source); } @@ -207,14 +207,14 @@ class NicolBolasGodPharohPlusTwoEffect extends OneShotEffect { } } -class NicolBolasGodPharohFromExileEffect extends AsThoughEffectImpl { +class NicolBolasGodPharaohFromExileEffect extends AsThoughEffectImpl { - public NicolBolasGodPharohFromExileEffect() { + public NicolBolasGodPharaohFromExileEffect() { super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); staticText = "You may cast card from exile"; } - public NicolBolasGodPharohFromExileEffect(final NicolBolasGodPharohFromExileEffect effect) { + public NicolBolasGodPharaohFromExileEffect(final NicolBolasGodPharaohFromExileEffect effect) { super(effect); } @@ -224,8 +224,8 @@ class NicolBolasGodPharohFromExileEffect extends AsThoughEffectImpl { } @Override - public NicolBolasGodPharohFromExileEffect copy() { - return new NicolBolasGodPharohFromExileEffect(this); + public NicolBolasGodPharaohFromExileEffect copy() { + return new NicolBolasGodPharaohFromExileEffect(this); } @Override diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 0704217560..d2f4284b33 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -67,6 +67,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); cards.add(new SetCardInfo("Adorned Pouncer", 3, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); + cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); @@ -79,7 +80,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); - cards.add(new SetCardInfo("Nicol Bolas, God-Pharoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharoh.class)); + cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); From 442d8ebc7870b0fdb90fcb7fa8d07ac26c792544 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 24 Jun 2017 11:00:21 +0200 Subject: [PATCH 006/160] * Added HOU spoilers 2017-06-24. --- .../plugins/card/dl/sources/GathererSets.java | 3 +- Utils/mtg-cards-data.txt | 106 ++++++++++++++---- 2 files changed, 86 insertions(+), 23 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java index ab0f076114..41a6fb93dc 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java @@ -59,7 +59,8 @@ public class GathererSets implements Iterable { "BFZ", "OGW", "SOI", "EMN", "KLD", "AER", - "AKH", "HOU" + "AKH", "HOU", + "E01" }; private static final String[] onlyMythics = { diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 71dc11c420..78c53bd673 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31034,7 +31034,7 @@ Oashra Cultivator|Amonkhet|177|C|{G}|Creature - Human Druid|0|3|{2}{G}, {T}, Sac Ornery Kudu|Amonkhet|178|C|{2}{G}|Creature - Antelope|3|4|When Ornery Kudu enters the battlefield, put a -1/-1 counter on target creature you control.| Pouncing Cheetah|Amonkhet|179|C|{2}{G}|Creature - Cat|3|2|Flash| Prowling Serpopard|Amonkhet|180|R|{1}{G}{G}|Creature - Cat Snake|4|3|Prowling Serpopard can't be countered.$Creature spells you control can't be countered.| -Quarry Hauler|Amonkhet|181|C|{3}{G}|Creature - Camel|4|3|When Quarry Hauler enters the battlefield, for each kind of counter on target permanent, put another counter of that kind on it or remove one from it.| +Quarry Hauler|Amonkhet|181|C|{3}{G}|Creature - Camel|4|3|When Quarry Hauler enters the battlefield, for each kind of counter on target permanent, put another counter of that kind on it or remove one from it.| Rhonas the Indomitable|Amonkhet|182|M|{2}{G}|Legendary Creature - God|5|5|Deathtouch, indestructible$Rhonas, the Indomitable can't attack or block unless you control another creature with power 4 or greater.${2}{G}: Another target creature gets +2/+0 and gains trample until end of turn.| Sandwurm Convergence|Amonkhet|183|R|{6}{G}{G}|Enchantment|||Creatures with flying can't attack you or planeswalkers you control.$At the beginning of your end step, create a 5/5 green Wurm creature token.| Scaled Behemoth|Amonkhet|184|U|{4}{G}{G}|Creature - Crocodile|6|7|Hexproof| @@ -31628,37 +31628,99 @@ Mountain|Archenemy: Nicol Bolas|105|L||Basic Land - Mountain|||{T}: Add {R} to y Forest|Archenemy: Nicol Bolas|106|L||Basic Land - Forest|||{T}: Add {G} to your mana pool.| Adorned Pouncer|Hour of Devastation|2|R|{1}{W}|Creature - Cat|1|1|Double strike$Eternalize {3}{W}{W}| Angel of the God-Pharaoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2}| -Desert's Hold|Hour of Devastation|8|U|{2}{W}|Enchantment - Aura|||Enchant creature$When Desert's Hold enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life.$Enchant creature can't attack or block, and its activated abilities can't be activated.| +Adorned Pouncer|Hour of Devastation|002|R|{1}{W}|Creature - Cat|1|1|Double strike$Eternalize {3}{W}{W} ({3}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Cat with no mana cost. Eternalize only as a sorcery.)| +Angel of Condemnation|Hour of Devastation|3|R|{2}{W}{W}|Creature - Angel|3|3|Flying, vigilance${2}{W}, {T}: Exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step.${2}{W}, {T}, Exert Angel of Condemnation: Exile another target creature until Angel of Condemnation leaves the battlefield. (An exerted creature won't untap during your next untap step.)| +Angel of the God-Pharoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2} ({2}, Discard this card: Draw a card.)| +Desert's Hold|Hour of Devastation|8|U|{2}{W}|Enchantment - Aura|||Enchant creature$When Desert's Hold enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life.$Enchanted creature can't attack or block, and its activated abilities can't be activated.| +Djeru, With Eyes Open|Hour of Devastation|10|R|{3}{W}{W}|Legendary Creature - Human Warrior|4|3|Vigilance$When Djeru, With Eyes Open enters the battlefield, you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library.$If a source would deal damage to a planeswalker you control, prevent 1 of that damage.| Gideon's Defeat|Hour of Devastation|13|U|{W}|Instant|||Exile target white creature that's attacking or blocking. If it was a Gideon planeswalker, you gain 5 life.| Hour of Revelation|Hour of Devastation|15|R|{3}{W}{W}{W}|Sorcery|||Hour of Revelation costs {3} less to cast if there are ten or more nonland permanents on the battlefield.$Destroy all nonland permanents.| -Steadfast Sentinel|Hour of Devastation|24|C|{3}{W}|Creature - Human Cleric|2|3|Vigilance$Eternalize {4}{W}{W}| -Jace's Defeat|Hour of Devastation|38|U|{1}{U}|Instant|||Counter target blue spell. If it was a Jace planeswalker spell, scry 2.| -Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one — Counter target spell unless its controller pays {3}.; or Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| -Accursed Horde|Hour of Devastation|56|U|{3}{B}|Creature - Zombie|3|3|{1}{B}: Target attacking Zombie gains indestructible until end of turn.| +Oketra's Last Mercy|Hour of Devastation|18|R|{1}{W}{W}|Sorcery|||Your life total becomes your starting life total. Lands you control don't untap during your next untap phase| +Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counters.$Counters can't be put on artifacts, creatures, enchantments, or lands.| +Steadfast Sentinel|Hour of Devastation|24|C|{3}{W}|Creature - Human Cleric|2|3|Vigilance$Eternalize {4}{W}{W} ({4}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Cleric with no mana cost. Eternalize only as a sorcery.)| +Steward of Solidarity|Hour of Devastation|25|U|{1}{W}|Creature - Human Warrior|2|2|{T}, Exert Steward of Solidarity: Create a 1/1 white Warrior creature token with vigilance. (An exerted creature won't untap during your next untap step.)| +Vizier of the True|Hour of Devastation|28|U|{3}{W}|Creature - Human Cleric|3|2|You may exert Vizier of the True as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, tap target creature an opponent controls.| +Fraying Sanity|Hour of Devastation|35|R|{2}{U}|Enchantment - Aura Curse|||Enchant player$At the beginning of each end step, enchanted player puts the top X cards of his or her library into his or her graveyard, where X is the total number of cards put into his or her graveyard from anywhere this turn. | +Jace's Defeat|Hour of Devastation|38|U|{1}{U}|Instant|||Counter target blue spell. If it was a Jace planeswalker spell, scry 2.| +Nimble Obstructionist|Hour of Devastation|40|R|{2}{U}|Creature - Bird Wizard|3|1|Flash$Flying$Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.)$When you cycle Nimble Obstructionist, counter target activated or triggered ability you don't control.| +Proven Combatant|Hour of Devastation|42|C|{U}|Creature - Human Warrior|1|1|Eternalize {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Warrior with no mana cost. Eternalize only as a sorcery.) | +Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize—{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| +Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counter target spell unless its controller pays {3}.$• Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| +Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| +Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| +Accursed Horde|Hour of Devastation|56|U|{3}{B}|Creature - Zombie|3|3|{1}{B}: Target attacking Zombie gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.)| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| -Dreamstealer|Hour of Devastation|63|R|{2}{B}|Creature - Human Wizard|1|2|Menace$When Dreamstealer deals combat damage to a player, that player discards that many cards.$Eternalize {4}{B}{B}| -Khenra Eternal|Hour of Devastation|66|C|{1}{B}|Creature - Zombie Jackal Warrior|2|2|Afflict 1| +Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| +Dreamstealer|Hour of Devastation|63|R|{2}{B}|Creature - Human Wizard|1|2|Menace$When Dreamstealer deals combat damage to a player, that player discards that many cards.$Eternalize {4}{B}{B} ({4}{B}{B}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| +Hour of Glory|Hour of Devastation|065|R|{3}{B}|Instant|||Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature.| +Khenra Eternal|Hour of Devastation|66|C|{1}{B}|Creature - Zombie Jackal Warrior|2|2|Afflict 1 (Whenever this creature becomes blocked, defending player loses 1 life.)| Liliana's Defeat|Hour of Devastation|68|U|{B}|Sorcery|||Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life.| -Marauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| -Abrade|Hour of Devastation|83|U|{1}{R}|Instant|||Choose one — Abrade deals 3 damage to target creature.; Destroy target artifact.| -Chandra's Defeat|Hour of Devastation|86|U|{R}|Instant|||Chandra's Defeat deals 5 damage to target red creature or red planeswalker. If it was a Chandra planeswalker, you may discard a card. If you do, draw a card.| +Maurauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| +Razaketh the Foulblooded|Hour of Devastation|73|M|{5}{B}{B}{B}|Legendary Creature - Demon|8|8|Flying, trample$Pay 2 life, Sacrifice another creature: Search your library for a card and put that card into your hand. Then shuffle your library.| +Torment of Hailfire|Hour of Devastation|077|R|{X}{B}{B}|Sorcery|||Repeat the following process X times. Each opponent loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| +Torment of Scarabs|Hour of Devastation|078|U|{3}{B}|Enchantment - Aura Curse|||Enchant player$At the beginning of enchanted player's upkeep, that player loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| +Torment of Venom|Hour of Devastation|079|C|{2}{B}{B}|Instant|||Put three -1/-1 counters on target creature. Its controller loses 3 life unless he or she sacrifices another nonland permanent or discards a card.| +Abrade|Hour of Devastation|083|U|{1}{R}|Instant|||Choose one —$• Abrade deals 3 damage to target creature.$• Destroy target artifact.| +Chandra's Defeat|Hour of Devastation|86|U|{R}|Instant|||Chandra’s Defeat deals 5 damage to target red creature or red planeswalker. If that permanent is a Chandra planeswalker, you may discard a card. If you do, draw a card.| Defiant Khenra|Hour of Devastation|89|C|{1}{R}|Creature - Jackal Warrior|2|2|| +Earthshaker Khenra|Hour of Devastation|90|R|{1}{R}|Creature - Jackal Warrior|2|1|Haste$When Earthshaker Khenra enters the battlefield, target creature with power less than or equal to Earthshaker Khenra's power can't block this turn.$Eternalize {4}{R}{R} ({4}{R}{R}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Jackal Warrior with no mana cost. Eternalize only as a sorcery.)| +Fervent Paincaster|Hour of Devastation|91|U|{2}{R}|Creature - Human Wizard|3|1|{T}: Fervent Paincaster deals 1 damage to target player.${T}, Exert Fervent Paincaster: It deals 1 damage to target creature. (An exerted creature won't untap during its controller's next untap step.)| Gilded Cerodon|Hour of Devastation|94|C|{4}{R}|Creature - Beast|4|4|Whenever Gilded Cerodon attacks, if you control a Desert or there is a Desert card in your graveyard, target creature can't block this turn.| -Inferno Jet|Hour of Devastation|99|U|{5}{R}|Sorcery|||Inferno Jet deals 6 damage to target opponent.$Cycling {2}| -Khenra Scrapper|Hour of Devastation|100|C|{2}{R}|Creature - Jackal Warrior|2|3|Menace$You may exert Khenra Scrapper as it attacks. When you do, it gets +2/+0 until end of turn.| -Open Fire|Hour of Devastation|105|C|{2}{R}|Instant|||Open Fire deals 3 damage to target creature or player.| -Sand Strangler|Hour of Devastation|107|C|{3}{R}|Creature - Beast|3|3|When Sand Strangler enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you may have Sand Strangler deal 3 damage to target creature.| -Wildfire Eternal|Hour of Devastation|109|R|{3}{R}|Creature - Zombie Jackal Cleric|1|4|Afflict 4$Whenever Wildfire Eternal attacks and isn't blocked, you may cast an instant or sorcery card from your hand without paying its mana cost.| +Inferno Jet|Hour of Devastation|99|U|{5}{R}|Sorcery|||Inferno Jet deals 6 damage to target opponent.$Cycling {2} ({2}, Discard this card: Draw a card.)| +Khenra Scrapper|Hour of Devastation|100|C|{2}{R}|Creature - Jackal Warrior|2|3|Menace$You may exert Khenra Scrapper as it attacks. When you do, it gets +2/+0 until end of turn. (An exerted creature won't untap during your next untap step.)| +Neheb, the Eternal|Hour of Devastation|104|M|{3}{R}{R}|Legendary Creature - Zombie Minotaur Warrior|4|6|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$At the beginning of your postcombat main phase, add {R} to your mana pool for each 1 life your opponents have lost this turn.| +Open Fire|Hour of Devastation|105|C|{2}{R}|Instant|||Open Fire does 3 damage to target creature or player.| +Sand Strangler|Hour of Devastation|107|U|{3}{R}|Creature - Beast|3|3|When Sand Strangler enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you may have Sand Strangler deal 3 damage to target creature.| +Wildfire Eternal|Hour of Devastation|109|R|{3}{R}|Creature - Zombie Jackal Cleric|1|4|Afflict 4 (Whenever this creature becomes blocked, defending player loses 4 life.)$Whenever Wildfire Eternal attacks and isn't blocked, you may cast an instant or sorcery card from your hand without paying its mana cost.| +Hope Tender|Hour of Devastation|119|U|{1}{G}|Creature - Human Druid|2|2|{1}, {T}: Untap target land.${1}, {T}, Exert Hope Tender: Untap two target lands. (An exerted creature won't untap during your next untap step.)| Nissa's Defeat|Hour of Devastation|123|U|{2}{G}|Sorcery|||Destroy target Forest, green enchantment, or green planeswalker. If that permanent was a Nissa planeswalker, draw a card.| -Oasis Ritualist|Hour of Devastation|124|C|{3}{G}|Creature - Naga Druid|2|4|{T}: Add one mana of any color to your mana pool.${T}, Exert Oasis Ritualist: Add two mana of any one color to your mana pool.| +Oasis Ritualist|Hour of Devastation|124|C|{3}{G}|Creature - Naga Druid|2|4|{t}: Add one mana of any color to your mana pool.${t}, Exert Oasis Ritualist: Add two mana of any one color to your manna pool. (An exerted creature won't untap during your next untap step.)| +Pride Sovereign|Hour of Devastation|126|R|{2}{G}|Creature - Cat|2|2|Pride Sovereign gets +1/+1 for each other Cat you control.${W}, {t}, Exert Pride Sovereign: Create two 1/1 white Cat creature tokens with lifelink. (An exerted creature won't untap during your next untap step.)| Ramunap Excavator|Hour of Devastation|129|R|{2}{G}|Creature - Naga Cleric|2|3|You may play land cards from your graveyard.| -Sidewinder Naga|Hour of Devastation|134|C|{2}{G}|Creature - Naga Warrior|3|2|As long as you control a Desert or there is a Desert card in your graveyard, Sidewinder Naga gets +1/+0 and has trample.| -Nicol Bolas, God-Pharaoh|Hour of Devastation|140|M|{4}{U}{B}{R}|Planeswalker - Bolas|||+2: Target opponent exiles cards from the top of his or her library until he or she exiles a nonland card. Until end of turn, you may cast that card without paying its mana cost.$+1: Each opponent exiles two cards from his or her hand.$-4: Nicol Bolas, God-Pharaoh deals 7 damage to target opponent or creature an opponent controls.$-12: Exile each nonland permanent your opponents control.| -Samut, the Tested|Hour of Devastation|144|M|{2}{R}{G}|Planeswalker - Samut|||+1: Up to one target creature gains double strike until end of turn.$-2: Samut, the Tested deals 2 damage divided as you choose among one or two target creatures and/or players.$-7: Search your library for up to two creature and/or planeswalker cards, put them onto the battlefield, then shuffle your library.| +Ramunap Hydra|Hour of Devastation|130|R|{3}{G}|Creature - Snake Hydra|3|3|Vigilance, reach, trample$Ramunap Hydra gets +1/+1 as long as you control a Desert.$Ramunap Hydra gets +1/+1 as long as there is a Desert card in your graveyard.| +Resilient Khenra|Hour of Devastation|131|R|{1}{G}|Creature - Jackal Wizard|2|2|When Resilient Khenra enters the battlefield, you may have target creature get +X/+X until end of turn, where X is Resilient Khenra's power.$Eternalize {4}{G}{G} ({4}{G}{G}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Jackal Wizard with no mana cost. Eternalize only as a sorcery.)| +Rhonas's Last Stand|Hour of Devastation|132|R|{G}{G}|Sorcery|||Create a 5/4 green Snake creature token. Lands you control don't untap during your next untap step.| +Sidewinder Naga|Hour of Devastation|134|C|{2}{G}|Creature - Naga Warrior|3|2|As long as you control a Desert or there is a Desert card in your graveyard, Sidewinder Naga gets +1/+0 and has trample.| +Uncage the Menagerie|Hour of Devastation|137|M|{X}{G}{G}|Sorcery|||Search your library for up to X creature cards with different names that each have converted mana cost X, reveal them, put them into your hand, then shuffle your library.| +The Locust God|Hour of Devastation|139|M|{4}{U}{R}|Legendary Creature - God|4|4|Flying$Whenever you draw a card, create a 1/1 blue and red Insect creature token with flying and haste.${2}{U}{R}: Draw a card, then discard a card.$When The Locust God dies, return it to its owner's hand at the beginning of the next end step.| +Nicol Bolas, God-Pharaoh|Hour of Devastation|140|M|{4}{U}{B}{R}|Planeswalker - Bolas|7|+2: Target opponent exiles cards from the top of his or her library until he or she exiles a non land card. Until end of turn, you may cast that card without paying its mana cost.$+1: Each opponent exiles two cards from his or her hand.$-4: Nicol Bolas, God-Pharaoh deals 7 damage to target opponent or creature an opponent controls.$-12: Exile each nonland permanent your opponents control.| +Resolute Survivors|Hour of Devastation|142|U|{1}{R}{W}|Creature - Human Warrior|3|3|You may exert Resolute Survivors as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, Resolute Survivors deals 1 damage to each opponent and you gain 1 life.| +River Hoopoe|Hour of Devastation|143|U|{G}{U}|Creature - Bird|1|3|Flying${3}{G}{U}: You gain 2 life and draw a card.| +Samut, the Tested|Hour of Devastation|144|M|{2}{R}{G}|Planeswalker - Samut|4|+1: Up to one target creature gains double strike until end of turn.$-2: Samut, the Tested deals 2 damage divided as you choose among one or two target creatures and/or players.$-7: Search your library for up to two creature and/or planeswalker cards, put them onto the battlefield, then shuffle your library.| +The Scarab God|Hour of Devastation|145|M|{3}{U}{B}|Legendary Creature - God|5|5|At the beginning of your upkeep, each opponent loses X life and you scry X, where X is the number of Zombies you control.${2}{U}{B}: Exile target creature card from a graveyard. Create a token that's a copy of it, except it's a 4/4 black Zombie.$When The Scarab God dies, return it to its owner's hand at the beginning of the next upkeep.| The Scorpion God|Hour of Devastation|146|M|{3}{B}{R}|Legendary Creature - God|6|5|Whenever a creature with a -1/-1 counter on it dies, draw a card.${1}{B}{R}: Put a -1/-1 counter on another target creature.$When The Scorpion God dies, return it to its owner's hand at the beginning of the next end step.| -Grind|Hour of Devastation|155a|R|{1}{B}|Sorcery|||Put a -1/-1 counter on each of up to two target creatures.| -Dust|Hour of Devastation|155b|R|{3}{W}|Sorcery|||Aftermath$Exile any number of target creatures that have -1/-1 counters on them.| +Farm // Market|Hour of Devastation|148|U|{2}{W}|Instant|||Destroy target attacking or blocking creature.$Market {2}{U}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Draw two cards, then destroy two cards| +Claim // Fame|Hour of Devastation|150|U|{B}|Sorcery|||Return target creature card with converted mana cost 2 or less from your graveyard to the battlefield.$Fame {1}{R}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Target creature gets +2/+0 and gains haste until end of turn.| +Struggle // Survive|Hour of Devastation|151|U|{2}{R}|Instant|||Struggle deals damage to target creature equal to the number of lands you control.$Survive {1}{G}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Each player shuffles his or graveyard into his or her library.| +Reason // Believe|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| +Grind // Dust|Hour of Devastation|155|R|{1}{B}|Sorcery|||Put a -1/-1 counter on each of up to two target creatures.$Dust {3}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Exile any number of target creatures that have -1/-1 counters on them.| +Driven // Despair|Hour of Devastation|157|R|{1}{G}|Sorcery|||Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."$Despair {1}{B}$Sorcery$Aftermath$Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."| +Crook of Comdemnation|Hour of Devastation|159|U|{2}|Artifact|||{1}, {t}: Exile target card from a graveyard.${1}, Exile Crook of Condemnation: Exile all cards from all graveyards.| +Mirage Mirror|Hour of Devastation|165|R|{3}|Artifact|||{2}: Mirage Mirror becomes a copy of target artifact, creature, enchantment, or land until end of turn.| +Sunset Pyramid|Hour of Devastation|166|U|{2}|Artifact|||Sunset Pyramid enters the battlefield with three brick counters on it.${2}, {T}, Remove a brick counter from Sunset Pyramid: Draw a card.${2}, {T}: Scry 1.| +Desert of the Fervent|Hour of Devastation|170|C||Land - Desert|||Desert of the Fervent enters the battlefield tapped.${T}: Add {R} to your mana pool.$Cycling {1}{R} ({1}{R}, Discard this card: Draw a card.)| +Desert of the Glorified|Hour of Devastation|171|C||Land - Desert|||Desert of the Glorified enters the battlefield tapped.${T}: Add {B} to your mana pool.$Cycling {1}{B} ({1}{B}, Discard this card: Draw a card.)| +Desert of the Indomitable|Hour of Devastation|172|C||Land - Desert|||Desert of the Indomitable enters the battlefield tapped.${t}: Add {G} to your mana pool.$Cycling {1}{G} ({1}{G}, Discard this card: Draw a card.)| +Desert of the Mindful|Hour of Devastation|173|C||Land - Desert|||Desert of the Mindful enters the battlefield tapped.${T}: Add {U} to your mana pool.$Cycling {1}{U} ({1}{U}, Discard this card: Draw a card.)| +Desert of the True|Hour of Devastation|174|C||Land - Desert|||Desert of the True enters the battlefield tapped.${T}: Add {W} to your mana pool.$Cycling {1}{W} ({1}{W}, Discard this card: Draw a card.)| +Hostile Desert|Hour of Devastation|178|R||Land - Desert|||{T}: Add {C} to your mana pool.${2}, Exile a land card from your graveyard: Hostile Desert becomes a 3/4 Elemental creature until end of turn. It's still a land.| +Scavenger Grounds|Hour of Devastation|182|R||Land - Desert|||{t}: Add {C} to your mana pool.${2}, {t}, Sacrifice a Desert: Exile all cards from all graveyards.| +Plains|Hour of Devastation|185|L||Basic Land - Plains|||| +Island|Hour of Devastation|186|L||Basic Land - Island|||| +Swamp|Hour of Devastation|187|L||Basic Land - Swamp|||| +Mountain|Hour of Devastation|188|L||Basic Land - Mountain|||| +Forest|Hour of Devastation|189|L||Basic Land - Forest|||| +Nissa, Genesis Mage|Hour of Devastation|200|M|{5}{G}{G}|Planeswalker - Nissa|5|+2: Untap up to two target creatures and up to two target lands.$-3: Target creature gets +5/+5 until end of turn.$-10: Look at the top ten cards of your library. You may put any number of creature and/or land cards from among them onto the battlefield. Put the rest on the bottom of your library in a random order.| +Avid Reclaimer|Hour of Devastation|201|U|{2}{G}|Creature - Human Druid|2|2|{T}: Add {G} or {U} to your mana pool. If you control a Nissa planeswalker, you gain 2 life.| +Brambleweft Behemoth|Hour of Devastation|202|C|{4}{G}{G}|Creature - Elemental|6|6|Trample. (This creature can deal excess combat damage to defending player or planeswalker while attacking.)| +Nissa's Encouragement|Hour of Devastation|203|R|{4}{G}|Sorcery|||Search your library and graveyard for a card named Forest, a card named Brambleweft Behemoth, and a card named Nissa, Genesis Mage. Reveal those cards, put them into your hand, then shuffle your library.| +Woodland Stream|Hour of Devastation|204|C||Land|||Woodland Stream enters the battlefield tapped.${T}: Add {G} or {U} to your mana pool. | +Nicol Bolas, the Deceiver|Hour of Devastation|205|M|{5}{U}{B}{R}|Planeswalker - Bolas|5|+3: Each opponent loses 3 life unless that player sacrifices a nonland permanent or discards a card.$-3: Destroy target creature. Draw a card.$-11: Nicol Bolas, the Deceiver deals 7 damage to each opponent. You draw 7 cards.| +Wasp of the Bitter End|Hour of Devastation|206|U|{1}{B}|Creature - Insect Horror|2|1|Flying$Whenever you cast a Bolas planeswalker spell, you may sacrifice Wasp of the Bitter End. If you do, destroy target creature.| +Zealot of the God-Pharaoh|Hour of Devastation|207|C|{3}{R}|Creature - Minotaur Archer|4|3|{4}{R}: Zealot of the God-Pharaoh deals 2 damage to target opponent.| +Visage of Bolas|Hour of Devastation|208|R|{4}|Artifact|||When Visage of Bolas enters the battlefield, you may search your library and/or graveyard for a card named Nicol Bolas, the Deceiver, reveal it, and put it into your hand. If you search your library this way, shuffle it.${t}: Add {U}, {B}, or {R} to your mana pool.| +Cinder Barrens|Hour of Devastation|209|C||Land|||Cinder Barrens enters the battlefield tapped.${t}: Add {B} or {R} to your mana pool.| Desert of the Fervent|Hour of Devastation|170|C||Land - Desert|||Desert of the Fervent enters the battlefield tapped.${T}: Add {R} to your mana pool.$Cycling {1}{R}| Desert of the Glorified|Hour of Devastation|171|C||Land - Desert|||Desert of the Glorified enters the battlefield tapped.${T}: Add {B} to your mana pool.$Cycling {1}{B}| Desert of the Indomitable|Hour of Devastation|172|C||Land - Desert|||Desert of the Indomitable enters the battlefield tapped.${T}: Add {G} to your mana pool.$Cycling {1}{G}| From 1210f9795a6030667db65528d1e46d7e0ed443a9 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 24 Jun 2017 11:33:53 +0200 Subject: [PATCH 007/160] [HOU] Added Doomfall. --- Mage.Sets/src/mage/cards/c/Castigate.java | 14 +-- Mage.Sets/src/mage/cards/d/Doomfall.java | 112 ++++++++++++++++++ Mage.Sets/src/mage/cards/p/PickTheBrain.java | 26 ++-- Mage.Sets/src/mage/cards/r/RiversGrasp.java | 14 +-- .../src/mage/cards/t/ThoughtKnotSeer.java | 14 +-- .../src/mage/sets/HourOfDevastation.java | 1 + .../main/java/mage/filter/StaticFilters.java | 1 + 7 files changed, 132 insertions(+), 50 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/d/Doomfall.java diff --git a/Mage.Sets/src/mage/cards/c/Castigate.java b/Mage.Sets/src/mage/cards/c/Castigate.java index 157a136749..5acc457b6b 100644 --- a/Mage.Sets/src/mage/cards/c/Castigate.java +++ b/Mage.Sets/src/mage/cards/c/Castigate.java @@ -31,12 +31,10 @@ import mage.abilities.effects.common.ExileCardYouChooseTargetOpponentEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; import mage.target.common.TargetOpponent; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -44,17 +42,11 @@ import java.util.UUID; */ public class Castigate extends CardImpl { - private static final FilterCard filter = new FilterCard("a nonland card"); - - static { - filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); - } - public Castigate(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{W}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{W}{B}"); // Target opponent reveals his or her hand. You choose a nonland card from it and exile that card. - this.getSpellAbility().addEffect(new ExileCardYouChooseTargetOpponentEffect(filter)); + this.getSpellAbility().addEffect(new ExileCardYouChooseTargetOpponentEffect(StaticFilters.FILTER_CARD_A_NON_LAND)); this.getSpellAbility().addTarget(new TargetOpponent()); } diff --git a/Mage.Sets/src/mage/cards/d/Doomfall.java b/Mage.Sets/src/mage/cards/d/Doomfall.java new file mode 100644 index 0000000000..66caa1c9b0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/Doomfall.java @@ -0,0 +1,112 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileCardYouChooseTargetOpponentEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetPlayer; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetOpponent; + +/** + * + * @author LevelX2 + */ +public class Doomfall extends CardImpl { + + public Doomfall(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}"); + + // Choose one — + this.getSpellAbility().getModes().setMinModes(1); + this.getSpellAbility().getModes().setMaxModes(1); + + // • Target player exiles a creature he or she controls. + this.getSpellAbility().addEffect(new DoomfallEffect()); + this.getSpellAbility().addTarget(new TargetPlayer()); + + // • Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card. + Mode mode = new Mode(); + mode.getEffects().add(new ExileCardYouChooseTargetOpponentEffect(StaticFilters.FILTER_CARD_A_NON_LAND) + .setText("Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card")); + mode.getTargets().add(new TargetOpponent()); + this.getSpellAbility().addMode(mode); + } + + public Doomfall(final Doomfall card) { + super(card); + } + + @Override + public Doomfall copy() { + return new Doomfall(this); + } +} + +class DoomfallEffect extends OneShotEffect { + + public DoomfallEffect() { + super(Outcome.Exile); + this.staticText = "target player exiles a creature he or she controls"; + } + + public DoomfallEffect(final DoomfallEffect effect) { + super(effect); + } + + @Override + public DoomfallEffect copy() { + return new DoomfallEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (targetPlayer != null) { + Target target = new TargetControlledCreaturePermanent(); + target.setNotTarget(true); + if (targetPlayer.choose(outcome, target, source.getSourceId(), game)) { + targetPlayer.moveCards(game.getCard(target.getFirstTarget()), Zone.EXILED, source, game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/p/PickTheBrain.java b/Mage.Sets/src/mage/cards/p/PickTheBrain.java index b0932a20e8..af925fcf81 100644 --- a/Mage.Sets/src/mage/cards/p/PickTheBrain.java +++ b/Mage.Sets/src/mage/cards/p/PickTheBrain.java @@ -38,9 +38,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; @@ -51,9 +49,9 @@ import mage.target.common.TargetOpponent; * @author escplan9 (Derek Monturo - dmontur1 at gmail dot com) */ public class PickTheBrain extends CardImpl { - + public PickTheBrain(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}"); // Target opponent reveals his or her hand. You choose a nonland card from it and exile that card. // Delirium — If there are four or more card types among cards in your graveyard, search that player's graveyard, hand, and library for any number of cards with the same name as the exiled card, exile those cards, then that player shuffles his or her library. @@ -73,12 +71,6 @@ public class PickTheBrain extends CardImpl { class PickTheBrainEffect extends SearchTargetGraveyardHandLibraryForCardNameAndExileEffect { - private static final FilterCard filter = new FilterCard("a nonland card"); - - static { - filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); - } - public PickTheBrainEffect() { super(true, "that card's controller", "all cards with the same name as that card"); } @@ -96,20 +88,20 @@ class PickTheBrainEffect extends SearchTargetGraveyardHandLibraryForCardNameAndE public boolean apply(Game game, Ability source) { Player opponent = game.getPlayer(this.getTargetPointer().getFirst(game, source)); Player controller = game.getPlayer(source.getControllerId()); - if (opponent != null && controller != null) { + if (opponent != null && controller != null) { if (!opponent.getHand().isEmpty()) { - opponent.revealCards("Exile " + filter.getMessage(), opponent.getHand(), game); - TargetCard target = new TargetCard(Zone.HAND, filter); + opponent.revealCards("Exile " + StaticFilters.FILTER_CARD_A_NON_LAND.getMessage(), opponent.getHand(), game); + TargetCard target = new TargetCard(Zone.HAND, StaticFilters.FILTER_CARD_A_NON_LAND); if (controller.choose(Outcome.Exile, opponent.getHand(), target, game)) { Card card = opponent.getHand().get(target.getFirstTarget(), game); if (card != null) { controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.HAND, true); - + // Check the Delirium condition if (!DeliriumCondition.instance.apply(game, source)) { return true; } - return this.applySearchAndExile(game, source, card.getName(), opponent.getId()); + return this.applySearchAndExile(game, source, card.getName(), opponent.getId()); } } } @@ -124,4 +116,4 @@ class PickTheBrainEffect extends SearchTargetGraveyardHandLibraryForCardNameAndE + "search that player's graveyard, hand, and library for any number of cards " + "with the same name as the exiled card, exile those cards, then that player shuffles his or her library"; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/r/RiversGrasp.java b/Mage.Sets/src/mage/cards/r/RiversGrasp.java index 899505da7b..b6430f94e0 100644 --- a/Mage.Sets/src/mage/cards/r/RiversGrasp.java +++ b/Mage.Sets/src/mage/cards/r/RiversGrasp.java @@ -41,9 +41,7 @@ import mage.constants.CardType; import mage.constants.ColoredManaSymbol; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.Target; @@ -59,7 +57,7 @@ import mage.watchers.common.ManaSpentToCastWatcher; public class RiversGrasp extends CardImpl { public RiversGrasp(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{U/B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{U/B}"); // If {U} was spent to cast River's Grasp, return up to one target creature to its owner's hand. If {B} was spent to cast River's Grasp, target player reveals his or her hand, you choose a nonland card from it, then that player discards that card. Target targetCreature = new TargetCreaturePermanent(0, 1); @@ -90,12 +88,6 @@ public class RiversGrasp extends CardImpl { class RiversGraspEffect extends OneShotEffect { - private static final FilterCard filter = new FilterCard("a nonland card"); - - static { - filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); - } - public RiversGraspEffect() { super(Outcome.Discard); this.staticText = "Target player reveals his or her hand, you choose a card from it, then that player discards that card."; @@ -117,7 +109,7 @@ class RiversGraspEffect extends OneShotEffect { player.revealCards("River's Grasp", player.getHand(), game); Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - TargetCard target = new TargetCard(Zone.HAND, filter); + TargetCard target = new TargetCard(Zone.HAND, StaticFilters.FILTER_CARD_A_NON_LAND); if (controller.choose(Outcome.Benefit, player.getHand(), target, game)) { Card card = player.getHand().get(target.getFirstTarget(), game); if (card != null) { diff --git a/Mage.Sets/src/mage/cards/t/ThoughtKnotSeer.java b/Mage.Sets/src/mage/cards/t/ThoughtKnotSeer.java index ed8af36a6a..88eec52c62 100644 --- a/Mage.Sets/src/mage/cards/t/ThoughtKnotSeer.java +++ b/Mage.Sets/src/mage/cards/t/ThoughtKnotSeer.java @@ -37,9 +37,7 @@ import mage.abilities.effects.common.ExileCardYouChooseTargetOpponentEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.FilterCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.common.TargetOpponent; /** @@ -48,20 +46,14 @@ import mage.target.common.TargetOpponent; */ public class ThoughtKnotSeer extends CardImpl { - private static final FilterCard filter = new FilterCard("a nonland card"); - - static { - filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); - } - public ThoughtKnotSeer(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{C}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{C}"); this.subtype.add("Eldrazi"); this.power = new MageInt(4); this.toughness = new MageInt(4); // When Thought-Knot Seer enters the battlefield, target opponent reveals his or her hand. You choose a nonland card from it and exile that card. - Ability ability = new EntersBattlefieldTriggeredAbility(new ExileCardYouChooseTargetOpponentEffect(filter), false); + Ability ability = new EntersBattlefieldTriggeredAbility(new ExileCardYouChooseTargetOpponentEffect(StaticFilters.FILTER_CARD_A_NON_LAND), false); ability.addTarget(new TargetOpponent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index d2f4284b33..075c26d879 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -75,6 +75,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Desert of the Indomitable", 172, Rarity.COMMON, mage.cards.d.DesertOfTheIndomitable.class)); cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); + cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index 16c520f164..945b5ff965 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -33,6 +33,7 @@ public final class StaticFilters { public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT = new FilterControlledArtifactPermanent(); public static final FilterArtifactCard FILTER_CARD_ARTIFACT = new FilterArtifactCard(); public static final FilterNonlandCard FILTER_CARD_NON_LAND = new FilterNonlandCard(); + public static final FilterNonlandCard FILTER_CARD_A_NON_LAND = new FilterNonlandCard("a nonland card"); public static final FilterCard FILTER_CARD_ARTIFACT_OR_CREATURE = new FilterCard("artifact or creature card"); public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE = new FilterCreaturePermanent(); From 9dc866852d7ab0ba93efbf97a24fe93ec9a068f0 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 24 Jun 2017 19:42:09 +1000 Subject: [PATCH 008/160] Implement Chandra's Defeat (HOU) --- .../src/mage/cards/c/ChandrasDefeat.java | 121 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 3 +- 2 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/c/ChandrasDefeat.java diff --git a/Mage.Sets/src/mage/cards/c/ChandrasDefeat.java b/Mage.Sets/src/mage/cards/c/ChandrasDefeat.java new file mode 100644 index 0000000000..efe09ea779 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChandrasDefeat.java @@ -0,0 +1,121 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; + +/** + * + * @author spjspj + */ +public class ChandrasDefeat extends CardImpl { + + private final static FilterPermanent filter = new FilterPermanent("creature or planeswalker"); + + static { + filter.add(new ColorPredicate(ObjectColor.RED)); + filter.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.PLANESWALKER))); + } + + public ChandrasDefeat(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}"); + + // Chandra's Defeat deals 5 damage to target red creature or red planeswalker. If it was a Chandra planeswalker, you may discard a card. If you do, draw a card. + this.getSpellAbility().addEffect(new ChandrasDefeatEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + } + + public ChandrasDefeat(final ChandrasDefeat card) { + super(card); + } + + @Override + public ChandrasDefeat copy() { + return new ChandrasDefeat(this); + } +} + +class ChandrasDefeatEffect extends OneShotEffect { + + private static final FilterPermanent filter = new FilterPermanent(); + + static { + filter.add(new CardTypePredicate(CardType.PLANESWALKER)); + filter.add(new SubtypePredicate(SubType.CHANDRA)); + } + + public ChandrasDefeatEffect() { + super(Outcome.Damage); + this.staticText = "{this} deals 5 damage to target red creature or red planeswalker. If it was a Chandra planeswalker, you may discard a card. If you do, draw a card."; + } + + public ChandrasDefeatEffect(final ChandrasDefeatEffect effect) { + super(effect); + } + + @Override + public ChandrasDefeatEffect copy() { + return new ChandrasDefeatEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getFirstTarget()); + Player controller = game.getPlayer(source.getControllerId()); + + if (permanent != null) { + permanent.damage(5, source.getSourceId(), game, false, true); + + // If it was a Chandra planeswalker, you may discard a card. If you do, draw a card + if (filter.match(permanent, game) && controller != null + && controller.chooseUse(outcome, "Discard a card and draw a card?", source, game)) { + controller.discard(1, false, source, game); + controller.drawCards(1, game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index d2f4284b33..0d29c63b1f 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -65,10 +65,11 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Abrade", 83, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); - cards.add(new SetCardInfo("Adorned Pouncer", 3, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); + cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); + cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); From 724653728b590b4fca3ef742ca24215cb589e738 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 24 Jun 2017 19:51:12 +1000 Subject: [PATCH 009/160] HOU Reprints --- Mage.Sets/src/mage/sets/HourOfDevastation.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 569738ae3c..936414f908 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -70,6 +70,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); + cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); @@ -91,6 +92,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); } From ed22eb158c4a7a28689a1aee9f25f85871ae355d Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 24 Jun 2017 20:03:43 +1000 Subject: [PATCH 010/160] Implement Zealot of the God Trump (HOU) --- .../mage/cards/z/ZealotOfTheGodPharaoh.java | 70 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 71 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/z/ZealotOfTheGodPharaoh.java diff --git a/Mage.Sets/src/mage/cards/z/ZealotOfTheGodPharaoh.java b/Mage.Sets/src/mage/cards/z/ZealotOfTheGodPharaoh.java new file mode 100644 index 0000000000..e4d11fbd41 --- /dev/null +++ b/Mage.Sets/src/mage/cards/z/ZealotOfTheGodPharaoh.java @@ -0,0 +1,70 @@ +/* + * 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.z; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.target.common.TargetOpponent; + +/** + * + * @author spjspj + */ +public class ZealotOfTheGodPharaoh extends CardImpl { + + public ZealotOfTheGodPharaoh(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + + this.subtype.add("Minotaur"); + this.subtype.add("Archer"); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // {4}{R}: Zealot of the God-Pharaoh deals 2 damage to target opponent. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new ManaCostsImpl("{4}{R}")); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + } + + public ZealotOfTheGodPharaoh(final ZealotOfTheGodPharaoh card) { + super(card); + } + + @Override + public ZealotOfTheGodPharaoh copy() { + return new ZealotOfTheGodPharaoh(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 936414f908..3b60eb1eb9 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -94,6 +94,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); + cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); } @Override From 128b972765f4982ab0c64fcb67b44a0f1bc3eed7 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 24 Jun 2017 14:00:21 +0200 Subject: [PATCH 011/160] [HOU] Added 5 black cards. --- .../src/mage/cards/a/AnakinSkywalker.java | 271 ++++++++-------- .../src/mage/cards/a/AyliEternalPilgrim.java | 22 +- .../src/mage/cards/b/BlazingHellhound.java | 14 +- Mage.Sets/src/mage/cards/b/BloodBairn.java | 14 +- Mage.Sets/src/mage/cards/b/BloodHost.java | 15 +- .../src/mage/cards/b/BontuTheGlorified.java | 11 +- .../src/mage/cards/b/ButcherOfTheHorde.java | 17 +- .../src/mage/cards/c/CartelAristocrat.java | 15 +- .../src/mage/cards/c/CorpseBlockade.java | 12 +- .../src/mage/cards/d/DiscipleOfBolas.java | 13 +- Mage.Sets/src/mage/cards/d/Dreamstealer.java | 108 +++++++ Mage.Sets/src/mage/cards/e/EaterOfHope.java | 10 +- .../src/mage/cards/f/FelhideBrawler.java | 59 +--- Mage.Sets/src/mage/cards/f/FellShepherd.java | 18 +- .../src/mage/cards/f/FiligreeFracture.java | 23 +- Mage.Sets/src/mage/cards/f/FleshCarver.java | 11 +- .../src/mage/cards/g/GhoulcallerGisa.java | 13 +- Mage.Sets/src/mage/cards/g/GobblingOoze.java | 15 +- .../src/mage/cards/g/GoldnightCommander.java | 15 +- .../src/mage/cards/g/GriffinProtector.java | 12 +- .../src/mage/cards/g/GrimgrinCorpseBorn.java | 16 +- .../src/mage/cards/h/HealerOfThePride.java | 12 +- .../mage/cards/h/HeartPiercerManticore.java | 11 +- Mage.Sets/src/mage/cards/h/HourOfGlory.java | 113 +++++++ Mage.Sets/src/mage/cards/h/HowlpackWolf.java | 53 +--- .../cards/j/JaliraMasterPolymorphist.java | 7 +- .../mage/cards/j/JaradGolgariLichLord.java | 17 +- .../src/mage/cards/k/KheruBloodsucker.java | 14 +- Mage.Sets/src/mage/cards/k/KheruDreadmaw.java | 15 +- Mage.Sets/src/mage/cards/k/KruinStriker.java | 13 +- .../src/mage/cards/l/LilianasDefeat.java | 105 +++++++ Mage.Sets/src/mage/cards/l/LukeSkywalker.java | 263 ++++++++-------- .../mage/cards/m/MauraudingBoneslasher.java | 77 +++++ Mage.Sets/src/mage/cards/m/MindlessNull.java | 42 +-- .../mage/cards/o/OliviaMobilizedForWar.java | 15 +- .../mage/cards/p/ProsshSkyraiderOfKher.java | 12 +- .../src/mage/cards/q/QarsiHighPriest.java | 16 +- Mage.Sets/src/mage/cards/r/RavenousWampa.java | 293 +++++++++--------- .../mage/cards/r/RazakethTheFoulblooded.java | 84 +++++ .../src/mage/cards/r/RubblebackRhino.java | 10 +- .../src/mage/cards/s/ScourgeOfSkolaVale.java | 13 +- Mage.Sets/src/mage/cards/s/SuturePriest.java | 26 +- .../mage/cards/t/TymaretTheMurderKing.java | 13 +- .../src/mage/cards/v/VampireWarlord.java | 12 +- .../mage/cards/v/VarolzTheScarStriped.java | 14 +- Mage.Sets/src/mage/cards/v/VoraciousNull.java | 13 +- .../mage/cards/y/YahenniUndyingPartisan.java | 11 +- .../src/mage/sets/HourOfDevastation.java | 5 + ...CantBlockUnlessYouControlSourceEffect.java | 71 +++++ .../abilities/keyword/EternalizeAbility.java | 2 +- .../main/java/mage/filter/StaticFilters.java | 4 + Utils/keywords.txt | 1 + Utils/mtg-cards-data.txt | 2 +- 53 files changed, 1143 insertions(+), 920 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/d/Dreamstealer.java create mode 100644 Mage.Sets/src/mage/cards/h/HourOfGlory.java create mode 100644 Mage.Sets/src/mage/cards/l/LilianasDefeat.java create mode 100644 Mage.Sets/src/mage/cards/m/MauraudingBoneslasher.java create mode 100644 Mage.Sets/src/mage/cards/r/RazakethTheFoulblooded.java create mode 100644 Mage/src/main/java/mage/abilities/effects/common/combat/CantBlockUnlessYouControlSourceEffect.java diff --git a/Mage.Sets/src/mage/cards/a/AnakinSkywalker.java b/Mage.Sets/src/mage/cards/a/AnakinSkywalker.java index 955aa645bf..3cc77e187f 100644 --- a/Mage.Sets/src/mage/cards/a/AnakinSkywalker.java +++ b/Mage.Sets/src/mage/cards/a/AnakinSkywalker.java @@ -1,139 +1,132 @@ -/* - * 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.a; - -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.ActivateAsSorceryActivatedAbility; -import mage.abilities.common.DiesCreatureTriggeredAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.effects.ReplacementEffectImpl; -import mage.abilities.effects.common.TransformSourceEffect; -import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.TransformAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.cards.d.DarthVader; -import mage.constants.*; -import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; -import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; - -import java.util.UUID; - -/** - * - * @author Styxo - */ -public class AnakinSkywalker extends CardImpl { - - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - - public AnakinSkywalker(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{B}{R}"); - addSuperType(SuperType.LEGENDARY); - this.subtype.add("Human"); - this.subtype.add("Sith"); - this.power = new MageInt(4); - this.toughness = new MageInt(4); - - this.transformable = true; - this.secondSideCardClazz = DarthVader.class; - - // Whenever another creature dies, put a +1/+1 counter on Anakin Skywalker. - this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, true)); - - // Sacrifice another creature: Target creature gets -1/-1 until end of turn. Activate this ability only as a sorcery. - Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-1, -1, Duration.EndOfTurn), new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter))); - ability.addTarget(new TargetCreaturePermanent()); - this.addAbility(ability); - - // If Anakin Skywalker would be destroyed, regenerate, then transform him instead. - this.addAbility(new TransformAbility()); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AnakinSkywalkerEffect())); - - } - - public AnakinSkywalker(final AnakinSkywalker card) { - super(card); - } - - @Override - public AnakinSkywalker copy() { - return new AnakinSkywalker(this); - } -} - -class AnakinSkywalkerEffect extends ReplacementEffectImpl { - - AnakinSkywalkerEffect() { - super(Duration.WhileOnBattlefield, Outcome.Transform); - staticText = "If {this} would die, regenerate and transform him instead"; - } - - AnakinSkywalkerEffect(final AnakinSkywalkerEffect effect) { - super(effect); - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null) { - permanent.regenerate(source.getSourceId(), game); - return new TransformSourceEffect(true).apply(game, source); - } - return false; - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ZONE_CHANGE; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - return event.getTargetId().equals(source.getSourceId()) && ((ZoneChangeEvent) event).isDiesEvent(); - } - - @Override - public AnakinSkywalkerEffect copy() { - return new AnakinSkywalkerEffect(this); - } -} +/* + * 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.a; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.d.DarthVader; +import mage.constants.*; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Styxo + */ +public class AnakinSkywalker extends CardImpl { + + public AnakinSkywalker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{B}{R}"); + addSuperType(SuperType.LEGENDARY); + this.subtype.add("Human"); + this.subtype.add("Sith"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + this.transformable = true; + this.secondSideCardClazz = DarthVader.class; + + // Whenever another creature dies, put a +1/+1 counter on Anakin Skywalker. + this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, true)); + + // Sacrifice another creature: Target creature gets -1/-1 until end of turn. Activate this ability only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-1, -1, Duration.EndOfTurn), + new SacrificeTargetCost(new TargetControlledCreaturePermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // If Anakin Skywalker would be destroyed, regenerate, then transform him instead. + this.addAbility(new TransformAbility()); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AnakinSkywalkerEffect())); + + } + + public AnakinSkywalker(final AnakinSkywalker card) { + super(card); + } + + @Override + public AnakinSkywalker copy() { + return new AnakinSkywalker(this); + } +} + +class AnakinSkywalkerEffect extends ReplacementEffectImpl { + + AnakinSkywalkerEffect() { + super(Duration.WhileOnBattlefield, Outcome.Transform); + staticText = "If {this} would die, regenerate and transform him instead"; + } + + AnakinSkywalkerEffect(final AnakinSkywalkerEffect effect) { + super(effect); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null) { + permanent.regenerate(source.getSourceId(), game); + return new TransformSourceEffect(true).apply(game, source); + } + return false; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ZONE_CHANGE; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getTargetId().equals(source.getSourceId()) && ((ZoneChangeEvent) event).isDiesEvent(); + } + + @Override + public AnakinSkywalkerEffect copy() { + return new AnakinSkywalkerEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AyliEternalPilgrim.java b/Mage.Sets/src/mage/cards/a/AyliEternalPilgrim.java index bf60957b7f..a65a9c4524 100644 --- a/Mage.Sets/src/mage/cards/a/AyliEternalPilgrim.java +++ b/Mage.Sets/src/mage/cards/a/AyliEternalPilgrim.java @@ -27,6 +27,7 @@ */ package mage.cards.a; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -45,29 +46,20 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetNonlandPermanent; -import java.util.UUID; - /** * * @author fireshoes */ public class AyliEternalPilgrim extends CardImpl { - - private static final FilterControlledPermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } public AyliEternalPilgrim(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{B}"); this.addSuperType(SuperType.LEGENDARY); this.subtype.add("Kor"); this.subtype.add("Cleric"); @@ -76,14 +68,14 @@ public class AyliEternalPilgrim extends CardImpl { // Deathtouch this.addAbility(DeathtouchAbility.getInstance()); - + // {1}, Sacrifice another creature: You gain life equal to the sacrificed creature's toughness. Effect effect = new GainLifeEffect(new SacrificeCostCreaturesToughness()); effect.setText("You gain life equal to the sacrificed creature's toughness"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(1)); - ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); this.addAbility(ability); - + // {1}{W}{B}, Sacrifice another creature: Exile target nonland permanent. Activate this ability only if you have at least 10 life more than your starting life total. ability = new ConditionalActivatedAbility( Zone.BATTLEFIELD, @@ -91,7 +83,7 @@ public class AyliEternalPilgrim extends CardImpl { new ManaCostsImpl("{1}{W}{B}"), new AyliEternalPilgrimCondition(), "{1}{W}{B}, Sacrifice another creature: Exile target nonland permanent. Activate this ability only if you have at least 10 life more than your starting life total"); - ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); ability.addTarget(new TargetNonlandPermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BlazingHellhound.java b/Mage.Sets/src/mage/cards/b/BlazingHellhound.java index d1bb7f99b0..ac07422a24 100644 --- a/Mage.Sets/src/mage/cards/b/BlazingHellhound.java +++ b/Mage.Sets/src/mage/cards/b/BlazingHellhound.java @@ -37,28 +37,20 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetCreatureOrPlayer; import java.util.UUID; +import mage.filter.StaticFilters; /** * * @author fireshoes */ public class BlazingHellhound extends CardImpl { - - private static final FilterControlledPermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } public BlazingHellhound(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{R}"); this.subtype.add("Elemental"); this.subtype.add("Hound"); this.power = new MageInt(4); @@ -66,7 +58,7 @@ public class BlazingHellhound extends CardImpl { // {1}, Sacrifice another creature: Blazing Hellhound deals 1 damage to target creature or player. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new ManaCostsImpl("{1}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); ability.addTarget(new TargetCreatureOrPlayer()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/BloodBairn.java b/Mage.Sets/src/mage/cards/b/BloodBairn.java index a9a14a02c8..b4583c5b26 100644 --- a/Mage.Sets/src/mage/cards/b/BloodBairn.java +++ b/Mage.Sets/src/mage/cards/b/BloodBairn.java @@ -36,11 +36,10 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledCreaturePermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -48,13 +47,8 @@ import java.util.UUID; */ public class BloodBairn extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } - public BloodBairn(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add("Vampire"); this.power = new MageInt(2); @@ -63,8 +57,8 @@ public class BloodBairn extends CardImpl { // Sacrifice another creature: Blood Bairn gets +2/+2 until end of turn. this.addAbility(new SimpleActivatedAbility( Zone.BATTLEFIELD, - new BoostSourceEffect(2,2, Duration.EndOfTurn), - new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1,filter, true)))); + new BoostSourceEffect(2, 2, Duration.EndOfTurn), + new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, true)))); } diff --git a/Mage.Sets/src/mage/cards/b/BloodHost.java b/Mage.Sets/src/mage/cards/b/BloodHost.java index 2b6bf81db6..55c5c0f711 100644 --- a/Mage.Sets/src/mage/cards/b/BloodHost.java +++ b/Mage.Sets/src/mage/cards/b/BloodHost.java @@ -40,26 +40,19 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledPermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * * @author emerald000 */ public class BloodHost extends CardImpl { - - private static final FilterControlledPermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } public BloodHost(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); this.subtype.add("Vampire"); this.power = new MageInt(3); @@ -69,7 +62,7 @@ public class BloodHost extends CardImpl { Effect effect = new AddCountersSourceEffect(CounterType.P1P1.createInstance()); effect.setText("Put a +1/+1 counter on {this}"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{1}{B}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); // and you gain 2 life. effect = new GainLifeEffect(2); effect.setText("and you gain 2 life"); @@ -85,4 +78,4 @@ public class BloodHost extends CardImpl { public BloodHost copy() { return new BloodHost(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/b/BontuTheGlorified.java b/Mage.Sets/src/mage/cards/b/BontuTheGlorified.java index 179ff976b2..f81c3ac33a 100644 --- a/Mage.Sets/src/mage/cards/b/BontuTheGlorified.java +++ b/Mage.Sets/src/mage/cards/b/BontuTheGlorified.java @@ -47,8 +47,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -61,12 +60,6 @@ import mage.watchers.common.CreaturesDiedWatcher; */ public class BontuTheGlorified extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public BontuTheGlorified(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); addSuperType(SuperType.LEGENDARY); @@ -89,7 +82,7 @@ public class BontuTheGlorified extends CardImpl { Effect effect = new GainLifeEffect(1); effect.setText("and you gain 1 life"); ability.addEffect(effect); - ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/b/ButcherOfTheHorde.java b/Mage.Sets/src/mage/cards/b/ButcherOfTheHorde.java index ce2fc76b96..b07a1ec491 100644 --- a/Mage.Sets/src/mage/cards/b/ButcherOfTheHorde.java +++ b/Mage.Sets/src/mage/cards/b/ButcherOfTheHorde.java @@ -47,8 +47,6 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetControlledCreaturePermanent; @@ -56,6 +54,7 @@ import mage.target.common.TargetControlledCreaturePermanent; import java.util.HashSet; import java.util.Set; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -63,14 +62,8 @@ import java.util.UUID; */ public class ButcherOfTheHorde extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public ButcherOfTheHorde(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{W}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}{B}"); this.subtype.add("Demon"); this.power = new MageInt(5); @@ -80,7 +73,8 @@ public class ButcherOfTheHorde extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Sacrifice another creature: Butcher of the Horde gains your choice of vigilance, lifelink, or haste until end of turn. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, - new ButcherOfTheHordeEffect(), new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1,filter, false)))); + new ButcherOfTheHordeEffect(), new SacrificeTargetCost( + new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false)))); } public ButcherOfTheHorde(final ButcherOfTheHorde card) { @@ -94,6 +88,7 @@ public class ButcherOfTheHorde extends CardImpl { } class ButcherOfTheHordeEffect extends OneShotEffect { + ButcherOfTheHordeEffect() { super(Outcome.AddAbility); staticText = "{this} gains your choice of vigilance, lifelink, or haste until end of turn"; @@ -148,4 +143,4 @@ class ButcherOfTheHordeEffect extends OneShotEffect { return new ButcherOfTheHordeEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/c/CartelAristocrat.java b/Mage.Sets/src/mage/cards/c/CartelAristocrat.java index 18b4f515dd..390953b993 100644 --- a/Mage.Sets/src/mage/cards/c/CartelAristocrat.java +++ b/Mage.Sets/src/mage/cards/c/CartelAristocrat.java @@ -36,12 +36,10 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledPermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * Gatecrash FAQ (01.2013) You choose the color when the ability resolves. @@ -50,14 +48,8 @@ import java.util.UUID; */ public class CartelAristocrat extends CardImpl { - private static final FilterControlledPermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public CartelAristocrat(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{B}"); this.subtype.add("Human"); this.subtype.add("Advisor"); @@ -66,7 +58,8 @@ public class CartelAristocrat extends CardImpl { // Sacrifice another creature: Cartel Aristocrat gains protection from the color of your choice until end of turn. this.addAbility(new SimpleActivatedAbility( - Zone.BATTLEFIELD, new GainProtectionFromColorSourceEffect(Duration.EndOfTurn), new SacrificeTargetCost(new TargetControlledPermanent(filter)))); + Zone.BATTLEFIELD, new GainProtectionFromColorSourceEffect(Duration.EndOfTurn), + new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)))); } public CartelAristocrat(final CartelAristocrat card) { diff --git a/Mage.Sets/src/mage/cards/c/CorpseBlockade.java b/Mage.Sets/src/mage/cards/c/CorpseBlockade.java index b81fb701b6..4bc629a5c4 100644 --- a/Mage.Sets/src/mage/cards/c/CorpseBlockade.java +++ b/Mage.Sets/src/mage/cards/c/CorpseBlockade.java @@ -38,11 +38,10 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledCreaturePermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -50,13 +49,8 @@ import java.util.UUID; */ public class CorpseBlockade extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } - public CorpseBlockade(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add("Zombie"); this.power = new MageInt(1); @@ -69,7 +63,7 @@ public class CorpseBlockade extends CardImpl { this.addAbility(new SimpleActivatedAbility( Zone.BATTLEFIELD, new GainAbilitySourceEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn), - new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1,filter, true)))); + new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, true)))); } public CorpseBlockade(final CorpseBlockade card) { diff --git a/Mage.Sets/src/mage/cards/d/DiscipleOfBolas.java b/Mage.Sets/src/mage/cards/d/DiscipleOfBolas.java index 2fd39336ec..1f844b6e21 100644 --- a/Mage.Sets/src/mage/cards/d/DiscipleOfBolas.java +++ b/Mage.Sets/src/mage/cards/d/DiscipleOfBolas.java @@ -35,8 +35,6 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -44,6 +42,7 @@ import mage.target.Target; import mage.target.common.TargetControlledCreaturePermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -52,7 +51,7 @@ import java.util.UUID; public class DiscipleOfBolas extends CardImpl { public DiscipleOfBolas(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); this.subtype.add("Human"); this.subtype.add("Wizard"); @@ -90,12 +89,10 @@ class DiscipleOfBolasEffect extends OneShotEffect { } @Override - public boolean apply(Game game, Ability source) { + public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - filter.add(new AnotherPredicate()); - Target target = new TargetControlledCreaturePermanent(1,1, filter, true); + Target target = new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, true); target.setRequired(true); if (target.canChoose(source.getSourceId(), source.getControllerId(), game)) { controller.chooseTarget(outcome, target, source, game); @@ -112,5 +109,3 @@ class DiscipleOfBolasEffect extends OneShotEffect { return false; } } - - diff --git a/Mage.Sets/src/mage/cards/d/Dreamstealer.java b/Mage.Sets/src/mage/cards/d/Dreamstealer.java new file mode 100644 index 0000000000..5261bd39c6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/Dreamstealer.java @@ -0,0 +1,108 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.EternalizeAbility; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class Dreamstealer extends CardImpl { + + public Dreamstealer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Menace + this.addAbility(new MenaceAbility()); + + // When Dreamstealer deals combat damage to a player, that player discards that many cards. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DreamstealerDiscardEffect(), false, true)); + + // Eternalize {4}{B}{B} + this.addAbility(new EternalizeAbility(new ManaCostsImpl("{4}{B}{B}"), this)); + + } + + public Dreamstealer(final Dreamstealer card) { + super(card); + } + + @Override + public Dreamstealer copy() { + return new Dreamstealer(this); + } +} + +class DreamstealerDiscardEffect extends OneShotEffect { + + public DreamstealerDiscardEffect() { + super(Outcome.Discard); + this.staticText = "that player discards that many cards"; + } + + public DreamstealerDiscardEffect(final DreamstealerDiscardEffect effect) { + super(effect); + } + + @Override + public DreamstealerDiscardEffect copy() { + return new DreamstealerDiscardEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source)); + if (targetPlayer != null) { + int damage = (Integer) getValue("damage"); + targetPlayer.discard(damage, false, source, game); + game.informPlayers(targetPlayer.getLogName() + "discards " + damage + " card(s)"); + return true; + } + return false; + } + +} diff --git a/Mage.Sets/src/mage/cards/e/EaterOfHope.java b/Mage.Sets/src/mage/cards/e/EaterOfHope.java index 542c8595d0..38fd517e5e 100644 --- a/Mage.Sets/src/mage/cards/e/EaterOfHope.java +++ b/Mage.Sets/src/mage/cards/e/EaterOfHope.java @@ -27,6 +27,7 @@ */ package mage.cards.e; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -39,29 +40,26 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; -import java.util.UUID; - /** * * @author Quercitron */ public class EaterOfHope extends CardImpl { - private static final FilterControlledCreaturePermanent regenFilter = new FilterControlledCreaturePermanent("another creature"); private static final FilterControlledCreaturePermanent destroyFilter = new FilterControlledCreaturePermanent("two other creatures"); static { - regenFilter.add(new AnotherPredicate()); destroyFilter.add(new AnotherPredicate()); } public EaterOfHope(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{B}{B}"); this.subtype.add("Demon"); this.power = new MageInt(6); @@ -72,7 +70,7 @@ public class EaterOfHope extends CardImpl { // {B}, Sacrifice another creature: Regenerate Eater of Hope. Ability regenAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{B}")); - regenAbility.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, regenFilter, true))); + regenAbility.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, true))); this.addAbility(regenAbility); // {2}{B}, Sacrifice two other creatures: Destroy target creature. diff --git a/Mage.Sets/src/mage/cards/f/FelhideBrawler.java b/Mage.Sets/src/mage/cards/f/FelhideBrawler.java index b7160c37b4..f1c720e790 100644 --- a/Mage.Sets/src/mage/cards/f/FelhideBrawler.java +++ b/Mage.Sets/src/mage/cards/f/FelhideBrawler.java @@ -27,23 +27,18 @@ */ package mage.cards.f; +import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.combat.CantBlockUnlessYouControlSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.AnotherPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; - -import java.util.UUID; /** * @@ -51,15 +46,22 @@ import java.util.UUID; */ public class FelhideBrawler extends CardImpl { + private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Minotaur"); + + static { + filter.add(new SubtypePredicate(SubType.MINOTAUR)); + filter.add(new AnotherPredicate()); + } + public FelhideBrawler(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); this.subtype.add("Minotaur"); this.power = new MageInt(2); this.toughness = new MageInt(2); // Felhide Brawler can't block unless you control another Minotaur. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new FelhideBrawlerRestrictionEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockUnlessYouControlSourceEffect(filter))); } public FelhideBrawler(final FelhideBrawler card) { @@ -71,42 +73,3 @@ public class FelhideBrawler extends CardImpl { return new FelhideBrawler(this); } } - -class FelhideBrawlerRestrictionEffect extends RestrictionEffect { - - private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Minotaur"); - - static { - filter.add(new SubtypePredicate(SubType.MINOTAUR)); - filter.add(new AnotherPredicate()); - } - - public FelhideBrawlerRestrictionEffect() { - super(Duration.WhileOnBattlefield); - - staticText = "{this} can't block unless you control another Minotaur"; - } - - public FelhideBrawlerRestrictionEffect(final FelhideBrawlerRestrictionEffect effect) { - super(effect); - } - - @Override - public FelhideBrawlerRestrictionEffect copy() { - return new FelhideBrawlerRestrictionEffect(this); - } - - @Override - public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { - return false; - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - if (permanent.getId().equals(source.getSourceId()) - && game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game) == 0) { - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/f/FellShepherd.java b/Mage.Sets/src/mage/cards/f/FellShepherd.java index d14f87a448..d751d0e421 100644 --- a/Mage.Sets/src/mage/cards/f/FellShepherd.java +++ b/Mage.Sets/src/mage/cards/f/FellShepherd.java @@ -40,8 +40,6 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; @@ -53,6 +51,7 @@ import mage.watchers.Watcher; import java.util.HashSet; import java.util.Set; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -60,13 +59,8 @@ import java.util.UUID; */ public class FellShepherd extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } - public FellShepherd(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{B}{B}"); this.subtype.add("Avatar"); this.power = new MageInt(8); @@ -76,8 +70,8 @@ public class FellShepherd extends CardImpl { this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new FellShepherdEffect(), true), new FellShepherdWatcher()); // {B}, Sacrifice another creature: Target creature gets -2/-2 until end of turn. - SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-2,-2, Duration.EndOfTurn), new ManaCostsImpl("{B}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, false))); + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-2, -2, Duration.EndOfTurn), new ManaCostsImpl("{B}")); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false))); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); @@ -120,7 +114,7 @@ class FellShepherdWatcher extends Watcher { public void watch(GameEvent event, Game game) { if (event.getType() == EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).isDiesEvent()) { MageObject card = game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); - if (card != null && ((Card)card).getOwnerId().equals(this.controllerId) && card.isCreature()) { + if (card != null && ((Card) card).getOwnerId().equals(this.controllerId) && card.isCreature()) { creatureIds.add(card.getId()); } } @@ -163,7 +157,7 @@ class FellShepherdEffect extends OneShotEffect { } } } - if (sb.length()> 0) { + if (sb.length() > 0) { sb.insert(0, "Fell Shepherd - returning to hand:"); game.informPlayers(sb.toString()); } diff --git a/Mage.Sets/src/mage/cards/f/FiligreeFracture.java b/Mage.Sets/src/mage/cards/f/FiligreeFracture.java index 0ca22a469f..6b3033faf9 100644 --- a/Mage.Sets/src/mage/cards/f/FiligreeFracture.java +++ b/Mage.Sets/src/mage/cards/f/FiligreeFracture.java @@ -27,22 +27,19 @@ */ package mage.cards.f; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.DestroyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; import mage.filter.common.FilterArtifactOrEnchantmentPermanent; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; -import java.util.UUID; - /** * * @author North @@ -50,11 +47,10 @@ import java.util.UUID; public class FiligreeFracture extends CardImpl { public FiligreeFracture(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}"); // Destroy target artifact or enchantment. If that permanent was blue or black, draw a card. this.getSpellAbility().addTarget(new TargetPermanent(new FilterArtifactOrEnchantmentPermanent())); - this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addEffect(new FiligreeFractureEffect()); } @@ -71,8 +67,8 @@ public class FiligreeFracture extends CardImpl { class FiligreeFractureEffect extends OneShotEffect { public FiligreeFractureEffect() { - super(Outcome.DrawCard); - this.staticText = "If that permanent was blue or black, draw a card"; + super(Outcome.DestroyPermanent); + this.staticText = "Destroy target artifact or enchantment. If that permanent was blue or black, draw a card"; } public FiligreeFractureEffect(final FiligreeFractureEffect effect) { @@ -87,10 +83,13 @@ class FiligreeFractureEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - Permanent permanent = (Permanent) game.getLastKnownInformation(source.getFirstTarget(), Zone.BATTLEFIELD); - if (player != null && permanent != null - && (permanent.getColor(game).isBlack() || permanent.getColor(game).isBlue())) { - player.drawCards(1, game); + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (player != null && permanent != null) { + permanent.destroy(source.getSourceId(), game, true); + game.applyEffects(); + if (permanent.getColor(game).isBlack() || permanent.getColor(game).isBlue()) { + player.drawCards(1, game); + } return true; } return false; diff --git a/Mage.Sets/src/mage/cards/f/FleshCarver.java b/Mage.Sets/src/mage/cards/f/FleshCarver.java index 156563f1d5..ccde49e610 100644 --- a/Mage.Sets/src/mage/cards/f/FleshCarver.java +++ b/Mage.Sets/src/mage/cards/f/FleshCarver.java @@ -45,8 +45,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; @@ -60,12 +59,6 @@ import mage.target.common.TargetControlledPermanent; */ public class FleshCarver extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public FleshCarver(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add("Human"); @@ -78,7 +71,7 @@ public class FleshCarver extends CardImpl { this.addAbility(IntimidateAbility.getInstance()); // {1}{B}, Sacrifice another creature: Put two +1/+1 counters on Flesh Carver. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)), new ManaCostsImpl("{1}{B}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); this.addAbility(ability); // When Flesh Carver dies, create an X/X black Horror creature token, where X is Flesh Carver's power. diff --git a/Mage.Sets/src/mage/cards/g/GhoulcallerGisa.java b/Mage.Sets/src/mage/cards/g/GhoulcallerGisa.java index 8d84ca91fb..e9e76db1fd 100644 --- a/Mage.Sets/src/mage/cards/g/GhoulcallerGisa.java +++ b/Mage.Sets/src/mage/cards/g/GhoulcallerGisa.java @@ -42,13 +42,12 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.game.permanent.token.Token; import mage.game.permanent.token.ZombieToken; import mage.target.common.TargetControlledCreaturePermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -56,14 +55,8 @@ import java.util.UUID; */ public class GhoulcallerGisa extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public GhoulcallerGisa(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); addSuperType(SuperType.LEGENDARY); this.subtype.add("Human"); this.subtype.add("Wizard"); @@ -79,7 +72,7 @@ public class GhoulcallerGisa extends CardImpl { effect.setText("create X 2/2 black Zombie creature tokens, where X is the sacrificed creature's power"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{B}")); ability.addCost(new TapSourceCost()); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter))); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GobblingOoze.java b/Mage.Sets/src/mage/cards/g/GobblingOoze.java index 3609400edb..8e47aa8ff7 100644 --- a/Mage.Sets/src/mage/cards/g/GobblingOoze.java +++ b/Mage.Sets/src/mage/cards/g/GobblingOoze.java @@ -38,34 +38,27 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledCreaturePermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * * @author LevelX2 */ public class GobblingOoze extends CardImpl { - - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } - public GobblingOoze(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); this.subtype.add("Ooze"); this.power = new MageInt(3); this.toughness = new MageInt(3); // {G}, Sacrifice another creature: Put a +1/+1 counter on Gobbling Ooze. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)),new ManaCostsImpl("{G}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, false))); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)), new ManaCostsImpl("{G}")); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/g/GoldnightCommander.java b/Mage.Sets/src/mage/cards/g/GoldnightCommander.java index 0371c8f3ed..c660f321b7 100644 --- a/Mage.Sets/src/mage/cards/g/GoldnightCommander.java +++ b/Mage.Sets/src/mage/cards/g/GoldnightCommander.java @@ -27,6 +27,7 @@ */ package mage.cards.g; +import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.effects.common.continuous.BoostControlledEffect; @@ -35,22 +36,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; - -import java.util.UUID; +import mage.filter.StaticFilters; /** * @author Loki */ public class GoldnightCommander extends CardImpl { - private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public GoldnightCommander(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); this.subtype.add("Human"); @@ -61,7 +53,8 @@ public class GoldnightCommander extends CardImpl { this.toughness = new MageInt(2); // Whenever another creature enters the battlefield under your control, creatures you control get +1/+1 until end of turn. - this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.EndOfTurn), filter, false, null, true)); + this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, + new BoostControlledEffect(1, 1, Duration.EndOfTurn), StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false, null, true)); } public GoldnightCommander(final GoldnightCommander card) { diff --git a/Mage.Sets/src/mage/cards/g/GriffinProtector.java b/Mage.Sets/src/mage/cards/g/GriffinProtector.java index f6a9af33f4..fb63c10eb2 100644 --- a/Mage.Sets/src/mage/cards/g/GriffinProtector.java +++ b/Mage.Sets/src/mage/cards/g/GriffinProtector.java @@ -36,10 +36,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -47,12 +46,6 @@ import java.util.UUID; */ public class GriffinProtector extends CardImpl { - private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public GriffinProtector(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); this.subtype.add("Griffin"); @@ -64,7 +57,8 @@ public class GriffinProtector extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever another creature enters the battlefield under your control, Griffin Protector gets +1/+1 until end of turn. - this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), filter, false, null, true)); + this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 1, Duration.EndOfTurn), + StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false, null, true)); } diff --git a/Mage.Sets/src/mage/cards/g/GrimgrinCorpseBorn.java b/Mage.Sets/src/mage/cards/g/GrimgrinCorpseBorn.java index 70f5cd9a8d..bb5480a4dd 100644 --- a/Mage.Sets/src/mage/cards/g/GrimgrinCorpseBorn.java +++ b/Mage.Sets/src/mage/cards/g/GrimgrinCorpseBorn.java @@ -43,9 +43,7 @@ import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.game.events.GameEvent; @@ -54,6 +52,7 @@ import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -61,13 +60,8 @@ import java.util.UUID; */ public class GrimgrinCorpseBorn extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } - public GrimgrinCorpseBorn(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{B}"); addSuperType(SuperType.LEGENDARY); this.subtype.add("Zombie"); this.subtype.add("Warrior"); @@ -80,10 +74,10 @@ public class GrimgrinCorpseBorn extends CardImpl { "{this} enters the battlefield tapped and doesn't untap during your untap step."); ability.addEffect(new DontUntapInControllersUntapStepSourceEffect()); this.addAbility(ability); - + // Sacrifice another creature: Untap Grimgrin and put a +1/+1 counter on it. ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapSourceEffect(), - new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, false))); + new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false))); ability.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance())); this.addAbility(ability); // Whenever Grimgrin attacks, destroy target creature defending player controls, then put a +1/+1 counter on Grimgrin. @@ -140,4 +134,4 @@ class GrimgrinCorpseBornAbility extends TriggeredAbilityImpl { public GrimgrinCorpseBornAbility copy() { return new GrimgrinCorpseBornAbility(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/h/HealerOfThePride.java b/Mage.Sets/src/mage/cards/h/HealerOfThePride.java index eed2676f4f..42a0dca5f6 100644 --- a/Mage.Sets/src/mage/cards/h/HealerOfThePride.java +++ b/Mage.Sets/src/mage/cards/h/HealerOfThePride.java @@ -35,8 +35,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; /** * @@ -44,12 +43,6 @@ import mage.filter.predicate.permanent.AnotherPredicate; */ public class HealerOfThePride extends CardImpl { - private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public HealerOfThePride(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); this.subtype.add("Cat"); @@ -59,7 +52,8 @@ public class HealerOfThePride extends CardImpl { this.toughness = new MageInt(3); // Whenever another creature enters the battlefield under your control, you gain 2 life. - this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new GainLifeEffect(2), filter, false, null, true)); + this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new GainLifeEffect(2), + StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false, null, true)); } diff --git a/Mage.Sets/src/mage/cards/h/HeartPiercerManticore.java b/Mage.Sets/src/mage/cards/h/HeartPiercerManticore.java index 393e4d6e5a..0ec3b29b51 100644 --- a/Mage.Sets/src/mage/cards/h/HeartPiercerManticore.java +++ b/Mage.Sets/src/mage/cards/h/HeartPiercerManticore.java @@ -43,8 +43,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; @@ -91,12 +90,6 @@ public class HeartPiercerManticore extends CardImpl { class HeartPiercerManticoreSacrificeEffect extends OneShotEffect { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public HeartPiercerManticoreSacrificeEffect() { super(Outcome.Damage); this.staticText = "you may sacrifice another creature"; @@ -115,7 +108,7 @@ class HeartPiercerManticoreSacrificeEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - Target target = new TargetControlledCreaturePermanent(1, 1, filter, true); + Target target = new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, true); if (controller.choose(outcome, target, source.getSourceId(), game)) { Permanent toSacrifice = game.getPermanent(target.getFirstTarget()); if (toSacrifice != null) { diff --git a/Mage.Sets/src/mage/cards/h/HourOfGlory.java b/Mage.Sets/src/mage/cards/h/HourOfGlory.java new file mode 100644 index 0000000000..d46951839b --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HourOfGlory.java @@ -0,0 +1,113 @@ +/* + * 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.h; + +import java.util.HashSet; +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.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class HourOfGlory extends CardImpl { + + public HourOfGlory(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{B}"); + + // Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature. + this.getSpellAbility().addEffect(new HourOfGloryEffect()); + } + + public HourOfGlory(final HourOfGlory card) { + super(card); + } + + @Override + public HourOfGlory copy() { + return new HourOfGlory(this); + } +} + +class HourOfGloryEffect extends OneShotEffect { + + public HourOfGloryEffect() { + super(Outcome.Exile); + this.staticText = "Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature"; + } + + public HourOfGloryEffect(final HourOfGloryEffect effect) { + super(effect); + } + + @Override + public HourOfGloryEffect copy() { + return new HourOfGloryEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = source.getSourceObject(game); + if (controller != null && sourceObject != null) { + Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (targetCreature != null) { + controller.moveCards(targetCreature, Zone.EXILED, source, game); + if (targetCreature.hasSubtype(SubType.GOD.getDescription(), game)) { + game.applyEffects(); + Player targetController = game.getPlayer(targetCreature.getControllerId()); + if (targetController != null) { + targetController.revealCards(sourceObject.getIdName(), targetController.getHand(), game); + Set toExile = new HashSet<>(); + for (Card card : targetController.getHand().getCards(game)) { + if (card.getName().equals(targetCreature.getName())) { + toExile.add(card); + } + } + targetController.moveCards(toExile, Zone.EXILED, source, game); + } + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/h/HowlpackWolf.java b/Mage.Sets/src/mage/cards/h/HowlpackWolf.java index 7f380773e3..e48fee85f2 100644 --- a/Mage.Sets/src/mage/cards/h/HowlpackWolf.java +++ b/Mage.Sets/src/mage/cards/h/HowlpackWolf.java @@ -29,21 +29,17 @@ package mage.cards.h; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.combat.CantBlockUnlessYouControlSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.AnotherPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; /** * @@ -51,14 +47,21 @@ import mage.game.permanent.Permanent; */ public class HowlpackWolf extends CardImpl { + private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Wolf or Werewolf"); + + static { + filter.add(Predicates.or(new SubtypePredicate(SubType.WOLF), new SubtypePredicate(SubType.WEREWOLF))); + filter.add(new AnotherPredicate()); + } + public HowlpackWolf(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); this.subtype.add("Wolf"); this.power = new MageInt(3); this.toughness = new MageInt(3); // Howlpack Wolf can't block unless you control another Wolf or Werewolf. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new HowlpackWolfRestrictionEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockUnlessYouControlSourceEffect(filter))); } public HowlpackWolf(final HowlpackWolf card) { @@ -70,39 +73,3 @@ public class HowlpackWolf extends CardImpl { return new HowlpackWolf(this); } } - -class HowlpackWolfRestrictionEffect extends RestrictionEffect { - - private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Wolf or Werewolf"); - - static { - filter.add(Predicates.or(new SubtypePredicate(SubType.WOLF), new SubtypePredicate(SubType.WEREWOLF))); - filter.add(new AnotherPredicate()); - } - - public HowlpackWolfRestrictionEffect() { - super(Duration.WhileOnBattlefield); - - staticText = "{this} can't block unless you control another Wolf or Werewolf"; - } - - public HowlpackWolfRestrictionEffect(final HowlpackWolfRestrictionEffect effect) { - super(effect); - } - - @Override - public HowlpackWolfRestrictionEffect copy() { - return new HowlpackWolfRestrictionEffect(this); - } - - @Override - public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { - return false; - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - return permanent.getId().equals(source.getSourceId()) - && game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game) == 0; - } -} diff --git a/Mage.Sets/src/mage/cards/j/JaliraMasterPolymorphist.java b/Mage.Sets/src/mage/cards/j/JaliraMasterPolymorphist.java index 81553a7661..b5526b1b33 100644 --- a/Mage.Sets/src/mage/cards/j/JaliraMasterPolymorphist.java +++ b/Mage.Sets/src/mage/cards/j/JaliraMasterPolymorphist.java @@ -39,14 +39,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.SupertypePredicate; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledCreaturePermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -55,10 +54,8 @@ import java.util.UUID; public class JaliraMasterPolymorphist extends CardImpl { private static final FilterCreatureCard filterCard = new FilterCreatureCard("nonlegendary creature card"); - private static final FilterControlledCreaturePermanent filterPermanent = new FilterControlledCreaturePermanent("another creature"); static { - filterPermanent.add(new AnotherPredicate()); filterCard.add(Predicates.not(new SupertypePredicate(SuperType.LEGENDARY))); } @@ -75,7 +72,7 @@ public class JaliraMasterPolymorphist extends CardImpl { // Put that card onto the battlefield and the rest on the bottom of your library in a random order. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RevealCardsFromLibraryUntilEffect(filterCard, Zone.BATTLEFIELD, Zone.LIBRARY), new ManaCostsImpl("{2}{U}")); ability.addCost(new TapSourceCost()); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filterPermanent, true))); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, true))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java b/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java index c4a8e2d663..334edb009a 100644 --- a/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java +++ b/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java @@ -42,15 +42,14 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetControlledPermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -60,22 +59,18 @@ public class JaradGolgariLichLord extends CardImpl { private static final FilterControlledPermanent filterSwamp = new FilterControlledPermanent("a Swamp"); private static final FilterControlledPermanent filterForest = new FilterControlledPermanent("a Forest"); - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); static { - filter.add(new AnotherPredicate()); filterSwamp.add(new SubtypePredicate(SubType.SWAMP)); filterForest.add(new SubtypePredicate(SubType.FOREST)); } public JaradGolgariLichLord(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}{B}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{B}{G}{G}"); addSuperType(SuperType.LEGENDARY); this.subtype.add("Zombie"); this.subtype.add("Elf"); - - this.power = new MageInt(2); this.toughness = new MageInt(2); @@ -83,12 +78,12 @@ public class JaradGolgariLichLord extends CardImpl { DynamicValue amount = new CardsInControllerGraveyardCount(new FilterCreatureCard()); Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(amount, amount, Duration.WhileOnBattlefield)); this.addAbility(ability); - + // {1}{B}{G}, Sacrifice another creature: Each opponent loses life equal to the sacrificed creature's power. - ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseLifeOpponentsEffect(new SacrificeCostCreaturesPower()),new ManaCostsImpl("{1}{B}{G}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, false))); + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseLifeOpponentsEffect(new SacrificeCostCreaturesPower()), new ManaCostsImpl("{1}{B}{G}")); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false))); this.addAbility(ability); - + // Sacrifice a Swamp and a Forest: Return Jarad from your graveyard to your hand. ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new SacrificeTargetCost(new TargetControlledPermanent(filterSwamp))); diff --git a/Mage.Sets/src/mage/cards/k/KheruBloodsucker.java b/Mage.Sets/src/mage/cards/k/KheruBloodsucker.java index bbd7f0d24d..9c445dce9e 100644 --- a/Mage.Sets/src/mage/cards/k/KheruBloodsucker.java +++ b/Mage.Sets/src/mage/cards/k/KheruBloodsucker.java @@ -44,33 +44,29 @@ import mage.constants.CardType; import mage.constants.TargetController; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.ToughnessPredicate; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.filter.predicate.permanent.ControllerPredicate; import mage.target.common.TargetControlledPermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * * @author emerald000 */ public class KheruBloodsucker extends CardImpl { - - private static final FilterControlledPermanent anotherFilter = new FilterControlledCreaturePermanent("another creature"); + private static final FilterCreaturePermanent toughnessFilter = new FilterCreaturePermanent("a creature you control with toughness 4 or greater"); static { - anotherFilter.add(new AnotherPredicate()); toughnessFilter.add(new ControllerPredicate(TargetController.YOU)); toughnessFilter.add(new ToughnessPredicate(ComparisonType.MORE_THAN, 3)); } public KheruBloodsucker(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add("Vampire"); this.power = new MageInt(2); @@ -82,10 +78,10 @@ public class KheruBloodsucker extends CardImpl { effect.setText("and you gain 2 life"); ability.addEffect(effect); this.addAbility(ability); - + // {2}{B}, Sacrifice another creature: Put a +1/+1 counter on Kheru Bloodsucker. ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance()), new ManaCostsImpl<>("{2}{B}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(anotherFilter))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KheruDreadmaw.java b/Mage.Sets/src/mage/cards/k/KheruDreadmaw.java index f5d94f6294..4b8e881ca9 100644 --- a/Mage.Sets/src/mage/cards/k/KheruDreadmaw.java +++ b/Mage.Sets/src/mage/cards/k/KheruDreadmaw.java @@ -41,9 +41,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.target.common.TargetControlledPermanent; /** @@ -51,14 +49,9 @@ import mage.target.common.TargetControlledPermanent; * @author emerald000 */ public class KheruDreadmaw extends CardImpl { - - private static final FilterControlledPermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } public KheruDreadmaw(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}"); this.subtype.add("Zombie"); this.subtype.add("Crocodile"); @@ -67,12 +60,12 @@ public class KheruDreadmaw extends CardImpl { // Defender this.addAbility(DefenderAbility.getInstance()); - + // {1}{G}, Sacrifice another creature: You gain life equal to the sacrificed creature's toughness. Effect effect = new GainLifeEffect(new SacrificeCostCreaturesToughness()); effect.setText("You gain life equal to the sacrificed creature's toughness"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{1}{G}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KruinStriker.java b/Mage.Sets/src/mage/cards/k/KruinStriker.java index 3381801151..3b5f291c21 100644 --- a/Mage.Sets/src/mage/cards/k/KruinStriker.java +++ b/Mage.Sets/src/mage/cards/k/KruinStriker.java @@ -38,9 +38,7 @@ import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; /** * @@ -48,13 +46,8 @@ import mage.filter.predicate.permanent.AnotherPredicate; */ public class KruinStriker extends CardImpl { - private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } - public KruinStriker(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); this.subtype.add("Human"); this.subtype.add("Warrior"); @@ -62,7 +55,7 @@ public class KruinStriker extends CardImpl { this.toughness = new MageInt(1); // Whenever another creature enters the battlefield under your control, Kruin Striker gets +1/+0 and gains trample until end of turn. - Ability ability = new EntersBattlefieldAllTriggeredAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn), filter, + Ability ability = new EntersBattlefieldAllTriggeredAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn), StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, "Whenever another creature enters the battlefield under your control, Kruin Striker gets +1/+0 and gains trample until end of turn."); ability.addEffect(new GainAbilitySourceEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/l/LilianasDefeat.java b/Mage.Sets/src/mage/cards/l/LilianasDefeat.java new file mode 100644 index 0000000000..0a2fbb3d4d --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LilianasDefeat.java @@ -0,0 +1,105 @@ +/* + * 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.l; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; + +/** + * + * @author LevelX2 + */ +public class LilianasDefeat extends CardImpl { + + public LilianasDefeat(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}"); + + FilterPermanent filter = new FilterCreatureOrPlaneswalkerPermanent("black creature or black planeswalker"); + filter.add(new ColorPredicate(ObjectColor.BLACK)); + // Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life. + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + } + + public LilianasDefeat(final LilianasDefeat card) { + super(card); + } + + @Override + public LilianasDefeat copy() { + return new LilianasDefeat(this); + } +} + +class LilianasDefeatEffect extends OneShotEffect { + + public LilianasDefeatEffect() { + super(Outcome.DestroyPermanent); + this.staticText = "Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life"; + } + + public LilianasDefeatEffect(final LilianasDefeatEffect effect) { + super(effect); + } + + @Override + public LilianasDefeatEffect copy() { + return new LilianasDefeatEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (player != null && permanent != null) { + permanent.destroy(source.getSourceId(), game, true); + game.applyEffects(); + if (permanent.isPlaneswalker() && permanent.getSubtype(game).contains(SubType.LILIANA.getDescription())) { + Player permanentController = game.getPlayer(permanent.getControllerId()); + if (permanentController != null) { + permanentController.loseLife(3, game, false); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/l/LukeSkywalker.java b/Mage.Sets/src/mage/cards/l/LukeSkywalker.java index cb0dfa4e72..5db1df1b12 100644 --- a/Mage.Sets/src/mage/cards/l/LukeSkywalker.java +++ b/Mage.Sets/src/mage/cards/l/LukeSkywalker.java @@ -1,134 +1,129 @@ -/* - * 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.l; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.Cost; -import mage.abilities.costs.CostImpl; -import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; -import mage.abilities.effects.common.counter.AddCountersSourceEffect; -import mage.abilities.keyword.HexproofAbility; -import mage.abilities.keyword.LifelinkAbility; -import mage.abilities.keyword.VigilanceAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.SuperType; -import mage.constants.Zone; -import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; - -/** - * - * @author Styxo - */ -public class LukeSkywalker extends CardImpl { - - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - - public LukeSkywalker(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}{W}{U}"); - this.addSuperType(SuperType.LEGENDARY); - this.subtype.add("Human"); - this.subtype.add("Jedi"); - this.power = new MageInt(2); - this.toughness = new MageInt(2); - - // Lifelink - this.addAbility(LifelinkAbility.getInstance()); - - // Vigilance - this.addAbility(VigilanceAbility.getInstance()); - - // Whenever another creature enters the battlefield under your conrol, put a +1/+1 counter on Luke Skywalker. - this.addAbility(new EntersBattlefieldAllTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), new FilterControlledCreaturePermanent(filter))); - - // Remove all +1/+1 counters from Luke Skywalker: Luke gains hexproof until end of turn. Activate this ability only if at least one +1/+1 counter is removed this way. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(HexproofAbility.getInstance(), Duration.EndOfTurn), new LukeSkywalkerCost())); - } - - public LukeSkywalker(final LukeSkywalker card) { - super(card); - } - - @Override - public LukeSkywalker copy() { - return new LukeSkywalker(this); - } -} - -class LukeSkywalkerCost extends CostImpl { - - public LukeSkywalkerCost() { - super(); - this.text = "Remove all +1/+1 counters from {this}"; - } - - public LukeSkywalkerCost(LukeSkywalkerCost cost) { - super(cost); - } - - @Override - public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { - Permanent permanent = game.getPermanent(ability.getSourceId()); - if (permanent != null) { - return (permanent.getCounters(game).getCount(CounterType.P1P1)) > 0; - } - return false; - } - - @Override - public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { - Permanent permanent = game.getPermanent(ability.getSourceId()); - if (permanent != null) { - int countersCount = permanent.getCounters(game).getCount(CounterType.P1P1); - permanent.removeCounters(CounterType.P1P1.createInstance(countersCount), game); - this.paid = true; - return true; - } - return false; - } - - @Override - public LukeSkywalkerCost copy() { - return new LukeSkywalkerCost(this); - } - -} +/* + * 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.l; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.CostImpl; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.HexproofAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author Styxo + */ +public class LukeSkywalker extends CardImpl { + + public LukeSkywalker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{W}{U}"); + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add("Human"); + this.subtype.add("Jedi"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Lifelink + this.addAbility(LifelinkAbility.getInstance()); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Whenever another creature enters the battlefield under your conrol, put a +1/+1 counter on Luke Skywalker. + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + new FilterControlledCreaturePermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); + + // Remove all +1/+1 counters from Luke Skywalker: Luke gains hexproof until end of turn. Activate this ability only if at least one +1/+1 counter is removed this way. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(HexproofAbility.getInstance(), Duration.EndOfTurn), new LukeSkywalkerCost())); + } + + public LukeSkywalker(final LukeSkywalker card) { + super(card); + } + + @Override + public LukeSkywalker copy() { + return new LukeSkywalker(this); + } +} + +class LukeSkywalkerCost extends CostImpl { + + public LukeSkywalkerCost() { + super(); + this.text = "Remove all +1/+1 counters from {this}"; + } + + public LukeSkywalkerCost(LukeSkywalkerCost cost) { + super(cost); + } + + @Override + public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { + Permanent permanent = game.getPermanent(ability.getSourceId()); + if (permanent != null) { + return (permanent.getCounters(game).getCount(CounterType.P1P1)) > 0; + } + return false; + } + + @Override + public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { + Permanent permanent = game.getPermanent(ability.getSourceId()); + if (permanent != null) { + int countersCount = permanent.getCounters(game).getCount(CounterType.P1P1); + permanent.removeCounters(CounterType.P1P1.createInstance(countersCount), game); + this.paid = true; + return true; + } + return false; + } + + @Override + public LukeSkywalkerCost copy() { + return new LukeSkywalkerCost(this); + } + +} diff --git a/Mage.Sets/src/mage/cards/m/MauraudingBoneslasher.java b/Mage.Sets/src/mage/cards/m/MauraudingBoneslasher.java new file mode 100644 index 0000000000..a4dc03a4c2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MauraudingBoneslasher.java @@ -0,0 +1,77 @@ +/* + * 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.m; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.combat.CantBlockUnlessYouControlSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author LevelX2 + */ +public class MauraudingBoneslasher extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie"); + + static { + filter.add(new SubtypePredicate(SubType.ZOMBIE)); + filter.add(new AnotherPredicate()); + } + + public MauraudingBoneslasher(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add("Zombie"); + this.subtype.add("Minotaur"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Marauding Boneslasher can't block unless you control another Zombie. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockUnlessYouControlSourceEffect(filter))); + + } + + public MauraudingBoneslasher(final MauraudingBoneslasher card) { + super(card); + } + + @Override + public MauraudingBoneslasher copy() { + return new MauraudingBoneslasher(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MindlessNull.java b/Mage.Sets/src/mage/cards/m/MindlessNull.java index 3b0469029d..da1476bcfb 100644 --- a/Mage.Sets/src/mage/cards/m/MindlessNull.java +++ b/Mage.Sets/src/mage/cards/m/MindlessNull.java @@ -29,19 +29,13 @@ package mage.cards.m; import java.util.UUID; import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.SubType; import mage.constants.Zone; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.combat.CantBlockUnlessYouControlSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; /** * @@ -50,13 +44,13 @@ import mage.game.permanent.Permanent; public class MindlessNull extends CardImpl { public MindlessNull(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add("Zombie"); this.power = new MageInt(2); this.toughness = new MageInt(2); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MindlessNullEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockUnlessYouControlSourceEffect(new FilterControlledPermanent("Vampire")))); } public MindlessNull(final MindlessNull card) { @@ -68,33 +62,3 @@ public class MindlessNull extends CardImpl { return new MindlessNull(this); } } - -class MindlessNullEffect extends RestrictionEffect { - - private final FilterControlledPermanent filter = new FilterControlledPermanent("Vampire"); - - public MindlessNullEffect() { - super(Duration.WhileOnBattlefield); - filter.add(new SubtypePredicate(SubType.VAMPIRE)); - staticText = "{this} can't block unless you control a Vampire"; - } - - public MindlessNullEffect(final MindlessNullEffect effect) { - super(effect); - } - - @Override - public MindlessNullEffect copy() { - return new MindlessNullEffect(this); - } - - @Override - public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { - return game.getBattlefield().countAll(filter, source.getControllerId(), game) != 0; - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - return permanent.getId().equals(source.getSourceId()); - } -} diff --git a/Mage.Sets/src/mage/cards/o/OliviaMobilizedForWar.java b/Mage.Sets/src/mage/cards/o/OliviaMobilizedForWar.java index 2f9ff781c7..db3d667e09 100644 --- a/Mage.Sets/src/mage/cards/o/OliviaMobilizedForWar.java +++ b/Mage.Sets/src/mage/cards/o/OliviaMobilizedForWar.java @@ -41,13 +41,11 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.counters.CounterType; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import java.util.ArrayList; import java.util.Collections; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -55,14 +53,8 @@ import java.util.UUID; */ public class OliviaMobilizedForWar extends CardImpl { - private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public OliviaMobilizedForWar(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{R}"); addSuperType(SuperType.LEGENDARY); this.subtype.add("Vampire"); this.subtype.add("Knight"); @@ -83,7 +75,8 @@ public class OliviaMobilizedForWar extends CardImpl { effect = new BecomesCreatureTypeTargetEffect(Duration.WhileOnBattlefield, new ArrayList<>(Collections.singletonList("Vampire")), false); effect.setText("and it becomes a Vampire in addition to its other types"); doIfCostPaid.addEffect(effect); - this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, doIfCostPaid, filter, false, SetTargetPointer.PERMANENT, null)); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, doIfCostPaid, + StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false, SetTargetPointer.PERMANENT, null)); } public OliviaMobilizedForWar(final OliviaMobilizedForWar card) { diff --git a/Mage.Sets/src/mage/cards/p/ProsshSkyraiderOfKher.java b/Mage.Sets/src/mage/cards/p/ProsshSkyraiderOfKher.java index 48e6b838c8..8aa5f1d31c 100644 --- a/Mage.Sets/src/mage/cards/p/ProsshSkyraiderOfKher.java +++ b/Mage.Sets/src/mage/cards/p/ProsshSkyraiderOfKher.java @@ -42,8 +42,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SuperType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.game.permanent.token.ProsshKoboldToken; import mage.target.common.TargetControlledCreaturePermanent; @@ -53,12 +52,6 @@ import mage.target.common.TargetControlledCreaturePermanent; */ public class ProsshSkyraiderOfKher extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public ProsshSkyraiderOfKher(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{R}{G}"); addSuperType(SuperType.LEGENDARY); @@ -72,7 +65,8 @@ public class ProsshSkyraiderOfKher extends CardImpl { // When you cast Prossh, Skyraider of Kher, create X 0/1 red Kobold creature tokens named Kobolds of Kher Keep, where X is the amount of mana spent to cast Prossh. this.addAbility(new CastSourceTriggeredAbility(new CreateTokenEffect(new ProsshKoboldToken(), new ManaSpentToCastCount()), false)); // Sacrifice another creature: Prossh gets +1/+0 until end of turn. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Duration.EndOfTurn), new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, true)))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Duration.EndOfTurn), + new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, true)))); } public ProsshSkyraiderOfKher(final ProsshSkyraiderOfKher card) { diff --git a/Mage.Sets/src/mage/cards/q/QarsiHighPriest.java b/Mage.Sets/src/mage/cards/q/QarsiHighPriest.java index 9faff9c1de..20bb8b19ef 100644 --- a/Mage.Sets/src/mage/cards/q/QarsiHighPriest.java +++ b/Mage.Sets/src/mage/cards/q/QarsiHighPriest.java @@ -39,8 +39,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.target.common.TargetControlledCreaturePermanent; /** @@ -48,25 +47,18 @@ import mage.target.common.TargetControlledCreaturePermanent; * @author fireshoes */ public class QarsiHighPriest extends CardImpl { - - -private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } - public QarsiHighPriest(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}"); this.subtype.add("Human"); this.subtype.add("Cleric"); this.power = new MageInt(0); this.toughness = new MageInt(2); // {1}{B}, {t}, Sacrifice another creature: Manifest the top card of your library. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ManifestEffect(1),new ManaCostsImpl("{1}{B}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ManifestEffect(1), new ManaCostsImpl("{1}{B}")); ability.addCost(new TapSourceCost()); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, false))); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/r/RavenousWampa.java b/Mage.Sets/src/mage/cards/r/RavenousWampa.java index e846012d99..9ccc7334f2 100644 --- a/Mage.Sets/src/mage/cards/r/RavenousWampa.java +++ b/Mage.Sets/src/mage/cards/r/RavenousWampa.java @@ -1,150 +1,143 @@ -/* - * 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.r; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; -import mage.abilities.costs.Cost; -import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.keyword.MonstrosityAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetControlledPermanent; - -import static mage.cards.r.RavenousWampa.RAVENOUS_WAMPA_STATE_VALUE_KEY_PREFIX; - -/** - * - * @author Styxo - */ -public class RavenousWampa extends CardImpl { - - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - - static final String RAVENOUS_WAMPA_STATE_VALUE_KEY_PREFIX = "TOU_SAC_CRE"; - - public RavenousWampa(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R/W}{R/W}"); - this.subtype.add("Beast"); - this.power = new MageInt(4); - this.toughness = new MageInt(4); - - // {2}{G}, Sacrifice another creature: Monstrosity 2. - Ability ability = new MonstrosityAbility("{2}{G}", 2); - ability.addCost(new RavenousWampaSacrificeTargetCost(new TargetControlledCreaturePermanent(filter))); - this.addAbility(ability); - - // When Ravenous Wampa becomes monstrous, you gain life equal to the sacrificied creature's toughness. - this.addAbility(new BecomesMonstrousSourceTriggeredAbility(new RavenousWampaEffect())); - } - - public RavenousWampa(final RavenousWampa card) { - super(card); - } - - @Override - public RavenousWampa copy() { - return new RavenousWampa(this); - } -} - -class RavenousWampaEffect extends OneShotEffect { - - public RavenousWampaEffect() { - super(Outcome.GainLife); - this.staticText = "you gain life equal to the sacrificied creature's toughness"; - } - - public RavenousWampaEffect(final RavenousWampaEffect effect) { - super(effect); - } - - @Override - public RavenousWampaEffect copy() { - return new RavenousWampaEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - Permanent sourceObject = game.getPermanentOrLKIBattlefield(source.getSourceId()); - if (controller != null && sourceObject != null) { - Integer toughness = (Integer) game.getState().getValue(RAVENOUS_WAMPA_STATE_VALUE_KEY_PREFIX + source.getSourceId() + sourceObject.getZoneChangeCounter(game)); - if (toughness != null) { - controller.gainLife(toughness, game); - } - return true; - } - return false; - } -} - -class RavenousWampaSacrificeTargetCost extends SacrificeTargetCost { - - public RavenousWampaSacrificeTargetCost(TargetControlledPermanent target) { - super(target); - } - - public RavenousWampaSacrificeTargetCost(RavenousWampaSacrificeTargetCost cost) { - super(cost); - } - - @Override - public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { - boolean result = super.pay(ability, game, sourceId, controllerId, noMana, costToPay); - if (paid && !getPermanents().isEmpty()) { - Permanent sacrificedPermanen = getPermanents().get(0); - Permanent sourcePermanent = game.getPermanent(sourceId); - if (sourcePermanent != null && sacrificedPermanen != null) { - game.getState().setValue(RAVENOUS_WAMPA_STATE_VALUE_KEY_PREFIX + sourceId + sourcePermanent.getZoneChangeCounter(game), sacrificedPermanen.getToughness().getValue()); - } - } - return result; - } - - @Override - public RavenousWampaSacrificeTargetCost copy() { - return new RavenousWampaSacrificeTargetCost(this); - } - -} +/* + * 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.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.MonstrosityAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetControlledPermanent; + +import static mage.cards.r.RavenousWampa.RAVENOUS_WAMPA_STATE_VALUE_KEY_PREFIX; +import mage.filter.StaticFilters; + +/** + * + * @author Styxo + */ +public class RavenousWampa extends CardImpl { + + static final String RAVENOUS_WAMPA_STATE_VALUE_KEY_PREFIX = "TOU_SAC_CRE"; + + public RavenousWampa(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R/W}{R/W}"); + this.subtype.add("Beast"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // {2}{G}, Sacrifice another creature: Monstrosity 2. + Ability ability = new MonstrosityAbility("{2}{G}", 2); + ability.addCost(new RavenousWampaSacrificeTargetCost(new TargetControlledCreaturePermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); + this.addAbility(ability); + + // When Ravenous Wampa becomes monstrous, you gain life equal to the sacrificied creature's toughness. + this.addAbility(new BecomesMonstrousSourceTriggeredAbility(new RavenousWampaEffect())); + } + + public RavenousWampa(final RavenousWampa card) { + super(card); + } + + @Override + public RavenousWampa copy() { + return new RavenousWampa(this); + } +} + +class RavenousWampaEffect extends OneShotEffect { + + public RavenousWampaEffect() { + super(Outcome.GainLife); + this.staticText = "you gain life equal to the sacrificied creature's toughness"; + } + + public RavenousWampaEffect(final RavenousWampaEffect effect) { + super(effect); + } + + @Override + public RavenousWampaEffect copy() { + return new RavenousWampaEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent sourceObject = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (controller != null && sourceObject != null) { + Integer toughness = (Integer) game.getState().getValue(RAVENOUS_WAMPA_STATE_VALUE_KEY_PREFIX + source.getSourceId() + sourceObject.getZoneChangeCounter(game)); + if (toughness != null) { + controller.gainLife(toughness, game); + } + return true; + } + return false; + } +} + +class RavenousWampaSacrificeTargetCost extends SacrificeTargetCost { + + public RavenousWampaSacrificeTargetCost(TargetControlledPermanent target) { + super(target); + } + + public RavenousWampaSacrificeTargetCost(RavenousWampaSacrificeTargetCost cost) { + super(cost); + } + + @Override + public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { + boolean result = super.pay(ability, game, sourceId, controllerId, noMana, costToPay); + if (paid && !getPermanents().isEmpty()) { + Permanent sacrificedPermanen = getPermanents().get(0); + Permanent sourcePermanent = game.getPermanent(sourceId); + if (sourcePermanent != null && sacrificedPermanen != null) { + game.getState().setValue(RAVENOUS_WAMPA_STATE_VALUE_KEY_PREFIX + sourceId + sourcePermanent.getZoneChangeCounter(game), sacrificedPermanen.getToughness().getValue()); + } + } + return result; + } + + @Override + public RavenousWampaSacrificeTargetCost copy() { + return new RavenousWampaSacrificeTargetCost(this); + } + +} diff --git a/Mage.Sets/src/mage/cards/r/RazakethTheFoulblooded.java b/Mage.Sets/src/mage/cards/r/RazakethTheFoulblooded.java new file mode 100644 index 0000000000..e7f603b99b --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RazakethTheFoulblooded.java @@ -0,0 +1,84 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class RazakethTheFoulblooded extends CardImpl { + + public RazakethTheFoulblooded(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{B}{B}{B}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.DEMON.getDescription()); + this.power = new MageInt(8); + this.toughness = new MageInt(8); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Pay 2 life, Sacrifice another creature: Search your library for a card and put that card into your hand. Then shuffle your library. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SearchLibraryPutInHandEffect(new TargetCardInLibrary(), false, true), new PayLifeCost(2)); + ability.addCost(new SacrificeTargetCost( + new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false))); + this.addAbility(ability); + } + + public RazakethTheFoulblooded(final RazakethTheFoulblooded card) { + super(card); + } + + @Override + public RazakethTheFoulblooded copy() { + return new RazakethTheFoulblooded(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RubblebackRhino.java b/Mage.Sets/src/mage/cards/r/RubblebackRhino.java index 4648cf8c60..4bfc5a4c7f 100644 --- a/Mage.Sets/src/mage/cards/r/RubblebackRhino.java +++ b/Mage.Sets/src/mage/cards/r/RubblebackRhino.java @@ -33,23 +33,15 @@ import mage.MageInt; import mage.abilities.keyword.HexproofAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; /** * * @author LevelX2 */ public class RubblebackRhino extends CardImpl { - - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } - public RubblebackRhino(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); this.subtype.add("Rhino"); this.power = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/s/ScourgeOfSkolaVale.java b/Mage.Sets/src/mage/cards/s/ScourgeOfSkolaVale.java index 52a56a669c..ded35306c3 100644 --- a/Mage.Sets/src/mage/cards/s/ScourgeOfSkolaVale.java +++ b/Mage.Sets/src/mage/cards/s/ScourgeOfSkolaVale.java @@ -45,8 +45,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetControlledPermanent; @@ -57,14 +56,8 @@ import mage.target.common.TargetControlledPermanent; */ public class ScourgeOfSkolaVale extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public ScourgeOfSkolaVale(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); this.subtype.add("Hydra"); this.power = new MageInt(0); @@ -78,7 +71,7 @@ public class ScourgeOfSkolaVale extends CardImpl { this.addAbility(new EntersBattlefieldAbility(effect)); // {T}, Sacrifice another creature: Put a number of +1/+1 counters on Scourge of Skola Vale equal to the sacrificed creature's toughness. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ScourgeOfSkolaValeEffect(), new TapSourceCost()); - ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SuturePriest.java b/Mage.Sets/src/mage/cards/s/SuturePriest.java index 4ef303d7af..a88faa982a 100644 --- a/Mage.Sets/src/mage/cards/s/SuturePriest.java +++ b/Mage.Sets/src/mage/cards/s/SuturePriest.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.cards.s; import java.util.UUID; @@ -40,9 +39,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.EntersTheBattlefieldEvent; import mage.game.events.GameEvent; @@ -55,27 +52,23 @@ import mage.target.targetpointer.FixedTarget; */ public class SuturePriest extends CardImpl { - private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } - - public SuturePriest (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); + public SuturePriest(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); this.subtype.add("Cleric"); this.power = new MageInt(1); this.toughness = new MageInt(1); // Whenever another creature enters the battlefield under your control, you may gain 1 life. - this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new GainLifeEffect(1), filter, true)); + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new GainLifeEffect(1), + StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, true)); // Whenever a creature enters the battlefield under an opponent's control, you may have that player lose 1 life. this.addAbility(new SuturePriestSecondTriggeredAbility()); } - public SuturePriest (final SuturePriest card) { + public SuturePriest(final SuturePriest card) { super(card); } @@ -86,6 +79,7 @@ public class SuturePriest extends CardImpl { } class SuturePriestSecondTriggeredAbility extends TriggeredAbilityImpl { + SuturePriestSecondTriggeredAbility() { super(Zone.BATTLEFIELD, new LoseLifeTargetEffect(1), true); } @@ -107,11 +101,11 @@ class SuturePriestSecondTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (game.getOpponents(this.controllerId).contains(event.getPlayerId())) { - EntersTheBattlefieldEvent zEvent = (EntersTheBattlefieldEvent)event; + EntersTheBattlefieldEvent zEvent = (EntersTheBattlefieldEvent) event; Card card = zEvent.getTarget(); if (card != null && card.isCreature()) { for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getPlayerId())); + effect.setTargetPointer(new FixedTarget(event.getPlayerId())); } return true; } @@ -123,4 +117,4 @@ class SuturePriestSecondTriggeredAbility extends TriggeredAbilityImpl { public String getRule() { return "Whenever a creature enters the battlefield under an opponent's control, you may have that player lose 1 life."; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/t/TymaretTheMurderKing.java b/Mage.Sets/src/mage/cards/t/TymaretTheMurderKing.java index 915f587fea..fd209cf7eb 100644 --- a/Mage.Sets/src/mage/cards/t/TymaretTheMurderKing.java +++ b/Mage.Sets/src/mage/cards/t/TymaretTheMurderKing.java @@ -40,11 +40,11 @@ import mage.constants.CardType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.TargetPlayer; import mage.target.common.TargetControlledCreaturePermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -52,13 +52,8 @@ import java.util.UUID; */ public class TymaretTheMurderKing extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } - public TymaretTheMurderKing(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{R}"); addSuperType(SuperType.LEGENDARY); this.subtype.add("Zombie"); this.subtype.add("Warrior"); @@ -68,12 +63,12 @@ public class TymaretTheMurderKing extends CardImpl { // {1}{R}, Sacrifice another creature: Tymaret, the Murder King deals 2 damage to target player. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new ManaCostsImpl("{1}{R}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1, filter, false))); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false))); ability.addTarget(new TargetPlayer()); this.addAbility(ability); // {1}{B}, Sacrifice a creature: Return Tymaret from your graveyard to your hand. ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl("{1}{B}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1, new FilterControlledCreaturePermanent("a creature"), false))); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent("a creature"), false))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/v/VampireWarlord.java b/Mage.Sets/src/mage/cards/v/VampireWarlord.java index 3cac6b6528..8eee32e2df 100644 --- a/Mage.Sets/src/mage/cards/v/VampireWarlord.java +++ b/Mage.Sets/src/mage/cards/v/VampireWarlord.java @@ -36,8 +36,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.target.common.TargetControlledCreaturePermanent; /** @@ -46,13 +45,8 @@ import mage.target.common.TargetControlledCreaturePermanent; */ public class VampireWarlord extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - static { - filter.add(new AnotherPredicate()); - } - public VampireWarlord(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}"); this.subtype.add("Vampire"); this.subtype.add("Warrior"); @@ -60,7 +54,7 @@ public class VampireWarlord extends CardImpl { this.toughness = new MageInt(2); // Sacrifice another creature: Regenerate Vampire Warlord. - TargetControlledCreaturePermanent target = new TargetControlledCreaturePermanent(1,1, filter, false); + TargetControlledCreaturePermanent target = new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false); this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new SacrificeTargetCost(target))); } diff --git a/Mage.Sets/src/mage/cards/v/VarolzTheScarStriped.java b/Mage.Sets/src/mage/cards/v/VarolzTheScarStriped.java index bc89c12ad0..0e0d459c51 100644 --- a/Mage.Sets/src/mage/cards/v/VarolzTheScarStriped.java +++ b/Mage.Sets/src/mage/cards/v/VarolzTheScarStriped.java @@ -42,8 +42,7 @@ import mage.abilities.keyword.ScavengeAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetControlledCreaturePermanent; @@ -53,15 +52,9 @@ import mage.target.common.TargetControlledCreaturePermanent; * @author jeffwadsworth */ public class VarolzTheScarStriped extends CardImpl { - - private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } public VarolzTheScarStriped(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}"); addSuperType(SuperType.LEGENDARY); this.subtype.add("Troll"); this.subtype.add("Warrior"); @@ -73,7 +66,8 @@ public class VarolzTheScarStriped extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new VarolzTheScarStripedEffect())); // Sacrifice another creature: Regenerate Varolz, the Scar-Striped. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, true)))); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), + new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, true)))); } public VarolzTheScarStriped(final VarolzTheScarStriped card) { diff --git a/Mage.Sets/src/mage/cards/v/VoraciousNull.java b/Mage.Sets/src/mage/cards/v/VoraciousNull.java index 5cb049f613..2db34dae12 100644 --- a/Mage.Sets/src/mage/cards/v/VoraciousNull.java +++ b/Mage.Sets/src/mage/cards/v/VoraciousNull.java @@ -39,8 +39,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.StaticFilters; import mage.target.common.TargetControlledCreaturePermanent; /** @@ -49,21 +48,15 @@ import mage.target.common.TargetControlledCreaturePermanent; */ public class VoraciousNull extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public VoraciousNull(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add("Zombie"); this.power = new MageInt(2); this.toughness = new MageInt(2); // {1}{B}, Sacrifice another creature: Put two +1/+1 counters on Voracious Null. Activate this ability only any time you could cast a sorcery. Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)), new ManaCostsImpl("{1}{B}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, false))); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/y/YahenniUndyingPartisan.java b/Mage.Sets/src/mage/cards/y/YahenniUndyingPartisan.java index 0e8bcfdaf3..1096dacbc4 100644 --- a/Mage.Sets/src/mage/cards/y/YahenniUndyingPartisan.java +++ b/Mage.Sets/src/mage/cards/y/YahenniUndyingPartisan.java @@ -42,12 +42,11 @@ import mage.constants.Duration; import mage.constants.SuperType; import mage.constants.Zone; import mage.counters.CounterType; -import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterOpponentsCreaturePermanent; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.target.common.TargetControlledPermanent; import java.util.UUID; +import mage.filter.StaticFilters; /** * @@ -55,12 +54,6 @@ import java.util.UUID; */ public class YahenniUndyingPartisan extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature"); - - static { - filter.add(new AnotherPredicate()); - } - public YahenniUndyingPartisan(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); @@ -80,7 +73,7 @@ public class YahenniUndyingPartisan extends CardImpl { this.addAbility(new SimpleActivatedAbility( Zone.BATTLEFIELD, new GainAbilitySourceEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), - new SacrificeTargetCost(new TargetControlledPermanent(filter))) + new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))) ); } diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 936414f908..43c2e08323 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -78,15 +78,20 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); + cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Hour of Glory", 065, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); + cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); + cards.add(new SetCardInfo("Maurauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MauraudingBoneslasher.class)); cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); + cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/CantBlockUnlessYouControlSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/CantBlockUnlessYouControlSourceEffect.java new file mode 100644 index 0000000000..5014071c68 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/CantBlockUnlessYouControlSourceEffect.java @@ -0,0 +1,71 @@ +/* + * 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.abilities.effects.common.combat; + +import mage.abilities.Ability; +import mage.abilities.effects.RestrictionEffect; +import mage.constants.Duration; +import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author LevelX2 + */ +public class CantBlockUnlessYouControlSourceEffect extends RestrictionEffect { + + private final FilterControlledPermanent filter; + + public CantBlockUnlessYouControlSourceEffect(FilterControlledPermanent filter) { + super(Duration.WhileOnBattlefield); + this.filter = filter; + staticText = "{this} can't block unless you control" + filter.getMessage(); + } + + public CantBlockUnlessYouControlSourceEffect(final CantBlockUnlessYouControlSourceEffect effect) { + super(effect); + this.filter = effect.filter; + } + + @Override + public CantBlockUnlessYouControlSourceEffect copy() { + return new CantBlockUnlessYouControlSourceEffect(this); + } + + @Override + public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { + return false; + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + return permanent.getId().equals(source.getSourceId()) + && game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game) == 0; + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java b/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java index a5fb3f57c8..28d9aec01c 100644 --- a/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java @@ -117,7 +117,7 @@ class EternalizeEffect extends OneShotEffect { token.getToughness().modifyBaseValue(4); game.fireEvent(GameEvent.getEvent(GameEvent.EventType.EMBALMED_CREATURE, token.getId(), source.getSourceId(), controller.getId())); token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId(), false, false, null); - // Probably it makes sense to remove also the Embalm ability (it's not shown on the token cards). + // Probably it makes sense to remove also the Eternalize ability (it's not shown on the token cards). // Also it can never get active or? But it's not mentioned in the reminder text. return true; } diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index 945b5ff965..d6146142c0 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -17,6 +17,7 @@ import mage.filter.common.FilterCreatureSpell; import mage.filter.common.FilterNonlandCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; import mage.filter.predicate.permanent.AttackingPredicate; import mage.filter.predicate.permanent.TokenPredicate; @@ -30,6 +31,7 @@ public final class StaticFilters { public static final FilterPermanent FILTER_PERMANENT_ARTIFACT_OR_CREATURE = new FilterPermanent("artifact or creature"); public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT_OR_CREATURE = new FilterControlledPermanent("artifact or creature you control"); public static final FilterControlledPermanent FILTER_CONTROLLED_A_CREATURE = new FilterControlledCreaturePermanent("a creature you control"); + public static final FilterControlledCreaturePermanent FILTER_CONTROLLED_ANOTHER_CREATURE = new FilterControlledCreaturePermanent("another creature"); public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT = new FilterControlledArtifactPermanent(); public static final FilterArtifactCard FILTER_CARD_ARTIFACT = new FilterArtifactCard(); public static final FilterNonlandCard FILTER_CARD_NON_LAND = new FilterNonlandCard(); @@ -63,6 +65,8 @@ public final class StaticFilters { new CardTypePredicate(CardType.ARTIFACT), new CardTypePredicate(CardType.CREATURE) )); + FILTER_CONTROLLED_ANOTHER_CREATURE.add(new AnotherPredicate()); + FILTER_CARD_ARTIFACT_OR_CREATURE.add(Predicates.or( new CardTypePredicate(CardType.ARTIFACT), new CardTypePredicate(CardType.CREATURE) diff --git a/Utils/keywords.txt b/Utils/keywords.txt index b20f2558f2..cd343ae4ff 100644 --- a/Utils/keywords.txt +++ b/Utils/keywords.txt @@ -24,6 +24,7 @@ Echo|manaString| Embalm|cost, card| Enchant|type| Entwine|manaString| +Eternalize|cost, card| Evoke|card, manaString| Evolve|new| Exalted|new| diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 78c53bd673..a6b12a3a96 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31657,7 +31657,7 @@ Hour of Glory|Hour of Devastation|065|R|{3}{B}|Instant|||Exile target creature. Khenra Eternal|Hour of Devastation|66|C|{1}{B}|Creature - Zombie Jackal Warrior|2|2|Afflict 1 (Whenever this creature becomes blocked, defending player loses 1 life.)| Liliana's Defeat|Hour of Devastation|68|U|{B}|Sorcery|||Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life.| Maurauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| -Razaketh the Foulblooded|Hour of Devastation|73|M|{5}{B}{B}{B}|Legendary Creature - Demon|8|8|Flying, trample$Pay 2 life, Sacrifice another creature: Search your library for a card and put that card into your hand. Then shuffle your library.| +Razaketh, the Foulblooded|Hour of Devastation|73|M|{5}{B}{B}{B}|Legendary Creature - Demon|8|8|Flying, trample$Pay 2 life, Sacrifice another creature: Search your library for a card and put that card into your hand. Then shuffle your library.| Torment of Hailfire|Hour of Devastation|077|R|{X}{B}{B}|Sorcery|||Repeat the following process X times. Each opponent loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| Torment of Scarabs|Hour of Devastation|078|U|{3}{B}|Enchantment - Aura Curse|||Enchant player$At the beginning of enchanted player's upkeep, that player loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| Torment of Venom|Hour of Devastation|079|C|{2}{B}{B}|Instant|||Put three -1/-1 counters on target creature. Its controller loses 3 life unless he or she sacrifices another nonland permanent or discards a card.| From 0b443b08d931e64d30f0a52c82ec5d269ba84be3 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 24 Jun 2017 23:45:20 +1000 Subject: [PATCH 012/160] Implement Wildfire Eternal (HOU) --- .../src/mage/cards/w/WildfireEternal.java | 115 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 116 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WildfireEternal.java diff --git a/Mage.Sets/src/mage/cards/w/WildfireEternal.java b/Mage.Sets/src/mage/cards/w/WildfireEternal.java new file mode 100644 index 0000000000..c5c911cc50 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WildfireEternal.java @@ -0,0 +1,115 @@ +/* + * 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.w; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.AfflictAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.FilterCard; +import mage.filter.common.FilterInstantOrSorceryCard; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCardInHand; + +/** + * + * @author spjspj + */ +public class WildfireEternal extends CardImpl { + + public WildfireEternal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + + this.subtype.add("Zombie"); + this.subtype.add("Jackal"); + this.subtype.add("Cleric"); + this.power = new MageInt(1); + this.toughness = new MageInt(4); + + // Afflict 4 + addAbility(new AfflictAbility(4)); + + // Whenever Wildfire Eternal attacks and isn't blocked, you may cast an instant or sorcery card from your hand without paying its mana cost. + this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(new WildfireEternalCastEffect(), false, true)); + } + + public WildfireEternal(final WildfireEternal card) { + super(card); + } + + @Override + public WildfireEternal copy() { + return new WildfireEternal(this); + } +} + +class WildfireEternalCastEffect extends OneShotEffect { + + public WildfireEternalCastEffect() { + super(Outcome.Benefit); + this.staticText = " you may cast an instant or sorcery card from your hand without paying its mana cost."; + } + + public WildfireEternalCastEffect(final WildfireEternalCastEffect effect) { + super(effect); + } + + @Override + public WildfireEternalCastEffect copy() { + return new WildfireEternalCastEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent sourceObject = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (controller != null && sourceObject != null) { + FilterCard filter = new FilterInstantOrSorceryCard(); + int cardsToCast = controller.getHand().count(filter, source.getControllerId(), source.getSourceId(), game); + if (cardsToCast > 0 && controller.chooseUse(outcome, "Cast an instant or sorcery card from your hand without paying its mana cost?", source, game)) { + TargetCardInHand target = new TargetCardInHand(filter); + controller.chooseTarget(outcome, target, source, game); + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + controller.cast(card.getSpellAbility(), game, true); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 3b60eb1eb9..f574ad8ac8 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -92,6 +92,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); From f0dbc1da1cb94985add311fd23161ee45d2fb03c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 25 Jun 2017 10:21:52 +0200 Subject: [PATCH 013/160] [HOU] Added 4 black cards. Some fixes. --- .../src/mage/cards/c/CurseOfOblivion.java | 8 +- Mage.Sets/src/mage/cards/d/Dreamcatcher.java | 9 +- Mage.Sets/src/mage/cards/k/KhenraEternal.java | 10 +- .../src/mage/cards/l/LilianasDefeat.java | 1 + .../mage/cards/m/MaraudingBoneslasher.java | 57 ++---- .../src/mage/cards/t/TormentOfHailfire.java | 119 +++++++++++++ .../src/mage/cards/t/TormentOfScarabs.java | 168 ++++++++++++++++++ .../src/mage/cards/t/TormentOfVenom.java | 118 ++++++++++++ .../WaspOfTheBitterEnd.java} | 51 +++--- .../src/mage/sets/HourOfDevastation.java | 13 +- .../abilities/keyword/AfflictAbility.java | 12 +- .../main/java/mage/filter/StaticFilters.java | 20 ++- 12 files changed, 489 insertions(+), 97 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/t/TormentOfHailfire.java create mode 100644 Mage.Sets/src/mage/cards/t/TormentOfScarabs.java create mode 100644 Mage.Sets/src/mage/cards/t/TormentOfVenom.java rename Mage.Sets/src/mage/cards/{m/MauraudingBoneslasher.java => w/WaspOfTheBitterEnd.java} (55%) diff --git a/Mage.Sets/src/mage/cards/c/CurseOfOblivion.java b/Mage.Sets/src/mage/cards/c/CurseOfOblivion.java index b1ba079389..56c4060169 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfOblivion.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfOblivion.java @@ -27,6 +27,7 @@ */ package mage.cards.c; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.common.AttachEffect; @@ -46,8 +47,6 @@ import mage.players.Player; import mage.target.TargetPlayer; import mage.target.targetpointer.FixedTarget; -import java.util.UUID; - /** * * @author BetaSteward @@ -55,11 +54,10 @@ import java.util.UUID; public class CurseOfOblivion extends CardImpl { public CurseOfOblivion(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}"); this.subtype.add("Aura"); this.subtype.add("Curse"); - // Enchant player TargetPlayer target = new TargetPlayer(); this.getSpellAbility().addTarget(target); @@ -119,4 +117,4 @@ class CurseOfOblivionAbility extends TriggeredAbilityImpl { return "At the beginning of enchanted player's upkeep, that player exiles two cards from his or her graveyard."; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/d/Dreamcatcher.java b/Mage.Sets/src/mage/cards/d/Dreamcatcher.java index a50450228e..933381b2c6 100644 --- a/Mage.Sets/src/mage/cards/d/Dreamcatcher.java +++ b/Mage.Sets/src/mage/cards/d/Dreamcatcher.java @@ -27,6 +27,7 @@ */ package mage.cards.d; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; @@ -37,8 +38,6 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.common.FilterSpiritOrArcaneCard; -import java.util.UUID; - /** * * @author LevelX2 @@ -46,15 +45,15 @@ import java.util.UUID; public class Dreamcatcher extends CardImpl { public Dreamcatcher(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}"); this.subtype.add("Spirit"); this.power = new MageInt(1); this.toughness = new MageInt(1); // Whenever you cast a Spirit or Arcane spell, you may sacrifice Dreamcatcher. If you do, draw a card. - Ability ability = new SpellCastControllerTriggeredAbility(new SacrificeSourceEffect(), new FilterSpiritOrArcaneCard(), true, - "Whenever you cast a Spirit or Arcane spell, you may sacrifice Dreamcatcher. If you do, draw a card."); + Ability ability = new SpellCastControllerTriggeredAbility(new SacrificeSourceEffect(), new FilterSpiritOrArcaneCard(), true, + "Whenever you cast a Spirit or Arcane spell, you may sacrifice {this}. If you do, draw a card."); ability.addEffect(new DrawCardSourceControllerEffect(1)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KhenraEternal.java b/Mage.Sets/src/mage/cards/k/KhenraEternal.java index 0a6fd8ab01..b5dc4b92a0 100644 --- a/Mage.Sets/src/mage/cards/k/KhenraEternal.java +++ b/Mage.Sets/src/mage/cards/k/KhenraEternal.java @@ -1,16 +1,15 @@ package mage.cards.k; +import java.util.UUID; import mage.MageInt; import mage.abilities.keyword.AfflictAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import java.util.UUID; - public class KhenraEternal extends CardImpl { - public KhenraEternal(UUID ownerId, CardSetInfo cardSetInfo){ + public KhenraEternal(UUID ownerId, CardSetInfo cardSetInfo) { super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); subtype.add("Zombie"); subtype.add("Jackal"); @@ -18,15 +17,16 @@ public class KhenraEternal extends CardImpl { power = new MageInt(2); toughness = new MageInt(2); + // Afflict 1 (Whenever this creature becomes blocked, defending player loses 1 life.) addAbility(new AfflictAbility(1)); } - public KhenraEternal(final KhenraEternal khenraEternal){ + public KhenraEternal(final KhenraEternal khenraEternal) { super(khenraEternal); } - public KhenraEternal copy(){ + public KhenraEternal copy() { return new KhenraEternal(this); } } diff --git a/Mage.Sets/src/mage/cards/l/LilianasDefeat.java b/Mage.Sets/src/mage/cards/l/LilianasDefeat.java index 0a2fbb3d4d..81ba966a6e 100644 --- a/Mage.Sets/src/mage/cards/l/LilianasDefeat.java +++ b/Mage.Sets/src/mage/cards/l/LilianasDefeat.java @@ -56,6 +56,7 @@ public class LilianasDefeat extends CardImpl { FilterPermanent filter = new FilterCreatureOrPlaneswalkerPermanent("black creature or black planeswalker"); filter.add(new ColorPredicate(ObjectColor.BLACK)); // Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life. + this.getSpellAbility().addEffect(new LilianasDefeatEffect()); this.getSpellAbility().addTarget(new TargetPermanent(filter)); } diff --git a/Mage.Sets/src/mage/cards/m/MaraudingBoneslasher.java b/Mage.Sets/src/mage/cards/m/MaraudingBoneslasher.java index 8b0ca34c2a..80ae641bf6 100644 --- a/Mage.Sets/src/mage/cards/m/MaraudingBoneslasher.java +++ b/Mage.Sets/src/mage/cards/m/MaraudingBoneslasher.java @@ -29,20 +29,16 @@ package mage.cards.m; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.combat.CantBlockUnlessYouControlSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.AnotherPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; /** * @@ -50,16 +46,24 @@ import mage.game.permanent.Permanent; */ public class MaraudingBoneslasher extends CardImpl { + private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie"); + + static { + filter.add(new SubtypePredicate(SubType.ZOMBIE)); + filter.add(new AnotherPredicate()); + } + public MaraudingBoneslasher(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); this.subtype.add("Zombie"); - this.subtype.add("Zombie"); + this.subtype.add("Minotaur"); this.power = new MageInt(3); this.toughness = new MageInt(3); // Marauding Boneslasher can't block unless you control another Zombie. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MaraudingBoneslasherRestrictionEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockUnlessYouControlSourceEffect(filter))); + } public MaraudingBoneslasher(final MaraudingBoneslasher card) { @@ -71,42 +75,3 @@ public class MaraudingBoneslasher extends CardImpl { return new MaraudingBoneslasher(this); } } - -class MaraudingBoneslasherRestrictionEffect extends RestrictionEffect { - - private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie"); - - static { - filter.add(new SubtypePredicate(SubType.ZOMBIE)); - filter.add(new AnotherPredicate()); - } - - public MaraudingBoneslasherRestrictionEffect() { - super(Duration.WhileOnBattlefield); - - staticText = "{this} can't block unless you control another Zombie"; - } - - public MaraudingBoneslasherRestrictionEffect(final MaraudingBoneslasherRestrictionEffect effect) { - super(effect); - } - - @Override - public MaraudingBoneslasherRestrictionEffect copy() { - return new MaraudingBoneslasherRestrictionEffect(this); - } - - @Override - public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { - return false; - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - if (permanent.getId().equals(source.getSourceId()) - && game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game) == 0) { - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java b/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java new file mode 100644 index 0000000000..9a57e37f45 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java @@ -0,0 +1,119 @@ +/* + * 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.t; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetPermanent; + +/** + * + * @author LevelX2 + */ +public class TormentOfHailfire extends CardImpl { + + public TormentOfHailfire(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{B}"); + + // Repeat the following process X times. Each opponent loses 3 life unless he or she sacrifices a nonland permanent or discards a card. + this.getSpellAbility().addEffect(new TormentOfHailfireEffect()); + + } + + public TormentOfHailfire(final TormentOfHailfire card) { + super(card); + } + + @Override + public TormentOfHailfire copy() { + return new TormentOfHailfire(this); + } +} + +class TormentOfHailfireEffect extends OneShotEffect { + + public TormentOfHailfireEffect() { + super(Outcome.LoseLife); + this.staticText = "Repeat the following process X times. Each opponent loses 3 life unless he or she sacrifices a nonland permanent or discards a card"; + } + + public TormentOfHailfireEffect(final TormentOfHailfireEffect effect) { + super(effect); + } + + @Override + public TormentOfHailfireEffect copy() { + return new TormentOfHailfireEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int repeat = source.getManaCosts().getX(); + for (int i = 0; i < repeat; i++) { + for (UUID opponentId : game.getOpponents(source.getControllerId())) { + Player opponent = game.getPlayer(opponentId); + if (opponent != null) { + int permanents = game.getBattlefield().countAll(StaticFilters.FILTER_PERMANENT_NON_LAND, opponentId, game); + if (permanents > 0 && opponent.chooseUse(outcome, "Sacrifices a nonland permanent? (Iteration " + i + " of " + repeat + ")", + "Otherwise you have to discard a card or lose 3 life.", "Sacrifice", "Discard or life loss", source, game)) { + Target target = new TargetPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_NON_LAND); + if (opponent.choose(outcome, target, source.getSourceId(), game)) { + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent != null) { + permanent.sacrifice(source.getSourceId(), game); + continue; + } + } + } + if (!opponent.getHand().isEmpty() && opponent.chooseUse(outcome, "Discard a card? (Iteration " + i + " of " + repeat + ")", + "Otherwise you lose 3 life.", "Discard", "Lose 3 life", source, game)) { + opponent.discardOne(false, source, game); + continue; + } + opponent.loseLife(3, game, false); + } + } + + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/t/TormentOfScarabs.java b/Mage.Sets/src/mage/cards/t/TormentOfScarabs.java new file mode 100644 index 0000000000..b3811512f8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TormentOfScarabs.java @@ -0,0 +1,168 @@ +/* + * 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.t; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetPermanent; +import mage.target.TargetPlayer; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author LevelX2 + */ +public class TormentOfScarabs extends CardImpl { + + public TormentOfScarabs(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}"); + + this.subtype.add("Aura"); + this.subtype.add("Curse"); + + // Enchant player + TargetPlayer auraTarget = new TargetPlayer(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.LoseLife)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // At the beginning of enchanted player's upkeep, that player loses 3 life unless he or she sacrifices a nonland permanent or discards a card. + this.addAbility(new TormentOfScarabsAbility()); + } + + public TormentOfScarabs(final TormentOfScarabs card) { + super(card); + } + + @Override + public TormentOfScarabs copy() { + return new TormentOfScarabs(this); + } +} + +class TormentOfScarabsAbility extends TriggeredAbilityImpl { + + public TormentOfScarabsAbility() { + super(Zone.BATTLEFIELD, new TormentOfScarabsEffect()); + } + + public TormentOfScarabsAbility(final TormentOfScarabsAbility ability) { + super(ability); + } + + @Override + public TormentOfScarabsAbility copy() { + return new TormentOfScarabsAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.UPKEEP_STEP_PRE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent enchantment = game.getPermanent(this.sourceId); + if (enchantment != null && enchantment.getAttachedTo() != null) { + Player player = game.getPlayer(enchantment.getAttachedTo()); + if (player != null && game.getActivePlayerId().equals(player.getId())) { + this.getEffects().get(0).setTargetPointer(new FixedTarget(player.getId())); + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "At the beginning of enchanted player's upkeep, that player loses 3 life unless he or she sacrifices a nonland permanent or discards a card."; + } + +} + +class TormentOfScarabsEffect extends OneShotEffect { + + public TormentOfScarabsEffect() { + super(Outcome.LoseLife); + this.staticText = "that player loses 3 life unless he or she sacrifices a nonland permanent or discards a card"; + } + + public TormentOfScarabsEffect(final TormentOfScarabsEffect effect) { + super(effect); + } + + @Override + public TormentOfScarabsEffect copy() { + return new TormentOfScarabsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player enchantedPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (enchantedPlayer != null) { + int permanents = game.getBattlefield().countAll(StaticFilters.FILTER_PERMANENT_NON_LAND, enchantedPlayer.getId(), game); + if (permanents > 0 && enchantedPlayer.chooseUse(outcome, "Sacrifices a nonland permanent?", + "Otherwise you have to discard a card or lose 3 life.", "Sacrifice", "Discard or life loss", source, game)) { + Target target = new TargetPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_NON_LAND); + if (enchantedPlayer.choose(outcome, target, source.getSourceId(), game)) { + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent != null) { + permanent.sacrifice(source.getSourceId(), game); + return true; + } + } + } + if (!enchantedPlayer.getHand().isEmpty() && enchantedPlayer.chooseUse(outcome, "Discard a card?", + "Otherwise you lose 3 life.", "Discard", "Lose 3 life", source, game)) { + enchantedPlayer.discardOne(false, source, game); + return true; + } + enchantedPlayer.loseLife(3, game, false); + return true; + } + + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/t/TormentOfVenom.java b/Mage.Sets/src/mage/cards/t/TormentOfVenom.java new file mode 100644 index 0000000000..d7d9e95610 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TormentOfVenom.java @@ -0,0 +1,118 @@ +/* + * 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.t; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class TormentOfVenom extends CardImpl { + + public TormentOfVenom(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}{B}"); + + // Put three -1/-1 counters on target creature. Its controller loses 3 life unless he or she sacrifices another nonland permanent or discards a card. + this.getSpellAbility().addEffect(new TormentOfVenomEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public TormentOfVenom(final TormentOfVenom card) { + super(card); + } + + @Override + public TormentOfVenom copy() { + return new TormentOfVenom(this); + } +} + +class TormentOfVenomEffect extends OneShotEffect { + + public TormentOfVenomEffect() { + super(Outcome.LoseLife); + this.staticText = "Put three -1/-1 counters on target creature. Its controller loses 3 life unless he or she sacrifices another nonland permanent or discards a card"; + } + + public TormentOfVenomEffect(final TormentOfVenomEffect effect) { + super(effect); + } + + @Override + public TormentOfVenomEffect copy() { + return new TormentOfVenomEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (targetCreature != null) { + new AddCountersTargetEffect(CounterType.M1M1.createInstance(3)).apply(game, source); + Player controllingPlayer = game.getPlayer(targetCreature.getControllerId()); + if (controllingPlayer != null) { + int permanents = game.getBattlefield().countAll(StaticFilters.FILTER_PERMANENT_NON_LAND, controllingPlayer.getId(), game); + if (permanents > 0 && controllingPlayer.chooseUse(outcome, "Sacrifices a nonland permanent?", + "Otherwise you have to discard a card or lose 3 life.", "Sacrifice", "Discard or life loss", source, game)) { + Target target = new TargetPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_NON_LAND); + if (controllingPlayer.choose(outcome, target, source.getSourceId(), game)) { + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent != null) { + permanent.sacrifice(source.getSourceId(), game); + return true; + } + } + } + if (!controllingPlayer.getHand().isEmpty() && controllingPlayer.chooseUse(outcome, "Discard a card?", + "Otherwise you lose 3 life.", "Discard", "Lose 3 life", source, game)) { + controllingPlayer.discardOne(false, source, game); + return true; + } + controllingPlayer.loseLife(3, game, false); + return true; + } + } + + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/m/MauraudingBoneslasher.java b/Mage.Sets/src/mage/cards/w/WaspOfTheBitterEnd.java similarity index 55% rename from Mage.Sets/src/mage/cards/m/MauraudingBoneslasher.java rename to Mage.Sets/src/mage/cards/w/WaspOfTheBitterEnd.java index a4dc03a4c2..e68e874b7f 100644 --- a/Mage.Sets/src/mage/cards/m/MauraudingBoneslasher.java +++ b/Mage.Sets/src/mage/cards/w/WaspOfTheBitterEnd.java @@ -25,53 +25,62 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.cards.m; +package mage.cards.w; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.combat.CantBlockUnlessYouControlSourceEffect; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; -import mage.filter.common.FilterControlledPermanent; +import mage.filter.FilterSpell; +import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.common.TargetCreaturePermanent; /** * * @author LevelX2 */ -public class MauraudingBoneslasher extends CardImpl { +public class WaspOfTheBitterEnd extends CardImpl { - private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie"); + private static final FilterSpell filter = new FilterSpell("a Bolas planeswalker spell"); static { - filter.add(new SubtypePredicate(SubType.ZOMBIE)); - filter.add(new AnotherPredicate()); + filter.add(new CardTypePredicate(CardType.PLANESWALKER)); + filter.add(new SubtypePredicate(SubType.BOLAS)); } - public MauraudingBoneslasher(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + public WaspOfTheBitterEnd(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); - this.subtype.add("Zombie"); - this.subtype.add("Minotaur"); - this.power = new MageInt(3); - this.toughness = new MageInt(3); + this.subtype.add("Insect"); + this.subtype.add("Horror"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); - // Marauding Boneslasher can't block unless you control another Zombie. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockUnlessYouControlSourceEffect(filter))); + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Whenever you cast a Bolas planeswalker spell, you may sacrifice Wasp of the Bitter End. If you do, destroy target creature. + Ability ability = new SpellCastControllerTriggeredAbility(new SacrificeSourceEffect(), filter, true, + "Whenever you cast a Bolas planeswalker spell, you may sacrifice {this}. If you do, destroy target creature."); + ability.addEffect(new DestroyTargetEffect()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); } - public MauraudingBoneslasher(final MauraudingBoneslasher card) { + public WaspOfTheBitterEnd(final WaspOfTheBitterEnd card) { super(card); } @Override - public MauraudingBoneslasher copy() { - return new MauraudingBoneslasher(this); + public WaspOfTheBitterEnd copy() { + return new WaspOfTheBitterEnd(this); } } diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 997e82845d..e95c33668e 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -27,6 +27,8 @@ */ package mage.sets; +import java.util.ArrayList; +import java.util.List; import mage.cards.ExpansionSet; import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; @@ -34,9 +36,6 @@ import mage.cards.repository.CardRepository; import mage.constants.Rarity; import mage.constants.SetType; -import java.util.ArrayList; -import java.util.List; - /** * @author fireshoes */ @@ -79,14 +78,13 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); - cards.add(new SetCardInfo("Hour of Glory", 065, Rarity.RARE, mage.cards.h.HourOfGlory.class)); + cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); - cards.add(new SetCardInfo("Maurauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MauraudingBoneslasher.class)); cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); @@ -97,9 +95,12 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); + cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); + cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); + cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); - cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); } diff --git a/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java b/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java index c641d22d5b..24398c7eef 100644 --- a/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java @@ -12,13 +12,19 @@ public class AfflictAbility extends BecomesBlockedTriggeredAbility { return new AfflictAbility(this); } - public AfflictAbility(int amount){ - super(new LoseLifeDefendingPlayerEffect(amount, true), false); + public AfflictAbility(int amount) { + super(new LoseLifeDefendingPlayerEffect(amount, true) + .setText("Afflict " + amount + "(Whenever this creature becomes blocked, defending player loses " + amount + " life.)"), false); + lifeLoss = amount; } - public AfflictAbility(final AfflictAbility afflictAbility){ + public AfflictAbility(final AfflictAbility afflictAbility) { super(afflictAbility); lifeLoss = afflictAbility.lifeLoss; } + @Override + public String getRule() { + return "Afflict " + lifeLoss + "(Whenever this creature becomes blocked, defending player loses " + lifeLoss + " life.)"; + } } diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index d6146142c0..6c54add973 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -15,6 +15,7 @@ import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreatureSpell; import mage.filter.common.FilterNonlandCard; +import mage.filter.common.FilterNonlandPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.permanent.AnotherPredicate; @@ -27,23 +28,28 @@ import mage.filter.predicate.permanent.TokenPredicate; */ public final class StaticFilters { - public static final FilterCreaturePermanent FILTER_ARTIFACT_CREATURE_PERMANENT = new FilterArtifactCreaturePermanent(); - public static final FilterPermanent FILTER_PERMANENT_ARTIFACT_OR_CREATURE = new FilterPermanent("artifact or creature"); - public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT_OR_CREATURE = new FilterControlledPermanent("artifact or creature you control"); - public static final FilterControlledPermanent FILTER_CONTROLLED_A_CREATURE = new FilterControlledCreaturePermanent("a creature you control"); - public static final FilterControlledCreaturePermanent FILTER_CONTROLLED_ANOTHER_CREATURE = new FilterControlledCreaturePermanent("another creature"); - public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT = new FilterControlledArtifactPermanent(); public static final FilterArtifactCard FILTER_CARD_ARTIFACT = new FilterArtifactCard(); public static final FilterNonlandCard FILTER_CARD_NON_LAND = new FilterNonlandCard(); public static final FilterNonlandCard FILTER_CARD_A_NON_LAND = new FilterNonlandCard("a nonland card"); public static final FilterCard FILTER_CARD_ARTIFACT_OR_CREATURE = new FilterCard("artifact or creature card"); + public static final FilterCreaturePermanent FILTER_ARTIFACT_CREATURE_PERMANENT = new FilterArtifactCreaturePermanent(); + public static final FilterPermanent FILTER_PERMANENT_ARTIFACT_OR_CREATURE = new FilterPermanent("artifact or creature"); + public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT = new FilterControlledArtifactPermanent(); + public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT_OR_CREATURE = new FilterControlledPermanent("artifact or creature you control"); + + public static final FilterControlledPermanent FILTER_CONTROLLED_A_CREATURE = new FilterControlledCreaturePermanent("a creature you control"); + public static final FilterControlledCreaturePermanent FILTER_CONTROLLED_ANOTHER_CREATURE = new FilterControlledCreaturePermanent("another creature"); + public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_NON_LAND = new FilterControlledPermanent("nonland permanent"); + public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE = new FilterCreaturePermanent(); public static final FilterCreaturePermanent FILTER_PERMANENT_A_CREATURE = new FilterCreaturePermanent("a creature"); public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURES = new FilterCreaturePermanent("creatures"); public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE_GOBLINS = new FilterCreaturePermanent(SubType.GOBLIN, "Goblin creatures"); public static final FilterCreaturePermanent FILTER_PERMANENT_CREATURE_SLIVERS = new FilterCreaturePermanent(SubType.SLIVER, "Sliver creatures"); + public static final FilterPermanent FILTER_PERMANENT_NON_LAND = new FilterNonlandPermanent(); + public static final FilterCreatureSpell FILTER_SPELL_A_CREATURE = new FilterCreatureSpell("a creature spell"); public static final FilterSpell FILTER_SPELL_NON_CREATURE = (FilterSpell) new FilterSpell("noncreature spell").add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); @@ -53,6 +59,8 @@ public final class StaticFilters { public static final FilterPermanent FILTER_ATTACKING_CREATURES = new FilterCreaturePermanent("attacking creatures"); static { + FILTER_CONTROLLED_PERMANENT_NON_LAND.add( + Predicates.not(new CardTypePredicate(CardType.LAND))); FILTER_CREATURE_TOKENS.add(new TokenPredicate()); FILTER_ATTACKING_CREATURES.add(new AttackingPredicate()); From b80aab0cfde51e295bbcbab4b3ac13e8134110f0 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 25 Jun 2017 20:06:51 +1000 Subject: [PATCH 014/160] Implement Vizier of the True (HOU) --- .../src/mage/cards/v/VizierOfTheTrue.java | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/v/VizierOfTheTrue.java diff --git a/Mage.Sets/src/mage/cards/v/VizierOfTheTrue.java b/Mage.Sets/src/mage/cards/v/VizierOfTheTrue.java new file mode 100644 index 0000000000..10d1d9ef93 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VizierOfTheTrue.java @@ -0,0 +1,123 @@ +/* + * 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.v; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.TapTargetEffect; +import mage.abilities.keyword.ExertAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author spjspj + */ +public class VizierOfTheTrue extends CardImpl { + + public VizierOfTheTrue(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); + + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // You may exert Vizier of the True as it attacks. + this.addAbility(new ExertAbility(null, false)); + + // Whenever you exert a creature, tap target creature an opponent controls. + this.addAbility(new VizierOfTheTrueAbility()); + } + + public VizierOfTheTrue(final VizierOfTheTrue card) { + super(card); + } + + @Override + public VizierOfTheTrue copy() { + return new VizierOfTheTrue(this); + } +} + +class VizierOfTheTrueAbility extends TriggeredAbilityImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public VizierOfTheTrueAbility() { + super(Zone.BATTLEFIELD, new TapTargetEffect()); + } + + public VizierOfTheTrueAbility(final VizierOfTheTrueAbility ability) { + super(ability); + } + + @Override + public VizierOfTheTrueAbility copy() { + return new VizierOfTheTrueAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.BECOMES_EXERTED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Player player = game.getPlayer(event.getPlayerId()); + if (player != null) { + Target target = new TargetCreaturePermanent(filter); + target.setAbilityController(getControllerId()); + this.getTargets().clear(); + this.getTargets().add(target); + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever you exert a creature, tap target creature an opponent controls."; + } +} From 8285f387dbed09a53db8f6667703a4751f57cb0b Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 25 Jun 2017 20:09:50 +1000 Subject: [PATCH 015/160] Implement Vizier of the True (HOU) --- Mage.Sets/src/mage/sets/HourOfDevastation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 997e82845d..570208f329 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -97,6 +97,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); From cc368c3e1dbfb5b3502f77f29f6b60097ade3f74 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 25 Jun 2017 21:31:12 +1000 Subject: [PATCH 016/160] Implement 2 cards from (HOU) --- .../cards/u/UneshCriosphinxSovereign.java | 225 ++++++++++++++++++ Mage.Sets/src/mage/cards/v/VisageOfBolas.java | 74 ++++++ .../src/mage/sets/HourOfDevastation.java | 4 + 3 files changed, 303 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/u/UneshCriosphinxSovereign.java create mode 100644 Mage.Sets/src/mage/cards/v/VisageOfBolas.java diff --git a/Mage.Sets/src/mage/cards/u/UneshCriosphinxSovereign.java b/Mage.Sets/src/mage/cards/u/UneshCriosphinxSovereign.java new file mode 100644 index 0000000000..20972911ac --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UneshCriosphinxSovereign.java @@ -0,0 +1,225 @@ +/* + * 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.u; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetCard; + +/** + * + * @author spjspj + */ +public class UneshCriosphinxSovereign extends CardImpl { + + private static final FilterCard filter = new FilterCard("Sphinx spells"); + + public UneshCriosphinxSovereign(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}{U}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add("Sphinx"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Sphinx spells you cast cost {2} less to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 2))); + + // Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard. + Ability ability = new UneshCriosphinxSovereignTriggeredAbility(); + this.addAbility(ability); + } + + public UneshCriosphinxSovereign(final UneshCriosphinxSovereign card) { + super(card); + } + + @Override + public UneshCriosphinxSovereign copy() { + return new UneshCriosphinxSovereign(this); + } +} + +class UneshCriosphinxSovereignTriggeredAbility extends TriggeredAbilityImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + + static { + filter.add(new SubtypePredicate(SubType.SPHINX)); + } + + public UneshCriosphinxSovereignTriggeredAbility() { + super(Zone.BATTLEFIELD, new UneshCriosphinxSovereignEffect(), false); + } + + public UneshCriosphinxSovereignTriggeredAbility(UneshCriosphinxSovereignTriggeredAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.ENTERS_THE_BATTLEFIELD; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null + && permanent.getOwnerId().equals(controllerId) + && permanent.isCreature() + && filter.match(permanent, game)) { + return true; + } + return false; + } + + @Override + public String getRule() { + return new StringBuilder("Whenever {this} or another Sphinx enters the battlefield under your control, ").append(super.getRule()).toString(); + } + + @Override + public UneshCriosphinxSovereignTriggeredAbility copy() { + return new UneshCriosphinxSovereignTriggeredAbility(this); + } +} + +class UneshCriosphinxSovereignEffect extends OneShotEffect { + + public UneshCriosphinxSovereignEffect() { + super(Outcome.DrawCard); + this.staticText = "reveal the top four cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard"; + } + + public UneshCriosphinxSovereignEffect(final UneshCriosphinxSovereignEffect effect) { + super(effect); + } + + @Override + public UneshCriosphinxSovereignEffect copy() { + return new UneshCriosphinxSovereignEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = source.getSourceObject(game); + if (controller == null || sourceObject == null) { + return false; + } + + Cards cards = new CardsImpl(); + cards.addAll(controller.getLibrary().getTopCards(game, 4)); + controller.revealCards(sourceObject.getName(), cards, game); + + Set opponents = game.getOpponents(source.getControllerId()); + if (!opponents.isEmpty()) { + Player opponent = game.getPlayer(opponents.iterator().next()); + TargetCard target = new TargetCard(0, cards.size(), Zone.LIBRARY, new FilterCard("cards to put in the first pile")); + List pile1 = new ArrayList<>(); + if (opponent.choose(Outcome.Neutral, cards, target, game)) { + List targets = target.getTargets(); + for (UUID targetId : targets) { + Card card = cards.get(targetId, game); + if (card != null) { + pile1.add(card); + cards.remove(card); + } + } + } + List pile2 = new ArrayList<>(); + pile2.addAll(cards.getCards(game)); + + boolean choice = controller.choosePile(outcome, "Choose a pile to put into your hand.", pile1, pile2, game); + + Zone pile1Zone = Zone.GRAVEYARD; + Zone pile2Zone = Zone.HAND; + if (choice) { + pile1Zone = Zone.HAND; + pile2Zone = Zone.GRAVEYARD; + } + + StringBuilder sb = new StringBuilder("Pile 1, going to ").append(pile1Zone == Zone.HAND ? "Hand" : "Graveyard").append(": "); + int i = 0; + for (Card card : pile1) { + i++; + sb.append(card.getName()); + if (i < pile1.size()) { + sb.append(", "); + } + card.moveToZone(pile1Zone, source.getSourceId(), game, false); + } + game.informPlayers(sb.toString()); + + sb = new StringBuilder("Pile 2, going to ").append(pile2Zone == Zone.HAND ? "Hand" : "Graveyard").append(':'); + i = 0; + for (Card card : pile2) { + i++; + sb.append(' ').append(card.getName()); + if (i < pile2.size()) { + sb.append(", "); + } + card.moveToZone(pile2Zone, source.getSourceId(), game, false); + } + game.informPlayers(sb.toString()); + } + + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/v/VisageOfBolas.java b/Mage.Sets/src/mage/cards/v/VisageOfBolas.java new file mode 100644 index 0000000000..5742d996c6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VisageOfBolas.java @@ -0,0 +1,74 @@ +/* + * 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.v; + +import java.util.UUID; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandEffect; +import mage.abilities.mana.BlackManaAbility; +import mage.abilities.mana.BlueManaAbility; +import mage.abilities.mana.RedManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; + +/** + * + * @author spjspj + */ +public class VisageOfBolas extends CardImpl { + + private final static FilterCard filter = new FilterCard("Nicol Bolas, the Deceiver"); + + static { + filter.add(new NamePredicate("Nicol Bolas, the Deceiver")); + } + + public VisageOfBolas(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); + + // When Visage of Bolas enters the battlefield, you may search your library and/or graveyard for a card named Nicol Bolas, the Deceiver, reveal it, and put it into your hand. If you search your library this way, shuffle it. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryGraveyardPutInHandEffect(filter), true)); + + // {t}: Add {U}, {B}, or {R} to your mana pool. + this.addAbility(new BlueManaAbility()); + this.addAbility(new BlackManaAbility()); + this.addAbility(new RedManaAbility()); + } + + public VisageOfBolas(final VisageOfBolas card) { + super(card); + } + + @Override + public VisageOfBolas copy() { + return new VisageOfBolas(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 570208f329..950c3928b0 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -97,10 +97,14 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); + cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); + cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); + cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); } From 67ce816381a9944941b5d049050166b1ac34c565 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 25 Jun 2017 21:33:06 +1000 Subject: [PATCH 017/160] Implement Unesh (HOU) --- Mage.Sets/src/mage/sets/HourOfDevastation.java | 3 --- Mage/src/main/java/mage/constants/SubType.java | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 950c3928b0..dfa95e2218 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -102,9 +102,6 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); - - cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); - cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); } diff --git a/Mage/src/main/java/mage/constants/SubType.java b/Mage/src/main/java/mage/constants/SubType.java index fb41891288..f0aecdc2ea 100644 --- a/Mage/src/main/java/mage/constants/SubType.java +++ b/Mage/src/main/java/mage/constants/SubType.java @@ -260,7 +260,7 @@ public enum SubType { SPAWN("Spawn", SubTypeSet.CreatureType, false), SPECTER("Specter", SubTypeSet.CreatureType, false), SPELLSHAPER("Spellshaper", SubTypeSet.CreatureType, false), - SPHINX("Sphix", SubTypeSet.CreatureType, false), + SPHINX("Sphinx", SubTypeSet.CreatureType, false), SPIDER("Spider", SubTypeSet.CreatureType, false), SPIKE("Spike", SubTypeSet.CreatureType, false), SPIRIT("Spirit", SubTypeSet.CreatureType, false), From cbb4c9e6331aa16040537c2b952717ab62ae27f0 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 25 Jun 2017 21:41:29 +1000 Subject: [PATCH 018/160] mtg-cards-data - remove prepended 0s in collector number --- Utils/mtg-cards-data.txt | 118 +++++++++++++++++++-------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index a6b12a3a96..ff6ec0e41d 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -27392,83 +27392,83 @@ Swamp|Duel Decks: Zendikar vs. Eldrazi|72|L||Basic Land - Swamp|||B| Mountain|Duel Decks: Zendikar vs. Eldrazi|73|L||Basic Land - Mountain|||M| Mountain|Duel Decks: Zendikar vs. Eldrazi|74|L||Basic Land - Mountain|||M| Mountain|Duel Decks: Zendikar vs. Eldrazi|75|L||Basic Land - Mountain|||M| -Blight Herder|Battle for Zendikar|002|R|{5}|Creature - Eldrazi Processor|4|5|When you cast Blight Herder, you may put two cards your opponents own from exile into their owners' graveyards. If you do, put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {C} to your mana pool."| -Kozilek's Channeler|Battle for Zendikar|010|C|{5}|Creature - Eldrazi|4|4|{T}: Add {C}{C} to your mana pool.| -Eldrazi Devastator|Battle for Zendikar|007|C|{8}|Creature - Eldrazi|8|9|Trample| -Titan's Presence|Battle for Zendikar|014|U|{3}|Instant|||As an additional cost to cast Titan's Presence, reveal a colorless creature card from your hand.$Exile target creature if its power is less than or equal to the revealed card's power.| -Ulamog, the Ceaseless Hunger|Battle for Zendikar|015|M|{1}{0}|Legendary Creature - Eldrazi|10|10|When you cast Ulamog, the Ceaseless Hunger, exile two target permanents.$Indestructible$Whenever Ulamog attacks, defending player exiles the top twenty cards of his or her library.| -Breaker of Armies|Battle for Zendikar|003|U|{8}|Creature - Eldrazi|10|8|All creatures able to block Breaker of Armies do so.| -Desolation Twin|Battle for Zendikar|006|R|{1}{0}|Creature - Eldrazi|10|10|When you cast Desolation Twin, put a 10/10 colorless Eldrazi creature token onto the battlefield.| -Conduit of Ruin|Battle for Zendikar|004|R|{6}|Creature - Eldrazi|5|5|When you cast Conduit of Ruin, you may search your library for a colorless creature card with converted mana cost 7 or greater, reveal it, then shuffle your library and put that card on top of it.$The first creature spell you cast each turn costs {2} less to cast.| -Deathless Behemoth|Battle for Zendikar|005|U|{6}|Creature - Eldrazi|6|6|Vigilance$Sacrifice two Eldrazi Scions: Return Deathless Behemoth from your graveyard to your hand. Activate this ability only any time you could cast a sorcery.| -Void Winnower|Battle for Zendikar|017|M|{9}|Creature - Eldrazi|11|9|Your opponent can't cast spells with even converted mana costs. (Zero is even.)$Your opponents can't block with creatures with even converted mana costs.| -Endless One|Battle for Zendikar|008|R|{X}|Creature - Eldrazi|0|0|Endless One enters the battlefield with X +1/+1 counters on it.| -Scour from Existence|Battle for Zendikar|013|C|{7}|Instant|||Exile target permanent.| -Gruesome Slaughter|Battle for Zendikar|009|R|{6}|Sorcery|||Until end of turn, colorless creatures you control gain "{T}: This creature deals damage equal to its power to target creature."| -Bane of Bala Ged|Battle for Zendikar|001|U|{7}|Creature - Eldrazi|7|5|Whenever Bane of Bala Ged attacks, defending player exiles two permanents he or she controls.| -Ruin Processor|Battle for Zendikar|012|U|{7}|Creature - Eldrazi Processor|7|8|When you cast Ruin Processor, you may put a card an opponent owns from exile into that player's graveyard. If you do, you gain 5 life.| -Ulamog's Despoiler|Battle for Zendikar|016|U|{6}|Creature - Eldrazi Processor|5|5|As Ulamog's Despoiler enters the battlefield, you may put two cards your opponents own from exile into their owners' graveyards. If you do, Ulamog's Despoiler enters the battlefield with four +1/+1 counters on it.| -Oblivion Sower|Battle for Zendikar|011|M|{6}|Creature - Eldrazi|5|8|When you cast Oblivion Sower, target opponent exiles the top four cards of his or her library, then you may put any number of land cards that player owns from exile onto the battlefield under your control.| -Angel of Renewal|Battle for Zendikar|018|U|{5}{W}|Creature - Angel Ally|4|4|Flying$When Angel of Renewal enters the battlefield, you gain 1 life for each creature you control.| -Angelic Gift|Battle for Zendikar|019|C|{1}{W}|Enchantment - Aura|||Enchant creature$When Angelic Gift enters the battlefield, draw a card.$Enchanted creature has flying.| -Cliffside Lookout|Battle for Zendikar|020|C|{W}|Creature - Kor Scout Ally|1|1|{4}{W}: Creatures you control get +1/+1 until end of turn.| -Courier Griffin|Battle for Zendikar|020|C|{3}{W}|Creature - Griffin|2|3|Flying$When Courier Griffin enters the battlefield, you gain 2 life.| +Blight Herder|Battle for Zendikar|2|R|{5}|Creature - Eldrazi Processor|4|5|When you cast Blight Herder, you may put two cards your opponents own from exile into their owners' graveyards. If you do, put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {C} to your mana pool."| +Kozilek's Channeler|Battle for Zendikar|10|C|{5}|Creature - Eldrazi|4|4|{T}: Add {C}{C} to your mana pool.| +Eldrazi Devastator|Battle for Zendikar|7|C|{8}|Creature - Eldrazi|8|9|Trample| +Titan's Presence|Battle for Zendikar|14|U|{3}|Instant|||As an additional cost to cast Titan's Presence, reveal a colorless creature card from your hand.$Exile target creature if its power is less than or equal to the revealed card's power.| +Ulamog, the Ceaseless Hunger|Battle for Zendikar|15|M|{1}{0}|Legendary Creature - Eldrazi|10|10|When you cast Ulamog, the Ceaseless Hunger, exile two target permanents.$Indestructible$Whenever Ulamog attacks, defending player exiles the top twenty cards of his or her library.| +Breaker of Armies|Battle for Zendikar|3|U|{8}|Creature - Eldrazi|10|8|All creatures able to block Breaker of Armies do so.| +Desolation Twin|Battle for Zendikar|6|R|{1}{0}|Creature - Eldrazi|10|10|When you cast Desolation Twin, put a 10/10 colorless Eldrazi creature token onto the battlefield.| +Conduit of Ruin|Battle for Zendikar|4|R|{6}|Creature - Eldrazi|5|5|When you cast Conduit of Ruin, you may search your library for a colorless creature card with converted mana cost 7 or greater, reveal it, then shuffle your library and put that card on top of it.$The first creature spell you cast each turn costs {2} less to cast.| +Deathless Behemoth|Battle for Zendikar|5|U|{6}|Creature - Eldrazi|6|6|Vigilance$Sacrifice two Eldrazi Scions: Return Deathless Behemoth from your graveyard to your hand. Activate this ability only any time you could cast a sorcery.| +Void Winnower|Battle for Zendikar|17|M|{9}|Creature - Eldrazi|11|9|Your opponent can't cast spells with even converted mana costs. (Zero is even.)$Your opponents can't block with creatures with even converted mana costs.| +Endless One|Battle for Zendikar|8|R|{X}|Creature - Eldrazi|0|0|Endless One enters the battlefield with X +1/+1 counters on it.| +Scour from Existence|Battle for Zendikar|13|C|{7}|Instant|||Exile target permanent.| +Gruesome Slaughter|Battle for Zendikar|9|R|{6}|Sorcery|||Until end of turn, colorless creatures you control gain "{T}: This creature deals damage equal to its power to target creature."| +Bane of Bala Ged|Battle for Zendikar|1|U|{7}|Creature - Eldrazi|7|5|Whenever Bane of Bala Ged attacks, defending player exiles two permanents he or she controls.| +Ruin Processor|Battle for Zendikar|12|U|{7}|Creature - Eldrazi Processor|7|8|When you cast Ruin Processor, you may put a card an opponent owns from exile into that player's graveyard. If you do, you gain 5 life.| +Ulamog's Despoiler|Battle for Zendikar|16|U|{6}|Creature - Eldrazi Processor|5|5|As Ulamog's Despoiler enters the battlefield, you may put two cards your opponents own from exile into their owners' graveyards. If you do, Ulamog's Despoiler enters the battlefield with four +1/+1 counters on it.| +Oblivion Sower|Battle for Zendikar|11|M|{6}|Creature - Eldrazi|5|8|When you cast Oblivion Sower, target opponent exiles the top four cards of his or her library, then you may put any number of land cards that player owns from exile onto the battlefield under your control.| +Angel of Renewal|Battle for Zendikar|18|U|{5}{W}|Creature - Angel Ally|4|4|Flying$When Angel of Renewal enters the battlefield, you gain 1 life for each creature you control.| +Angelic Gift|Battle for Zendikar|19|C|{1}{W}|Enchantment - Aura|||Enchant creature$When Angelic Gift enters the battlefield, draw a card.$Enchanted creature has flying.| +Cliffside Lookout|Battle for Zendikar|20|C|{W}|Creature - Kor Scout Ally|1|1|{4}{W}: Creatures you control get +1/+1 until end of turn.| +Courier Griffin|Battle for Zendikar|20|C|{3}{W}|Creature - Griffin|2|3|Flying$When Courier Griffin enters the battlefield, you gain 2 life.| Emeria Shepherd|Battle for Zendikar|22|R|{5}{W}{W}|Creature - Angel|4|4|Flying$Landfall � Whenever a land enters the battlefield under your control, you may return target nonland permanent card from your graveyard to your hand. If that land is a Plains, you may return that nonland permanent card to the battlefield instead.| -Encircling Fissure|Battle for Zendikar|023|U|{2}{W}|Instant|||Prevent all combat damage that would be dealt this turn by creatures target opponent controls.$Awaken 2 �{4}{W} (If you cast this spell for 5U, also put two +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)| -Expedition Envoy|Battle for Zendikar|024|U|{W}|Creature - Human Scout Ally|2|1|| +Encircling Fissure|Battle for Zendikar|23|U|{2}{W}|Instant|||Prevent all combat damage that would be dealt this turn by creatures target opponent controls.$Awaken 2 �{4}{W} (If you cast this spell for 5U, also put two +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)| +Expedition Envoy|Battle for Zendikar|24|U|{W}|Creature - Human Scout Ally|2|1|| Felidar Cub|Battle for Zendikar|25|C|{1}{W}|Creature - Cat Beast|2|2|Sacrifice Felidar Cub: Destroy target enchantment.| Felidar Sovereign|Battle for Zendikar|26|R|{4}{W}{W}|Creature - Cat Beast|4|6|Vigilance, lifelink$At the beginning of your upkeep, if you have 40 or more life, you win the game.| -Fortified Rampart|Battle for Zendikar|027|C|{1}{W}|Creature - Wall|0|6|Defender| -Ghostly Sentinel|Battle for Zendikar|028|C|{4}{W}|Creature - Kor Spirit|3|3|Flying, vigilance| +Fortified Rampart|Battle for Zendikar|27|C|{1}{W}|Creature - Wall|0|6|Defender| +Ghostly Sentinel|Battle for Zendikar|28|C|{4}{W}|Creature - Kor Spirit|3|3|Flying, vigilance| Gideon, Ally of Zendikar|Battle for Zendikar|29|M|{2}{W}{W}|Planeswalker - Gideon|4|+1: Until end of turn, Gideon, Ally of Zendikar becomes a 5/5 Human Soldier Ally creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn.$0: Put a 2/2 white Knight Ally creature token onto the battlefield.$-4: You get an emblem with "Creatures you control get +1/+1."| Gideon's Reproach|Battle for Zendikar|30|C|{1}{W}|Instant|||Gideon's Reproach deals 4 damage to target attacking or blocking creature.| Hero of Goma Fada|Battle for Zendikar|31|R|{4}{W}|Creature - Human Knight Ally|4|3|Rally � Whenever Hero of Goma Fada or another Ally enters the battlefield under your control, creatures you control gain indestructible until end of turn.| -Inspired Charge|Battle for Zendikar|032|C|{2}{W}{W}|Instant|||Creatures you control get +2/+1 until end of turn.| -Kitesail Scout|Battle for Zendikar|033|C|{W}|Creature - Kor Scout|1|1|Flying| -Kor Bladewhirl|Battle for Zendikar|034|U|{1}{W}|Creature - Kor Soldier Ally|2|2|Rally � Whenever Kor Bladewhirl or another Ally enters the battlefield under your control, creatures you control gain first strike until end of turn.| -Kor Castigator|Battle for Zendikar|035|C|{1}{W}|Creature - Kor Wizard Ally|3|1|Kor Castigator can't be blocked by Eldrazi Scions.| -Kor Entanglers|Battle for Zendikar|036|U|{4}{W}|Creature - Kor Soldier Ally|3|4|Rally � Whenever Kor Entanglers or another Ally enters the battlefield under your control, tap target creature an opponent controls.| +Inspired Charge|Battle for Zendikar|32|C|{2}{W}{W}|Instant|||Creatures you control get +2/+1 until end of turn.| +Kitesail Scout|Battle for Zendikar|33|C|{W}|Creature - Kor Scout|1|1|Flying| +Kor Bladewhirl|Battle for Zendikar|34|U|{1}{W}|Creature - Kor Soldier Ally|2|2|Rally � Whenever Kor Bladewhirl or another Ally enters the battlefield under your control, creatures you control gain first strike until end of turn.| +Kor Castigator|Battle for Zendikar|35|C|{1}{W}|Creature - Kor Wizard Ally|3|1|Kor Castigator can't be blocked by Eldrazi Scions.| +Kor Entanglers|Battle for Zendikar|36|U|{4}{W}|Creature - Kor Soldier Ally|3|4|Rally � Whenever Kor Entanglers or another Ally enters the battlefield under your control, tap target creature an opponent controls.| Lantern Scout|Battle for Zendikar|37|R|{2}{W}|Creature - Human Scout Ally|3|2|Rally � Whenever Lantern Scout or another Ally enters the battlefield under your control, creatures you control gain lifelink until end of turn.| -Lithomancer's Focus|Battle for Zendikar|038|C|{W}|Instant|||Target creature gets +2/+2 until end of turn. Prevent all damage that would be dealt to that creature this turn by colorless sources.| -Makindi Patrol|Battle for Zendikar|039|C|{2}{W}|Creature - Human Knight Ally|2|3|Rally � Whenever Makindi Patrol or another Ally enters the battlefield under your control, creatures you control gain vigilance until end of turn.| -Ondu Greathorn|Battle for Zendikar|040|C|{3}{W}|Creature - Beast|2|3|First strike$Landfall � Whenever a land enters the battlefield under your control, Ondu Greathorn gets +2/+2 until end of turn.| -Ondu Rising|Battle for Zendikar|041|U|{1}{W}|Sorcery|||Whenever a creature attacks this turn, it gains lifelink until end of turn.$Awaken 4�{4}{W} (If you cast this spell for 5U, also put four +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)| +Lithomancer's Focus|Battle for Zendikar|38|C|{W}|Instant|||Target creature gets +2/+2 until end of turn. Prevent all damage that would be dealt to that creature this turn by colorless sources.| +Makindi Patrol|Battle for Zendikar|39|C|{2}{W}|Creature - Human Knight Ally|2|3|Rally � Whenever Makindi Patrol or another Ally enters the battlefield under your control, creatures you control gain vigilance until end of turn.| +Ondu Greathorn|Battle for Zendikar|40|C|{3}{W}|Creature - Beast|2|3|First strike$Landfall � Whenever a land enters the battlefield under your control, Ondu Greathorn gets +2/+2 until end of turn.| +Ondu Rising|Battle for Zendikar|41|U|{1}{W}|Sorcery|||Whenever a creature attacks this turn, it gains lifelink until end of turn.$Awaken 4�{4}{W} (If you cast this spell for 5U, also put four +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)| Planar Outburst|Battle for Zendikar|42|R|{3}{W}{W}|Sorcery|||Destroy all nonland creatures.$Awaken 4�{5}{W}{W}{W} (If you cast this spell for {5}{W}{W}{W}, also put four +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)| Quarantine Field|Battle for Zendikar|43|M|{X}{X}{W}{W}|Enchantment|||Quarantine Field enters the battlefield with X isolation counters on it.$When Quarantine Field enters the battlefield, for each isolation counter on it, exile up to one target nonland permanent an opponent controls until Quarantine Field leaves the battlefield.| Retreat to Emeria|Battle for Zendikar|44|U|{3}{W}|Enchantment|||Landfall � Whenever a land enters the battlefield under your control, choose one �$� Put a 1/1 white Kor Ally creature token onto the battlefield.$� Creatures you control get +1/+1 until end of turn.| -Roil's Retribution|Battle for Zendikar|045|U|{3}{W}{W}|Instant|||Roil's Retribution deals 5 damage divided as you choose among any number of target attacking or blocking creatures.| -Serene Steward|Battle for Zendikar|046|U|{1}{W}|Creature - Human Cleric Ally|2|2|Whenever you gain life, you may pay {W}. If you do, put a +1/+1 counter on target creature.| -Shadow Glider|Battle for Zendikar|047|C|{2}{W}|Creature - Kor Soldier|2|2|Flying| +Roil's Retribution|Battle for Zendikar|45|U|{3}{W}{W}|Instant|||Roil's Retribution deals 5 damage divided as you choose among any number of target attacking or blocking creatures.| +Serene Steward|Battle for Zendikar|46|U|{1}{W}|Creature - Human Cleric Ally|2|2|Whenever you gain life, you may pay {W}. If you do, put a +1/+1 counter on target creature.| +Shadow Glider|Battle for Zendikar|47|C|{2}{W}|Creature - Kor Soldier|2|2|Flying| Sheer Drop|Battle for Zendikar|48|C|{2}{W}|Sorcery|||Destroy target tapped creature.$Awaken 3�{5}{W} (If you cast this spell for {5}{W}, also put three +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)| -Smite the Monstrous|Battle for Zendikar|049|C|{3}{W}|Instant|||Destroy target creature with power 4 or greater.| +Smite the Monstrous|Battle for Zendikar|49|C|{3}{W}|Instant|||Destroy target creature with power 4 or greater.| Stasis Snare|Battle for Zendikar|50|U|{1}{W}{W}|Enchantment|||Flash$When Stasis Snare enters the battlefield, exile target creature an opponent controls until Stasis Snare leaves the battlefield. (That creature returns under its owner's control.)| -Stone Haven Medic|Battle for Zendikar|051|C|{1}{W}|Creature - Kor Cleric|1|3|{W}, {t}: You gain 1 life.| +Stone Haven Medic|Battle for Zendikar|51|C|{1}{W}|Creature - Kor Cleric|1|3|{W}, {t}: You gain 1 life.| Tandem Tactics|Battle for Zendikar|52|C|{1}{W}|Instant|||Up to two target creatures each get +1/+2 until end of turn. You gain 2 life.| -Unified Front|Battle for Zendikar|053|U|{3}{W}|Sorcery|||Converge � Put a 1/1 white Kor Ally creature token onto the battlefield for each color of mana spent to cast Unified Front.| +Unified Front|Battle for Zendikar|53|U|{3}{W}|Sorcery|||Converge � Put a 1/1 white Kor Ally creature token onto the battlefield for each color of mana spent to cast Unified Front.| Adverse Conditions|Battle for Zendikar|54|U|{3}{U}|Instant|||Devoid (This card has no color.)$Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. Put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {C} to your mana pool."| Anticipate|Battle for Zendikar|69|C|{1}{U}|Instant|||Look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| Benthic Infiltrator|Battle for Zendikar|55|C|{2}{U}|Creature - Eldrazi Drone|1|4|Devoid (This card has no color.)$Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)$Benthic Infiltrator can't be blocked.| Brilliant Spectrum|Battle for Zendikar|70|C|{3}{U}|Sorcery|||Converge � Draw X cards, where X is the number of colors of mana spent to cast Brilliant Spectrum. Then discard two cards.| Cloud Manta|Battle for Zendikar|71|C|{3}{U}|Creature - Fish|3|2|Flying| Clutch of Currents|Battle for Zendikar|72|C|{U}|Sorcery|||Return target creature to its owner's hand.$Awaken 3�{4}{U} (If you cast this spell for {4}{U}, also put three +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)| -Coastal Discovery|Battle for Zendikar|073|U|{3}{U}|Sorcery|||Draw two cards.$Awaken 4�{5}{U} (If you cast this spell for {5}{U}, also put four +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)| +Coastal Discovery|Battle for Zendikar|73|U|{3}{U}|Sorcery|||Draw two cards.$Awaken 4�{5}{U} (If you cast this spell for {5}{U}, also put four +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)| Coralhelm Guide|Battle for Zendikar|74|C|{1}{U}|Creature - Merfolk Scout Ally|2|1|{4}{U}: Target creature can't be blocked this turn.| Cryptic Cruiser|Battle for Zendikar|56|U|{3}{U}|Creature - Eldrazi Processor|3|3|Devoid (This card has no color.)${2}{U}, Put a card an opponent owns from exile into that player's graveyard: Tap target creature.| Dampening Pulse|Battle for Zendikar|75|U|{3}{U}|Enchantment|||Creatures your opponents control get -1/-0.| Dispel|Battle for Zendikar|76|C|{U}|Instant|||Counter target instant spell.| -Drowner of Hope|Battle for Zendikar|057|R|{5}{U}|Creature - Eldrazi|5|5|Devoid (This card has no color.)$When Drowner of Hope enters the battlefield, put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {C} to your mana pool."$Sacrifice an Eldrazi Scion: Tap Target creature.| +Drowner of Hope|Battle for Zendikar|57|R|{5}{U}|Creature - Eldrazi|5|5|Devoid (This card has no color.)$When Drowner of Hope enters the battlefield, put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {C} to your mana pool."$Sacrifice an Eldrazi Scion: Tap Target creature.| Eldrazi Skyspawner|Battle for Zendikar|58|C|{2}{U}|Creature - Eldrazi Drone|2|1|Devoid (This card has no color.)$Flying$When Eldrazi Skyspawner enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {C} to your mana pool."| -Exert Influence|Battle for Zendikar|077|R|{4}{U}|Sorcery|||Converge � Gain control of target creature if its power is less than or equal to the number of colors of mana spent to cast Exert Influence.| -Guardian of Tazeem|Battle for Zendikar|078|R|{3}{U}{U}|Creature - Sphinx|4|5|Flying$Landfall � Whenever a land enters the battlefield under your control, tap target creature an opponent controls. If that land is an Island, that creature doesn't untap during its controller's next untap step. | +Exert Influence|Battle for Zendikar|77|R|{4}{U}|Sorcery|||Converge � Gain control of target creature if its power is less than or equal to the number of colors of mana spent to cast Exert Influence.| +Guardian of Tazeem|Battle for Zendikar|78|R|{3}{U}{U}|Creature - Sphinx|4|5|Flying$Landfall � Whenever a land enters the battlefield under your control, tap target creature an opponent controls. If that land is an Island, that creature doesn't untap during its controller's next untap step. | Halimar Tidecaller|Battle for Zendikar|79|U|{2}{U}|Creature - Human Wizard Ally|2|3|When Halimar Tidecaller enters the battlefield, you may return target card with awaken from your graveyard to your hand.$Land creatures you control have flying.| -Horribly Awry|Battle for Zendikar|059|U|{1}{U}|Instant|||Devoid (This card has no color.)$Counter target creature spell with converted mana cost 4 or less. If that spell is countered this way, exile it instead of putting it into its owner's graveyard.| -Incubator Drone|Battle for Zendikar|060|C|{3}{U}|Creature - Eldrazi Drone|2|3|Devoid (This card has no color.)$When Incubator Drone enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {C} to your mana pool."| -Mist Intruder|Battle for Zendikar|061|C|{1}{U}|Creature - Eldrazi Drone|1|2|Devoid (This card has no color.)$Flying$Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)| +Horribly Awry|Battle for Zendikar|59|U|{1}{U}|Instant|||Devoid (This card has no color.)$Counter target creature spell with converted mana cost 4 or less. If that spell is countered this way, exile it instead of putting it into its owner's graveyard.| +Incubator Drone|Battle for Zendikar|60|C|{3}{U}|Creature - Eldrazi Drone|2|3|Devoid (This card has no color.)$When Incubator Drone enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {C} to your mana pool."| +Mist Intruder|Battle for Zendikar|61|C|{1}{U}|Creature - Eldrazi Drone|1|2|Devoid (This card has no color.)$Flying$Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)| Murk Strider|Battle for Zendikar|62|C|{3}{U}|Creature - Eldrazi Processor|3|2|When Murk Strider enters the battlefield, you may put a card an opponent owns from exile into that player's graveyard. If you do, return target creature to its owner's hand.| Oracle of Dust|Battle for Zendikar|63|C|{4}{U}|Creature - Eldrazi Processor|3|5|Devoid (This card has no color.)${2}, Put a card an opponent owns from exile into that player's graveyard: Draw a card, then discard a card.| Part the Waterveil|Battle for Zendikar|80|M|{4}{U}{U}|Sorcery|||Take an extra turn after this one. Exile Part the Waterveil.$Awaken 6�{6}{U}{U}{U} (If you cast this spell for {6}{U}{U}{U}, also put six +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)| -Prism Array|Battle for Zendikar|081|R|{4}{U}|Enchantment|||Converge � Prism Array enters the battlfield with a crystal counter on it for each color of mana spent to cast it.$Remove a crystal counter from Prism Array: Tap target creature.${W}{U}{B}{R}{G}: Scry 3. | -Retreat to Coralhelm|Battle for Zendikar|082|U|{2}{U}|Enchantment|||Landfall � Whenever a land enters the battlefield under your control, choose one �$� You may tap or untap target creature.$� Scry 1.| +Prism Array|Battle for Zendikar|81|R|{4}{U}|Enchantment|||Converge � Prism Array enters the battlfield with a crystal counter on it for each color of mana spent to cast it.$Remove a crystal counter from Prism Array: Tap target creature.${W}{U}{B}{R}{G}: Scry 3. | +Retreat to Coralhelm|Battle for Zendikar|82|U|{2}{U}|Enchantment|||Landfall � Whenever a land enters the battlefield under your control, choose one �$� You may tap or untap target creature.$� Scry 1.| Roilmage's Trick|Battle for Zendikar|83|C|{3}{U}|Instant|||Converge � Creatures your opponents control get -X/-0 until end of turn, where X is the number of colors of mana spent to cast Roilmage's Trick.$Draw a card.| Ruination Guide|Battle for Zendikar|64|U|{2}{U}|Creature - Eldrazi Drone|3|2|Devoid (This card has no color.)$Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)$Other colorless creatures you control get +1/+0.| Rush of Ice|Battle for Zendikar|84|C|{U}|Sorcery|||Tap target creature. It doesn't untap during its controller's next untap step.$Awaken 3�{4}{U} (If you cast this spell for {4}{U}, also put three +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)| @@ -27477,10 +27477,10 @@ Scatter to the Winds|Battle for Zendikar|85|R|{1}{U}{U}|Instant|||Counter target Spell Shrivel|Battle for Zendikar|66|C|{2}{U}|Instant|||Devoid (This card has no color.)$Counter target spell unless its controller pays {4}. If that spell is countered this way, exile it instead of putting it into its owner's graveyard.| Tide Drifter|Battle for Zendikar|67|U|{1}{U}|Creature - Eldrazi Drone|0|5|Devoid (This card has no color.)$Other colorless creatures you control get +0/+1.| Tightening Coils|Battle for Zendikar|86|C|{1}{U}|Enchantment - Aura|||Enchant creature$Enchanted creature gets -6/-0 and loses flying.| -Ugin's Insight|Battle for Zendikar|087|R|{3}{U}{U}|Sorcery|||Scry X, where X is the highest converted mana cost among permanents you control, then draw three cards.| +Ugin's Insight|Battle for Zendikar|87|R|{3}{U}{U}|Sorcery|||Scry X, where X is the highest converted mana cost among permanents you control, then draw three cards.| Ulamog's Reclaimer|Battle for Zendikar|68|U|{4}{U}|Creature - Eldrazi Processor|2|5|Devoid (This card has no color.)$When Ulamog's Reclaimer enters the battlefield, you may put a card an opponent owns from exile into that player's graveyard. If you do, return target instant or sorcery card from your graveyard to your hand.| -Wave-Wing Elemental|Battle for Zendikar|088|C|{5}{U}|Creature - Elemental|3|4|Flying$Landfall � Whenver a land enters the battlefield under your control, Wave-Wing Elemental gets +2/+2 until end of turn.| -Windrider Patrol|Battle for Zendikar|089|U|{3}{U}{U}|Creature - Merfolk Wizard|4|3|Flying$Whenever Windrider Patrol deals combat damage to a player, scry 2.| +Wave-Wing Elemental|Battle for Zendikar|88|C|{5}{U}|Creature - Elemental|3|4|Flying$Landfall � Whenver a land enters the battlefield under your control, Wave-Wing Elemental gets +2/+2 until end of turn.| +Windrider Patrol|Battle for Zendikar|89|U|{3}{U}{U}|Creature - Merfolk Wizard|4|3|Flying$Whenever Windrider Patrol deals combat damage to a player, scry 2.| Altar's Reap|Battle for Zendikar|103|C|{1}{B}|Instant|||As an additional cost to cast Altar's Reap, sacrifice a creature.$Draw two cards.| Bloodbond Vampire|Battle for Zendikar|104|U|{2}{B}{B}|Creature - Vampire Shaman Ally|3|3|Whenever you gain life, put a +1/+1 counter on Bloodbond Vampire.| Bone Splinters|Battle for Zendikar|105|C|{B}|Sorcery|||As an additional cost to cast Bone Splinters, sacrifice a creature.$Destroy target creature.| @@ -29733,7 +29733,7 @@ Curio Vendor|Kaladesh|42|C|{1}{U}|Creature - Vedalken|2|1|| Disappearing Act|Kaladesh|43|U|{1}{U}{U}|Instant|||As an additional cost to cast Disappearing Act, return a permanent you control to its owner's hand.$Counter target spell.| Dramatic Reversal|Kaladesh|44|C|{1}{U}|Instant|||Untap all nonland permanents you control.| Era of Innovation|Kaladesh|45|U|{1}{U}|Enchantment|||Whenever an artifact or creature enters the battlefield under your control, you may pay {1}. If you do, you get {E}{E} (two energy counters).$Pay {E}{E}{E}{E}{E}{E}, sacrifice Era of Innovation: Draw three cards.| -Experimental Aviator|Kaladesh|046|U|{3}{U}{U}|Creature - Human Artificer|0|3|Flying$When Experimental Aviator enters the battlefield, create two 1/1 colorless Thopter artifact creature tokens with flying.| +Experimental Aviator|Kaladesh|46|U|{3}{U}{U}|Creature - Human Artificer|0|3|Flying$When Experimental Aviator enters the battlefield, create two 1/1 colorless Thopter artifact creature tokens with flying.| Failed Inspection|Kaladesh|47|C|{2}{U}{U}|Instant|||Costner target spell. Draw a card, then discard a card.| Gearseeker Serpent|Kaladesh|48|C|{5}{U}{U}|Creature - Serpent|5|6|Gearseeker Serpent costs one less man to cast for each artifact you control$5U: Gearseeker Serpent can't be blocked this turn.| Glimmer of Genius|Kaladesh|49|U|{3}{U}|instant|||Scry 2, then draw two card. you get {E}{E}.| @@ -31628,7 +31628,7 @@ Mountain|Archenemy: Nicol Bolas|105|L||Basic Land - Mountain|||{T}: Add {R} to y Forest|Archenemy: Nicol Bolas|106|L||Basic Land - Forest|||{T}: Add {G} to your mana pool.| Adorned Pouncer|Hour of Devastation|2|R|{1}{W}|Creature - Cat|1|1|Double strike$Eternalize {3}{W}{W}| Angel of the God-Pharaoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2}| -Adorned Pouncer|Hour of Devastation|002|R|{1}{W}|Creature - Cat|1|1|Double strike$Eternalize {3}{W}{W} ({3}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Cat with no mana cost. Eternalize only as a sorcery.)| +Adorned Pouncer|Hour of Devastation|2|R|{1}{W}|Creature - Cat|1|1|Double strike$Eternalize {3}{W}{W} ({3}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Cat with no mana cost. Eternalize only as a sorcery.)| Angel of Condemnation|Hour of Devastation|3|R|{2}{W}{W}|Creature - Angel|3|3|Flying, vigilance${2}{W}, {T}: Exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step.${2}{W}, {T}, Exert Angel of Condemnation: Exile another target creature until Angel of Condemnation leaves the battlefield. (An exerted creature won't untap during your next untap step.)| Angel of the God-Pharoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2} ({2}, Discard this card: Draw a card.)| Desert's Hold|Hour of Devastation|8|U|{2}{W}|Enchantment - Aura|||Enchant creature$When Desert's Hold enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life.$Enchanted creature can't attack or block, and its activated abilities can't be activated.| @@ -31653,15 +31653,15 @@ Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| Dreamstealer|Hour of Devastation|63|R|{2}{B}|Creature - Human Wizard|1|2|Menace$When Dreamstealer deals combat damage to a player, that player discards that many cards.$Eternalize {4}{B}{B} ({4}{B}{B}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| -Hour of Glory|Hour of Devastation|065|R|{3}{B}|Instant|||Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature.| +Hour of Glory|Hour of Devastation|65|R|{3}{B}|Instant|||Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature.| Khenra Eternal|Hour of Devastation|66|C|{1}{B}|Creature - Zombie Jackal Warrior|2|2|Afflict 1 (Whenever this creature becomes blocked, defending player loses 1 life.)| Liliana's Defeat|Hour of Devastation|68|U|{B}|Sorcery|||Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life.| Maurauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| Razaketh, the Foulblooded|Hour of Devastation|73|M|{5}{B}{B}{B}|Legendary Creature - Demon|8|8|Flying, trample$Pay 2 life, Sacrifice another creature: Search your library for a card and put that card into your hand. Then shuffle your library.| -Torment of Hailfire|Hour of Devastation|077|R|{X}{B}{B}|Sorcery|||Repeat the following process X times. Each opponent loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| -Torment of Scarabs|Hour of Devastation|078|U|{3}{B}|Enchantment - Aura Curse|||Enchant player$At the beginning of enchanted player's upkeep, that player loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| -Torment of Venom|Hour of Devastation|079|C|{2}{B}{B}|Instant|||Put three -1/-1 counters on target creature. Its controller loses 3 life unless he or she sacrifices another nonland permanent or discards a card.| -Abrade|Hour of Devastation|083|U|{1}{R}|Instant|||Choose one —$• Abrade deals 3 damage to target creature.$• Destroy target artifact.| +Torment of Hailfire|Hour of Devastation|77|R|{X}{B}{B}|Sorcery|||Repeat the following process X times. Each opponent loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| +Torment of Scarabs|Hour of Devastation|78|U|{3}{B}|Enchantment - Aura Curse|||Enchant player$At the beginning of enchanted player's upkeep, that player loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| +Torment of Venom|Hour of Devastation|79|C|{2}{B}{B}|Instant|||Put three -1/-1 counters on target creature. Its controller loses 3 life unless he or she sacrifices another nonland permanent or discards a card.| +Abrade|Hour of Devastation|83|U|{1}{R}|Instant|||Choose one —$• Abrade deals 3 damage to target creature.$• Destroy target artifact.| Chandra's Defeat|Hour of Devastation|86|U|{R}|Instant|||Chandra’s Defeat deals 5 damage to target red creature or red planeswalker. If that permanent is a Chandra planeswalker, you may discard a card. If you do, draw a card.| Defiant Khenra|Hour of Devastation|89|C|{1}{R}|Creature - Jackal Warrior|2|2|| Earthshaker Khenra|Hour of Devastation|90|R|{1}{R}|Creature - Jackal Warrior|2|1|Haste$When Earthshaker Khenra enters the battlefield, target creature with power less than or equal to Earthshaker Khenra's power can't block this turn.$Eternalize {4}{R}{R} ({4}{R}{R}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Jackal Warrior with no mana cost. Eternalize only as a sorcery.)| From 754b2bdfaf262892c9ce9b2bcc9f2963f8163d23 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 25 Jun 2017 22:30:55 +1000 Subject: [PATCH 019/160] Implement The Scorpion God (HOU) + Fix for Unesh --- .../src/mage/cards/t/TheScorpionGod.java | 168 ++++++++++++++++++ .../cards/u/UneshCriosphinxSovereign.java | 7 +- .../src/mage/sets/HourOfDevastation.java | 1 + 3 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/t/TheScorpionGod.java diff --git a/Mage.Sets/src/mage/cards/t/TheScorpionGod.java b/Mage.Sets/src/mage/cards/t/TheScorpionGod.java new file mode 100644 index 0000000000..93aa0afd05 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TheScorpionGod.java @@ -0,0 +1,168 @@ +/* + * 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.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author spjspj + */ +public class TheScorpionGod extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature"); + + static { + filter.add(new AnotherPredicate()); + } + + public TheScorpionGod(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{R}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add("God"); + this.power = new MageInt(6); + this.toughness = new MageInt(5); + + // Whenever a creature with a -1/-1 counter on it dies, draw a card. + this.addAbility(new TheScorpionGodTriggeredAbility()); + + // {1}{B}{R}: Put a -1/-1 counter on another target creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.M1M1.createInstance()), new ManaCostsImpl("{1}{B}{R}")); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + + // When The Scorpion God dies, return it to its owner's hand at the beginning of the next end step. + this.addAbility(new DiesTriggeredAbility(new TheScorpionGodEffect())); + } + + public TheScorpionGod(final TheScorpionGod card) { + super(card); + } + + @Override + public TheScorpionGod copy() { + return new TheScorpionGod(this); + } +} + +class TheScorpionGodTriggeredAbility extends TriggeredAbilityImpl { + + public TheScorpionGodTriggeredAbility() { + super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), false); + } + + public TheScorpionGodTriggeredAbility(TheScorpionGodTriggeredAbility ability) { + super(ability); + } + + @Override + public TheScorpionGodTriggeredAbility copy() { + return new TheScorpionGodTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.ZONE_CHANGE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD) { + Permanent permanent = zEvent.getTarget(); + if (permanent != null + && permanent.getCounters(game).containsKey(CounterType.M1M1)) { + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever a creature with a -1/-1 counter on it dies, draw a card."; + } +} + +class TheScorpionGodEffect extends OneShotEffect { + + private static final String effectText = "return it to its owner's hand"; + + TheScorpionGodEffect() { + super(Outcome.Benefit); + staticText = effectText; + } + + TheScorpionGodEffect(TheScorpionGodEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + // Create delayed triggered ability + Effect effect = new ReturnToHandSourceEffect(false, true); + effect.setText(staticText); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); + game.addDelayedTriggeredAbility(delayedAbility, source); + return true; + } + + @Override + public TheScorpionGodEffect copy() { + return new TheScorpionGodEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/UneshCriosphinxSovereign.java b/Mage.Sets/src/mage/cards/u/UneshCriosphinxSovereign.java index 20972911ac..96f310d36d 100644 --- a/Mage.Sets/src/mage/cards/u/UneshCriosphinxSovereign.java +++ b/Mage.Sets/src/mage/cards/u/UneshCriosphinxSovereign.java @@ -66,6 +66,10 @@ import mage.target.TargetCard; public class UneshCriosphinxSovereign extends CardImpl { private static final FilterCard filter = new FilterCard("Sphinx spells"); + + static { + filter.add(new SubtypePredicate(SubType.SPHINX)); + } public UneshCriosphinxSovereign(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}{U}"); @@ -82,8 +86,7 @@ public class UneshCriosphinxSovereign extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(filter, 2))); // Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard. - Ability ability = new UneshCriosphinxSovereignTriggeredAbility(); - this.addAbility(ability); + this.addAbility(new UneshCriosphinxSovereignTriggeredAbility()); } public UneshCriosphinxSovereign(final UneshCriosphinxSovereign card) { diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 619f93c3d8..f90f254acf 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -95,6 +95,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); From 9aa78290102197a511e2209a29d2a0123f662415 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 25 Jun 2017 22:38:08 +1000 Subject: [PATCH 020/160] Implement The Scorpion God (HOU) --- Mage.Sets/src/mage/cards/t/TheScorpionGod.java | 1 + Mage.Sets/src/mage/sets/MasterpieceSeriesAmonkhet.java | 1 + 2 files changed, 2 insertions(+) diff --git a/Mage.Sets/src/mage/cards/t/TheScorpionGod.java b/Mage.Sets/src/mage/cards/t/TheScorpionGod.java index 93aa0afd05..2f09c41a50 100644 --- a/Mage.Sets/src/mage/cards/t/TheScorpionGod.java +++ b/Mage.Sets/src/mage/cards/t/TheScorpionGod.java @@ -125,6 +125,7 @@ class TheScorpionGodTriggeredAbility extends TriggeredAbilityImpl { if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD) { Permanent permanent = zEvent.getTarget(); if (permanent != null + && permanent.isCreature() && permanent.getCounters(game).containsKey(CounterType.M1M1)) { return true; } diff --git a/Mage.Sets/src/mage/sets/MasterpieceSeriesAmonkhet.java b/Mage.Sets/src/mage/sets/MasterpieceSeriesAmonkhet.java index cc3ad95c71..89afd74497 100644 --- a/Mage.Sets/src/mage/sets/MasterpieceSeriesAmonkhet.java +++ b/Mage.Sets/src/mage/sets/MasterpieceSeriesAmonkhet.java @@ -92,6 +92,7 @@ public class MasterpieceSeriesAmonkhet extends ExpansionSet { cards.add(new SetCardInfo("Slaughter Pact", 44, Rarity.SPECIAL, mage.cards.s.SlaughterPact.class)); cards.add(new SetCardInfo("Spell Pierce", 17, Rarity.SPECIAL, mage.cards.s.SpellPierce.class)); cards.add(new SetCardInfo("Stifle", 18, Rarity.SPECIAL, mage.cards.s.Stifle.class)); + cards.add(new SetCardInfo("The Scorpion God", 54, Rarity.SPECIAL, mage.cards.t.TheScorpionGod.class)); cards.add(new SetCardInfo("Vindicate", 30, Rarity.SPECIAL, mage.cards.v.Vindicate.class)); cards.add(new SetCardInfo("Worship", 6, Rarity.SPECIAL, mage.cards.w.Worship.class)); cards.add(new SetCardInfo("Wrath of God", 7, Rarity.SPECIAL, mage.cards.w.WrathOfGod.class)); From 2681091bf261d1cb5195e26012a18c3e52b5dc45 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 25 Jun 2017 22:57:39 +1000 Subject: [PATCH 021/160] Implement The Scorpion God (HOU) --- Mage.Sets/src/mage/cards/t/TheScorpionGod.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/t/TheScorpionGod.java b/Mage.Sets/src/mage/cards/t/TheScorpionGod.java index 2f09c41a50..5cf2d84fe0 100644 --- a/Mage.Sets/src/mage/cards/t/TheScorpionGod.java +++ b/Mage.Sets/src/mage/cards/t/TheScorpionGod.java @@ -123,7 +123,7 @@ class TheScorpionGodTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD) { - Permanent permanent = zEvent.getTarget(); + Permanent permanent = game.getPermanentOrLKIBattlefield(zEvent.getTargetId()); if (permanent != null && permanent.isCreature() && permanent.getCounters(game).containsKey(CounterType.M1M1)) { From 6ee570d5e7ae758eec4148a066ba2918ad865b8a Mon Sep 17 00:00:00 2001 From: emerald000 Date: Mon, 26 Jun 2017 07:31:06 -0400 Subject: [PATCH 022/160] [HOU] Added Angel of Condemnation. Implemented ExertSourceCost. --- .../src/mage/cards/a/AngelOfCondemnation.java | 143 ++++++++++ .../src/mage/sets/HourOfDevastation.java | 247 +++++++++--------- .../costs/common/ExertSourceCost.java | 84 ++++++ 3 files changed, 351 insertions(+), 123 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/a/AngelOfCondemnation.java create mode 100644 Mage/src/main/java/mage/abilities/costs/common/ExertSourceCost.java diff --git a/Mage.Sets/src/mage/cards/a/AngelOfCondemnation.java b/Mage.Sets/src/mage/cards/a/AngelOfCondemnation.java new file mode 100644 index 0000000000..6280ccde3c --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AngelOfCondemnation.java @@ -0,0 +1,143 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.common.delayed.OnLeaveReturnExiledToBattlefieldAbility; +import mage.abilities.costs.common.ExertSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; +import mage.abilities.effects.common.ReturnToBattlefieldUnderOwnerControlTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author emerald000 + */ +public class AngelOfCondemnation extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature"); + static { + filter.add(new AnotherPredicate()); + } + + public AngelOfCondemnation(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); + + this.subtype.add("Angel"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // {2}{W}, {T}: Exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AngelOfCondemnationExileUntilEOTEffect(), new ManaCostsImpl<>("{2}{W}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + + // {2}{W}, {T}, Exert Angel of Condemnation: Exile another target creature until Angel of Condemnation leaves the battlefield. + Effect effect = new ExileUntilSourceLeavesEffect(""); + effect.setText("Exile another target creature until {this} leaves the battlefield"); + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{2}{W}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new ExertSourceCost(ability)); + ability.addTarget(new TargetCreaturePermanent(filter)); + ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility())); + this.addAbility(ability); + } + + public AngelOfCondemnation(final AngelOfCondemnation card) { + super(card); + } + + @Override + public AngelOfCondemnation copy() { + return new AngelOfCondemnation(this); + } +} + +class AngelOfCondemnationExileUntilEOTEffect extends OneShotEffect { + + AngelOfCondemnationExileUntilEOTEffect() { + super(Outcome.Detriment); + staticText = "exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step"; + } + + AngelOfCondemnationExileUntilEOTEffect(final AngelOfCondemnationExileUntilEOTEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); + Player controller = game.getPlayer(source.getControllerId()); + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (controller != null && permanent != null && sourcePermanent != null) { + if (controller.moveCardToExileWithInfo(permanent, source.getSourceId(), sourcePermanent.getIdName(), source.getSourceId(), game, Zone.BATTLEFIELD, true)) { + //create delayed triggered ability + Effect effect = new ReturnToBattlefieldUnderOwnerControlTargetEffect(); + effect.setText("return that card to the battlefield under its owner's control"); + effect.setTargetPointer(new FixedTarget(source.getFirstTarget(), game)); + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect), source); + return true; + } + } + return false; + } + + @Override + public AngelOfCondemnationExileUntilEOTEffect copy() { + return new AngelOfCondemnationExileUntilEOTEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index f90f254acf..e54aadde85 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -1,123 +1,124 @@ -/* -* 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.sets; - -import java.util.ArrayList; -import java.util.List; -import mage.cards.ExpansionSet; -import mage.cards.repository.CardCriteria; -import mage.cards.repository.CardInfo; -import mage.cards.repository.CardRepository; -import mage.constants.Rarity; -import mage.constants.SetType; - -/** - * @author fireshoes - */ -public class HourOfDevastation extends ExpansionSet { - - private static final HourOfDevastation instance = new HourOfDevastation(); - - public static HourOfDevastation getInstance() { - return instance; - } - - protected final List savedSpecialLand = new ArrayList<>(); - - private HourOfDevastation() { - super("Hour of Devastation", "HOU", ExpansionSet.buildDate(2017, 7, 14), SetType.EXPANSION); - this.blockName = "Amonkhet"; - this.parentSet = Amonkhet.getInstance(); - this.hasBasicLands = true; - this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; - this.numBoosterUncommon = 3; - this.numBoosterRare = 1; - this.ratioBoosterMythic = 8; - this.ratioBoosterSpecialLand = 144; - - cards.add(new SetCardInfo("Abrade", 83, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); - cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); - cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); - cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); - cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); - cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); - cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); - cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); - cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); - cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); - cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); - cards.add(new SetCardInfo("Desert of the Indomitable", 172, Rarity.COMMON, mage.cards.d.DesertOfTheIndomitable.class)); - cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); - cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); - cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); - cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); - cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); - cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); - cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); - cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); - cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); - cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); - cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); - cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); - cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); - cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); - cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); - cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); - cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); - cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); - cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); - cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); - cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); - cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); - cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); - cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); - cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); - cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); - cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); - cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); - cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); - cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); - cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); - cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); - } - - @Override - public List getSpecialLand() { - if (savedSpecialLand.isEmpty()) { - CardCriteria criteria = new CardCriteria(); - criteria.setCodes("MPS-AKH"); - criteria.minCardNumber(31); - criteria.maxCardNumber(54); - savedSpecialLand.addAll(CardRepository.instance.findCards(criteria)); - } - - return new ArrayList<>(savedSpecialLand); - } -} +/* +* 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.sets; + +import java.util.ArrayList; +import java.util.List; +import mage.cards.ExpansionSet; +import mage.cards.repository.CardCriteria; +import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * @author fireshoes + */ +public class HourOfDevastation extends ExpansionSet { + + private static final HourOfDevastation instance = new HourOfDevastation(); + + public static HourOfDevastation getInstance() { + return instance; + } + + protected final List savedSpecialLand = new ArrayList<>(); + + private HourOfDevastation() { + super("Hour of Devastation", "HOU", ExpansionSet.buildDate(2017, 7, 14), SetType.EXPANSION); + this.blockName = "Amonkhet"; + this.parentSet = Amonkhet.getInstance(); + this.hasBasicLands = true; + this.hasBoosters = true; + this.numBoosterLands = 1; + this.numBoosterCommon = 10; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 8; + this.ratioBoosterSpecialLand = 144; + + cards.add(new SetCardInfo("Abrade", 83, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); + cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); + cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); + cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); + cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); + cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); + cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); + cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); + cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); + cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); + cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); + cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); + cards.add(new SetCardInfo("Desert of the Indomitable", 172, Rarity.COMMON, mage.cards.d.DesertOfTheIndomitable.class)); + cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); + cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); + cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); + cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); + cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); + cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); + cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); + cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); + cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); + cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); + cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); + cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); + cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); + cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); + cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); + cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); + cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); + cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); + cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); + cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); + cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); + cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); + cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); + cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); + cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); + cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); + cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); + cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); + cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); + cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); + } + + @Override + public List getSpecialLand() { + if (savedSpecialLand.isEmpty()) { + CardCriteria criteria = new CardCriteria(); + criteria.setCodes("MPS-AKH"); + criteria.minCardNumber(31); + criteria.maxCardNumber(54); + savedSpecialLand.addAll(CardRepository.instance.findCards(criteria)); + } + + return new ArrayList<>(savedSpecialLand); + } +} diff --git a/Mage/src/main/java/mage/abilities/costs/common/ExertSourceCost.java b/Mage/src/main/java/mage/abilities/costs/common/ExertSourceCost.java new file mode 100644 index 0000000000..8503edb603 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/costs/common/ExertSourceCost.java @@ -0,0 +1,84 @@ +/* +* 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.abilities.costs.common; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.CostImpl; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author emerald000 + */ +public class ExertSourceCost extends CostImpl { + + private final Ability source; + + public ExertSourceCost(Ability source) { + this.source = source; + this.text = "Exert {this}"; + } + + public ExertSourceCost(ExertSourceCost cost) { + super(cost); + this.source = cost.source; + } + + @Override + public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { + return true; + } + + @Override + public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { + Player player = game.getPlayer(controllerId); + Permanent permanent = game.getPermanent(sourceId); + if (player != null && permanent != null) { + game.fireEvent(GameEvent.getEvent(EventType.BECOMES_EXERTED, permanent.getId(), permanent.getId(), permanent.getControllerId())); + ContinuousEffect effect = new DontUntapInControllersNextUntapStepTargetEffect("", permanent.getControllerId()); + effect.setTargetPointer(new FixedTarget(permanent, game)); + game.addEffect(effect, source); + paid = true; + } + return paid; + } + + @Override + public ExertSourceCost copy() { + return new ExertSourceCost(this); + } +} From 3388fce4c1250828e1f8925bdb244d6544cafdea Mon Sep 17 00:00:00 2001 From: emerald000 Date: Mon, 26 Jun 2017 08:26:02 -0400 Subject: [PATCH 023/160] [HOU] Added Desert's Hold. Implemented OrCondition. --- Mage.Sets/src/mage/cards/d/DesertsHold.java | 99 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + .../mage/abilities/condition/OrCondition.java | 64 ++++++++++++ 3 files changed, 164 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DesertsHold.java create mode 100644 Mage/src/main/java/mage/abilities/condition/OrCondition.java diff --git a/Mage.Sets/src/mage/cards/d/DesertsHold.java b/Mage.Sets/src/mage/cards/d/DesertsHold.java new file mode 100644 index 0000000000..ecab2018eb --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DesertsHold.java @@ -0,0 +1,99 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.OrCondition; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.combat.CantBlockAttackActivateAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author emerald000 + */ +public class DesertsHold extends CardImpl { + + private static final FilterControlledPermanent filterDesertPermanent = new FilterControlledPermanent("Desert"); + private static final FilterCard filterDesertCard = new FilterCard("Desert card"); + static { + filterDesertPermanent.add(new SubtypePredicate(SubType.DESERT)); + filterDesertCard.add(new SubtypePredicate(SubType.DESERT)); + } + + public DesertsHold(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Removal)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Desert's Hold enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life. + this.addAbility(new ConditionalTriggeredAbility( + new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3)), + new OrCondition( + new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(filterDesertPermanent)), + new CardsInControllerGraveCondition(1, filterDesertCard)), + "When {this} enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life.")); + + // Enchanted creature can't attack or block, and its activated abilities can't be activated. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockAttackActivateAttachedEffect())); + } + + public DesertsHold(final DesertsHold card) { + super(card); + } + + @Override + public DesertsHold copy() { + return new DesertsHold(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index e54aadde85..acdde8e194 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -77,6 +77,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Desert of the Indomitable", 172, Rarity.COMMON, mage.cards.d.DesertOfTheIndomitable.class)); cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); + cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); diff --git a/Mage/src/main/java/mage/abilities/condition/OrCondition.java b/Mage/src/main/java/mage/abilities/condition/OrCondition.java new file mode 100644 index 0000000000..8e0949c472 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/condition/OrCondition.java @@ -0,0 +1,64 @@ +/* + * 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.abilities.condition; + +import java.util.ArrayList; +import java.util.Arrays; +import mage.abilities.Ability; +import mage.game.Game; + +/** + * Combines conditions to one compound conditon, one condition must be + * true to return true for the compound condtion. + * + * @author emerald000 + */ +public class OrCondition implements Condition { + + private final ArrayList conditions = new ArrayList<>(); + private final String text; + + public OrCondition(Condition... conditions) { + this("", conditions); + } + + public OrCondition(String text, Condition... conditions) { + this.conditions.addAll(Arrays.asList(conditions)); + this.text = text; + } + + @Override + public boolean apply(Game game, Ability source) { + return conditions.stream().anyMatch(condition -> condition.apply(game, source)); + } + + @Override + public String toString() { + return text; + } +} From 9302940463384f6a09e22f2b28922417a3bdbb38 Mon Sep 17 00:00:00 2001 From: emerald000 Date: Mon, 26 Jun 2017 08:41:18 -0400 Subject: [PATCH 024/160] Removed typoed duplicate line from mtg-cards-data.txt. --- Utils/mtg-cards-data.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index ff6ec0e41d..befe0a4a20 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31630,7 +31630,6 @@ Adorned Pouncer|Hour of Devastation|2|R|{1}{W}|Creature - Cat|1|1|Double strike$ Angel of the God-Pharaoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2}| Adorned Pouncer|Hour of Devastation|2|R|{1}{W}|Creature - Cat|1|1|Double strike$Eternalize {3}{W}{W} ({3}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Cat with no mana cost. Eternalize only as a sorcery.)| Angel of Condemnation|Hour of Devastation|3|R|{2}{W}{W}|Creature - Angel|3|3|Flying, vigilance${2}{W}, {T}: Exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step.${2}{W}, {T}, Exert Angel of Condemnation: Exile another target creature until Angel of Condemnation leaves the battlefield. (An exerted creature won't untap during your next untap step.)| -Angel of the God-Pharoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2} ({2}, Discard this card: Draw a card.)| Desert's Hold|Hour of Devastation|8|U|{2}{W}|Enchantment - Aura|||Enchant creature$When Desert's Hold enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life.$Enchanted creature can't attack or block, and its activated abilities can't be activated.| Djeru, With Eyes Open|Hour of Devastation|10|R|{3}{W}{W}|Legendary Creature - Human Warrior|4|3|Vigilance$When Djeru, With Eyes Open enters the battlefield, you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library.$If a source would deal damage to a planeswalker you control, prevent 1 of that damage.| Gideon's Defeat|Hour of Devastation|13|U|{W}|Instant|||Exile target white creature that's attacking or blocking. If it was a Gideon planeswalker, you gain 5 life.| From 64524a8c18880320a7063aa21eb3d9095fd1aec4 Mon Sep 17 00:00:00 2001 From: spjspj Date: Mon, 26 Jun 2017 23:13:48 +1000 Subject: [PATCH 025/160] Implement The Scarab God (HOU) --- Mage.Sets/src/mage/cards/t/TheScarabGod.java | 202 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + ...tTokenOntoBattlefieldCopyTargetEffect.java | 22 ++ 3 files changed, 225 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TheScarabGod.java diff --git a/Mage.Sets/src/mage/cards/t/TheScarabGod.java b/Mage.Sets/src/mage/cards/t/TheScarabGod.java new file mode 100644 index 0000000000..f5f4709218 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TheScarabGod.java @@ -0,0 +1,202 @@ +/* + * 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.t; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutTokenOntoBattlefieldCopyTargetEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInGraveyard; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author spjspj + */ +public class TheScarabGod extends CardImpl { + + public TheScarabGod(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{B}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add("God"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // At the beginning of your upkeep, each opponent loses X life and you scry X, where X is the number of Zombies you control. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TheScarabGodEffect(), TargetController.YOU, false)); + + // {2}{U}{B}: Exile target creature card from a graveyard. Create a token that's a copy of it, except it's a 4/4 black Zombie. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TheScarabGodEffect2(), new ManaCostsImpl("{2}{U}{B}")); + ability.addTarget(new TargetCardInGraveyard(1, 1, new FilterCreatureCard("creature card from a graveyard"))); + this.addAbility(ability); + + // When The Scarab God dies, return it to its owner's hand at the beginning of the next upkeep. + this.addAbility(new DiesTriggeredAbility(new TheScarabGodEffect3())); + } + + public TheScarabGod(final TheScarabGod card) { + super(card); + } + + @Override + public TheScarabGod copy() { + return new TheScarabGod(this); + } +} + +class TheScarabGodEffect extends OneShotEffect { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped Zombies you control"); + + static { + filter.add(new SubtypePredicate(SubType.ZOMBIE)); + } + + public TheScarabGodEffect() { + super(Outcome.Benefit); + staticText = "each opponent loses X life and you scry X, where X is the number of Zombies you control"; + } + + public TheScarabGodEffect(final TheScarabGodEffect effect) { + super(effect); + } + + @Override + public TheScarabGodEffect copy() { + return new TheScarabGodEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int numZombies = game.getBattlefield().countAll(filter, source.getControllerId(), game); + + if (numZombies > 0) { + for (UUID playerId : game.getOpponents(source.getControllerId())) { + Player opponent = game.getPlayer(playerId); + if (opponent != null) { + opponent.loseLife(numZombies, game, false); + } + } + controller.scry(numZombies, source, game); + } + + return true; + } + return false; + } +} + +class TheScarabGodEffect2 extends OneShotEffect { + + public TheScarabGodEffect2() { + super(Outcome.PutCreatureInPlay); + this.staticText = "Exile target creature card from a graveyard. Create a token that's a copy of it, except it's a 4/4 black Zombie."; + } + + public TheScarabGodEffect2(final TheScarabGodEffect2 effect) { + super(effect); + } + + @Override + public TheScarabGodEffect2 copy() { + return new TheScarabGodEffect2(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Card card = game.getCard(source.getFirstTarget()); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && card != null) { + controller.moveCards(card, Zone.EXILED, source, game); // Also if the move to exile is replaced, the copy takes place + PutTokenOntoBattlefieldCopyTargetEffect effect = new PutTokenOntoBattlefieldCopyTargetEffect(source.getControllerId(), null, false, 1, false, false, null, 4, 4, false); + effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); + effect.setOnlySubType("Zombie"); + effect.setOnlyColor(ObjectColor.BLACK); + effect.apply(game, source); + return true; + } + + return false; + } +} + +class TheScarabGodEffect3 extends OneShotEffect { + + private static final String effectText = "return it to its owner's hand at the beginning of the next upkeep."; + + TheScarabGodEffect3() { + super(Outcome.Benefit); + staticText = effectText; + } + + TheScarabGodEffect3(TheScarabGodEffect3 effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + // Create delayed triggered ability + Effect effect = new ReturnToHandSourceEffect(false, true); + effect.setText(staticText); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(effect); + game.addDelayedTriggeredAbility(delayedAbility, source); + return true; + } + + @Override + public TheScarabGodEffect3 copy() { + return new TheScarabGodEffect3(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index f90f254acf..23b71fe343 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -95,6 +95,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("The Scarab God", 145, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java index 55c1abcb2b..1e5b785bc3 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java @@ -31,6 +31,7 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; import mage.MageObject; +import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.Effect; @@ -60,6 +61,7 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { private final int number; private List addedTokenPermanents; private String additionalSubType; + private String onlySubType; private boolean tapped; private boolean attacking; private UUID attackedPlayer; @@ -67,6 +69,7 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { private final int tokenToughness; private boolean gainsFlying; private boolean becomesArtifact; + private ObjectColor color; public PutTokenOntoBattlefieldCopyTargetEffect() { super(Outcome.PutCreatureInPlay); @@ -75,11 +78,13 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { this.addedTokenPermanents = new ArrayList<>(); this.number = 1; this.additionalSubType = null; + this.onlySubType = null; this.attackedPlayer = null; this.tokenPower = Integer.MIN_VALUE; this.tokenToughness = Integer.MIN_VALUE; this.gainsFlying = false; this.becomesArtifact = false; + this.color = null; } public PutTokenOntoBattlefieldCopyTargetEffect(UUID playerId) { @@ -135,6 +140,7 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { this.addedTokenPermanents = new ArrayList<>(effect.addedTokenPermanents); this.number = effect.number; this.additionalSubType = effect.additionalSubType; + this.onlySubType = effect.onlySubType; this.tapped = effect.tapped; this.attacking = effect.attacking; this.attackedPlayer = effect.attackedPlayer; @@ -142,6 +148,7 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { this.tokenToughness = effect.tokenToughness; this.gainsFlying = effect.gainsFlying; this.becomesArtifact = effect.becomesArtifact; + this.color = effect.color; } public void setBecomesArtifact(boolean becomesArtifact) { @@ -210,6 +217,13 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { if (additionalSubType != null && !token.getSubtype(game).contains(additionalSubType)) { token.getSubtype(game).add(additionalSubType); } + if (onlySubType != null && !token.getSubtype(game).contains(onlySubType)) { + token.getSubtype(game).clear(); + token.getSubtype(game).add(onlySubType); + } + if (color != null) { + token.getColor(game).setColor(color); + } token.putOntoBattlefield(number, game, source.getSourceId(), playerId == null ? source.getControllerId() : playerId, tapped, attacking, attackedPlayer); for (UUID tokenId : token.getLastAddedTokenIds()) { // by cards like Doubling Season multiple tokens can be added to the battlefield @@ -261,4 +275,12 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { public void setAdditionalSubType(String additionalSubType) { this.additionalSubType = additionalSubType; } + + public void setOnlySubType(String onlySubType) { + this.onlySubType = onlySubType; + } + + public void setOnlyColor(ObjectColor color) { + this.color = color; + } } From 1d183736c8835095be214b272b0934f23d0c4b4e Mon Sep 17 00:00:00 2001 From: fireshoes Date: Mon, 26 Jun 2017 20:31:02 -0500 Subject: [PATCH 026/160] Added Vintage Cube June 2017. Added some HOU and XLN spoilers to mtg-cards-data.txt. --- .../tournament/cubes/VintageCubeJune2017.java | 583 ++++++++++++++++++ Mage.Server/config/config.xml | 1 + Mage.Server/release/config/config.xml | 1 + Utils/mtg-cards-data.txt | 30 +- 4 files changed, 605 insertions(+), 10 deletions(-) create mode 100644 Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/VintageCubeJune2017.java diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/VintageCubeJune2017.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/VintageCubeJune2017.java new file mode 100644 index 0000000000..e35f7cbc25 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/VintageCubeJune2017.java @@ -0,0 +1,583 @@ +/* + * 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.tournament.cubes; + +import mage.game.draft.DraftCube; + +/** + * + * @author fireshoes + */ +public class VintageCubeJune2017 extends DraftCube { + + public VintageCubeJune2017() { + super("MTGO Vintage Cube June 2017"); + + cubeCards.add(new DraftCube.CardIdentity("Abbot of Keral Keep", "")); + cubeCards.add(new DraftCube.CardIdentity("Abrupt Decay", "")); + cubeCards.add(new DraftCube.CardIdentity("Academy Ruins", "")); + cubeCards.add(new DraftCube.CardIdentity("Acidic Slime", "")); + cubeCards.add(new DraftCube.CardIdentity("Ajani Vengeant", "")); + cubeCards.add(new DraftCube.CardIdentity("Ancestral Recall", "")); + cubeCards.add(new DraftCube.CardIdentity("Ancestral Vision", "")); + cubeCards.add(new DraftCube.CardIdentity("Ancient Grudge", "")); + cubeCards.add(new DraftCube.CardIdentity("Ancient Tomb", "")); + cubeCards.add(new DraftCube.CardIdentity("Angel of Sanctions", "")); + cubeCards.add(new DraftCube.CardIdentity("Angel of Serenity", "")); + cubeCards.add(new DraftCube.CardIdentity("Anguished Unmaking", "")); + cubeCards.add(new DraftCube.CardIdentity("Animate Dead", "")); + cubeCards.add(new DraftCube.CardIdentity("Anticipate", "")); + cubeCards.add(new DraftCube.CardIdentity("Arbor Elf", "")); + cubeCards.add(new DraftCube.CardIdentity("Archangel of Thune", "")); + cubeCards.add(new DraftCube.CardIdentity("Arid Mesa", "")); + cubeCards.add(new DraftCube.CardIdentity("Armageddon", "")); + cubeCards.add(new DraftCube.CardIdentity("Ashiok, Nightmare Weaver", "")); + cubeCards.add(new DraftCube.CardIdentity("Avacyn's Pilgrim", "")); + cubeCards.add(new DraftCube.CardIdentity("Avalanche Riders", "")); + cubeCards.add(new DraftCube.CardIdentity("Avenger of Zendikar", "")); + cubeCards.add(new DraftCube.CardIdentity("Awakening Zone", "")); + cubeCards.add(new DraftCube.CardIdentity("Azorius Signet", "")); + cubeCards.add(new DraftCube.CardIdentity("Badlands", "")); + cubeCards.add(new DraftCube.CardIdentity("Balance", "")); + cubeCards.add(new DraftCube.CardIdentity("Baleful Strix", "")); + cubeCards.add(new DraftCube.CardIdentity("Baneslayer Angel", "")); + cubeCards.add(new DraftCube.CardIdentity("Banisher Priest", "")); + cubeCards.add(new DraftCube.CardIdentity("Banishing Light", "")); + cubeCards.add(new DraftCube.CardIdentity("Baral, Chief of Compliance", "")); + cubeCards.add(new DraftCube.CardIdentity("Basalt Monolith", "")); + cubeCards.add(new DraftCube.CardIdentity("Batterskull", "")); + cubeCards.add(new DraftCube.CardIdentity("Bayou", "")); + cubeCards.add(new DraftCube.CardIdentity("Bazaar of Baghdad", "")); + cubeCards.add(new DraftCube.CardIdentity("Beast Within", "")); + cubeCards.add(new DraftCube.CardIdentity("Birds of Paradise", "")); + cubeCards.add(new DraftCube.CardIdentity("Bitterblossom", "")); + cubeCards.add(new DraftCube.CardIdentity("Black Lotus", "")); + cubeCards.add(new DraftCube.CardIdentity("Blackcleave Cliffs", "")); + cubeCards.add(new DraftCube.CardIdentity("Blade Splicer", "")); + cubeCards.add(new DraftCube.CardIdentity("Blightsteel Colossus", "")); + cubeCards.add(new DraftCube.CardIdentity("Blood Crypt", "")); + cubeCards.add(new DraftCube.CardIdentity("Bloodbraid Elf", "")); + cubeCards.add(new DraftCube.CardIdentity("Bloodstained Mire", "")); + cubeCards.add(new DraftCube.CardIdentity("Blooming Marsh", "")); + cubeCards.add(new DraftCube.CardIdentity("Bone Shredder", "")); + cubeCards.add(new DraftCube.CardIdentity("Bonfire of the Damned", "")); + cubeCards.add(new DraftCube.CardIdentity("Boros Charm", "")); + cubeCards.add(new DraftCube.CardIdentity("Boros Signet", "")); + cubeCards.add(new DraftCube.CardIdentity("Botanical Sanctum", "")); + cubeCards.add(new DraftCube.CardIdentity("Braids, Cabal Minion", "")); + cubeCards.add(new DraftCube.CardIdentity("Brain Freeze", "")); + cubeCards.add(new DraftCube.CardIdentity("Brain Maggot", "")); + cubeCards.add(new DraftCube.CardIdentity("Brainstorm", "")); + cubeCards.add(new DraftCube.CardIdentity("Breeding Pool", "")); + cubeCards.add(new DraftCube.CardIdentity("Bribery", "")); + cubeCards.add(new DraftCube.CardIdentity("Brimaz, King of Oreskos", "")); + cubeCards.add(new DraftCube.CardIdentity("Brimstone Volley", "")); + cubeCards.add(new DraftCube.CardIdentity("Bring to Light", "")); + cubeCards.add(new DraftCube.CardIdentity("Buried Alive", "")); + cubeCards.add(new DraftCube.CardIdentity("Burning of Xinye", "")); + cubeCards.add(new DraftCube.CardIdentity("Burst Lightning", "")); + cubeCards.add(new DraftCube.CardIdentity("Cabal Ritual", "")); + cubeCards.add(new DraftCube.CardIdentity("Careful Study", "")); + cubeCards.add(new DraftCube.CardIdentity("Cast Out", "")); + cubeCards.add(new DraftCube.CardIdentity("Celestial Colonnade", "")); + cubeCards.add(new DraftCube.CardIdentity("Chain Lightning", "")); + cubeCards.add(new DraftCube.CardIdentity("Chandra, Flamecaller", "")); + cubeCards.add(new DraftCube.CardIdentity("Chandra, Pyromaster", "")); + cubeCards.add(new DraftCube.CardIdentity("Chandra, Torch of Defiance", "")); + cubeCards.add(new DraftCube.CardIdentity("Channel", "")); + cubeCards.add(new DraftCube.CardIdentity("Char", "")); + cubeCards.add(new DraftCube.CardIdentity("Chrome Mox", "")); + cubeCards.add(new DraftCube.CardIdentity("Coalition Relic", "")); + cubeCards.add(new DraftCube.CardIdentity("Coercive Portal", "")); + cubeCards.add(new DraftCube.CardIdentity("Commit // Memory", "")); + cubeCards.add(new DraftCube.CardIdentity("Compulsive Research", "")); + cubeCards.add(new DraftCube.CardIdentity("Concealed Courtyard", "")); + cubeCards.add(new DraftCube.CardIdentity("Consecrated Sphinx", "")); + cubeCards.add(new DraftCube.CardIdentity("Control Magic", "")); + cubeCards.add(new DraftCube.CardIdentity("Copperline Gorge", "")); + cubeCards.add(new DraftCube.CardIdentity("Corpse Dance", "")); + cubeCards.add(new DraftCube.CardIdentity("Council's Judgment", "")); + cubeCards.add(new DraftCube.CardIdentity("Counterspell", "")); + cubeCards.add(new DraftCube.CardIdentity("Courser of Kruphix", "")); + cubeCards.add(new DraftCube.CardIdentity("Crater's Claws", "")); + cubeCards.add(new DraftCube.CardIdentity("Craterhoof Behemoth", "")); + cubeCards.add(new DraftCube.CardIdentity("Creeping Tar Pit", "")); + cubeCards.add(new DraftCube.CardIdentity("Crucible of Worlds", "")); + cubeCards.add(new DraftCube.CardIdentity("Cryptic Command", "")); + cubeCards.add(new DraftCube.CardIdentity("Dack Fayden", "")); + cubeCards.add(new DraftCube.CardIdentity("Damnation", "")); + cubeCards.add(new DraftCube.CardIdentity("Daretti, Scrap Savant", "")); + cubeCards.add(new DraftCube.CardIdentity("Dark Confidant", "")); + cubeCards.add(new DraftCube.CardIdentity("Dark Petition", "")); + cubeCards.add(new DraftCube.CardIdentity("Dark Ritual", "")); + cubeCards.add(new DraftCube.CardIdentity("Darkslick Shores", "")); + cubeCards.add(new DraftCube.CardIdentity("Day of Judgment", "")); + cubeCards.add(new DraftCube.CardIdentity("Daze", "")); + cubeCards.add(new DraftCube.CardIdentity("Deathrite Shaman", "")); + cubeCards.add(new DraftCube.CardIdentity("Deceiver Exarch", "")); + cubeCards.add(new DraftCube.CardIdentity("Declaration in Stone", "")); + cubeCards.add(new DraftCube.CardIdentity("Delver of Secrets", "")); + cubeCards.add(new DraftCube.CardIdentity("Demonic Tutor", "")); + cubeCards.add(new DraftCube.CardIdentity("Den Protector", "")); + cubeCards.add(new DraftCube.CardIdentity("Deranged Hermit", "")); + cubeCards.add(new DraftCube.CardIdentity("Desecration Demon", "")); + cubeCards.add(new DraftCube.CardIdentity("Diabolic Edict", "")); + cubeCards.add(new DraftCube.CardIdentity("Dig Through Time", "")); + cubeCards.add(new DraftCube.CardIdentity("Dimir Signet", "")); + cubeCards.add(new DraftCube.CardIdentity("Disenchant", "")); + cubeCards.add(new DraftCube.CardIdentity("Dismember", "")); + cubeCards.add(new DraftCube.CardIdentity("Dissenter's Deliverance", "")); + cubeCards.add(new DraftCube.CardIdentity("Dragonlord Atarka", "")); + cubeCards.add(new DraftCube.CardIdentity("Dragonlord Dromoka", "")); + cubeCards.add(new DraftCube.CardIdentity("Dragonlord Ojutai", "")); + cubeCards.add(new DraftCube.CardIdentity("Dragonlord Silumgar", "")); + cubeCards.add(new DraftCube.CardIdentity("Dreadbore", "")); + cubeCards.add(new DraftCube.CardIdentity("Dromoka's Command", "")); + cubeCards.add(new DraftCube.CardIdentity("Dualcaster Mage", "")); + cubeCards.add(new DraftCube.CardIdentity("Duplicant", "")); + cubeCards.add(new DraftCube.CardIdentity("Duress", "")); + cubeCards.add(new DraftCube.CardIdentity("Edric, Spymaster of Trest", "")); + cubeCards.add(new DraftCube.CardIdentity("Eidolon of the Great Revel", "")); + cubeCards.add(new DraftCube.CardIdentity("Electrolyze", "")); + cubeCards.add(new DraftCube.CardIdentity("Elesh Norn, Grand Cenobite", "")); + cubeCards.add(new DraftCube.CardIdentity("Elspeth, Knight-Errant", "")); + cubeCards.add(new DraftCube.CardIdentity("Elspeth, Sun's Champion", "")); + cubeCards.add(new DraftCube.CardIdentity("Elves of Deep Shadow", "")); + cubeCards.add(new DraftCube.CardIdentity("Elvish Mystic", "")); + cubeCards.add(new DraftCube.CardIdentity("Emeria Angel", "")); + cubeCards.add(new DraftCube.CardIdentity("Empty the Warrens", "")); + cubeCards.add(new DraftCube.CardIdentity("Emrakul, the Aeons Torn", "")); + cubeCards.add(new DraftCube.CardIdentity("Emrakul, the Promised End", "")); + cubeCards.add(new DraftCube.CardIdentity("Enlightened Tutor", "")); + cubeCards.add(new DraftCube.CardIdentity("Entomb", "")); + cubeCards.add(new DraftCube.CardIdentity("Eternal Witness", "")); + cubeCards.add(new DraftCube.CardIdentity("Eureka", "")); + cubeCards.add(new DraftCube.CardIdentity("Everflowing Chalice", "")); + cubeCards.add(new DraftCube.CardIdentity("Exalted Angel", "")); + cubeCards.add(new DraftCube.CardIdentity("Exhume", "")); + cubeCards.add(new DraftCube.CardIdentity("Exquisite Firecraft", "")); + cubeCards.add(new DraftCube.CardIdentity("Fact or Fiction", "")); + cubeCards.add(new DraftCube.CardIdentity("Faithless Looting", "")); + cubeCards.add(new DraftCube.CardIdentity("Falkenrath Gorger", "")); + cubeCards.add(new DraftCube.CardIdentity("Fastbond", "")); + cubeCards.add(new DraftCube.CardIdentity("Fatal Push", "")); + cubeCards.add(new DraftCube.CardIdentity("Fauna Shaman", "")); + cubeCards.add(new DraftCube.CardIdentity("Fiend Hunter", "")); + cubeCards.add(new DraftCube.CardIdentity("Fiery Confluence", "")); + cubeCards.add(new DraftCube.CardIdentity("Figure of Destiny", "")); + cubeCards.add(new DraftCube.CardIdentity("Fire // Ice", "")); + cubeCards.add(new DraftCube.CardIdentity("Fireblast", "")); + cubeCards.add(new DraftCube.CardIdentity("Firebolt", "")); + cubeCards.add(new DraftCube.CardIdentity("Firedrinker Satyr", "")); + cubeCards.add(new DraftCube.CardIdentity("Flametongue Kavu", "")); + cubeCards.add(new DraftCube.CardIdentity("Flickerwisp", "")); + cubeCards.add(new DraftCube.CardIdentity("Flooded Strand", "")); + cubeCards.add(new DraftCube.CardIdentity("Force Spike", "")); + cubeCards.add(new DraftCube.CardIdentity("Force of Will", "")); + cubeCards.add(new DraftCube.CardIdentity("Frantic Search", "")); + cubeCards.add(new DraftCube.CardIdentity("Freyalise, Llanowar's Fury", "")); + cubeCards.add(new DraftCube.CardIdentity("Frost Titan", "")); + cubeCards.add(new DraftCube.CardIdentity("Fyndhorn Elves", "")); + cubeCards.add(new DraftCube.CardIdentity("Gaea's Cradle", "")); + cubeCards.add(new DraftCube.CardIdentity("Garruk Relentless", "")); + cubeCards.add(new DraftCube.CardIdentity("Garruk Wildspeaker", "")); + cubeCards.add(new DraftCube.CardIdentity("Garruk, Apex Predator", "")); + cubeCards.add(new DraftCube.CardIdentity("Garruk, Primal Hunter", "")); + cubeCards.add(new DraftCube.CardIdentity("Geist of Saint Traft", "")); + cubeCards.add(new DraftCube.CardIdentity("Genesis Wave", "")); + cubeCards.add(new DraftCube.CardIdentity("Gideon Jura", "")); + cubeCards.add(new DraftCube.CardIdentity("Gideon of the Trials", "")); + cubeCards.add(new DraftCube.CardIdentity("Gideon, Ally of Zendikar", "")); + cubeCards.add(new DraftCube.CardIdentity("Gifts Ungiven", "")); + cubeCards.add(new DraftCube.CardIdentity("Gilded Lotus", "")); + cubeCards.add(new DraftCube.CardIdentity("Gitaxian Probe", "")); + cubeCards.add(new DraftCube.CardIdentity("Glen Elendra Archmage", "")); + cubeCards.add(new DraftCube.CardIdentity("Go for the Throat", "")); + cubeCards.add(new DraftCube.CardIdentity("Goblin Dark-Dwellers", "")); + cubeCards.add(new DraftCube.CardIdentity("Goblin Guide", "")); + cubeCards.add(new DraftCube.CardIdentity("Goblin Welder", "")); + cubeCards.add(new DraftCube.CardIdentity("Godless Shrine", "")); + cubeCards.add(new DraftCube.CardIdentity("Golgari Signet", "")); + cubeCards.add(new DraftCube.CardIdentity("Grave Titan", "")); + cubeCards.add(new DraftCube.CardIdentity("Green Sun's Zenith", "")); + cubeCards.add(new DraftCube.CardIdentity("Grim Lavamancer", "")); + cubeCards.add(new DraftCube.CardIdentity("Grim Monolith", "")); + cubeCards.add(new DraftCube.CardIdentity("Grim Tutor", "")); + cubeCards.add(new DraftCube.CardIdentity("Griselbrand", "")); + cubeCards.add(new DraftCube.CardIdentity("Gruul Signet", "")); + cubeCards.add(new DraftCube.CardIdentity("Gurmag Angler", "")); + cubeCards.add(new DraftCube.CardIdentity("Gush", "")); + cubeCards.add(new DraftCube.CardIdentity("Guttersnipe", "")); + cubeCards.add(new DraftCube.CardIdentity("Hallowed Fountain", "")); + cubeCards.add(new DraftCube.CardIdentity("Hangarback Walker", "")); + cubeCards.add(new DraftCube.CardIdentity("Harmonize", "")); + cubeCards.add(new DraftCube.CardIdentity("Harsh Mentor", "")); + cubeCards.add(new DraftCube.CardIdentity("Heartbeat of Spring", "")); + cubeCards.add(new DraftCube.CardIdentity("Hedron Archive", "")); + cubeCards.add(new DraftCube.CardIdentity("Hellrider", "")); + cubeCards.add(new DraftCube.CardIdentity("Hero of Bladehold", "")); + cubeCards.add(new DraftCube.CardIdentity("Hero's Downfall", "")); + cubeCards.add(new DraftCube.CardIdentity("High Tide", "")); + cubeCards.add(new DraftCube.CardIdentity("Hissing Quagmire", "")); + cubeCards.add(new DraftCube.CardIdentity("Honor of the Pure", "")); + cubeCards.add(new DraftCube.CardIdentity("Huntmaster of the Fells", "")); + cubeCards.add(new DraftCube.CardIdentity("Hymn to Tourach", "")); + cubeCards.add(new DraftCube.CardIdentity("Hypnotic Specter", "")); + cubeCards.add(new DraftCube.CardIdentity("Imperial Recruiter", "")); + cubeCards.add(new DraftCube.CardIdentity("Imperial Seal", "")); + cubeCards.add(new DraftCube.CardIdentity("Impulse", "")); + cubeCards.add(new DraftCube.CardIdentity("Incinerate", "")); + cubeCards.add(new DraftCube.CardIdentity("Inferno Titan", "")); + cubeCards.add(new DraftCube.CardIdentity("Inkwell Leviathan", "")); + cubeCards.add(new DraftCube.CardIdentity("Inquisition of Kozilek", "")); + cubeCards.add(new DraftCube.CardIdentity("Inspiring Vantage", "")); + cubeCards.add(new DraftCube.CardIdentity("Iona, Shield of Emeria", "")); + cubeCards.add(new DraftCube.CardIdentity("Izzet Charm", "")); + cubeCards.add(new DraftCube.CardIdentity("Izzet Signet", "")); + cubeCards.add(new DraftCube.CardIdentity("Jace Beleren", "")); + cubeCards.add(new DraftCube.CardIdentity("Jace, Architect of Thought", "")); + cubeCards.add(new DraftCube.CardIdentity("Jace, Vryn's Prodigy", "")); + cubeCards.add(new DraftCube.CardIdentity("Jace, the Mind Sculptor", "")); + cubeCards.add(new DraftCube.CardIdentity("Jackal Pup", "")); + cubeCards.add(new DraftCube.CardIdentity("Joraga Treespeaker", "")); + cubeCards.add(new DraftCube.CardIdentity("Kalitas, Traitor of Ghet", "")); + cubeCards.add(new DraftCube.CardIdentity("Karakas", "")); + cubeCards.add(new DraftCube.CardIdentity("Kargan Dragonlord", "")); + cubeCards.add(new DraftCube.CardIdentity("Karn Liberated", "")); + cubeCards.add(new DraftCube.CardIdentity("Kiki-Jiki, Mirror Breaker", "")); + cubeCards.add(new DraftCube.CardIdentity("Kitchen Finks", "")); + cubeCards.add(new DraftCube.CardIdentity("Knight of the White Orchid", "")); + cubeCards.add(new DraftCube.CardIdentity("Kolaghan's Command", "")); + cubeCards.add(new DraftCube.CardIdentity("Koth of the Hammer", "")); + cubeCards.add(new DraftCube.CardIdentity("Kozilek, Butcher of Truth", "")); + cubeCards.add(new DraftCube.CardIdentity("Kuldotha Forgemaster", "")); + cubeCards.add(new DraftCube.CardIdentity("Kytheon, Hero of Akros", "")); + cubeCards.add(new DraftCube.CardIdentity("Land Tax", "")); + cubeCards.add(new DraftCube.CardIdentity("Lavaclaw Reaches", "")); + cubeCards.add(new DraftCube.CardIdentity("Leonin Relic-Warder", "")); + cubeCards.add(new DraftCube.CardIdentity("Leovold, Emissary of Trest", "")); + cubeCards.add(new DraftCube.CardIdentity("Leyline of Sanctity", "")); + cubeCards.add(new DraftCube.CardIdentity("Library of Alexandria", "")); + cubeCards.add(new DraftCube.CardIdentity("Lifebane Zombie", "")); + cubeCards.add(new DraftCube.CardIdentity("Lightning Bolt", "")); + cubeCards.add(new DraftCube.CardIdentity("Lightning Greaves", "")); + cubeCards.add(new DraftCube.CardIdentity("Lightning Helix", "")); + cubeCards.add(new DraftCube.CardIdentity("Lightning Mauler", "")); + cubeCards.add(new DraftCube.CardIdentity("Lightning Strike", "")); + cubeCards.add(new DraftCube.CardIdentity("Liliana of the Veil", "")); + cubeCards.add(new DraftCube.CardIdentity("Liliana, Death's Majesty", "")); + cubeCards.add(new DraftCube.CardIdentity("Lingering Souls", "")); + cubeCards.add(new DraftCube.CardIdentity("Linvala, Keeper of Silence", "")); + cubeCards.add(new DraftCube.CardIdentity("Linvala, the Preserver", "")); + cubeCards.add(new DraftCube.CardIdentity("Lion's Eye Diamond", "")); + cubeCards.add(new DraftCube.CardIdentity("Living Death", "")); + cubeCards.add(new DraftCube.CardIdentity("Llanowar Elves", "")); + cubeCards.add(new DraftCube.CardIdentity("Lodestone Golem", "")); + cubeCards.add(new DraftCube.CardIdentity("Looter il-Kor", "")); + cubeCards.add(new DraftCube.CardIdentity("Lotus Bloom", "")); + cubeCards.add(new DraftCube.CardIdentity("Lotus Cobra", "")); + cubeCards.add(new DraftCube.CardIdentity("Lumbering Falls", "")); + cubeCards.add(new DraftCube.CardIdentity("Maelstrom Pulse", "")); + cubeCards.add(new DraftCube.CardIdentity("Magma Jet", "")); + cubeCards.add(new DraftCube.CardIdentity("Magus of the Moon", "")); + cubeCards.add(new DraftCube.CardIdentity("Magus of the Wheel", "")); + cubeCards.add(new DraftCube.CardIdentity("Magus of the Will", "")); + cubeCards.add(new DraftCube.CardIdentity("Makeshift Mannequin", "")); + cubeCards.add(new DraftCube.CardIdentity("Mana Confluence", "")); + cubeCards.add(new DraftCube.CardIdentity("Mana Crypt", "")); + cubeCards.add(new DraftCube.CardIdentity("Mana Drain", "")); + cubeCards.add(new DraftCube.CardIdentity("Mana Leak", "")); + cubeCards.add(new DraftCube.CardIdentity("Mana Tithe", "")); + cubeCards.add(new DraftCube.CardIdentity("Mana Vault", "")); + cubeCards.add(new DraftCube.CardIdentity("Managorger Hydra", "")); + cubeCards.add(new DraftCube.CardIdentity("Manglehorn", "")); + cubeCards.add(new DraftCube.CardIdentity("Manic Vandal", "")); + cubeCards.add(new DraftCube.CardIdentity("Mardu Woe-Reaper", "")); + cubeCards.add(new DraftCube.CardIdentity("Marsh Flats", "")); + cubeCards.add(new DraftCube.CardIdentity("Massacre Wurm", "")); + cubeCards.add(new DraftCube.CardIdentity("Master of the Wild Hunt", "")); + cubeCards.add(new DraftCube.CardIdentity("Maze of Ith", "")); + cubeCards.add(new DraftCube.CardIdentity("Memory Jar", "")); + cubeCards.add(new DraftCube.CardIdentity("Mental Misstep", "")); + cubeCards.add(new DraftCube.CardIdentity("Mesmeric Fiend", "")); + cubeCards.add(new DraftCube.CardIdentity("Metalworker", "")); + cubeCards.add(new DraftCube.CardIdentity("Mind Twist", "")); + cubeCards.add(new DraftCube.CardIdentity("Mind's Desire", "")); + cubeCards.add(new DraftCube.CardIdentity("Mindslaver", "")); + cubeCards.add(new DraftCube.CardIdentity("Mirari's Wake", "")); + cubeCards.add(new DraftCube.CardIdentity("Mirran Crusader", "")); + cubeCards.add(new DraftCube.CardIdentity("Mishra's Factory", "")); + cubeCards.add(new DraftCube.CardIdentity("Mishra's Workshop", "")); + cubeCards.add(new DraftCube.CardIdentity("Misty Rainforest", "")); + cubeCards.add(new DraftCube.CardIdentity("Mizzium Mortars", "")); + cubeCards.add(new DraftCube.CardIdentity("Moat", "")); + cubeCards.add(new DraftCube.CardIdentity("Monastery Mentor", "")); + cubeCards.add(new DraftCube.CardIdentity("Monastery Swiftspear", "")); + cubeCards.add(new DraftCube.CardIdentity("Mother of Runes", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Diamond", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Emerald", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Jet", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Pearl", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Ruby", "")); + cubeCards.add(new DraftCube.CardIdentity("Mox Sapphire", "")); + cubeCards.add(new DraftCube.CardIdentity("Mulldrifter", "")); + cubeCards.add(new DraftCube.CardIdentity("Murderous Cut", "")); + cubeCards.add(new DraftCube.CardIdentity("Mutavault", "")); + cubeCards.add(new DraftCube.CardIdentity("Myr Battlesphere", "")); + cubeCards.add(new DraftCube.CardIdentity("Mystic Confluence", "")); + cubeCards.add(new DraftCube.CardIdentity("Mystic Snake", "")); + cubeCards.add(new DraftCube.CardIdentity("Mystical Tutor", "")); + cubeCards.add(new DraftCube.CardIdentity("Nahiri, the Harbinger", "")); + cubeCards.add(new DraftCube.CardIdentity("Natural Order", "")); + cubeCards.add(new DraftCube.CardIdentity("Nature's Claim", "")); + cubeCards.add(new DraftCube.CardIdentity("Necromancy", "")); + cubeCards.add(new DraftCube.CardIdentity("Necropotence", "")); + cubeCards.add(new DraftCube.CardIdentity("Needle Spires", "")); + cubeCards.add(new DraftCube.CardIdentity("Nekrataal", "")); + cubeCards.add(new DraftCube.CardIdentity("Nevinyrral's Disk", "")); + cubeCards.add(new DraftCube.CardIdentity("Nezumi Graverobber", "")); + cubeCards.add(new DraftCube.CardIdentity("Nezumi Shortfang", "")); + cubeCards.add(new DraftCube.CardIdentity("Nicol Bolas, Planeswalker", "")); + cubeCards.add(new DraftCube.CardIdentity("Nissa, Worldwaker", "")); + cubeCards.add(new DraftCube.CardIdentity("Noble Hierarch", "")); + cubeCards.add(new DraftCube.CardIdentity("Nykthos, Shrine to Nyx", "")); + cubeCards.add(new DraftCube.CardIdentity("Oath of Druids", "")); + cubeCards.add(new DraftCube.CardIdentity("Oath of Nissa", "")); + cubeCards.add(new DraftCube.CardIdentity("Oblivion Ring", "")); + cubeCards.add(new DraftCube.CardIdentity("Olivia Voldaren", "")); + cubeCards.add(new DraftCube.CardIdentity("Oona's Prowler", "")); + cubeCards.add(new DraftCube.CardIdentity("Ophiomancer", "")); + cubeCards.add(new DraftCube.CardIdentity("Opposition", "")); + cubeCards.add(new DraftCube.CardIdentity("Oracle of Mul Daya", "")); + cubeCards.add(new DraftCube.CardIdentity("Orzhov Signet", "")); + cubeCards.add(new DraftCube.CardIdentity("Overgrown Tomb", "")); + cubeCards.add(new DraftCube.CardIdentity("Pack Rat", "")); + cubeCards.add(new DraftCube.CardIdentity("Painful Truths", "")); + cubeCards.add(new DraftCube.CardIdentity("Palinchron", "")); + cubeCards.add(new DraftCube.CardIdentity("Parallax Wave", "")); + cubeCards.add(new DraftCube.CardIdentity("Path to Exile", "")); + cubeCards.add(new DraftCube.CardIdentity("Pentad Prism", "")); + cubeCards.add(new DraftCube.CardIdentity("Pernicious Deed", "")); + cubeCards.add(new DraftCube.CardIdentity("Pestermite", "")); + cubeCards.add(new DraftCube.CardIdentity("Phantasmal Image", "")); + cubeCards.add(new DraftCube.CardIdentity("Phyrexian Metamorph", "")); + cubeCards.add(new DraftCube.CardIdentity("Phyrexian Revoker", "")); + cubeCards.add(new DraftCube.CardIdentity("Pithing Needle", "")); + cubeCards.add(new DraftCube.CardIdentity("Plateau", "")); + cubeCards.add(new DraftCube.CardIdentity("Polluted Delta", "")); + cubeCards.add(new DraftCube.CardIdentity("Polukranos, World Eater", "")); + cubeCards.add(new DraftCube.CardIdentity("Ponder", "")); + cubeCards.add(new DraftCube.CardIdentity("Porcelain Legionnaire", "")); + cubeCards.add(new DraftCube.CardIdentity("Preordain", "")); + cubeCards.add(new DraftCube.CardIdentity("Primal Command", "")); + cubeCards.add(new DraftCube.CardIdentity("Primeval Titan", "")); + cubeCards.add(new DraftCube.CardIdentity("Progenitus", "")); + cubeCards.add(new DraftCube.CardIdentity("Putrid Imp", "")); + cubeCards.add(new DraftCube.CardIdentity("Qasali Pridemage", "")); + cubeCards.add(new DraftCube.CardIdentity("Raging Ravine", "")); + cubeCards.add(new DraftCube.CardIdentity("Rakdos Signet", "")); + cubeCards.add(new DraftCube.CardIdentity("Rakdos's Return", "")); + cubeCards.add(new DraftCube.CardIdentity("Ral Zarek", "")); + cubeCards.add(new DraftCube.CardIdentity("Ravages of War", "")); + cubeCards.add(new DraftCube.CardIdentity("Razorverge Thicket", "")); + cubeCards.add(new DraftCube.CardIdentity("Reanimate", "")); + cubeCards.add(new DraftCube.CardIdentity("Reckless Bushwhacker", "")); + cubeCards.add(new DraftCube.CardIdentity("Reclamation Sage", "")); + cubeCards.add(new DraftCube.CardIdentity("Recruiter of the Guard", "")); + cubeCards.add(new DraftCube.CardIdentity("Recurring Nightmare", "")); + cubeCards.add(new DraftCube.CardIdentity("Reflector Mage", "")); + cubeCards.add(new DraftCube.CardIdentity("Regrowth", "")); + cubeCards.add(new DraftCube.CardIdentity("Remand", "")); + cubeCards.add(new DraftCube.CardIdentity("Repeal", "")); + cubeCards.add(new DraftCube.CardIdentity("Restoration Angel", "")); + cubeCards.add(new DraftCube.CardIdentity("Reveillark", "")); + cubeCards.add(new DraftCube.CardIdentity("Rift Bolt", "")); + cubeCards.add(new DraftCube.CardIdentity("Riftwing Cloudskate", "")); + cubeCards.add(new DraftCube.CardIdentity("Rishadan Port", "")); + cubeCards.add(new DraftCube.CardIdentity("Rishkar, Peema Renegade", "")); + cubeCards.add(new DraftCube.CardIdentity("Rofellos, Llanowar Emissary", "")); + cubeCards.add(new DraftCube.CardIdentity("Sacred Foundry", "")); + cubeCards.add(new DraftCube.CardIdentity("Sakura-Tribe Elder", "")); + cubeCards.add(new DraftCube.CardIdentity("Savannah", "")); + cubeCards.add(new DraftCube.CardIdentity("Scalding Tarn", "")); + cubeCards.add(new DraftCube.CardIdentity("Scavenging Ooze", "")); + cubeCards.add(new DraftCube.CardIdentity("Scroll Rack", "")); + cubeCards.add(new DraftCube.CardIdentity("Scrubland", "")); + cubeCards.add(new DraftCube.CardIdentity("Seachrome Coast", "")); + cubeCards.add(new DraftCube.CardIdentity("Search for Tomorrow", "")); + cubeCards.add(new DraftCube.CardIdentity("Searing Blaze", "")); + cubeCards.add(new DraftCube.CardIdentity("Searing Spear", "")); + cubeCards.add(new DraftCube.CardIdentity("Seasons Past", "")); + cubeCards.add(new DraftCube.CardIdentity("Seeker of the Way", "")); + cubeCards.add(new DraftCube.CardIdentity("Seething Song", "")); + cubeCards.add(new DraftCube.CardIdentity("Selesnya Signet", "")); + cubeCards.add(new DraftCube.CardIdentity("Selfless Spirit", "")); + cubeCards.add(new DraftCube.CardIdentity("Sensei's Divining Top", "")); + cubeCards.add(new DraftCube.CardIdentity("Shadowmage Infiltrator", "")); + cubeCards.add(new DraftCube.CardIdentity("Shallow Grave", "")); + cubeCards.add(new DraftCube.CardIdentity("Shambling Vent", "")); + cubeCards.add(new DraftCube.CardIdentity("Shardless Agent", "")); + cubeCards.add(new DraftCube.CardIdentity("Shelldock Isle", "")); + cubeCards.add(new DraftCube.CardIdentity("Sheoldred, Whispering One", "")); + cubeCards.add(new DraftCube.CardIdentity("Show and Tell", "")); + cubeCards.add(new DraftCube.CardIdentity("Shriekmaw", "")); + cubeCards.add(new DraftCube.CardIdentity("Shrine of Burning Rage", "")); + cubeCards.add(new DraftCube.CardIdentity("Sidisi, Undead Vizier", "")); + cubeCards.add(new DraftCube.CardIdentity("Siege-Gang Commander", "")); + cubeCards.add(new DraftCube.CardIdentity("Silverblade Paladin", "")); + cubeCards.add(new DraftCube.CardIdentity("Simic Signet", "")); + cubeCards.add(new DraftCube.CardIdentity("Skinrender", "")); + cubeCards.add(new DraftCube.CardIdentity("Skullclamp", "")); + cubeCards.add(new DraftCube.CardIdentity("Smash to Smithereens", "")); + cubeCards.add(new DraftCube.CardIdentity("Smokestack", "")); + cubeCards.add(new DraftCube.CardIdentity("Smuggler's Copter", "")); + cubeCards.add(new DraftCube.CardIdentity("Snapcaster Mage", "")); + cubeCards.add(new DraftCube.CardIdentity("Sneak Attack", "")); + cubeCards.add(new DraftCube.CardIdentity("Sol Ring", "")); + cubeCards.add(new DraftCube.CardIdentity("Soldier of the Pantheon", "")); + cubeCards.add(new DraftCube.CardIdentity("Solemn Simulacrum", "")); + cubeCards.add(new DraftCube.CardIdentity("Song of the Dryads", "")); + cubeCards.add(new DraftCube.CardIdentity("Soulfire Grand Master", "")); + cubeCards.add(new DraftCube.CardIdentity("Sower of Temptation", "")); + cubeCards.add(new DraftCube.CardIdentity("Spear of Heliod", "")); + cubeCards.add(new DraftCube.CardIdentity("Spectral Procession", "")); + cubeCards.add(new DraftCube.CardIdentity("Spell Pierce", "")); + cubeCards.add(new DraftCube.CardIdentity("Spellskite", "")); + cubeCards.add(new DraftCube.CardIdentity("Sphinx of the Steel Wind", "")); + cubeCards.add(new DraftCube.CardIdentity("Sphinx's Revelation", "")); + cubeCards.add(new DraftCube.CardIdentity("Spirebluff Canal", "")); + cubeCards.add(new DraftCube.CardIdentity("Spirit of the Labyrinth", "")); + cubeCards.add(new DraftCube.CardIdentity("Splinter Twin", "")); + cubeCards.add(new DraftCube.CardIdentity("Steam Vents", "")); + cubeCards.add(new DraftCube.CardIdentity("Stirring Wildwood", "")); + cubeCards.add(new DraftCube.CardIdentity("Stomping Ground", "")); + cubeCards.add(new DraftCube.CardIdentity("Stoneforge Mystic", "")); + cubeCards.add(new DraftCube.CardIdentity("Stormbreath Dragon", "")); + cubeCards.add(new DraftCube.CardIdentity("Strip Mine", "")); + cubeCards.add(new DraftCube.CardIdentity("Student of Warfare", "")); + cubeCards.add(new DraftCube.CardIdentity("Sulfuric Vortex", "")); + cubeCards.add(new DraftCube.CardIdentity("Sun Titan", "")); + cubeCards.add(new DraftCube.CardIdentity("Sundering Titan", "")); + cubeCards.add(new DraftCube.CardIdentity("Supreme Verdict", "")); + cubeCards.add(new DraftCube.CardIdentity("Survival of the Fittest", "")); + cubeCards.add(new DraftCube.CardIdentity("Sweltering Suns", "")); + cubeCards.add(new DraftCube.CardIdentity("Sword of Body and Mind", "")); + cubeCards.add(new DraftCube.CardIdentity("Sword of Feast and Famine", "")); + cubeCards.add(new DraftCube.CardIdentity("Sword of Fire and Ice", "")); + cubeCards.add(new DraftCube.CardIdentity("Sword of Light and Shadow", "")); + cubeCards.add(new DraftCube.CardIdentity("Sword of War and Peace", "")); + cubeCards.add(new DraftCube.CardIdentity("Swords to Plowshares", "")); + cubeCards.add(new DraftCube.CardIdentity("Sylvan Caryatid", "")); + cubeCards.add(new DraftCube.CardIdentity("Sylvan Library", "")); + cubeCards.add(new DraftCube.CardIdentity("Taiga", "")); + cubeCards.add(new DraftCube.CardIdentity("Tamiyo, the Moon Sage", "")); + cubeCards.add(new DraftCube.CardIdentity("Tangle Wire", "")); + cubeCards.add(new DraftCube.CardIdentity("Tarmogoyf", "")); + cubeCards.add(new DraftCube.CardIdentity("Tasigur, the Golden Fang", "")); + cubeCards.add(new DraftCube.CardIdentity("Temple Garden", "")); + cubeCards.add(new DraftCube.CardIdentity("Tendrils of Agony", "")); + cubeCards.add(new DraftCube.CardIdentity("Terastodon", "")); + cubeCards.add(new DraftCube.CardIdentity("Terminate", "")); + cubeCards.add(new DraftCube.CardIdentity("Tezzeret the Seeker", "")); + cubeCards.add(new DraftCube.CardIdentity("Tezzeret, Agent of Bolas", "")); + cubeCards.add(new DraftCube.CardIdentity("Thada Adel, Acquisitor", "")); + cubeCards.add(new DraftCube.CardIdentity("Thalia, Guardian of Thraben", "")); + cubeCards.add(new DraftCube.CardIdentity("The Abyss", "")); + cubeCards.add(new DraftCube.CardIdentity("Thirst for Knowledge", "")); + cubeCards.add(new DraftCube.CardIdentity("Thoughtseize", "")); + cubeCards.add(new DraftCube.CardIdentity("Thragtusk", "")); + cubeCards.add(new DraftCube.CardIdentity("Thran Dynamo", "")); + cubeCards.add(new DraftCube.CardIdentity("Through the Breach", "")); + cubeCards.add(new DraftCube.CardIdentity("Thrun, the Last Troll", "")); + cubeCards.add(new DraftCube.CardIdentity("Thundermaw Hellkite", "")); + cubeCards.add(new DraftCube.CardIdentity("Tidehollow Sculler", "")); + cubeCards.add(new DraftCube.CardIdentity("Time Spiral", "")); + cubeCards.add(new DraftCube.CardIdentity("Time Walk", "")); + cubeCards.add(new DraftCube.CardIdentity("Timely Reinforcements", "")); + cubeCards.add(new DraftCube.CardIdentity("Timetwister", "")); + cubeCards.add(new DraftCube.CardIdentity("Tinker", "")); + cubeCards.add(new DraftCube.CardIdentity("Tolarian Academy", "")); + cubeCards.add(new DraftCube.CardIdentity("Tooth and Nail", "")); + cubeCards.add(new DraftCube.CardIdentity("Torrential Gearhulk", "")); + cubeCards.add(new DraftCube.CardIdentity("Toxic Deluge", "")); + cubeCards.add(new DraftCube.CardIdentity("Traverse the Ulvenwald", "")); + cubeCards.add(new DraftCube.CardIdentity("Treachery", "")); + cubeCards.add(new DraftCube.CardIdentity("Treasure Cruise", "")); + cubeCards.add(new DraftCube.CardIdentity("Trinket Mage", "")); + cubeCards.add(new DraftCube.CardIdentity("Tropical Island", "")); + cubeCards.add(new DraftCube.CardIdentity("True-Name Nemesis", "")); + cubeCards.add(new DraftCube.CardIdentity("Trygon Predator", "")); + cubeCards.add(new DraftCube.CardIdentity("Tundra", "")); + cubeCards.add(new DraftCube.CardIdentity("Turnabout", "")); + cubeCards.add(new DraftCube.CardIdentity("Ugin, the Spirit Dragon", "")); + cubeCards.add(new DraftCube.CardIdentity("Ulamog, the Ceaseless Hunger", "")); + cubeCards.add(new DraftCube.CardIdentity("Ulamog, the Infinite Gyre", "")); + cubeCards.add(new DraftCube.CardIdentity("Ultimate Price", "")); + cubeCards.add(new DraftCube.CardIdentity("Umezawa's Jitte", "")); + cubeCards.add(new DraftCube.CardIdentity("Unburial Rites", "")); + cubeCards.add(new DraftCube.CardIdentity("Underground Sea", "")); + cubeCards.add(new DraftCube.CardIdentity("Unexpectedly Absent", "")); + cubeCards.add(new DraftCube.CardIdentity("Upheaval", "")); + cubeCards.add(new DraftCube.CardIdentity("Urborg, Tomb of Yawgmoth", "")); + cubeCards.add(new DraftCube.CardIdentity("Vampire Nighthawk", "")); + cubeCards.add(new DraftCube.CardIdentity("Vampiric Tutor", "")); + cubeCards.add(new DraftCube.CardIdentity("Vedalken Shackles", "")); + cubeCards.add(new DraftCube.CardIdentity("Vendilion Clique", "")); + cubeCards.add(new DraftCube.CardIdentity("Venser, Shaper Savant", "")); + cubeCards.add(new DraftCube.CardIdentity("Verdant Catacombs", "")); + cubeCards.add(new DraftCube.CardIdentity("Verdurous Gearhulk", "")); + cubeCards.add(new DraftCube.CardIdentity("Vindicate", "")); + cubeCards.add(new DraftCube.CardIdentity("Voice of Resurgence", "")); + cubeCards.add(new DraftCube.CardIdentity("Volcanic Island", "")); + cubeCards.add(new DraftCube.CardIdentity("Vryn Wingmare", "")); + cubeCards.add(new DraftCube.CardIdentity("Walking Ballista", "")); + cubeCards.add(new DraftCube.CardIdentity("Wall of Blossoms", "")); + cubeCards.add(new DraftCube.CardIdentity("Wall of Omens", "")); + cubeCards.add(new DraftCube.CardIdentity("Wall of Roots", "")); + cubeCards.add(new DraftCube.CardIdentity("Wandering Fumarole", "")); + cubeCards.add(new DraftCube.CardIdentity("Wasteland", "")); + cubeCards.add(new DraftCube.CardIdentity("Watery Grave", "")); + cubeCards.add(new DraftCube.CardIdentity("Westvale Abbey", "")); + cubeCards.add(new DraftCube.CardIdentity("Wheel of Fortune", "")); + cubeCards.add(new DraftCube.CardIdentity("Wildfire", "")); + cubeCards.add(new DraftCube.CardIdentity("Windswept Heath", "")); + cubeCards.add(new DraftCube.CardIdentity("Winter Orb", "")); + cubeCards.add(new DraftCube.CardIdentity("Wooded Foothills", "")); + cubeCards.add(new DraftCube.CardIdentity("Woodfall Primus", "")); + cubeCards.add(new DraftCube.CardIdentity("Worn Powerstone", "")); + cubeCards.add(new DraftCube.CardIdentity("Wrath of God", "")); + cubeCards.add(new DraftCube.CardIdentity("Wurmcoil Engine", "")); + cubeCards.add(new DraftCube.CardIdentity("Xenagos, the Reveler", "")); + cubeCards.add(new DraftCube.CardIdentity("Yavimaya Elder", "")); + cubeCards.add(new DraftCube.CardIdentity("Yawgmoth's Bargain", "")); + cubeCards.add(new DraftCube.CardIdentity("Yawgmoth's Will", "")); + cubeCards.add(new DraftCube.CardIdentity("Young Pyromancer", "")); + cubeCards.add(new DraftCube.CardIdentity("Zealous Conscripts", "")); + cubeCards.add(new DraftCube.CardIdentity("Zurgo Bellstriker", "")); + } +} diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml index 0584d76866..961d37b516 100644 --- a/Mage.Server/config/config.xml +++ b/Mage.Server/config/config.xml @@ -122,6 +122,7 @@ + diff --git a/Mage.Server/release/config/config.xml b/Mage.Server/release/config/config.xml index 90442aa45f..f89a6b4b57 100644 --- a/Mage.Server/release/config/config.xml +++ b/Mage.Server/release/config/config.xml @@ -119,6 +119,7 @@ + diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index befe0a4a20..6d8afdaa14 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31630,15 +31630,18 @@ Adorned Pouncer|Hour of Devastation|2|R|{1}{W}|Creature - Cat|1|1|Double strike$ Angel of the God-Pharaoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2}| Adorned Pouncer|Hour of Devastation|2|R|{1}{W}|Creature - Cat|1|1|Double strike$Eternalize {3}{W}{W} ({3}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Cat with no mana cost. Eternalize only as a sorcery.)| Angel of Condemnation|Hour of Devastation|3|R|{2}{W}{W}|Creature - Angel|3|3|Flying, vigilance${2}{W}, {T}: Exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step.${2}{W}, {T}, Exert Angel of Condemnation: Exile another target creature until Angel of Condemnation leaves the battlefield. (An exerted creature won't untap during your next untap step.)| +Angel of the God-Pharoah|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2}| Desert's Hold|Hour of Devastation|8|U|{2}{W}|Enchantment - Aura|||Enchant creature$When Desert's Hold enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life.$Enchanted creature can't attack or block, and its activated abilities can't be activated.| Djeru, With Eyes Open|Hour of Devastation|10|R|{3}{W}{W}|Legendary Creature - Human Warrior|4|3|Vigilance$When Djeru, With Eyes Open enters the battlefield, you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library.$If a source would deal damage to a planeswalker you control, prevent 1 of that damage.| Gideon's Defeat|Hour of Devastation|13|U|{W}|Instant|||Exile target white creature that's attacking or blocking. If it was a Gideon planeswalker, you gain 5 life.| Hour of Revelation|Hour of Devastation|15|R|{3}{W}{W}{W}|Sorcery|||Hour of Revelation costs {3} less to cast if there are ten or more nonland permanents on the battlefield.$Destroy all nonland permanents.| Oketra's Last Mercy|Hour of Devastation|18|R|{1}{W}{W}|Sorcery|||Your life total becomes your starting life total. Lands you control don't untap during your next untap phase| +Overwhelming Splendor|Hour of Devastation|19|M|{6}{W}{W}|Enchantment - Aura Curse|||Enchant player$Creatures enchanted player controls lose all abilities and have base power and toughness 1/1.$Enchanted player can't activate abilities that aren't mana abilities or loyalty abilities.| Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counters.$Counters can't be put on artifacts, creatures, enchantments, or lands.| Steadfast Sentinel|Hour of Devastation|24|C|{3}{W}|Creature - Human Cleric|2|3|Vigilance$Eternalize {4}{W}{W} ({4}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Cleric with no mana cost. Eternalize only as a sorcery.)| Steward of Solidarity|Hour of Devastation|25|U|{1}{W}|Creature - Human Warrior|2|2|{T}, Exert Steward of Solidarity: Create a 1/1 white Warrior creature token with vigilance. (An exerted creature won't untap during your next untap step.)| Vizier of the True|Hour of Devastation|28|U|{3}{W}|Creature - Human Cleric|3|2|You may exert Vizier of the True as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, tap target creature an opponent controls.| +Champion of Wits|Hour of Devastation|31|R|{2}{U}|Creature - Naga Wizard|2|1|When Champion of Wits enters the battlefield, you may draw cards equal to its power. If you do, discard two cards.$Eternalize {5}{U}{U}| Fraying Sanity|Hour of Devastation|35|R|{2}{U}|Enchantment - Aura Curse|||Enchant player$At the beginning of each end step, enchanted player puts the top X cards of his or her library into his or her graveyard, where X is the total number of cards put into his or her graveyard from anywhere this turn. | Jace's Defeat|Hour of Devastation|38|U|{1}{U}|Instant|||Counter target blue spell. If it was a Jace planeswalker spell, scry 2.| Nimble Obstructionist|Hour of Devastation|40|R|{2}{U}|Creature - Bird Wizard|3|1|Flash$Flying$Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.)$When you cycle Nimble Obstructionist, counter target activated or triggered ability you don't control.| @@ -31648,6 +31651,7 @@ Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counte Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| Accursed Horde|Hour of Devastation|56|U|{3}{B}|Creature - Zombie|3|3|{1}{B}: Target attacking Zombie gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.)| +Ammit Eternal|Hour of Devastation|57|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| @@ -31689,13 +31693,17 @@ River Hoopoe|Hour of Devastation|143|U|{G}{U}|Creature - Bird|1|3|Flying${3}{G}{ Samut, the Tested|Hour of Devastation|144|M|{2}{R}{G}|Planeswalker - Samut|4|+1: Up to one target creature gains double strike until end of turn.$-2: Samut, the Tested deals 2 damage divided as you choose among one or two target creatures and/or players.$-7: Search your library for up to two creature and/or planeswalker cards, put them onto the battlefield, then shuffle your library.| The Scarab God|Hour of Devastation|145|M|{3}{U}{B}|Legendary Creature - God|5|5|At the beginning of your upkeep, each opponent loses X life and you scry X, where X is the number of Zombies you control.${2}{U}{B}: Exile target creature card from a graveyard. Create a token that's a copy of it, except it's a 4/4 black Zombie.$When The Scarab God dies, return it to its owner's hand at the beginning of the next upkeep.| The Scorpion God|Hour of Devastation|146|M|{3}{B}{R}|Legendary Creature - God|6|5|Whenever a creature with a -1/-1 counter on it dies, draw a card.${1}{B}{R}: Put a -1/-1 counter on another target creature.$When The Scorpion God dies, return it to its owner's hand at the beginning of the next end step.| +Unraveling Mummy|Hour of Devastation|147|U|{1}{W}{B}|Creature - Zombie|2|3|{1}{W}: Target attacking Xombie gains lifelink until end of turn.${1}{B}: Target attacking Zombie gains deathtouch until end of turn.| Farm // Market|Hour of Devastation|148|U|{2}{W}|Instant|||Destroy target attacking or blocking creature.$Market {2}{U}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Draw two cards, then destroy two cards| Claim // Fame|Hour of Devastation|150|U|{B}|Sorcery|||Return target creature card with converted mana cost 2 or less from your graveyard to the battlefield.$Fame {1}{R}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Target creature gets +2/+0 and gains haste until end of turn.| Struggle // Survive|Hour of Devastation|151|U|{2}{R}|Instant|||Struggle deals damage to target creature equal to the number of lands you control.$Survive {1}{G}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Each player shuffles his or graveyard into his or her library.| +Appeal // Authority|Hour of Devastation|152|U|{G}|Sorcery|||Until end of turn, target creatures gains trample and gets +X/+X, where X is the number of creatures you control.$Authority {1}{W}$Sorcery$Aftermath$Tap up to two target creatures your opponents control. Creatures you control gain vigilance until end of turn.| Reason // Believe|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| Grind // Dust|Hour of Devastation|155|R|{1}{B}|Sorcery|||Put a -1/-1 counter on each of up to two target creatures.$Dust {3}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Exile any number of target creatures that have -1/-1 counters on them.| +Refuse // Cooperate|Hour of Devastation|156|R|{3}{R}|Instant|||Refuse deals damage to target spell's controller equal to that spell's converted mana cost.$Cooperate {2}{U}$Sorcery$Aftermath$Copy target instant or sorcery spell. You may choose new targets for the copy.| Driven // Despair|Hour of Devastation|157|R|{1}{G}|Sorcery|||Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."$Despair {1}{B}$Sorcery$Aftermath$Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."| Crook of Comdemnation|Hour of Devastation|159|U|{2}|Artifact|||{1}, {t}: Exile target card from a graveyard.${1}, Exile Crook of Condemnation: Exile all cards from all graveyards.| +God-Pharoah's Gift|Hour of Devastation|161|R|{7}|Artifact|||At the beginning of combat on your turn, you may exile a creature card from your graveyard. If you do, create a token that's copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn.| Mirage Mirror|Hour of Devastation|165|R|{3}|Artifact|||{2}: Mirage Mirror becomes a copy of target artifact, creature, enchantment, or land until end of turn.| Sunset Pyramid|Hour of Devastation|166|U|{2}|Artifact|||Sunset Pyramid enters the battlefield with three brick counters on it.${2}, {T}, Remove a brick counter from Sunset Pyramid: Draw a card.${2}, {T}: Scry 1.| Desert of the Fervent|Hour of Devastation|170|C||Land - Desert|||Desert of the Fervent enters the battlefield tapped.${T}: Add {R} to your mana pool.$Cycling {1}{R} ({1}{R}, Discard this card: Draw a card.)| @@ -31720,31 +31728,33 @@ Wasp of the Bitter End|Hour of Devastation|206|U|{1}{B}|Creature - Insect Horror Zealot of the God-Pharaoh|Hour of Devastation|207|C|{3}{R}|Creature - Minotaur Archer|4|3|{4}{R}: Zealot of the God-Pharaoh deals 2 damage to target opponent.| Visage of Bolas|Hour of Devastation|208|R|{4}|Artifact|||When Visage of Bolas enters the battlefield, you may search your library and/or graveyard for a card named Nicol Bolas, the Deceiver, reveal it, and put it into your hand. If you search your library this way, shuffle it.${t}: Add {U}, {B}, or {R} to your mana pool.| Cinder Barrens|Hour of Devastation|209|C||Land|||Cinder Barrens enters the battlefield tapped.${t}: Add {B} or {R} to your mana pool.| -Desert of the Fervent|Hour of Devastation|170|C||Land - Desert|||Desert of the Fervent enters the battlefield tapped.${T}: Add {R} to your mana pool.$Cycling {1}{R}| -Desert of the Glorified|Hour of Devastation|171|C||Land - Desert|||Desert of the Glorified enters the battlefield tapped.${T}: Add {B} to your mana pool.$Cycling {1}{B}| -Desert of the Indomitable|Hour of Devastation|172|C||Land - Desert|||Desert of the Indomitable enters the battlefield tapped.${T}: Add {G} to your mana pool.$Cycling {1}{G}| -Desert of the Mindful|Hour of Devastation|173|C||Land - Desert|||Desert of the Mindful enters the battlefield tapped.${T}: Add {U} to your mana pool.$Cycling {1}{U}| -Desert of the True|Hour of Devastation|174|C||Land - Desert|||Desert of the True enters the battlefield tapped.${T}: Add {W} to your mana pool.$Cycling {1}{W}| -Nissa, Genesis Mage|Hour of Devastation|200|M|{5}{G}{G}|Planeswalker - Nissa|||+2: Untap up to two target creatures and up to two target lands.$-3: Target creature gets +5/+5 until end of turn.$-10: Look at the top ten cards of your library. You may put any number of creature and/or land cards from among them onto the battlefield. Put the rest on the bottom of your library in a random order.| -Nicol Bolas, the Deceiver|Hour of Devastation|205|M|{5}{U}{B}{R}|Planeswalker - Bolas|||+3: Each opponent loses 3 life unless that player sacrifices a nonland permanent or discards a card.$-3: Destroy target creature. Draw a card.$-11: Nicol Bolas, the Deceiver deals 7 damage to each opponent. You draw seven cards.| -Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counters.$Counters can't be put on artifacts, creatures, enchantments or lands.| Arcane Adaptation|Ixalan|44|R|{2}{U}|Enchantment|||As Arcane Adaptation enters the battlefield, choose a creature type.$Creatures you control are the chosen type in addition to their other types. The same is true for creature spells you control and creature cards you own that aren't on the battlefield.| Ashes of the Abhorrent|Ixalan|???|R|{1}{W}|Enchantment|||Players can't cast spells from graveyards or activate abilities from graveyards.$Whenever a creature dies, you gain 1 life.| Bishop of Rebirth|Ixalan|???|R|Creature - Vampire Cleric|3|4|Vigilance$Whenever Bishop of Rebirth attacks, you may return target creature card with converted mana cost 3 or less from your graveyard to the battlefield.| Goring Ceratops|Ixalan|???|R|Creature - Dinosaur|?|?|Double strike$Whenever Goring Ceratops attacks, other creatures you control gain double strike until end of turn.| -Prince of the Wakening Sun|Ixalan|???|R|{W}|Creature - Human Cleric|1|1|At the beginning of your upkeep, you may reveal a Dinosaur card from your hand. If you do, you gain 2 life.${3}{W}{W}, Sacrifice Prince of the Wakening Sun: Search your library for a Dinosaur card, reveal it, and put it into your hand. Shuffle your library.| +Kimalla's Sunwing|Ixalan|???|R|{2}{W}|Creature - Dinosaur|2|3|Flying$Creatures your opponents control enter the battlefield tapped.| +Mynea Frian, Dark Apostle|Ixalan|???|R|{2}{W}|Legendary Creature - Vampire Cleric|2|2|Whenever one or more nontoken Vampires you control attack, create a 1/1 white Vampire creature token with lifelink.| +Priest of the Wandering Sun|Ixalan|???|R|{W}|Creature - Human Cleric|1|1|At the beginning of your upkeep, you may reveal a Dinosaur card from your hand. If you do, you gain 2 life.${3}{W}{W}, Sacrifice Priest of the Wandering Sun: Search your library for a Dinosaur card, reveal it, and put it into your hand, then shuffle your library.| +Sanguine Sacrament|Ixalan|???|R|{X}{W}{W}|Instant|||You gain twice X life. Put Sanguine Sacrament on the bottom of its owner's library.| Settle the Wreckage|Ixalan|???|R|{2}{W}{W}|Instant|||Exile all attacking creatures target player controls. That player may search his or her library for that many basic land cards, put that many cards onto the battlefield tapped, then shuffle his or her library.| -Sunbird's Invocation|Ixalan|???|R|{3}{R}|Enchantment|||Whenever you cast a spell from your hand, reveal the top X cards of your library, where X is that spell's converted mana cost. You may cast a card revealed this way with converted mana cost X or less without paying its mana cost. Put the rest on the bottom of your library in a random order.| +Tocaf's Honor Guard|Ixalan|???|R|{1}{W}|Creature - Human Soldier|1|2|Creatures entering the battlefield don't cause abilities to trigger.| Daring Saboteur|Ixalan|???|R|{1}{U}|Creature - Human Pirate|?|?|{2}{U}: Daring Saboteur can't be blocked this turn.$Whenever Daring Saboteur deals combat damage to a player, you may draw a card. If you do, discard a card.| Dreamcaller Siren|Ixalan|???|R|{3}{U}{U}|Creature - Siren Pirate|3|3|Flash$Flying$Dreamcaller Siren can only block creatures with flying.$When Dreamcaller Siren enters the battlefield, if you control another Pirate, tap up to two nonland permanents.| +Evaporating Melody|Ixalan|???|R|{X}{U}{U}|Instant|||Gain control of target creature with converted mana cost X.| Kopaka, Warden of Waves|Ixalan|???|R|{1}{U}{U}|Legendary Creature - Merfolk Wizard|2|2|Spells your opponents cast that target a Merfolk you control cost {1} more to cast.$Abilities your opponent activate that target a Merfolk you control cost {1} more to activate.| River's Rebuke|Ixalan|???|R|{4}{U}{U}|Sorcery|||Return all nonland permanents target player controls to their owner's hand.| Blackhearted Paladin|Ixalan|???|R|{1}{B}|Creature - Vampire Knight|1|1|Flash$Blackhearted Paladin enters the battlefield with a +1/+1 counter on it for each creature that die this turn.| +Deadeye Tracker|Ixalan|???|R|{B}|Creature - Human Pirate|1|1|{1}{B}, {T}: Exile two target cards from an opponent's graveyard. Deadeye Tracker explores.| Fathom Fleet Captain|Ixalan|???|R|{1}{B}|Creature - Human Pirate|2|1|Menace$Whenever Fathom Fleet Captain attacks, if you control another Pirate, you may pay {1}. If you do, creature a 2/2 black Pirate creature token with menace.| +Revel in Riches|Ixalan|???|R|{4}{B}|Enchantment|||Whenever a creature an opponent controls dies, create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color to your mana pool."| Vraska's Contempt|Ixalan|???|R|{2}{B}{B}|Instant|||Exile target creature or planeswalker. You gain 2 life.| +Aegriah's Marauders|Ixalan|???|R|{3}{R}{R}|Creature - Human Pirate|4|4|If a creature you control would deal damage to a permanent or player, it deals double that damage to that permanent or player instead.| Burning Sun's Avatar|Ixalan|???|R|{3}{R}{R}{R}|Creature - Dinosaur Avatar|6|6|When Burning Sun's Avatar enters the battlefield, it deals 3 damage to target opponent and 3 damage to up to one target creature.| +Star of Extinction|Ixalan|???|M|{5}{R}{R}|Sorcery|||Destroy target land. Star of Extinction deals 20 damage to each creature and each planeswalker.| Captain Lannery Storm|Ixalan|176|R|{2}{R}|Legendary Creature - Human Pirate|2|2|Haste$Whenever Captain Lannery Storm attacks, create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color to your mana pool."$Whenever you sacrifice a Treasure, Captain Lannery Storm gets +1/+0 until end of turn.| Rowdy Crew|Ixalan|???|M|{2}{R}{R}|Creature - Human Pirate|3|3|Trample$When Rowdy Crew enters the battlefield, draw three cards, then discard two cards at random. If two cards that share a card type are discard this way, put two +1/+1 counters on Rowdy Crew.| +Sunbird's Invocation|Ixalan|???|R|{3}{R}|Enchantment|||Whenever you cast a spell from your hand, reveal the top X cards of your library, where X is that spell's converted mana cost. You may cast a card revealed this way with converted mana cost X or less without paying its mana cost. Put the rest on the bottom of your library in a random order.| +Tilomalli's Skinshifter|Ixalan|???|R|{2}{R}|Creature - Human Shaman|0|3|Whenever Tilomalli's Skinshifter attacks, it becomes a copyt of another target nonlegendary attacking creature until end of turn.| Carnage Tyrant|Ixalan|???|M|{4}{G}{G}|Creature - Dinosaur|7|6|Carnage Tyrant can't be countered.$Trample, hexproof| Deathgorge Scavenger|Ixalan|???|R|???|Creature - Dinosaur|3|2|Whenever Deathgorge Scavenger enters the battlefield or attacks, you may exile target card from a graveyard. If a creature card is exiled this way, you may gain 2 life. If a noncreature card is exiled this way, Deathgorge Scavenger gets +1/+1 until end of turn.| Deeproot Champion|Ixalan|???|R|{1}{G}|Creature - Merfolk Shaman|1|1|Whenever you cast a noncreature spell, put a +1/+1 counter on Deeproot Champion.| From 5131aedebe62dc23a5f3d48c368b6cbbf972b3f3 Mon Sep 17 00:00:00 2001 From: lilhomie96 Date: Mon, 26 Jun 2017 22:05:56 -0500 Subject: [PATCH 027/160] eighth edition box set --- EighthEditionBox.java | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 EighthEditionBox.java diff --git a/EighthEditionBox.java b/EighthEditionBox.java new file mode 100644 index 0000000000..af0061d733 --- /dev/null +++ b/EighthEditionBox.java @@ -0,0 +1,29 @@ +package mage.sets; + +import java.util.Date; +import mage.cards.CardGraphicInfo; +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +public class EighthEditionBox extends ExpansionSet { + + private static final EighthEditionBox instance = new EighthEditionBox(); + + public static EighthEditionBox getInstance() { + return instance; + } + + + private EighthEditionBox() { + super("EighthEditionBox","8EB", ExpansionSet.buildDate(2003, 7, 28), SetType.CORE); + this.hasBoosters=false; + cards.add(new SetCardInfo("Eager Cadet", 1, Rarity.COMMON, mage.cards.e.EagerCadet.class)); + cards.add(new SetCardInfo("Vengeance", 2, Rarity.UNCOMMON, mage.cards.v.Vengeance.class)); + cards.add(new SetCardInfo("Giant Octopus", 3, Rarity.COMMON, mage.cards.g.GiantOctopus.class)); + cards.add(new SetCardInfo("Sea Eagle", 4, Rarity.COMMON, mage.cards.s.SeaEagle.class)); + cards.add(new SetCardInfo("Vizzerdrix", 5, Rarity.RARE, mage.cards.v.Vizzerdrix.class)); + cards.add(new SetCardInfo("Enormous Baloth", 6, Rarity.UNCOMMON, mage.cards.e.EnormousBaloth.class)); + cards.add(new SetCardInfo("Silverback Ape", 7, Rarity.UNCOMMON, mage.cards.s.SilverbackApe.class)); + } +} \ No newline at end of file From f8465d367113368168de33fc19a14c3d9b623e7e Mon Sep 17 00:00:00 2001 From: lilhomie96 Date: Mon, 26 Jun 2017 22:10:29 -0500 Subject: [PATCH 028/160] eighth edition box set 7 cards --- Mage.Sets/src/mage/sets/EighthEditionBox.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/EighthEditionBox.java diff --git a/Mage.Sets/src/mage/sets/EighthEditionBox.java b/Mage.Sets/src/mage/sets/EighthEditionBox.java new file mode 100644 index 0000000000..af0061d733 --- /dev/null +++ b/Mage.Sets/src/mage/sets/EighthEditionBox.java @@ -0,0 +1,29 @@ +package mage.sets; + +import java.util.Date; +import mage.cards.CardGraphicInfo; +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +public class EighthEditionBox extends ExpansionSet { + + private static final EighthEditionBox instance = new EighthEditionBox(); + + public static EighthEditionBox getInstance() { + return instance; + } + + + private EighthEditionBox() { + super("EighthEditionBox","8EB", ExpansionSet.buildDate(2003, 7, 28), SetType.CORE); + this.hasBoosters=false; + cards.add(new SetCardInfo("Eager Cadet", 1, Rarity.COMMON, mage.cards.e.EagerCadet.class)); + cards.add(new SetCardInfo("Vengeance", 2, Rarity.UNCOMMON, mage.cards.v.Vengeance.class)); + cards.add(new SetCardInfo("Giant Octopus", 3, Rarity.COMMON, mage.cards.g.GiantOctopus.class)); + cards.add(new SetCardInfo("Sea Eagle", 4, Rarity.COMMON, mage.cards.s.SeaEagle.class)); + cards.add(new SetCardInfo("Vizzerdrix", 5, Rarity.RARE, mage.cards.v.Vizzerdrix.class)); + cards.add(new SetCardInfo("Enormous Baloth", 6, Rarity.UNCOMMON, mage.cards.e.EnormousBaloth.class)); + cards.add(new SetCardInfo("Silverback Ape", 7, Rarity.UNCOMMON, mage.cards.s.SilverbackApe.class)); + } +} \ No newline at end of file From 0a9ac8663d98b6dc617537c9628b06bc188c20fb Mon Sep 17 00:00:00 2001 From: lilhomie96 Date: Mon, 26 Jun 2017 22:17:42 -0500 Subject: [PATCH 029/160] Delete EighthEditionBox.java --- EighthEditionBox.java | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 EighthEditionBox.java diff --git a/EighthEditionBox.java b/EighthEditionBox.java deleted file mode 100644 index af0061d733..0000000000 --- a/EighthEditionBox.java +++ /dev/null @@ -1,29 +0,0 @@ -package mage.sets; - -import java.util.Date; -import mage.cards.CardGraphicInfo; -import mage.cards.ExpansionSet; -import mage.constants.Rarity; -import mage.constants.SetType; - -public class EighthEditionBox extends ExpansionSet { - - private static final EighthEditionBox instance = new EighthEditionBox(); - - public static EighthEditionBox getInstance() { - return instance; - } - - - private EighthEditionBox() { - super("EighthEditionBox","8EB", ExpansionSet.buildDate(2003, 7, 28), SetType.CORE); - this.hasBoosters=false; - cards.add(new SetCardInfo("Eager Cadet", 1, Rarity.COMMON, mage.cards.e.EagerCadet.class)); - cards.add(new SetCardInfo("Vengeance", 2, Rarity.UNCOMMON, mage.cards.v.Vengeance.class)); - cards.add(new SetCardInfo("Giant Octopus", 3, Rarity.COMMON, mage.cards.g.GiantOctopus.class)); - cards.add(new SetCardInfo("Sea Eagle", 4, Rarity.COMMON, mage.cards.s.SeaEagle.class)); - cards.add(new SetCardInfo("Vizzerdrix", 5, Rarity.RARE, mage.cards.v.Vizzerdrix.class)); - cards.add(new SetCardInfo("Enormous Baloth", 6, Rarity.UNCOMMON, mage.cards.e.EnormousBaloth.class)); - cards.add(new SetCardInfo("Silverback Ape", 7, Rarity.UNCOMMON, mage.cards.s.SilverbackApe.class)); - } -} \ No newline at end of file From ff5ce7fea060bb45c388ccac092249ee8a71d542 Mon Sep 17 00:00:00 2001 From: lilhomie96 Date: Mon, 26 Jun 2017 22:42:26 -0500 Subject: [PATCH 030/160] Delete EighthEditionBox.java --- Mage.Sets/src/mage/sets/EighthEditionBox.java | 29 ------------------- 1 file changed, 29 deletions(-) delete mode 100644 Mage.Sets/src/mage/sets/EighthEditionBox.java diff --git a/Mage.Sets/src/mage/sets/EighthEditionBox.java b/Mage.Sets/src/mage/sets/EighthEditionBox.java deleted file mode 100644 index af0061d733..0000000000 --- a/Mage.Sets/src/mage/sets/EighthEditionBox.java +++ /dev/null @@ -1,29 +0,0 @@ -package mage.sets; - -import java.util.Date; -import mage.cards.CardGraphicInfo; -import mage.cards.ExpansionSet; -import mage.constants.Rarity; -import mage.constants.SetType; - -public class EighthEditionBox extends ExpansionSet { - - private static final EighthEditionBox instance = new EighthEditionBox(); - - public static EighthEditionBox getInstance() { - return instance; - } - - - private EighthEditionBox() { - super("EighthEditionBox","8EB", ExpansionSet.buildDate(2003, 7, 28), SetType.CORE); - this.hasBoosters=false; - cards.add(new SetCardInfo("Eager Cadet", 1, Rarity.COMMON, mage.cards.e.EagerCadet.class)); - cards.add(new SetCardInfo("Vengeance", 2, Rarity.UNCOMMON, mage.cards.v.Vengeance.class)); - cards.add(new SetCardInfo("Giant Octopus", 3, Rarity.COMMON, mage.cards.g.GiantOctopus.class)); - cards.add(new SetCardInfo("Sea Eagle", 4, Rarity.COMMON, mage.cards.s.SeaEagle.class)); - cards.add(new SetCardInfo("Vizzerdrix", 5, Rarity.RARE, mage.cards.v.Vizzerdrix.class)); - cards.add(new SetCardInfo("Enormous Baloth", 6, Rarity.UNCOMMON, mage.cards.e.EnormousBaloth.class)); - cards.add(new SetCardInfo("Silverback Ape", 7, Rarity.UNCOMMON, mage.cards.s.SilverbackApe.class)); - } -} \ No newline at end of file From de530f3025d1d1ee09ae4b7a9c21ecd9c1aae69c Mon Sep 17 00:00:00 2001 From: lilhomie96 Date: Tue, 27 Jun 2017 01:33:59 -0500 Subject: [PATCH 031/160] eighth edition box set --- Mage.Sets/src/mage/sets/EighthEditionBox.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/EighthEditionBox.java diff --git a/Mage.Sets/src/mage/sets/EighthEditionBox.java b/Mage.Sets/src/mage/sets/EighthEditionBox.java new file mode 100644 index 0000000000..33741caef6 --- /dev/null +++ b/Mage.Sets/src/mage/sets/EighthEditionBox.java @@ -0,0 +1,28 @@ +package mage.sets; + +import mage.cards.CardGraphicInfo; +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +public class EighthEditionBox extends ExpansionSet { + + private static final EighthEditionBox instance = new EighthEditionBox(); + + public static EighthEditionBox getInstance() { + return instance; + } + + + private EighthEditionBox() { + super("EighthEditionBox","8EB", ExpansionSet.buildDate(2003, 7, 28), SetType.CORE); + this.hasBoosters=false; + cards.add(new SetCardInfo("Eager Cadet", 1, Rarity.COMMON, mage.cards.e.EagerCadet.class)); + cards.add(new SetCardInfo("Vengeance", 2, Rarity.UNCOMMON, mage.cards.v.Vengeance.class)); + cards.add(new SetCardInfo("Giant Octopus", 3, Rarity.COMMON, mage.cards.g.GiantOctopus.class)); + cards.add(new SetCardInfo("Sea Eagle", 4, Rarity.COMMON, mage.cards.s.SeaEagle.class)); + cards.add(new SetCardInfo("Vizzerdrix", 5, Rarity.RARE, mage.cards.v.Vizzerdrix.class)); + cards.add(new SetCardInfo("Enormous Baloth", 6, Rarity.UNCOMMON, mage.cards.e.EnormousBaloth.class)); + cards.add(new SetCardInfo("Silverback Ape", 7, Rarity.UNCOMMON, mage.cards.s.SilverbackApe.class)); + } +} \ No newline at end of file From 34bde8a61a454e64b5c46c9fcd06b6dc7655884c Mon Sep 17 00:00:00 2001 From: spjspj Date: Tue, 27 Jun 2017 20:21:33 +1000 Subject: [PATCH 032/160] Implement full art basics (HOU) --- Mage.Sets/src/mage/sets/HourOfDevastation.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 08abe4a001..e627bdb6c8 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -80,15 +80,19 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); + cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); + cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); + cards.add(new SetCardInfo("Plains", 185, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); @@ -97,6 +101,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("The Scarab God", 145, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); @@ -123,4 +128,5 @@ public class HourOfDevastation extends ExpansionSet { return new ArrayList<>(savedSpecialLand); } -} \ No newline at end of file +} + From d95bd421fcb28d973859cc0fca276fb8d39a0b43 Mon Sep 17 00:00:00 2001 From: spjspj Date: Tue, 27 Jun 2017 21:16:27 +1000 Subject: [PATCH 033/160] Implement The Locust God (HOU) --- Mage.Sets/src/mage/cards/t/TheLocustGod.java | 119 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 4 +- .../token/TheLocustGodInsectToken.java | 53 ++++++++ 3 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/t/TheLocustGod.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/TheLocustGodInsectToken.java diff --git a/Mage.Sets/src/mage/cards/t/TheLocustGod.java b/Mage.Sets/src/mage/cards/t/TheLocustGod.java new file mode 100644 index 0000000000..ff79a2f249 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TheLocustGod.java @@ -0,0 +1,119 @@ +/* + * 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.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.common.DrawCardControllerTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DrawDiscardControllerEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.token.TheLocustGodInsectToken; + +/** + * + * @author spjspj + */ +public class TheLocustGod extends CardImpl { + + public TheLocustGod(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}{R}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add("God"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever you draw a card, create a 1/1 blue and red Insect creature token with flying and haste. + this.addAbility(new DrawCardControllerTriggeredAbility(new CreateTokenEffect(new TheLocustGodInsectToken(), 1, true, false), false)); + + // {2}{U}{R}: Draw a card, then discard a card. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawDiscardControllerEffect(1, 1, false), new ManaCostsImpl("{2}{U}{R}")); + this.addAbility(ability); + + // When The Locust God dies, return it to its owner's hand at the beginning of the next end step. + this.addAbility(new DiesTriggeredAbility(new TheLocustGodEffect())); + } + + public TheLocustGod(final TheLocustGod card) { + super(card); + } + + @Override + public TheLocustGod copy() { + return new TheLocustGod(this); + } +} + +class TheLocustGodEffect extends OneShotEffect { + + private static final String effectText = "return it to its owner's hand at the beginning of the next end step."; + + TheLocustGodEffect() { + super(Outcome.Benefit); + staticText = effectText; + } + + TheLocustGodEffect(TheLocustGodEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + // Create delayed triggered ability + Effect effect = new ReturnToHandSourceEffect(false, true); + effect.setText(staticText); + DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); + game.addDelayedTriggeredAbility(delayedAbility, source); + return true; + } + + @Override + public TheLocustGodEffect copy() { + return new TheLocustGodEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index e627bdb6c8..a07302ec3b 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -29,7 +29,9 @@ package mage.sets; import java.util.ArrayList; import java.util.List; +import mage.cards.CardGraphicInfo; import mage.cards.ExpansionSet; +import mage.cards.FrameStyle; import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; @@ -102,6 +104,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("The Locust God", 139, Rarity.MYTHIC, mage.cards.t.TheLocustGod.class)); cards.add(new SetCardInfo("The Scarab God", 145, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); @@ -129,4 +132,3 @@ public class HourOfDevastation extends ExpansionSet { return new ArrayList<>(savedSpecialLand); } } - diff --git a/Mage/src/main/java/mage/game/permanent/token/TheLocustGodInsectToken.java b/Mage/src/main/java/mage/game/permanent/token/TheLocustGodInsectToken.java new file mode 100644 index 0000000000..11cb737036 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/TheLocustGodInsectToken.java @@ -0,0 +1,53 @@ +/* +* 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.constants.CardType; +import mage.MageInt; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.FlyingAbility; + +/** + * + * @author spjspj + */ +public class TheLocustGodInsectToken extends Token { + + public TheLocustGodInsectToken() { + super("Insect", "1/1 blue and red Insect creature token with flying and haste"); + setOriginalExpansionSetCode("HOU"); + cardType.add(CardType.CREATURE); + color.setBlue(true); + color.setRed(true); + subtype.add("Insect"); + power = new MageInt(1); + toughness = new MageInt(1); + addAbility(FlyingAbility.getInstance()); + addAbility(HasteAbility.getInstance()); + } +} From 6d35de829f7f0b34f00d6ada430b4815c1ca2077 Mon Sep 17 00:00:00 2001 From: spjspj Date: Tue, 27 Jun 2017 21:32:14 +1000 Subject: [PATCH 034/160] Implement The Locust God (HOU) --- Mage.Client/src/main/resources/card-pictures-tok.txt | 1 + Mage.Sets/src/mage/cards/t/TheLocustGod.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index f2dd483382..4792bd5df1 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -595,6 +595,7 @@ |Generate|TOK:HOP|Pentavite|||PentaviteToken| |Generate|TOK:HOP|Pest|||PestToken| |Generate|TOK:HOP|Saproling|||SaprolingToken| +|Generate|TOK:HOU|Insect|||TheLocustGodInsectToken| |Generate|TOK:ICE|Caribou|||CaribouToken| |Generate|TOK:INV|Bird|||OwlToken| |Generate|TOK:INV|Elephant|||ElephantToken| diff --git a/Mage.Sets/src/mage/cards/t/TheLocustGod.java b/Mage.Sets/src/mage/cards/t/TheLocustGod.java index ff79a2f249..fc8f375fb8 100644 --- a/Mage.Sets/src/mage/cards/t/TheLocustGod.java +++ b/Mage.Sets/src/mage/cards/t/TheLocustGod.java @@ -69,7 +69,7 @@ public class TheLocustGod extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever you draw a card, create a 1/1 blue and red Insect creature token with flying and haste. - this.addAbility(new DrawCardControllerTriggeredAbility(new CreateTokenEffect(new TheLocustGodInsectToken(), 1, true, false), false)); + this.addAbility(new DrawCardControllerTriggeredAbility(new CreateTokenEffect(new TheLocustGodInsectToken(), 1, false, false), false)); // {2}{U}{R}: Draw a card, then discard a card. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawDiscardControllerEffect(1, 1, false), new ManaCostsImpl("{2}{U}{R}")); From e6ce3e168a1fc1fe9fd7ff6247812e15434314fe Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 27 Jun 2017 17:29:51 +0200 Subject: [PATCH 035/160] [HOU] Added 4 white cards and some fixes. --- .../src/mage/cards/d/DjeruWithEyesOpen.java | 126 +++++++++ Mage.Sets/src/mage/cards/g/GideonsDefeat.java | 109 ++++++++ .../src/mage/cards/h/HourOfRevelation.java | 7 +- .../src/mage/cards/o/OketrasLastMercy.java | 96 +++++++ .../mage/cards/o/OverwhelmingSplendor.java | 195 ++++++++++++++ Mage.Sets/src/mage/cards/s/Solemnity.java | 6 +- .../src/mage/cards/t/TormentOfHailfire.java | 2 +- .../src/mage/sets/HourOfDevastation.java | 254 +++++++++--------- 8 files changed, 664 insertions(+), 131 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/d/DjeruWithEyesOpen.java create mode 100644 Mage.Sets/src/mage/cards/g/GideonsDefeat.java create mode 100644 Mage.Sets/src/mage/cards/o/OketrasLastMercy.java create mode 100644 Mage.Sets/src/mage/cards/o/OverwhelmingSplendor.java diff --git a/Mage.Sets/src/mage/cards/d/DjeruWithEyesOpen.java b/Mage.Sets/src/mage/cards/d/DjeruWithEyesOpen.java new file mode 100644 index 0000000000..a481f280c4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DjeruWithEyesOpen.java @@ -0,0 +1,126 @@ +/* + * 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.d; + +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.Effect; +import mage.abilities.effects.PreventionEffectImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author LevelX2 + */ +public class DjeruWithEyesOpen extends CardImpl { + + private static final FilterCard filter = new FilterCard("planeswalker card"); + + static { + filter.add(new CardTypePredicate(CardType.PLANESWALKER)); + } + + public DjeruWithEyesOpen(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add("Human"); + this.subtype.add("Warrior"); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // When Djeru, With Eyes Open enters the battlefield, you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library. + Effect effect = new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0, 1, filter), true, true); + effect.setText("you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library"); + this.addAbility(new EntersBattlefieldTriggeredAbility(effect, true)); + + // If a source would deal damage to a planeswalker you control, prevent 1 of that damage. + this.addAbility(new SimpleStaticAbility(Zone.COMMAND, new DjeruWithEyesOpenPreventEffect())); + } + + public DjeruWithEyesOpen(final DjeruWithEyesOpen card) { + super(card); + } + + @Override + public DjeruWithEyesOpen copy() { + return new DjeruWithEyesOpen(this); + } +} + +class DjeruWithEyesOpenPreventEffect extends PreventionEffectImpl { + + public DjeruWithEyesOpenPreventEffect() { + super(Duration.EndOfGame, 1, false, false); + this.staticText = "If a source would deal damage to a planeswalker you control, prevent 1 of that damage"; + } + + public DjeruWithEyesOpenPreventEffect(DjeruWithEyesOpenPreventEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getType() == GameEvent.EventType.DAMAGE_PLANESWALKER) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null && permanent.getControllerId().equals(source.getControllerId())) { + return super.applies(event, source, game); + } + } + return false; + } + + @Override + public DjeruWithEyesOpenPreventEffect copy() { + return new DjeruWithEyesOpenPreventEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GideonsDefeat.java b/Mage.Sets/src/mage/cards/g/GideonsDefeat.java new file mode 100644 index 0000000000..2c9cb0c89d --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GideonsDefeat.java @@ -0,0 +1,109 @@ +/* + * 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.g; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterAttackingOrBlockingCreature; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class GideonsDefeat extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterAttackingOrBlockingCreature("white creature that's attacking or blocking"); + + static { + filter.add(new ColorPredicate(ObjectColor.WHITE)); + } + + public GideonsDefeat(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}"); + + // Exile target white creature that's attacking or blocking. If it was a Gideon planeswalker, you gain 5 life. + this.getSpellAbility().addEffect(new GideonsDefeatEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public GideonsDefeat(final GideonsDefeat card) { + super(card); + } + + @Override + public GideonsDefeat copy() { + return new GideonsDefeat(this); + } +} + +class GideonsDefeatEffect extends OneShotEffect { + + public GideonsDefeatEffect() { + super(Outcome.Exile); + staticText = "Exile target white creature that's attacking or blocking. If it was a Gideon planeswalker, you gain 5 life"; + } + + public GideonsDefeatEffect(final GideonsDefeatEffect effect) { + super(effect); + } + + @Override + public GideonsDefeatEffect copy() { + return new GideonsDefeatEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (controller != null && permanent != null) { + controller.moveCards(permanent, Zone.EXILED, source, game); + game.applyEffects(); + if (permanent.isPlaneswalker() && permanent.hasSubtype(SubType.GIDEON.getDescription(), game)) { + controller.gainLife(5, game); + } + return true; + } + return false; + } + +} diff --git a/Mage.Sets/src/mage/cards/h/HourOfRevelation.java b/Mage.Sets/src/mage/cards/h/HourOfRevelation.java index 948fba9ff0..bdbed620df 100644 --- a/Mage.Sets/src/mage/cards/h/HourOfRevelation.java +++ b/Mage.Sets/src/mage/cards/h/HourOfRevelation.java @@ -49,8 +49,11 @@ public class HourOfRevelation extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{W}{W}{W}"); // Hour of Revelation costs {3} less to cast if there are ten or more nonland permanents on the battlefield. - this.addAbility(new SimpleStaticAbility(Zone.STACK, - new SpellCostReductionSourceEffect(3, new PermanentsOnTheBattlefieldCondition(new FilterNonlandPermanent(), ComparisonType.MORE_THAN, 9)))); + SimpleStaticAbility ability = new SimpleStaticAbility(Zone.STACK, + new SpellCostReductionSourceEffect(3, new PermanentsOnTheBattlefieldCondition( + new FilterNonlandPermanent("there are ten or more nonland permanents on the battlefield"), ComparisonType.MORE_THAN, 9))); + ability.setRuleAtTheTop(true); + this.addAbility(ability); // Destroy all nonland permanents. this.getSpellAbility().addEffect(new DestroyAllEffect(new FilterNonlandPermanent("nonland permanents"))); diff --git a/Mage.Sets/src/mage/cards/o/OketrasLastMercy.java b/Mage.Sets/src/mage/cards/o/OketrasLastMercy.java new file mode 100644 index 0000000000..ef5122a8e0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OketrasLastMercy.java @@ -0,0 +1,96 @@ +/* + * 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.o; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledLandPermanent; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class OketrasLastMercy extends CardImpl { + + public OketrasLastMercy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{W}{W}"); + + // Your life total becomes your starting life total. Lands you control don't untap during your next untap phase. + this.getSpellAbility().addEffect(new OketrasLastMercyEffect()); + this.getSpellAbility().addEffect(new DontUntapInControllersUntapStepAllEffect( + Duration.UntilYourNextTurn, TargetController.YOU, new FilterControlledLandPermanent("Lands you control")) + .setText("Lands you control don't untap during your next untap phase")); + } + + public OketrasLastMercy(final OketrasLastMercy card) { + super(card); + } + + @Override + public OketrasLastMercy copy() { + return new OketrasLastMercy(this); + } +} + +class OketrasLastMercyEffect extends OneShotEffect { + + public OketrasLastMercyEffect() { + super(Outcome.Benefit); + staticText = "Your life total becomes your starting life total"; + } + + public OketrasLastMercyEffect(final OketrasLastMercyEffect effect) { + super(effect); + } + + @Override + public OketrasLastMercyEffect copy() { + return new OketrasLastMercyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + controller.setLife(game.getLife(), game); + return true; + } + return false; + } + +} diff --git a/Mage.Sets/src/mage/cards/o/OverwhelmingSplendor.java b/Mage.Sets/src/mage/cards/o/OverwhelmingSplendor.java new file mode 100644 index 0000000000..84baa650f3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OverwhelmingSplendor.java @@ -0,0 +1,195 @@ +/* + * 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.o; + +import java.util.Optional; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import static mage.constants.Layer.AbilityAddingRemovingEffects_6; +import static mage.constants.Layer.PTChangingEffects_7; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPlayer; + +/** + * + * @author LevelX2 + */ +public class OverwhelmingSplendor extends CardImpl { + + public OverwhelmingSplendor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{6}{W}{W}"); + + this.subtype.add("Aura"); + this.subtype.add("Curse"); + + // Enchant player + TargetPlayer auraTarget = new TargetPlayer(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.LoseAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Creatures enchanted player controls lose all abilities and have base power and toughness 1/1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new OverwhelmingSplendorLoseAbilitiesEffect())); + + // Enchanted player can't activate abilities that aren't mana abilities or loyalty abilities. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new OverwhelmingSplendorCantActivateEffect())); + } + + public OverwhelmingSplendor(final OverwhelmingSplendor card) { + super(card); + } + + @Override + public OverwhelmingSplendor copy() { + return new OverwhelmingSplendor(this); + } +} + +class OverwhelmingSplendorLoseAbilitiesEffect extends ContinuousEffectImpl { + + public OverwhelmingSplendorLoseAbilitiesEffect() { + super(Duration.WhileOnBattlefield, Outcome.LoseAbility); + staticText = "Creatures enchanted player controls lose all abilities and have base power and toughness 1/1"; + } + + public OverwhelmingSplendorLoseAbilitiesEffect(final OverwhelmingSplendorLoseAbilitiesEffect effect) { + super(effect); + } + + @Override + public OverwhelmingSplendorLoseAbilitiesEffect copy() { + return new OverwhelmingSplendorLoseAbilitiesEffect(this); + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + Permanent enchantment = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (enchantment == null) { + return false; + } + Player player = game.getPlayer(enchantment.getAttachedTo()); + if (player != null) { + for (Permanent permanent : game.getState().getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), player.getId(), game)) { + switch (layer) { + case AbilityAddingRemovingEffects_6: + permanent.removeAllAbilities(source.getSourceId(), game); + break; + case PTChangingEffects_7: + if (sublayer == SubLayer.SetPT_7b) { + permanent.getPower().setValue(1); + permanent.getToughness().setValue(1); + } + } + } + return true; + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.PTChangingEffects_7; + } + +} + +class OverwhelmingSplendorCantActivateEffect extends ContinuousRuleModifyingEffectImpl { + + public OverwhelmingSplendorCantActivateEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + staticText = "Enchanted player can't activate abilities that aren't mana abilities or loyalty abilities"; + } + + public OverwhelmingSplendorCantActivateEffect(final OverwhelmingSplendorCantActivateEffect effect) { + super(effect); + } + + @Override + public OverwhelmingSplendorCantActivateEffect copy() { + return new OverwhelmingSplendorCantActivateEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public String getInfoMessage(Ability source, GameEvent event, Game game) { + MageObject mageObject = game.getObject(source.getSourceId()); + if (mageObject != null) { + return "You can't activate abilities that aren't mana abilities or loyalty abilities (" + mageObject.getIdName() + ")."; + } + return null; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { + Permanent enchantment = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (enchantment == null) { + return false; + } + if (event.getPlayerId().equals(enchantment.getAttachedTo())) { + Optional ability = game.getAbility(event.getTargetId(), event.getSourceId()); + if (ability.isPresent() + && !(ability.get() instanceof ActivatedManaAbilityImpl) + && !(ability.get() instanceof LoyaltyAbility)) { + return true; + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/s/Solemnity.java b/Mage.Sets/src/mage/cards/s/Solemnity.java index 701edbe7b2..bb410cc4d2 100644 --- a/Mage.Sets/src/mage/cards/s/Solemnity.java +++ b/Mage.Sets/src/mage/cards/s/Solemnity.java @@ -59,7 +59,7 @@ public class Solemnity extends CardImpl { // Players can't get counters. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SolemnityEffect())); - // Counters can't be put on artifacts, creatures, enchantments or lands. + // Counters can't be put on artifacts, creatures, enchantments, or lands. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SolemnityEffect2())); } @@ -108,7 +108,7 @@ class SolemnityEffect extends ReplacementEffectImpl { class SolemnityEffect2 extends ReplacementEffectImpl { - private static final FilterPermanent filter = new FilterPermanent("artifacts, creatures, enchantments or lands"); + private static final FilterPermanent filter = new FilterPermanent(); static { filter.add(Predicates.or( @@ -120,7 +120,7 @@ class SolemnityEffect2 extends ReplacementEffectImpl { public SolemnityEffect2() { super(Duration.WhileOnBattlefield, Outcome.Benefit); - staticText = "Counters can't be put on artifacts, creatures, enchantments or lands"; + staticText = "Counters can't be put on artifacts, creatures, enchantments, or lands"; } public SolemnityEffect2(final SolemnityEffect2 effect) { diff --git a/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java b/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java index 9a57e37f45..504c68648c 100644 --- a/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java +++ b/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java @@ -85,7 +85,7 @@ class TormentOfHailfireEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - int repeat = source.getManaCosts().getX(); + int repeat = source.getManaCostsToPay().getX(); for (int i = 0; i < repeat; i++) { for (UUID opponentId : game.getOpponents(source.getControllerId())) { Player opponent = game.getPlayer(opponentId); diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 08abe4a001..14b9ce88c1 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -1,126 +1,130 @@ -/* -* 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.sets; - -import java.util.ArrayList; -import java.util.List; -import mage.cards.ExpansionSet; -import mage.cards.repository.CardCriteria; -import mage.cards.repository.CardInfo; -import mage.cards.repository.CardRepository; -import mage.constants.Rarity; -import mage.constants.SetType; - -/** - * @author fireshoes - */ -public class HourOfDevastation extends ExpansionSet { - - private static final HourOfDevastation instance = new HourOfDevastation(); - - public static HourOfDevastation getInstance() { - return instance; - } - - protected final List savedSpecialLand = new ArrayList<>(); - - private HourOfDevastation() { - super("Hour of Devastation", "HOU", ExpansionSet.buildDate(2017, 7, 14), SetType.EXPANSION); - this.blockName = "Amonkhet"; - this.parentSet = Amonkhet.getInstance(); - this.hasBasicLands = true; - this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; - this.numBoosterUncommon = 3; - this.numBoosterRare = 1; - this.ratioBoosterMythic = 8; - this.ratioBoosterSpecialLand = 144; - - cards.add(new SetCardInfo("Abrade", 83, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); - cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); - cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); - cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); - cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); - cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); - cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); - cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); - cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); - cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); - cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); - cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); - cards.add(new SetCardInfo("Desert of the Indomitable", 172, Rarity.COMMON, mage.cards.d.DesertOfTheIndomitable.class)); - cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); - cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); - cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); - cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); - cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); - cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); - cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); - cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); - cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); - cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); - cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); - cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); - cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); - cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); - cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); - cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); - cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); - cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); - cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); - cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); - cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); - cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); - cards.add(new SetCardInfo("The Scarab God", 145, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); - cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); - cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); - cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); - cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); - cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); - cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); - cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); - cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); - cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); - cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); - cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); - } - - @Override - public List getSpecialLand() { - if (savedSpecialLand.isEmpty()) { - CardCriteria criteria = new CardCriteria(); - criteria.setCodes("MPS-AKH"); - criteria.minCardNumber(31); - criteria.maxCardNumber(54); - savedSpecialLand.addAll(CardRepository.instance.findCards(criteria)); - } - - return new ArrayList<>(savedSpecialLand); - } +/* +* 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.sets; + +import java.util.ArrayList; +import java.util.List; +import mage.cards.ExpansionSet; +import mage.cards.repository.CardCriteria; +import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * @author fireshoes + */ +public class HourOfDevastation extends ExpansionSet { + + private static final HourOfDevastation instance = new HourOfDevastation(); + + public static HourOfDevastation getInstance() { + return instance; + } + + protected final List savedSpecialLand = new ArrayList<>(); + + private HourOfDevastation() { + super("Hour of Devastation", "HOU", ExpansionSet.buildDate(2017, 7, 14), SetType.EXPANSION); + this.blockName = "Amonkhet"; + this.parentSet = Amonkhet.getInstance(); + this.hasBasicLands = true; + this.hasBoosters = true; + this.numBoosterLands = 1; + this.numBoosterCommon = 10; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 8; + this.ratioBoosterSpecialLand = 144; + + cards.add(new SetCardInfo("Abrade", 83, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); + cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); + cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); + cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); + cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); + cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); + cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); + cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); + cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); + cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); + cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); + cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); + cards.add(new SetCardInfo("Desert of the Indomitable", 172, Rarity.COMMON, mage.cards.d.DesertOfTheIndomitable.class)); + cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); + cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); + cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); + cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); + cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); + cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); + cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); + cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); + cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); + cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); + cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); + cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); + cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); + cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); + cards.add(new SetCardInfo("Oketra's Last Mercy", 18, Rarity.RARE, mage.cards.o.OketrasLastMercy.class)); + cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); + cards.add(new SetCardInfo("Overwhelming Splendor", 19, Rarity.MYTHIC, mage.cards.o.OverwhelmingSplendor.class)); + cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); + cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); + cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); + cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); + cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); + cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); + cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); + cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("The Scarab God", 145, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); + cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); + cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); + cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); + cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); + cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); + cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); + cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); + cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); + cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); + cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); + cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); + } + + @Override + public List getSpecialLand() { + if (savedSpecialLand.isEmpty()) { + CardCriteria criteria = new CardCriteria(); + criteria.setCodes("MPS-AKH"); + criteria.minCardNumber(31); + criteria.maxCardNumber(54); + savedSpecialLand.addAll(CardRepository.instance.findCards(criteria)); + } + + return new ArrayList<>(savedSpecialLand); + } } \ No newline at end of file From 235443c04d32913faa62aab966c4ebdf4424e539 Mon Sep 17 00:00:00 2001 From: igoudt Date: Tue, 27 Jun 2017 11:35:17 +0200 Subject: [PATCH 036/160] UT for issue 3542 --- Mage.Tests/pom.xml | 2 ++ .../cards/single/StinkdrinkerBanditTest.java | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/Mage.Tests/pom.xml b/Mage.Tests/pom.xml index 464c5a9346..3eff656896 100644 --- a/Mage.Tests/pom.xml +++ b/Mage.Tests/pom.xml @@ -13,6 +13,8 @@ jar Mage Tests + + ${project.groupId} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/StinkdrinkerBanditTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/StinkdrinkerBanditTest.java index 68acf3cdbe..2c505c9d44 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/StinkdrinkerBanditTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/StinkdrinkerBanditTest.java @@ -15,6 +15,8 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * @author escplan9 (Derek Monturo - dmontur1 at gmail dot com) */ public class StinkdrinkerBanditTest extends CardTestPlayerBase { + + private String stinkdrinker = "Stinkdrinker Bandit"; /** * Reported bug: Stinkdrinker Bandit is incorrectly giving the +2/+1 bonus even to Rogues that do get blocked. @@ -50,4 +52,20 @@ public class StinkdrinkerBanditTest extends CardTestPlayerBase { assertLife(playerA, 20); assertLife(playerB, 9); // Agent pumped to 5, Amphin pumped to 4, Sable stays at 2 power (11 damage) } + + @Test + public void stinkDrinkerPesterMite(){ + String pestermite = "Pestermite"; + addCard(Zone.BATTLEFIELD, playerA, stinkdrinker); + addCard(Zone.BATTLEFIELD, playerA, pestermite); + + attack(1, playerA, pestermite); + + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + + execute(); + + assertPowerToughness(playerA, pestermite, 4, 2); + assertPowerToughness(playerA, stinkdrinker, 2, 1); + } } From 130a1230522763ac15f2619df8b7282ef9b2a842 Mon Sep 17 00:00:00 2001 From: emerald000 Date: Tue, 27 Jun 2017 23:07:24 -0400 Subject: [PATCH 037/160] Remove useless parameter of ExertSourceCost. --- Mage.Sets/src/mage/cards/a/AngelOfCondemnation.java | 2 +- .../java/mage/abilities/costs/common/ExertSourceCost.java | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AngelOfCondemnation.java b/Mage.Sets/src/mage/cards/a/AngelOfCondemnation.java index 6280ccde3c..a67565ec12 100644 --- a/Mage.Sets/src/mage/cards/a/AngelOfCondemnation.java +++ b/Mage.Sets/src/mage/cards/a/AngelOfCondemnation.java @@ -91,7 +91,7 @@ public class AngelOfCondemnation extends CardImpl { effect.setText("Exile another target creature until {this} leaves the battlefield"); ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{2}{W}")); ability.addCost(new TapSourceCost()); - ability.addCost(new ExertSourceCost(ability)); + ability.addCost(new ExertSourceCost()); ability.addTarget(new TargetCreaturePermanent(filter)); ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility())); this.addAbility(ability); diff --git a/Mage/src/main/java/mage/abilities/costs/common/ExertSourceCost.java b/Mage/src/main/java/mage/abilities/costs/common/ExertSourceCost.java index 8503edb603..45c4961ad8 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/ExertSourceCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/ExertSourceCost.java @@ -46,16 +46,12 @@ import mage.target.targetpointer.FixedTarget; */ public class ExertSourceCost extends CostImpl { - private final Ability source; - - public ExertSourceCost(Ability source) { - this.source = source; + public ExertSourceCost() { this.text = "Exert {this}"; } public ExertSourceCost(ExertSourceCost cost) { super(cost); - this.source = cost.source; } @Override @@ -71,7 +67,7 @@ public class ExertSourceCost extends CostImpl { game.fireEvent(GameEvent.getEvent(EventType.BECOMES_EXERTED, permanent.getId(), permanent.getId(), permanent.getControllerId())); ContinuousEffect effect = new DontUntapInControllersNextUntapStepTargetEffect("", permanent.getControllerId()); effect.setTargetPointer(new FixedTarget(permanent, game)); - game.addEffect(effect, source); + game.addEffect(effect, ability); paid = true; } return paid; From 8d91cff617ce68ceb1add820e423084a440626a8 Mon Sep 17 00:00:00 2001 From: spjspj Date: Wed, 28 Jun 2017 18:41:09 +1000 Subject: [PATCH 038/160] Implement Avid Reclaimer (HOU) --- Mage.Sets/src/mage/cards/a/AvidReclaimer.java | 85 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 86 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AvidReclaimer.java diff --git a/Mage.Sets/src/mage/cards/a/AvidReclaimer.java b/Mage.Sets/src/mage/cards/a/AvidReclaimer.java new file mode 100644 index 0000000000..4c6636d984 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AvidReclaimer.java @@ -0,0 +1,85 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.mana.BlueManaAbility; +import mage.abilities.mana.GreenManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author spjspj + */ +public class AvidReclaimer extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent(); + + static { + filter.add(new CardTypePredicate(CardType.PLANESWALKER)); + filter.add(new SubtypePredicate(SubType.NISSA)); + } + + public AvidReclaimer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add("Human"); + this.subtype.add("Druid"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {T}: Add {G} or {U} to your mana pool. If you control a Nissa planeswalker, you gain 2 life. + Ability GreenManaAbility = new GreenManaAbility(); + GreenManaAbility.addEffect(new ConditionalOneShotEffect(new GainLifeEffect(2), new PermanentsOnTheBattlefieldCondition(filter), "If you control a Nissa planeswalker, you gain 2 life.")); + this.addAbility(GreenManaAbility); + + Ability BlueManaAbility = new BlueManaAbility(); + BlueManaAbility.addEffect(new ConditionalOneShotEffect(new GainLifeEffect(2), new PermanentsOnTheBattlefieldCondition(filter), "If you control a Nissa planeswalker, you gain 2 life.")); + this.addAbility(BlueManaAbility); + } + + public AvidReclaimer(final AvidReclaimer card) { + super(card); + } + + @Override + public AvidReclaimer copy() { + return new AvidReclaimer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 87cb5c849a..710379fb64 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -69,6 +69,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); + cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); From f4d8fcece892359da5563a411c3e51ff220c441d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 28 Jun 2017 12:16:39 +0200 Subject: [PATCH 039/160] [HOU] Updated mtg-cards-data.txt 2017-06-28 --- Utils/mtg-cards-data.txt | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 6d8afdaa14..9b2e6ceb9a 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31626,11 +31626,9 @@ Island|Archenemy: Nicol Bolas|103|L||Basic Land - Island|||{T}: Add {U} to your Swamp|Archenemy: Nicol Bolas|104|L||Basic Land - Swamp|||{T}: Add {B} to your mana pool.| Mountain|Archenemy: Nicol Bolas|105|L||Basic Land - Mountain|||{T}: Add {R} to your mana pool.| Forest|Archenemy: Nicol Bolas|106|L||Basic Land - Forest|||{T}: Add {G} to your mana pool.| -Adorned Pouncer|Hour of Devastation|2|R|{1}{W}|Creature - Cat|1|1|Double strike$Eternalize {3}{W}{W}| -Angel of the God-Pharaoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2}| Adorned Pouncer|Hour of Devastation|2|R|{1}{W}|Creature - Cat|1|1|Double strike$Eternalize {3}{W}{W} ({3}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Cat with no mana cost. Eternalize only as a sorcery.)| Angel of Condemnation|Hour of Devastation|3|R|{2}{W}{W}|Creature - Angel|3|3|Flying, vigilance${2}{W}, {T}: Exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step.${2}{W}, {T}, Exert Angel of Condemnation: Exile another target creature until Angel of Condemnation leaves the battlefield. (An exerted creature won't untap during your next untap step.)| -Angel of the God-Pharoah|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2}| +Angel of the God-Pharaoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2} ({2}, Discard this card: Draw a card.)| Desert's Hold|Hour of Devastation|8|U|{2}{W}|Enchantment - Aura|||Enchant creature$When Desert's Hold enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life.$Enchanted creature can't attack or block, and its activated abilities can't be activated.| Djeru, With Eyes Open|Hour of Devastation|10|R|{3}{W}{W}|Legendary Creature - Human Warrior|4|3|Vigilance$When Djeru, With Eyes Open enters the battlefield, you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library.$If a source would deal damage to a planeswalker you control, prevent 1 of that damage.| Gideon's Defeat|Hour of Devastation|13|U|{W}|Instant|||Exile target white creature that's attacking or blocking. If it was a Gideon planeswalker, you gain 5 life.| @@ -31641,17 +31639,18 @@ Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counte Steadfast Sentinel|Hour of Devastation|24|C|{3}{W}|Creature - Human Cleric|2|3|Vigilance$Eternalize {4}{W}{W} ({4}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Cleric with no mana cost. Eternalize only as a sorcery.)| Steward of Solidarity|Hour of Devastation|25|U|{1}{W}|Creature - Human Warrior|2|2|{T}, Exert Steward of Solidarity: Create a 1/1 white Warrior creature token with vigilance. (An exerted creature won't untap during your next untap step.)| Vizier of the True|Hour of Devastation|28|U|{3}{W}|Creature - Human Cleric|3|2|You may exert Vizier of the True as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, tap target creature an opponent controls.| -Champion of Wits|Hour of Devastation|31|R|{2}{U}|Creature - Naga Wizard|2|1|When Champion of Wits enters the battlefield, you may draw cards equal to its power. If you do, discard two cards.$Eternalize {5}{U}{U}| +Champion of Wits|Hour of Devastation|31|R|{2}{U}|Creature - Naga Wizard|2|1|When Champion of Wits enters the battlefield, you may draw cards equal to its power. If you do, discard two cards.$Eternalize {5}{U}{U} ({5}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Naga Wizard with no mana cost. Eternalize only as a sorcery.)| Fraying Sanity|Hour of Devastation|35|R|{2}{U}|Enchantment - Aura Curse|||Enchant player$At the beginning of each end step, enchanted player puts the top X cards of his or her library into his or her graveyard, where X is the total number of cards put into his or her graveyard from anywhere this turn. | Jace's Defeat|Hour of Devastation|38|U|{1}{U}|Instant|||Counter target blue spell. If it was a Jace planeswalker spell, scry 2.| Nimble Obstructionist|Hour of Devastation|40|R|{2}{U}|Creature - Bird Wizard|3|1|Flash$Flying$Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.)$When you cycle Nimble Obstructionist, counter target activated or triggered ability you don't control.| +Ominous Sphinx|Hour of Devastation|41|U|{3}{U}{U}|Creature - Sphinx|4|4|Flying$Whenever you cycle or discard a card,target creature an opponent controls gets -2/-0 until end of turn.| Proven Combatant|Hour of Devastation|42|C|{U}|Creature - Human Warrior|1|1|Eternalize {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Warrior with no mana cost. Eternalize only as a sorcery.) | Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize—{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counter target spell unless its controller pays {3}.$• Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| Accursed Horde|Hour of Devastation|56|U|{3}{B}|Creature - Zombie|3|3|{1}{B}: Target attacking Zombie gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.)| -Ammit Eternal|Hour of Devastation|57|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| +Ammit Eternal|Hour of Devastation|57|{2}{B}|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| @@ -31661,15 +31660,18 @@ Khenra Eternal|Hour of Devastation|66|C|{1}{B}|Creature - Zombie Jackal Warrior| Liliana's Defeat|Hour of Devastation|68|U|{B}|Sorcery|||Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life.| Maurauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| Razaketh, the Foulblooded|Hour of Devastation|73|M|{5}{B}{B}{B}|Legendary Creature - Demon|8|8|Flying, trample$Pay 2 life, Sacrifice another creature: Search your library for a card and put that card into your hand. Then shuffle your library.| +Razaketh's Ritual|Hour of Devastation|74|U|{3}{B}{B}|Sorcery|||Search your library for a card and put that card into your hand. Then shuffle your library.$Cycling {B} ({B}, Discard this card: Draw a card.)| Torment of Hailfire|Hour of Devastation|77|R|{X}{B}{B}|Sorcery|||Repeat the following process X times. Each opponent loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| Torment of Scarabs|Hour of Devastation|78|U|{3}{B}|Enchantment - Aura Curse|||Enchant player$At the beginning of enchanted player's upkeep, that player loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| Torment of Venom|Hour of Devastation|79|C|{2}{B}{B}|Instant|||Put three -1/-1 counters on target creature. Its controller loses 3 life unless he or she sacrifices another nonland permanent or discards a card.| Abrade|Hour of Devastation|83|U|{1}{R}|Instant|||Choose one —$• Abrade deals 3 damage to target creature.$• Destroy target artifact.| Chandra's Defeat|Hour of Devastation|86|U|{R}|Instant|||Chandra’s Defeat deals 5 damage to target red creature or red planeswalker. If that permanent is a Chandra planeswalker, you may discard a card. If you do, draw a card.| +Chaos Maw|Hour of Devastation|87|R|{5}{R}{R}|Creature - Hellion|6|6|When Chaos Maw enters the battlefield, it deals 3 damage to each other creature. | Defiant Khenra|Hour of Devastation|89|C|{1}{R}|Creature - Jackal Warrior|2|2|| Earthshaker Khenra|Hour of Devastation|90|R|{1}{R}|Creature - Jackal Warrior|2|1|Haste$When Earthshaker Khenra enters the battlefield, target creature with power less than or equal to Earthshaker Khenra's power can't block this turn.$Eternalize {4}{R}{R} ({4}{R}{R}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Jackal Warrior with no mana cost. Eternalize only as a sorcery.)| Fervent Paincaster|Hour of Devastation|91|U|{2}{R}|Creature - Human Wizard|3|1|{T}: Fervent Paincaster deals 1 damage to target player.${T}, Exert Fervent Paincaster: It deals 1 damage to target creature. (An exerted creature won't untap during its controller's next untap step.)| Gilded Cerodon|Hour of Devastation|94|C|{4}{R}|Creature - Beast|4|4|Whenever Gilded Cerodon attacks, if you control a Desert or there is a Desert card in your graveyard, target creature can't block this turn.| +Imminent Doom|Hour of Devastation|98|R|{2}{R}|Enchantment|||Imminent Doom enters the battlefield with a doom counter on it.$Whenever you cast a spell with converted mana cost equal to the number of doom counters on Imminent Doom, Imminent Doom deals that much damage to target creature or player. Then put a doom counter on Imminent Doom. | Inferno Jet|Hour of Devastation|99|U|{5}{R}|Sorcery|||Inferno Jet deals 6 damage to target opponent.$Cycling {2} ({2}, Discard this card: Draw a card.)| Khenra Scrapper|Hour of Devastation|100|C|{2}{R}|Creature - Jackal Warrior|2|3|Menace$You may exert Khenra Scrapper as it attacks. When you do, it gets +2/+0 until end of turn. (An exerted creature won't untap during your next untap step.)| Neheb, the Eternal|Hour of Devastation|104|M|{3}{R}{R}|Legendary Creature - Zombie Minotaur Warrior|4|6|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$At the beginning of your postcombat main phase, add {R} to your mana pool for each 1 life your opponents have lost this turn.| @@ -31677,6 +31679,7 @@ Open Fire|Hour of Devastation|105|C|{2}{R}|Instant|||Open Fire does 3 damage to Sand Strangler|Hour of Devastation|107|U|{3}{R}|Creature - Beast|3|3|When Sand Strangler enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you may have Sand Strangler deal 3 damage to target creature.| Wildfire Eternal|Hour of Devastation|109|R|{3}{R}|Creature - Zombie Jackal Cleric|1|4|Afflict 4 (Whenever this creature becomes blocked, defending player loses 4 life.)$Whenever Wildfire Eternal attacks and isn't blocked, you may cast an instant or sorcery card from your hand without paying its mana cost.| Hope Tender|Hour of Devastation|119|U|{1}{G}|Creature - Human Druid|2|2|{1}, {T}: Untap target land.${1}, {T}, Exert Hope Tender: Untap two target lands. (An exerted creature won't untap during your next untap step.)| +Hour of Promise|Hour of Devastation|120|R|{4}{G}|Sorcery|||Search your library for up to two land cards and put them onto the battlefield tapped, then shuffle your library. Then if you control three or more Deserts, create two 2/2 black Zombie creature tokens.| Nissa's Defeat|Hour of Devastation|123|U|{2}{G}|Sorcery|||Destroy target Forest, green enchantment, or green planeswalker. If that permanent was a Nissa planeswalker, draw a card.| Oasis Ritualist|Hour of Devastation|124|C|{3}{G}|Creature - Naga Druid|2|4|{t}: Add one mana of any color to your mana pool.${t}, Exert Oasis Ritualist: Add two mana of any one color to your manna pool. (An exerted creature won't untap during your next untap step.)| Pride Sovereign|Hour of Devastation|126|R|{2}{G}|Creature - Cat|2|2|Pride Sovereign gets +1/+1 for each other Cat you control.${W}, {t}, Exert Pride Sovereign: Create two 1/1 white Cat creature tokens with lifelink. (An exerted creature won't untap during your next untap step.)| @@ -31693,17 +31696,19 @@ River Hoopoe|Hour of Devastation|143|U|{G}{U}|Creature - Bird|1|3|Flying${3}{G}{ Samut, the Tested|Hour of Devastation|144|M|{2}{R}{G}|Planeswalker - Samut|4|+1: Up to one target creature gains double strike until end of turn.$-2: Samut, the Tested deals 2 damage divided as you choose among one or two target creatures and/or players.$-7: Search your library for up to two creature and/or planeswalker cards, put them onto the battlefield, then shuffle your library.| The Scarab God|Hour of Devastation|145|M|{3}{U}{B}|Legendary Creature - God|5|5|At the beginning of your upkeep, each opponent loses X life and you scry X, where X is the number of Zombies you control.${2}{U}{B}: Exile target creature card from a graveyard. Create a token that's a copy of it, except it's a 4/4 black Zombie.$When The Scarab God dies, return it to its owner's hand at the beginning of the next upkeep.| The Scorpion God|Hour of Devastation|146|M|{3}{B}{R}|Legendary Creature - God|6|5|Whenever a creature with a -1/-1 counter on it dies, draw a card.${1}{B}{R}: Put a -1/-1 counter on another target creature.$When The Scorpion God dies, return it to its owner's hand at the beginning of the next end step.| -Unraveling Mummy|Hour of Devastation|147|U|{1}{W}{B}|Creature - Zombie|2|3|{1}{W}: Target attacking Xombie gains lifelink until end of turn.${1}{B}: Target attacking Zombie gains deathtouch until end of turn.| +Unraveling Mummy|Hour of Devastation|147|U|{1}{W}{B}|Creature - Zombie|2|3|{1}{W}: Target attacking Zombie gains lifelink until end of turn.${1}{B}: Target attacking Zombie gains deathtouch until end of turn.| Farm // Market|Hour of Devastation|148|U|{2}{W}|Instant|||Destroy target attacking or blocking creature.$Market {2}{U}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Draw two cards, then destroy two cards| +Consign // Oblivion|Hour of Devastation|149|U|{1}{U}|Instant|||Return target nonland permanent to its owner's hand.$Oblivion {4}{B}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Target opponent discards two cards.| Claim // Fame|Hour of Devastation|150|U|{B}|Sorcery|||Return target creature card with converted mana cost 2 or less from your graveyard to the battlefield.$Fame {1}{R}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Target creature gets +2/+0 and gains haste until end of turn.| Struggle // Survive|Hour of Devastation|151|U|{2}{R}|Instant|||Struggle deals damage to target creature equal to the number of lands you control.$Survive {1}{G}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Each player shuffles his or graveyard into his or her library.| -Appeal // Authority|Hour of Devastation|152|U|{G}|Sorcery|||Until end of turn, target creatures gains trample and gets +X/+X, where X is the number of creatures you control.$Authority {1}{W}$Sorcery$Aftermath$Tap up to two target creatures your opponents control. Creatures you control gain vigilance until end of turn.| +Appeal // Authority|Hour of Devastation|152|U|{G}|Sorcery|||Until end of turn, target creature gains trample and gets +X/+X, where X is the number of creatures you control.$Authority {1}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Tap up to two target creatures your opponents control. Creatures you control gain vigilance until end of turn.| Reason // Believe|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| Grind // Dust|Hour of Devastation|155|R|{1}{B}|Sorcery|||Put a -1/-1 counter on each of up to two target creatures.$Dust {3}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Exile any number of target creatures that have -1/-1 counters on them.| -Refuse // Cooperate|Hour of Devastation|156|R|{3}{R}|Instant|||Refuse deals damage to target spell's controller equal to that spell's converted mana cost.$Cooperate {2}{U}$Sorcery$Aftermath$Copy target instant or sorcery spell. You may choose new targets for the copy.| +Refuse // Cooperate|Hour of Devastation|156|R|{3}{R}|Instant|||Refuse deals damage to target spell's controller equal to that spell's converted mana cost.$Cooperate {2}{U}$Instant$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Copy target instant or sorcery spell. You may choose new targets for the copy.| Driven // Despair|Hour of Devastation|157|R|{1}{G}|Sorcery|||Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."$Despair {1}{B}$Sorcery$Aftermath$Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."| Crook of Comdemnation|Hour of Devastation|159|U|{2}|Artifact|||{1}, {t}: Exile target card from a graveyard.${1}, Exile Crook of Condemnation: Exile all cards from all graveyards.| -God-Pharoah's Gift|Hour of Devastation|161|R|{7}|Artifact|||At the beginning of combat on your turn, you may exile a creature card from your graveyard. If you do, create a token that's copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn.| +God-Pharaoh's Gift|Hour of Devastation|161|R|{7}|Artifact|||At the beginning of combat on your turn, you may exile a creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn.| +Hollow One|Hour of Devastation|163|R|{5}|Artifact Creature - Golem|4|4|Hollow One costs {2} less to cast for each card you've cycled or discarded this turn.$Cycling {2} ({2}, Discard this card: Draw a card.)| Mirage Mirror|Hour of Devastation|165|R|{3}|Artifact|||{2}: Mirage Mirror becomes a copy of target artifact, creature, enchantment, or land until end of turn.| Sunset Pyramid|Hour of Devastation|166|U|{2}|Artifact|||Sunset Pyramid enters the battlefield with three brick counters on it.${2}, {T}, Remove a brick counter from Sunset Pyramid: Draw a card.${2}, {T}: Scry 1.| Desert of the Fervent|Hour of Devastation|170|C||Land - Desert|||Desert of the Fervent enters the battlefield tapped.${T}: Add {R} to your mana pool.$Cycling {1}{R} ({1}{R}, Discard this card: Draw a card.)| @@ -31711,8 +31716,14 @@ Desert of the Glorified|Hour of Devastation|171|C||Land - Desert|||Desert of the Desert of the Indomitable|Hour of Devastation|172|C||Land - Desert|||Desert of the Indomitable enters the battlefield tapped.${t}: Add {G} to your mana pool.$Cycling {1}{G} ({1}{G}, Discard this card: Draw a card.)| Desert of the Mindful|Hour of Devastation|173|C||Land - Desert|||Desert of the Mindful enters the battlefield tapped.${T}: Add {U} to your mana pool.$Cycling {1}{U} ({1}{U}, Discard this card: Draw a card.)| Desert of the True|Hour of Devastation|174|C||Land - Desert|||Desert of the True enters the battlefield tapped.${T}: Add {W} to your mana pool.$Cycling {1}{W} ({1}{W}, Discard this card: Draw a card.)| +Endless Sands|Hour of Devastation|176|R||Land - Desert|||{t}: Add {C} to your mana pool.${2}, {t}: Exile target creature you control.${4}, {t}, Sacrifice Endless Sands: Return each creature exiled with Endless Sands to the battlefield under its owner's control.| +Hashep Oasis|Hour of Devastation|177|U||Land - Desert|||{t}: Add {C} to your mana pool.${t}, Pay 1 life: Add {G} to your mana pool.${1}{G}{G}, {t}, Sacrifice a Desert: Target creature gets +3/+3 until end of turn. Activate this ability only any time you could cast a sorcery.| Hostile Desert|Hour of Devastation|178|R||Land - Desert|||{T}: Add {C} to your mana pool.${2}, Exile a land card from your graveyard: Hostile Desert becomes a 3/4 Elemental creature until end of turn. It's still a land.| +Ifnir Deadlands|Hour of Devastation|179|U||Land - Desert|||{t}: Add {C} to your mana pool.${t}, Pay 1 life: Add {B} to your mana pool.${2}{B}{B}, {t}, Sacrifice a Desert: Put two -1/-1 counters on target creature an opponent controls. Activate this ability only any time you could cast a sorcery.| +Ipnu Rivulet|Hour of Devastation|180|U||Land - Desert|||{t}: Add {C} to your mana pool.${t}, Pay 1 life: Add {U} to your mana pool.${1}{U}, {t}, Sacrifice a Desert: Target player puts the top four cards of his or her library into his or her graveyard.| +Ramunap Ruins|Hour of Devastation|181|U||Land - Desert|||{t}: Add {C} to your mana pool.${t}, Pay 1 life: Add {R} to your mana pool.${2}{R}{R}, {t}, Sacrifice a Desert: Ramunap Ruins deals 2 damage to each opponent.| Scavenger Grounds|Hour of Devastation|182|R||Land - Desert|||{t}: Add {C} to your mana pool.${2}, {t}, Sacrifice a Desert: Exile all cards from all graveyards.| +Shefet Dunes|Hour of Devastation|183|U||Land - Desert|||{t}: Add {C} to your mana pool.${t}, Pay 1 life: Add {W} to your mana pool.${2}{W}{W}, {t}, Sacrifice a Desert: Creatures you control get +1/+1 until end of turn. Activate this ability only any time you could cast a sorcery.| Plains|Hour of Devastation|185|L||Basic Land - Plains|||| Island|Hour of Devastation|186|L||Basic Land - Island|||| Swamp|Hour of Devastation|187|L||Basic Land - Swamp|||| @@ -31727,7 +31738,7 @@ Nicol Bolas, the Deceiver|Hour of Devastation|205|M|{5}{U}{B}{R}|Planeswalker - Wasp of the Bitter End|Hour of Devastation|206|U|{1}{B}|Creature - Insect Horror|2|1|Flying$Whenever you cast a Bolas planeswalker spell, you may sacrifice Wasp of the Bitter End. If you do, destroy target creature.| Zealot of the God-Pharaoh|Hour of Devastation|207|C|{3}{R}|Creature - Minotaur Archer|4|3|{4}{R}: Zealot of the God-Pharaoh deals 2 damage to target opponent.| Visage of Bolas|Hour of Devastation|208|R|{4}|Artifact|||When Visage of Bolas enters the battlefield, you may search your library and/or graveyard for a card named Nicol Bolas, the Deceiver, reveal it, and put it into your hand. If you search your library this way, shuffle it.${t}: Add {U}, {B}, or {R} to your mana pool.| -Cinder Barrens|Hour of Devastation|209|C||Land|||Cinder Barrens enters the battlefield tapped.${t}: Add {B} or {R} to your mana pool.| +Cinder Barrens|Hour of Devastation|209|C||Land|||Cinder Barrens enters the battlefield tapped.${t}: Add {B} or {R} to your mana pool. Arcane Adaptation|Ixalan|44|R|{2}{U}|Enchantment|||As Arcane Adaptation enters the battlefield, choose a creature type.$Creatures you control are the chosen type in addition to their other types. The same is true for creature spells you control and creature cards you own that aren't on the battlefield.| Ashes of the Abhorrent|Ixalan|???|R|{1}{W}|Enchantment|||Players can't cast spells from graveyards or activate abilities from graveyards.$Whenever a creature dies, you gain 1 life.| Bishop of Rebirth|Ixalan|???|R|Creature - Vampire Cleric|3|4|Vigilance$Whenever Bishop of Rebirth attacks, you may return target creature card with converted mana cost 3 or less from your graveyard to the battlefield.| From 6a86cb67174dd5c4396ed88e8602a501c289973b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 28 Jun 2017 12:20:54 +0200 Subject: [PATCH 040/160] [HOU] Updated mtg-cards-data.txt 2017-06-28 --- Utils/mtg-cards-data.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 9b2e6ceb9a..f2b6dbc328 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31650,7 +31650,7 @@ Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counte Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| Accursed Horde|Hour of Devastation|56|U|{3}{B}|Creature - Zombie|3|3|{1}{B}: Target attacking Zombie gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.)| -Ammit Eternal|Hour of Devastation|57|{2}{B}|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| +Ammit Eternal|Hour of Devastation|57|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| @@ -31738,7 +31738,7 @@ Nicol Bolas, the Deceiver|Hour of Devastation|205|M|{5}{U}{B}{R}|Planeswalker - Wasp of the Bitter End|Hour of Devastation|206|U|{1}{B}|Creature - Insect Horror|2|1|Flying$Whenever you cast a Bolas planeswalker spell, you may sacrifice Wasp of the Bitter End. If you do, destroy target creature.| Zealot of the God-Pharaoh|Hour of Devastation|207|C|{3}{R}|Creature - Minotaur Archer|4|3|{4}{R}: Zealot of the God-Pharaoh deals 2 damage to target opponent.| Visage of Bolas|Hour of Devastation|208|R|{4}|Artifact|||When Visage of Bolas enters the battlefield, you may search your library and/or graveyard for a card named Nicol Bolas, the Deceiver, reveal it, and put it into your hand. If you search your library this way, shuffle it.${t}: Add {U}, {B}, or {R} to your mana pool.| -Cinder Barrens|Hour of Devastation|209|C||Land|||Cinder Barrens enters the battlefield tapped.${t}: Add {B} or {R} to your mana pool. +Cinder Barrens|Hour of Devastation|209|C||Land|||Cinder Barrens enters the battlefield tapped.${t}: Add {B} or {R} to your mana pool.| Arcane Adaptation|Ixalan|44|R|{2}{U}|Enchantment|||As Arcane Adaptation enters the battlefield, choose a creature type.$Creatures you control are the chosen type in addition to their other types. The same is true for creature spells you control and creature cards you own that aren't on the battlefield.| Ashes of the Abhorrent|Ixalan|???|R|{1}{W}|Enchantment|||Players can't cast spells from graveyards or activate abilities from graveyards.$Whenever a creature dies, you gain 1 life.| Bishop of Rebirth|Ixalan|???|R|Creature - Vampire Cleric|3|4|Vigilance$Whenever Bishop of Rebirth attacks, you may return target creature card with converted mana cost 3 or less from your graveyard to the battlefield.| From afa0acd3f4b3d50239599743e6f0b27cbbfae377 Mon Sep 17 00:00:00 2001 From: spjspj Date: Wed, 28 Jun 2017 22:50:31 +1000 Subject: [PATCH 041/160] Implement 2 cards (HOU) --- .../src/mage/cards/b/BrambleweftBehemoth.java | 62 +++++++++++ .../src/mage/cards/c/ChampionOfWits.java | 105 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 2 + 3 files changed, 169 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BrambleweftBehemoth.java create mode 100644 Mage.Sets/src/mage/cards/c/ChampionOfWits.java diff --git a/Mage.Sets/src/mage/cards/b/BrambleweftBehemoth.java b/Mage.Sets/src/mage/cards/b/BrambleweftBehemoth.java new file mode 100644 index 0000000000..5529e5112c --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BrambleweftBehemoth.java @@ -0,0 +1,62 @@ +/* + * 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.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author spjspj + */ +public class BrambleweftBehemoth extends CardImpl { + + public BrambleweftBehemoth(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); + + this.subtype.add("Elemental"); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Trample. + this.addAbility(TrampleAbility.getInstance()); + } + + public BrambleweftBehemoth(final BrambleweftBehemoth card) { + super(card); + } + + @Override + public BrambleweftBehemoth copy() { + return new BrambleweftBehemoth(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfWits.java b/Mage.Sets/src/mage/cards/c/ChampionOfWits.java new file mode 100644 index 0000000000..5b0f471173 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChampionOfWits.java @@ -0,0 +1,105 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.EternalizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author spjspj + */ +public class ChampionOfWits extends CardImpl { + + public ChampionOfWits(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add("Naga"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // When Champion of Wits enters the battlefield, you may draw cards equal to its power. If you do, discard two cards. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ChampionOfWitsEffect(), true)); + + // Eternalize {5}{U}{U} + this.addAbility(new EternalizeAbility(new ManaCostsImpl("{5}{U}{U}"), this)); + } + + public ChampionOfWits(final ChampionOfWits card) { + super(card); + } + + @Override + public ChampionOfWits copy() { + return new ChampionOfWits(this); + } +} + +class ChampionOfWitsEffect extends OneShotEffect { + + public ChampionOfWitsEffect() { + super(Outcome.Benefit); + staticText = "When {this} enters the battlefield, you may draw cards equal to its power. If you do, discard two cards."; + } + + public ChampionOfWitsEffect(final ChampionOfWitsEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && permanent != null && sourceObject != null) { + controller.drawCards(permanent.getPower().getValue(), game); + controller.discard(2, false, source, game); + return true; + } + return false; + } + + @Override + public ChampionOfWitsEffect copy() { + return new ChampionOfWitsEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 710379fb64..7155aa3c6d 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -71,7 +71,9 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); + cards.add(new SetCardInfo("Brambleweft Behemoth", 202, Rarity.COMMON, mage.cards.b.BrambleweftBehemoth.class)); cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); + cards.add(new SetCardInfo("Champion of Wits", 31, Rarity.RARE, mage.cards.c.ChampionOfWits.class)); cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); From 886022fd19aed89b72d3a2c00169763db303206c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 28 Jun 2017 17:03:26 +0200 Subject: [PATCH 042/160] [HOU] Added 4 cards and some fixes. --- .../mage/cards/n/NicolBolasGodPharaoh.java | 35 +-- .../src/mage/cards/n/NissaGenesisMage.java | 89 ++++++ .../src/mage/cards/o/OasisRitualist.java | 75 +++++ .../src/mage/cards/p/PrideSovereign.java | 83 +++++ Mage.Sets/src/mage/cards/r/RamunapHydra.java | 134 +++++++++ .../src/mage/cards/u/UnravelingMummy.java | 94 ++++++ .../src/mage/sets/HourOfDevastation.java | 283 +++++++++--------- .../common/LookLibraryControllerEffect.java | 28 +- .../effects/common/UntapTargetEffect.java | 26 +- 9 files changed, 682 insertions(+), 165 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/n/NissaGenesisMage.java create mode 100644 Mage.Sets/src/mage/cards/o/OasisRitualist.java create mode 100644 Mage.Sets/src/mage/cards/p/PrideSovereign.java create mode 100644 Mage.Sets/src/mage/cards/r/RamunapHydra.java create mode 100644 Mage.Sets/src/mage/cards/u/UnravelingMummy.java diff --git a/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java b/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java index 53cb20aa6b..376063b826 100644 --- a/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java +++ b/Mage.Sets/src/mage/cards/n/NicolBolasGodPharaoh.java @@ -68,32 +68,33 @@ import mage.target.targetpointer.FixedTarget; */ public class NicolBolasGodPharaoh extends CardImpl { - private UUID exileId = UUID.randomUUID(); private static final FilterPermanent opponentsNonlandPermanentsFilter = new FilterNonlandPermanent("non-land permanents your opponents control"); + static { opponentsNonlandPermanentsFilter.add(new ControllerPredicate(TargetController.OPPONENT)); } + public NicolBolasGodPharaoh(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{4}{U}{B}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{4}{U}{B}{R}"); this.subtype.add("Bolas"); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(7)); // +2: Target opponent exiles cards from the top of his or her library until he or she exiles a nonland card. Until end of turn, you may cast that card without paying its mana cost. - LoyaltyAbility ability = new LoyaltyAbility(new NicolBolasGodPharaohPlusTwoEffect(exileId), 2); + LoyaltyAbility ability = new LoyaltyAbility(new NicolBolasGodPharaohPlusTwoEffect(), 2); ability.addTarget(new TargetOpponent()); this.addAbility(ability); // +1: Each opponent exiles two cards from his or her hand. - this.addAbility(new LoyaltyAbility(new NicolBolasGodPharaohPlusOneEffect(exileId), 1)); + this.addAbility(new LoyaltyAbility(new NicolBolasGodPharaohPlusOneEffect(), 1)); // -4: Nicol Bolas, God-Pharaoh deals 7 damage to target creature or player. - ability = new LoyaltyAbility(new DamageTargetEffect(7), -2); + ability = new LoyaltyAbility(new DamageTargetEffect(7), -4); ability.addTarget(new TargetCreatureOrPlayer()); this.addAbility(ability); // -12: Exile each nonland permanent your opponents control. - this.addAbility(new LoyaltyAbility(new ExileAllEffect(opponentsNonlandPermanentsFilter, exileId, this.getIdName()), -12)); + this.addAbility(new LoyaltyAbility(new ExileAllEffect(opponentsNonlandPermanentsFilter), -12)); } public NicolBolasGodPharaoh(final NicolBolasGodPharaoh card) { @@ -107,18 +108,14 @@ public class NicolBolasGodPharaoh extends CardImpl { } class NicolBolasGodPharaohPlusOneEffect extends OneShotEffect { - - private UUID exileId; - - NicolBolasGodPharaohPlusOneEffect(UUID exileId) { + + NicolBolasGodPharaohPlusOneEffect() { super(Outcome.Exile); - this.exileId = exileId; this.staticText = "Each opponent exiles two cards from his or her hand."; } - + NicolBolasGodPharaohPlusOneEffect(final NicolBolasGodPharaohPlusOneEffect effect) { super(effect); - this.exileId = effect.exileId; } @Override @@ -139,7 +136,7 @@ class NicolBolasGodPharaohPlusOneEffect extends OneShotEffect { int numberOfCardsToExile = Math.min(2, player.getHand().size()); Cards cards = new CardsImpl(); - + Target target = new TargetCardInHand(numberOfCardsToExile, new FilterCard()); player.chooseTarget(Outcome.Exile, target, source, game); @@ -156,7 +153,7 @@ class NicolBolasGodPharaohPlusOneEffect extends OneShotEffect { if (cardsPlayerChoseToExile == null) { continue; } - player.moveCardsToExile(cardsPlayerChoseToExile.getCards(game), source, game, true, exileId, source.getSourceObject(game).getIdName()); + player.moveCards(cardsPlayerChoseToExile.getCards(game), Zone.EXILED, source, game); } return true; } @@ -164,17 +161,13 @@ class NicolBolasGodPharaohPlusOneEffect extends OneShotEffect { class NicolBolasGodPharaohPlusTwoEffect extends OneShotEffect { - private UUID exileId; - - public NicolBolasGodPharaohPlusTwoEffect(UUID exileId) { + public NicolBolasGodPharaohPlusTwoEffect() { super(Outcome.Detriment); - this.exileId = exileId; this.staticText = "Target opponent exiles cards from the top of his or her library until he or she exiles a nonland card. Until end of turn, you may cast that card without paying its mana cost"; } public NicolBolasGodPharaohPlusTwoEffect(final NicolBolasGodPharaohPlusTwoEffect effect) { super(effect); - this.exileId = effect.exileId; } @Override @@ -192,7 +185,7 @@ class NicolBolasGodPharaohPlusTwoEffect extends OneShotEffect { do { card = library.removeFromTop(game); if (card != null) { - opponent.moveCardsToExile(card, source, game, true, exileId, sourceObject.getIdName()); + opponent.moveCards(card, Zone.EXILED, source, game); } } while (library.hasCards() && card != null && card.isLand()); diff --git a/Mage.Sets/src/mage/cards/n/NissaGenesisMage.java b/Mage.Sets/src/mage/cards/n/NissaGenesisMage.java new file mode 100644 index 0000000000..ee30e5cc61 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NissaGenesisMage.java @@ -0,0 +1,89 @@ +/* + * 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.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.abilities.effects.common.UntapTargetEffect; +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.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetLandPermanent; + +/** + * + * @author LevelX2 + */ +public class NissaGenesisMage extends CardImpl { + + public NissaGenesisMage(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{5}{G}{G}"); + this.subtype.add("Nissa"); + + this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + + //+2: Untap up to two target creatures and up to two target lands. + Ability ability = new LoyaltyAbility(new UntapTargetEffect().setText("Untap up to two target creatures and up to two target lands"), +2); + ability.addTarget(new TargetCreaturePermanent(0, 2, new FilterCreaturePermanent("target creatures"), false)); + ability.addTarget(new TargetLandPermanent(0, 2, new FilterLandPermanent("target land"), false)); + this.addAbility(ability); + + //-3: Target creature gets +5/+5 until end of turn. + ability = new LoyaltyAbility(new BoostTargetEffect(5, 5, Duration.EndOfTurn), -3); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + //-10: Look at the top ten cards of your library. You may put any number of creature and/or land cards from among them onto the battlefield. Put the rest on the bottom of your library in a random order.); + FilterCard filter = new FilterCard("creature and/or land cards"); + filter.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.LAND))); + this.addAbility(new LoyaltyAbility( + new LookLibraryAndPickControllerEffect(10, 10, filter, false, false, Zone.BATTLEFIELD, true).setBackInRandomOrder(true), + -10)); + } + + public NissaGenesisMage(final NissaGenesisMage card) { + super(card); + } + + @Override + public NissaGenesisMage copy() { + return new NissaGenesisMage(this); + } +} diff --git a/Mage.Sets/src/mage/cards/o/OasisRitualist.java b/Mage.Sets/src/mage/cards/o/OasisRitualist.java new file mode 100644 index 0000000000..405d3d757b --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OasisRitualist.java @@ -0,0 +1,75 @@ +/* + * 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.o; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.costs.common.ExertSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.abilities.effects.common.ManaEffect; +import mage.abilities.mana.AnyColorManaAbility; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; + +/** + * + * @author LevelX2 + */ +public class OasisRitualist extends CardImpl { + + public OasisRitualist(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); + + this.subtype.add("Naga"); + this.subtype.add("Druid"); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // {T}: Add one mana of any color to your mana pool. + this.addAbility(new AnyColorManaAbility()); + // {T}, Exert Oasis Ritualist: Add two mana of any one color to your manna pool. + SimpleManaAbility ability = new SimpleManaAbility(Zone.BATTLEFIELD, + (ManaEffect) new AddManaOfAnyColorEffect(2).setText("Add two mana of any one color to your manna pool. (An exerted creature won't untap during your next untap step.)"), + new TapSourceCost()); + ability.addCost(new ExertSourceCost()); + this.addAbility(ability); + } + + public OasisRitualist(final OasisRitualist card) { + super(card); + } + + @Override + public OasisRitualist copy() { + return new OasisRitualist(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PrideSovereign.java b/Mage.Sets/src/mage/cards/p/PrideSovereign.java new file mode 100644 index 0000000000..35e3bb500d --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PrideSovereign.java @@ -0,0 +1,83 @@ +/* + * 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.p; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.ExertSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.permanent.token.CatToken2; + +/** + * + * @author LevelX2 + */ +public class PrideSovereign extends CardImpl { + + public PrideSovereign(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add("Cat"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Pride Sovereign gets +1/+1 for each other Cat you control. + DynamicValue otherCats = new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent(SubType.CAT, "other Cat you control")); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(otherCats, otherCats, Duration.EndOfGame))); + // {W}, {t}, Exert Pride Sovereign: Create two 1/1 white Cat creature tokens with lifelink. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new CatToken2(), 2), new ManaCostsImpl("{W}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new ExertSourceCost()); + this.addAbility(ability); + } + + public PrideSovereign(final PrideSovereign card) { + super(card); + } + + @Override + public PrideSovereign copy() { + return new PrideSovereign(this); + } + +} diff --git a/Mage.Sets/src/mage/cards/r/RamunapHydra.java b/Mage.Sets/src/mage/cards/r/RamunapHydra.java new file mode 100644 index 0000000000..cfd58f0c8f --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RamunapHydra.java @@ -0,0 +1,134 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.effects.WhileConditionContinuousEffect; +import mage.abilities.effects.common.continuous.BoostSourceWhileControlsEffect; +import mage.abilities.keyword.ReachAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author LevelX2 + */ +public class RamunapHydra extends CardImpl { + + public RamunapHydra(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); + + this.subtype.add("Snake"); + this.subtype.add("Hydra"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Ramunap Hydra gets +1/+1 as long as you control a Desert. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceWhileControlsEffect(new FilterPermanent(SubType.DESERT, "Desert"), 1, 1))); + + // Ramunap Hydra gets +1/+1 as long as there is a Desert card in your graveyard. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new RamunapHydraBoostEffect(1, 1))); + } + + public RamunapHydra(final RamunapHydra card) { + super(card); + } + + @Override + public RamunapHydra copy() { + return new RamunapHydra(this); + } +} + +class RamunapHydraBoostEffect extends WhileConditionContinuousEffect { + + private final static FilterCard filter = new FilterCard("a Desert"); + + static { + filter.add(new SubtypePredicate(SubType.DESERT)); + } + + private final int power; + private final int toughness; + + public RamunapHydraBoostEffect(int power, int toughness) { + super(Duration.WhileOnBattlefield, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, new CardsInControllerGraveCondition(1, filter), Outcome.BoostCreature); + this.power = power; + this.toughness = toughness; + staticText = "{this} gets +1/+1 as long as there is a Desert card in your graveyard"; + } + + public RamunapHydraBoostEffect(final RamunapHydraBoostEffect effect) { + super(effect); + this.power = effect.power; + this.toughness = effect.toughness; + } + + @Override + public RamunapHydraBoostEffect copy() { + return new RamunapHydraBoostEffect(this); + } + + @Override + public boolean applyEffect(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + permanent.addPower(power); + permanent.addToughness(toughness); + } + return true; + } + +} diff --git a/Mage.Sets/src/mage/cards/u/UnravelingMummy.java b/Mage.Sets/src/mage/cards/u/UnravelingMummy.java new file mode 100644 index 0000000000..fb6e4ececa --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnravelingMummy.java @@ -0,0 +1,94 @@ +/* + * 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.u; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class UnravelingMummy extends CardImpl { + + private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking Zombie"); + + static { + filter.add(new AttackingPredicate()); + filter.add(new SubtypePredicate(SubType.ZOMBIE)); + } + + public UnravelingMummy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{B}"); + + this.subtype.add("Zombie"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // {1}{W}: Target attacking Zombie gains lifelink until end of turn. + Effect effect = new GainAbilityTargetEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn); + effect.setText("Target attacking Zombie gains lifelink until end of turn."); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{1}{W}")); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + + // {1}{B}: Target attacking Zombie gains deathtouch until end of turn. + effect = new GainAbilityTargetEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn); + effect.setText("Target attacking Zombie gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.)"); + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{1}{B}")); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + + } + + public UnravelingMummy(final UnravelingMummy card) { + super(card); + } + + @Override + public UnravelingMummy copy() { + return new UnravelingMummy(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 710379fb64..0f4d693535 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -1,139 +1,144 @@ -/* -* 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.sets; - -import java.util.ArrayList; -import java.util.List; -import mage.cards.CardGraphicInfo; -import mage.cards.ExpansionSet; -import mage.cards.FrameStyle; -import mage.cards.repository.CardCriteria; -import mage.cards.repository.CardInfo; -import mage.cards.repository.CardRepository; -import mage.constants.Rarity; -import mage.constants.SetType; - -/** - * @author fireshoes - */ -public class HourOfDevastation extends ExpansionSet { - - private static final HourOfDevastation instance = new HourOfDevastation(); - - public static HourOfDevastation getInstance() { - return instance; - } - - protected final List savedSpecialLand = new ArrayList<>(); - - private HourOfDevastation() { - super("Hour of Devastation", "HOU", ExpansionSet.buildDate(2017, 7, 14), SetType.EXPANSION); - this.blockName = "Amonkhet"; - this.parentSet = Amonkhet.getInstance(); - this.hasBasicLands = true; - this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; - this.numBoosterUncommon = 3; - this.numBoosterRare = 1; - this.ratioBoosterMythic = 8; - this.ratioBoosterSpecialLand = 144; - - cards.add(new SetCardInfo("Abrade", 83, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); - cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); - cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); - cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); - cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); - cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); - cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); - cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); - cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); - cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); - cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); - cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); - cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); - cards.add(new SetCardInfo("Desert of the Indomitable", 172, Rarity.COMMON, mage.cards.d.DesertOfTheIndomitable.class)); - cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); - cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); - cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); - cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); - cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); - cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); - cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); - cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); - cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); - cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); - cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); - cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); - cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); - cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); - cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); - cards.add(new SetCardInfo("Oketra's Last Mercy", 18, Rarity.RARE, mage.cards.o.OketrasLastMercy.class)); - cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); - cards.add(new SetCardInfo("Overwhelming Splendor", 19, Rarity.MYTHIC, mage.cards.o.OverwhelmingSplendor.class)); - cards.add(new SetCardInfo("Plains", 185, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); - cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); - cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); - cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); - cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); - cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); - cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); - cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); - cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("The Locust God", 139, Rarity.MYTHIC, mage.cards.t.TheLocustGod.class)); - cards.add(new SetCardInfo("The Scarab God", 145, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); - cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); - cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); - cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); - cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); - cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); - cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); - cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); - cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); - cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); - cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); - cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); - } - - @Override - public List getSpecialLand() { - if (savedSpecialLand.isEmpty()) { - CardCriteria criteria = new CardCriteria(); - criteria.setCodes("MPS-AKH"); - criteria.minCardNumber(31); - criteria.maxCardNumber(54); - savedSpecialLand.addAll(CardRepository.instance.findCards(criteria)); - } - - return new ArrayList<>(savedSpecialLand); - } -} +/* +* 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.sets; + +import java.util.ArrayList; +import java.util.List; +import mage.cards.CardGraphicInfo; +import mage.cards.ExpansionSet; +import mage.cards.FrameStyle; +import mage.cards.repository.CardCriteria; +import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * @author fireshoes + */ +public class HourOfDevastation extends ExpansionSet { + + private static final HourOfDevastation instance = new HourOfDevastation(); + + public static HourOfDevastation getInstance() { + return instance; + } + + protected final List savedSpecialLand = new ArrayList<>(); + + private HourOfDevastation() { + super("Hour of Devastation", "HOU", ExpansionSet.buildDate(2017, 7, 14), SetType.EXPANSION); + this.blockName = "Amonkhet"; + this.parentSet = Amonkhet.getInstance(); + this.hasBasicLands = true; + this.hasBoosters = true; + this.numBoosterLands = 1; + this.numBoosterCommon = 10; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 8; + this.ratioBoosterSpecialLand = 144; + + cards.add(new SetCardInfo("Abrade", 83, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); + cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); + cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); + cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); + cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); + cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); + cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); + cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); + cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); + cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); + cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); + cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); + cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); + cards.add(new SetCardInfo("Desert of the Indomitable", 172, Rarity.COMMON, mage.cards.d.DesertOfTheIndomitable.class)); + cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); + cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); + cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); + cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); + cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); + cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); + cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); + cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); + cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); + cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); + cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); + cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); + cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); + cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); + cards.add(new SetCardInfo("Nissa, Genesis Mage", 200, Rarity.MYTHIC, mage.cards.n.NissaGenesisMage.class)); + cards.add(new SetCardInfo("Oasis Ritualist", 124, Rarity.COMMON, mage.cards.o.OasisRitualist.class)); + cards.add(new SetCardInfo("Oketra's Last Mercy", 18, Rarity.RARE, mage.cards.o.OketrasLastMercy.class)); + cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); + cards.add(new SetCardInfo("Overwhelming Splendor", 19, Rarity.MYTHIC, mage.cards.o.OverwhelmingSplendor.class)); + cards.add(new SetCardInfo("Plains", 185, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Pride Sovereign", 126, Rarity.RARE, mage.cards.p.PrideSovereign.class)); + cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); + cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); + cards.add(new SetCardInfo("Ramunap Hydra", 130, Rarity.RARE, mage.cards.r.RamunapHydra.class)); + cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); + cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); + cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); + cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); + cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); + cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("The Locust God", 139, Rarity.MYTHIC, mage.cards.t.TheLocustGod.class)); + cards.add(new SetCardInfo("The Scarab God", 145, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); + cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); + cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); + cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); + cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); + cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); + cards.add(new SetCardInfo("Unraveling Mummy", 147, Rarity.UNCOMMON, mage.cards.u.UnravelingMummy.class)); + cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); + cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); + cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); + cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); + cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); + cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); + } + + @Override + public List getSpecialLand() { + if (savedSpecialLand.isEmpty()) { + CardCriteria criteria = new CardCriteria(); + criteria.setCodes("MPS-AKH"); + criteria.minCardNumber(31); + criteria.maxCardNumber(54); + savedSpecialLand.addAll(CardRepository.instance.findCards(criteria)); + } + + return new ArrayList<>(savedSpecialLand); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java index 622f94ba11..4b53c47eaf 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java @@ -32,6 +32,7 @@ import mage.abilities.Mode; import mage.abilities.SpellAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.Cards; @@ -53,6 +54,7 @@ public class LookLibraryControllerEffect extends OneShotEffect { protected boolean mayShuffleAfter = false; protected boolean putOnTop = true; // if false on put rest back on bottom of library protected Zone targetZoneLookedCards; // GRAVEYARD, LIBRARY + protected boolean backInRandomOrder = false; public LookLibraryControllerEffect() { this(1); @@ -93,6 +95,7 @@ public class LookLibraryControllerEffect extends OneShotEffect { this.mayShuffleAfter = effect.mayShuffleAfter; this.targetZoneLookedCards = effect.targetZoneLookedCards; this.putOnTop = effect.putOnTop; + this.backInRandomOrder = effect.backInRandomOrder; } @Override @@ -147,6 +150,15 @@ public class LookLibraryControllerEffect extends OneShotEffect { return true; } + public boolean isBackInRandomOrder() { + return backInRandomOrder; + } + + public Effect setBackInRandomOrder(boolean backInRandomOrder) { + this.backInRandomOrder = backInRandomOrder; + return this; + } + protected void cardLooked(Card card, Game game, Ability source) { } @@ -167,6 +179,15 @@ public class LookLibraryControllerEffect extends OneShotEffect { if (putOnTop) { player.putCardsOnTopOfLibrary(cards, game, source, true); } else { + if (backInRandomOrder) { + Cards newOrder = new CardsImpl(); + while (!cards.isEmpty()) { + Card card = cards.getRandom(game); + newOrder.add(card); + cards.remove(card); + } + cards = newOrder; + } player.putCardsOnBottomOfLibrary(cards, game, source, true); } break; @@ -182,6 +203,7 @@ public class LookLibraryControllerEffect extends OneShotEffect { * Check to shuffle library if allowed * * @param player + * @param source * @param game */ protected void mayShuffle(Player player, Ability source, Game game) { @@ -229,7 +251,11 @@ public class LookLibraryControllerEffect extends OneShotEffect { if (!middleText.isEmpty()) { sb.append(middleText); } else if (numberLook > 1) { - sb.append(", then put them back in any order"); + if (backInRandomOrder) { + sb.append(". Put the rest on the bottom of your library in a random order"); + } else { + sb.append(", then put them back in any order"); + } } if (this.mayShuffleAfter) { sb.append(". You may shuffle your library"); diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java index 068c8fdf49..ce24f5097d 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java @@ -43,8 +43,15 @@ import mage.util.CardUtil; */ public class UntapTargetEffect extends OneShotEffect { + protected boolean useOnlyTargetPointer; + public UntapTargetEffect() { + this(true); + } + + public UntapTargetEffect(boolean useOnlyTargetPointer) { super(Outcome.Untap); + this.useOnlyTargetPointer = useOnlyTargetPointer; } public UntapTargetEffect(final UntapTargetEffect effect) { @@ -58,10 +65,21 @@ public class UntapTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - for (UUID target : targetPointer.getTargets(game, source)) { - Permanent permanent = game.getPermanent(target); - if (permanent != null) { - permanent.untap(game); + if (!useOnlyTargetPointer && source.getTargets().size() > 1) { + source.getTargets().forEach((target) -> { + for (UUID targetId : target.getTargets()) { + Permanent permanent = game.getPermanent(targetId); + if (permanent != null) { + permanent.untap(game); + } + } + }); + } else { + for (UUID target : targetPointer.getTargets(game, source)) { + Permanent permanent = game.getPermanent(target); + if (permanent != null) { + permanent.untap(game); + } } } return true; From b39c61eff3d0b419e9e9d7ac603c782b0677a788 Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 28 Jun 2017 14:44:28 -0500 Subject: [PATCH 043/160] - Added Chaosphere, Goblin Shrine, and Kudzu. All requested. --- Mage.Sets/src/mage/cards/c/Chaosphere.java | 117 ++++ Mage.Sets/src/mage/cards/g/GoblinShrine.java | 124 ++++ Mage.Sets/src/mage/cards/k/Kudzu.java | 141 ++++ Mage.Sets/src/mage/sets/Chronicles.java | 1 + .../src/mage/sets/LimitedEditionAlpha.java | 611 ++++++++--------- .../src/mage/sets/LimitedEditionBeta.java | 625 +++++++++--------- Mage.Sets/src/mage/sets/MastersEditionIV.java | 592 ++++++++--------- Mage.Sets/src/mage/sets/Mirage.java | 1 + 8 files changed, 1300 insertions(+), 912 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/c/Chaosphere.java create mode 100644 Mage.Sets/src/mage/cards/g/GoblinShrine.java create mode 100644 Mage.Sets/src/mage/cards/k/Kudzu.java diff --git a/Mage.Sets/src/mage/cards/c/Chaosphere.java b/Mage.Sets/src/mage/cards/c/Chaosphere.java new file mode 100644 index 0000000000..f419c8a3d0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/Chaosphere.java @@ -0,0 +1,117 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author jeffwadsworth + */ +public class Chaosphere extends CardImpl { + + static final private FilterCreaturePermanent filterCreature = new FilterCreaturePermanent(); + static final private String rule = "Creatures without flying have reach."; + + static { + filterCreature.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); + } + + public Chaosphere(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); + + addSuperType(SuperType.WORLD); + + // Creatures with flying can block only creatures with flying. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ChaosphereEffect())); + + // Creatures without flying have reach. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(ReachAbility.getInstance(), Duration.WhileOnBattlefield, filterCreature, rule))); + + } + + public Chaosphere(final Chaosphere card) { + super(card); + } + + @Override + public Chaosphere copy() { + return new Chaosphere(this); + } +} + +class ChaosphereEffect extends RestrictionEffect { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures with flying"); + + static { + filter.add(new AbilityPredicate(FlyingAbility.class)); + } + + public ChaosphereEffect() { + super(Duration.WhileOnBattlefield); + staticText = "creatures with flying can block only creatures with flying"; + } + + public ChaosphereEffect(final ChaosphereEffect effect) { + super(effect); + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + return filter.match(permanent, source.getSourceId(), source.getControllerId(), game); + } + + @Override + public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { + return attacker.hasAbility(FlyingAbility.getInstance().getId(), game); + } + + @Override + public ChaosphereEffect copy() { + return new ChaosphereEffect(this); + } + +} diff --git a/Mage.Sets/src/mage/cards/g/GoblinShrine.java b/Mage.Sets/src/mage/cards/g/GoblinShrine.java new file mode 100644 index 0000000000..5f75d459a4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GoblinShrine.java @@ -0,0 +1,124 @@ +/* + * 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.g; + +import java.util.UUID; +import mage.target.common.TargetLandPermanent; +import mage.abilities.Ability; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DamageAllEffect; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author jeffwadsworth + */ +public class GoblinShrine extends CardImpl { + + private static final FilterCreaturePermanent filterGoblin = new FilterCreaturePermanent("Goblin creature"); + private static final String rule = "As long as enchanted land is a basic Mountain, Goblin creatures get +1/+0."; + + static { + filterGoblin.add(new SubtypePredicate(SubType.GOBLIN)); + } + + public GoblinShrine(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}{R}"); + + this.subtype.add("Aura"); + + // Enchant land + TargetPermanent auraTarget = new TargetLandPermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // As long as enchanted land is a basic Mountain, Goblin creatures get +1/+0. + ConditionalContinuousEffect effect = new ConditionalContinuousEffect(new BoostAllEffect(1, 0, Duration.WhileOnBattlefield, filterGoblin, false), new EnchantedPermanentSubtypeCondition(SubType.MOUNTAIN), rule); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + + // When Goblin Shrine leaves the battlefield, it deals 1 damage to each Goblin creature. + this.addAbility(new LeavesBattlefieldTriggeredAbility(new DamageAllEffect(1, filterGoblin), false)); + + } + + public GoblinShrine(final GoblinShrine card) { + super(card); + } + + @Override + public GoblinShrine copy() { + return new GoblinShrine(this); + } +} + +class EnchantedPermanentSubtypeCondition implements Condition { + + private final FilterLandPermanent filter = new FilterLandPermanent(); + + public EnchantedPermanentSubtypeCondition(SubType subType) { + filter.add(new SubtypePredicate(subType)); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent enchantment = game.getPermanent(source.getSourceId()); + if (enchantment != null) { + Permanent permanent = game.getPermanent(enchantment.getAttachedTo()); + if (permanent != null) { + return filter.match(permanent, source.getSourceId(), enchantment.getControllerId(), game); + } + } + return false; + } + + @Override + public String toString() { + return filter.getMessage(); + } + +} diff --git a/Mage.Sets/src/mage/cards/k/Kudzu.java b/Mage.Sets/src/mage/cards/k/Kudzu.java new file mode 100644 index 0000000000..2f3d0a1702 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/Kudzu.java @@ -0,0 +1,141 @@ +/* + * 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.k; + +import java.util.UUID; +import mage.target.common.TargetLandPermanent; +import mage.abilities.Ability; +import mage.abilities.common.BecomesTappedAttachedTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.filter.Filter; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; + +/** + * + * @author jeffwadsworth + */ +public class Kudzu extends CardImpl { + + public Kudzu(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}{G}"); + + this.subtype.add("Aura"); + + // Enchant land + TargetPermanent auraTarget = new TargetLandPermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When enchanted land becomes tapped, destroy it. That land's controller attaches Kudzu to a land of his or her choice. + this.addAbility(new BecomesTappedAttachedTriggeredAbility(new KudzuEffect(), "enchanted land")); + + } + + public Kudzu(final Kudzu card) { + super(card); + } + + @Override + public Kudzu copy() { + return new Kudzu(this); + } +} + +class KudzuEffect extends OneShotEffect { + + public KudzuEffect() { + super(Outcome.Detriment); + staticText = "destroy it. That land's controller attaches {this} to a land of his or her choice"; + } + + public KudzuEffect(final KudzuEffect effect) { + super(effect); + } + + @Override + public KudzuEffect copy() { + return new KudzuEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent kudzu = game.getPermanentOrLKIBattlefield(source.getSourceId()); + Card kudzuCard = game.getCard(source.getSourceId()); + if (kudzu != null) { + Permanent enchantedLand = game.getPermanentOrLKIBattlefield(kudzu.getAttachedTo()); + Player controller = game.getPlayer(source.getControllerId()); + if (enchantedLand != null + && controller != null) { + Player landsController = game.getPlayer(enchantedLand.getControllerId()); + if (game.getState().getZone(enchantedLand.getId()) == Zone.BATTLEFIELD) { // if 2 or more Kudzu's were on a land + enchantedLand.destroy(source.getId(), game, false); + } + if (!game.getBattlefield().getAllActivePermanents(CardType.LAND).isEmpty()) { //lands are available on the battlefield + Target target = new TargetLandPermanent(); + target.setNotTarget(true); //not a target, it is chosen + if (kudzuCard != null + && landsController != null) { + if (landsController.choose(Outcome.Detriment, target, source.getId(), game)) { + if (target.getFirstTarget() != null) { + Permanent landChosen = game.getPermanent(target.getFirstTarget()); + if (landChosen != null) { + for (Target targetTest : kudzuCard.getSpellAbility().getTargets()) { + Filter filterTest = targetTest.getFilter(); + if (filterTest.match(landChosen, game)) { + if (game.getBattlefield().containsPermanent(landChosen.getId())) { //verify that it is still on the battlefield + game.getState().setValue("attachTo:" + kudzuCard.getId(), landChosen); + Zone zone = game.getState().getZone(kudzuCard.getId()); + kudzuCard.putOntoBattlefield(game, zone, source.getSourceId(), controller.getId()); + return landChosen.addAttachment(kudzuCard.getId(), game); + } + } + } + } + } + } + } + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/Chronicles.java b/Mage.Sets/src/mage/sets/Chronicles.java index 7c470a6b51..b6de3deec6 100644 --- a/Mage.Sets/src/mage/sets/Chronicles.java +++ b/Mage.Sets/src/mage/sets/Chronicles.java @@ -92,6 +92,7 @@ public class Chronicles extends ExpansionSet { cards.add(new SetCardInfo("Ghazban Ogre", 37, Rarity.COMMON, mage.cards.g.GhazbanOgre.class)); cards.add(new SetCardInfo("Goblin Artisans", 48, Rarity.UNCOMMON, mage.cards.g.GoblinArtisans.class)); cards.add(new SetCardInfo("Goblin Digging Team", 49, Rarity.COMMON, mage.cards.g.GoblinDiggingTeam.class)); + cards.add(new SetCardInfo("Goblin Shrine", 50, Rarity.COMMON, mage.cards.g.GoblinShrine.class)); cards.add(new SetCardInfo("Goblins of the Flarg", 51, Rarity.COMMON, mage.cards.g.GoblinsOfTheFlarg.class)); cards.add(new SetCardInfo("Hasran Ogress", 6, Rarity.COMMON, mage.cards.h.HasranOgress.class)); cards.add(new SetCardInfo("Hell's Caretaker", 7, Rarity.RARE, mage.cards.h.HellsCaretaker.class)); diff --git a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java index 697d8a5625..d99d2979eb 100644 --- a/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java +++ b/Mage.Sets/src/mage/sets/LimitedEditionAlpha.java @@ -1,305 +1,306 @@ -package mage.sets; - -import mage.cards.CardGraphicInfo; -import mage.cards.ExpansionSet; -import mage.constants.Rarity; -import mage.constants.SetType; - -/** - * - * @author North - */ -public class LimitedEditionAlpha extends ExpansionSet { - - private static final LimitedEditionAlpha instance = new LimitedEditionAlpha(); - - public static LimitedEditionAlpha getInstance() { - return instance; - } - - private LimitedEditionAlpha() { - super("Limited Edition Alpha", "LEA", ExpansionSet.buildDate(1993, 8, 5), SetType.CORE); - this.hasBoosters = true; - this.numBoosterLands = 0; - this.numBoosterCommon = 11; - this.numBoosterUncommon = 3; - this.numBoosterRare = 1; - this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Air Elemental", 47, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); - cards.add(new SetCardInfo("Ancestral Recall", 48, Rarity.RARE, mage.cards.a.AncestralRecall.class)); - cards.add(new SetCardInfo("Animate Artifact", 49, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class)); - cards.add(new SetCardInfo("Animate Dead", 1, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); - cards.add(new SetCardInfo("Animate Wall", 185, Rarity.RARE, mage.cards.a.AnimateWall.class)); - cards.add(new SetCardInfo("Ankh of Mishra", 230, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); - cards.add(new SetCardInfo("Armageddon", 186, Rarity.RARE, mage.cards.a.Armageddon.class)); - cards.add(new SetCardInfo("Aspect of Wolf", 93, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); - cards.add(new SetCardInfo("Badlands", 277, Rarity.RARE, mage.cards.b.Badlands.class)); - cards.add(new SetCardInfo("Bad Moon", 2, Rarity.RARE, mage.cards.b.BadMoon.class)); - cards.add(new SetCardInfo("Balance", 187, Rarity.RARE, mage.cards.b.Balance.class)); - cards.add(new SetCardInfo("Basalt Monolith", 231, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class)); - cards.add(new SetCardInfo("Bayou", 278, Rarity.RARE, mage.cards.b.Bayou.class)); - cards.add(new SetCardInfo("Berserk", 94, Rarity.UNCOMMON, mage.cards.b.Berserk.class)); - cards.add(new SetCardInfo("Birds of Paradise", 95, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); - cards.add(new SetCardInfo("Black Knight", 3, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); - cards.add(new SetCardInfo("Black Lotus", 232, Rarity.RARE, mage.cards.b.BlackLotus.class)); - cards.add(new SetCardInfo("Black Vise", 233, Rarity.UNCOMMON, mage.cards.b.BlackVise.class)); - cards.add(new SetCardInfo("Black Ward", 189, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); - cards.add(new SetCardInfo("Blessing", 191, Rarity.RARE, mage.cards.b.Blessing.class)); - cards.add(new SetCardInfo("Blue Elemental Blast", 50, Rarity.COMMON, mage.cards.b.BlueElementalBlast.class)); - cards.add(new SetCardInfo("Blue Ward", 192, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); - cards.add(new SetCardInfo("Bog Wraith", 4, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); - cards.add(new SetCardInfo("Braingeyser", 51, Rarity.RARE, mage.cards.b.Braingeyser.class)); - cards.add(new SetCardInfo("Burrowing", 139, Rarity.UNCOMMON, mage.cards.b.Burrowing.class)); - cards.add(new SetCardInfo("Castle", 193, Rarity.UNCOMMON, mage.cards.c.Castle.class)); - cards.add(new SetCardInfo("Celestial Prism", 234, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); - cards.add(new SetCardInfo("Channel", 97, Rarity.UNCOMMON, mage.cards.c.Channel.class)); - cards.add(new SetCardInfo("Chaoslace", 140, Rarity.RARE, mage.cards.c.Chaoslace.class)); - cards.add(new SetCardInfo("Circle of Protection: Blue", 194, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); - cards.add(new SetCardInfo("Circle of Protection: Green", 195, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); - cards.add(new SetCardInfo("Circle of Protection: Red", 196, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); - cards.add(new SetCardInfo("Circle of Protection: White", 197, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); - cards.add(new SetCardInfo("Clockwork Beast", 236, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); - cards.add(new SetCardInfo("Clone", 52, Rarity.UNCOMMON, mage.cards.c.Clone.class)); - cards.add(new SetCardInfo("Cockatrice", 98, Rarity.RARE, mage.cards.c.Cockatrice.class)); - cards.add(new SetCardInfo("Consecrate Land", 198, Rarity.UNCOMMON, mage.cards.c.ConsecrateLand.class)); - cards.add(new SetCardInfo("Conservator", 237, Rarity.UNCOMMON, mage.cards.c.Conservator.class)); - cards.add(new SetCardInfo("Control Magic", 53, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class)); - cards.add(new SetCardInfo("Conversion", 199, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); - cards.add(new SetCardInfo("Copper Tablet", 238, Rarity.UNCOMMON, mage.cards.c.CopperTablet.class)); - cards.add(new SetCardInfo("Copy Artifact", 54, Rarity.RARE, mage.cards.c.CopyArtifact.class)); - cards.add(new SetCardInfo("Counterspell", 55, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); - cards.add(new SetCardInfo("Craw Wurm", 99, Rarity.COMMON, mage.cards.c.CrawWurm.class)); - cards.add(new SetCardInfo("Creature Bond", 56, Rarity.COMMON, mage.cards.c.CreatureBond.class)); - cards.add(new SetCardInfo("Crusade", 200, Rarity.RARE, mage.cards.c.Crusade.class)); - cards.add(new SetCardInfo("Crystal Rod", 239, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); - cards.add(new SetCardInfo("Cursed Land", 6, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); - cards.add(new SetCardInfo("Cyclopean Tomb", 240, Rarity.RARE, mage.cards.c.CyclopeanTomb.class)); - cards.add(new SetCardInfo("Dark Ritual", 7, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("Deathgrip", 9, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); - cards.add(new SetCardInfo("Deathlace", 10, Rarity.RARE, mage.cards.d.Deathlace.class)); - cards.add(new SetCardInfo("Death Ward", 201, Rarity.COMMON, mage.cards.d.DeathWard.class)); - cards.add(new SetCardInfo("Demonic Hordes", 12, Rarity.RARE, mage.cards.d.DemonicHordes.class)); - cards.add(new SetCardInfo("Demonic Tutor", 13, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class)); - cards.add(new SetCardInfo("Dingus Egg", 241, Rarity.RARE, mage.cards.d.DingusEgg.class)); - cards.add(new SetCardInfo("Disenchant", 202, Rarity.COMMON, mage.cards.d.Disenchant.class)); - cards.add(new SetCardInfo("Disintegrate", 141, Rarity.COMMON, mage.cards.d.Disintegrate.class)); - cards.add(new SetCardInfo("Disrupting Scepter", 242, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); - cards.add(new SetCardInfo("Dragon Whelp", 142, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); - cards.add(new SetCardInfo("Drain Life", 14, Rarity.COMMON, mage.cards.d.DrainLife.class)); - cards.add(new SetCardInfo("Drudge Skeletons", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); - cards.add(new SetCardInfo("Dwarven Demolition Team", 143, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class)); - cards.add(new SetCardInfo("Dwarven Warriors", 144, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); - cards.add(new SetCardInfo("Earthbind", 146, Rarity.COMMON, mage.cards.e.Earthbind.class)); - cards.add(new SetCardInfo("Earth Elemental", 145, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); - cards.add(new SetCardInfo("Earthquake", 147, Rarity.RARE, mage.cards.e.Earthquake.class)); - cards.add(new SetCardInfo("Elvish Archers", 100, Rarity.RARE, mage.cards.e.ElvishArchers.class)); - cards.add(new SetCardInfo("Evil Presence", 16, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); - cards.add(new SetCardInfo("Farmstead", 203, Rarity.RARE, mage.cards.f.Farmstead.class)); - cards.add(new SetCardInfo("Fastbond", 101, Rarity.RARE, mage.cards.f.Fastbond.class)); - cards.add(new SetCardInfo("Fear", 17, Rarity.COMMON, mage.cards.f.Fear.class)); - cards.add(new SetCardInfo("Feedback", 58, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); - cards.add(new SetCardInfo("Fireball", 150, Rarity.COMMON, mage.cards.f.Fireball.class)); - cards.add(new SetCardInfo("Firebreathing", 151, Rarity.COMMON, mage.cards.f.Firebreathing.class)); - cards.add(new SetCardInfo("Fire Elemental", 149, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); - cards.add(new SetCardInfo("Flashfires", 152, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); - cards.add(new SetCardInfo("Flight", 59, Rarity.COMMON, mage.cards.f.Flight.class)); - cards.add(new SetCardInfo("Fog", 102, Rarity.COMMON, mage.cards.f.Fog.class)); - cards.add(new SetCardInfo("Forcefield", 243, Rarity.RARE, mage.cards.f.Forcefield.class)); - cards.add(new SetCardInfo("Force of Nature", 103, Rarity.RARE, mage.cards.f.ForceOfNature.class)); - cards.add(new SetCardInfo("Forest", 279, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Forest", 280, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Fork", 153, Rarity.RARE, mage.cards.f.Fork.class)); - cards.add(new SetCardInfo("Frozen Shade", 18, Rarity.COMMON, mage.cards.f.FrozenShade.class)); - cards.add(new SetCardInfo("Fungusaur", 104, Rarity.RARE, mage.cards.f.Fungusaur.class)); - cards.add(new SetCardInfo("Gaea's Liege", 105, Rarity.RARE, mage.cards.g.GaeasLiege.class)); - cards.add(new SetCardInfo("Gauntlet of Might", 244, Rarity.RARE, mage.cards.g.GauntletOfMight.class)); - cards.add(new SetCardInfo("Giant Growth", 106, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); - cards.add(new SetCardInfo("Giant Spider", 107, Rarity.COMMON, mage.cards.g.GiantSpider.class)); - cards.add(new SetCardInfo("Glasses of Urza", 245, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); - cards.add(new SetCardInfo("Gloom", 19, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); - cards.add(new SetCardInfo("Goblin Balloon Brigade", 154, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class)); - cards.add(new SetCardInfo("Goblin King", 155, Rarity.RARE, mage.cards.g.GoblinKing.class)); - cards.add(new SetCardInfo("Granite Gargoyle", 156, Rarity.RARE, mage.cards.g.GraniteGargoyle.class)); - cards.add(new SetCardInfo("Gray Ogre", 157, Rarity.COMMON, mage.cards.g.GrayOgre.class)); - cards.add(new SetCardInfo("Green Ward", 204, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); - cards.add(new SetCardInfo("Grizzly Bears", 108, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); - cards.add(new SetCardInfo("Guardian Angel", 205, Rarity.COMMON, mage.cards.g.GuardianAngel.class)); - cards.add(new SetCardInfo("Healing Salve", 206, Rarity.COMMON, mage.cards.h.HealingSalve.class)); - cards.add(new SetCardInfo("Hill Giant", 158, Rarity.COMMON, mage.cards.h.HillGiant.class)); - cards.add(new SetCardInfo("Holy Armor", 207, Rarity.COMMON, mage.cards.h.HolyArmor.class)); - cards.add(new SetCardInfo("Holy Strength", 208, Rarity.COMMON, mage.cards.h.HolyStrength.class)); - cards.add(new SetCardInfo("Howl from Beyond", 20, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); - cards.add(new SetCardInfo("Howling Mine", 247, Rarity.RARE, mage.cards.h.HowlingMine.class)); - cards.add(new SetCardInfo("Hurloon Minotaur", 159, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); - cards.add(new SetCardInfo("Hurricane", 109, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); - cards.add(new SetCardInfo("Hypnotic Specter", 21, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); - cards.add(new SetCardInfo("Ice Storm", 110, Rarity.UNCOMMON, mage.cards.i.IceStorm.class)); - cards.add(new SetCardInfo("Icy Manipulator", 248, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); - cards.add(new SetCardInfo("Instill Energy", 111, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); - cards.add(new SetCardInfo("Invisibility", 60, Rarity.COMMON, mage.cards.i.Invisibility.class)); - cards.add(new SetCardInfo("Ironclaw Orcs", 160, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); - cards.add(new SetCardInfo("Ironroot Treefolk", 112, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); - cards.add(new SetCardInfo("Iron Star", 250, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); - cards.add(new SetCardInfo("Island", 281, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Island", 282, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Island Sanctuary", 209, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); - cards.add(new SetCardInfo("Ivory Cup", 251, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); - cards.add(new SetCardInfo("Jade Monolith", 252, Rarity.RARE, mage.cards.j.JadeMonolith.class)); - cards.add(new SetCardInfo("Jade Statue", 253, Rarity.UNCOMMON, mage.cards.j.JadeStatue.class)); - cards.add(new SetCardInfo("Jayemdae Tome", 254, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); - cards.add(new SetCardInfo("Juggernaut", 255, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class)); - cards.add(new SetCardInfo("Jump", 61, Rarity.COMMON, mage.cards.j.Jump.class)); - cards.add(new SetCardInfo("Karma", 210, Rarity.UNCOMMON, mage.cards.k.Karma.class)); - cards.add(new SetCardInfo("Keldon Warlord", 161, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); - cards.add(new SetCardInfo("Kormus Bell", 256, Rarity.RARE, mage.cards.k.KormusBell.class)); - cards.add(new SetCardInfo("Lance", 211, Rarity.UNCOMMON, mage.cards.l.Lance.class)); - cards.add(new SetCardInfo("Ley Druid", 114, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); - cards.add(new SetCardInfo("Library of Leng", 257, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); - cards.add(new SetCardInfo("Lich", 22, Rarity.RARE, mage.cards.l.Lich.class)); - cards.add(new SetCardInfo("Lifeforce", 115, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); - cards.add(new SetCardInfo("Lifelace", 116, Rarity.RARE, mage.cards.l.Lifelace.class)); - cards.add(new SetCardInfo("Lifetap", 62, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); - cards.add(new SetCardInfo("Lightning Bolt", 162, Rarity.COMMON, mage.cards.l.LightningBolt.class)); - cards.add(new SetCardInfo("Living Artifact", 117, Rarity.RARE, mage.cards.l.LivingArtifact.class)); - cards.add(new SetCardInfo("Living Lands", 118, Rarity.RARE, mage.cards.l.LivingLands.class)); - cards.add(new SetCardInfo("Living Wall", 258, Rarity.UNCOMMON, mage.cards.l.LivingWall.class)); - cards.add(new SetCardInfo("Llanowar Elves", 119, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); - cards.add(new SetCardInfo("Lord of Atlantis", 63, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); - cards.add(new SetCardInfo("Lord of the Pit", 23, Rarity.RARE, mage.cards.l.LordOfThePit.class)); - cards.add(new SetCardInfo("Lure", 120, Rarity.UNCOMMON, mage.cards.l.Lure.class)); - cards.add(new SetCardInfo("Mahamoti Djinn", 65, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); - cards.add(new SetCardInfo("Manabarbs", 164, Rarity.RARE, mage.cards.m.Manabarbs.class)); - cards.add(new SetCardInfo("Mana Flare", 163, Rarity.RARE, mage.cards.m.ManaFlare.class)); - cards.add(new SetCardInfo("Mana Short", 66, Rarity.RARE, mage.cards.m.ManaShort.class)); - cards.add(new SetCardInfo("Mana Vault", 259, Rarity.RARE, mage.cards.m.ManaVault.class)); - cards.add(new SetCardInfo("Meekstone", 260, Rarity.RARE, mage.cards.m.Meekstone.class)); - cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 67, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); - cards.add(new SetCardInfo("Mind Twist", 24, Rarity.RARE, mage.cards.m.MindTwist.class)); - cards.add(new SetCardInfo("Mons's Goblin Raiders", 165, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); - cards.add(new SetCardInfo("Mountain", 283, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Mountain", 284, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Mox Emerald", 261, Rarity.RARE, mage.cards.m.MoxEmerald.class)); - cards.add(new SetCardInfo("Mox Jet", 262, Rarity.RARE, mage.cards.m.MoxJet.class)); - cards.add(new SetCardInfo("Mox Pearl", 263, Rarity.RARE, mage.cards.m.MoxPearl.class)); - cards.add(new SetCardInfo("Mox Ruby", 264, Rarity.RARE, mage.cards.m.MoxRuby.class)); - cards.add(new SetCardInfo("Mox Sapphire", 265, Rarity.RARE, mage.cards.m.MoxSapphire.class)); - cards.add(new SetCardInfo("Natural Selection", 121, Rarity.RARE, mage.cards.n.NaturalSelection.class)); - cards.add(new SetCardInfo("Nether Shadow", 25, Rarity.RARE, mage.cards.n.NetherShadow.class)); - cards.add(new SetCardInfo("Nettling Imp", 26, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class)); - cards.add(new SetCardInfo("Nevinyrral's Disk", 266, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); - cards.add(new SetCardInfo("Nightmare", 27, Rarity.RARE, mage.cards.n.Nightmare.class)); - cards.add(new SetCardInfo("Northern Paladin", 213, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); - cards.add(new SetCardInfo("Obsianus Golem", 267, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class)); - cards.add(new SetCardInfo("Orcish Artillery", 166, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); - cards.add(new SetCardInfo("Orcish Oriflamme", 167, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); - cards.add(new SetCardInfo("Paralyze", 28, Rarity.COMMON, mage.cards.p.Paralyze.class)); - cards.add(new SetCardInfo("Pearled Unicorn", 214, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); - cards.add(new SetCardInfo("Personal Incarnation", 215, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); - cards.add(new SetCardInfo("Pestilence", 29, Rarity.COMMON, mage.cards.p.Pestilence.class)); - cards.add(new SetCardInfo("Phantasmal Forces", 68, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); - cards.add(new SetCardInfo("Phantasmal Terrain", 69, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); - cards.add(new SetCardInfo("Phantom Monster", 70, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); - cards.add(new SetCardInfo("Pirate Ship", 71, Rarity.RARE, mage.cards.p.PirateShip.class)); - cards.add(new SetCardInfo("Plague Rats", 30, Rarity.COMMON, mage.cards.p.PlagueRats.class)); - cards.add(new SetCardInfo("Plains", 285, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Plains", 286, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Plateau", 287, Rarity.RARE, mage.cards.p.Plateau.class)); - cards.add(new SetCardInfo("Power Sink", 73, Rarity.COMMON, mage.cards.p.PowerSink.class)); - cards.add(new SetCardInfo("Power Surge", 168, Rarity.RARE, mage.cards.p.PowerSurge.class)); - cards.add(new SetCardInfo("Prodigal Sorcerer", 74, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); - cards.add(new SetCardInfo("Psionic Blast", 75, Rarity.UNCOMMON, mage.cards.p.PsionicBlast.class)); - cards.add(new SetCardInfo("Psychic Venom", 76, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); - cards.add(new SetCardInfo("Purelace", 216, Rarity.RARE, mage.cards.p.Purelace.class)); - cards.add(new SetCardInfo("Raise Dead", 31, Rarity.COMMON, mage.cards.r.RaiseDead.class)); - cards.add(new SetCardInfo("Red Elemental Blast", 170, Rarity.COMMON, mage.cards.r.RedElementalBlast.class)); - cards.add(new SetCardInfo("Red Ward", 217, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); - cards.add(new SetCardInfo("Regeneration", 122, Rarity.COMMON, mage.cards.r.Regeneration.class)); - cards.add(new SetCardInfo("Regrowth", 123, Rarity.UNCOMMON, mage.cards.r.Regrowth.class)); - cards.add(new SetCardInfo("Resurrection", 218, Rarity.UNCOMMON, mage.cards.r.Resurrection.class)); - cards.add(new SetCardInfo("Reverse Damage", 219, Rarity.RARE, mage.cards.r.ReverseDamage.class)); - cards.add(new SetCardInfo("Righteousness", 220, Rarity.RARE, mage.cards.r.Righteousness.class)); - cards.add(new SetCardInfo("Roc of Kher Ridges", 171, Rarity.RARE, mage.cards.r.RocOfKherRidges.class)); - cards.add(new SetCardInfo("Rock Hydra", 172, Rarity.RARE, mage.cards.r.RockHydra.class)); - cards.add(new SetCardInfo("Rod of Ruin", 268, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); - cards.add(new SetCardInfo("Royal Assassin", 32, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); - cards.add(new SetCardInfo("Sacrifice", 33, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class)); - cards.add(new SetCardInfo("Samite Healer", 221, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); - cards.add(new SetCardInfo("Savannah", 288, Rarity.RARE, mage.cards.s.Savannah.class)); - cards.add(new SetCardInfo("Savannah Lions", 222, Rarity.RARE, mage.cards.s.SavannahLions.class)); - cards.add(new SetCardInfo("Scathe Zombies", 34, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); - cards.add(new SetCardInfo("Scavenging Ghoul", 35, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); - cards.add(new SetCardInfo("Scrubland", 289, Rarity.RARE, mage.cards.s.Scrubland.class)); - cards.add(new SetCardInfo("Scryb Sprites", 124, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); - cards.add(new SetCardInfo("Sea Serpent", 77, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); - cards.add(new SetCardInfo("Sedge Troll", 173, Rarity.RARE, mage.cards.s.SedgeTroll.class)); - cards.add(new SetCardInfo("Sengir Vampire", 36, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); - cards.add(new SetCardInfo("Serra Angel", 223, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); - cards.add(new SetCardInfo("Shanodin Dryads", 125, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); - cards.add(new SetCardInfo("Shatter", 174, Rarity.COMMON, mage.cards.s.Shatter.class)); - cards.add(new SetCardInfo("Shivan Dragon", 175, Rarity.RARE, mage.cards.s.ShivanDragon.class)); - cards.add(new SetCardInfo("Simulacrum", 37, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); - cards.add(new SetCardInfo("Sinkhole", 38, Rarity.COMMON, mage.cards.s.Sinkhole.class)); - cards.add(new SetCardInfo("Siren's Call", 78, Rarity.UNCOMMON, mage.cards.s.SirensCall.class)); - cards.add(new SetCardInfo("Smoke", 176, Rarity.RARE, mage.cards.s.Smoke.class)); - cards.add(new SetCardInfo("Sol Ring", 269, Rarity.UNCOMMON, mage.cards.s.SolRing.class)); - cards.add(new SetCardInfo("Soul Net", 270, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); - cards.add(new SetCardInfo("Spell Blast", 80, Rarity.COMMON, mage.cards.s.SpellBlast.class)); - cards.add(new SetCardInfo("Stasis", 81, Rarity.RARE, mage.cards.s.Stasis.class)); - cards.add(new SetCardInfo("Steal Artifact", 82, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); - cards.add(new SetCardInfo("Stone Giant", 177, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); - cards.add(new SetCardInfo("Stone Rain", 178, Rarity.COMMON, mage.cards.s.StoneRain.class)); - cards.add(new SetCardInfo("Stream of Life", 126, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); - cards.add(new SetCardInfo("Sunglasses of Urza", 271, Rarity.RARE, mage.cards.s.SunglassesOfUrza.class)); - cards.add(new SetCardInfo("Swamp", 290, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Swamp", 291, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Swords to Plowshares", 224, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); - cards.add(new SetCardInfo("Taiga", 292, Rarity.RARE, mage.cards.t.Taiga.class)); - cards.add(new SetCardInfo("Terror", 39, Rarity.COMMON, mage.cards.t.Terror.class)); - cards.add(new SetCardInfo("The Hive", 272, Rarity.RARE, mage.cards.t.TheHive.class)); - cards.add(new SetCardInfo("Thicket Basilisk", 127, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); - cards.add(new SetCardInfo("Thoughtlace", 83, Rarity.RARE, mage.cards.t.Thoughtlace.class)); - cards.add(new SetCardInfo("Throne of Bone", 273, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); - cards.add(new SetCardInfo("Timetwister", 85, Rarity.RARE, mage.cards.t.Timetwister.class)); - cards.add(new SetCardInfo("Time Vault", 274, Rarity.RARE, mage.cards.t.TimeVault.class)); - cards.add(new SetCardInfo("Time Walk", 84, Rarity.RARE, mage.cards.t.TimeWalk.class)); - cards.add(new SetCardInfo("Tranquility", 129, Rarity.COMMON, mage.cards.t.Tranquility.class)); - cards.add(new SetCardInfo("Tropical Island", 293, Rarity.RARE, mage.cards.t.TropicalIsland.class)); - cards.add(new SetCardInfo("Tsunami", 130, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); - cards.add(new SetCardInfo("Tundra", 294, Rarity.RARE, mage.cards.t.Tundra.class)); - cards.add(new SetCardInfo("Tunnel", 179, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); - cards.add(new SetCardInfo("Twiddle", 86, Rarity.COMMON, mage.cards.t.Twiddle.class)); - cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 180, Rarity.RARE, mage.cards.t.TwoHeadedGiantOfForiys.class)); - cards.add(new SetCardInfo("Underground Sea", 295, Rarity.RARE, mage.cards.u.UndergroundSea.class)); - cards.add(new SetCardInfo("Unholy Strength", 40, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); - cards.add(new SetCardInfo("Unsummon", 87, Rarity.COMMON, mage.cards.u.Unsummon.class)); - cards.add(new SetCardInfo("Uthden Troll", 181, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); - cards.add(new SetCardInfo("Verduran Enchantress", 131, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); - cards.add(new SetCardInfo("Vesuvan Doppelganger", 88, Rarity.RARE, mage.cards.v.VesuvanDoppelganger.class)); - cards.add(new SetCardInfo("Veteran Bodyguard", 225, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); - cards.add(new SetCardInfo("Volcanic Eruption", 89, Rarity.RARE, mage.cards.v.VolcanicEruption.class)); - cards.add(new SetCardInfo("Wall of Air", 90, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); - cards.add(new SetCardInfo("Wall of Bone", 41, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); - cards.add(new SetCardInfo("Wall of Brambles", 132, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); - cards.add(new SetCardInfo("Wall of Fire", 182, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); - cards.add(new SetCardInfo("Wall of Ice", 133, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); - cards.add(new SetCardInfo("Wall of Stone", 183, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); - cards.add(new SetCardInfo("Wall of Swords", 226, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); - cards.add(new SetCardInfo("Wall of Water", 91, Rarity.UNCOMMON, mage.cards.w.WallOfWater.class)); - cards.add(new SetCardInfo("Wall of Wood", 134, Rarity.COMMON, mage.cards.w.WallOfWood.class)); - cards.add(new SetCardInfo("Wanderlust", 135, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); - cards.add(new SetCardInfo("War Mammoth", 136, Rarity.COMMON, mage.cards.w.WarMammoth.class)); - cards.add(new SetCardInfo("Warp Artifact", 42, Rarity.RARE, mage.cards.w.WarpArtifact.class)); - cards.add(new SetCardInfo("Water Elemental", 92, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class)); - cards.add(new SetCardInfo("Weakness", 43, Rarity.COMMON, mage.cards.w.Weakness.class)); - cards.add(new SetCardInfo("Web", 137, Rarity.RARE, mage.cards.w.Web.class)); - cards.add(new SetCardInfo("Wheel of Fortune", 184, Rarity.RARE, mage.cards.w.WheelOfFortune.class)); - cards.add(new SetCardInfo("White Knight", 227, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); - cards.add(new SetCardInfo("White Ward", 228, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); - cards.add(new SetCardInfo("Wild Growth", 138, Rarity.COMMON, mage.cards.w.WildGrowth.class)); - cards.add(new SetCardInfo("Will-o'-the-Wisp", 44, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); - cards.add(new SetCardInfo("Winter Orb", 275, Rarity.RARE, mage.cards.w.WinterOrb.class)); - cards.add(new SetCardInfo("Wooden Sphere", 276, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); - cards.add(new SetCardInfo("Wrath of God", 229, Rarity.RARE, mage.cards.w.WrathOfGod.class)); - cards.add(new SetCardInfo("Zombie Master", 46, Rarity.RARE, mage.cards.z.ZombieMaster.class)); - } -} +package mage.sets; + +import mage.cards.CardGraphicInfo; +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * + * @author North + */ +public class LimitedEditionAlpha extends ExpansionSet { + + private static final LimitedEditionAlpha instance = new LimitedEditionAlpha(); + + public static LimitedEditionAlpha getInstance() { + return instance; + } + + private LimitedEditionAlpha() { + super("Limited Edition Alpha", "LEA", ExpansionSet.buildDate(1993, 8, 5), SetType.CORE); + this.hasBoosters = true; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Air Elemental", 47, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); + cards.add(new SetCardInfo("Ancestral Recall", 48, Rarity.RARE, mage.cards.a.AncestralRecall.class)); + cards.add(new SetCardInfo("Animate Artifact", 49, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class)); + cards.add(new SetCardInfo("Animate Dead", 1, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); + cards.add(new SetCardInfo("Animate Wall", 185, Rarity.RARE, mage.cards.a.AnimateWall.class)); + cards.add(new SetCardInfo("Ankh of Mishra", 230, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); + cards.add(new SetCardInfo("Armageddon", 186, Rarity.RARE, mage.cards.a.Armageddon.class)); + cards.add(new SetCardInfo("Aspect of Wolf", 93, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); + cards.add(new SetCardInfo("Badlands", 277, Rarity.RARE, mage.cards.b.Badlands.class)); + cards.add(new SetCardInfo("Bad Moon", 2, Rarity.RARE, mage.cards.b.BadMoon.class)); + cards.add(new SetCardInfo("Balance", 187, Rarity.RARE, mage.cards.b.Balance.class)); + cards.add(new SetCardInfo("Basalt Monolith", 231, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class)); + cards.add(new SetCardInfo("Bayou", 278, Rarity.RARE, mage.cards.b.Bayou.class)); + cards.add(new SetCardInfo("Berserk", 94, Rarity.UNCOMMON, mage.cards.b.Berserk.class)); + cards.add(new SetCardInfo("Birds of Paradise", 95, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); + cards.add(new SetCardInfo("Black Knight", 3, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); + cards.add(new SetCardInfo("Black Lotus", 232, Rarity.RARE, mage.cards.b.BlackLotus.class)); + cards.add(new SetCardInfo("Black Vise", 233, Rarity.UNCOMMON, mage.cards.b.BlackVise.class)); + cards.add(new SetCardInfo("Black Ward", 189, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); + cards.add(new SetCardInfo("Blessing", 191, Rarity.RARE, mage.cards.b.Blessing.class)); + cards.add(new SetCardInfo("Blue Elemental Blast", 50, Rarity.COMMON, mage.cards.b.BlueElementalBlast.class)); + cards.add(new SetCardInfo("Blue Ward", 192, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); + cards.add(new SetCardInfo("Bog Wraith", 4, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); + cards.add(new SetCardInfo("Braingeyser", 51, Rarity.RARE, mage.cards.b.Braingeyser.class)); + cards.add(new SetCardInfo("Burrowing", 139, Rarity.UNCOMMON, mage.cards.b.Burrowing.class)); + cards.add(new SetCardInfo("Castle", 193, Rarity.UNCOMMON, mage.cards.c.Castle.class)); + cards.add(new SetCardInfo("Celestial Prism", 234, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); + cards.add(new SetCardInfo("Channel", 97, Rarity.UNCOMMON, mage.cards.c.Channel.class)); + cards.add(new SetCardInfo("Chaoslace", 140, Rarity.RARE, mage.cards.c.Chaoslace.class)); + cards.add(new SetCardInfo("Circle of Protection: Blue", 194, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); + cards.add(new SetCardInfo("Circle of Protection: Green", 195, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); + cards.add(new SetCardInfo("Circle of Protection: Red", 196, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); + cards.add(new SetCardInfo("Circle of Protection: White", 197, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); + cards.add(new SetCardInfo("Clockwork Beast", 236, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); + cards.add(new SetCardInfo("Clone", 52, Rarity.UNCOMMON, mage.cards.c.Clone.class)); + cards.add(new SetCardInfo("Cockatrice", 98, Rarity.RARE, mage.cards.c.Cockatrice.class)); + cards.add(new SetCardInfo("Consecrate Land", 198, Rarity.UNCOMMON, mage.cards.c.ConsecrateLand.class)); + cards.add(new SetCardInfo("Conservator", 237, Rarity.UNCOMMON, mage.cards.c.Conservator.class)); + cards.add(new SetCardInfo("Control Magic", 53, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class)); + cards.add(new SetCardInfo("Conversion", 199, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); + cards.add(new SetCardInfo("Copper Tablet", 238, Rarity.UNCOMMON, mage.cards.c.CopperTablet.class)); + cards.add(new SetCardInfo("Copy Artifact", 54, Rarity.RARE, mage.cards.c.CopyArtifact.class)); + cards.add(new SetCardInfo("Counterspell", 55, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); + cards.add(new SetCardInfo("Craw Wurm", 99, Rarity.COMMON, mage.cards.c.CrawWurm.class)); + cards.add(new SetCardInfo("Creature Bond", 56, Rarity.COMMON, mage.cards.c.CreatureBond.class)); + cards.add(new SetCardInfo("Crusade", 200, Rarity.RARE, mage.cards.c.Crusade.class)); + cards.add(new SetCardInfo("Crystal Rod", 239, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); + cards.add(new SetCardInfo("Cursed Land", 6, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); + cards.add(new SetCardInfo("Cyclopean Tomb", 240, Rarity.RARE, mage.cards.c.CyclopeanTomb.class)); + cards.add(new SetCardInfo("Dark Ritual", 7, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("Deathgrip", 9, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); + cards.add(new SetCardInfo("Deathlace", 10, Rarity.RARE, mage.cards.d.Deathlace.class)); + cards.add(new SetCardInfo("Death Ward", 201, Rarity.COMMON, mage.cards.d.DeathWard.class)); + cards.add(new SetCardInfo("Demonic Hordes", 12, Rarity.RARE, mage.cards.d.DemonicHordes.class)); + cards.add(new SetCardInfo("Demonic Tutor", 13, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class)); + cards.add(new SetCardInfo("Dingus Egg", 241, Rarity.RARE, mage.cards.d.DingusEgg.class)); + cards.add(new SetCardInfo("Disenchant", 202, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Disintegrate", 141, Rarity.COMMON, mage.cards.d.Disintegrate.class)); + cards.add(new SetCardInfo("Disrupting Scepter", 242, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); + cards.add(new SetCardInfo("Dragon Whelp", 142, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); + cards.add(new SetCardInfo("Drain Life", 14, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drudge Skeletons", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); + cards.add(new SetCardInfo("Dwarven Demolition Team", 143, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class)); + cards.add(new SetCardInfo("Dwarven Warriors", 144, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); + cards.add(new SetCardInfo("Earthbind", 146, Rarity.COMMON, mage.cards.e.Earthbind.class)); + cards.add(new SetCardInfo("Earth Elemental", 145, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); + cards.add(new SetCardInfo("Earthquake", 147, Rarity.RARE, mage.cards.e.Earthquake.class)); + cards.add(new SetCardInfo("Elvish Archers", 100, Rarity.RARE, mage.cards.e.ElvishArchers.class)); + cards.add(new SetCardInfo("Evil Presence", 16, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); + cards.add(new SetCardInfo("Farmstead", 203, Rarity.RARE, mage.cards.f.Farmstead.class)); + cards.add(new SetCardInfo("Fastbond", 101, Rarity.RARE, mage.cards.f.Fastbond.class)); + cards.add(new SetCardInfo("Fear", 17, Rarity.COMMON, mage.cards.f.Fear.class)); + cards.add(new SetCardInfo("Feedback", 58, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); + cards.add(new SetCardInfo("Fireball", 150, Rarity.COMMON, mage.cards.f.Fireball.class)); + cards.add(new SetCardInfo("Firebreathing", 151, Rarity.COMMON, mage.cards.f.Firebreathing.class)); + cards.add(new SetCardInfo("Fire Elemental", 149, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); + cards.add(new SetCardInfo("Flashfires", 152, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); + cards.add(new SetCardInfo("Flight", 59, Rarity.COMMON, mage.cards.f.Flight.class)); + cards.add(new SetCardInfo("Fog", 102, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Forcefield", 243, Rarity.RARE, mage.cards.f.Forcefield.class)); + cards.add(new SetCardInfo("Force of Nature", 103, Rarity.RARE, mage.cards.f.ForceOfNature.class)); + cards.add(new SetCardInfo("Forest", 279, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Forest", 280, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Fork", 153, Rarity.RARE, mage.cards.f.Fork.class)); + cards.add(new SetCardInfo("Frozen Shade", 18, Rarity.COMMON, mage.cards.f.FrozenShade.class)); + cards.add(new SetCardInfo("Fungusaur", 104, Rarity.RARE, mage.cards.f.Fungusaur.class)); + cards.add(new SetCardInfo("Gaea's Liege", 105, Rarity.RARE, mage.cards.g.GaeasLiege.class)); + cards.add(new SetCardInfo("Gauntlet of Might", 244, Rarity.RARE, mage.cards.g.GauntletOfMight.class)); + cards.add(new SetCardInfo("Giant Growth", 106, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Spider", 107, Rarity.COMMON, mage.cards.g.GiantSpider.class)); + cards.add(new SetCardInfo("Glasses of Urza", 245, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); + cards.add(new SetCardInfo("Gloom", 19, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); + cards.add(new SetCardInfo("Goblin Balloon Brigade", 154, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class)); + cards.add(new SetCardInfo("Goblin King", 155, Rarity.RARE, mage.cards.g.GoblinKing.class)); + cards.add(new SetCardInfo("Granite Gargoyle", 156, Rarity.RARE, mage.cards.g.GraniteGargoyle.class)); + cards.add(new SetCardInfo("Gray Ogre", 157, Rarity.COMMON, mage.cards.g.GrayOgre.class)); + cards.add(new SetCardInfo("Green Ward", 204, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); + cards.add(new SetCardInfo("Grizzly Bears", 108, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); + cards.add(new SetCardInfo("Guardian Angel", 205, Rarity.COMMON, mage.cards.g.GuardianAngel.class)); + cards.add(new SetCardInfo("Healing Salve", 206, Rarity.COMMON, mage.cards.h.HealingSalve.class)); + cards.add(new SetCardInfo("Hill Giant", 158, Rarity.COMMON, mage.cards.h.HillGiant.class)); + cards.add(new SetCardInfo("Holy Armor", 207, Rarity.COMMON, mage.cards.h.HolyArmor.class)); + cards.add(new SetCardInfo("Holy Strength", 208, Rarity.COMMON, mage.cards.h.HolyStrength.class)); + cards.add(new SetCardInfo("Howl from Beyond", 20, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); + cards.add(new SetCardInfo("Howling Mine", 247, Rarity.RARE, mage.cards.h.HowlingMine.class)); + cards.add(new SetCardInfo("Hurloon Minotaur", 159, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); + cards.add(new SetCardInfo("Hurricane", 109, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); + cards.add(new SetCardInfo("Hypnotic Specter", 21, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); + cards.add(new SetCardInfo("Ice Storm", 110, Rarity.UNCOMMON, mage.cards.i.IceStorm.class)); + cards.add(new SetCardInfo("Icy Manipulator", 248, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); + cards.add(new SetCardInfo("Instill Energy", 111, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); + cards.add(new SetCardInfo("Invisibility", 60, Rarity.COMMON, mage.cards.i.Invisibility.class)); + cards.add(new SetCardInfo("Ironclaw Orcs", 160, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); + cards.add(new SetCardInfo("Ironroot Treefolk", 112, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); + cards.add(new SetCardInfo("Iron Star", 250, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); + cards.add(new SetCardInfo("Island", 281, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Island", 282, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Island Sanctuary", 209, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Ivory Cup", 251, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); + cards.add(new SetCardInfo("Jade Monolith", 252, Rarity.RARE, mage.cards.j.JadeMonolith.class)); + cards.add(new SetCardInfo("Jade Statue", 253, Rarity.UNCOMMON, mage.cards.j.JadeStatue.class)); + cards.add(new SetCardInfo("Jayemdae Tome", 254, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); + cards.add(new SetCardInfo("Juggernaut", 255, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class)); + cards.add(new SetCardInfo("Jump", 61, Rarity.COMMON, mage.cards.j.Jump.class)); + cards.add(new SetCardInfo("Karma", 210, Rarity.UNCOMMON, mage.cards.k.Karma.class)); + cards.add(new SetCardInfo("Keldon Warlord", 161, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); + cards.add(new SetCardInfo("Kormus Bell", 256, Rarity.RARE, mage.cards.k.KormusBell.class)); + cards.add(new SetCardInfo("Kudzu", 113, Rarity.RARE, mage.cards.k.Kudzu.class)); + cards.add(new SetCardInfo("Lance", 211, Rarity.UNCOMMON, mage.cards.l.Lance.class)); + cards.add(new SetCardInfo("Ley Druid", 114, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); + cards.add(new SetCardInfo("Library of Leng", 257, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); + cards.add(new SetCardInfo("Lich", 22, Rarity.RARE, mage.cards.l.Lich.class)); + cards.add(new SetCardInfo("Lifeforce", 115, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); + cards.add(new SetCardInfo("Lifelace", 116, Rarity.RARE, mage.cards.l.Lifelace.class)); + cards.add(new SetCardInfo("Lifetap", 62, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); + cards.add(new SetCardInfo("Lightning Bolt", 162, Rarity.COMMON, mage.cards.l.LightningBolt.class)); + cards.add(new SetCardInfo("Living Artifact", 117, Rarity.RARE, mage.cards.l.LivingArtifact.class)); + cards.add(new SetCardInfo("Living Lands", 118, Rarity.RARE, mage.cards.l.LivingLands.class)); + cards.add(new SetCardInfo("Living Wall", 258, Rarity.UNCOMMON, mage.cards.l.LivingWall.class)); + cards.add(new SetCardInfo("Llanowar Elves", 119, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); + cards.add(new SetCardInfo("Lord of Atlantis", 63, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); + cards.add(new SetCardInfo("Lord of the Pit", 23, Rarity.RARE, mage.cards.l.LordOfThePit.class)); + cards.add(new SetCardInfo("Lure", 120, Rarity.UNCOMMON, mage.cards.l.Lure.class)); + cards.add(new SetCardInfo("Mahamoti Djinn", 65, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); + cards.add(new SetCardInfo("Manabarbs", 164, Rarity.RARE, mage.cards.m.Manabarbs.class)); + cards.add(new SetCardInfo("Mana Flare", 163, Rarity.RARE, mage.cards.m.ManaFlare.class)); + cards.add(new SetCardInfo("Mana Short", 66, Rarity.RARE, mage.cards.m.ManaShort.class)); + cards.add(new SetCardInfo("Mana Vault", 259, Rarity.RARE, mage.cards.m.ManaVault.class)); + cards.add(new SetCardInfo("Meekstone", 260, Rarity.RARE, mage.cards.m.Meekstone.class)); + cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 67, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); + cards.add(new SetCardInfo("Mind Twist", 24, Rarity.RARE, mage.cards.m.MindTwist.class)); + cards.add(new SetCardInfo("Mons's Goblin Raiders", 165, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); + cards.add(new SetCardInfo("Mountain", 283, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Mountain", 284, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Mox Emerald", 261, Rarity.RARE, mage.cards.m.MoxEmerald.class)); + cards.add(new SetCardInfo("Mox Jet", 262, Rarity.RARE, mage.cards.m.MoxJet.class)); + cards.add(new SetCardInfo("Mox Pearl", 263, Rarity.RARE, mage.cards.m.MoxPearl.class)); + cards.add(new SetCardInfo("Mox Ruby", 264, Rarity.RARE, mage.cards.m.MoxRuby.class)); + cards.add(new SetCardInfo("Mox Sapphire", 265, Rarity.RARE, mage.cards.m.MoxSapphire.class)); + cards.add(new SetCardInfo("Natural Selection", 121, Rarity.RARE, mage.cards.n.NaturalSelection.class)); + cards.add(new SetCardInfo("Nether Shadow", 25, Rarity.RARE, mage.cards.n.NetherShadow.class)); + cards.add(new SetCardInfo("Nettling Imp", 26, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class)); + cards.add(new SetCardInfo("Nevinyrral's Disk", 266, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); + cards.add(new SetCardInfo("Nightmare", 27, Rarity.RARE, mage.cards.n.Nightmare.class)); + cards.add(new SetCardInfo("Northern Paladin", 213, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); + cards.add(new SetCardInfo("Obsianus Golem", 267, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class)); + cards.add(new SetCardInfo("Orcish Artillery", 166, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); + cards.add(new SetCardInfo("Orcish Oriflamme", 167, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); + cards.add(new SetCardInfo("Paralyze", 28, Rarity.COMMON, mage.cards.p.Paralyze.class)); + cards.add(new SetCardInfo("Pearled Unicorn", 214, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); + cards.add(new SetCardInfo("Personal Incarnation", 215, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); + cards.add(new SetCardInfo("Pestilence", 29, Rarity.COMMON, mage.cards.p.Pestilence.class)); + cards.add(new SetCardInfo("Phantasmal Forces", 68, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); + cards.add(new SetCardInfo("Phantasmal Terrain", 69, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); + cards.add(new SetCardInfo("Phantom Monster", 70, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); + cards.add(new SetCardInfo("Pirate Ship", 71, Rarity.RARE, mage.cards.p.PirateShip.class)); + cards.add(new SetCardInfo("Plague Rats", 30, Rarity.COMMON, mage.cards.p.PlagueRats.class)); + cards.add(new SetCardInfo("Plains", 285, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Plains", 286, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Plateau", 287, Rarity.RARE, mage.cards.p.Plateau.class)); + cards.add(new SetCardInfo("Power Sink", 73, Rarity.COMMON, mage.cards.p.PowerSink.class)); + cards.add(new SetCardInfo("Power Surge", 168, Rarity.RARE, mage.cards.p.PowerSurge.class)); + cards.add(new SetCardInfo("Prodigal Sorcerer", 74, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); + cards.add(new SetCardInfo("Psionic Blast", 75, Rarity.UNCOMMON, mage.cards.p.PsionicBlast.class)); + cards.add(new SetCardInfo("Psychic Venom", 76, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); + cards.add(new SetCardInfo("Purelace", 216, Rarity.RARE, mage.cards.p.Purelace.class)); + cards.add(new SetCardInfo("Raise Dead", 31, Rarity.COMMON, mage.cards.r.RaiseDead.class)); + cards.add(new SetCardInfo("Red Elemental Blast", 170, Rarity.COMMON, mage.cards.r.RedElementalBlast.class)); + cards.add(new SetCardInfo("Red Ward", 217, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); + cards.add(new SetCardInfo("Regeneration", 122, Rarity.COMMON, mage.cards.r.Regeneration.class)); + cards.add(new SetCardInfo("Regrowth", 123, Rarity.UNCOMMON, mage.cards.r.Regrowth.class)); + cards.add(new SetCardInfo("Resurrection", 218, Rarity.UNCOMMON, mage.cards.r.Resurrection.class)); + cards.add(new SetCardInfo("Reverse Damage", 219, Rarity.RARE, mage.cards.r.ReverseDamage.class)); + cards.add(new SetCardInfo("Righteousness", 220, Rarity.RARE, mage.cards.r.Righteousness.class)); + cards.add(new SetCardInfo("Roc of Kher Ridges", 171, Rarity.RARE, mage.cards.r.RocOfKherRidges.class)); + cards.add(new SetCardInfo("Rock Hydra", 172, Rarity.RARE, mage.cards.r.RockHydra.class)); + cards.add(new SetCardInfo("Rod of Ruin", 268, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); + cards.add(new SetCardInfo("Royal Assassin", 32, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); + cards.add(new SetCardInfo("Sacrifice", 33, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class)); + cards.add(new SetCardInfo("Samite Healer", 221, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); + cards.add(new SetCardInfo("Savannah", 288, Rarity.RARE, mage.cards.s.Savannah.class)); + cards.add(new SetCardInfo("Savannah Lions", 222, Rarity.RARE, mage.cards.s.SavannahLions.class)); + cards.add(new SetCardInfo("Scathe Zombies", 34, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); + cards.add(new SetCardInfo("Scavenging Ghoul", 35, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); + cards.add(new SetCardInfo("Scrubland", 289, Rarity.RARE, mage.cards.s.Scrubland.class)); + cards.add(new SetCardInfo("Scryb Sprites", 124, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); + cards.add(new SetCardInfo("Sea Serpent", 77, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); + cards.add(new SetCardInfo("Sedge Troll", 173, Rarity.RARE, mage.cards.s.SedgeTroll.class)); + cards.add(new SetCardInfo("Sengir Vampire", 36, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); + cards.add(new SetCardInfo("Serra Angel", 223, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); + cards.add(new SetCardInfo("Shanodin Dryads", 125, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); + cards.add(new SetCardInfo("Shatter", 174, Rarity.COMMON, mage.cards.s.Shatter.class)); + cards.add(new SetCardInfo("Shivan Dragon", 175, Rarity.RARE, mage.cards.s.ShivanDragon.class)); + cards.add(new SetCardInfo("Simulacrum", 37, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); + cards.add(new SetCardInfo("Sinkhole", 38, Rarity.COMMON, mage.cards.s.Sinkhole.class)); + cards.add(new SetCardInfo("Siren's Call", 78, Rarity.UNCOMMON, mage.cards.s.SirensCall.class)); + cards.add(new SetCardInfo("Smoke", 176, Rarity.RARE, mage.cards.s.Smoke.class)); + cards.add(new SetCardInfo("Sol Ring", 269, Rarity.UNCOMMON, mage.cards.s.SolRing.class)); + cards.add(new SetCardInfo("Soul Net", 270, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); + cards.add(new SetCardInfo("Spell Blast", 80, Rarity.COMMON, mage.cards.s.SpellBlast.class)); + cards.add(new SetCardInfo("Stasis", 81, Rarity.RARE, mage.cards.s.Stasis.class)); + cards.add(new SetCardInfo("Steal Artifact", 82, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); + cards.add(new SetCardInfo("Stone Giant", 177, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); + cards.add(new SetCardInfo("Stone Rain", 178, Rarity.COMMON, mage.cards.s.StoneRain.class)); + cards.add(new SetCardInfo("Stream of Life", 126, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); + cards.add(new SetCardInfo("Sunglasses of Urza", 271, Rarity.RARE, mage.cards.s.SunglassesOfUrza.class)); + cards.add(new SetCardInfo("Swamp", 290, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Swamp", 291, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Swords to Plowshares", 224, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); + cards.add(new SetCardInfo("Taiga", 292, Rarity.RARE, mage.cards.t.Taiga.class)); + cards.add(new SetCardInfo("Terror", 39, Rarity.COMMON, mage.cards.t.Terror.class)); + cards.add(new SetCardInfo("The Hive", 272, Rarity.RARE, mage.cards.t.TheHive.class)); + cards.add(new SetCardInfo("Thicket Basilisk", 127, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); + cards.add(new SetCardInfo("Thoughtlace", 83, Rarity.RARE, mage.cards.t.Thoughtlace.class)); + cards.add(new SetCardInfo("Throne of Bone", 273, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); + cards.add(new SetCardInfo("Timetwister", 85, Rarity.RARE, mage.cards.t.Timetwister.class)); + cards.add(new SetCardInfo("Time Vault", 274, Rarity.RARE, mage.cards.t.TimeVault.class)); + cards.add(new SetCardInfo("Time Walk", 84, Rarity.RARE, mage.cards.t.TimeWalk.class)); + cards.add(new SetCardInfo("Tranquility", 129, Rarity.COMMON, mage.cards.t.Tranquility.class)); + cards.add(new SetCardInfo("Tropical Island", 293, Rarity.RARE, mage.cards.t.TropicalIsland.class)); + cards.add(new SetCardInfo("Tsunami", 130, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); + cards.add(new SetCardInfo("Tundra", 294, Rarity.RARE, mage.cards.t.Tundra.class)); + cards.add(new SetCardInfo("Tunnel", 179, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); + cards.add(new SetCardInfo("Twiddle", 86, Rarity.COMMON, mage.cards.t.Twiddle.class)); + cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 180, Rarity.RARE, mage.cards.t.TwoHeadedGiantOfForiys.class)); + cards.add(new SetCardInfo("Underground Sea", 295, Rarity.RARE, mage.cards.u.UndergroundSea.class)); + cards.add(new SetCardInfo("Unholy Strength", 40, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); + cards.add(new SetCardInfo("Unsummon", 87, Rarity.COMMON, mage.cards.u.Unsummon.class)); + cards.add(new SetCardInfo("Uthden Troll", 181, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); + cards.add(new SetCardInfo("Verduran Enchantress", 131, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); + cards.add(new SetCardInfo("Vesuvan Doppelganger", 88, Rarity.RARE, mage.cards.v.VesuvanDoppelganger.class)); + cards.add(new SetCardInfo("Veteran Bodyguard", 225, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); + cards.add(new SetCardInfo("Volcanic Eruption", 89, Rarity.RARE, mage.cards.v.VolcanicEruption.class)); + cards.add(new SetCardInfo("Wall of Air", 90, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); + cards.add(new SetCardInfo("Wall of Bone", 41, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); + cards.add(new SetCardInfo("Wall of Brambles", 132, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); + cards.add(new SetCardInfo("Wall of Fire", 182, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); + cards.add(new SetCardInfo("Wall of Ice", 133, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); + cards.add(new SetCardInfo("Wall of Stone", 183, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); + cards.add(new SetCardInfo("Wall of Swords", 226, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); + cards.add(new SetCardInfo("Wall of Water", 91, Rarity.UNCOMMON, mage.cards.w.WallOfWater.class)); + cards.add(new SetCardInfo("Wall of Wood", 134, Rarity.COMMON, mage.cards.w.WallOfWood.class)); + cards.add(new SetCardInfo("Wanderlust", 135, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); + cards.add(new SetCardInfo("War Mammoth", 136, Rarity.COMMON, mage.cards.w.WarMammoth.class)); + cards.add(new SetCardInfo("Warp Artifact", 42, Rarity.RARE, mage.cards.w.WarpArtifact.class)); + cards.add(new SetCardInfo("Water Elemental", 92, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class)); + cards.add(new SetCardInfo("Weakness", 43, Rarity.COMMON, mage.cards.w.Weakness.class)); + cards.add(new SetCardInfo("Web", 137, Rarity.RARE, mage.cards.w.Web.class)); + cards.add(new SetCardInfo("Wheel of Fortune", 184, Rarity.RARE, mage.cards.w.WheelOfFortune.class)); + cards.add(new SetCardInfo("White Knight", 227, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); + cards.add(new SetCardInfo("White Ward", 228, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); + cards.add(new SetCardInfo("Wild Growth", 138, Rarity.COMMON, mage.cards.w.WildGrowth.class)); + cards.add(new SetCardInfo("Will-o'-the-Wisp", 44, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); + cards.add(new SetCardInfo("Winter Orb", 275, Rarity.RARE, mage.cards.w.WinterOrb.class)); + cards.add(new SetCardInfo("Wooden Sphere", 276, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); + cards.add(new SetCardInfo("Wrath of God", 229, Rarity.RARE, mage.cards.w.WrathOfGod.class)); + cards.add(new SetCardInfo("Zombie Master", 46, Rarity.RARE, mage.cards.z.ZombieMaster.class)); + } +} diff --git a/Mage.Sets/src/mage/sets/LimitedEditionBeta.java b/Mage.Sets/src/mage/sets/LimitedEditionBeta.java index c79fe5d381..a55fbd80d5 100644 --- a/Mage.Sets/src/mage/sets/LimitedEditionBeta.java +++ b/Mage.Sets/src/mage/sets/LimitedEditionBeta.java @@ -1,312 +1,313 @@ -package mage.sets; - -import mage.cards.CardGraphicInfo; -import mage.cards.ExpansionSet; -import mage.constants.Rarity; -import mage.constants.SetType; - -/** - * - * @author North - */ -public class LimitedEditionBeta extends ExpansionSet { - - private static final LimitedEditionBeta instance = new LimitedEditionBeta(); - - public static LimitedEditionBeta getInstance() { - return instance; - } - - private LimitedEditionBeta() { - super("Limited Edition Beta", "LEB", ExpansionSet.buildDate(1993, 10, 1), SetType.CORE); - this.hasBoosters = true; - this.numBoosterLands = 0; - this.numBoosterCommon = 11; - this.numBoosterUncommon = 3; - this.numBoosterRare = 1; - this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Air Elemental", 47, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); - cards.add(new SetCardInfo("Ancestral Recall", 48, Rarity.RARE, mage.cards.a.AncestralRecall.class)); - cards.add(new SetCardInfo("Animate Artifact", 49, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class)); - cards.add(new SetCardInfo("Animate Dead", 1, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); - cards.add(new SetCardInfo("Animate Wall", 186, Rarity.RARE, mage.cards.a.AnimateWall.class)); - cards.add(new SetCardInfo("Ankh of Mishra", 232, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); - cards.add(new SetCardInfo("Armageddon", 187, Rarity.RARE, mage.cards.a.Armageddon.class)); - cards.add(new SetCardInfo("Aspect of Wolf", 93, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); - cards.add(new SetCardInfo("Badlands", 139, Rarity.RARE, mage.cards.b.Badlands.class)); - cards.add(new SetCardInfo("Bad Moon", 2, Rarity.RARE, mage.cards.b.BadMoon.class)); - cards.add(new SetCardInfo("Balance", 188, Rarity.RARE, mage.cards.b.Balance.class)); - cards.add(new SetCardInfo("Basalt Monolith", 233, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class)); - cards.add(new SetCardInfo("Bayou", 279, Rarity.RARE, mage.cards.b.Bayou.class)); - cards.add(new SetCardInfo("Berserk", 94, Rarity.UNCOMMON, mage.cards.b.Berserk.class)); - cards.add(new SetCardInfo("Birds of Paradise", 95, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); - cards.add(new SetCardInfo("Black Knight", 3, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); - cards.add(new SetCardInfo("Black Lotus", 234, Rarity.RARE, mage.cards.b.BlackLotus.class)); - cards.add(new SetCardInfo("Black Vise", 235, Rarity.UNCOMMON, mage.cards.b.BlackVise.class)); - cards.add(new SetCardInfo("Black Ward", 190, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); - cards.add(new SetCardInfo("Blessing", 192, Rarity.RARE, mage.cards.b.Blessing.class)); - cards.add(new SetCardInfo("Blue Elemental Blast", 50, Rarity.COMMON, mage.cards.b.BlueElementalBlast.class)); - cards.add(new SetCardInfo("Blue Ward", 193, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); - cards.add(new SetCardInfo("Bog Wraith", 4, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); - cards.add(new SetCardInfo("Braingeyser", 51, Rarity.RARE, mage.cards.b.Braingeyser.class)); - cards.add(new SetCardInfo("Burrowing", 140, Rarity.UNCOMMON, mage.cards.b.Burrowing.class)); - cards.add(new SetCardInfo("Castle", 194, Rarity.UNCOMMON, mage.cards.c.Castle.class)); - cards.add(new SetCardInfo("Celestial Prism", 236, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); - cards.add(new SetCardInfo("Channel", 97, Rarity.UNCOMMON, mage.cards.c.Channel.class)); - cards.add(new SetCardInfo("Chaoslace", 141, Rarity.RARE, mage.cards.c.Chaoslace.class)); - cards.add(new SetCardInfo("Circle of Protection: Black", 195, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); - cards.add(new SetCardInfo("Circle of Protection: Blue", 196, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); - cards.add(new SetCardInfo("Circle of Protection: Green", 197, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); - cards.add(new SetCardInfo("Circle of Protection: Red", 198, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); - cards.add(new SetCardInfo("Circle of Protection: White", 199, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); - cards.add(new SetCardInfo("Clockwork Beast", 238, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); - cards.add(new SetCardInfo("Clone", 52, Rarity.UNCOMMON, mage.cards.c.Clone.class)); - cards.add(new SetCardInfo("Cockatrice", 98, Rarity.RARE, mage.cards.c.Cockatrice.class)); - cards.add(new SetCardInfo("Consecrate Land", 200, Rarity.UNCOMMON, mage.cards.c.ConsecrateLand.class)); - cards.add(new SetCardInfo("Conservator", 239, Rarity.UNCOMMON, mage.cards.c.Conservator.class)); - cards.add(new SetCardInfo("Control Magic", 53, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class)); - cards.add(new SetCardInfo("Conversion", 201, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); - cards.add(new SetCardInfo("Copper Tablet", 240, Rarity.UNCOMMON, mage.cards.c.CopperTablet.class)); - cards.add(new SetCardInfo("Copy Artifact", 54, Rarity.RARE, mage.cards.c.CopyArtifact.class)); - cards.add(new SetCardInfo("Counterspell", 55, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); - cards.add(new SetCardInfo("Craw Wurm", 99, Rarity.COMMON, mage.cards.c.CrawWurm.class)); - cards.add(new SetCardInfo("Creature Bond", 56, Rarity.COMMON, mage.cards.c.CreatureBond.class)); - cards.add(new SetCardInfo("Crusade", 202, Rarity.RARE, mage.cards.c.Crusade.class)); - cards.add(new SetCardInfo("Crystal Rod", 241, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); - cards.add(new SetCardInfo("Cursed Land", 6, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); - cards.add(new SetCardInfo("Cyclopean Tomb", 242, Rarity.RARE, mage.cards.c.CyclopeanTomb.class)); - cards.add(new SetCardInfo("Dark Ritual", 7, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("Deathgrip", 9, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); - cards.add(new SetCardInfo("Deathlace", 10, Rarity.RARE, mage.cards.d.Deathlace.class)); - cards.add(new SetCardInfo("Death Ward", 203, Rarity.COMMON, mage.cards.d.DeathWard.class)); - cards.add(new SetCardInfo("Demonic Hordes", 12, Rarity.RARE, mage.cards.d.DemonicHordes.class)); - cards.add(new SetCardInfo("Demonic Tutor", 13, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class)); - cards.add(new SetCardInfo("Dingus Egg", 243, Rarity.RARE, mage.cards.d.DingusEgg.class)); - cards.add(new SetCardInfo("Disenchant", 204, Rarity.COMMON, mage.cards.d.Disenchant.class)); - cards.add(new SetCardInfo("Disintegrate", 142, Rarity.COMMON, mage.cards.d.Disintegrate.class)); - cards.add(new SetCardInfo("Disrupting Scepter", 244, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); - cards.add(new SetCardInfo("Dragon Whelp", 143, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); - cards.add(new SetCardInfo("Drain Life", 14, Rarity.COMMON, mage.cards.d.DrainLife.class)); - cards.add(new SetCardInfo("Drudge Skeletons", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); - cards.add(new SetCardInfo("Dwarven Demolition Team", 144, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class)); - cards.add(new SetCardInfo("Dwarven Warriors", 145, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); - cards.add(new SetCardInfo("Earthbind", 146, Rarity.COMMON, mage.cards.e.Earthbind.class)); - cards.add(new SetCardInfo("Earth Elemental", 146, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); - cards.add(new SetCardInfo("Earthquake", 148, Rarity.RARE, mage.cards.e.Earthquake.class)); - cards.add(new SetCardInfo("Elvish Archers", 100, Rarity.RARE, mage.cards.e.ElvishArchers.class)); - cards.add(new SetCardInfo("Evil Presence", 16, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); - cards.add(new SetCardInfo("Farmstead", 205, Rarity.RARE, mage.cards.f.Farmstead.class)); - cards.add(new SetCardInfo("Fastbond", 101, Rarity.RARE, mage.cards.f.Fastbond.class)); - cards.add(new SetCardInfo("Fear", 17, Rarity.COMMON, mage.cards.f.Fear.class)); - cards.add(new SetCardInfo("Feedback", 58, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); - cards.add(new SetCardInfo("Fireball", 151, Rarity.COMMON, mage.cards.f.Fireball.class)); - cards.add(new SetCardInfo("Firebreathing", 152, Rarity.COMMON, mage.cards.f.Firebreathing.class)); - cards.add(new SetCardInfo("Fire Elemental", 150, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); - cards.add(new SetCardInfo("Flashfires", 153, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); - cards.add(new SetCardInfo("Flight", 59, Rarity.COMMON, mage.cards.f.Flight.class)); - cards.add(new SetCardInfo("Fog", 102, Rarity.COMMON, mage.cards.f.Fog.class)); - cards.add(new SetCardInfo("Forcefield", 245, Rarity.RARE, mage.cards.f.Forcefield.class)); - cards.add(new SetCardInfo("Force of Nature", 103, Rarity.RARE, mage.cards.f.ForceOfNature.class)); - cards.add(new SetCardInfo("Forest", 280, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Forest", 281, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Forest", 282, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Fork", 154, Rarity.RARE, mage.cards.f.Fork.class)); - cards.add(new SetCardInfo("Frozen Shade", 18, Rarity.COMMON, mage.cards.f.FrozenShade.class)); - cards.add(new SetCardInfo("Fungusaur", 104, Rarity.RARE, mage.cards.f.Fungusaur.class)); - cards.add(new SetCardInfo("Gaea's Liege", 105, Rarity.RARE, mage.cards.g.GaeasLiege.class)); - cards.add(new SetCardInfo("Gauntlet of Might", 246, Rarity.RARE, mage.cards.g.GauntletOfMight.class)); - cards.add(new SetCardInfo("Giant Growth", 106, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); - cards.add(new SetCardInfo("Giant Spider", 107, Rarity.COMMON, mage.cards.g.GiantSpider.class)); - cards.add(new SetCardInfo("Glasses of Urza", 247, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); - cards.add(new SetCardInfo("Gloom", 19, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); - cards.add(new SetCardInfo("Goblin Balloon Brigade", 155, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class)); - cards.add(new SetCardInfo("Goblin King", 156, Rarity.RARE, mage.cards.g.GoblinKing.class)); - cards.add(new SetCardInfo("Granite Gargoyle", 157, Rarity.RARE, mage.cards.g.GraniteGargoyle.class)); - cards.add(new SetCardInfo("Gray Ogre", 158, Rarity.COMMON, mage.cards.g.GrayOgre.class)); - cards.add(new SetCardInfo("Green Ward", 206, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); - cards.add(new SetCardInfo("Grizzly Bears", 108, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); - cards.add(new SetCardInfo("Guardian Angel", 207, Rarity.COMMON, mage.cards.g.GuardianAngel.class)); - cards.add(new SetCardInfo("Healing Salve", 208, Rarity.COMMON, mage.cards.h.HealingSalve.class)); - cards.add(new SetCardInfo("Hill Giant", 159, Rarity.COMMON, mage.cards.h.HillGiant.class)); - cards.add(new SetCardInfo("Holy Armor", 209, Rarity.COMMON, mage.cards.h.HolyArmor.class)); - cards.add(new SetCardInfo("Holy Strength", 210, Rarity.COMMON, mage.cards.h.HolyStrength.class)); - cards.add(new SetCardInfo("Howl from Beyond", 20, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); - cards.add(new SetCardInfo("Howling Mine", 249, Rarity.RARE, mage.cards.h.HowlingMine.class)); - cards.add(new SetCardInfo("Hurloon Minotaur", 160, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); - cards.add(new SetCardInfo("Hurricane", 109, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); - cards.add(new SetCardInfo("Hypnotic Specter", 21, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); - cards.add(new SetCardInfo("Ice Storm", 110, Rarity.UNCOMMON, mage.cards.i.IceStorm.class)); - cards.add(new SetCardInfo("Icy Manipulator", 250, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); - cards.add(new SetCardInfo("Instill Energy", 111, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); - cards.add(new SetCardInfo("Invisibility", 60, Rarity.COMMON, mage.cards.i.Invisibility.class)); - cards.add(new SetCardInfo("Ironclaw Orcs", 161, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); - cards.add(new SetCardInfo("Ironroot Treefolk", 112, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); - cards.add(new SetCardInfo("Iron Star", 252, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); - cards.add(new SetCardInfo("Island", 283, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Island", 284, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Island", 285, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Island Sanctuary", 211, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); - cards.add(new SetCardInfo("Ivory Cup", 253, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); - cards.add(new SetCardInfo("Jade Monolith", 254, Rarity.RARE, mage.cards.j.JadeMonolith.class)); - cards.add(new SetCardInfo("Jade Statue", 255, Rarity.UNCOMMON, mage.cards.j.JadeStatue.class)); - cards.add(new SetCardInfo("Jayemdae Tome", 256, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); - cards.add(new SetCardInfo("Juggernaut", 257, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class)); - cards.add(new SetCardInfo("Jump", 61, Rarity.COMMON, mage.cards.j.Jump.class)); - cards.add(new SetCardInfo("Karma", 212, Rarity.UNCOMMON, mage.cards.k.Karma.class)); - cards.add(new SetCardInfo("Keldon Warlord", 162, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); - cards.add(new SetCardInfo("Kormus Bell", 258, Rarity.RARE, mage.cards.k.KormusBell.class)); - cards.add(new SetCardInfo("Lance", 213, Rarity.UNCOMMON, mage.cards.l.Lance.class)); - cards.add(new SetCardInfo("Ley Druid", 114, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); - cards.add(new SetCardInfo("Library of Leng", 259, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); - cards.add(new SetCardInfo("Lich", 22, Rarity.RARE, mage.cards.l.Lich.class)); - cards.add(new SetCardInfo("Lifeforce", 115, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); - cards.add(new SetCardInfo("Lifelace", 116, Rarity.RARE, mage.cards.l.Lifelace.class)); - cards.add(new SetCardInfo("Lifetap", 62, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); - cards.add(new SetCardInfo("Lightning Bolt", 163, Rarity.COMMON, mage.cards.l.LightningBolt.class)); - cards.add(new SetCardInfo("Living Artifact", 117, Rarity.RARE, mage.cards.l.LivingArtifact.class)); - cards.add(new SetCardInfo("Living Lands", 118, Rarity.RARE, mage.cards.l.LivingLands.class)); - cards.add(new SetCardInfo("Living Wall", 260, Rarity.UNCOMMON, mage.cards.l.LivingWall.class)); - cards.add(new SetCardInfo("Llanowar Elves", 119, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); - cards.add(new SetCardInfo("Lord of Atlantis", 63, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); - cards.add(new SetCardInfo("Lord of the Pit", 23, Rarity.RARE, mage.cards.l.LordOfThePit.class)); - cards.add(new SetCardInfo("Lure", 120, Rarity.UNCOMMON, mage.cards.l.Lure.class)); - cards.add(new SetCardInfo("Mahamoti Djinn", 65, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); - cards.add(new SetCardInfo("Manabarbs", 165, Rarity.RARE, mage.cards.m.Manabarbs.class)); - cards.add(new SetCardInfo("Mana Flare", 164, Rarity.RARE, mage.cards.m.ManaFlare.class)); - cards.add(new SetCardInfo("Mana Short", 66, Rarity.RARE, mage.cards.m.ManaShort.class)); - cards.add(new SetCardInfo("Mana Vault", 261, Rarity.RARE, mage.cards.m.ManaVault.class)); - cards.add(new SetCardInfo("Meekstone", 262, Rarity.RARE, mage.cards.m.Meekstone.class)); - cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 67, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); - cards.add(new SetCardInfo("Mind Twist", 24, Rarity.RARE, mage.cards.m.MindTwist.class)); - cards.add(new SetCardInfo("Mons's Goblin Raiders", 166, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); - cards.add(new SetCardInfo("Mountain", 286, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Mountain", 287, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Mountain", 288, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Mox Emerald", 263, Rarity.RARE, mage.cards.m.MoxEmerald.class)); - cards.add(new SetCardInfo("Mox Jet", 264, Rarity.RARE, mage.cards.m.MoxJet.class)); - cards.add(new SetCardInfo("Mox Pearl", 265, Rarity.RARE, mage.cards.m.MoxPearl.class)); - cards.add(new SetCardInfo("Mox Ruby", 266, Rarity.RARE, mage.cards.m.MoxRuby.class)); - cards.add(new SetCardInfo("Mox Sapphire", 267, Rarity.RARE, mage.cards.m.MoxSapphire.class)); - cards.add(new SetCardInfo("Natural Selection", 121, Rarity.RARE, mage.cards.n.NaturalSelection.class)); - cards.add(new SetCardInfo("Nether Shadow", 25, Rarity.RARE, mage.cards.n.NetherShadow.class)); - cards.add(new SetCardInfo("Nettling Imp", 26, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class)); - cards.add(new SetCardInfo("Nevinyrral's Disk", 268, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); - cards.add(new SetCardInfo("Nightmare", 27, Rarity.RARE, mage.cards.n.Nightmare.class)); - cards.add(new SetCardInfo("Northern Paladin", 215, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); - cards.add(new SetCardInfo("Obsianus Golem", 269, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class)); - cards.add(new SetCardInfo("Orcish Artillery", 167, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); - cards.add(new SetCardInfo("Orcish Oriflamme", 168, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); - cards.add(new SetCardInfo("Paralyze", 28, Rarity.COMMON, mage.cards.p.Paralyze.class)); - cards.add(new SetCardInfo("Pearled Unicorn", 216, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); - cards.add(new SetCardInfo("Personal Incarnation", 217, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); - cards.add(new SetCardInfo("Pestilence", 29, Rarity.COMMON, mage.cards.p.Pestilence.class)); - cards.add(new SetCardInfo("Phantasmal Forces", 68, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); - cards.add(new SetCardInfo("Phantasmal Terrain", 69, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); - cards.add(new SetCardInfo("Phantom Monster", 70, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); - cards.add(new SetCardInfo("Pirate Ship", 71, Rarity.RARE, mage.cards.p.PirateShip.class)); - cards.add(new SetCardInfo("Plague Rats", 30, Rarity.COMMON, mage.cards.p.PlagueRats.class)); - cards.add(new SetCardInfo("Plains", 289, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Plains", 290, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Plains", 291, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Plateau", 292, Rarity.RARE, mage.cards.p.Plateau.class)); - cards.add(new SetCardInfo("Power Sink", 73, Rarity.COMMON, mage.cards.p.PowerSink.class)); - cards.add(new SetCardInfo("Power Surge", 169, Rarity.RARE, mage.cards.p.PowerSurge.class)); - cards.add(new SetCardInfo("Prodigal Sorcerer", 74, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); - cards.add(new SetCardInfo("Psionic Blast", 75, Rarity.UNCOMMON, mage.cards.p.PsionicBlast.class)); - cards.add(new SetCardInfo("Psychic Venom", 76, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); - cards.add(new SetCardInfo("Purelace", 218, Rarity.RARE, mage.cards.p.Purelace.class)); - cards.add(new SetCardInfo("Raise Dead", 31, Rarity.COMMON, mage.cards.r.RaiseDead.class)); - cards.add(new SetCardInfo("Red Elemental Blast", 171, Rarity.COMMON, mage.cards.r.RedElementalBlast.class)); - cards.add(new SetCardInfo("Red Ward", 219, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); - cards.add(new SetCardInfo("Regeneration", 122, Rarity.COMMON, mage.cards.r.Regeneration.class)); - cards.add(new SetCardInfo("Regrowth", 123, Rarity.UNCOMMON, mage.cards.r.Regrowth.class)); - cards.add(new SetCardInfo("Resurrection", 220, Rarity.UNCOMMON, mage.cards.r.Resurrection.class)); - cards.add(new SetCardInfo("Reverse Damage", 221, Rarity.RARE, mage.cards.r.ReverseDamage.class)); - cards.add(new SetCardInfo("Righteousness", 222, Rarity.RARE, mage.cards.r.Righteousness.class)); - cards.add(new SetCardInfo("Roc of Kher Ridges", 172, Rarity.RARE, mage.cards.r.RocOfKherRidges.class)); - cards.add(new SetCardInfo("Rock Hydra", 173, Rarity.RARE, mage.cards.r.RockHydra.class)); - cards.add(new SetCardInfo("Rod of Ruin", 270, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); - cards.add(new SetCardInfo("Royal Assassin", 32, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); - cards.add(new SetCardInfo("Sacrifice", 33, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class)); - cards.add(new SetCardInfo("Samite Healer", 223, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); - cards.add(new SetCardInfo("Savannah", 293, Rarity.RARE, mage.cards.s.Savannah.class)); - cards.add(new SetCardInfo("Savannah Lions", 224, Rarity.RARE, mage.cards.s.SavannahLions.class)); - cards.add(new SetCardInfo("Scathe Zombies", 34, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); - cards.add(new SetCardInfo("Scavenging Ghoul", 35, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); - cards.add(new SetCardInfo("Scrubland", 294, Rarity.RARE, mage.cards.s.Scrubland.class)); - cards.add(new SetCardInfo("Scryb Sprites", 124, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); - cards.add(new SetCardInfo("Sea Serpent", 77, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); - cards.add(new SetCardInfo("Sedge Troll", 174, Rarity.RARE, mage.cards.s.SedgeTroll.class)); - cards.add(new SetCardInfo("Sengir Vampire", 36, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); - cards.add(new SetCardInfo("Serra Angel", 225, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); - cards.add(new SetCardInfo("Shanodin Dryads", 125, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); - cards.add(new SetCardInfo("Shatter", 175, Rarity.COMMON, mage.cards.s.Shatter.class)); - cards.add(new SetCardInfo("Shivan Dragon", 176, Rarity.RARE, mage.cards.s.ShivanDragon.class)); - cards.add(new SetCardInfo("Simulacrum", 37, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); - cards.add(new SetCardInfo("Sinkhole", 38, Rarity.COMMON, mage.cards.s.Sinkhole.class)); - cards.add(new SetCardInfo("Siren's Call", 78, Rarity.UNCOMMON, mage.cards.s.SirensCall.class)); - cards.add(new SetCardInfo("Smoke", 177, Rarity.RARE, mage.cards.s.Smoke.class)); - cards.add(new SetCardInfo("Sol Ring", 271, Rarity.UNCOMMON, mage.cards.s.SolRing.class)); - cards.add(new SetCardInfo("Soul Net", 272, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); - cards.add(new SetCardInfo("Spell Blast", 80, Rarity.COMMON, mage.cards.s.SpellBlast.class)); - cards.add(new SetCardInfo("Stasis", 81, Rarity.RARE, mage.cards.s.Stasis.class)); - cards.add(new SetCardInfo("Steal Artifact", 82, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); - cards.add(new SetCardInfo("Stone Giant", 178, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); - cards.add(new SetCardInfo("Stone Rain", 179, Rarity.COMMON, mage.cards.s.StoneRain.class)); - cards.add(new SetCardInfo("Stream of Life", 126, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); - cards.add(new SetCardInfo("Sunglasses of Urza", 273, Rarity.RARE, mage.cards.s.SunglassesOfUrza.class)); - cards.add(new SetCardInfo("Swamp", 295, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Swamp", 296, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Swamp", 297, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); - cards.add(new SetCardInfo("Swords to Plowshares", 226, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); - cards.add(new SetCardInfo("Taiga", 298, Rarity.RARE, mage.cards.t.Taiga.class)); - cards.add(new SetCardInfo("Terror", 39, Rarity.COMMON, mage.cards.t.Terror.class)); - cards.add(new SetCardInfo("The Hive", 274, Rarity.RARE, mage.cards.t.TheHive.class)); - cards.add(new SetCardInfo("Thicket Basilisk", 127, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); - cards.add(new SetCardInfo("Thoughtlace", 83, Rarity.RARE, mage.cards.t.Thoughtlace.class)); - cards.add(new SetCardInfo("Throne of Bone", 275, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); - cards.add(new SetCardInfo("Timetwister", 85, Rarity.RARE, mage.cards.t.Timetwister.class)); - cards.add(new SetCardInfo("Time Vault", 276, Rarity.RARE, mage.cards.t.TimeVault.class)); - cards.add(new SetCardInfo("Time Walk", 84, Rarity.RARE, mage.cards.t.TimeWalk.class)); - cards.add(new SetCardInfo("Tranquility", 129, Rarity.COMMON, mage.cards.t.Tranquility.class)); - cards.add(new SetCardInfo("Tropical Island", 299, Rarity.RARE, mage.cards.t.TropicalIsland.class)); - cards.add(new SetCardInfo("Tsunami", 130, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); - cards.add(new SetCardInfo("Tundra", 300, Rarity.RARE, mage.cards.t.Tundra.class)); - cards.add(new SetCardInfo("Tunnel", 180, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); - cards.add(new SetCardInfo("Twiddle", 86, Rarity.COMMON, mage.cards.t.Twiddle.class)); - cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 181, Rarity.RARE, mage.cards.t.TwoHeadedGiantOfForiys.class)); - cards.add(new SetCardInfo("Underground Sea", 301, Rarity.RARE, mage.cards.u.UndergroundSea.class)); - cards.add(new SetCardInfo("Unholy Strength", 40, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); - cards.add(new SetCardInfo("Unsummon", 87, Rarity.COMMON, mage.cards.u.Unsummon.class)); - cards.add(new SetCardInfo("Uthden Troll", 182, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); - cards.add(new SetCardInfo("Verduran Enchantress", 131, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); - cards.add(new SetCardInfo("Vesuvan Doppelganger", 88, Rarity.RARE, mage.cards.v.VesuvanDoppelganger.class)); - cards.add(new SetCardInfo("Veteran Bodyguard", 227, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); - cards.add(new SetCardInfo("Volcanic Eruption", 89, Rarity.RARE, mage.cards.v.VolcanicEruption.class)); - cards.add(new SetCardInfo("Volcanic Island", 302, Rarity.RARE, mage.cards.v.VolcanicIsland.class)); - cards.add(new SetCardInfo("Wall of Air", 90, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); - cards.add(new SetCardInfo("Wall of Bone", 41, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); - cards.add(new SetCardInfo("Wall of Brambles", 132, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); - cards.add(new SetCardInfo("Wall of Fire", 183, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); - cards.add(new SetCardInfo("Wall of Ice", 133, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); - cards.add(new SetCardInfo("Wall of Stone", 184, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); - cards.add(new SetCardInfo("Wall of Swords", 228, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); - cards.add(new SetCardInfo("Wall of Water", 91, Rarity.UNCOMMON, mage.cards.w.WallOfWater.class)); - cards.add(new SetCardInfo("Wall of Wood", 134, Rarity.COMMON, mage.cards.w.WallOfWood.class)); - cards.add(new SetCardInfo("Wanderlust", 135, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); - cards.add(new SetCardInfo("War Mammoth", 136, Rarity.COMMON, mage.cards.w.WarMammoth.class)); - cards.add(new SetCardInfo("Warp Artifact", 42, Rarity.RARE, mage.cards.w.WarpArtifact.class)); - cards.add(new SetCardInfo("Water Elemental", 92, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class)); - cards.add(new SetCardInfo("Weakness", 43, Rarity.COMMON, mage.cards.w.Weakness.class)); - cards.add(new SetCardInfo("Web", 137, Rarity.RARE, mage.cards.w.Web.class)); - cards.add(new SetCardInfo("Wheel of Fortune", 185, Rarity.RARE, mage.cards.w.WheelOfFortune.class)); - cards.add(new SetCardInfo("White Knight", 229, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); - cards.add(new SetCardInfo("White Ward", 230, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); - cards.add(new SetCardInfo("Wild Growth", 138, Rarity.COMMON, mage.cards.w.WildGrowth.class)); - cards.add(new SetCardInfo("Will-o'-the-Wisp", 44, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); - cards.add(new SetCardInfo("Winter Orb", 277, Rarity.RARE, mage.cards.w.WinterOrb.class)); - cards.add(new SetCardInfo("Wooden Sphere", 278, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); - cards.add(new SetCardInfo("Wrath of God", 231, Rarity.RARE, mage.cards.w.WrathOfGod.class)); - cards.add(new SetCardInfo("Zombie Master", 46, Rarity.RARE, mage.cards.z.ZombieMaster.class)); - } -} +package mage.sets; + +import mage.cards.CardGraphicInfo; +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * + * @author North + */ +public class LimitedEditionBeta extends ExpansionSet { + + private static final LimitedEditionBeta instance = new LimitedEditionBeta(); + + public static LimitedEditionBeta getInstance() { + return instance; + } + + private LimitedEditionBeta() { + super("Limited Edition Beta", "LEB", ExpansionSet.buildDate(1993, 10, 1), SetType.CORE); + this.hasBoosters = true; + this.numBoosterLands = 0; + this.numBoosterCommon = 11; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Air Elemental", 47, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); + cards.add(new SetCardInfo("Ancestral Recall", 48, Rarity.RARE, mage.cards.a.AncestralRecall.class)); + cards.add(new SetCardInfo("Animate Artifact", 49, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class)); + cards.add(new SetCardInfo("Animate Dead", 1, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); + cards.add(new SetCardInfo("Animate Wall", 186, Rarity.RARE, mage.cards.a.AnimateWall.class)); + cards.add(new SetCardInfo("Ankh of Mishra", 232, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); + cards.add(new SetCardInfo("Armageddon", 187, Rarity.RARE, mage.cards.a.Armageddon.class)); + cards.add(new SetCardInfo("Aspect of Wolf", 93, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); + cards.add(new SetCardInfo("Badlands", 139, Rarity.RARE, mage.cards.b.Badlands.class)); + cards.add(new SetCardInfo("Bad Moon", 2, Rarity.RARE, mage.cards.b.BadMoon.class)); + cards.add(new SetCardInfo("Balance", 188, Rarity.RARE, mage.cards.b.Balance.class)); + cards.add(new SetCardInfo("Basalt Monolith", 233, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class)); + cards.add(new SetCardInfo("Bayou", 279, Rarity.RARE, mage.cards.b.Bayou.class)); + cards.add(new SetCardInfo("Berserk", 94, Rarity.UNCOMMON, mage.cards.b.Berserk.class)); + cards.add(new SetCardInfo("Birds of Paradise", 95, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); + cards.add(new SetCardInfo("Black Knight", 3, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); + cards.add(new SetCardInfo("Black Lotus", 234, Rarity.RARE, mage.cards.b.BlackLotus.class)); + cards.add(new SetCardInfo("Black Vise", 235, Rarity.UNCOMMON, mage.cards.b.BlackVise.class)); + cards.add(new SetCardInfo("Black Ward", 190, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); + cards.add(new SetCardInfo("Blessing", 192, Rarity.RARE, mage.cards.b.Blessing.class)); + cards.add(new SetCardInfo("Blue Elemental Blast", 50, Rarity.COMMON, mage.cards.b.BlueElementalBlast.class)); + cards.add(new SetCardInfo("Blue Ward", 193, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); + cards.add(new SetCardInfo("Bog Wraith", 4, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); + cards.add(new SetCardInfo("Braingeyser", 51, Rarity.RARE, mage.cards.b.Braingeyser.class)); + cards.add(new SetCardInfo("Burrowing", 140, Rarity.UNCOMMON, mage.cards.b.Burrowing.class)); + cards.add(new SetCardInfo("Castle", 194, Rarity.UNCOMMON, mage.cards.c.Castle.class)); + cards.add(new SetCardInfo("Celestial Prism", 236, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); + cards.add(new SetCardInfo("Channel", 97, Rarity.UNCOMMON, mage.cards.c.Channel.class)); + cards.add(new SetCardInfo("Chaoslace", 141, Rarity.RARE, mage.cards.c.Chaoslace.class)); + cards.add(new SetCardInfo("Circle of Protection: Black", 195, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); + cards.add(new SetCardInfo("Circle of Protection: Blue", 196, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); + cards.add(new SetCardInfo("Circle of Protection: Green", 197, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); + cards.add(new SetCardInfo("Circle of Protection: Red", 198, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); + cards.add(new SetCardInfo("Circle of Protection: White", 199, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); + cards.add(new SetCardInfo("Clockwork Beast", 238, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); + cards.add(new SetCardInfo("Clone", 52, Rarity.UNCOMMON, mage.cards.c.Clone.class)); + cards.add(new SetCardInfo("Cockatrice", 98, Rarity.RARE, mage.cards.c.Cockatrice.class)); + cards.add(new SetCardInfo("Consecrate Land", 200, Rarity.UNCOMMON, mage.cards.c.ConsecrateLand.class)); + cards.add(new SetCardInfo("Conservator", 239, Rarity.UNCOMMON, mage.cards.c.Conservator.class)); + cards.add(new SetCardInfo("Control Magic", 53, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class)); + cards.add(new SetCardInfo("Conversion", 201, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); + cards.add(new SetCardInfo("Copper Tablet", 240, Rarity.UNCOMMON, mage.cards.c.CopperTablet.class)); + cards.add(new SetCardInfo("Copy Artifact", 54, Rarity.RARE, mage.cards.c.CopyArtifact.class)); + cards.add(new SetCardInfo("Counterspell", 55, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); + cards.add(new SetCardInfo("Craw Wurm", 99, Rarity.COMMON, mage.cards.c.CrawWurm.class)); + cards.add(new SetCardInfo("Creature Bond", 56, Rarity.COMMON, mage.cards.c.CreatureBond.class)); + cards.add(new SetCardInfo("Crusade", 202, Rarity.RARE, mage.cards.c.Crusade.class)); + cards.add(new SetCardInfo("Crystal Rod", 241, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); + cards.add(new SetCardInfo("Cursed Land", 6, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); + cards.add(new SetCardInfo("Cyclopean Tomb", 242, Rarity.RARE, mage.cards.c.CyclopeanTomb.class)); + cards.add(new SetCardInfo("Dark Ritual", 7, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("Deathgrip", 9, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); + cards.add(new SetCardInfo("Deathlace", 10, Rarity.RARE, mage.cards.d.Deathlace.class)); + cards.add(new SetCardInfo("Death Ward", 203, Rarity.COMMON, mage.cards.d.DeathWard.class)); + cards.add(new SetCardInfo("Demonic Hordes", 12, Rarity.RARE, mage.cards.d.DemonicHordes.class)); + cards.add(new SetCardInfo("Demonic Tutor", 13, Rarity.UNCOMMON, mage.cards.d.DemonicTutor.class)); + cards.add(new SetCardInfo("Dingus Egg", 243, Rarity.RARE, mage.cards.d.DingusEgg.class)); + cards.add(new SetCardInfo("Disenchant", 204, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Disintegrate", 142, Rarity.COMMON, mage.cards.d.Disintegrate.class)); + cards.add(new SetCardInfo("Disrupting Scepter", 244, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); + cards.add(new SetCardInfo("Dragon Whelp", 143, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); + cards.add(new SetCardInfo("Drain Life", 14, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drudge Skeletons", 15, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); + cards.add(new SetCardInfo("Dwarven Demolition Team", 144, Rarity.UNCOMMON, mage.cards.d.DwarvenDemolitionTeam.class)); + cards.add(new SetCardInfo("Dwarven Warriors", 145, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); + cards.add(new SetCardInfo("Earthbind", 146, Rarity.COMMON, mage.cards.e.Earthbind.class)); + cards.add(new SetCardInfo("Earth Elemental", 146, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); + cards.add(new SetCardInfo("Earthquake", 148, Rarity.RARE, mage.cards.e.Earthquake.class)); + cards.add(new SetCardInfo("Elvish Archers", 100, Rarity.RARE, mage.cards.e.ElvishArchers.class)); + cards.add(new SetCardInfo("Evil Presence", 16, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); + cards.add(new SetCardInfo("Farmstead", 205, Rarity.RARE, mage.cards.f.Farmstead.class)); + cards.add(new SetCardInfo("Fastbond", 101, Rarity.RARE, mage.cards.f.Fastbond.class)); + cards.add(new SetCardInfo("Fear", 17, Rarity.COMMON, mage.cards.f.Fear.class)); + cards.add(new SetCardInfo("Feedback", 58, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); + cards.add(new SetCardInfo("Fireball", 151, Rarity.COMMON, mage.cards.f.Fireball.class)); + cards.add(new SetCardInfo("Firebreathing", 152, Rarity.COMMON, mage.cards.f.Firebreathing.class)); + cards.add(new SetCardInfo("Fire Elemental", 150, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); + cards.add(new SetCardInfo("Flashfires", 153, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); + cards.add(new SetCardInfo("Flight", 59, Rarity.COMMON, mage.cards.f.Flight.class)); + cards.add(new SetCardInfo("Fog", 102, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Forcefield", 245, Rarity.RARE, mage.cards.f.Forcefield.class)); + cards.add(new SetCardInfo("Force of Nature", 103, Rarity.RARE, mage.cards.f.ForceOfNature.class)); + cards.add(new SetCardInfo("Forest", 280, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Forest", 281, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Forest", 282, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Fork", 154, Rarity.RARE, mage.cards.f.Fork.class)); + cards.add(new SetCardInfo("Frozen Shade", 18, Rarity.COMMON, mage.cards.f.FrozenShade.class)); + cards.add(new SetCardInfo("Fungusaur", 104, Rarity.RARE, mage.cards.f.Fungusaur.class)); + cards.add(new SetCardInfo("Gaea's Liege", 105, Rarity.RARE, mage.cards.g.GaeasLiege.class)); + cards.add(new SetCardInfo("Gauntlet of Might", 246, Rarity.RARE, mage.cards.g.GauntletOfMight.class)); + cards.add(new SetCardInfo("Giant Growth", 106, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Spider", 107, Rarity.COMMON, mage.cards.g.GiantSpider.class)); + cards.add(new SetCardInfo("Glasses of Urza", 247, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); + cards.add(new SetCardInfo("Gloom", 19, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); + cards.add(new SetCardInfo("Goblin Balloon Brigade", 155, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class)); + cards.add(new SetCardInfo("Goblin King", 156, Rarity.RARE, mage.cards.g.GoblinKing.class)); + cards.add(new SetCardInfo("Granite Gargoyle", 157, Rarity.RARE, mage.cards.g.GraniteGargoyle.class)); + cards.add(new SetCardInfo("Gray Ogre", 158, Rarity.COMMON, mage.cards.g.GrayOgre.class)); + cards.add(new SetCardInfo("Green Ward", 206, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); + cards.add(new SetCardInfo("Grizzly Bears", 108, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); + cards.add(new SetCardInfo("Guardian Angel", 207, Rarity.COMMON, mage.cards.g.GuardianAngel.class)); + cards.add(new SetCardInfo("Healing Salve", 208, Rarity.COMMON, mage.cards.h.HealingSalve.class)); + cards.add(new SetCardInfo("Hill Giant", 159, Rarity.COMMON, mage.cards.h.HillGiant.class)); + cards.add(new SetCardInfo("Holy Armor", 209, Rarity.COMMON, mage.cards.h.HolyArmor.class)); + cards.add(new SetCardInfo("Holy Strength", 210, Rarity.COMMON, mage.cards.h.HolyStrength.class)); + cards.add(new SetCardInfo("Howl from Beyond", 20, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); + cards.add(new SetCardInfo("Howling Mine", 249, Rarity.RARE, mage.cards.h.HowlingMine.class)); + cards.add(new SetCardInfo("Hurloon Minotaur", 160, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); + cards.add(new SetCardInfo("Hurricane", 109, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); + cards.add(new SetCardInfo("Hypnotic Specter", 21, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); + cards.add(new SetCardInfo("Ice Storm", 110, Rarity.UNCOMMON, mage.cards.i.IceStorm.class)); + cards.add(new SetCardInfo("Icy Manipulator", 250, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); + cards.add(new SetCardInfo("Instill Energy", 111, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); + cards.add(new SetCardInfo("Invisibility", 60, Rarity.COMMON, mage.cards.i.Invisibility.class)); + cards.add(new SetCardInfo("Ironclaw Orcs", 161, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); + cards.add(new SetCardInfo("Ironroot Treefolk", 112, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); + cards.add(new SetCardInfo("Iron Star", 252, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); + cards.add(new SetCardInfo("Island", 283, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Island", 284, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Island", 285, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Island Sanctuary", 211, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Ivory Cup", 253, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); + cards.add(new SetCardInfo("Jade Monolith", 254, Rarity.RARE, mage.cards.j.JadeMonolith.class)); + cards.add(new SetCardInfo("Jade Statue", 255, Rarity.UNCOMMON, mage.cards.j.JadeStatue.class)); + cards.add(new SetCardInfo("Jayemdae Tome", 256, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); + cards.add(new SetCardInfo("Juggernaut", 257, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class)); + cards.add(new SetCardInfo("Jump", 61, Rarity.COMMON, mage.cards.j.Jump.class)); + cards.add(new SetCardInfo("Karma", 212, Rarity.UNCOMMON, mage.cards.k.Karma.class)); + cards.add(new SetCardInfo("Keldon Warlord", 162, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); + cards.add(new SetCardInfo("Kormus Bell", 258, Rarity.RARE, mage.cards.k.KormusBell.class)); + cards.add(new SetCardInfo("Kudzu", 113, Rarity.RARE, mage.cards.k.Kudzu.class)); + cards.add(new SetCardInfo("Lance", 213, Rarity.UNCOMMON, mage.cards.l.Lance.class)); + cards.add(new SetCardInfo("Ley Druid", 114, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); + cards.add(new SetCardInfo("Library of Leng", 259, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); + cards.add(new SetCardInfo("Lich", 22, Rarity.RARE, mage.cards.l.Lich.class)); + cards.add(new SetCardInfo("Lifeforce", 115, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); + cards.add(new SetCardInfo("Lifelace", 116, Rarity.RARE, mage.cards.l.Lifelace.class)); + cards.add(new SetCardInfo("Lifetap", 62, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); + cards.add(new SetCardInfo("Lightning Bolt", 163, Rarity.COMMON, mage.cards.l.LightningBolt.class)); + cards.add(new SetCardInfo("Living Artifact", 117, Rarity.RARE, mage.cards.l.LivingArtifact.class)); + cards.add(new SetCardInfo("Living Lands", 118, Rarity.RARE, mage.cards.l.LivingLands.class)); + cards.add(new SetCardInfo("Living Wall", 260, Rarity.UNCOMMON, mage.cards.l.LivingWall.class)); + cards.add(new SetCardInfo("Llanowar Elves", 119, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); + cards.add(new SetCardInfo("Lord of Atlantis", 63, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); + cards.add(new SetCardInfo("Lord of the Pit", 23, Rarity.RARE, mage.cards.l.LordOfThePit.class)); + cards.add(new SetCardInfo("Lure", 120, Rarity.UNCOMMON, mage.cards.l.Lure.class)); + cards.add(new SetCardInfo("Mahamoti Djinn", 65, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); + cards.add(new SetCardInfo("Manabarbs", 165, Rarity.RARE, mage.cards.m.Manabarbs.class)); + cards.add(new SetCardInfo("Mana Flare", 164, Rarity.RARE, mage.cards.m.ManaFlare.class)); + cards.add(new SetCardInfo("Mana Short", 66, Rarity.RARE, mage.cards.m.ManaShort.class)); + cards.add(new SetCardInfo("Mana Vault", 261, Rarity.RARE, mage.cards.m.ManaVault.class)); + cards.add(new SetCardInfo("Meekstone", 262, Rarity.RARE, mage.cards.m.Meekstone.class)); + cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 67, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); + cards.add(new SetCardInfo("Mind Twist", 24, Rarity.RARE, mage.cards.m.MindTwist.class)); + cards.add(new SetCardInfo("Mons's Goblin Raiders", 166, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); + cards.add(new SetCardInfo("Mountain", 286, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Mountain", 287, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Mountain", 288, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Mox Emerald", 263, Rarity.RARE, mage.cards.m.MoxEmerald.class)); + cards.add(new SetCardInfo("Mox Jet", 264, Rarity.RARE, mage.cards.m.MoxJet.class)); + cards.add(new SetCardInfo("Mox Pearl", 265, Rarity.RARE, mage.cards.m.MoxPearl.class)); + cards.add(new SetCardInfo("Mox Ruby", 266, Rarity.RARE, mage.cards.m.MoxRuby.class)); + cards.add(new SetCardInfo("Mox Sapphire", 267, Rarity.RARE, mage.cards.m.MoxSapphire.class)); + cards.add(new SetCardInfo("Natural Selection", 121, Rarity.RARE, mage.cards.n.NaturalSelection.class)); + cards.add(new SetCardInfo("Nether Shadow", 25, Rarity.RARE, mage.cards.n.NetherShadow.class)); + cards.add(new SetCardInfo("Nettling Imp", 26, Rarity.UNCOMMON, mage.cards.n.NettlingImp.class)); + cards.add(new SetCardInfo("Nevinyrral's Disk", 268, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); + cards.add(new SetCardInfo("Nightmare", 27, Rarity.RARE, mage.cards.n.Nightmare.class)); + cards.add(new SetCardInfo("Northern Paladin", 215, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); + cards.add(new SetCardInfo("Obsianus Golem", 269, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class)); + cards.add(new SetCardInfo("Orcish Artillery", 167, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); + cards.add(new SetCardInfo("Orcish Oriflamme", 168, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); + cards.add(new SetCardInfo("Paralyze", 28, Rarity.COMMON, mage.cards.p.Paralyze.class)); + cards.add(new SetCardInfo("Pearled Unicorn", 216, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); + cards.add(new SetCardInfo("Personal Incarnation", 217, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); + cards.add(new SetCardInfo("Pestilence", 29, Rarity.COMMON, mage.cards.p.Pestilence.class)); + cards.add(new SetCardInfo("Phantasmal Forces", 68, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); + cards.add(new SetCardInfo("Phantasmal Terrain", 69, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); + cards.add(new SetCardInfo("Phantom Monster", 70, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); + cards.add(new SetCardInfo("Pirate Ship", 71, Rarity.RARE, mage.cards.p.PirateShip.class)); + cards.add(new SetCardInfo("Plague Rats", 30, Rarity.COMMON, mage.cards.p.PlagueRats.class)); + cards.add(new SetCardInfo("Plains", 289, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Plains", 290, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Plains", 291, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Plateau", 292, Rarity.RARE, mage.cards.p.Plateau.class)); + cards.add(new SetCardInfo("Power Sink", 73, Rarity.COMMON, mage.cards.p.PowerSink.class)); + cards.add(new SetCardInfo("Power Surge", 169, Rarity.RARE, mage.cards.p.PowerSurge.class)); + cards.add(new SetCardInfo("Prodigal Sorcerer", 74, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); + cards.add(new SetCardInfo("Psionic Blast", 75, Rarity.UNCOMMON, mage.cards.p.PsionicBlast.class)); + cards.add(new SetCardInfo("Psychic Venom", 76, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); + cards.add(new SetCardInfo("Purelace", 218, Rarity.RARE, mage.cards.p.Purelace.class)); + cards.add(new SetCardInfo("Raise Dead", 31, Rarity.COMMON, mage.cards.r.RaiseDead.class)); + cards.add(new SetCardInfo("Red Elemental Blast", 171, Rarity.COMMON, mage.cards.r.RedElementalBlast.class)); + cards.add(new SetCardInfo("Red Ward", 219, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); + cards.add(new SetCardInfo("Regeneration", 122, Rarity.COMMON, mage.cards.r.Regeneration.class)); + cards.add(new SetCardInfo("Regrowth", 123, Rarity.UNCOMMON, mage.cards.r.Regrowth.class)); + cards.add(new SetCardInfo("Resurrection", 220, Rarity.UNCOMMON, mage.cards.r.Resurrection.class)); + cards.add(new SetCardInfo("Reverse Damage", 221, Rarity.RARE, mage.cards.r.ReverseDamage.class)); + cards.add(new SetCardInfo("Righteousness", 222, Rarity.RARE, mage.cards.r.Righteousness.class)); + cards.add(new SetCardInfo("Roc of Kher Ridges", 172, Rarity.RARE, mage.cards.r.RocOfKherRidges.class)); + cards.add(new SetCardInfo("Rock Hydra", 173, Rarity.RARE, mage.cards.r.RockHydra.class)); + cards.add(new SetCardInfo("Rod of Ruin", 270, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); + cards.add(new SetCardInfo("Royal Assassin", 32, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); + cards.add(new SetCardInfo("Sacrifice", 33, Rarity.UNCOMMON, mage.cards.s.Sacrifice.class)); + cards.add(new SetCardInfo("Samite Healer", 223, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); + cards.add(new SetCardInfo("Savannah", 293, Rarity.RARE, mage.cards.s.Savannah.class)); + cards.add(new SetCardInfo("Savannah Lions", 224, Rarity.RARE, mage.cards.s.SavannahLions.class)); + cards.add(new SetCardInfo("Scathe Zombies", 34, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); + cards.add(new SetCardInfo("Scavenging Ghoul", 35, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); + cards.add(new SetCardInfo("Scrubland", 294, Rarity.RARE, mage.cards.s.Scrubland.class)); + cards.add(new SetCardInfo("Scryb Sprites", 124, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); + cards.add(new SetCardInfo("Sea Serpent", 77, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); + cards.add(new SetCardInfo("Sedge Troll", 174, Rarity.RARE, mage.cards.s.SedgeTroll.class)); + cards.add(new SetCardInfo("Sengir Vampire", 36, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); + cards.add(new SetCardInfo("Serra Angel", 225, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); + cards.add(new SetCardInfo("Shanodin Dryads", 125, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); + cards.add(new SetCardInfo("Shatter", 175, Rarity.COMMON, mage.cards.s.Shatter.class)); + cards.add(new SetCardInfo("Shivan Dragon", 176, Rarity.RARE, mage.cards.s.ShivanDragon.class)); + cards.add(new SetCardInfo("Simulacrum", 37, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); + cards.add(new SetCardInfo("Sinkhole", 38, Rarity.COMMON, mage.cards.s.Sinkhole.class)); + cards.add(new SetCardInfo("Siren's Call", 78, Rarity.UNCOMMON, mage.cards.s.SirensCall.class)); + cards.add(new SetCardInfo("Smoke", 177, Rarity.RARE, mage.cards.s.Smoke.class)); + cards.add(new SetCardInfo("Sol Ring", 271, Rarity.UNCOMMON, mage.cards.s.SolRing.class)); + cards.add(new SetCardInfo("Soul Net", 272, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); + cards.add(new SetCardInfo("Spell Blast", 80, Rarity.COMMON, mage.cards.s.SpellBlast.class)); + cards.add(new SetCardInfo("Stasis", 81, Rarity.RARE, mage.cards.s.Stasis.class)); + cards.add(new SetCardInfo("Steal Artifact", 82, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); + cards.add(new SetCardInfo("Stone Giant", 178, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); + cards.add(new SetCardInfo("Stone Rain", 179, Rarity.COMMON, mage.cards.s.StoneRain.class)); + cards.add(new SetCardInfo("Stream of Life", 126, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); + cards.add(new SetCardInfo("Sunglasses of Urza", 273, Rarity.RARE, mage.cards.s.SunglassesOfUrza.class)); + cards.add(new SetCardInfo("Swamp", 295, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Swamp", 296, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Swamp", 297, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true))); + cards.add(new SetCardInfo("Swords to Plowshares", 226, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); + cards.add(new SetCardInfo("Taiga", 298, Rarity.RARE, mage.cards.t.Taiga.class)); + cards.add(new SetCardInfo("Terror", 39, Rarity.COMMON, mage.cards.t.Terror.class)); + cards.add(new SetCardInfo("The Hive", 274, Rarity.RARE, mage.cards.t.TheHive.class)); + cards.add(new SetCardInfo("Thicket Basilisk", 127, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); + cards.add(new SetCardInfo("Thoughtlace", 83, Rarity.RARE, mage.cards.t.Thoughtlace.class)); + cards.add(new SetCardInfo("Throne of Bone", 275, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); + cards.add(new SetCardInfo("Timetwister", 85, Rarity.RARE, mage.cards.t.Timetwister.class)); + cards.add(new SetCardInfo("Time Vault", 276, Rarity.RARE, mage.cards.t.TimeVault.class)); + cards.add(new SetCardInfo("Time Walk", 84, Rarity.RARE, mage.cards.t.TimeWalk.class)); + cards.add(new SetCardInfo("Tranquility", 129, Rarity.COMMON, mage.cards.t.Tranquility.class)); + cards.add(new SetCardInfo("Tropical Island", 299, Rarity.RARE, mage.cards.t.TropicalIsland.class)); + cards.add(new SetCardInfo("Tsunami", 130, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); + cards.add(new SetCardInfo("Tundra", 300, Rarity.RARE, mage.cards.t.Tundra.class)); + cards.add(new SetCardInfo("Tunnel", 180, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); + cards.add(new SetCardInfo("Twiddle", 86, Rarity.COMMON, mage.cards.t.Twiddle.class)); + cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 181, Rarity.RARE, mage.cards.t.TwoHeadedGiantOfForiys.class)); + cards.add(new SetCardInfo("Underground Sea", 301, Rarity.RARE, mage.cards.u.UndergroundSea.class)); + cards.add(new SetCardInfo("Unholy Strength", 40, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); + cards.add(new SetCardInfo("Unsummon", 87, Rarity.COMMON, mage.cards.u.Unsummon.class)); + cards.add(new SetCardInfo("Uthden Troll", 182, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); + cards.add(new SetCardInfo("Verduran Enchantress", 131, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); + cards.add(new SetCardInfo("Vesuvan Doppelganger", 88, Rarity.RARE, mage.cards.v.VesuvanDoppelganger.class)); + cards.add(new SetCardInfo("Veteran Bodyguard", 227, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); + cards.add(new SetCardInfo("Volcanic Eruption", 89, Rarity.RARE, mage.cards.v.VolcanicEruption.class)); + cards.add(new SetCardInfo("Volcanic Island", 302, Rarity.RARE, mage.cards.v.VolcanicIsland.class)); + cards.add(new SetCardInfo("Wall of Air", 90, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); + cards.add(new SetCardInfo("Wall of Bone", 41, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); + cards.add(new SetCardInfo("Wall of Brambles", 132, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); + cards.add(new SetCardInfo("Wall of Fire", 183, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); + cards.add(new SetCardInfo("Wall of Ice", 133, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); + cards.add(new SetCardInfo("Wall of Stone", 184, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); + cards.add(new SetCardInfo("Wall of Swords", 228, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); + cards.add(new SetCardInfo("Wall of Water", 91, Rarity.UNCOMMON, mage.cards.w.WallOfWater.class)); + cards.add(new SetCardInfo("Wall of Wood", 134, Rarity.COMMON, mage.cards.w.WallOfWood.class)); + cards.add(new SetCardInfo("Wanderlust", 135, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); + cards.add(new SetCardInfo("War Mammoth", 136, Rarity.COMMON, mage.cards.w.WarMammoth.class)); + cards.add(new SetCardInfo("Warp Artifact", 42, Rarity.RARE, mage.cards.w.WarpArtifact.class)); + cards.add(new SetCardInfo("Water Elemental", 92, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class)); + cards.add(new SetCardInfo("Weakness", 43, Rarity.COMMON, mage.cards.w.Weakness.class)); + cards.add(new SetCardInfo("Web", 137, Rarity.RARE, mage.cards.w.Web.class)); + cards.add(new SetCardInfo("Wheel of Fortune", 185, Rarity.RARE, mage.cards.w.WheelOfFortune.class)); + cards.add(new SetCardInfo("White Knight", 229, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); + cards.add(new SetCardInfo("White Ward", 230, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); + cards.add(new SetCardInfo("Wild Growth", 138, Rarity.COMMON, mage.cards.w.WildGrowth.class)); + cards.add(new SetCardInfo("Will-o'-the-Wisp", 44, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); + cards.add(new SetCardInfo("Winter Orb", 277, Rarity.RARE, mage.cards.w.WinterOrb.class)); + cards.add(new SetCardInfo("Wooden Sphere", 278, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); + cards.add(new SetCardInfo("Wrath of God", 231, Rarity.RARE, mage.cards.w.WrathOfGod.class)); + cards.add(new SetCardInfo("Zombie Master", 46, Rarity.RARE, mage.cards.z.ZombieMaster.class)); + } +} diff --git a/Mage.Sets/src/mage/sets/MastersEditionIV.java b/Mage.Sets/src/mage/sets/MastersEditionIV.java index 242d0a6856..f9713829b8 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionIV.java +++ b/Mage.Sets/src/mage/sets/MastersEditionIV.java @@ -1,296 +1,298 @@ -/* - * 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.sets; - -import mage.cards.ExpansionSet; -import mage.cards.a.AesthirGlider; -import mage.cards.e.EliteCatWarrior; -import mage.constants.Rarity; -import mage.constants.SetType; - -/** - * - * @author LevelX2 - */ - -public class MastersEditionIV extends ExpansionSet { - - private static final MastersEditionIV instance = new MastersEditionIV(); - - public static MastersEditionIV getInstance() { - return instance; - } - - private MastersEditionIV() { - super("Masters Edition IV", "ME4", ExpansionSet.buildDate(2011, 1, 10), SetType.MAGIC_ONLINE); - this.hasBasicLands = false; - this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; - this.numBoosterUncommon = 3; - this.numBoosterRare = 1; - this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Acid Rain", 36, Rarity.RARE, mage.cards.a.AcidRain.class)); - cards.add(new SetCardInfo("Aesthir Glider", 176, Rarity.COMMON, AesthirGlider.class)); - cards.add(new SetCardInfo("Air Elemental", 37, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); - cards.add(new SetCardInfo("Alaborn Musketeer", 1, Rarity.COMMON, mage.cards.a.AlabornMusketeer.class)); - cards.add(new SetCardInfo("Alaborn Trooper", 2, Rarity.COMMON, mage.cards.a.AlabornTrooper.class)); - cards.add(new SetCardInfo("Aladdin", 106, Rarity.RARE, mage.cards.a.Aladdin.class)); - cards.add(new SetCardInfo("Alchor's Tomb", 178, Rarity.RARE, mage.cards.a.AlchorsTomb.class)); - cards.add(new SetCardInfo("Ali from Cairo", 107, Rarity.RARE, mage.cards.a.AliFromCairo.class)); - cards.add(new SetCardInfo("Alluring Scent", 141, Rarity.COMMON, mage.cards.a.AlluringScent.class)); - cards.add(new SetCardInfo("Amulet of Kroog", 179, Rarity.COMMON, mage.cards.a.AmuletOfKroog.class)); - cards.add(new SetCardInfo("Animate Artifact", 38, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class)); - cards.add(new SetCardInfo("Argivian Blacksmith", 4, Rarity.UNCOMMON, mage.cards.a.ArgivianBlacksmith.class)); - cards.add(new SetCardInfo("Argothian Pixies", 142, Rarity.COMMON, mage.cards.a.ArgothianPixies.class)); - cards.add(new SetCardInfo("Argothian Treefolk", 143, Rarity.UNCOMMON, mage.cards.a.ArgothianTreefolk.class)); - cards.add(new SetCardInfo("Armageddon", 5, Rarity.RARE, mage.cards.a.Armageddon.class)); - cards.add(new SetCardInfo("Armageddon Clock", 180, Rarity.RARE, mage.cards.a.ArmageddonClock.class)); - cards.add(new SetCardInfo("Artifact Blast", 108, Rarity.COMMON, mage.cards.a.ArtifactBlast.class)); - cards.add(new SetCardInfo("Ashnod's Altar", 181, Rarity.RARE, mage.cards.a.AshnodsAltar.class)); - cards.add(new SetCardInfo("Atog", 109, Rarity.COMMON, mage.cards.a.Atog.class)); - cards.add(new SetCardInfo("Badlands", 241, Rarity.RARE, mage.cards.b.Badlands.class)); - cards.add(new SetCardInfo("Balance", 6, Rarity.RARE, mage.cards.b.Balance.class)); - cards.add(new SetCardInfo("Basalt Monolith", 182, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class)); - cards.add(new SetCardInfo("Bayou", 242, Rarity.RARE, mage.cards.b.Bayou.class)); - cards.add(new SetCardInfo("Bee Sting", 144, Rarity.UNCOMMON, mage.cards.b.BeeSting.class)); - cards.add(new SetCardInfo("Bird Maiden", 110, Rarity.COMMON, mage.cards.b.BirdMaiden.class)); - cards.add(new SetCardInfo("Black Knight", 71, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); - cards.add(new SetCardInfo("Blue Elemental Blast", 39, Rarity.UNCOMMON, mage.cards.b.BlueElementalBlast.class)); - cards.add(new SetCardInfo("Book of Rass", 183, Rarity.UNCOMMON, mage.cards.b.BookOfRass.class)); - cards.add(new SetCardInfo("Bottle of Suleiman", 184, Rarity.RARE, mage.cards.b.BottleOfSuleiman.class)); - cards.add(new SetCardInfo("Braingeyser", 40, Rarity.RARE, mage.cards.b.Braingeyser.class)); - cards.add(new SetCardInfo("Brass Man", 185, Rarity.COMMON, mage.cards.b.BrassMan.class)); - cards.add(new SetCardInfo("Candelabra of Tawnos", 187, Rarity.RARE, mage.cards.c.CandelabraOfTawnos.class)); - cards.add(new SetCardInfo("Celestial Sword", 188, Rarity.UNCOMMON, mage.cards.c.CelestialSword.class)); - cards.add(new SetCardInfo("Channel", 145, Rarity.RARE, mage.cards.c.Channel.class)); - cards.add(new SetCardInfo("Citanul Druid", 146, Rarity.COMMON, mage.cards.c.CitanulDruid.class)); - cards.add(new SetCardInfo("City of Brass", 243, Rarity.RARE, mage.cards.c.CityOfBrass.class)); - cards.add(new SetCardInfo("Clay Statue", 189, Rarity.UNCOMMON, mage.cards.c.ClayStatue.class)); - cards.add(new SetCardInfo("Clockwork Avian", 190, Rarity.UNCOMMON, mage.cards.c.ClockworkAvian.class)); - cards.add(new SetCardInfo("Clockwork Gnomes", 191, Rarity.UNCOMMON, mage.cards.c.ClockworkGnomes.class)); - cards.add(new SetCardInfo("Cloud Dragon", 41, Rarity.RARE, mage.cards.c.CloudDragon.class)); - cards.add(new SetCardInfo("Cloud Spirit", 42, Rarity.COMMON, mage.cards.c.CloudSpirit.class)); - cards.add(new SetCardInfo("Colossus of Sardia", 193, Rarity.RARE, mage.cards.c.ColossusOfSardia.class)); - cards.add(new SetCardInfo("Control Magic", 43, Rarity.RARE, mage.cards.c.ControlMagic.class)); - cards.add(new SetCardInfo("Conversion", 9, Rarity.RARE, mage.cards.c.Conversion.class)); - cards.add(new SetCardInfo("Copy Artifact", 44, Rarity.RARE, mage.cards.c.CopyArtifact.class)); - cards.add(new SetCardInfo("Coral Helm", 194, Rarity.UNCOMMON, mage.cards.c.CoralHelm.class)); - cards.add(new SetCardInfo("Counterspell", 45, Rarity.COMMON, mage.cards.c.Counterspell.class)); - cards.add(new SetCardInfo("Crumble", 147, Rarity.COMMON, mage.cards.c.Crumble.class)); - cards.add(new SetCardInfo("Cyclone", 148, Rarity.RARE, mage.cards.c.Cyclone.class)); - cards.add(new SetCardInfo("Cyclopean Mummy", 72, Rarity.COMMON, mage.cards.c.CyclopeanMummy.class)); - cards.add(new SetCardInfo("Cyclopean Tomb", 195, Rarity.RARE, mage.cards.c.CyclopeanTomb.class)); - cards.add(new SetCardInfo("Dakmor Plague", 73, Rarity.UNCOMMON, mage.cards.d.DakmorPlague.class)); - cards.add(new SetCardInfo("Dark Ritual", 74, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("Deathcoil Wurm", 149, Rarity.RARE, mage.cards.d.DeathcoilWurm.class)); - cards.add(new SetCardInfo("Deathgrip", 75, Rarity.RARE, mage.cards.d.Deathgrip.class)); - cards.add(new SetCardInfo("Demonic Hordes", 76, Rarity.RARE, mage.cards.d.DemonicHordes.class)); - cards.add(new SetCardInfo("Demonic Tutor", 77, Rarity.RARE, mage.cards.d.DemonicTutor.class)); - cards.add(new SetCardInfo("Detonate", 111, Rarity.UNCOMMON, mage.cards.d.Detonate.class)); - cards.add(new SetCardInfo("Devastation", 112, Rarity.RARE, mage.cards.d.Devastation.class)); - cards.add(new SetCardInfo("Diabolic Machine", 196, Rarity.UNCOMMON, mage.cards.d.DiabolicMachine.class)); - cards.add(new SetCardInfo("Divine Offering", 10, Rarity.COMMON, mage.cards.d.DivineOffering.class)); - cards.add(new SetCardInfo("Dragon Engine", 197, Rarity.COMMON, mage.cards.d.DragonEngine.class)); - cards.add(new SetCardInfo("Dread Reaper", 78, Rarity.RARE, mage.cards.d.DreadReaper.class)); - cards.add(new SetCardInfo("Drop of Honey", 150, Rarity.RARE, mage.cards.d.DropOfHoney.class)); - cards.add(new SetCardInfo("Drowned", 47, Rarity.COMMON, mage.cards.d.Drowned.class)); - cards.add(new SetCardInfo("Dust to Dust", 11, Rarity.UNCOMMON, mage.cards.d.DustToDust.class)); - cards.add(new SetCardInfo("Ebon Dragon", 80, Rarity.RARE, mage.cards.e.EbonDragon.class)); - cards.add(new SetCardInfo("Ebony Horse", 198, Rarity.COMMON, mage.cards.e.EbonyHorse.class)); - cards.add(new SetCardInfo("Ebony Rhino", 199, Rarity.COMMON, mage.cards.e.EbonyRhino.class)); - cards.add(new SetCardInfo("Elephant Graveyard", 244, Rarity.UNCOMMON, mage.cards.e.ElephantGraveyard.class)); - cards.add(new SetCardInfo("Elite Cat Warrior", 151, Rarity.COMMON, EliteCatWarrior.class)); - cards.add(new SetCardInfo("Energy Flux", 48, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); - cards.add(new SetCardInfo("Eye for an Eye", 12, Rarity.RARE, mage.cards.e.EyeForAnEye.class)); - cards.add(new SetCardInfo("False Summoning", 49, Rarity.COMMON, mage.cards.f.FalseSummoning.class)); - cards.add(new SetCardInfo("Fastbond", 152, Rarity.RARE, mage.cards.f.Fastbond.class)); - cards.add(new SetCardInfo("Fireball", 115, Rarity.UNCOMMON, mage.cards.f.Fireball.class)); - cards.add(new SetCardInfo("Fire Imp", 113, Rarity.UNCOMMON, mage.cards.f.FireImp.class)); - cards.add(new SetCardInfo("Fire Tempest", 114, Rarity.RARE, mage.cards.f.FireTempest.class)); - cards.add(new SetCardInfo("Floodwater Dam", 200, Rarity.RARE, mage.cards.f.FloodwaterDam.class)); - cards.add(new SetCardInfo("Flying Carpet", 201, Rarity.COMMON, mage.cards.f.FlyingCarpet.class)); - cards.add(new SetCardInfo("Fog", 153, Rarity.COMMON, mage.cards.f.Fog.class)); - cards.add(new SetCardInfo("Force of Nature", 154, Rarity.RARE, mage.cards.f.ForceOfNature.class)); - cards.add(new SetCardInfo("Fork", 116, Rarity.RARE, mage.cards.f.Fork.class)); - cards.add(new SetCardInfo("Foul Spirit", 81, Rarity.COMMON, mage.cards.f.FoulSpirit.class)); - cards.add(new SetCardInfo("Gaea's Avenger", 155, Rarity.UNCOMMON, mage.cards.g.GaeasAvenger.class)); - cards.add(new SetCardInfo("Gate to Phyrexia", 82, Rarity.UNCOMMON, mage.cards.g.GateToPhyrexia.class)); - cards.add(new SetCardInfo("Gauntlet of Might", 202, Rarity.RARE, mage.cards.g.GauntletOfMight.class)); - cards.add(new SetCardInfo("Giant Growth", 156, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); - cards.add(new SetCardInfo("Giant Tortoise", 50, Rarity.COMMON, mage.cards.g.GiantTortoise.class)); - cards.add(new SetCardInfo("Glasses of Urza", 203, Rarity.COMMON, mage.cards.g.GlassesOfUrza.class)); - cards.add(new SetCardInfo("Gloom", 83, Rarity.RARE, mage.cards.g.Gloom.class)); - cards.add(new SetCardInfo("Goblin Bully", 117, Rarity.COMMON, mage.cards.g.GoblinBully.class)); - cards.add(new SetCardInfo("Goblin Cavaliers", 118, Rarity.COMMON, mage.cards.g.GoblinCavaliers.class)); - cards.add(new SetCardInfo("Goblin Caves", 119, Rarity.COMMON, mage.cards.g.GoblinCaves.class)); - cards.add(new SetCardInfo("Goblin Firestarter", 120, Rarity.COMMON, mage.cards.g.GoblinFirestarter.class)); - cards.add(new SetCardInfo("Goblin General", 121, Rarity.UNCOMMON, mage.cards.g.GoblinGeneral.class)); - cards.add(new SetCardInfo("Goblin Warrens", 123, Rarity.UNCOMMON, mage.cards.g.GoblinWarrens.class)); - cards.add(new SetCardInfo("Gorilla War Cry", 124, Rarity.COMMON, mage.cards.g.GorillaWarCry.class)); - cards.add(new SetCardInfo("Grapeshot Catapult", 204, Rarity.UNCOMMON, mage.cards.g.GrapeshotCatapult.class)); - cards.add(new SetCardInfo("Gravebind", 84, Rarity.COMMON, mage.cards.g.Gravebind.class)); - cards.add(new SetCardInfo("Guardian Beast", 85, Rarity.RARE, mage.cards.g.GuardianBeast.class)); - cards.add(new SetCardInfo("Hasran Ogress", 86, Rarity.COMMON, mage.cards.h.HasranOgress.class)); - cards.add(new SetCardInfo("Healing Salve", 14, Rarity.COMMON, mage.cards.h.HealingSalve.class)); - cards.add(new SetCardInfo("Horn of Deafening", 205, Rarity.UNCOMMON, mage.cards.h.HornOfDeafening.class)); - cards.add(new SetCardInfo("Howl from Beyond", 87, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); - cards.add(new SetCardInfo("Icy Manipulator", 207, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); - cards.add(new SetCardInfo("Instill Energy", 157, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); - cards.add(new SetCardInfo("In the Eye of Chaos", 51, Rarity.RARE, mage.cards.i.InTheEyeOfChaos.class)); - cards.add(new SetCardInfo("Ironhoof Ox", 158, Rarity.COMMON, mage.cards.i.IronhoofOx.class)); - cards.add(new SetCardInfo("Island Sanctuary", 15, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); - cards.add(new SetCardInfo("Jade Monolith", 208, Rarity.RARE, mage.cards.j.JadeMonolith.class)); - cards.add(new SetCardInfo("Juggernaut", 209, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class)); - cards.add(new SetCardInfo("Junún Efreet", 88, Rarity.UNCOMMON, mage.cards.j.JununEfreet.class)); - cards.add(new SetCardInfo("Kismet", 17, Rarity.RARE, mage.cards.k.Kismet.class)); - cards.add(new SetCardInfo("Kormus Bell", 210, Rarity.RARE, mage.cards.k.KormusBell.class)); - cards.add(new SetCardInfo("Last Chance", 125, Rarity.RARE, mage.cards.l.LastChance.class)); - cards.add(new SetCardInfo("Lava Flow", 126, Rarity.COMMON, mage.cards.l.LavaFlow.class)); - cards.add(new SetCardInfo("Leeches", 18, Rarity.RARE, mage.cards.l.Leeches.class)); - cards.add(new SetCardInfo("Library of Alexandria", 245, Rarity.RARE, mage.cards.l.LibraryOfAlexandria.class)); - cards.add(new SetCardInfo("Library of Leng", 211, Rarity.COMMON, mage.cards.l.LibraryOfLeng.class)); - cards.add(new SetCardInfo("Lich", 89, Rarity.RARE, mage.cards.l.Lich.class)); - cards.add(new SetCardInfo("Lifeforce", 160, Rarity.RARE, mage.cards.l.Lifeforce.class)); - cards.add(new SetCardInfo("Living Lands", 161, Rarity.RARE, mage.cards.l.LivingLands.class)); - cards.add(new SetCardInfo("Living Wall", 212, Rarity.UNCOMMON, mage.cards.l.LivingWall.class)); - cards.add(new SetCardInfo("Mahamoti Djinn", 52, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); - cards.add(new SetCardInfo("Mana Matrix", 213, Rarity.RARE, mage.cards.m.ManaMatrix.class)); - cards.add(new SetCardInfo("Mana Vault", 214, Rarity.RARE, mage.cards.m.ManaVault.class)); - cards.add(new SetCardInfo("Martyrs of Korlis", 20, Rarity.UNCOMMON, mage.cards.m.MartyrsOfKorlis.class)); - cards.add(new SetCardInfo("Maze of Ith", 246, Rarity.RARE, mage.cards.m.MazeOfIth.class)); - cards.add(new SetCardInfo("Mightstone", 215, Rarity.COMMON, mage.cards.m.Mightstone.class)); - cards.add(new SetCardInfo("Mijae Djinn", 127, Rarity.RARE, mage.cards.m.MijaeDjinn.class)); - cards.add(new SetCardInfo("Mishra's Workshop", 247, Rarity.RARE, mage.cards.m.MishrasWorkshop.class)); - cards.add(new SetCardInfo("Mystic Decree", 53, Rarity.UNCOMMON, mage.cards.m.MysticDecree.class)); - cards.add(new SetCardInfo("Naked Singularity", 216, Rarity.RARE, mage.cards.n.NakedSingularity.class)); - cards.add(new SetCardInfo("Oasis", 248, Rarity.COMMON, mage.cards.o.Oasis.class)); - cards.add(new SetCardInfo("Obelisk of Undoing", 217, Rarity.RARE, mage.cards.o.ObeliskOfUndoing.class)); - cards.add(new SetCardInfo("Obsianus Golem", 218, Rarity.COMMON, mage.cards.o.ObsianusGolem.class)); - cards.add(new SetCardInfo("Ogre Taskmaster", 128, Rarity.COMMON, mage.cards.o.OgreTaskmaster.class)); - cards.add(new SetCardInfo("Onulet", 219, Rarity.COMMON, mage.cards.o.Onulet.class)); - cards.add(new SetCardInfo("Orcish Mechanics", 129, Rarity.UNCOMMON, mage.cards.o.OrcishMechanics.class)); - cards.add(new SetCardInfo("Osai Vultures", 21, Rarity.COMMON, mage.cards.o.OsaiVultures.class)); - cards.add(new SetCardInfo("Overwhelming Forces", 92, Rarity.RARE, mage.cards.o.OverwhelmingForces.class)); - cards.add(new SetCardInfo("Owl Familiar", 54, Rarity.COMMON, mage.cards.o.OwlFamiliar.class)); - cards.add(new SetCardInfo("Pentagram of the Ages", 220, Rarity.UNCOMMON, mage.cards.p.PentagramOfTheAges.class)); - cards.add(new SetCardInfo("Personal Incarnation", 22, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); - cards.add(new SetCardInfo("Phantasmal Forces", 55, Rarity.COMMON, mage.cards.p.PhantasmalForces.class)); - cards.add(new SetCardInfo("Phantasmal Terrain", 56, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); - cards.add(new SetCardInfo("Planar Gate", 221, Rarity.UNCOMMON, mage.cards.p.PlanarGate.class)); - cards.add(new SetCardInfo("Plateau", 249, Rarity.RARE, mage.cards.p.Plateau.class)); - cards.add(new SetCardInfo("Power Artifact", 57, Rarity.RARE, mage.cards.p.PowerArtifact.class)); - cards.add(new SetCardInfo("Primal Clay", 222, Rarity.COMMON, mage.cards.p.PrimalClay.class)); - cards.add(new SetCardInfo("Prodigal Sorcerer", 58, Rarity.UNCOMMON, mage.cards.p.ProdigalSorcerer.class)); - cards.add(new SetCardInfo("Prowling Nightstalker", 93, Rarity.COMMON, mage.cards.p.ProwlingNightstalker.class)); - cards.add(new SetCardInfo("Radjan Spirit", 162, Rarity.UNCOMMON, mage.cards.r.RadjanSpirit.class)); - cards.add(new SetCardInfo("Rain of Daggers", 94, Rarity.RARE, mage.cards.r.RainOfDaggers.class)); - cards.add(new SetCardInfo("Rakalite", 223, Rarity.RARE, mage.cards.r.Rakalite.class)); - cards.add(new SetCardInfo("Reconstruction", 59, Rarity.COMMON, mage.cards.r.Reconstruction.class)); - cards.add(new SetCardInfo("Red Elemental Blast", 131, Rarity.UNCOMMON, mage.cards.r.RedElementalBlast.class)); - cards.add(new SetCardInfo("Regrowth", 163, Rarity.RARE, mage.cards.r.Regrowth.class)); - cards.add(new SetCardInfo("Righteous Charge", 23, Rarity.COMMON, mage.cards.r.RighteousCharge.class)); - cards.add(new SetCardInfo("Ring of Renewal", 224, Rarity.RARE, mage.cards.r.RingOfRenewal.class)); - cards.add(new SetCardInfo("Roc of Kher Ridges", 132, Rarity.UNCOMMON, mage.cards.r.RocOfKherRidges.class)); - cards.add(new SetCardInfo("Rock Hydra", 133, Rarity.RARE, mage.cards.r.RockHydra.class)); - cards.add(new SetCardInfo("Rockslide Ambush", 134, Rarity.COMMON, mage.cards.r.RockslideAmbush.class)); - cards.add(new SetCardInfo("Sandstorm", 164, Rarity.COMMON, mage.cards.s.Sandstorm.class)); - cards.add(new SetCardInfo("Savannah", 250, Rarity.RARE, mage.cards.s.Savannah.class)); - cards.add(new SetCardInfo("Savannah Lions", 24, Rarity.UNCOMMON, mage.cards.s.SavannahLions.class)); - cards.add(new SetCardInfo("Scavenger Folk", 166, Rarity.COMMON, mage.cards.s.ScavengerFolk.class)); - cards.add(new SetCardInfo("Scavenging Ghoul", 95, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); - cards.add(new SetCardInfo("Scrubland", 251, Rarity.RARE, mage.cards.s.Scrubland.class)); - cards.add(new SetCardInfo("Sea Serpent", 60, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); - cards.add(new SetCardInfo("Sedge Troll", 135, Rarity.RARE, mage.cards.s.SedgeTroll.class)); - cards.add(new SetCardInfo("Sengir Vampire", 96, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); - cards.add(new SetCardInfo("Serendib Djinn", 61, Rarity.RARE, mage.cards.s.SerendibDjinn.class)); - cards.add(new SetCardInfo("Serra Angel", 25, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); - cards.add(new SetCardInfo("Serra Aviary", 26, Rarity.UNCOMMON, mage.cards.s.SerraAviary.class)); - cards.add(new SetCardInfo("Shapeshifter", 226, Rarity.UNCOMMON, mage.cards.s.Shapeshifter.class)); - cards.add(new SetCardInfo("Shivan Dragon", 136, Rarity.RARE, mage.cards.s.ShivanDragon.class)); - cards.add(new SetCardInfo("Sinkhole", 97, Rarity.RARE, mage.cards.s.Sinkhole.class)); - cards.add(new SetCardInfo("Sleight of Hand", 62, Rarity.COMMON, mage.cards.s.SleightOfHand.class)); - cards.add(new SetCardInfo("Smoke", 137, Rarity.RARE, mage.cards.s.Smoke.class)); - cards.add(new SetCardInfo("Soldevi Machinist", 63, Rarity.UNCOMMON, mage.cards.s.SoldeviMachinist.class)); - cards.add(new SetCardInfo("Sol Ring", 227, Rarity.RARE, mage.cards.s.SolRing.class)); - cards.add(new SetCardInfo("Soul Shred", 98, Rarity.COMMON, mage.cards.s.SoulShred.class)); - cards.add(new SetCardInfo("Southern Elephant", 167, Rarity.COMMON, mage.cards.s.SouthernElephant.class)); - cards.add(new SetCardInfo("Spotted Griffin", 28, Rarity.COMMON, mage.cards.s.SpottedGriffin.class)); - cards.add(new SetCardInfo("Squall", 168, Rarity.UNCOMMON, mage.cards.s.Squall.class)); - cards.add(new SetCardInfo("Staff of Zegon", 229, Rarity.COMMON, mage.cards.s.StaffOfZegon.class)); - cards.add(new SetCardInfo("Stasis", 64, Rarity.RARE, mage.cards.s.Stasis.class)); - cards.add(new SetCardInfo("Steam Catapult", 29, Rarity.RARE, mage.cards.s.SteamCatapult.class)); - cards.add(new SetCardInfo("Strip Mine", 252, Rarity.RARE, mage.cards.s.StripMine.class)); - cards.add(new SetCardInfo("Swords to Plowshares", 30, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); - cards.add(new SetCardInfo("Sylvan Tutor", 169, Rarity.UNCOMMON, mage.cards.s.SylvanTutor.class)); - cards.add(new SetCardInfo("Symbol of Unsummoning", 65, Rarity.COMMON, mage.cards.s.SymbolOfUnsummoning.class)); - cards.add(new SetCardInfo("Tablet of Epityr", 230, Rarity.COMMON, mage.cards.t.TabletOfEpityr.class)); - cards.add(new SetCardInfo("Taiga", 253, Rarity.RARE, mage.cards.t.Taiga.class)); - cards.add(new SetCardInfo("Talas Researcher", 66, Rarity.UNCOMMON, mage.cards.t.TalasResearcher.class)); - cards.add(new SetCardInfo("Tawnos's Wand", 231, Rarity.COMMON, mage.cards.t.TawnossWand.class)); - cards.add(new SetCardInfo("Tawnos's Weaponry", 232, Rarity.UNCOMMON, mage.cards.t.TawnossWeaponry.class)); - cards.add(new SetCardInfo("Temple Acolyte", 31, Rarity.COMMON, mage.cards.t.TempleAcolyte.class)); - cards.add(new SetCardInfo("Terror", 99, Rarity.COMMON, mage.cards.t.Terror.class)); - cards.add(new SetCardInfo("Tetravus", 233, Rarity.RARE, mage.cards.t.Tetravus.class)); - cards.add(new SetCardInfo("Theft of Dreams", 67, Rarity.UNCOMMON, mage.cards.t.TheftOfDreams.class)); - cards.add(new SetCardInfo("Thing from the Deep", 68, Rarity.RARE, mage.cards.t.ThingFromTheDeep.class)); - cards.add(new SetCardInfo("Thunder Dragon", 138, Rarity.RARE, mage.cards.t.ThunderDragon.class)); - cards.add(new SetCardInfo("Time Vault", 234, Rarity.RARE, mage.cards.t.TimeVault.class)); - cards.add(new SetCardInfo("Titania's Song", 170, Rarity.RARE, mage.cards.t.TitaniasSong.class)); - cards.add(new SetCardInfo("Transmute Artifact", 69, Rarity.RARE, mage.cards.t.TransmuteArtifact.class)); - cards.add(new SetCardInfo("Triassic Egg", 235, Rarity.RARE, mage.cards.t.TriassicEgg.class)); - cards.add(new SetCardInfo("Tropical Island", 254, Rarity.RARE, mage.cards.t.TropicalIsland.class)); - cards.add(new SetCardInfo("Tsunami", 171, Rarity.RARE, mage.cards.t.Tsunami.class)); - cards.add(new SetCardInfo("Tundra", 255, Rarity.RARE, mage.cards.t.Tundra.class)); - cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 139, Rarity.UNCOMMON, mage.cards.t.TwoHeadedGiantOfForiys.class)); - cards.add(new SetCardInfo("Underground Sea", 256, Rarity.RARE, mage.cards.u.UndergroundSea.class)); - cards.add(new SetCardInfo("Urza's Chalice", 236, Rarity.COMMON, mage.cards.u.UrzasChalice.class)); - cards.add(new SetCardInfo("Urza's Mine", 257, Rarity.LAND, mage.cards.u.UrzasMine.class)); - cards.add(new SetCardInfo("Urza's Miter", 237, Rarity.RARE, mage.cards.u.UrzasMiter.class)); - cards.add(new SetCardInfo("Urza's Power Plant", 258, Rarity.LAND, mage.cards.u.UrzasPowerPlant.class)); - cards.add(new SetCardInfo("Urza's Tower", 259, Rarity.LAND, mage.cards.u.UrzasTower.class)); - cards.add(new SetCardInfo("Veteran Bodyguard", 32, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); - cards.add(new SetCardInfo("Volcanic Island", 260, Rarity.RARE, mage.cards.v.VolcanicIsland.class)); - cards.add(new SetCardInfo("War Mammoth", 172, Rarity.COMMON, mage.cards.w.WarMammoth.class)); - cards.add(new SetCardInfo("Warp Artifact", 100, Rarity.COMMON, mage.cards.w.WarpArtifact.class)); - cards.add(new SetCardInfo("Water Elemental", 70, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class)); - cards.add(new SetCardInfo("Weakness", 101, Rarity.COMMON, mage.cards.w.Weakness.class)); - cards.add(new SetCardInfo("Weakstone", 239, Rarity.UNCOMMON, mage.cards.w.Weakstone.class)); - cards.add(new SetCardInfo("Wheel of Fortune", 140, Rarity.RARE, mage.cards.w.WheelOfFortune.class)); - cards.add(new SetCardInfo("Whiptail Wurm", 173, Rarity.UNCOMMON, mage.cards.w.WhiptailWurm.class)); - cards.add(new SetCardInfo("White Knight", 33, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); - cards.add(new SetCardInfo("Wicked Pact", 102, Rarity.UNCOMMON, mage.cards.w.WickedPact.class)); - cards.add(new SetCardInfo("Wild Aesthir", 34, Rarity.COMMON, mage.cards.w.WildAesthir.class)); - cards.add(new SetCardInfo("Wild Griffin", 35, Rarity.COMMON, mage.cards.w.WildGriffin.class)); - cards.add(new SetCardInfo("Wild Ox", 174, Rarity.UNCOMMON, mage.cards.w.WildOx.class)); - cards.add(new SetCardInfo("Xenic Poltergeist", 104, Rarity.UNCOMMON, mage.cards.x.XenicPoltergeist.class)); - cards.add(new SetCardInfo("Yotian Soldier", 240, Rarity.COMMON, mage.cards.y.YotianSoldier.class)); - cards.add(new SetCardInfo("Zombie Master", 105, Rarity.UNCOMMON, mage.cards.z.ZombieMaster.class)); - } - +/* + * 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.sets; + +import mage.cards.ExpansionSet; +import mage.cards.a.AesthirGlider; +import mage.cards.e.EliteCatWarrior; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * + * @author LevelX2 + */ + +public class MastersEditionIV extends ExpansionSet { + + private static final MastersEditionIV instance = new MastersEditionIV(); + + public static MastersEditionIV getInstance() { + return instance; + } + + private MastersEditionIV() { + super("Masters Edition IV", "ME4", ExpansionSet.buildDate(2011, 1, 10), SetType.MAGIC_ONLINE); + this.hasBasicLands = false; + this.hasBoosters = true; + this.numBoosterLands = 1; + this.numBoosterCommon = 10; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 0; + cards.add(new SetCardInfo("Acid Rain", 36, Rarity.RARE, mage.cards.a.AcidRain.class)); + cards.add(new SetCardInfo("Aesthir Glider", 176, Rarity.COMMON, AesthirGlider.class)); + cards.add(new SetCardInfo("Air Elemental", 37, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); + cards.add(new SetCardInfo("Alaborn Musketeer", 1, Rarity.COMMON, mage.cards.a.AlabornMusketeer.class)); + cards.add(new SetCardInfo("Alaborn Trooper", 2, Rarity.COMMON, mage.cards.a.AlabornTrooper.class)); + cards.add(new SetCardInfo("Aladdin", 106, Rarity.RARE, mage.cards.a.Aladdin.class)); + cards.add(new SetCardInfo("Alchor's Tomb", 178, Rarity.RARE, mage.cards.a.AlchorsTomb.class)); + cards.add(new SetCardInfo("Ali from Cairo", 107, Rarity.RARE, mage.cards.a.AliFromCairo.class)); + cards.add(new SetCardInfo("Alluring Scent", 141, Rarity.COMMON, mage.cards.a.AlluringScent.class)); + cards.add(new SetCardInfo("Amulet of Kroog", 179, Rarity.COMMON, mage.cards.a.AmuletOfKroog.class)); + cards.add(new SetCardInfo("Animate Artifact", 38, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class)); + cards.add(new SetCardInfo("Argivian Blacksmith", 4, Rarity.UNCOMMON, mage.cards.a.ArgivianBlacksmith.class)); + cards.add(new SetCardInfo("Argothian Pixies", 142, Rarity.COMMON, mage.cards.a.ArgothianPixies.class)); + cards.add(new SetCardInfo("Argothian Treefolk", 143, Rarity.UNCOMMON, mage.cards.a.ArgothianTreefolk.class)); + cards.add(new SetCardInfo("Armageddon", 5, Rarity.RARE, mage.cards.a.Armageddon.class)); + cards.add(new SetCardInfo("Armageddon Clock", 180, Rarity.RARE, mage.cards.a.ArmageddonClock.class)); + cards.add(new SetCardInfo("Artifact Blast", 108, Rarity.COMMON, mage.cards.a.ArtifactBlast.class)); + cards.add(new SetCardInfo("Ashnod's Altar", 181, Rarity.RARE, mage.cards.a.AshnodsAltar.class)); + cards.add(new SetCardInfo("Atog", 109, Rarity.COMMON, mage.cards.a.Atog.class)); + cards.add(new SetCardInfo("Badlands", 241, Rarity.RARE, mage.cards.b.Badlands.class)); + cards.add(new SetCardInfo("Balance", 6, Rarity.RARE, mage.cards.b.Balance.class)); + cards.add(new SetCardInfo("Basalt Monolith", 182, Rarity.UNCOMMON, mage.cards.b.BasaltMonolith.class)); + cards.add(new SetCardInfo("Bayou", 242, Rarity.RARE, mage.cards.b.Bayou.class)); + cards.add(new SetCardInfo("Bee Sting", 144, Rarity.UNCOMMON, mage.cards.b.BeeSting.class)); + cards.add(new SetCardInfo("Bird Maiden", 110, Rarity.COMMON, mage.cards.b.BirdMaiden.class)); + cards.add(new SetCardInfo("Black Knight", 71, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); + cards.add(new SetCardInfo("Blue Elemental Blast", 39, Rarity.UNCOMMON, mage.cards.b.BlueElementalBlast.class)); + cards.add(new SetCardInfo("Book of Rass", 183, Rarity.UNCOMMON, mage.cards.b.BookOfRass.class)); + cards.add(new SetCardInfo("Bottle of Suleiman", 184, Rarity.RARE, mage.cards.b.BottleOfSuleiman.class)); + cards.add(new SetCardInfo("Braingeyser", 40, Rarity.RARE, mage.cards.b.Braingeyser.class)); + cards.add(new SetCardInfo("Brass Man", 185, Rarity.COMMON, mage.cards.b.BrassMan.class)); + cards.add(new SetCardInfo("Candelabra of Tawnos", 187, Rarity.RARE, mage.cards.c.CandelabraOfTawnos.class)); + cards.add(new SetCardInfo("Celestial Sword", 188, Rarity.UNCOMMON, mage.cards.c.CelestialSword.class)); + cards.add(new SetCardInfo("Channel", 145, Rarity.RARE, mage.cards.c.Channel.class)); + cards.add(new SetCardInfo("Citanul Druid", 146, Rarity.COMMON, mage.cards.c.CitanulDruid.class)); + cards.add(new SetCardInfo("City of Brass", 243, Rarity.RARE, mage.cards.c.CityOfBrass.class)); + cards.add(new SetCardInfo("Clay Statue", 189, Rarity.UNCOMMON, mage.cards.c.ClayStatue.class)); + cards.add(new SetCardInfo("Clockwork Avian", 190, Rarity.UNCOMMON, mage.cards.c.ClockworkAvian.class)); + cards.add(new SetCardInfo("Clockwork Gnomes", 191, Rarity.UNCOMMON, mage.cards.c.ClockworkGnomes.class)); + cards.add(new SetCardInfo("Cloud Dragon", 41, Rarity.RARE, mage.cards.c.CloudDragon.class)); + cards.add(new SetCardInfo("Cloud Spirit", 42, Rarity.COMMON, mage.cards.c.CloudSpirit.class)); + cards.add(new SetCardInfo("Colossus of Sardia", 193, Rarity.RARE, mage.cards.c.ColossusOfSardia.class)); + cards.add(new SetCardInfo("Control Magic", 43, Rarity.RARE, mage.cards.c.ControlMagic.class)); + cards.add(new SetCardInfo("Conversion", 9, Rarity.RARE, mage.cards.c.Conversion.class)); + cards.add(new SetCardInfo("Copy Artifact", 44, Rarity.RARE, mage.cards.c.CopyArtifact.class)); + cards.add(new SetCardInfo("Coral Helm", 194, Rarity.UNCOMMON, mage.cards.c.CoralHelm.class)); + cards.add(new SetCardInfo("Counterspell", 45, Rarity.COMMON, mage.cards.c.Counterspell.class)); + cards.add(new SetCardInfo("Crumble", 147, Rarity.COMMON, mage.cards.c.Crumble.class)); + cards.add(new SetCardInfo("Cyclone", 148, Rarity.RARE, mage.cards.c.Cyclone.class)); + cards.add(new SetCardInfo("Cyclopean Mummy", 72, Rarity.COMMON, mage.cards.c.CyclopeanMummy.class)); + cards.add(new SetCardInfo("Cyclopean Tomb", 195, Rarity.RARE, mage.cards.c.CyclopeanTomb.class)); + cards.add(new SetCardInfo("Dakmor Plague", 73, Rarity.UNCOMMON, mage.cards.d.DakmorPlague.class)); + cards.add(new SetCardInfo("Dark Ritual", 74, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("Deathcoil Wurm", 149, Rarity.RARE, mage.cards.d.DeathcoilWurm.class)); + cards.add(new SetCardInfo("Deathgrip", 75, Rarity.RARE, mage.cards.d.Deathgrip.class)); + cards.add(new SetCardInfo("Demonic Hordes", 76, Rarity.RARE, mage.cards.d.DemonicHordes.class)); + cards.add(new SetCardInfo("Demonic Tutor", 77, Rarity.RARE, mage.cards.d.DemonicTutor.class)); + cards.add(new SetCardInfo("Detonate", 111, Rarity.UNCOMMON, mage.cards.d.Detonate.class)); + cards.add(new SetCardInfo("Devastation", 112, Rarity.RARE, mage.cards.d.Devastation.class)); + cards.add(new SetCardInfo("Diabolic Machine", 196, Rarity.UNCOMMON, mage.cards.d.DiabolicMachine.class)); + cards.add(new SetCardInfo("Divine Offering", 10, Rarity.COMMON, mage.cards.d.DivineOffering.class)); + cards.add(new SetCardInfo("Dragon Engine", 197, Rarity.COMMON, mage.cards.d.DragonEngine.class)); + cards.add(new SetCardInfo("Dread Reaper", 78, Rarity.RARE, mage.cards.d.DreadReaper.class)); + cards.add(new SetCardInfo("Drop of Honey", 150, Rarity.RARE, mage.cards.d.DropOfHoney.class)); + cards.add(new SetCardInfo("Drowned", 47, Rarity.COMMON, mage.cards.d.Drowned.class)); + cards.add(new SetCardInfo("Dust to Dust", 11, Rarity.UNCOMMON, mage.cards.d.DustToDust.class)); + cards.add(new SetCardInfo("Ebon Dragon", 80, Rarity.RARE, mage.cards.e.EbonDragon.class)); + cards.add(new SetCardInfo("Ebony Horse", 198, Rarity.COMMON, mage.cards.e.EbonyHorse.class)); + cards.add(new SetCardInfo("Ebony Rhino", 199, Rarity.COMMON, mage.cards.e.EbonyRhino.class)); + cards.add(new SetCardInfo("Elephant Graveyard", 244, Rarity.UNCOMMON, mage.cards.e.ElephantGraveyard.class)); + cards.add(new SetCardInfo("Elite Cat Warrior", 151, Rarity.COMMON, EliteCatWarrior.class)); + cards.add(new SetCardInfo("Energy Flux", 48, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); + cards.add(new SetCardInfo("Eye for an Eye", 12, Rarity.RARE, mage.cards.e.EyeForAnEye.class)); + cards.add(new SetCardInfo("False Summoning", 49, Rarity.COMMON, mage.cards.f.FalseSummoning.class)); + cards.add(new SetCardInfo("Fastbond", 152, Rarity.RARE, mage.cards.f.Fastbond.class)); + cards.add(new SetCardInfo("Fireball", 115, Rarity.UNCOMMON, mage.cards.f.Fireball.class)); + cards.add(new SetCardInfo("Fire Imp", 113, Rarity.UNCOMMON, mage.cards.f.FireImp.class)); + cards.add(new SetCardInfo("Fire Tempest", 114, Rarity.RARE, mage.cards.f.FireTempest.class)); + cards.add(new SetCardInfo("Floodwater Dam", 200, Rarity.RARE, mage.cards.f.FloodwaterDam.class)); + cards.add(new SetCardInfo("Flying Carpet", 201, Rarity.COMMON, mage.cards.f.FlyingCarpet.class)); + cards.add(new SetCardInfo("Fog", 153, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Force of Nature", 154, Rarity.RARE, mage.cards.f.ForceOfNature.class)); + cards.add(new SetCardInfo("Fork", 116, Rarity.RARE, mage.cards.f.Fork.class)); + cards.add(new SetCardInfo("Foul Spirit", 81, Rarity.COMMON, mage.cards.f.FoulSpirit.class)); + cards.add(new SetCardInfo("Gaea's Avenger", 155, Rarity.UNCOMMON, mage.cards.g.GaeasAvenger.class)); + cards.add(new SetCardInfo("Gate to Phyrexia", 82, Rarity.UNCOMMON, mage.cards.g.GateToPhyrexia.class)); + cards.add(new SetCardInfo("Gauntlet of Might", 202, Rarity.RARE, mage.cards.g.GauntletOfMight.class)); + cards.add(new SetCardInfo("Giant Growth", 156, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Tortoise", 50, Rarity.COMMON, mage.cards.g.GiantTortoise.class)); + cards.add(new SetCardInfo("Glasses of Urza", 203, Rarity.COMMON, mage.cards.g.GlassesOfUrza.class)); + cards.add(new SetCardInfo("Gloom", 83, Rarity.RARE, mage.cards.g.Gloom.class)); + cards.add(new SetCardInfo("Goblin Bully", 117, Rarity.COMMON, mage.cards.g.GoblinBully.class)); + cards.add(new SetCardInfo("Goblin Cavaliers", 118, Rarity.COMMON, mage.cards.g.GoblinCavaliers.class)); + cards.add(new SetCardInfo("Goblin Caves", 119, Rarity.COMMON, mage.cards.g.GoblinCaves.class)); + cards.add(new SetCardInfo("Goblin Firestarter", 120, Rarity.COMMON, mage.cards.g.GoblinFirestarter.class)); + cards.add(new SetCardInfo("Goblin General", 121, Rarity.UNCOMMON, mage.cards.g.GoblinGeneral.class)); + cards.add(new SetCardInfo("Goblin Shrine", 122, Rarity.COMMON, mage.cards.g.GoblinShrine.class)); + cards.add(new SetCardInfo("Goblin Warrens", 123, Rarity.UNCOMMON, mage.cards.g.GoblinWarrens.class)); + cards.add(new SetCardInfo("Gorilla War Cry", 124, Rarity.COMMON, mage.cards.g.GorillaWarCry.class)); + cards.add(new SetCardInfo("Grapeshot Catapult", 204, Rarity.UNCOMMON, mage.cards.g.GrapeshotCatapult.class)); + cards.add(new SetCardInfo("Gravebind", 84, Rarity.COMMON, mage.cards.g.Gravebind.class)); + cards.add(new SetCardInfo("Guardian Beast", 85, Rarity.RARE, mage.cards.g.GuardianBeast.class)); + cards.add(new SetCardInfo("Hasran Ogress", 86, Rarity.COMMON, mage.cards.h.HasranOgress.class)); + cards.add(new SetCardInfo("Healing Salve", 14, Rarity.COMMON, mage.cards.h.HealingSalve.class)); + cards.add(new SetCardInfo("Horn of Deafening", 205, Rarity.UNCOMMON, mage.cards.h.HornOfDeafening.class)); + cards.add(new SetCardInfo("Howl from Beyond", 87, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); + cards.add(new SetCardInfo("Icy Manipulator", 207, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); + cards.add(new SetCardInfo("Instill Energy", 157, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); + cards.add(new SetCardInfo("In the Eye of Chaos", 51, Rarity.RARE, mage.cards.i.InTheEyeOfChaos.class)); + cards.add(new SetCardInfo("Ironhoof Ox", 158, Rarity.COMMON, mage.cards.i.IronhoofOx.class)); + cards.add(new SetCardInfo("Island Sanctuary", 15, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Jade Monolith", 208, Rarity.RARE, mage.cards.j.JadeMonolith.class)); + cards.add(new SetCardInfo("Juggernaut", 209, Rarity.UNCOMMON, mage.cards.j.Juggernaut.class)); + cards.add(new SetCardInfo("Junún Efreet", 88, Rarity.UNCOMMON, mage.cards.j.JununEfreet.class)); + cards.add(new SetCardInfo("Kismet", 17, Rarity.RARE, mage.cards.k.Kismet.class)); + cards.add(new SetCardInfo("Kormus Bell", 210, Rarity.RARE, mage.cards.k.KormusBell.class)); + cards.add(new SetCardInfo("Kudzu", 159, Rarity.UNCOMMON, mage.cards.k.Kudzu.class)); + cards.add(new SetCardInfo("Last Chance", 125, Rarity.RARE, mage.cards.l.LastChance.class)); + cards.add(new SetCardInfo("Lava Flow", 126, Rarity.COMMON, mage.cards.l.LavaFlow.class)); + cards.add(new SetCardInfo("Leeches", 18, Rarity.RARE, mage.cards.l.Leeches.class)); + cards.add(new SetCardInfo("Library of Alexandria", 245, Rarity.RARE, mage.cards.l.LibraryOfAlexandria.class)); + cards.add(new SetCardInfo("Library of Leng", 211, Rarity.COMMON, mage.cards.l.LibraryOfLeng.class)); + cards.add(new SetCardInfo("Lich", 89, Rarity.RARE, mage.cards.l.Lich.class)); + cards.add(new SetCardInfo("Lifeforce", 160, Rarity.RARE, mage.cards.l.Lifeforce.class)); + cards.add(new SetCardInfo("Living Lands", 161, Rarity.RARE, mage.cards.l.LivingLands.class)); + cards.add(new SetCardInfo("Living Wall", 212, Rarity.UNCOMMON, mage.cards.l.LivingWall.class)); + cards.add(new SetCardInfo("Mahamoti Djinn", 52, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); + cards.add(new SetCardInfo("Mana Matrix", 213, Rarity.RARE, mage.cards.m.ManaMatrix.class)); + cards.add(new SetCardInfo("Mana Vault", 214, Rarity.RARE, mage.cards.m.ManaVault.class)); + cards.add(new SetCardInfo("Martyrs of Korlis", 20, Rarity.UNCOMMON, mage.cards.m.MartyrsOfKorlis.class)); + cards.add(new SetCardInfo("Maze of Ith", 246, Rarity.RARE, mage.cards.m.MazeOfIth.class)); + cards.add(new SetCardInfo("Mightstone", 215, Rarity.COMMON, mage.cards.m.Mightstone.class)); + cards.add(new SetCardInfo("Mijae Djinn", 127, Rarity.RARE, mage.cards.m.MijaeDjinn.class)); + cards.add(new SetCardInfo("Mishra's Workshop", 247, Rarity.RARE, mage.cards.m.MishrasWorkshop.class)); + cards.add(new SetCardInfo("Mystic Decree", 53, Rarity.UNCOMMON, mage.cards.m.MysticDecree.class)); + cards.add(new SetCardInfo("Naked Singularity", 216, Rarity.RARE, mage.cards.n.NakedSingularity.class)); + cards.add(new SetCardInfo("Oasis", 248, Rarity.COMMON, mage.cards.o.Oasis.class)); + cards.add(new SetCardInfo("Obelisk of Undoing", 217, Rarity.RARE, mage.cards.o.ObeliskOfUndoing.class)); + cards.add(new SetCardInfo("Obsianus Golem", 218, Rarity.COMMON, mage.cards.o.ObsianusGolem.class)); + cards.add(new SetCardInfo("Ogre Taskmaster", 128, Rarity.COMMON, mage.cards.o.OgreTaskmaster.class)); + cards.add(new SetCardInfo("Onulet", 219, Rarity.COMMON, mage.cards.o.Onulet.class)); + cards.add(new SetCardInfo("Orcish Mechanics", 129, Rarity.UNCOMMON, mage.cards.o.OrcishMechanics.class)); + cards.add(new SetCardInfo("Osai Vultures", 21, Rarity.COMMON, mage.cards.o.OsaiVultures.class)); + cards.add(new SetCardInfo("Overwhelming Forces", 92, Rarity.RARE, mage.cards.o.OverwhelmingForces.class)); + cards.add(new SetCardInfo("Owl Familiar", 54, Rarity.COMMON, mage.cards.o.OwlFamiliar.class)); + cards.add(new SetCardInfo("Pentagram of the Ages", 220, Rarity.UNCOMMON, mage.cards.p.PentagramOfTheAges.class)); + cards.add(new SetCardInfo("Personal Incarnation", 22, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); + cards.add(new SetCardInfo("Phantasmal Forces", 55, Rarity.COMMON, mage.cards.p.PhantasmalForces.class)); + cards.add(new SetCardInfo("Phantasmal Terrain", 56, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); + cards.add(new SetCardInfo("Planar Gate", 221, Rarity.UNCOMMON, mage.cards.p.PlanarGate.class)); + cards.add(new SetCardInfo("Plateau", 249, Rarity.RARE, mage.cards.p.Plateau.class)); + cards.add(new SetCardInfo("Power Artifact", 57, Rarity.RARE, mage.cards.p.PowerArtifact.class)); + cards.add(new SetCardInfo("Primal Clay", 222, Rarity.COMMON, mage.cards.p.PrimalClay.class)); + cards.add(new SetCardInfo("Prodigal Sorcerer", 58, Rarity.UNCOMMON, mage.cards.p.ProdigalSorcerer.class)); + cards.add(new SetCardInfo("Prowling Nightstalker", 93, Rarity.COMMON, mage.cards.p.ProwlingNightstalker.class)); + cards.add(new SetCardInfo("Radjan Spirit", 162, Rarity.UNCOMMON, mage.cards.r.RadjanSpirit.class)); + cards.add(new SetCardInfo("Rain of Daggers", 94, Rarity.RARE, mage.cards.r.RainOfDaggers.class)); + cards.add(new SetCardInfo("Rakalite", 223, Rarity.RARE, mage.cards.r.Rakalite.class)); + cards.add(new SetCardInfo("Reconstruction", 59, Rarity.COMMON, mage.cards.r.Reconstruction.class)); + cards.add(new SetCardInfo("Red Elemental Blast", 131, Rarity.UNCOMMON, mage.cards.r.RedElementalBlast.class)); + cards.add(new SetCardInfo("Regrowth", 163, Rarity.RARE, mage.cards.r.Regrowth.class)); + cards.add(new SetCardInfo("Righteous Charge", 23, Rarity.COMMON, mage.cards.r.RighteousCharge.class)); + cards.add(new SetCardInfo("Ring of Renewal", 224, Rarity.RARE, mage.cards.r.RingOfRenewal.class)); + cards.add(new SetCardInfo("Roc of Kher Ridges", 132, Rarity.UNCOMMON, mage.cards.r.RocOfKherRidges.class)); + cards.add(new SetCardInfo("Rock Hydra", 133, Rarity.RARE, mage.cards.r.RockHydra.class)); + cards.add(new SetCardInfo("Rockslide Ambush", 134, Rarity.COMMON, mage.cards.r.RockslideAmbush.class)); + cards.add(new SetCardInfo("Sandstorm", 164, Rarity.COMMON, mage.cards.s.Sandstorm.class)); + cards.add(new SetCardInfo("Savannah", 250, Rarity.RARE, mage.cards.s.Savannah.class)); + cards.add(new SetCardInfo("Savannah Lions", 24, Rarity.UNCOMMON, mage.cards.s.SavannahLions.class)); + cards.add(new SetCardInfo("Scavenger Folk", 166, Rarity.COMMON, mage.cards.s.ScavengerFolk.class)); + cards.add(new SetCardInfo("Scavenging Ghoul", 95, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); + cards.add(new SetCardInfo("Scrubland", 251, Rarity.RARE, mage.cards.s.Scrubland.class)); + cards.add(new SetCardInfo("Sea Serpent", 60, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); + cards.add(new SetCardInfo("Sedge Troll", 135, Rarity.RARE, mage.cards.s.SedgeTroll.class)); + cards.add(new SetCardInfo("Sengir Vampire", 96, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); + cards.add(new SetCardInfo("Serendib Djinn", 61, Rarity.RARE, mage.cards.s.SerendibDjinn.class)); + cards.add(new SetCardInfo("Serra Angel", 25, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); + cards.add(new SetCardInfo("Serra Aviary", 26, Rarity.UNCOMMON, mage.cards.s.SerraAviary.class)); + cards.add(new SetCardInfo("Shapeshifter", 226, Rarity.UNCOMMON, mage.cards.s.Shapeshifter.class)); + cards.add(new SetCardInfo("Shivan Dragon", 136, Rarity.RARE, mage.cards.s.ShivanDragon.class)); + cards.add(new SetCardInfo("Sinkhole", 97, Rarity.RARE, mage.cards.s.Sinkhole.class)); + cards.add(new SetCardInfo("Sleight of Hand", 62, Rarity.COMMON, mage.cards.s.SleightOfHand.class)); + cards.add(new SetCardInfo("Smoke", 137, Rarity.RARE, mage.cards.s.Smoke.class)); + cards.add(new SetCardInfo("Soldevi Machinist", 63, Rarity.UNCOMMON, mage.cards.s.SoldeviMachinist.class)); + cards.add(new SetCardInfo("Sol Ring", 227, Rarity.RARE, mage.cards.s.SolRing.class)); + cards.add(new SetCardInfo("Soul Shred", 98, Rarity.COMMON, mage.cards.s.SoulShred.class)); + cards.add(new SetCardInfo("Southern Elephant", 167, Rarity.COMMON, mage.cards.s.SouthernElephant.class)); + cards.add(new SetCardInfo("Spotted Griffin", 28, Rarity.COMMON, mage.cards.s.SpottedGriffin.class)); + cards.add(new SetCardInfo("Squall", 168, Rarity.UNCOMMON, mage.cards.s.Squall.class)); + cards.add(new SetCardInfo("Staff of Zegon", 229, Rarity.COMMON, mage.cards.s.StaffOfZegon.class)); + cards.add(new SetCardInfo("Stasis", 64, Rarity.RARE, mage.cards.s.Stasis.class)); + cards.add(new SetCardInfo("Steam Catapult", 29, Rarity.RARE, mage.cards.s.SteamCatapult.class)); + cards.add(new SetCardInfo("Strip Mine", 252, Rarity.RARE, mage.cards.s.StripMine.class)); + cards.add(new SetCardInfo("Swords to Plowshares", 30, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); + cards.add(new SetCardInfo("Sylvan Tutor", 169, Rarity.UNCOMMON, mage.cards.s.SylvanTutor.class)); + cards.add(new SetCardInfo("Symbol of Unsummoning", 65, Rarity.COMMON, mage.cards.s.SymbolOfUnsummoning.class)); + cards.add(new SetCardInfo("Tablet of Epityr", 230, Rarity.COMMON, mage.cards.t.TabletOfEpityr.class)); + cards.add(new SetCardInfo("Taiga", 253, Rarity.RARE, mage.cards.t.Taiga.class)); + cards.add(new SetCardInfo("Talas Researcher", 66, Rarity.UNCOMMON, mage.cards.t.TalasResearcher.class)); + cards.add(new SetCardInfo("Tawnos's Wand", 231, Rarity.COMMON, mage.cards.t.TawnossWand.class)); + cards.add(new SetCardInfo("Tawnos's Weaponry", 232, Rarity.UNCOMMON, mage.cards.t.TawnossWeaponry.class)); + cards.add(new SetCardInfo("Temple Acolyte", 31, Rarity.COMMON, mage.cards.t.TempleAcolyte.class)); + cards.add(new SetCardInfo("Terror", 99, Rarity.COMMON, mage.cards.t.Terror.class)); + cards.add(new SetCardInfo("Tetravus", 233, Rarity.RARE, mage.cards.t.Tetravus.class)); + cards.add(new SetCardInfo("Theft of Dreams", 67, Rarity.UNCOMMON, mage.cards.t.TheftOfDreams.class)); + cards.add(new SetCardInfo("Thing from the Deep", 68, Rarity.RARE, mage.cards.t.ThingFromTheDeep.class)); + cards.add(new SetCardInfo("Thunder Dragon", 138, Rarity.RARE, mage.cards.t.ThunderDragon.class)); + cards.add(new SetCardInfo("Time Vault", 234, Rarity.RARE, mage.cards.t.TimeVault.class)); + cards.add(new SetCardInfo("Titania's Song", 170, Rarity.RARE, mage.cards.t.TitaniasSong.class)); + cards.add(new SetCardInfo("Transmute Artifact", 69, Rarity.RARE, mage.cards.t.TransmuteArtifact.class)); + cards.add(new SetCardInfo("Triassic Egg", 235, Rarity.RARE, mage.cards.t.TriassicEgg.class)); + cards.add(new SetCardInfo("Tropical Island", 254, Rarity.RARE, mage.cards.t.TropicalIsland.class)); + cards.add(new SetCardInfo("Tsunami", 171, Rarity.RARE, mage.cards.t.Tsunami.class)); + cards.add(new SetCardInfo("Tundra", 255, Rarity.RARE, mage.cards.t.Tundra.class)); + cards.add(new SetCardInfo("Two-Headed Giant of Foriys", 139, Rarity.UNCOMMON, mage.cards.t.TwoHeadedGiantOfForiys.class)); + cards.add(new SetCardInfo("Underground Sea", 256, Rarity.RARE, mage.cards.u.UndergroundSea.class)); + cards.add(new SetCardInfo("Urza's Chalice", 236, Rarity.COMMON, mage.cards.u.UrzasChalice.class)); + cards.add(new SetCardInfo("Urza's Mine", 257, Rarity.LAND, mage.cards.u.UrzasMine.class)); + cards.add(new SetCardInfo("Urza's Miter", 237, Rarity.RARE, mage.cards.u.UrzasMiter.class)); + cards.add(new SetCardInfo("Urza's Power Plant", 258, Rarity.LAND, mage.cards.u.UrzasPowerPlant.class)); + cards.add(new SetCardInfo("Urza's Tower", 259, Rarity.LAND, mage.cards.u.UrzasTower.class)); + cards.add(new SetCardInfo("Veteran Bodyguard", 32, Rarity.RARE, mage.cards.v.VeteranBodyguard.class)); + cards.add(new SetCardInfo("Volcanic Island", 260, Rarity.RARE, mage.cards.v.VolcanicIsland.class)); + cards.add(new SetCardInfo("War Mammoth", 172, Rarity.COMMON, mage.cards.w.WarMammoth.class)); + cards.add(new SetCardInfo("Warp Artifact", 100, Rarity.COMMON, mage.cards.w.WarpArtifact.class)); + cards.add(new SetCardInfo("Water Elemental", 70, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class)); + cards.add(new SetCardInfo("Weakness", 101, Rarity.COMMON, mage.cards.w.Weakness.class)); + cards.add(new SetCardInfo("Weakstone", 239, Rarity.UNCOMMON, mage.cards.w.Weakstone.class)); + cards.add(new SetCardInfo("Wheel of Fortune", 140, Rarity.RARE, mage.cards.w.WheelOfFortune.class)); + cards.add(new SetCardInfo("Whiptail Wurm", 173, Rarity.UNCOMMON, mage.cards.w.WhiptailWurm.class)); + cards.add(new SetCardInfo("White Knight", 33, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); + cards.add(new SetCardInfo("Wicked Pact", 102, Rarity.UNCOMMON, mage.cards.w.WickedPact.class)); + cards.add(new SetCardInfo("Wild Aesthir", 34, Rarity.COMMON, mage.cards.w.WildAesthir.class)); + cards.add(new SetCardInfo("Wild Griffin", 35, Rarity.COMMON, mage.cards.w.WildGriffin.class)); + cards.add(new SetCardInfo("Wild Ox", 174, Rarity.UNCOMMON, mage.cards.w.WildOx.class)); + cards.add(new SetCardInfo("Xenic Poltergeist", 104, Rarity.UNCOMMON, mage.cards.x.XenicPoltergeist.class)); + cards.add(new SetCardInfo("Yotian Soldier", 240, Rarity.COMMON, mage.cards.y.YotianSoldier.class)); + cards.add(new SetCardInfo("Zombie Master", 105, Rarity.UNCOMMON, mage.cards.z.ZombieMaster.class)); + } + } \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Mirage.java b/Mage.Sets/src/mage/sets/Mirage.java index 42f713c172..e8cf105e0b 100644 --- a/Mage.Sets/src/mage/sets/Mirage.java +++ b/Mage.Sets/src/mage/sets/Mirage.java @@ -84,6 +84,7 @@ public class Mirage extends ExpansionSet { cards.add(new SetCardInfo("Celestial Dawn", 210, Rarity.RARE, mage.cards.c.CelestialDawn.class)); cards.add(new SetCardInfo("Cerulean Wyvern", 57, Rarity.UNCOMMON, mage.cards.c.CeruleanWyvern.class)); cards.add(new SetCardInfo("Chaos Charm", 163, Rarity.COMMON, mage.cards.c.ChaosCharm.class)); + cards.add(new SetCardInfo("Chaosphere", 164, Rarity.RARE, mage.cards.c.Chaosphere.class)); cards.add(new SetCardInfo("Charcoal Diamond", 261, Rarity.UNCOMMON, mage.cards.c.CharcoalDiamond.class)); cards.add(new SetCardInfo("Choking Sands", 11, Rarity.COMMON, mage.cards.c.ChokingSands.class)); cards.add(new SetCardInfo("Civic Guildmage", 211, Rarity.COMMON, mage.cards.c.CivicGuildmage.class)); From 89b7d4e0e65130f85b343000d659ee1b85389181 Mon Sep 17 00:00:00 2001 From: igoudt Date: Wed, 28 Jun 2017 21:51:01 +0200 Subject: [PATCH 044/160] UT for #3550 --- .../abilities/keywords/OfferingTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/OfferingTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/OfferingTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/OfferingTest.java new file mode 100644 index 0000000000..a909755a9d --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/OfferingTest.java @@ -0,0 +1,51 @@ +package org.mage.test.cards.abilities.keywords; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class OfferingTest extends CardTestPlayerBase { + + private final static String nezumiPatron = "Patron of the Nezumi"; + + + @Test + public void testOfferRatDecreaseCC() { + + String kurosTaken = "Kuro's Taken"; + + addCard(Zone.HAND, playerA, nezumiPatron, 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 8); + addCard(Zone.BATTLEFIELD, playerA, kurosTaken); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, nezumiPatron); + setChoice(playerA, "Yes"); + addTarget(playerA, kurosTaken); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertGraveyardCount(playerA, kurosTaken, 1); + assertPermanentCount(playerA, nezumiPatron, 1); + assertTappedCount("Swamp", true, 5); // {5}{B}{B} - {1}{B} = {4}{B} = 5 swamps tapped + } + + @Test + public void testDontOfferRatNotDecreaseCC() { + + String kurosTaken = "Kuro's Taken"; + + addCard(Zone.HAND, playerA, nezumiPatron, 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 8); + addCard(Zone.BATTLEFIELD, playerA, kurosTaken); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, nezumiPatron); + setChoice(playerA, "No"); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, kurosTaken, 1); + assertPermanentCount(playerA, nezumiPatron, 1); + assertTappedCount("Swamp", true, 7); // {5}{B}{B} - {1}{B} = {4}{B} = 7 swamps tapped + } +} From d58a438ba950c12aebca89c5143f534e250c983d Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 28 Jun 2017 16:33:26 -0500 Subject: [PATCH 045/160] - Fixed Bug #3541. Nomad Mythmaker. --- Mage.Sets/src/mage/cards/n/NomadMythmaker.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Mage.Sets/src/mage/cards/n/NomadMythmaker.java b/Mage.Sets/src/mage/cards/n/NomadMythmaker.java index bee96d0973..461bd1a18a 100644 --- a/Mage.Sets/src/mage/cards/n/NomadMythmaker.java +++ b/Mage.Sets/src/mage/cards/n/NomadMythmaker.java @@ -57,7 +57,7 @@ import mage.target.common.TargetControlledPermanent; */ public class NomadMythmaker extends CardImpl { - private static final FilterCard FILTER = new FilterCard("Aura card"); + private static final FilterCard FILTER = new FilterCard("Aura card from a graveyard"); static { FILTER.add(new CardTypePredicate(CardType.ENCHANTMENT)); @@ -65,7 +65,7 @@ public class NomadMythmaker extends CardImpl { } public NomadMythmaker(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add("Human"); this.subtype.add("Nomad"); this.subtype.add("Cleric"); @@ -114,16 +114,15 @@ class NomadMythmakerEffect extends OneShotEffect { || aura == null) { return false; } - FilterControlledCreaturePermanent FILTER = new FilterControlledCreaturePermanent("Aura card in a graveyard"); + FilterControlledCreaturePermanent FILTER = new FilterControlledCreaturePermanent("Choose a creature you control"); TargetControlledPermanent target = new TargetControlledPermanent(FILTER); target.setNotTarget(true); - if (target.canChoose(source.getControllerId(), game) - && controller.choose(Outcome.PutCardInPlay, target, source.getSourceId(), game)) { + if (controller.choose(Outcome.PutCardInPlay, target, source.getSourceId(), game)) { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null && !permanent.cantBeAttachedBy(aura, game)) { game.getState().setValue("attachTo:" + aura.getId(), permanent); - controller.moveCards(aura, Zone.BATTLEFIELD, source, game); + aura.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), controller.getId()); return permanent.addAttachment(aura.getId(), game); } } From 831985a7bd0ae0b8e334d0ffa1db81ddeffb6bf6 Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 28 Jun 2017 16:55:24 -0500 Subject: [PATCH 046/160] - Fixed Bug #3501 --- .../main/java/mage/abilities/effects/common/PopulateEffect.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage/src/main/java/mage/abilities/effects/common/PopulateEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PopulateEffect.java index 4a61c9e6db..aceb92f35a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PopulateEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PopulateEffect.java @@ -82,6 +82,7 @@ public class PopulateEffect extends OneShotEffect { Player player = game.getPlayer(source.getControllerId()); if (player != null) { Target target = new TargetPermanent(filter); + target.setNotTarget(true); if (target.canChoose(source.getControllerId(), game)) { player.choose(Outcome.Copy, target, source.getSourceId(), game); Permanent tokenToCopy = game.getPermanent(target.getFirstTarget()); From d296934c036467a139b6caefff10eab46422cd35 Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 28 Jun 2017 17:02:32 -0500 Subject: [PATCH 047/160] - Fixed Bug #3539 --- Mage.Sets/src/mage/cards/d/DarkIntimations.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DarkIntimations.java b/Mage.Sets/src/mage/cards/d/DarkIntimations.java index 60d1ae0671..7259f76bc0 100644 --- a/Mage.Sets/src/mage/cards/d/DarkIntimations.java +++ b/Mage.Sets/src/mage/cards/d/DarkIntimations.java @@ -150,14 +150,15 @@ class DarkIntimationsEffect extends OneShotEffect { } } TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(filterCard); - if (target.canChoose(source.getSourceId(), source.getControllerId(), game) && controller.choose(Outcome.ReturnToHand, target, source.getSourceId(), game)) { + if (target.canChoose(source.getSourceId(), source.getControllerId(), game) + && controller.choose(Outcome.ReturnToHand, target, source.getSourceId(), game)) { Card card = game.getCard(target.getFirstTarget()); if (card == null) { return false; } controller.moveCards(card, Zone.HAND, source, game); - controller.drawCards(1, game); } + controller.drawCards(1, game); return true; } } @@ -217,7 +218,8 @@ class DarkIntimationsReplacementEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget(); - return creature != null && event.getTargetId().equals(getTargetPointer().getFirst(game, source)); + return creature != null + && event.getTargetId().equals(getTargetPointer().getFirst(game, source)); } @Override From 2b24d95ac590fa7213d20f64c26de0b48a2d426a Mon Sep 17 00:00:00 2001 From: spjspj Date: Thu, 29 Jun 2017 09:44:54 +1000 Subject: [PATCH 048/160] HOU ChampionOfWits --- Mage.Sets/src/mage/cards/c/ChampionOfWits.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfWits.java b/Mage.Sets/src/mage/cards/c/ChampionOfWits.java index 5b0f471173..c4cc809e0c 100644 --- a/Mage.Sets/src/mage/cards/c/ChampionOfWits.java +++ b/Mage.Sets/src/mage/cards/c/ChampionOfWits.java @@ -78,7 +78,7 @@ class ChampionOfWitsEffect extends OneShotEffect { public ChampionOfWitsEffect() { super(Outcome.Benefit); - staticText = "When {this} enters the battlefield, you may draw cards equal to its power. If you do, discard two cards."; + staticText = "you may draw cards equal to its power. If you do, discard two cards."; } public ChampionOfWitsEffect(final ChampionOfWitsEffect effect) { From a450cf8ed913f7b109b5e2281f511f4d61232e64 Mon Sep 17 00:00:00 2001 From: lilhomie96 Date: Wed, 28 Jun 2017 22:44:11 -0500 Subject: [PATCH 049/160] Ninth Edition Box fixed Ninth Edition --- Mage.Sets/src/mage/sets/NinthEdition.java | 7 ----- Mage.Sets/src/mage/sets/NinthEditionBox.java | 30 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/NinthEditionBox.java diff --git a/Mage.Sets/src/mage/sets/NinthEdition.java b/Mage.Sets/src/mage/sets/NinthEdition.java index bd71afeaf0..b2f837c6f2 100644 --- a/Mage.Sets/src/mage/sets/NinthEdition.java +++ b/Mage.Sets/src/mage/sets/NinthEdition.java @@ -71,7 +71,6 @@ public class NinthEdition extends ExpansionSet { cards.add(new SetCardInfo("Confiscate", 68, Rarity.UNCOMMON, mage.cards.c.Confiscate.class)); cards.add(new SetCardInfo("Consume Spirit", 119, Rarity.UNCOMMON, mage.cards.c.ConsumeSpirit.class)); cards.add(new SetCardInfo("Contaminated Bond", 120, Rarity.COMMON, mage.cards.c.ContaminatedBond.class)); - cards.add(new SetCardInfo("Coral Eel", 3, Rarity.COMMON, mage.cards.c.CoralEel.class)); cards.add(new SetCardInfo("Counsel of the Soratami", 69, Rarity.COMMON, mage.cards.c.CounselOfTheSoratami.class)); cards.add(new SetCardInfo("Cowardice", 70, Rarity.RARE, mage.cards.c.Cowardice.class)); cards.add(new SetCardInfo("Crafty Pathmage", 71, Rarity.COMMON, mage.cards.c.CraftyPathmage.class)); @@ -94,7 +93,6 @@ public class NinthEdition extends ExpansionSet { cards.add(new SetCardInfo("Dragon's Claw", 296, Rarity.UNCOMMON, mage.cards.d.DragonsClaw.class)); cards.add(new SetCardInfo("Dream Prowler", 74, Rarity.UNCOMMON, mage.cards.d.DreamProwler.class)); cards.add(new SetCardInfo("Drudge Skeletons", 126, Rarity.UNCOMMON, mage.cards.d.DrudgeSkeletons.class)); - cards.add(new SetCardInfo("Eager Cadet", 1, Rarity.COMMON, mage.cards.e.EagerCadet.class)); cards.add(new SetCardInfo("Early Harvest", 235, Rarity.RARE, mage.cards.e.EarlyHarvest.class)); cards.add(new SetCardInfo("Elvish Bard", 236, Rarity.UNCOMMON, mage.cards.e.ElvishBard.class)); cards.add(new SetCardInfo("Elvish Berserker", 237, Rarity.COMMON, mage.cards.e.ElvishBerserker.class)); @@ -103,7 +101,6 @@ public class NinthEdition extends ExpansionSet { cards.add(new SetCardInfo("Elvish Warrior", 240, Rarity.COMMON, mage.cards.e.ElvishWarrior.class)); cards.add(new SetCardInfo("Emperor Crocodile", 241, Rarity.RARE, mage.cards.e.EmperorCrocodile.class)); cards.add(new SetCardInfo("Enfeeblement", 127, Rarity.COMMON, mage.cards.e.Enfeeblement.class)); - cards.add(new SetCardInfo("Enormous Baloth", 9, Rarity.UNCOMMON, mage.cards.e.EnormousBaloth.class)); cards.add(new SetCardInfo("Enrage", 180, Rarity.UNCOMMON, mage.cards.e.Enrage.class)); cards.add(new SetCardInfo("Evacuation", 75, Rarity.RARE, mage.cards.e.Evacuation.class)); cards.add(new SetCardInfo("Execute", 128, Rarity.UNCOMMON, mage.cards.e.Execute.class)); @@ -165,7 +162,6 @@ public class NinthEdition extends ExpansionSet { cards.add(new SetCardInfo("Hypnotic Specter", 141, Rarity.RARE, mage.cards.h.HypnoticSpecter.class)); cards.add(new SetCardInfo("Icy Manipulator", 299, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class)); cards.add(new SetCardInfo("Imaginary Pet", 82, Rarity.RARE, mage.cards.i.ImaginaryPet.class)); - cards.add(new SetCardInfo("Index", 5, Rarity.COMMON, mage.cards.i.Index.class)); cards.add(new SetCardInfo("Infantry Veteran", 21, Rarity.COMMON, mage.cards.i.InfantryVeteran.class)); cards.add(new SetCardInfo("Inspirit", 22, Rarity.UNCOMMON, mage.cards.i.Inspirit.class)); cards.add(new SetCardInfo("Island", 335, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); @@ -303,7 +299,6 @@ public class NinthEdition extends ExpansionSet { cards.add(new SetCardInfo("Soul Feast", 164, Rarity.UNCOMMON, mage.cards.s.SoulFeast.class)); cards.add(new SetCardInfo("Soul Warden", 46, Rarity.UNCOMMON, mage.cards.s.SoulWarden.class)); cards.add(new SetCardInfo("Spellbook", 309, Rarity.UNCOMMON, mage.cards.s.Spellbook.class)); - cards.add(new SetCardInfo("Spined Wurm", 10, Rarity.COMMON, mage.cards.s.SpinedWurm.class)); cards.add(new SetCardInfo("Spineless Thug", 165, Rarity.COMMON, mage.cards.s.SpinelessThug.class)); cards.add(new SetCardInfo("Spirit Link", 47, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); cards.add(new SetCardInfo("Stone Rain", 221, Rarity.COMMON, mage.cards.s.StoneRain.class)); @@ -348,13 +343,11 @@ public class NinthEdition extends ExpansionSet { cards.add(new SetCardInfo("Urza's Tower", 329, Rarity.COMMON, mage.cards.u.UrzasTower.class)); cards.add(new SetCardInfo("Utopia Tree", 277, Rarity.RARE, mage.cards.u.UtopiaTree.class)); cards.add(new SetCardInfo("Venerable Monk", 51, Rarity.COMMON, mage.cards.v.VenerableMonk.class)); - cards.add(new SetCardInfo("Vengeance", 2, Rarity.UNCOMMON, mage.cards.v.Vengeance.class)); cards.add(new SetCardInfo("Verdant Force", 278, Rarity.RARE, mage.cards.v.VerdantForce.class)); cards.add(new SetCardInfo("Verduran Enchantress", 279, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); cards.add(new SetCardInfo("Veteran Cavalier", 52, Rarity.COMMON, mage.cards.v.VeteranCavalier.class)); cards.add(new SetCardInfo("Viashino Sandstalker", 225, Rarity.UNCOMMON, mage.cards.v.ViashinoSandstalker.class)); cards.add(new SetCardInfo("Viridian Shaman", 280, Rarity.UNCOMMON, mage.cards.v.ViridianShaman.class)); - cards.add(new SetCardInfo("Vizzerdrix", 7, Rarity.RARE, mage.cards.v.Vizzerdrix.class)); cards.add(new SetCardInfo("Volcanic Hammer", 226, Rarity.COMMON, mage.cards.v.VolcanicHammer.class)); cards.add(new SetCardInfo("Vulshok Morningstar", 315, Rarity.UNCOMMON, mage.cards.v.VulshokMorningstar.class)); cards.add(new SetCardInfo("Wanderguard Sentry", 111, Rarity.COMMON, mage.cards.w.WanderguardSentry.class)); diff --git a/Mage.Sets/src/mage/sets/NinthEditionBox.java b/Mage.Sets/src/mage/sets/NinthEditionBox.java new file mode 100644 index 0000000000..25b1fa11f5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/NinthEditionBox.java @@ -0,0 +1,30 @@ +package mage.sets; + +import mage.cards.CardGraphicInfo; +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +public class NinthEditionBox extends ExpansionSet { + + private static final NinthEditionBox instance = new NinthEditionBox(); + + public static NinthEditionBox getInstance() { + return instance; + } + + + private NinthEditionBox() { + super ("Ninth Edition Box", "9EB", ExpansionSet.buildDate(2005, 7, 29), SetType.CORE); + this.hasBoosters = false; + cards.add(new SetCardInfo("Corel Eel", 3, Rarity.COMMON, mage.cards.c.CoralEel.class)); + cards.add(new SetCardInfo("Eager Cadet", 1, Rarity.COMMON, mage.cards.e.EagerCadet.class)); + cards.add(new SetCardInfo("Enormous Baloth", 9, Rarity.UNCOMMON, mage.cards.e.EnormousBaloth.class)); + cards.add(new SetCardInfo("Giant Octopus", 4, Rarity.COMMON, mage.cards.g.GiantOctopus.class)); + cards.add(new SetCardInfo("Goblin Raider", 8, Rarity.COMMON, mage.cards.g.GoblinRaider.class)); + cards.add(new SetCardInfo("Index", 5, Rarity.COMMON, mage.cards.i.Index.class)); + cards.add(new SetCardInfo("Spined Wurm", 10, Rarity.COMMON, mage.cards.s.SpinedWurm.class)); + cards.add(new SetCardInfo("Vengeance", 2, Rarity.UNCOMMON, mage.cards.v.Vengeance.class)); + cards.add(new SetCardInfo("Vizzerdrix", 7, Rarity.RARE, mage.cards.v.Vizzerdrix.class)); + } +} \ No newline at end of file From d4a76bb3816321dd1a0a36b749970c704bb22821 Mon Sep 17 00:00:00 2001 From: spjspj Date: Thu, 29 Jun 2017 15:44:54 +1000 Subject: [PATCH 050/160] HOU ChampionOfWits --- Mage.Sets/src/mage/cards/c/ChampionOfWits.java | 2 +- Utils/mtg-cards-data.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfWits.java b/Mage.Sets/src/mage/cards/c/ChampionOfWits.java index c4cc809e0c..c861acbd6a 100644 --- a/Mage.Sets/src/mage/cards/c/ChampionOfWits.java +++ b/Mage.Sets/src/mage/cards/c/ChampionOfWits.java @@ -57,7 +57,7 @@ public class ChampionOfWits extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(1); - // When Champion of Wits enters the battlefield, you may draw cards equal to its power. If you do, discard two cards. + // When Champion of Wits enters the battlefield, you may draw cards equal to its power. If you do, discard two cards this.addAbility(new EntersBattlefieldTriggeredAbility(new ChampionOfWitsEffect(), true)); // Eternalize {5}{U}{U} diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index f2b6dbc328..fb7da4df2c 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31650,7 +31650,7 @@ Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counte Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| Accursed Horde|Hour of Devastation|56|U|{3}{B}|Creature - Zombie|3|3|{1}{B}: Target attacking Zombie gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.)| -Ammit Eternal|Hour of Devastation|57|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| +Ammit Eternal|Hour of Devastation|57|R|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| @@ -31658,7 +31658,7 @@ Dreamstealer|Hour of Devastation|63|R|{2}{B}|Creature - Human Wizard|1|2|Menace$ Hour of Glory|Hour of Devastation|65|R|{3}{B}|Instant|||Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature.| Khenra Eternal|Hour of Devastation|66|C|{1}{B}|Creature - Zombie Jackal Warrior|2|2|Afflict 1 (Whenever this creature becomes blocked, defending player loses 1 life.)| Liliana's Defeat|Hour of Devastation|68|U|{B}|Sorcery|||Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life.| -Maurauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| +Marauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| Razaketh, the Foulblooded|Hour of Devastation|73|M|{5}{B}{B}{B}|Legendary Creature - Demon|8|8|Flying, trample$Pay 2 life, Sacrifice another creature: Search your library for a card and put that card into your hand. Then shuffle your library.| Razaketh's Ritual|Hour of Devastation|74|U|{3}{B}{B}|Sorcery|||Search your library for a card and put that card into your hand. Then shuffle your library.$Cycling {B} ({B}, Discard this card: Draw a card.)| Torment of Hailfire|Hour of Devastation|77|R|{X}{B}{B}|Sorcery|||Repeat the following process X times. Each opponent loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| From a72fe690180dd8bb620dd342e0ceb32631654293 Mon Sep 17 00:00:00 2001 From: igoudt Date: Thu, 29 Jun 2017 12:21:40 +0200 Subject: [PATCH 051/160] fixes #3537 --- .../src/mage/cards/m/MagewrightsStone.java | 8 ++--- .../cards/single/MagewrightStoneTest.java | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/MagewrightStoneTest.java diff --git a/Mage.Sets/src/mage/cards/m/MagewrightsStone.java b/Mage.Sets/src/mage/cards/m/MagewrightsStone.java index d5b70cb7af..2ba51261d1 100644 --- a/Mage.Sets/src/mage/cards/m/MagewrightsStone.java +++ b/Mage.Sets/src/mage/cards/m/MagewrightsStone.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.UUID; import mage.MageObject; import mage.abilities.Abilities; import mage.abilities.Ability; @@ -47,8 +46,9 @@ import mage.filter.predicate.Predicate; import mage.game.Game; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** - * * @author BursegSardaukar */ public class MagewrightsStone extends CardImpl { @@ -60,7 +60,7 @@ public class MagewrightsStone extends CardImpl { } public MagewrightsStone(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); // {1}, {T}: Untap target creature that has an activated ability with {T} in its cost. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new ManaCostsImpl("{1}")); @@ -91,7 +91,7 @@ class HasAbilityWithTapSymbolPredicate implements Predicate { } for (Ability ability : abilities) { - if (ability.getAbilityType() == AbilityType.ACTIVATED && !ability.getCosts().isEmpty()) { + if ((ability.getAbilityType() == AbilityType.ACTIVATED || ability.getAbilityType() == AbilityType.MANA) && !ability.getCosts().isEmpty()) { for (Cost cost : ability.getCosts()) { if (cost instanceof TapSourceCost) { return true; diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/MagewrightStoneTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/MagewrightStoneTest.java new file mode 100644 index 0000000000..bc6de56293 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/MagewrightStoneTest.java @@ -0,0 +1,29 @@ +package org.mage.test.cards.single; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class MagewrightStoneTest extends CardTestPlayerBase { + + private static final String magewrightStone = "Magewright's Stone"; + + + @Test + public void untapRosheenMeanderer() { + String meanderer = "Rosheen Meanderer"; + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + addCard(Zone.BATTLEFIELD, playerA, meanderer, 1, true); + addCard(Zone.BATTLEFIELD, playerA, magewrightStone); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1},{T}: Untap target creature", meanderer); + + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertTapped(magewrightStone, true); + assertTapped(meanderer, false); + + } +} From d43197c0ccb1c7236efe26cb42f9a65b0ba637c5 Mon Sep 17 00:00:00 2001 From: spjspj Date: Thu, 29 Jun 2017 22:56:06 +1000 Subject: [PATCH 052/160] Implement Uncage The Menagerie (HOU) --- .../src/mage/cards/u/UncageTheMenagerie.java | 161 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 162 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java diff --git a/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java b/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java new file mode 100644 index 0000000000..41b7381fc2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java @@ -0,0 +1,161 @@ +/* + * 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.u; + +import java.util.UUID; +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.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author spjspj + */ +public class UncageTheMenagerie extends CardImpl { + + public UncageTheMenagerie(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{G}{G}"); + + // Search your library for up to X creature cards with different names that each have converted mana cost X, reveal them, put them into your hand, then shuffle your library. + this.getSpellAbility().addEffect(new UncageTheMenagerieEffect()); + } + + public UncageTheMenagerie(final UncageTheMenagerie card) { + super(card); + } + + @Override + public UncageTheMenagerie copy() { + return new UncageTheMenagerie(this); + } +} + +class UncageTheMenagerieEffect extends OneShotEffect { + + private static final FilterCard filter = new FilterCard("creature"); + + static { + filter.add(new CardTypePredicate(CardType.CREATURE)); + } + + public UncageTheMenagerieEffect() { + super(Outcome.DrawCard); + this.staticText = "Search your library for up to X creature cards with different names that each have converted mana cost X, reveal them, put them into your hand, then shuffle your library."; + } + + public UncageTheMenagerieEffect(final UncageTheMenagerieEffect effect) { + super(effect); + } + + @Override + public UncageTheMenagerieEffect copy() { + return new UncageTheMenagerieEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Card sourceCard = game.getCard(source.getSourceId()); + if (player == null || sourceCard == null) { + return false; + } + + int xValue = source.getManaCostsToPay().getX(); + + UncageTheMenagerieTarget target = new UncageTheMenagerieTarget(xValue); + if (player.searchLibrary(target, game)) { + if (!target.getTargets().isEmpty()) { + Cards cards = new CardsImpl(); + for (UUID cardId : target.getTargets()) { + Card card = player.getLibrary().remove(cardId, game); + if (card != null) { + cards.add(card); + } + } + player.revealCards(sourceCard.getIdName(), cards, game); + player.moveCards(cards, Zone.HAND, source, game); + } + player.shuffleLibrary(source, game); + return true; + } + player.shuffleLibrary(source, game); + return false; + } +} + +class UncageTheMenagerieTarget extends TargetCardInLibrary { + + private int xValue; + + public UncageTheMenagerieTarget(int xValue) { + super(0, xValue, new FilterCreatureCard(xValue + " creature cards with different names")); + this.xValue = xValue; + } + + public UncageTheMenagerieTarget(final UncageTheMenagerieTarget target) { + super(target); + this.xValue = target.xValue; + } + + @Override + public UncageTheMenagerieTarget copy() { + return new UncageTheMenagerieTarget(this); + } + + @Override + public boolean canTarget(UUID id, Cards cards, Game game) { + Card card = cards.get(id, game); + if (card != null) { + for (UUID targetId : this.getTargets()) { + Card iCard = game.getCard(targetId); + if (iCard != null && iCard.getName().equals(card.getName())) { + return false; + } + } + if (!(card.isCreature() && card.getConvertedManaCost() == xValue)) { + return false; + } + + return filter.match(card, game); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index bcd59d5dd7..49fb373428 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -121,6 +121,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); + cards.add(new SetCardInfo("Uncage the Menagerie", 137, Rarity.MYTHIC, mage.cards.u.UncageTheMenagerie.class)); cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); cards.add(new SetCardInfo("Unraveling Mummy", 147, Rarity.UNCOMMON, mage.cards.u.UnravelingMummy.class)); cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); From 667d596f4300b17d6f5263d9dea5a1e2d322d3e2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 29 Jun 2017 15:20:37 +0200 Subject: [PATCH 053/160] [HOU] Updated mtg-cards-data.txt 2017-06-29 --- Utils/mtg-cards-data.txt | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index fb7da4df2c..4c4f82fdde 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31629,9 +31629,11 @@ Forest|Archenemy: Nicol Bolas|106|L||Basic Land - Forest|||{T}: Add {G} to your Adorned Pouncer|Hour of Devastation|2|R|{1}{W}|Creature - Cat|1|1|Double strike$Eternalize {3}{W}{W} ({3}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Cat with no mana cost. Eternalize only as a sorcery.)| Angel of Condemnation|Hour of Devastation|3|R|{2}{W}{W}|Creature - Angel|3|3|Flying, vigilance${2}{W}, {T}: Exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step.${2}{W}, {T}, Exert Angel of Condemnation: Exile another target creature until Angel of Condemnation leaves the battlefield. (An exerted creature won't untap during your next untap step.)| Angel of the God-Pharaoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2} ({2}, Discard this card: Draw a card.)| +Crested Sunmare|Hour of Devastation|6|M|{3}{W}{W}|Creature - Horse|5|5|Other Horses you control have indestructible.$At the beginning of each end step, if you gained life this turn, create a 5/5 white Horse creature token.| Desert's Hold|Hour of Devastation|8|U|{2}{W}|Enchantment - Aura|||Enchant creature$When Desert's Hold enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life.$Enchanted creature can't attack or block, and its activated abilities can't be activated.| Djeru, With Eyes Open|Hour of Devastation|10|R|{3}{W}{W}|Legendary Creature - Human Warrior|4|3|Vigilance$When Djeru, With Eyes Open enters the battlefield, you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library.$If a source would deal damage to a planeswalker you control, prevent 1 of that damage.| Gideon's Defeat|Hour of Devastation|13|U|{W}|Instant|||Exile target white creature that's attacking or blocking. If it was a Gideon planeswalker, you gain 5 life.| +God-Pharaoh's Faithful|Hour of Devastation|14|C|{W}|Creature - Human Wizard|0|4|Whenever you cast a blue, black or red spell, you gain 1 life.| Hour of Revelation|Hour of Devastation|15|R|{3}{W}{W}{W}|Sorcery|||Hour of Revelation costs {3} less to cast if there are ten or more nonland permanents on the battlefield.$Destroy all nonland permanents.| Oketra's Last Mercy|Hour of Devastation|18|R|{1}{W}{W}|Sorcery|||Your life total becomes your starting life total. Lands you control don't untap during your next untap phase| Overwhelming Splendor|Hour of Devastation|19|M|{6}{W}{W}|Enchantment - Aura Curse|||Enchant player$Creatures enchanted player controls lose all abilities and have base power and toughness 1/1.$Enchanted player can't activate abilities that aren't mana abilities or loyalty abilities.| @@ -31640,8 +31642,11 @@ Steadfast Sentinel|Hour of Devastation|24|C|{3}{W}|Creature - Human Cleric|2|3|V Steward of Solidarity|Hour of Devastation|25|U|{1}{W}|Creature - Human Warrior|2|2|{T}, Exert Steward of Solidarity: Create a 1/1 white Warrior creature token with vigilance. (An exerted creature won't untap during your next untap step.)| Vizier of the True|Hour of Devastation|28|U|{3}{W}|Creature - Human Cleric|3|2|You may exert Vizier of the True as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, tap target creature an opponent controls.| Champion of Wits|Hour of Devastation|31|R|{2}{U}|Creature - Naga Wizard|2|1|When Champion of Wits enters the battlefield, you may draw cards equal to its power. If you do, discard two cards.$Eternalize {5}{U}{U} ({5}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Naga Wizard with no mana cost. Eternalize only as a sorcery.)| +Eternal of Harsh Truths|Hour of Devastation|34|U|{2}{U}|Creature - Zombie Cleric|1|3|Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)$Whenever Eternal of Harsh Truths attacks and isn't blocked, draw a card.| Fraying Sanity|Hour of Devastation|35|R|{2}{U}|Enchantment - Aura Curse|||Enchant player$At the beginning of each end step, enchanted player puts the top X cards of his or her library into his or her graveyard, where X is the total number of cards put into his or her graveyard from anywhere this turn. | +Hour of Eternity|Hour of Devastation|36|R|{X}{X}{U}{U}{U}|Sorcery|||Exile X target creature cards from your graveyard. For each card exiled this way, create a token that's a copy of that card, except it's a 4/4 black Zombie.| Jace's Defeat|Hour of Devastation|38|U|{1}{U}|Instant|||Counter target blue spell. If it was a Jace planeswalker spell, scry 2.| +Kefnet's Last Word|Hour of Devastation|39|R|{2}{U}{U}|Sorcery|||Gain control of target artifact, creature or enchantment. Lands you control don't untap during your next untap step.| Nimble Obstructionist|Hour of Devastation|40|R|{2}{U}|Creature - Bird Wizard|3|1|Flash$Flying$Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.)$When you cycle Nimble Obstructionist, counter target activated or triggered ability you don't control.| Ominous Sphinx|Hour of Devastation|41|U|{3}{U}{U}|Creature - Sphinx|4|4|Flying$Whenever you cycle or discard a card,target creature an opponent controls gets -2/-0 until end of turn.| Proven Combatant|Hour of Devastation|42|C|{U}|Creature - Human Warrior|1|1|Eternalize {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Warrior with no mana cost. Eternalize only as a sorcery.) | @@ -31649,8 +31654,9 @@ Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counter target spell unless its controller pays {3}.$• Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| +Vizier of the Anointed|Hour of Devastation|55|U|{3}{U}|Creature - Human Cleric|2|4|When Vizier of the Anointed enters the battlefield, search your library for a creature card with embalm or eternalize, put it in your graveyard, then shuffle your library.$Whenever you eternalize or embalm a creature, draw a card.| Accursed Horde|Hour of Devastation|56|U|{3}{B}|Creature - Zombie|3|3|{1}{B}: Target attacking Zombie gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.)| -Ammit Eternal|Hour of Devastation|57|R|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| +Ammit Eternal|Hour of Devastation|57|R|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| @@ -31658,9 +31664,10 @@ Dreamstealer|Hour of Devastation|63|R|{2}{B}|Creature - Human Wizard|1|2|Menace$ Hour of Glory|Hour of Devastation|65|R|{3}{B}|Instant|||Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature.| Khenra Eternal|Hour of Devastation|66|C|{1}{B}|Creature - Zombie Jackal Warrior|2|2|Afflict 1 (Whenever this creature becomes blocked, defending player loses 1 life.)| Liliana's Defeat|Hour of Devastation|68|U|{B}|Sorcery|||Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life.| -Marauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| +Maurauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| +Merciless Eternal|Hour of Devastation|71|U|{2}{B}|Creature - Zombie Cleric|2|2|Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)${2}{B}, Discard a card: Merciless Eternal gets +2/+2 until end of turn.| Razaketh, the Foulblooded|Hour of Devastation|73|M|{5}{B}{B}{B}|Legendary Creature - Demon|8|8|Flying, trample$Pay 2 life, Sacrifice another creature: Search your library for a card and put that card into your hand. Then shuffle your library.| -Razaketh's Ritual|Hour of Devastation|74|U|{3}{B}{B}|Sorcery|||Search your library for a card and put that card into your hand. Then shuffle your library.$Cycling {B} ({B}, Discard this card: Draw a card.)| +Razaketh's Rite|Hour of Devastation|74|U|{3}{B}{B}|Sorcery|||Search your library for a card and put that card into your hand. Then shuffle your library.$Cycling {B} ({B}, Discard this card: Draw a card.)| Torment of Hailfire|Hour of Devastation|77|R|{X}{B}{B}|Sorcery|||Repeat the following process X times. Each opponent loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| Torment of Scarabs|Hour of Devastation|78|U|{3}{B}|Enchantment - Aura Curse|||Enchant player$At the beginning of enchanted player's upkeep, that player loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| Torment of Venom|Hour of Devastation|79|C|{2}{B}{B}|Instant|||Put three -1/-1 counters on target creature. Its controller loses 3 life unless he or she sacrifices another nonland permanent or discards a card.| @@ -31670,7 +31677,9 @@ Chaos Maw|Hour of Devastation|87|R|{5}{R}{R}|Creature - Hellion|6|6|When Chaos M Defiant Khenra|Hour of Devastation|89|C|{1}{R}|Creature - Jackal Warrior|2|2|| Earthshaker Khenra|Hour of Devastation|90|R|{1}{R}|Creature - Jackal Warrior|2|1|Haste$When Earthshaker Khenra enters the battlefield, target creature with power less than or equal to Earthshaker Khenra's power can't block this turn.$Eternalize {4}{R}{R} ({4}{R}{R}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Jackal Warrior with no mana cost. Eternalize only as a sorcery.)| Fervent Paincaster|Hour of Devastation|91|U|{2}{R}|Creature - Human Wizard|3|1|{T}: Fervent Paincaster deals 1 damage to target player.${T}, Exert Fervent Paincaster: It deals 1 damage to target creature. (An exerted creature won't untap during its controller's next untap step.)| +Frontline Devastator|Hour of Devastation|93|C|{3}{R}|Creature - Zombie Minotaur Warrior|3|3|Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)${1}{R}: Frontline Devastator gets +1/+0 until end of turn.| Gilded Cerodon|Hour of Devastation|94|C|{4}{R}|Creature - Beast|4|4|Whenever Gilded Cerodon attacks, if you control a Desert or there is a Desert card in your graveyard, target creature can't block this turn.| +Hazoret's Undying Fury|Hour of Devastation|96|R|{4}{R}{R}|Sorcery|||Shuffle your library, then exile the top four cards. You may cast any number of nonland cards with converted mana cost 5 or less from among them without paying their mana costs. Land you control don't untap during your next untap step.| Imminent Doom|Hour of Devastation|98|R|{2}{R}|Enchantment|||Imminent Doom enters the battlefield with a doom counter on it.$Whenever you cast a spell with converted mana cost equal to the number of doom counters on Imminent Doom, Imminent Doom deals that much damage to target creature or player. Then put a doom counter on Imminent Doom. | Inferno Jet|Hour of Devastation|99|U|{5}{R}|Sorcery|||Inferno Jet deals 6 damage to target opponent.$Cycling {2} ({2}, Discard this card: Draw a card.)| Khenra Scrapper|Hour of Devastation|100|C|{2}{R}|Creature - Jackal Warrior|2|3|Menace$You may exert Khenra Scrapper as it attacks. When you do, it gets +2/+0 until end of turn. (An exerted creature won't untap during your next untap step.)| @@ -31680,6 +31689,7 @@ Sand Strangler|Hour of Devastation|107|U|{3}{R}|Creature - Beast|3|3|When Sand S Wildfire Eternal|Hour of Devastation|109|R|{3}{R}|Creature - Zombie Jackal Cleric|1|4|Afflict 4 (Whenever this creature becomes blocked, defending player loses 4 life.)$Whenever Wildfire Eternal attacks and isn't blocked, you may cast an instant or sorcery card from your hand without paying its mana cost.| Hope Tender|Hour of Devastation|119|U|{1}{G}|Creature - Human Druid|2|2|{1}, {T}: Untap target land.${1}, {T}, Exert Hope Tender: Untap two target lands. (An exerted creature won't untap during your next untap step.)| Hour of Promise|Hour of Devastation|120|R|{4}{G}|Sorcery|||Search your library for up to two land cards and put them onto the battlefield tapped, then shuffle your library. Then if you control three or more Deserts, create two 2/2 black Zombie creature tokens.| +Majestic Myriarch|Hour of Devastation|122|M|{4}{G}|Creature - Chimera|0|0|Majestic Myriarch's power and toughness are each equal to twice the number of creatures you control.$At the beginning of each combat, if you control a creature with flying, Majestic Myriarch gains flying until end of turn. The same is true for first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, reach, trample, and vigilance.| Nissa's Defeat|Hour of Devastation|123|U|{2}{G}|Sorcery|||Destroy target Forest, green enchantment, or green planeswalker. If that permanent was a Nissa planeswalker, draw a card.| Oasis Ritualist|Hour of Devastation|124|C|{3}{G}|Creature - Naga Druid|2|4|{t}: Add one mana of any color to your mana pool.${t}, Exert Oasis Ritualist: Add two mana of any one color to your manna pool. (An exerted creature won't untap during your next untap step.)| Pride Sovereign|Hour of Devastation|126|R|{2}{G}|Creature - Cat|2|2|Pride Sovereign gets +1/+1 for each other Cat you control.${W}, {t}, Exert Pride Sovereign: Create two 1/1 white Cat creature tokens with lifelink. (An exerted creature won't untap during your next untap step.)| @@ -31689,6 +31699,7 @@ Resilient Khenra|Hour of Devastation|131|R|{1}{G}|Creature - Jackal Wizard|2|2|W Rhonas's Last Stand|Hour of Devastation|132|R|{G}{G}|Sorcery|||Create a 5/4 green Snake creature token. Lands you control don't untap during your next untap step.| Sidewinder Naga|Hour of Devastation|134|C|{2}{G}|Creature - Naga Warrior|3|2|As long as you control a Desert or there is a Desert card in your graveyard, Sidewinder Naga gets +1/+0 and has trample.| Uncage the Menagerie|Hour of Devastation|137|M|{X}{G}{G}|Sorcery|||Search your library for up to X creature cards with different names that each have converted mana cost X, reveal them, put them into your hand, then shuffle your library.| +Bloodwater Entity|Hour of Devastation|138|U|{1}{U}{R}|Creature - Elemental|2|2|Flying$Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$When Bloodwater Elemental enters the battlefield, you may put target instant or sorcery card from your graveyard on top of your library.| The Locust God|Hour of Devastation|139|M|{4}{U}{R}|Legendary Creature - God|4|4|Flying$Whenever you draw a card, create a 1/1 blue and red Insect creature token with flying and haste.${2}{U}{R}: Draw a card, then discard a card.$When The Locust God dies, return it to its owner's hand at the beginning of the next end step.| Nicol Bolas, God-Pharaoh|Hour of Devastation|140|M|{4}{U}{B}{R}|Planeswalker - Bolas|7|+2: Target opponent exiles cards from the top of his or her library until he or she exiles a non land card. Until end of turn, you may cast that card without paying its mana cost.$+1: Each opponent exiles two cards from his or her hand.$-4: Nicol Bolas, God-Pharaoh deals 7 damage to target opponent or creature an opponent controls.$-12: Exile each nonland permanent your opponents control.| Resolute Survivors|Hour of Devastation|142|U|{1}{R}{W}|Creature - Human Warrior|3|3|You may exert Resolute Survivors as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, Resolute Survivors deals 1 damage to each opponent and you gain 1 life.| @@ -31702,15 +31713,18 @@ Consign // Oblivion|Hour of Devastation|149|U|{1}{U}|Instant|||Return target non Claim // Fame|Hour of Devastation|150|U|{B}|Sorcery|||Return target creature card with converted mana cost 2 or less from your graveyard to the battlefield.$Fame {1}{R}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Target creature gets +2/+0 and gains haste until end of turn.| Struggle // Survive|Hour of Devastation|151|U|{2}{R}|Instant|||Struggle deals damage to target creature equal to the number of lands you control.$Survive {1}{G}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Each player shuffles his or graveyard into his or her library.| Appeal // Authority|Hour of Devastation|152|U|{G}|Sorcery|||Until end of turn, target creature gains trample and gets +X/+X, where X is the number of creatures you control.$Authority {1}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Tap up to two target creatures your opponents control. Creatures you control gain vigilance until end of turn.| +Leave // Chance|Hour of Devastation|153|R|{1}{W}|Instant|||Return any number of target permanents you own to your hand.$Chance {3}{R}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Discard any number of cards, then draw that many cards.| Reason // Believe|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| Grind // Dust|Hour of Devastation|155|R|{1}{B}|Sorcery|||Put a -1/-1 counter on each of up to two target creatures.$Dust {3}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Exile any number of target creatures that have -1/-1 counters on them.| Refuse // Cooperate|Hour of Devastation|156|R|{3}{R}|Instant|||Refuse deals damage to target spell's controller equal to that spell's converted mana cost.$Cooperate {2}{U}$Instant$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Copy target instant or sorcery spell. You may choose new targets for the copy.| Driven // Despair|Hour of Devastation|157|R|{1}{G}|Sorcery|||Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."$Despair {1}{B}$Sorcery$Aftermath$Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."| +Abandoned Sarcophagus|Hour of Devastation|158|R|{3}|Artifact|||You may cast nonland cards with cycling from your graveyard.$If a card with cycling would be put into your graveyard from anywhere and it wasn't cycled, exile it instead.| Crook of Comdemnation|Hour of Devastation|159|U|{2}|Artifact|||{1}, {t}: Exile target card from a graveyard.${1}, Exile Crook of Condemnation: Exile all cards from all graveyards.| God-Pharaoh's Gift|Hour of Devastation|161|R|{7}|Artifact|||At the beginning of combat on your turn, you may exile a creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn.| Hollow One|Hour of Devastation|163|R|{5}|Artifact Creature - Golem|4|4|Hollow One costs {2} less to cast for each card you've cycled or discarded this turn.$Cycling {2} ({2}, Discard this card: Draw a card.)| Mirage Mirror|Hour of Devastation|165|R|{3}|Artifact|||{2}: Mirage Mirror becomes a copy of target artifact, creature, enchantment, or land until end of turn.| Sunset Pyramid|Hour of Devastation|166|U|{2}|Artifact|||Sunset Pyramid enters the battlefield with three brick counters on it.${2}, {T}, Remove a brick counter from Sunset Pyramid: Draw a card.${2}, {T}: Scry 1.| +Crumbling Necropolis|Hour of Devastation|169|U||Land|||Crumbling Necropolis enters the battlefield tapped.${T}: Add {U}, {B}, or {R} to your mana pool.| Desert of the Fervent|Hour of Devastation|170|C||Land - Desert|||Desert of the Fervent enters the battlefield tapped.${T}: Add {R} to your mana pool.$Cycling {1}{R} ({1}{R}, Discard this card: Draw a card.)| Desert of the Glorified|Hour of Devastation|171|C||Land - Desert|||Desert of the Glorified enters the battlefield tapped.${T}: Add {B} to your mana pool.$Cycling {1}{B} ({1}{B}, Discard this card: Draw a card.)| Desert of the Indomitable|Hour of Devastation|172|C||Land - Desert|||Desert of the Indomitable enters the battlefield tapped.${t}: Add {G} to your mana pool.$Cycling {1}{G} ({1}{G}, Discard this card: Draw a card.)| From c2d2ab2148d7b1fa50aa8b259462fe0c4cf6496b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 29 Jun 2017 17:55:29 +0200 Subject: [PATCH 054/160] gen-card.pl some improvements for Planeswalker and split cards. --- Utils/cardClass.tmpl | 14 +++++++-- Utils/cardSplitClass.tmpl | 66 +++++++++++++++++++++++++++++++++++++++ Utils/gen-card.pl | 28 ++++++++++++++--- 3 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 Utils/cardSplitClass.tmpl diff --git a/Utils/cardClass.tmpl b/Utils/cardClass.tmpl index c77350bfa2..27c2518e07 100644 --- a/Utils/cardClass.tmpl +++ b/Utils/cardClass.tmpl @@ -29,7 +29,11 @@ package mage.cards.[=$cardNameFirstLetter=]; import java.util.UUID;[= if ($power || $power eq 0) { - $OUT .= "\nimport mage.MageInt;" + if ($planeswalker) { + $OUT .= "\nimport mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;" + }else { + $OUT .= "\nimport mage.MageInt;" + } } =][=$abilitiesImports=] import mage.cards.CardImpl; @@ -46,8 +50,12 @@ public class [=$className=] extends CardImpl { super(ownerId, setInfo, new CardType[]{[=$type=]}, "[=$manaCost=]"); [=$subType=][=$colors=][= if ($power || $power eq 0) { - $OUT .= "\n this.power = new MageInt($power);"; - $OUT .= "\n this.toughness = new MageInt($toughness);"; + if ($planeswalker) { + $OUT .= "\n this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility($power));"; + } else { + $OUT .= "\n this.power = new MageInt($power);"; + $OUT .= "\n this.toughness = new MageInt($toughness);"; + } } =][=$abilities=] } diff --git a/Utils/cardSplitClass.tmpl b/Utils/cardSplitClass.tmpl new file mode 100644 index 0000000000..0a1568733f --- /dev/null +++ b/Utils/cardSplitClass.tmpl @@ -0,0 +1,66 @@ +/* + * 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.[=$cardNameFirstLetter=]; + +import java.util.UUID;[= +if ($power || $power eq 0) { + $OUT .= "\nimport mage.MageInt;" +} +=][=$abilitiesImports=] +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author [=$author=] + */ +public class [=$className=] extends SplitCard { + + public [=$className=](UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{[=$type=]}, "[=$manaCost=]"); + [=$subType=][=$colors=][= + + // super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{3}{R}", "{2}{U}", SpellAbilityType.SPLIT_AFTERMATH); + +if ($power || $power eq 0) { + $OUT .= "\n this.power = new MageInt($power);"; + $OUT .= "\n this.toughness = new MageInt($toughness);"; +} +=][=$abilities=] + } + + public [=$className=](final [=$className=] card) { + super(card); + } + + @Override + public [=$className=] copy() { + return new [=$className=](this); + } +} diff --git a/Utils/gen-card.pl b/Utils/gen-card.pl index 42dff27594..6fe02e2421 100755 --- a/Utils/gen-card.pl +++ b/Utils/gen-card.pl @@ -90,7 +90,7 @@ $raritiesConversion{'Bonus'} = 'BONUS'; # Get card name my $cardName = $ARGV[0]; -if(!$cardName) { +if (!$cardName) { print 'Enter a card name: '; $cardName = ; chomp $cardName; @@ -107,6 +107,18 @@ if (!exists $cards{$cardName}) { die "Card name doesn't exist: $cardName\n"; } +my $cardTemplate = 'cardClass.tmpl'; +my $splitDelimiter = '//'; +my $splitSpell = 'false'; + +# Remove the // from name of split cards +if (index($cardName, $splitDelimiter) != -1) { + $cardName =~ s/$splitDelimiter/""/g; + $cardTemplate = 'cardSplitClass.tmpl'; + $splitSpell = 'true'; +} + + # Check if card is already implemented my $fileName = "../Mage.Sets/src/mage/cards/".lc(substr($cardName, 0, 1))."/".toCamelCase($cardName).".java"; if(-e $fileName) { @@ -164,18 +176,24 @@ foreach my $setName (keys %{$cards{$cardName}}) { # Generate the the card my $result; -my $template = Text::Template->new(TYPE => 'FILE', SOURCE => 'cardClass.tmpl', DELIMITERS => [ '[=', '=]' ]); +my $template = Text::Template->new(TYPE => 'FILE', SOURCE => $cardTemplate, DELIMITERS => [ '[=', '=]' ]); $vars{'author'} = $author; $vars{'manaCost'} = fixCost($card[4]); $vars{'power'} = $card[6]; $vars{'toughness'} = $card[7]; my @types; +$vars{'planeswalker'} = 'false'; $vars{'subType'} = ''; +my $cardAbilities = $card[8]; my $type = $card[5]; while ($type =~ m/([a-zA-Z]+)( )*/g) { if (exists($cardTypes{$1})) { - push(@types, $cardTypes{$1}); + push(@types, $cardTypes{$1}); + if ($cardTypes{$1} eq $cardTypes{'Planeswalker'}) { + $vars{'planeswalker'} = 'true'; + $cardAbilities = $card[7]; + } } else { if (@types) { $vars{'subType'} .= "\n this.subtype.add(\"$1\");"; @@ -190,7 +208,8 @@ $vars{'type'} = join(', ', @types); $vars{'abilitiesImports'} = ''; $vars{'abilities'} = ''; -my @abilities = split('\$', $card[8]); + +my @abilities = split('\$', $cardAbilities); foreach my $ability (@abilities) { $ability =~ s/ .+?<\/i>//g; @@ -206,6 +225,7 @@ foreach my $ability (@abilities) { $kw = $kk; } } + if ($keywords{$kw}) { $vars{'abilities'} .= "\n // " . ucfirst($kwUnchanged); if ($keywords{$kw} eq 'instance') { From c8e1a9d8546e2f7984582aa8e7ed2b32de67bf6b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 29 Jun 2017 17:55:48 +0200 Subject: [PATCH 055/160] [HOU] Added 4 cards. --- .../mage/cards/n/NicolBolasTheDeceiver.java | 137 ++++++++ Mage.Sets/src/mage/cards/r/ReasonBelieve.java | 109 +++++++ .../src/mage/cards/r/RefuseCooperate.java | 110 +++++++ .../src/mage/cards/s/SwarmIntelligence.java | 60 ++++ .../src/mage/sets/HourOfDevastation.java | 298 +++++++++--------- .../src/main/java/mage/abilities/Ability.java | 3 +- .../main/java/mage/abilities/AbilityImpl.java | 3 +- 7 files changed, 571 insertions(+), 149 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/n/NicolBolasTheDeceiver.java create mode 100644 Mage.Sets/src/mage/cards/r/ReasonBelieve.java create mode 100644 Mage.Sets/src/mage/cards/r/RefuseCooperate.java create mode 100644 Mage.Sets/src/mage/cards/s/SwarmIntelligence.java diff --git a/Mage.Sets/src/mage/cards/n/NicolBolasTheDeceiver.java b/Mage.Sets/src/mage/cards/n/NicolBolasTheDeceiver.java new file mode 100644 index 0000000000..086a9611c5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NicolBolasTheDeceiver.java @@ -0,0 +1,137 @@ +/* + * 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.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +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.TargetController; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class NicolBolasTheDeceiver extends CardImpl { + + public NicolBolasTheDeceiver(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{5}{U}{B}{R}"); + + this.subtype.add("Bolas"); + this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + + // +3: Each opponent loses 3 life unless that player sacrifices a nonland permanent or discards a card. + this.addAbility(new LoyaltyAbility(new NicolBolasTheDeceiverFirstEffect(), 3)); + // -3: Destroy target creature. Draw a card. + Ability ability = new LoyaltyAbility(new DestroyTargetEffect(), -3); + ability.addTarget(new TargetCreaturePermanent()); + ability.addEffect(new DrawCardSourceControllerEffect(1)); + this.addAbility(ability); + // -11: Nicol Bolas, the Deceiver deals 7 damage to each opponent. You draw 7 cards. + ability = new LoyaltyAbility(new DamagePlayersEffect(7, TargetController.OPPONENT), -11); + ability.addEffect(new DrawCardSourceControllerEffect(7)); + this.addAbility(ability); + + } + + public NicolBolasTheDeceiver(final NicolBolasTheDeceiver card) { + super(card); + } + + @Override + public NicolBolasTheDeceiver copy() { + return new NicolBolasTheDeceiver(this); + } +} + +class NicolBolasTheDeceiverFirstEffect extends OneShotEffect { + + public NicolBolasTheDeceiverFirstEffect() { + super(Outcome.Damage); + staticText = "Each opponent loses 3 life unless that player sacrifices a nonland permanent or discards a card"; + } + + public NicolBolasTheDeceiverFirstEffect(final NicolBolasTheDeceiverFirstEffect effect) { + super(effect); + } + + @Override + public NicolBolasTheDeceiverFirstEffect copy() { + return new NicolBolasTheDeceiverFirstEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + for (UUID opponentId : game.getOpponents(controller.getId())) { + Player opponent = game.getPlayer(opponentId); + if (opponent != null) { + int permanents = game.getBattlefield().countAll(StaticFilters.FILTER_PERMANENT_NON_LAND, opponent.getId(), game); + if (permanents > 0 && opponent.chooseUse(outcome, "Sacrifices a nonland permanent?", + "Otherwise you have to discard a card or lose 3 life.", "Sacrifice", "Discard or life loss", source, game)) { + Target target = new TargetPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_NON_LAND); + if (opponent.choose(outcome, target, source.getSourceId(), game)) { + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent != null) { + permanent.sacrifice(source.getSourceId(), game); + return true; + } + } + } + if (!opponent.getHand().isEmpty() && opponent.chooseUse(outcome, "Discard a card?", + "Otherwise you lose 3 life.", "Discard", "Lose 3 life", source, game)) { + opponent.discardOne(false, source, game); + return true; + } + opponent.loseLife(3, game, false); + + } + } + return true; + } + + return false; + + } +} diff --git a/Mage.Sets/src/mage/cards/r/ReasonBelieve.java b/Mage.Sets/src/mage/cards/r/ReasonBelieve.java new file mode 100644 index 0000000000..9b513ce339 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/ReasonBelieve.java @@ -0,0 +1,109 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.keyword.ScryEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SpellAbilityType; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class ReasonBelieve extends SplitCard { + + public ReasonBelieve(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, new CardType[]{CardType.SORCERY}, "{U}", "{4}{G}", SpellAbilityType.SPLIT_AFTERMATH); + + // Reason + // Scry 3. + getLeftHalfCard().getSpellAbility().addEffect(new ScryEffect(3)); + + // Believe + // Aftermath + ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true)); + // Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand. + getRightHalfCard().getSpellAbility().addEffect(new BelieveEffect()); + + } + + public ReasonBelieve(final ReasonBelieve card) { + super(card); + } + + @Override + public ReasonBelieve copy() { + return new ReasonBelieve(this); + } +} + +class BelieveEffect extends OneShotEffect { + + BelieveEffect() { + super(Outcome.PutCardInPlay); + this.staticText = "Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand"; + } + + BelieveEffect(final BelieveEffect effect) { + super(effect); + } + + @Override + public BelieveEffect copy() { + return new BelieveEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Card card = controller.getLibrary().getFromTop(game); + if (card != null) { + if (card.isCreature() && controller.chooseUse(outcome, "Put " + card.getIdName() + " onto the battlefield?", source, game)) { + controller.moveCards(card, Zone.BATTLEFIELD, source, game); + } else { + controller.moveCards(card, Zone.HAND, source, game); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/r/RefuseCooperate.java b/Mage.Sets/src/mage/cards/r/RefuseCooperate.java new file mode 100644 index 0000000000..6430a87740 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RefuseCooperate.java @@ -0,0 +1,110 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SpellAbilityType; +import mage.filter.common.FilterInstantOrSorcerySpell; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.TargetSpell; + +/** + * + * @author LevelX2 + */ +public class RefuseCooperate extends SplitCard { + + public RefuseCooperate(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{3}{R}", "{2}{U}", SpellAbilityType.SPLIT_AFTERMATH); + + // Refuse + // Refuse deals damage to target spell's controller equal to that spell's converted mana cost. + getLeftHalfCard().getSpellAbility().addEffect(new RefuseEffect()); + getLeftHalfCard().getSpellAbility().addTarget(new TargetSpell()); + + // Cooperate + // Aftermath + ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true)); + // Copy target instant or sorcery spell. You may choose new targets for the copy. + getRightHalfCard().getSpellAbility().addEffect(new CopyTargetSpellEffect()); + getRightHalfCard().getSpellAbility().addTarget(new TargetSpell(new FilterInstantOrSorcerySpell())); + } + + public RefuseCooperate(final RefuseCooperate card) { + super(card); + } + + @Override + public RefuseCooperate copy() { + return new RefuseCooperate(this); + } +} + +class RefuseEffect extends OneShotEffect { + + public RefuseEffect() { + super(Outcome.Damage); + staticText = "Refuse deals damage to target spell's controller equal to that spell's converted mana cost"; + } + + public RefuseEffect(final RefuseEffect effect) { + super(effect); + } + + @Override + public RefuseEffect copy() { + return new RefuseEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Spell spell = game.getStack().getSpell(source.getFirstTarget()); + if (spell != null) { + Player spellController = game.getPlayer(spell.getControllerId()); + if (spellController != null) { + spellController.damage(spell.getConvertedManaCost(), source.getSourceId(), game, false, true); + return true; + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/s/SwarmIntelligence.java b/Mage.Sets/src/mage/cards/s/SwarmIntelligence.java new file mode 100644 index 0000000000..e20abb16e1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SwarmIntelligence.java @@ -0,0 +1,60 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterInstantOrSorcerySpell; + +/** + * + * @author LevelX2 + */ +public class SwarmIntelligence extends CardImpl { + + public SwarmIntelligence(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{6}{U}"); + + // Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy. + this.addAbility(new SpellCastControllerTriggeredAbility( + new CopyTargetSpellEffect().setText("you may copy that spell. You may choose new targets for the copy"), new FilterInstantOrSorcerySpell("an instant or sorcery spell"), true, true)); + } + + public SwarmIntelligence(final SwarmIntelligence card) { + super(card); + } + + @Override + public SwarmIntelligence copy() { + return new SwarmIntelligence(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 49fb373428..e42e0a2e29 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -1,147 +1,151 @@ -/* -* 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.sets; - -import java.util.ArrayList; -import java.util.List; -import mage.cards.CardGraphicInfo; -import mage.cards.ExpansionSet; -import mage.cards.FrameStyle; -import mage.cards.repository.CardCriteria; -import mage.cards.repository.CardInfo; -import mage.cards.repository.CardRepository; -import mage.constants.Rarity; -import mage.constants.SetType; - -/** - * @author fireshoes - */ -public class HourOfDevastation extends ExpansionSet { - - private static final HourOfDevastation instance = new HourOfDevastation(); - - public static HourOfDevastation getInstance() { - return instance; - } - - protected final List savedSpecialLand = new ArrayList<>(); - - private HourOfDevastation() { - super("Hour of Devastation", "HOU", ExpansionSet.buildDate(2017, 7, 14), SetType.EXPANSION); - this.blockName = "Amonkhet"; - this.parentSet = Amonkhet.getInstance(); - this.hasBasicLands = true; - this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; - this.numBoosterUncommon = 3; - this.numBoosterRare = 1; - this.ratioBoosterMythic = 8; - this.ratioBoosterSpecialLand = 144; - - cards.add(new SetCardInfo("Abrade", 83, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); - cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); - cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); - cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); - cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); - cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); - cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); - cards.add(new SetCardInfo("Brambleweft Behemoth", 202, Rarity.COMMON, mage.cards.b.BrambleweftBehemoth.class)); - cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); - cards.add(new SetCardInfo("Champion of Wits", 31, Rarity.RARE, mage.cards.c.ChampionOfWits.class)); - cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); - cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); - cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); - cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); - cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); - cards.add(new SetCardInfo("Desert of the Indomitable", 172, Rarity.COMMON, mage.cards.d.DesertOfTheIndomitable.class)); - cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); - cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); - cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); - cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); - cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); - cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); - cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); - cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); - cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); - cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); - cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); - cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); - cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); - cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); - cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); - cards.add(new SetCardInfo("Nissa, Genesis Mage", 200, Rarity.MYTHIC, mage.cards.n.NissaGenesisMage.class)); - cards.add(new SetCardInfo("Oasis Ritualist", 124, Rarity.COMMON, mage.cards.o.OasisRitualist.class)); - cards.add(new SetCardInfo("Oketra's Last Mercy", 18, Rarity.RARE, mage.cards.o.OketrasLastMercy.class)); - cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); - cards.add(new SetCardInfo("Overwhelming Splendor", 19, Rarity.MYTHIC, mage.cards.o.OverwhelmingSplendor.class)); - cards.add(new SetCardInfo("Plains", 185, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("Pride Sovereign", 126, Rarity.RARE, mage.cards.p.PrideSovereign.class)); - cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); - cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); - cards.add(new SetCardInfo("Ramunap Hydra", 130, Rarity.RARE, mage.cards.r.RamunapHydra.class)); - cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); - cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); - cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); - cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); - cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); - cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); - cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); - cards.add(new SetCardInfo("The Locust God", 139, Rarity.MYTHIC, mage.cards.t.TheLocustGod.class)); - cards.add(new SetCardInfo("The Scarab God", 145, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); - cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); - cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); - cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); - cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); - cards.add(new SetCardInfo("Uncage the Menagerie", 137, Rarity.MYTHIC, mage.cards.u.UncageTheMenagerie.class)); - cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); - cards.add(new SetCardInfo("Unraveling Mummy", 147, Rarity.UNCOMMON, mage.cards.u.UnravelingMummy.class)); - cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); - cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); - cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); - cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); - cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); - cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); - } - - @Override - public List getSpecialLand() { - if (savedSpecialLand.isEmpty()) { - CardCriteria criteria = new CardCriteria(); - criteria.setCodes("MPS-AKH"); - criteria.minCardNumber(31); - criteria.maxCardNumber(54); - savedSpecialLand.addAll(CardRepository.instance.findCards(criteria)); - } - - return new ArrayList<>(savedSpecialLand); - } -} +/* +* 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.sets; + +import java.util.ArrayList; +import java.util.List; +import mage.cards.CardGraphicInfo; +import mage.cards.ExpansionSet; +import mage.cards.FrameStyle; +import mage.cards.repository.CardCriteria; +import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; +import mage.constants.Rarity; +import mage.constants.SetType; + +/** + * @author fireshoes + */ +public class HourOfDevastation extends ExpansionSet { + + private static final HourOfDevastation instance = new HourOfDevastation(); + + public static HourOfDevastation getInstance() { + return instance; + } + + protected final List savedSpecialLand = new ArrayList<>(); + + private HourOfDevastation() { + super("Hour of Devastation", "HOU", ExpansionSet.buildDate(2017, 7, 14), SetType.EXPANSION); + this.blockName = "Amonkhet"; + this.parentSet = Amonkhet.getInstance(); + this.hasBasicLands = true; + this.hasBoosters = true; + this.numBoosterLands = 1; + this.numBoosterCommon = 10; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 8; + this.ratioBoosterSpecialLand = 144; + + cards.add(new SetCardInfo("Abrade", 83, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); + cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); + cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); + cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); + cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); + cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); + cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); + cards.add(new SetCardInfo("Brambleweft Behemoth", 202, Rarity.COMMON, mage.cards.b.BrambleweftBehemoth.class)); + cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); + cards.add(new SetCardInfo("Champion of Wits", 31, Rarity.RARE, mage.cards.c.ChampionOfWits.class)); + cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); + cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); + cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); + cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); + cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); + cards.add(new SetCardInfo("Desert of the Indomitable", 172, Rarity.COMMON, mage.cards.d.DesertOfTheIndomitable.class)); + cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); + cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); + cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); + cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); + cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); + cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); + cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); + cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); + cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); + cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); + cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); + cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); + cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); + cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); + cards.add(new SetCardInfo("Nicol Bolas, the Deceiver", 205, Rarity.MYTHIC, mage.cards.n.NicolBolasTheDeceiver.class)); + cards.add(new SetCardInfo("Nissa, Genesis Mage", 200, Rarity.MYTHIC, mage.cards.n.NissaGenesisMage.class)); + cards.add(new SetCardInfo("Oasis Ritualist", 124, Rarity.COMMON, mage.cards.o.OasisRitualist.class)); + cards.add(new SetCardInfo("Oketra's Last Mercy", 18, Rarity.RARE, mage.cards.o.OketrasLastMercy.class)); + cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); + cards.add(new SetCardInfo("Overwhelming Splendor", 19, Rarity.MYTHIC, mage.cards.o.OverwhelmingSplendor.class)); + cards.add(new SetCardInfo("Plains", 185, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Pride Sovereign", 126, Rarity.RARE, mage.cards.p.PrideSovereign.class)); + cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); + cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); + cards.add(new SetCardInfo("Ramunap Hydra", 130, Rarity.RARE, mage.cards.r.RamunapHydra.class)); + cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); + cards.add(new SetCardInfo("Reason // Believe", 154, Rarity.RARE, mage.cards.r.ReasonBelieve.class)); + cards.add(new SetCardInfo("Refuse // Cooperate", 156, Rarity.RARE, mage.cards.r.RefuseCooperate.class)); + cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); + cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); + cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); + cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); + cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Swarm Intelligence", 50, Rarity.RARE, mage.cards.s.SwarmIntelligence.class)); + cards.add(new SetCardInfo("The Locust God", 139, Rarity.MYTHIC, mage.cards.t.TheLocustGod.class)); + cards.add(new SetCardInfo("The Scarab God", 145, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); + cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); + cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); + cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); + cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); + cards.add(new SetCardInfo("Uncage the Menagerie", 137, Rarity.MYTHIC, mage.cards.u.UncageTheMenagerie.class)); + cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); + cards.add(new SetCardInfo("Unraveling Mummy", 147, Rarity.UNCOMMON, mage.cards.u.UnravelingMummy.class)); + cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); + cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); + cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); + cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); + cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); + cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); + } + + @Override + public List getSpecialLand() { + if (savedSpecialLand.isEmpty()) { + CardCriteria criteria = new CardCriteria(); + criteria.setCodes("MPS-AKH"); + criteria.minCardNumber(31); + criteria.maxCardNumber(54); + savedSpecialLand.addAll(CardRepository.instance.findCards(criteria)); + } + + return new ArrayList<>(savedSpecialLand); + } +} diff --git a/Mage/src/main/java/mage/abilities/Ability.java b/Mage/src/main/java/mage/abilities/Ability.java index 6592de44e7..fcc0a5db82 100644 --- a/Mage/src/main/java/mage/abilities/Ability.java +++ b/Mage/src/main/java/mage/abilities/Ability.java @@ -409,8 +409,9 @@ public interface Ability extends Controllable, Serializable { * true = show the rule at the top position of the rules * * @param ruleAtTheTop + * @return */ - void setRuleAtTheTop(boolean ruleAtTheTop); + Ability setRuleAtTheTop(boolean ruleAtTheTop); /** * Returns true if this ability has to work also with face down object (set diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index b975a30fe1..0ea915148d 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -975,8 +975,9 @@ public abstract class AbilityImpl implements Ability { } @Override - public void setRuleAtTheTop(boolean ruleAtTheTop) { + public Ability setRuleAtTheTop(boolean ruleAtTheTop) { this.ruleAtTheTop = ruleAtTheTop; + return this; } @Override From 3f53e5fee50f9cdf07c93147eda133fc4d9db688 Mon Sep 17 00:00:00 2001 From: Jeff Date: Thu, 29 Jun 2017 15:26:52 -0500 Subject: [PATCH 056/160] - Added Crook of Comdemnation. [HOU] --- .../src/mage/cards/c/CrookOfComdemnation.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CrookOfComdemnation.java diff --git a/Mage.Sets/src/mage/cards/c/CrookOfComdemnation.java b/Mage.Sets/src/mage/cards/c/CrookOfComdemnation.java new file mode 100644 index 0000000000..9da5242baa --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CrookOfComdemnation.java @@ -0,0 +1,77 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.ExileSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ExileGraveyardAllPlayersEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.target.common.TargetCardInGraveyard; + +/** + * + * @author jeffwadsworth + */ +public class CrookOfComdemnation extends CardImpl { + + private UUID exileId = UUID.randomUUID(); + + public CrookOfComdemnation(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + + // {1}, {t}: Exile target card from a graveyard. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new ManaCostsImpl("{1}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCardInGraveyard()); + this.addAbility(ability); + + // {1}, Exile Crook of Condemnation: Exile all cards from all graveyards. + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileGraveyardAllPlayersEffect(), new ManaCostsImpl("{1}")); + ability2.addCost(new ExileSourceCost()); + this.addAbility(ability2); + + } + + public CrookOfComdemnation(final CrookOfComdemnation card) { + super(card); + } + + @Override + public CrookOfComdemnation copy() { + return new CrookOfComdemnation(this); + } +} From 130f5093de4d85195c59648d2f80c06b35ab2be5 Mon Sep 17 00:00:00 2001 From: Jeff Date: Thu, 29 Jun 2017 16:45:26 -0500 Subject: [PATCH 057/160] - Added Earthshaker Khenra. [HOU] --- .../src/mage/cards/e/EarthshakerKhenra.java | 104 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 105 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/EarthshakerKhenra.java diff --git a/Mage.Sets/src/mage/cards/e/EarthshakerKhenra.java b/Mage.Sets/src/mage/cards/e/EarthshakerKhenra.java new file mode 100644 index 0000000000..413058e214 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EarthshakerKhenra.java @@ -0,0 +1,104 @@ +/* + * 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.e; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.abilities.keyword.EternalizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author jeffwadsworth + */ +public class EarthshakerKhenra extends CardImpl { + + private final UUID originalId; + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power less than or equal to {this}'s power"); + + public EarthshakerKhenra(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add("Jackal"); + this.subtype.add("Warrior"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // When Earthshaker Khenra enters the battlefield, target creature with power less than or equal to Earthshaker Khenra's power can't block this turn. + Ability ability = new EntersBattlefieldTriggeredAbility(new CantBlockTargetEffect(Duration.EndOfTurn)); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + originalId = ability.getOriginalId(); + + // Eternalize {4}{R}{R} + this.addAbility(new EternalizeAbility(new ManaCostsImpl("{4}{R}{R}"), this)); + + } + + @Override + public void adjustTargets(Ability ability, Game game) { + if (ability.getOriginalId().equals(originalId)) { + Permanent sourcePermanent = game.getPermanent(ability.getSourceId()); + if (sourcePermanent != null) { + int power = sourcePermanent.getPower().getValue(); + FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power less than or equal to " + getLogName() + "'s power"); + filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, power + 1)); + ability.getTargets().clear(); + ability.getTargets().add(new TargetCreaturePermanent(filter)); + } + } + } + + public EarthshakerKhenra(final EarthshakerKhenra card) { + super(card); + this.originalId = card.originalId; + } + + @Override + public EarthshakerKhenra copy() { + return new EarthshakerKhenra(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index e42e0a2e29..ad651d6bf5 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -86,6 +86,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Earthshaker Khenra", 90, Rarity.RARE, mage.cards.e.EarthshakerKhenra.class)); cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); From 775f50fe6cfd74a0309aabd69c59b15a8cf235c4 Mon Sep 17 00:00:00 2001 From: Jeff Date: Thu, 29 Jun 2017 16:57:32 -0500 Subject: [PATCH 058/160] - Little refactor. --- Mage.Sets/src/mage/sets/HourOfDevastation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index ad651d6bf5..d38ed4214a 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -76,6 +76,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Champion of Wits", 31, Rarity.RARE, mage.cards.c.ChampionOfWits.class)); cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); + cards.add(new SetCardInfo("Crook of Comdemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfComdemnation.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); From 87da6e215cf24832d4c3d1bc0b2f4fe0b6a8e359 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 30 Jun 2017 14:06:53 +0200 Subject: [PATCH 059/160] [HOU] Updated mtg-cards-data.txt 2017-06-30 --- Utils/mtg-cards-data.txt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 4c4f82fdde..3f45700ff0 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31632,14 +31632,17 @@ Angel of the God-Pharaoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4| Crested Sunmare|Hour of Devastation|6|M|{3}{W}{W}|Creature - Horse|5|5|Other Horses you control have indestructible.$At the beginning of each end step, if you gained life this turn, create a 5/5 white Horse creature token.| Desert's Hold|Hour of Devastation|8|U|{2}{W}|Enchantment - Aura|||Enchant creature$When Desert's Hold enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life.$Enchanted creature can't attack or block, and its activated abilities can't be activated.| Djeru, With Eyes Open|Hour of Devastation|10|R|{3}{W}{W}|Legendary Creature - Human Warrior|4|3|Vigilance$When Djeru, With Eyes Open enters the battlefield, you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library.$If a source would deal damage to a planeswalker you control, prevent 1 of that damage.| +Dutiful Servants|Hour of Devastation|12|C|{3}{W}|Creature - Zombie|2|5|| Gideon's Defeat|Hour of Devastation|13|U|{W}|Instant|||Exile target white creature that's attacking or blocking. If it was a Gideon planeswalker, you gain 5 life.| God-Pharaoh's Faithful|Hour of Devastation|14|C|{W}|Creature - Human Wizard|0|4|Whenever you cast a blue, black or red spell, you gain 1 life.| Hour of Revelation|Hour of Devastation|15|R|{3}{W}{W}{W}|Sorcery|||Hour of Revelation costs {3} less to cast if there are ten or more nonland permanents on the battlefield.$Destroy all nonland permanents.| +Mummy Paramount|Hour of Devastation|16|C|{1}{W}|Creature - Zombie|2|2|Whenever another Zombie enters the battlefield under your control, Mummy Paramount gets +1/+1 until end of turn.| Oketra's Last Mercy|Hour of Devastation|18|R|{1}{W}{W}|Sorcery|||Your life total becomes your starting life total. Lands you control don't untap during your next untap phase| Overwhelming Splendor|Hour of Devastation|19|M|{6}{W}{W}|Enchantment - Aura Curse|||Enchant player$Creatures enchanted player controls lose all abilities and have base power and toughness 1/1.$Enchanted player can't activate abilities that aren't mana abilities or loyalty abilities.| Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counters.$Counters can't be put on artifacts, creatures, enchantments, or lands.| Steadfast Sentinel|Hour of Devastation|24|C|{3}{W}|Creature - Human Cleric|2|3|Vigilance$Eternalize {4}{W}{W} ({4}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Cleric with no mana cost. Eternalize only as a sorcery.)| Steward of Solidarity|Hour of Devastation|25|U|{1}{W}|Creature - Human Warrior|2|2|{T}, Exert Steward of Solidarity: Create a 1/1 white Warrior creature token with vigilance. (An exerted creature won't untap during your next untap step.)| +Sunscourge Champion|Hour of Devastation|26|U|{2}{W}|Creature - Human Wizard|2|3|When Sunscourge Champion enters the battlefield, you gain life equal to its power.$Eternalize—{2}{W}{W}, Discard a card. ({2}{W}{W}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| Vizier of the True|Hour of Devastation|28|U|{3}{W}|Creature - Human Cleric|3|2|You may exert Vizier of the True as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, tap target creature an opponent controls.| Champion of Wits|Hour of Devastation|31|R|{2}{U}|Creature - Naga Wizard|2|1|When Champion of Wits enters the battlefield, you may draw cards equal to its power. If you do, discard two cards.$Eternalize {5}{U}{U} ({5}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Naga Wizard with no mana cost. Eternalize only as a sorcery.)| Eternal of Harsh Truths|Hour of Devastation|34|U|{2}{U}|Creature - Zombie Cleric|1|3|Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)$Whenever Eternal of Harsh Truths attacks and isn't blocked, draw a card.| @@ -31650,11 +31653,14 @@ Kefnet's Last Word|Hour of Devastation|39|R|{2}{U}{U}|Sorcery|||Gain control of Nimble Obstructionist|Hour of Devastation|40|R|{2}{U}|Creature - Bird Wizard|3|1|Flash$Flying$Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.)$When you cycle Nimble Obstructionist, counter target activated or triggered ability you don't control.| Ominous Sphinx|Hour of Devastation|41|U|{3}{U}{U}|Creature - Sphinx|4|4|Flying$Whenever you cycle or discard a card,target creature an opponent controls gets -2/-0 until end of turn.| Proven Combatant|Hour of Devastation|42|C|{U}|Creature - Human Warrior|1|1|Eternalize {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Warrior with no mana cost. Eternalize only as a sorcery.) | +Seer of the Last Tomorrow|Hour of Devastation|44|C|{2}{U}|Creature - Naga Cleric|1|4|{U}, {T}, Discard a card: Target player puts the top three cards of his or her library into his or her graveyard.| Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize—{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| +Strategic Planning|Hour of Devastation|47|C|{1}{U}|Sorcery|||Look at the top three cards of your library. Put one of them into your hand and the rest in the graveyard.| Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counter target spell unless its controller pays {3}.$• Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| +Tragic Lesson|Hour of Devastation|51|C|{2}{U}|Instant|||Draw two cards. Then discard a card unless you return a land you control to its owner's hand.| Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| -Vizier of the Anointed|Hour of Devastation|55|U|{3}{U}|Creature - Human Cleric|2|4|When Vizier of the Anointed enters the battlefield, search your library for a creature card with embalm or eternalize, put it in your graveyard, then shuffle your library.$Whenever you eternalize or embalm a creature, draw a card.| +Vizier of the Anointed|Hour of Devastation|55|U|{3}{U}|Creature - Human Cleric|2|4|When Vizier of the Anointed enters the battlefield, search your library for a creature card with eternalize or embalm, put it in your graveyard, then shuffle your library.$Whenever you activate an eternalize or embalm ability, draw a card.| Accursed Horde|Hour of Devastation|56|U|{3}{B}|Creature - Zombie|3|3|{1}{B}: Target attacking Zombie gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.)| Ammit Eternal|Hour of Devastation|57|R|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| @@ -31671,6 +31677,7 @@ Razaketh's Rite|Hour of Devastation|74|U|{3}{B}{B}|Sorcery|||Search your library Torment of Hailfire|Hour of Devastation|77|R|{X}{B}{B}|Sorcery|||Repeat the following process X times. Each opponent loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| Torment of Scarabs|Hour of Devastation|78|U|{3}{B}|Enchantment - Aura Curse|||Enchant player$At the beginning of enchanted player's upkeep, that player loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| Torment of Venom|Hour of Devastation|79|C|{2}{B}{B}|Instant|||Put three -1/-1 counters on target creature. Its controller loses 3 life unless he or she sacrifices another nonland permanent or discards a card.| +Wretched Camel|Hour of Devastation|82|C|{1}{B}|Creature - Zombie Camel|2|1|When Wretched Camel dies, if you control a Desert or there is a Desert card in your graveyard, target player discards a card.| Abrade|Hour of Devastation|83|U|{1}{R}|Instant|||Choose one —$• Abrade deals 3 damage to target creature.$• Destroy target artifact.| Chandra's Defeat|Hour of Devastation|86|U|{R}|Instant|||Chandra’s Defeat deals 5 damage to target red creature or red planeswalker. If that permanent is a Chandra planeswalker, you may discard a card. If you do, draw a card.| Chaos Maw|Hour of Devastation|87|R|{5}{R}{R}|Creature - Hellion|6|6|When Chaos Maw enters the battlefield, it deals 3 damage to each other creature. | @@ -31680,15 +31687,18 @@ Fervent Paincaster|Hour of Devastation|91|U|{2}{R}|Creature - Human Wizard|3|1|{ Frontline Devastator|Hour of Devastation|93|C|{3}{R}|Creature - Zombie Minotaur Warrior|3|3|Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)${1}{R}: Frontline Devastator gets +1/+0 until end of turn.| Gilded Cerodon|Hour of Devastation|94|C|{4}{R}|Creature - Beast|4|4|Whenever Gilded Cerodon attacks, if you control a Desert or there is a Desert card in your graveyard, target creature can't block this turn.| Hazoret's Undying Fury|Hour of Devastation|96|R|{4}{R}{R}|Sorcery|||Shuffle your library, then exile the top four cards. You may cast any number of nonland cards with converted mana cost 5 or less from among them without paying their mana costs. Land you control don't untap during your next untap step.| +Hour of Devastation|Hour of Devastation|97|R|{3}{R}{R}|Sorcery|||All creatures lose indestructible until end of turn. Hour of Devastation deals 5 damage to each creature and each non-Bolas planeswalker.| Imminent Doom|Hour of Devastation|98|R|{2}{R}|Enchantment|||Imminent Doom enters the battlefield with a doom counter on it.$Whenever you cast a spell with converted mana cost equal to the number of doom counters on Imminent Doom, Imminent Doom deals that much damage to target creature or player. Then put a doom counter on Imminent Doom. | Inferno Jet|Hour of Devastation|99|U|{5}{R}|Sorcery|||Inferno Jet deals 6 damage to target opponent.$Cycling {2} ({2}, Discard this card: Draw a card.)| Khenra Scrapper|Hour of Devastation|100|C|{2}{R}|Creature - Jackal Warrior|2|3|Menace$You may exert Khenra Scrapper as it attacks. When you do, it gets +2/+0 until end of turn. (An exerted creature won't untap during your next untap step.)| +Manticore Eternal|Hour of Devastation|103|U|{3}{R}{R}|Creature - Zombie Manticore|5|4|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$Manticore Eternal attacks each combat if able.| Neheb, the Eternal|Hour of Devastation|104|M|{3}{R}{R}|Legendary Creature - Zombie Minotaur Warrior|4|6|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$At the beginning of your postcombat main phase, add {R} to your mana pool for each 1 life your opponents have lost this turn.| Open Fire|Hour of Devastation|105|C|{2}{R}|Instant|||Open Fire does 3 damage to target creature or player.| Sand Strangler|Hour of Devastation|107|U|{3}{R}|Creature - Beast|3|3|When Sand Strangler enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you may have Sand Strangler deal 3 damage to target creature.| Wildfire Eternal|Hour of Devastation|109|R|{3}{R}|Creature - Zombie Jackal Cleric|1|4|Afflict 4 (Whenever this creature becomes blocked, defending player loses 4 life.)$Whenever Wildfire Eternal attacks and isn't blocked, you may cast an instant or sorcery card from your hand without paying its mana cost.| Hope Tender|Hour of Devastation|119|U|{1}{G}|Creature - Human Druid|2|2|{1}, {T}: Untap target land.${1}, {T}, Exert Hope Tender: Untap two target lands. (An exerted creature won't untap during your next untap step.)| Hour of Promise|Hour of Devastation|120|R|{4}{G}|Sorcery|||Search your library for up to two land cards and put them onto the battlefield tapped, then shuffle your library. Then if you control three or more Deserts, create two 2/2 black Zombie creature tokens.| +Life Goes On|Hour of Devastation|121|C|{G}|Instant|||You gain 4 life. If a creature died this turn, you gain 8 life instead.| Majestic Myriarch|Hour of Devastation|122|M|{4}{G}|Creature - Chimera|0|0|Majestic Myriarch's power and toughness are each equal to twice the number of creatures you control.$At the beginning of each combat, if you control a creature with flying, Majestic Myriarch gains flying until end of turn. The same is true for first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, reach, trample, and vigilance.| Nissa's Defeat|Hour of Devastation|123|U|{2}{G}|Sorcery|||Destroy target Forest, green enchantment, or green planeswalker. If that permanent was a Nissa planeswalker, draw a card.| Oasis Ritualist|Hour of Devastation|124|C|{3}{G}|Creature - Naga Druid|2|4|{t}: Add one mana of any color to your mana pool.${t}, Exert Oasis Ritualist: Add two mana of any one color to your manna pool. (An exerted creature won't untap during your next untap step.)| @@ -31697,7 +31707,9 @@ Ramunap Excavator|Hour of Devastation|129|R|{2}{G}|Creature - Naga Cleric|2|3|Yo Ramunap Hydra|Hour of Devastation|130|R|{3}{G}|Creature - Snake Hydra|3|3|Vigilance, reach, trample$Ramunap Hydra gets +1/+1 as long as you control a Desert.$Ramunap Hydra gets +1/+1 as long as there is a Desert card in your graveyard.| Resilient Khenra|Hour of Devastation|131|R|{1}{G}|Creature - Jackal Wizard|2|2|When Resilient Khenra enters the battlefield, you may have target creature get +X/+X until end of turn, where X is Resilient Khenra's power.$Eternalize {4}{G}{G} ({4}{G}{G}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Jackal Wizard with no mana cost. Eternalize only as a sorcery.)| Rhonas's Last Stand|Hour of Devastation|132|R|{G}{G}|Sorcery|||Create a 5/4 green Snake creature token. Lands you control don't untap during your next untap step.| +Rhonas's Stalwart|Hour of Devastation|133|C|{1}{G}|Creature - Human Warrior|2|2|You may exert Rhonas's Stalwart as it attacks. When you do, it gets +1/+1 until end of turn and can't be blocked by creatures with power 2 or less this turn. (An exerted creature won't untap during your next untap step.)| Sidewinder Naga|Hour of Devastation|134|C|{2}{G}|Creature - Naga Warrior|3|2|As long as you control a Desert or there is a Desert card in your graveyard, Sidewinder Naga gets +1/+0 and has trample.| +Sifter Wurm|Hour of Devastation|135|C|{5}{G}{G}|Creature - Wurm|7|7|Trample$When Sifter Wurm enters the battlefield, scry 3, then reveal the top card of your library. You gain life equal to that card's converted mana cost.| Uncage the Menagerie|Hour of Devastation|137|M|{X}{G}{G}|Sorcery|||Search your library for up to X creature cards with different names that each have converted mana cost X, reveal them, put them into your hand, then shuffle your library.| Bloodwater Entity|Hour of Devastation|138|U|{1}{U}{R}|Creature - Elemental|2|2|Flying$Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$When Bloodwater Elemental enters the battlefield, you may put target instant or sorcery card from your graveyard on top of your library.| The Locust God|Hour of Devastation|139|M|{4}{U}{R}|Legendary Creature - God|4|4|Flying$Whenever you draw a card, create a 1/1 blue and red Insect creature token with flying and haste.${2}{U}{R}: Draw a card, then discard a card.$When The Locust God dies, return it to its owner's hand at the beginning of the next end step.| @@ -31738,6 +31750,7 @@ Ipnu Rivulet|Hour of Devastation|180|U||Land - Desert|||{t}: Add {C} to your man Ramunap Ruins|Hour of Devastation|181|U||Land - Desert|||{t}: Add {C} to your mana pool.${t}, Pay 1 life: Add {R} to your mana pool.${2}{R}{R}, {t}, Sacrifice a Desert: Ramunap Ruins deals 2 damage to each opponent.| Scavenger Grounds|Hour of Devastation|182|R||Land - Desert|||{t}: Add {C} to your mana pool.${2}, {t}, Sacrifice a Desert: Exile all cards from all graveyards.| Shefet Dunes|Hour of Devastation|183|U||Land - Desert|||{t}: Add {C} to your mana pool.${t}, Pay 1 life: Add {W} to your mana pool.${2}{W}{W}, {t}, Sacrifice a Desert: Creatures you control get +1/+1 until end of turn. Activate this ability only any time you could cast a sorcery.| +Survivors' Encampment|Hour of Devastation|184|C||Land - Desert|||{T}: Add {C} to your mana pool.${T}, Tap an untapped creature you control: Add one mana of any color to your mana pool.| Plains|Hour of Devastation|185|L||Basic Land - Plains|||| Island|Hour of Devastation|186|L||Basic Land - Island|||| Swamp|Hour of Devastation|187|L||Basic Land - Swamp|||| From 5453172953e07bd5ca86ea3ae742bc04840799d5 Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 30 Jun 2017 08:04:05 -0500 Subject: [PATCH 060/160] - Fixed a card name. --- .../src/mage/cards/c/CrookOfCondemnation.java | 77 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 2 +- Utils/mtg-cards-data.txt | 2 +- 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/c/CrookOfCondemnation.java diff --git a/Mage.Sets/src/mage/cards/c/CrookOfCondemnation.java b/Mage.Sets/src/mage/cards/c/CrookOfCondemnation.java new file mode 100644 index 0000000000..676d248f3a --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CrookOfCondemnation.java @@ -0,0 +1,77 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.ExileSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ExileGraveyardAllPlayersEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.target.common.TargetCardInGraveyard; + +/** + * + * @author jeffwadsworth + */ +public class CrookOfCondemnation extends CardImpl { + + private UUID exileId = UUID.randomUUID(); + + public CrookOfCondemnation(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + + // {1}, {t}: Exile target card from a graveyard. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new ManaCostsImpl("{1}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCardInGraveyard()); + this.addAbility(ability); + + // {1}, Exile Crook of Condemnation: Exile all cards from all graveyards. + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileGraveyardAllPlayersEffect(), new ManaCostsImpl("{1}")); + ability2.addCost(new ExileSourceCost()); + this.addAbility(ability2); + + } + + public CrookOfCondemnation(final CrookOfCondemnation card) { + super(card); + } + + @Override + public CrookOfCondemnation copy() { + return new CrookOfCondemnation(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index d38ed4214a..cc31351dc9 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -76,7 +76,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Champion of Wits", 31, Rarity.RARE, mage.cards.c.ChampionOfWits.class)); cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); - cards.add(new SetCardInfo("Crook of Comdemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfComdemnation.class)); + cards.add(new SetCardInfo("Crook of Condemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfCondemnation.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 3f45700ff0..3906a99f7c 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31731,7 +31731,7 @@ Grind // Dust|Hour of Devastation|155|R|{1}{B}|Sorcery|||Put a -1/-1 counter on Refuse // Cooperate|Hour of Devastation|156|R|{3}{R}|Instant|||Refuse deals damage to target spell's controller equal to that spell's converted mana cost.$Cooperate {2}{U}$Instant$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Copy target instant or sorcery spell. You may choose new targets for the copy.| Driven // Despair|Hour of Devastation|157|R|{1}{G}|Sorcery|||Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."$Despair {1}{B}$Sorcery$Aftermath$Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."| Abandoned Sarcophagus|Hour of Devastation|158|R|{3}|Artifact|||You may cast nonland cards with cycling from your graveyard.$If a card with cycling would be put into your graveyard from anywhere and it wasn't cycled, exile it instead.| -Crook of Comdemnation|Hour of Devastation|159|U|{2}|Artifact|||{1}, {t}: Exile target card from a graveyard.${1}, Exile Crook of Condemnation: Exile all cards from all graveyards.| +Crook of Condemnation|Hour of Devastation|159|U|{2}|Artifact|||{1}, {t}: Exile target card from a graveyard.${1}, Exile Crook of Condemnation: Exile all cards from all graveyards.| God-Pharaoh's Gift|Hour of Devastation|161|R|{7}|Artifact|||At the beginning of combat on your turn, you may exile a creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn.| Hollow One|Hour of Devastation|163|R|{5}|Artifact Creature - Golem|4|4|Hollow One costs {2} less to cast for each card you've cycled or discarded this turn.$Cycling {2} ({2}, Discard this card: Draw a card.)| Mirage Mirror|Hour of Devastation|165|R|{3}|Artifact|||{2}: Mirage Mirror becomes a copy of target artifact, creature, enchantment, or land until end of turn.| From 77af24485b8850e0f6631a2cbb3e62cc365b8add Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 30 Jun 2017 15:04:56 +0200 Subject: [PATCH 061/160] [HOU] Added 3 split cards. --- Mage.Sets/src/mage/cards/c/ClaimFame.java | 88 ++++++++++++++ Mage.Sets/src/mage/cards/g/GrindDust.java | 80 ++++++++++++ .../src/mage/cards/i/InnerFlameAcolyte.java | 11 +- .../src/mage/cards/s/StruggleSurvive.java | 115 ++++++++++++++++++ Utils/cardSplitClass.tmpl | 13 +- Utils/gen-card.pl | 3 +- 6 files changed, 296 insertions(+), 14 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/c/ClaimFame.java create mode 100644 Mage.Sets/src/mage/cards/g/GrindDust.java create mode 100644 Mage.Sets/src/mage/cards/s/StruggleSurvive.java diff --git a/Mage.Sets/src/mage/cards/c/ClaimFame.java b/Mage.Sets/src/mage/cards/c/ClaimFame.java new file mode 100644 index 0000000000..3161ce925e --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ClaimFame.java @@ -0,0 +1,88 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.Duration; +import mage.constants.SpellAbilityType; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class ClaimFame extends SplitCard { + + private static final FilterCard filter = new FilterCreatureCard("creature card with converted mana cost 2 or less from your graveyard"); + + static { + filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, 3)); + } + + public ClaimFame(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, new CardType[]{CardType.SORCERY}, "{B}", "{1}{R}", SpellAbilityType.SPLIT_AFTERMATH); + + // Claim + // Return target creature card with converted mana cost 2 or less from your graveyard to the battlefield. + getLeftHalfCard().getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()); + getLeftHalfCard().getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter)); + + // Fame + // Aftermath + ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true)); + // Target creature gets +2/+0 and gains haste until end of turn. + getRightHalfCard().getSpellAbility().addEffect(new BoostTargetEffect(2, 0, Duration.EndOfTurn)); + getRightHalfCard().getSpellAbility().addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn) + .setText("and gains haste until end of turn")); + getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent()); + + } + + public ClaimFame(final ClaimFame card) { + super(card); + } + + @Override + public ClaimFame copy() { + return new ClaimFame(this); + } +} diff --git a/Mage.Sets/src/mage/cards/g/GrindDust.java b/Mage.Sets/src/mage/cards/g/GrindDust.java new file mode 100644 index 0000000000..828593c120 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GrindDust.java @@ -0,0 +1,80 @@ +/* + * 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.g; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.SpellAbilityType; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.CounterPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class GrindDust extends SplitCard { + + public GrindDust(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, new CardType[]{CardType.SORCERY}, "{1}{B}", "{3}{W}", SpellAbilityType.SPLIT_AFTERMATH); + + // Grind + // Put a -1/-1 counter on each of up to two target creatures. + Effect effect = new AddCountersTargetEffect(CounterType.M1M1.createInstance()); + effect.setText("Put a -1/-1 counter on each of up to two target creatures"); + getLeftHalfCard().getSpellAbility().addEffect(effect); + getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); + + // Dust + // Aftermath + ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true)); + // Exile any number of target creatures that have -1/-1 counters on them. + getRightHalfCard().getSpellAbility().addEffect(new ExileTargetEffect()); + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new CounterPredicate(CounterType.M1M1)); + getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, false)); + + } + + public GrindDust(final GrindDust card) { + super(card); + } + + @Override + public GrindDust copy() { + return new GrindDust(this); + } +} diff --git a/Mage.Sets/src/mage/cards/i/InnerFlameAcolyte.java b/Mage.Sets/src/mage/cards/i/InnerFlameAcolyte.java index af5bf04400..5962debcbe 100644 --- a/Mage.Sets/src/mage/cards/i/InnerFlameAcolyte.java +++ b/Mage.Sets/src/mage/cards/i/InnerFlameAcolyte.java @@ -28,8 +28,6 @@ package mage.cards.i; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Duration; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -39,6 +37,8 @@ import mage.abilities.keyword.EvokeAbility; 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; /** @@ -48,7 +48,7 @@ import mage.target.common.TargetCreaturePermanent; public class InnerFlameAcolyte extends CardImpl { public InnerFlameAcolyte(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}"); this.subtype.add("Elemental"); this.subtype.add("Shaman"); @@ -56,8 +56,9 @@ public class InnerFlameAcolyte extends CardImpl { this.toughness = new MageInt(2); // When Inner-Flame Acolyte enters the battlefield, target creature gets +2/+0 and gains haste until end of turn. - Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(2,0, Duration.EndOfTurn)); - ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn)); + Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(2, 0, Duration.EndOfTurn)); + ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn) + .setText("and gains haste until end of turn")); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/s/StruggleSurvive.java b/Mage.Sets/src/mage/cards/s/StruggleSurvive.java new file mode 100644 index 0000000000..8071b9c1b0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StruggleSurvive.java @@ -0,0 +1,115 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SpellAbilityType; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class StruggleSurvive extends SplitCard { + + public StruggleSurvive(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{2}{R}", "{1}{G}", SpellAbilityType.SPLIT_AFTERMATH); + + // Struggle + // Struggle deals damage to target creature equal to the number of lands you control. + Effect effect = new DamageTargetEffect(new PermanentsOnBattlefieldCount(new FilterControlledLandPermanent("the number of lands you control"))); + effect.setText("{this} deals damage to target creature equal to the number of lands you control"); + getLeftHalfCard().getSpellAbility().addEffect(effect); + getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // Survive + // Aftermath + ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true)); + // Each player shuffles his or graveyard into his or her library. + getRightHalfCard().getSpellAbility().addEffect(new SurviveEffect()); + + } + + public StruggleSurvive(final StruggleSurvive card) { + super(card); + } + + @Override + public StruggleSurvive copy() { + return new StruggleSurvive(this); + } +} + +class SurviveEffect extends OneShotEffect { + + public SurviveEffect() { + super(Outcome.Neutral); + staticText = "Each player shuffles his or her graveyard into his or her library"; + } + + public SurviveEffect(final SurviveEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player sourcePlayer = game.getPlayer(source.getControllerId()); + for (UUID playerId : game.getState().getPlayersInRange(sourcePlayer.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + for (Card card : player.getGraveyard().getCards(game)) { + card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); + } + player.shuffleLibrary(source, game); + } + } + return true; + } + + @Override + public SurviveEffect copy() { + return new SurviveEffect(this); + } + +} diff --git a/Utils/cardSplitClass.tmpl b/Utils/cardSplitClass.tmpl index 0a1568733f..478db2e8ca 100644 --- a/Utils/cardSplitClass.tmpl +++ b/Utils/cardSplitClass.tmpl @@ -27,13 +27,10 @@ */ package mage.cards.[=$cardNameFirstLetter=]; -import java.util.UUID;[= -if ($power || $power eq 0) { - $OUT .= "\nimport mage.MageInt;" -} -=][=$abilitiesImports=] -import mage.cards.CardImpl; +import java.util.UUID; +[=$abilitiesImports=] import mage.cards.CardSetInfo; +import mage.cards.SplitCard; import mage.constants.CardType; /** @@ -44,10 +41,10 @@ public class [=$className=] extends SplitCard { public [=$className=](UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{[=$type=]}, "[=$manaCost=]"); - [=$subType=][=$colors=][= + [=$subType=][=$colors=] // super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{3}{R}", "{2}{U}", SpellAbilityType.SPLIT_AFTERMATH); - +[= if ($power || $power eq 0) { $OUT .= "\n this.power = new MageInt($power);"; $OUT .= "\n this.toughness = new MageInt($toughness);"; diff --git a/Utils/gen-card.pl b/Utils/gen-card.pl index 6fe02e2421..ceba5aac54 100755 --- a/Utils/gen-card.pl +++ b/Utils/gen-card.pl @@ -109,11 +109,12 @@ if (!exists $cards{$cardName}) { my $cardTemplate = 'cardClass.tmpl'; my $splitDelimiter = '//'; +my $empty = ''; my $splitSpell = 'false'; # Remove the // from name of split cards if (index($cardName, $splitDelimiter) != -1) { - $cardName =~ s/$splitDelimiter/""/g; + $cardName =~ s/$splitDelimiter/$empty/g; $cardTemplate = 'cardSplitClass.tmpl'; $splitSpell = 'true'; } From 0eb054599ae789b5cc71a7d9ab000a2e177bc97e Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 30 Jun 2017 08:24:29 -0500 Subject: [PATCH 062/160] - Added Fervent Paincaster. [HOU] --- .../src/mage/cards/f/FerventPaincaster.java | 80 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 81 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FerventPaincaster.java diff --git a/Mage.Sets/src/mage/cards/f/FerventPaincaster.java b/Mage.Sets/src/mage/cards/f/FerventPaincaster.java new file mode 100644 index 0000000000..e58aee4265 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FerventPaincaster.java @@ -0,0 +1,80 @@ +/* + * 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.f; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.ExertSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.target.TargetPlayer; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author jeffwadsworth + */ +public class FerventPaincaster extends CardImpl { + + public FerventPaincaster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add("Human"); + this.subtype.add("Wizard"); + + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // {T}: Fervent Paincaster deals 1 damage to target player. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost()); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + + // {T}, Exert Fervent Paincaster: It deals 1 damage to target creature. + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost()); + ability2.addCost(new ExertSourceCost()); + ability2.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability2); + + } + + public FerventPaincaster(final FerventPaincaster card) { + super(card); + } + + @Override + public FerventPaincaster copy() { + return new FerventPaincaster(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index cc31351dc9..c83962d629 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -88,6 +88,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); cards.add(new SetCardInfo("Earthshaker Khenra", 90, Rarity.RARE, mage.cards.e.EarthshakerKhenra.class)); + cards.add(new SetCardInfo("Fervent Paincaster", 91, Rarity.UNCOMMON, mage.cards.f.FerventPaincaster.class)); cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); From 57caa02091bf71d16384d8f640fd6d9de35e544b Mon Sep 17 00:00:00 2001 From: spjspj Date: Fri, 30 Jun 2017 23:40:19 +1000 Subject: [PATCH 063/160] Implement Sunset Pyramid (HOU) --- Mage.Sets/src/mage/cards/s/SunsetPyramid.java | 78 +++++++++++++++++++ .../src/mage/cards/u/UncageTheMenagerie.java | 2 +- .../src/mage/sets/HourOfDevastation.java | 3 + 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/s/SunsetPyramid.java diff --git a/Mage.Sets/src/mage/cards/s/SunsetPyramid.java b/Mage.Sets/src/mage/cards/s/SunsetPyramid.java new file mode 100644 index 0000000000..32cebf1d88 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SunsetPyramid.java @@ -0,0 +1,78 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.counters.CounterType; + +/** + * + * @author spjspj + */ +public class SunsetPyramid extends CardImpl { + + public SunsetPyramid(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + // Sunset Pyramid enters the battlefield with three brick counters on it. + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.BRICK.createInstance(3)), "with three brick counters on it")); + + // {2}, {T}, Remove a brick counter from Sunset Pyramid: Draw a card. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(2)); + ability.addCost(new TapSourceCost()); + ability.addCost(new RemoveCountersSourceCost(CounterType.BRICK.createInstance())); + this.addAbility(ability); + + // {2}, {T}: Scry 1. + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(2)); + ability2.addCost(new TapSourceCost()); + this.addAbility(ability2); + + } + + public SunsetPyramid(final SunsetPyramid card) { + super(card); + } + + @Override + public SunsetPyramid copy() { + return new SunsetPyramid(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java b/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java index 41b7381fc2..60a13fc1b6 100644 --- a/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java +++ b/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java @@ -126,7 +126,7 @@ class UncageTheMenagerieTarget extends TargetCardInLibrary { private int xValue; public UncageTheMenagerieTarget(int xValue) { - super(0, xValue, new FilterCreatureCard(xValue + " creature cards with different names")); + super(0, xValue, new FilterCreatureCard(xValue + " creature cards with different names with converted mana cost " + xValue)); this.xValue = xValue; } diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index d38ed4214a..0dfae8dd2a 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -77,6 +77,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); cards.add(new SetCardInfo("Crook of Comdemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfComdemnation.class)); + cards.add(new SetCardInfo("Crumbling Necropolis", 169, Rarity.UNCOMMON, mage.cards.c.CrumblingNecropolis.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); @@ -118,6 +119,8 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); + cards.add(new SetCardInfo("Strategic Planning", 47, Rarity.COMMON, mage.cards.s.StrategicPlanning.class)); + cards.add(new SetCardInfo("Sunset Pyramid", 166, Rarity.UNCOMMON, mage.cards.s.SunsetPyramid.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Swarm Intelligence", 50, Rarity.RARE, mage.cards.s.SwarmIntelligence.class)); From 564e0ff70de5ca1529232a87ccc81048a225e9ed Mon Sep 17 00:00:00 2001 From: emerald000 Date: Fri, 30 Jun 2017 11:10:33 -0400 Subject: [PATCH 064/160] Fix compilation error. --- Mage/src/main/java/mage/game/stack/StackAbility.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java index 6be75a0a11..8c8577dbf3 100644 --- a/Mage/src/main/java/mage/game/stack/StackAbility.java +++ b/Mage/src/main/java/mage/game/stack/StackAbility.java @@ -28,7 +28,6 @@ package mage.game.stack; import java.util.*; - import mage.MageInt; import mage.MageObject; import mage.ObjectColor; @@ -447,8 +446,9 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public void setRuleAtTheTop(boolean ruleAtTheTop) { + public Ability setRuleAtTheTop(boolean ruleAtTheTop) { this.ability.setRuleAtTheTop(ruleAtTheTop); + return this; } @Override From ade4e01a7736bbbee1813620f4caba8fc6659f4f Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 30 Jun 2017 11:25:51 -0500 Subject: [PATCH 065/160] - Added Gilded Cerodon. [HOU] --- Mage.Sets/src/mage/cards/g/GildedCerodon.java | 108 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 109 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GildedCerodon.java diff --git a/Mage.Sets/src/mage/cards/g/GildedCerodon.java b/Mage.Sets/src/mage/cards/g/GildedCerodon.java new file mode 100644 index 0000000000..b38438b6cc --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GildedCerodon.java @@ -0,0 +1,108 @@ +/* + * 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.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author jeffwadsworth + */ +public class GildedCerodon extends CardImpl { + + private static final String rule = "Whenever {this} attacks, if you control a Desert or there is a Desert card in your graveyard, target creature can't block this turn."; + + public GildedCerodon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}"); + + this.subtype.add("Beast"); + + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Whenever Gilded Cerodon attacks, if you control a Desert or there is a Desert card in your graveyard, target creature can't block this turn. + Ability ability = new ConditionalTriggeredAbility(new AttacksTriggeredAbility(new CantBlockTargetEffect(Duration.EndOfTurn), false), new GildedCerodonCondition(), rule); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + } + + public GildedCerodon(final GildedCerodon card) { + super(card); + } + + @Override + public GildedCerodon copy() { + return new GildedCerodon(this); + } +} + +class GildedCerodonCondition implements Condition { + + private static final FilterPermanent filter = new FilterPermanent(); + private static final FilterCard filter2 = new FilterCard(); + + static { + filter.add(new SubtypePredicate(SubType.DESERT)); + filter2.add(new SubtypePredicate(SubType.DESERT)); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null + && !game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game).isEmpty() + || controller.getGraveyard().count(filter2, game) > 0) { + return true; + } + return false; + } + + @Override + public String toString() { + return "if you control a Desert or there is a Desert card in your graveyard"; + } + +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 8f9c3752e3..3cff2e629d 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -92,6 +92,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Fervent Paincaster", 91, Rarity.UNCOMMON, mage.cards.f.FerventPaincaster.class)); cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); + cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); From 67415c0faf761eff8feac315934e9ae884f27256 Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 30 Jun 2017 17:10:02 -0500 Subject: [PATCH 066/160] - Added Fraying Sanity. [HOU] --- Mage.Sets/src/mage/cards/f/FrayingSanity.java | 146 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 147 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FrayingSanity.java diff --git a/Mage.Sets/src/mage/cards/f/FrayingSanity.java b/Mage.Sets/src/mage/cards/f/FrayingSanity.java new file mode 100644 index 0000000000..e6aef5da26 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FrayingSanity.java @@ -0,0 +1,146 @@ +/* + * 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.f; + +import java.util.Set; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.constants.Outcome; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.watchers.common.CardsPutIntoGraveyardWatcher; + +/** + * + * @author jeffwadsworth + */ +public class FrayingSanity extends CardImpl { + + public FrayingSanity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); + + this.subtype.add("Aura"); + this.subtype.add("Curse"); + + // Enchant player + TargetPlayer auraTarget = new TargetPlayer(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // At the beginning of each end step, enchanted player puts the top X cards of his or her library into his or her graveyard, where X is the total number of cards put into his or her graveyard from anywhere this turn. + this.addAbility(new FrayingSanityTriggeredAbility(), new CardsPutIntoGraveyardWatcher()); + + } + + public FrayingSanity(final FrayingSanity card) { + super(card); + } + + @Override + public FrayingSanity copy() { + return new FrayingSanity(this); + } +} + +class FrayingSanityTriggeredAbility extends TriggeredAbilityImpl { + + public FrayingSanityTriggeredAbility() { + super(Zone.BATTLEFIELD, new FrayingSanityEffect()); + } + + public FrayingSanityTriggeredAbility(final FrayingSanityTriggeredAbility ability) { + super(ability); + } + + @Override + public FrayingSanityTriggeredAbility copy() { + return new FrayingSanityTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.END_TURN_STEP_PRE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return true; + } + + @Override + public String getRule() { + return "At the beginning of each end step, enchanted player puts the top X cards of his or her library into his or her graveyard, where X is the total number of cards put into his or her graveyard from anywhere this turn."; + } +} + +class FrayingSanityEffect extends OneShotEffect { + + int xAmount = 0; + + public FrayingSanityEffect() { + super(Outcome.LoseLife); + this.staticText = "enchanted player puts the top X cards of his or her library into his or her graveyard, blah blah"; + } + + public FrayingSanityEffect(final FrayingSanityEffect effect) { + super(effect); + } + + @Override + public FrayingSanityEffect copy() { + return new FrayingSanityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player enchantedPlayer = game.getPlayer(game.getPermanent(source.getSourceId()).getAttachedTo()); + if (enchantedPlayer != null) { + CardsPutIntoGraveyardWatcher watcher = (CardsPutIntoGraveyardWatcher) game.getState().getWatchers().get(CardsPutIntoGraveyardWatcher.class.getSimpleName()); + if (watcher != null) { + xAmount = watcher.getAmountCardsPutToGraveyard(enchantedPlayer.getId()); + } + Set topXCardsFromLibrary = enchantedPlayer.getLibrary().getTopCards(game, xAmount); + return enchantedPlayer.moveCards(topXCardsFromLibrary, Zone.GRAVEYARD, source, game, false, false, true, null); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 3cff2e629d..6382cde597 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -91,6 +91,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Earthshaker Khenra", 90, Rarity.RARE, mage.cards.e.EarthshakerKhenra.class)); cards.add(new SetCardInfo("Fervent Paincaster", 91, Rarity.UNCOMMON, mage.cards.f.FerventPaincaster.class)); cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Fraying Sanity", 35, Rarity.UNCOMMON, mage.cards.f.FrayingSanity.class)); cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); From 87b0b950364e91ca0814db9e1463cd5a2e1149d3 Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 30 Jun 2017 17:15:37 -0500 Subject: [PATCH 067/160] - Text fix. --- Mage.Sets/src/mage/cards/f/FrayingSanity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/f/FrayingSanity.java b/Mage.Sets/src/mage/cards/f/FrayingSanity.java index e6aef5da26..645fe136bd 100644 --- a/Mage.Sets/src/mage/cards/f/FrayingSanity.java +++ b/Mage.Sets/src/mage/cards/f/FrayingSanity.java @@ -117,8 +117,8 @@ class FrayingSanityEffect extends OneShotEffect { int xAmount = 0; public FrayingSanityEffect() { - super(Outcome.LoseLife); - this.staticText = "enchanted player puts the top X cards of his or her library into his or her graveyard, blah blah"; + super(Outcome.Detriment); + this.staticText = ""; } public FrayingSanityEffect(final FrayingSanityEffect effect) { From 42534d5af128e29e73a16614b33692a32a47c8c0 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 1 Jul 2017 14:15:26 +1000 Subject: [PATCH 068/160] Rest of HOU spoiler --- Utils/mtg-cards-data.txt | 68 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 3906a99f7c..49beca548b 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31810,3 +31810,71 @@ Drowned Catacomb|Ixalan|???|R||Land|||Drowned Catacomb enters the battlefield ta Glacial Fortress|Ixalan|???|R||Land|||Glacial Fortress enters the battlefield tapped unless you control a Plains or an Island.${T}: Add {W} or {U} to your mana pool.| Rootbound Crag|Ixalan|???|R||Land|||Rootbound Crag enters the battlefield tapped unless you control a Mountain or a Forest.${T}: Add {R} or {G} to your mana pool.| Sunpetal Grove|Ixalan|???|R||Land|||Sunpetal Grove enters the battlefield tapped unless you control a Forest or a Plains.${T}: Add {G} or {W} to your mana pool.| +Act of Heroism|Hour of Devastation|1|C|{1}{W}|Instant|||Untap target creature. It gets +2/+2 until end of turn and can block an additional creature this turn.| +Aerial Guide|Hour of Devastation|29|C|{2}{U}|Creature - Drake|2|2|Flying.$Whenever Aerial Guide attacks, another target attacking creature gains flying until end of turn.| +Ambuscade|Hour of Devastation|110|C|{2}{G}|Instant|||Target creature you contol gets +1/+0 until end of turn. It deals damage equal to its power to target creature an opponent controls.| +Apocalypse Demon|Hour of Devastation|58|R|{4}{B}{B}|Creature - Demon|*|*|Flying.$Apocalypse Demon's power and toughness are each equal to the number of cards in your graveyard.$At the beginning of your upkeep, tap Apocalypse Demon unless you sacrifice another creature.| +Aven Reedstalker|Hour of Devastation|30|C|{4}{U}|Creature - Bird Warrior|2|3|Flash$Flying| +Aven of Enduring Hope|Hour of Devastation|5|C|{4}{W}|Creature - Bird Cleric|3|3|Flying.$When Aven of Enduring Hope enters the battlefield, you gain 3 life.| +Banewhip Punisher|Hour of Devastation|59|U|{2}{U}|Creature - Human Warrior|2|3|When Banewhip Punisher enters the battlefield, you may put a -1/-1 counter on target creature${B}, Sacrifice Banewhip Punisher: Destroy target creature that has a -1/-1 counter on it| +Beneath the Sands|Hour of Devastation|111|C|{2}{G}|Sorcery|||Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.$ Cycling {2}| +Bitterbow Sharpshooters|Hour of Devastation|112|C|{4}{G}|Creature - Jackal Archer|4|4|Vigilance, Reach| +Blur of Blades|Hour of Devastation|84|C|{1}{R}|Instant|||Put a -1/-1 counter on target creature. Blur of Blades deals 2 damage to that creature's controller| +Burning-Fist Minotaur|Hour of Devastation|85|U|{1}{U}|Creature - Minotaur Wizard|2|1|First Strike${1}{R}, Discard a card: Burning-Fist Minotaur gets +2/+0 until end of turn.| +Countervailing Winds|Hour of Devastation|32|C|{2}{U}|Instant|||Counter target spell unless its controller pays {1} for each card in your graveyard.$Cycling {2}| +Crash Through|Hour of Devastation|88|C|{R}|Sorcery|||Creatures you control gain trample until end of turn$Draw a card| +Crypt of the Eternals|Hour of Devastation|169|U|{4}{U}|Land|||When Crypt of the Eternals enters the battlefield, you gain 1 life.${T}: Add {C} to your mana pool.${1}, {T}: Add {U}, {B} or {R} to your mana pool.| +Cunning Survivor|Hour of Devastation|33|C|{1}{U}|Creature - Human Warrior|2|3|Whenever you cycle or discard a card, Cunning Survivor gets +1/+0 until end of turn and can't be blocked this turn.| +Dagger of the Worthy|Hour of Devastation|160|U|{2}|Artifact - Equipment|||Equipped creature gets +2/+0 and has afflict 1.$Equip {2}| +Dauntless Aven|Hour of Devastation|7|C|{2}{W}|Creature - Bird Warrior|2|1|Flying$Whenever Dauntless Aven attacks, untap target creature you control.| +Devotee of Strength|Hour of Devastation|113|U|{2}{G}|Creature - Naga Wizard|3|2|{4}{G}: Target creature gets +2/+2 until end of turn.| +Disposal Mummy|Hour of Devastation|9|C|{2}{W}|Creature - Zombie Jackal|2|3|When Disposal Mummy enters the battlefield, exile target card from an opponent's graveyard.| +Djeru's Renunciation|Hour of Devastation|11|C|{1}{W}|Instant|||Tap up to two target creatures.$Cycling {W}| +Dune Diviner|Hour of Devastation|114|C|{2}{G}|Creature - Naga Cleric|2|3|{1}, Tap an untapped Desert you control: You gain 1 life.| +Dunes of the Dead|Hour of Devastation|175|U||Land - Desert|2|3|{T}: Add {C} to your mana pool.$When Dunes of the Dead is put into a graveyard from the battlefield, create a 2/2 black Zombie creature token.| +Feral Prowler|Hour of Devastation|115|C|{1}{G}|Creature - Cat|1|3|When Feral Prowler dies, draw a card| +Firebrand Archer|Hour of Devastation|92|C|{1}{R}|Creature - Human Archer|2|1|Whenever you cast a noncreature spell, Firebrand Archer deals 1 damage to each opponent.| +Frilled Sandwalla|Hour of Devastation|116|C|{G}|Creature - Lizard|1|1|{1}{G}: Frilled Sandwalla gets +2/+2 until end of turn. Activate this ability only once each turn.| +Gift of Strength|Hour of Devastation|117|C|{1}{G}|Instant|||Target creature gets +3/+3 until and gains reach until end of turn.| +Granitic Titan|Hour of Devastation|95|C|{4}{R}{R}|Creature - Elemental|5|4|Menace$Cycling {2}| +Graven Abomination|Hour of Devastation|162|C|{3}|Artifact Creature - Horror|3|1|Whenever Graven Abomination attacks, exile target card from defending player's graveyard.| +Grisly Survivor|Hour of Devastation|64|C|{2}{B}|Creature - Minotaur Warrior|2|3|Whenever you cycle or discard a card, Grisly Survivor gets +2/+0 until end of turn.| +Harrier Naga|Hour of Devastation|118|C|{2}{G}|Creature - Naga Warrior|3|3|| +Hostile Desert|Hour of Devastation|178|R|||2|3|{T}: Add {C} to your mana pool.${2}, Exile a land card from your graveyard: Hostile Desert becomes a 3/4 Elemental creature until end of turn. It's still a land.| +Imaginary Threats|Hour of Devastation|37|U|{2}{U}{U}|Instant|||Creatures target opponent controls attack this turn if able. During that player's next untap step, creatures he or she controls don't untap$Cycling {2}| +Kindled Fury|Hour of Devastation|101|C|{R}|Instant|||Target creature gets +2/+1 and gains first strike until end of turn| +Lethal Sting|Hour of Devastation|67|C|{2}{B}|Sorcery|||As an additional cost to cast Lethal Sting, put a -1/-1 counter on a creature you control.$Destroy target creature| +Lurching Rotbeast|Hour of Devastation|69|C|{3}{B}|Creature - Zombie Beast|4|2|Cycling {B}| +Magmaroth|Hour of Devastation|102|U|{3}{R}|Creature - Elemental|5|5|At the beginning of your upkeep, put a -1/-1 counter on Magmaroth.$Whenever you cast a noncreature spell, remove a -1/-1 counter from Magmaroth.| +Manalith|Hour of Devastation|164|C|{3}|Artifact|||{T}: Add one mana of any color to your mana pool.| +Moaning Wall|Hour of Devastation|72|C|{2}{B}|Creature - Zombie Wall|0|5|Defender$Cycling {2}| +Obelisk Spider|Hour of Devastation|141|U|{1}{B}{G}|Creature - Spider|1|4|Reach$Whenever Obelisk Spider deals combat damage to a creature, put a -1/-1 counter on that creature.$Whenever you put one or more -1/-1 counters on a creature, each opponent loses 1 life and you gain 1 life| +Oketra's Avenger|Hour of Devastation|17|C|{1}{U}|Creature - Human Warrior|3|1|You may exert Oketra's Avenger as it attacks. When you do, prevent all combat damage that would be dealt to it this turn.| +Overcome|Hour of Devastation|125|U|{3}{G}{G}|Sorcery|||Creatures you control get +2/+2 and gain trample until end of turn.| +Puncturing Blow|Hour of Devastation|106|C|{2}{R}{R}|Sorcery|||Puncturing Blow deals 5 damage to target creature. If that creature would die this turn, exile it instead.| +Quarry Beetle|Hour of Devastation|127|U|{4}{G}|Creature - Insect|4|5|When Quarry Beetle enters the battlefield, you may return target land card from your graveyard to the battlefield.| +Rampaging Hippo|Hour of Devastation|128|C|4}{G}{G}|Creature - Hippo|5|6|Trample$Cycling {2}| +Ramunap Excavator|Hour of Devastation|129|R|{2}{G}|Creature - Naga Warrior|2|3|You may play land cards from your graveyard.| +Resolute Survivors|Hour of Devastation|142|U|{1}{R}{W}|Creature - Human Warrior|3|3|You may exert Resolute Survivors as it attacks.$Whenever you exert a creature, Resolute Survivors deals 1 damage to each opponent and you gain 1 life.| +Riddleform|Hour of Devastation|43|U|{1}{U}|Enchantment|||Whenever you cast a noncreature spell, you may have Riddleform become a 3/3 sphinx creature with flying in addition to its other types until end of turn${2}{U}: Scry 1.| +River Hoopoe|Hour of Devastation|143|U|{G}{U}|Creature - Bird|1|3|Flying${3}{G}{U}: You gain 2 life and draw a card| +Ruin Rat|Hour of Devastation|75|C|{1}{B}|Creature - Rat|2|3|Deathtouch$When Ruin Rat dies, exile target card from an opponent's graveyard.| +Sandblast|Hour of Devastation|20|C|{1}{W}|Insant|||Sandblast deals 5 damaage to target attacking or blocking creature.| +Saving Grace|Hour of Devastation|21|U|{1}{W}|Enchantment - Aura|||Flash$Enchant creature you control$When Saving Grace enters the battlefield, all damage that would be dealth this turn to you and permanents you control is dealt to enchanted creature instead.$Enchanted creature gets +0/+3.| +Scrounger of Souls|Hour of Devastation|76|C|{4}{B}|Creature - Horror|3|4|Lifelink| +Sifter Wurm|Hour of Devastation|135|U|{5}{G}{G}|Creature - Wurm|7|7|Trample$When Sifter Wurm enters the battlefield, scry 3, then reveal the top card of your library. You gain life equal to that card's converted mana cost.| +Solitary Camel|Hour of Devastation|23|C|{2}{W}|Creature - Camel|3|2|Solitary Camel has lifelink as long as you control a desert or there is a desert card in your graveyard.| +Spellweaver Eternal|Hour of Devastation|46|C|{1}{U}|Creature - Zombie Naga Wizard|2|1|Prowess$Afflict 2| +Striped Riverwinder|Hour of Devastation|48|C|{6}{U}|Creature - Serpent|5|5|Hexproof$Cycling {U}| +Tenacious Hunter|Hour of Devastation|136|U|{2}{G}{G}|Creature - Crocodile|4|4|As long as a creature has a -1/-1 counter on it, Tenacious Hunter has vigilance and deathtouch.| +Thorned Moloch|Hour of Devastation|108|C|{2}{R}|Creature - Lizard|2|2|Prowess$Thorned Moloch has first strike as long as it's attacking| +Travelers Amulet|Hour of Devastation|167|C|{1}|Artifact|||{1}, Sacrifice Travelers Amulet: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library| +Uncage the Menagerie|Hour of Devastation|137|M|{X}{G}{G}|Sorcery|||Search your library for up to X creature cards with different names that each have converted mana cost X, reveal them, put them into your hand, then shuffle your library| +Unconventional Tactics|Hour of Devastation|27|U|{2}{W}|Sorcery|||Target creature gets +3/+3 and gains flying until end of turn.$Whenever a zombie enters the battlefield under your control, you may pay {W}. If you do, return Unconventional Tactics from your graveyard to your hand.| +Unquenchable Thirst|Hour of Devastation|53|C|{1}{U}|Enchantment - Aura|||Enchant player$When Unquenchable Thirst enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step| +Unsummon|Hour of Devastation|54|C|{U}|Instant|||Return target creature to its owner's hand.| +Vile Manifestation|Hour of Devastation|80|U|{1}{B}|Creature - Horror|0|4|Vile Manifestation gets +1/+0 for each card with cycling in your graveyard.$Cycling {2}| +Vizier of the Anointed|Hour of Devastation|55|U|{3}{U}|Creature - Human Cleric|2|4|When Vizier of the Anointed enters the battlefield, you may search your library for a creature card with eternalize or embalm, put that card into your graveyard, then shuffle your library.$Whenever you activate an eternalize or embalm ability, draw a card.| +Wall of Forgotten Pharaohs|Hour of Devastation|162|C|{2}|Artifact Creature - Wall|0|4|Defender${T}: Wall of Forgotten Pharaohs deals 1 damage to target player. Activate this ability only if you control a Desert or there is a Desert card in your graveyard.| +Without Weakness|Hour of Devastation|81|C|{1}{B}|Instant|||Target creature you control gains indestructible until end of turn.$Cycling {2}| +Wretched Camel|Hour of Devastation|82|C|{1}{B}|Creature - Camel|2|1|When Wretched Camel dies, if you control a Desert or there is a Desert card in your graveyard, target player discards a card.| From 8a8588924a2370e223fe8666e97bf29b06076554 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 1 Jul 2017 08:58:37 +0200 Subject: [PATCH 069/160] [HOU] Added HOU complete spoilers (from web site parsing). --- Utils/mtg-cards-data.txt | 138 ++++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 67 deletions(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 49beca548b..ff3036c605 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31626,83 +31626,134 @@ Island|Archenemy: Nicol Bolas|103|L||Basic Land - Island|||{T}: Add {U} to your Swamp|Archenemy: Nicol Bolas|104|L||Basic Land - Swamp|||{T}: Add {B} to your mana pool.| Mountain|Archenemy: Nicol Bolas|105|L||Basic Land - Mountain|||{T}: Add {R} to your mana pool.| Forest|Archenemy: Nicol Bolas|106|L||Basic Land - Forest|||{T}: Add {G} to your mana pool.| +Act of Heroism|Hour of Devastation|1|C|{1}{W}|Instant|||Untap target creature. It gets +2/+2 until end of turn and can block an additional creature this turn.| Adorned Pouncer|Hour of Devastation|2|R|{1}{W}|Creature - Cat|1|1|Double strike$Eternalize {3}{W}{W} ({3}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Cat with no mana cost. Eternalize only as a sorcery.)| Angel of Condemnation|Hour of Devastation|3|R|{2}{W}{W}|Creature - Angel|3|3|Flying, vigilance${2}{W}, {T}: Exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step.${2}{W}, {T}, Exert Angel of Condemnation: Exile another target creature until Angel of Condemnation leaves the battlefield. (An exerted creature won't untap during your next untap step.)| Angel of the God-Pharaoh|Hour of Devastation|4|U|{4}{W}{W}|Creature - Angel|4|4|Flying$Cycling {2} ({2}, Discard this card: Draw a card.)| +Aven of Enduring Hope|Hour of Devastation|5|C|{4}{W}|Creature - Bird Cleric|3|3|Flying$When Aven of Enduring Hope enters the battlefield, you gain 3 life.| Crested Sunmare|Hour of Devastation|6|M|{3}{W}{W}|Creature - Horse|5|5|Other Horses you control have indestructible.$At the beginning of each end step, if you gained life this turn, create a 5/5 white Horse creature token.| +Dauntless Aven|Hour of Devastation|7|C|{2}{W}|Creature - Bird Warrior|2|1|Flying$Whenever Dauntless Aven attacks, untap target creature you control.| Desert's Hold|Hour of Devastation|8|U|{2}{W}|Enchantment - Aura|||Enchant creature$When Desert's Hold enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life.$Enchanted creature can't attack or block, and its activated abilities can't be activated.| +Disposal Mummy|Hour of Devastation|9|C|{2}{W}|Creature - Zombie Jackal|2|3|When Disposal Mummy enters the battlefield, exile target card in a graveyard.| Djeru, With Eyes Open|Hour of Devastation|10|R|{3}{W}{W}|Legendary Creature - Human Warrior|4|3|Vigilance$When Djeru, With Eyes Open enters the battlefield, you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library.$If a source would deal damage to a planeswalker you control, prevent 1 of that damage.| +Djeru's Renunciation|Hour of Devastation|11|C|{1}{W}|Instant|||Tap up to two target creatures.$Cycling {W} ({W}, Discard this card: Draw a card.)| Dutiful Servants|Hour of Devastation|12|C|{3}{W}|Creature - Zombie|2|5|| Gideon's Defeat|Hour of Devastation|13|U|{W}|Instant|||Exile target white creature that's attacking or blocking. If it was a Gideon planeswalker, you gain 5 life.| God-Pharaoh's Faithful|Hour of Devastation|14|C|{W}|Creature - Human Wizard|0|4|Whenever you cast a blue, black or red spell, you gain 1 life.| Hour of Revelation|Hour of Devastation|15|R|{3}{W}{W}{W}|Sorcery|||Hour of Revelation costs {3} less to cast if there are ten or more nonland permanents on the battlefield.$Destroy all nonland permanents.| Mummy Paramount|Hour of Devastation|16|C|{1}{W}|Creature - Zombie|2|2|Whenever another Zombie enters the battlefield under your control, Mummy Paramount gets +1/+1 until end of turn.| +Oketra's Avenger|Hour of Devastation|17|C|{1}{W}|Creature - Human Warrior|3|1|You may exert Oketra's Avenger as it attacks. When you do, prevent all combat damage that would be dealt to it this turn. (An exerted creature doesn't untap during its controller's next untap step.)| Oketra's Last Mercy|Hour of Devastation|18|R|{1}{W}{W}|Sorcery|||Your life total becomes your starting life total. Lands you control don't untap during your next untap phase| Overwhelming Splendor|Hour of Devastation|19|M|{6}{W}{W}|Enchantment - Aura Curse|||Enchant player$Creatures enchanted player controls lose all abilities and have base power and toughness 1/1.$Enchanted player can't activate abilities that aren't mana abilities or loyalty abilities.| +Sandblast|Hour of Devastation|20|C|{2}{W}|Instant|||Sandblast deals 5 damage to target attacking or blocking creature.| +Saving Grace|Hour of Devastation|21|U|{1}{W}|Enchantment - Aura|||Flash$Enchant creature you control.$When Saving Grace enters the battlefield, all damage that would be dealt this turn to you and permanents you control is dealt to enchanted creature instead.$Enchanted creature gets +0/+3| Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counters.$Counters can't be put on artifacts, creatures, enchantments, or lands.| +Solitary Camel|Hour of Devastation|23|C|{2}{W}|Creature - Camel|3|2|Solitary Camel has lifelink as long as you control a desert or there is a desert card in your graveyard. (Damage this creature deals also causes you to gain that much life.)| Steadfast Sentinel|Hour of Devastation|24|C|{3}{W}|Creature - Human Cleric|2|3|Vigilance$Eternalize {4}{W}{W} ({4}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Cleric with no mana cost. Eternalize only as a sorcery.)| Steward of Solidarity|Hour of Devastation|25|U|{1}{W}|Creature - Human Warrior|2|2|{T}, Exert Steward of Solidarity: Create a 1/1 white Warrior creature token with vigilance. (An exerted creature won't untap during your next untap step.)| Sunscourge Champion|Hour of Devastation|26|U|{2}{W}|Creature - Human Wizard|2|3|When Sunscourge Champion enters the battlefield, you gain life equal to its power.$Eternalize—{2}{W}{W}, Discard a card. ({2}{W}{W}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| +Unconventional Tactics|Hour of Devastation|27|U|{2}{W}|Sorcery|||Target creature gets +3/+3 and gains flying until end of turn.$Whenever a Zombie enters the battlefield under your control, you may pay {W}. If you do, return Unconventional Tactics from your graveyard to your hand.| Vizier of the True|Hour of Devastation|28|U|{3}{W}|Creature - Human Cleric|3|2|You may exert Vizier of the True as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, tap target creature an opponent controls.| +Aerial Guide|Hour of Devastation|29|C|{2}{U}|Creature - Drake|2|2|Flying$Whenever Aerial Guide attacks, another target creature gains flying until end of turn.| +Aven Reedstalker|Hour of Devastation|30|C|{3}{U}|Creature - Bird Warrior|2|3|Flash$Flying| Champion of Wits|Hour of Devastation|31|R|{2}{U}|Creature - Naga Wizard|2|1|When Champion of Wits enters the battlefield, you may draw cards equal to its power. If you do, discard two cards.$Eternalize {5}{U}{U} ({5}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Naga Wizard with no mana cost. Eternalize only as a sorcery.)| +Countervailing Winds|Hour of Devastation|32|C|{2}{U}|Instant|||Counter target spell unless its controller pays {1} for each card in your graveyard.$Cycling {2} ({2}, Discard this card: Draw a card.)| +Cunning Survivor|Hour of Devastation|33|C|{1}{U}|Creature - Human Warrior|1|3|Whenever you cycle or discard a card, Cunning Survivor gets +1/+0 until end of turn and can't be blocked this turn.| Eternal of Harsh Truths|Hour of Devastation|34|U|{2}{U}|Creature - Zombie Cleric|1|3|Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)$Whenever Eternal of Harsh Truths attacks and isn't blocked, draw a card.| Fraying Sanity|Hour of Devastation|35|R|{2}{U}|Enchantment - Aura Curse|||Enchant player$At the beginning of each end step, enchanted player puts the top X cards of his or her library into his or her graveyard, where X is the total number of cards put into his or her graveyard from anywhere this turn. | Hour of Eternity|Hour of Devastation|36|R|{X}{X}{U}{U}{U}|Sorcery|||Exile X target creature cards from your graveyard. For each card exiled this way, create a token that's a copy of that card, except it's a 4/4 black Zombie.| +Imaginary Threats|Hour of Devastation|37|U|{2}{U}{U}|Instant|||Creatures target opponent controls attack this turn if able. During that player's next untap step, creatures he or she controls don't untap.$Cycling {2} ({2}, Discard this card: Draw a card.)| Jace's Defeat|Hour of Devastation|38|U|{1}{U}|Instant|||Counter target blue spell. If it was a Jace planeswalker spell, scry 2.| Kefnet's Last Word|Hour of Devastation|39|R|{2}{U}{U}|Sorcery|||Gain control of target artifact, creature or enchantment. Lands you control don't untap during your next untap step.| Nimble Obstructionist|Hour of Devastation|40|R|{2}{U}|Creature - Bird Wizard|3|1|Flash$Flying$Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.)$When you cycle Nimble Obstructionist, counter target activated or triggered ability you don't control.| Ominous Sphinx|Hour of Devastation|41|U|{3}{U}{U}|Creature - Sphinx|4|4|Flying$Whenever you cycle or discard a card,target creature an opponent controls gets -2/-0 until end of turn.| Proven Combatant|Hour of Devastation|42|C|{U}|Creature - Human Warrior|1|1|Eternalize {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Warrior with no mana cost. Eternalize only as a sorcery.) | +Riddleform|Hour of Devastation|43|U|{1}{U}|Enchantment|||Whenever you cast a noncreature spell, you may have Riddleform become a 3/3 Sphinx creature with flying in addition to its other types until end of turn.${2}{U}: Scry 1.| Seer of the Last Tomorrow|Hour of Devastation|44|C|{2}{U}|Creature - Naga Cleric|1|4|{U}, {T}, Discard a card: Target player puts the top three cards of his or her library into his or her graveyard.| Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize—{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| +Spellweaver Eternal|Hour of Devastation|46|C|{1}{U}|Creature - Zombie Naga Wizard|2|1|Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)| Strategic Planning|Hour of Devastation|47|C|{1}{U}|Sorcery|||Look at the top three cards of your library. Put one of them into your hand and the rest in the graveyard.| +Striped Riverwinder|Hour of Devastation|48|C|{6}{U}|Creature - Serpent|5|5|Hexproof (This creature can't be the target of spells or abilities your opponents control.)$Cycling {U} ({U}, Discard this card: Draw a card.)| Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counter target spell unless its controller pays {3}.$• Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| Tragic Lesson|Hour of Devastation|51|C|{2}{U}|Instant|||Draw two cards. Then discard a card unless you return a land you control to its owner's hand.| Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| +Unquenchable Thirst|Hour of Devastation|53|C|{1}{U}|Enchantment - Aura|||Enchant creature$When Unquenchable Thirst enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step.| +Unsummon|Hour of Devastation|54|C|{U}|Instant|||Return target creature to its owner's hand.| Vizier of the Anointed|Hour of Devastation|55|U|{3}{U}|Creature - Human Cleric|2|4|When Vizier of the Anointed enters the battlefield, search your library for a creature card with eternalize or embalm, put it in your graveyard, then shuffle your library.$Whenever you activate an eternalize or embalm ability, draw a card.| Accursed Horde|Hour of Devastation|56|U|{3}{B}|Creature - Zombie|3|3|{1}{B}: Target attacking Zombie gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.)| Ammit Eternal|Hour of Devastation|57|R|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| +Apocalypse Demon|Hour of Devastation|58|R|{4}{B}{B}|Creature - Demon|0|0|Flying$Apocalypse Demon's power and toughness are each equal to the number of cards in your graveyard.$At the beginning of your upkeep, tap Apocalypse Demon unless you sacrifice another creature.| +Banewhip Punisher|Hour of Devastation|59|U|{2}{B}|Creature - Human Warrior|2|2|When Banewhip Punisher enters the battlefield, you may put a -1/-1 counter on target creature.${B}, Sacrifice Banewhip Punisher: Destroy target creature that has a -1/-1 counter on it.| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| Dreamstealer|Hour of Devastation|63|R|{2}{B}|Creature - Human Wizard|1|2|Menace$When Dreamstealer deals combat damage to a player, that player discards that many cards.$Eternalize {4}{B}{B} ({4}{B}{B}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| +Grisly Survivor|Hour of Devastation|64|C|{2}{B}|Creature - Minotaur Warrior|2|3|Whenever you cycle or discard a card, Grisly Survivor gets +2/+0 until end of turn.| Hour of Glory|Hour of Devastation|65|R|{3}{B}|Instant|||Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature.| Khenra Eternal|Hour of Devastation|66|C|{1}{B}|Creature - Zombie Jackal Warrior|2|2|Afflict 1 (Whenever this creature becomes blocked, defending player loses 1 life.)| +Lethal Sting|Hour of Devastation|67|C|{2}{B}|Sorcery|||As an additional cost to cast Lethal Sting,put a -1/-1 counter on a creature you control.$Destroy target creature.| Liliana's Defeat|Hour of Devastation|68|U|{B}|Sorcery|||Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life.| +Lurching Rotbeast|Hour of Devastation|69|C|{3}{B}|Creature - Zombie Beast|4|2|Cycling {B} ({B}, Discard this card: Draw a card.)| Maurauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| Merciless Eternal|Hour of Devastation|71|U|{2}{B}|Creature - Zombie Cleric|2|2|Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)${2}{B}, Discard a card: Merciless Eternal gets +2/+2 until end of turn.| +Moaning Wall|Hour of Devastation|72|C|{2}{B}|Creature - Zombie Wall|0|5|Defender$Cycling {2}| Razaketh, the Foulblooded|Hour of Devastation|73|M|{5}{B}{B}{B}|Legendary Creature - Demon|8|8|Flying, trample$Pay 2 life, Sacrifice another creature: Search your library for a card and put that card into your hand. Then shuffle your library.| Razaketh's Rite|Hour of Devastation|74|U|{3}{B}{B}|Sorcery|||Search your library for a card and put that card into your hand. Then shuffle your library.$Cycling {B} ({B}, Discard this card: Draw a card.)| +Ruin Rat|Hour of Devastation|75|C|{1}{B}|Creature - Rat|1|1|Deathtouch$When Ruin Rat dies, exile target card from an opponent's graveyard.| +Scrounger of Souls|Hour of Devastation|76|C|{4}{B}|Creature - Horror|3|4|Lifelink| Torment of Hailfire|Hour of Devastation|77|R|{X}{B}{B}|Sorcery|||Repeat the following process X times. Each opponent loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| Torment of Scarabs|Hour of Devastation|78|U|{3}{B}|Enchantment - Aura Curse|||Enchant player$At the beginning of enchanted player's upkeep, that player loses 3 life unless he or she sacrifices a nonland permanent or discards a card.| Torment of Venom|Hour of Devastation|79|C|{2}{B}{B}|Instant|||Put three -1/-1 counters on target creature. Its controller loses 3 life unless he or she sacrifices another nonland permanent or discards a card.| +Vile Manifestation|Hour of Devastation|80|U|{1}{B}|Creature - Horror|0|4|Vile Manifestation gets +1/+0 for each card with cycling in your graveyard.$Cycling {2}| +Without Weakness|Hour of Devastation|81|C|{1}{B}|Instant|||Target creature you control gains indestructible until end of turn.$Cycling {2}| Wretched Camel|Hour of Devastation|82|C|{1}{B}|Creature - Zombie Camel|2|1|When Wretched Camel dies, if you control a Desert or there is a Desert card in your graveyard, target player discards a card.| Abrade|Hour of Devastation|83|U|{1}{R}|Instant|||Choose one —$• Abrade deals 3 damage to target creature.$• Destroy target artifact.| +Blur of Blades|Hour of Devastation|84|C|{1}{R}|Instant|||Put a -1/-1 counter on target creature. Blur of Blades deals 2 damage to that creature's controller.| +Burning-Fist Minotaur|Hour of Devastation|85|U|{1}{R}|Creature - Minotaur Wizard|2|1|First strike${1}{R}, Discard a card: Burning-Fist Minotaur gets +2/+0 until end of turn.| Chandra's Defeat|Hour of Devastation|86|U|{R}|Instant|||Chandra’s Defeat deals 5 damage to target red creature or red planeswalker. If that permanent is a Chandra planeswalker, you may discard a card. If you do, draw a card.| Chaos Maw|Hour of Devastation|87|R|{5}{R}{R}|Creature - Hellion|6|6|When Chaos Maw enters the battlefield, it deals 3 damage to each other creature. | +Crash Through|Hour of Devastation|88|C|{R}|Sorcery|||Creatures you control gain trample until end of turn.$Draw a card.| Defiant Khenra|Hour of Devastation|89|C|{1}{R}|Creature - Jackal Warrior|2|2|| Earthshaker Khenra|Hour of Devastation|90|R|{1}{R}|Creature - Jackal Warrior|2|1|Haste$When Earthshaker Khenra enters the battlefield, target creature with power less than or equal to Earthshaker Khenra's power can't block this turn.$Eternalize {4}{R}{R} ({4}{R}{R}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Jackal Warrior with no mana cost. Eternalize only as a sorcery.)| Fervent Paincaster|Hour of Devastation|91|U|{2}{R}|Creature - Human Wizard|3|1|{T}: Fervent Paincaster deals 1 damage to target player.${T}, Exert Fervent Paincaster: It deals 1 damage to target creature. (An exerted creature won't untap during its controller's next untap step.)| +Firebrand Archer|Hour of Devastation|92|C|{1}{R}|Creature - Human Archer|2|1|Whenever you cast a noncreature spell, Firebrand Archer deals 1 damage to each opponent.| Frontline Devastator|Hour of Devastation|93|C|{3}{R}|Creature - Zombie Minotaur Warrior|3|3|Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)${1}{R}: Frontline Devastator gets +1/+0 until end of turn.| Gilded Cerodon|Hour of Devastation|94|C|{4}{R}|Creature - Beast|4|4|Whenever Gilded Cerodon attacks, if you control a Desert or there is a Desert card in your graveyard, target creature can't block this turn.| +Granitic Titan|Hour of Devastation|95|C|{4}{R}{R}|Creature - Elemental|5|4|Menace$Cycling {2} ({2}, Discard this card: Draw a card.)| Hazoret's Undying Fury|Hour of Devastation|96|R|{4}{R}{R}|Sorcery|||Shuffle your library, then exile the top four cards. You may cast any number of nonland cards with converted mana cost 5 or less from among them without paying their mana costs. Land you control don't untap during your next untap step.| Hour of Devastation|Hour of Devastation|97|R|{3}{R}{R}|Sorcery|||All creatures lose indestructible until end of turn. Hour of Devastation deals 5 damage to each creature and each non-Bolas planeswalker.| Imminent Doom|Hour of Devastation|98|R|{2}{R}|Enchantment|||Imminent Doom enters the battlefield with a doom counter on it.$Whenever you cast a spell with converted mana cost equal to the number of doom counters on Imminent Doom, Imminent Doom deals that much damage to target creature or player. Then put a doom counter on Imminent Doom. | Inferno Jet|Hour of Devastation|99|U|{5}{R}|Sorcery|||Inferno Jet deals 6 damage to target opponent.$Cycling {2} ({2}, Discard this card: Draw a card.)| Khenra Scrapper|Hour of Devastation|100|C|{2}{R}|Creature - Jackal Warrior|2|3|Menace$You may exert Khenra Scrapper as it attacks. When you do, it gets +2/+0 until end of turn. (An exerted creature won't untap during your next untap step.)| +Kindled Fury|Hour of Devastation|101|C|{R}|Instant|||Target creature gets +1/+0 and gains first strile until end of turn.| +Magmaroth|Hour of Devastation|102|U|{3}{R}|Creature - Elemental|5|5|At the beginning of your upkeep, put a -1/-1 counter on Magmaroth.$Whenever you cast a noncreature spell, remove a -1/-1 counter from Magmaroth.| Manticore Eternal|Hour of Devastation|103|U|{3}{R}{R}|Creature - Zombie Manticore|5|4|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$Manticore Eternal attacks each combat if able.| Neheb, the Eternal|Hour of Devastation|104|M|{3}{R}{R}|Legendary Creature - Zombie Minotaur Warrior|4|6|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$At the beginning of your postcombat main phase, add {R} to your mana pool for each 1 life your opponents have lost this turn.| Open Fire|Hour of Devastation|105|C|{2}{R}|Instant|||Open Fire does 3 damage to target creature or player.| +Puncturing Blow|Hour of Devastation|106|C|{2}{R}{R}|Sorcery|||Puncturing Blow deals 5 damage to target creature. If that creature would die this turn, exile it instead.| Sand Strangler|Hour of Devastation|107|U|{3}{R}|Creature - Beast|3|3|When Sand Strangler enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you may have Sand Strangler deal 3 damage to target creature.| +Thorned Moloch|Hour of Devastation|108|C|{2}{R}|Creature - Lizard|2|2|Prowess >(Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$Thorned Moloch has first strike as long as it's attacking.| Wildfire Eternal|Hour of Devastation|109|R|{3}{R}|Creature - Zombie Jackal Cleric|1|4|Afflict 4 (Whenever this creature becomes blocked, defending player loses 4 life.)$Whenever Wildfire Eternal attacks and isn't blocked, you may cast an instant or sorcery card from your hand without paying its mana cost.| +Ambuscade|Hour of Devastation|110|C|{2}{G}|Instant|||Target creature you control gets +1/+0 until end of turn. It deals damage equal to its power to target creature an opponent controls.| +Beneath the Sands|Hour of Devastation|111|C|{2}{G}|Sorcery|||Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.$Cycling {2} ({2}, Discard this card: Draw a card.)| +Bitterbow Sharpshooters|Hour of Devastation|112|C|{4}{G}|Creature - Jackal Archer|4|4|Vigilance, reach| +Devotee of Strength|Hour of Devastation|113|U|{2}{G}|Creature - Naga Wizard|3|2|{4}{G}: Target creature gets +2/+2 until end of turn.| +Dune Diviner|Hour of Devastation|114|U|{2}{G}|Creature - Naga Cleric|2|3|{1}, Tap an untapped Desert you control: You gain 1 life.| +Feral Prowler|Hour of Devastation|115|C|{1}{G}|Creatuer - Cat|1|3|When Feral Prowler dies, draw a card.| +Frilled Sandwalla|Hour of Devastation|116|C|{G}|Creature - Lizard|1|1|{1}{G}: Frilled Sandwalla gets +2/+2 until end of turn. Activate this ability only once each turn.| +Gift of Strength|Hour of Devastation|117|C|{1}{G}|Instant|||Target creature gets +3/+3 and gains reach until end of turn.| +Harrier Naga|Hour of Devastation|118|C|{2}{G}|Creature - Naga Warrior|3|3|| Hope Tender|Hour of Devastation|119|U|{1}{G}|Creature - Human Druid|2|2|{1}, {T}: Untap target land.${1}, {T}, Exert Hope Tender: Untap two target lands. (An exerted creature won't untap during your next untap step.)| Hour of Promise|Hour of Devastation|120|R|{4}{G}|Sorcery|||Search your library for up to two land cards and put them onto the battlefield tapped, then shuffle your library. Then if you control three or more Deserts, create two 2/2 black Zombie creature tokens.| Life Goes On|Hour of Devastation|121|C|{G}|Instant|||You gain 4 life. If a creature died this turn, you gain 8 life instead.| Majestic Myriarch|Hour of Devastation|122|M|{4}{G}|Creature - Chimera|0|0|Majestic Myriarch's power and toughness are each equal to twice the number of creatures you control.$At the beginning of each combat, if you control a creature with flying, Majestic Myriarch gains flying until end of turn. The same is true for first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, reach, trample, and vigilance.| Nissa's Defeat|Hour of Devastation|123|U|{2}{G}|Sorcery|||Destroy target Forest, green enchantment, or green planeswalker. If that permanent was a Nissa planeswalker, draw a card.| Oasis Ritualist|Hour of Devastation|124|C|{3}{G}|Creature - Naga Druid|2|4|{t}: Add one mana of any color to your mana pool.${t}, Exert Oasis Ritualist: Add two mana of any one color to your manna pool. (An exerted creature won't untap during your next untap step.)| +Overcome|Hour of Devastation|125|U|{3}{G}{G}|Sorcery|||Creatures you control get +2/+2 and gain trample until end of turn.| Pride Sovereign|Hour of Devastation|126|R|{2}{G}|Creature - Cat|2|2|Pride Sovereign gets +1/+1 for each other Cat you control.${W}, {t}, Exert Pride Sovereign: Create two 1/1 white Cat creature tokens with lifelink. (An exerted creature won't untap during your next untap step.)| +Quarry Beetle|Hour of Devastation|127|U|{4}{G}|Creature - Insect|4|5|When Quarry Beetle enters the battlefield, you may return target land card from your graveyard to the battlefield.| +Rampaging Hippo|Hour of Devastation|128|C|{4}{G}{G}|Creature - Hippo|5|6|Trample$Cycling {2} ({2}, Discard this card: Draw a card.)| Ramunap Excavator|Hour of Devastation|129|R|{2}{G}|Creature - Naga Cleric|2|3|You may play land cards from your graveyard.| Ramunap Hydra|Hour of Devastation|130|R|{3}{G}|Creature - Snake Hydra|3|3|Vigilance, reach, trample$Ramunap Hydra gets +1/+1 as long as you control a Desert.$Ramunap Hydra gets +1/+1 as long as there is a Desert card in your graveyard.| Resilient Khenra|Hour of Devastation|131|R|{1}{G}|Creature - Jackal Wizard|2|2|When Resilient Khenra enters the battlefield, you may have target creature get +X/+X until end of turn, where X is Resilient Khenra's power.$Eternalize {4}{G}{G} ({4}{G}{G}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Jackal Wizard with no mana cost. Eternalize only as a sorcery.)| @@ -31710,10 +31761,12 @@ Rhonas's Last Stand|Hour of Devastation|132|R|{G}{G}|Sorcery|||Create a 5/4 gree Rhonas's Stalwart|Hour of Devastation|133|C|{1}{G}|Creature - Human Warrior|2|2|You may exert Rhonas's Stalwart as it attacks. When you do, it gets +1/+1 until end of turn and can't be blocked by creatures with power 2 or less this turn. (An exerted creature won't untap during your next untap step.)| Sidewinder Naga|Hour of Devastation|134|C|{2}{G}|Creature - Naga Warrior|3|2|As long as you control a Desert or there is a Desert card in your graveyard, Sidewinder Naga gets +1/+0 and has trample.| Sifter Wurm|Hour of Devastation|135|C|{5}{G}{G}|Creature - Wurm|7|7|Trample$When Sifter Wurm enters the battlefield, scry 3, then reveal the top card of your library. You gain life equal to that card's converted mana cost.| +Tenacious Hunter|Hour of Devastation|136|U|{2}{G}{G}|Creature - Crocodile|4|4|As long as a creature has a -1/-1 counter on it, Tenacious Hunter has vigilance and deathtouch.| Uncage the Menagerie|Hour of Devastation|137|M|{X}{G}{G}|Sorcery|||Search your library for up to X creature cards with different names that each have converted mana cost X, reveal them, put them into your hand, then shuffle your library.| Bloodwater Entity|Hour of Devastation|138|U|{1}{U}{R}|Creature - Elemental|2|2|Flying$Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$When Bloodwater Elemental enters the battlefield, you may put target instant or sorcery card from your graveyard on top of your library.| The Locust God|Hour of Devastation|139|M|{4}{U}{R}|Legendary Creature - God|4|4|Flying$Whenever you draw a card, create a 1/1 blue and red Insect creature token with flying and haste.${2}{U}{R}: Draw a card, then discard a card.$When The Locust God dies, return it to its owner's hand at the beginning of the next end step.| Nicol Bolas, God-Pharaoh|Hour of Devastation|140|M|{4}{U}{B}{R}|Planeswalker - Bolas|7|+2: Target opponent exiles cards from the top of his or her library until he or she exiles a non land card. Until end of turn, you may cast that card without paying its mana cost.$+1: Each opponent exiles two cards from his or her hand.$-4: Nicol Bolas, God-Pharaoh deals 7 damage to target opponent or creature an opponent controls.$-12: Exile each nonland permanent your opponents control.| +Obelisk Spider|Hour of Devastation|141|U|{1}{B}{G}|Creature - Spider|1|4|Reach$Whenever Obelisk Spider deals combat damage to a creature, put a -1/-1 counter on that creature.$Whenever you put one or more -1/-1 counters on a creature, each opponent loses 1 life and you gain 1 life.| Resolute Survivors|Hour of Devastation|142|U|{1}{R}{W}|Creature - Human Warrior|3|3|You may exert Resolute Survivors as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, Resolute Survivors deals 1 damage to each opponent and you gain 1 life.| River Hoopoe|Hour of Devastation|143|U|{G}{U}|Creature - Bird|1|3|Flying${3}{G}{U}: You gain 2 life and draw a card.| Samut, the Tested|Hour of Devastation|144|M|{2}{R}{G}|Planeswalker - Samut|4|+1: Up to one target creature gains double strike until end of turn.$-2: Samut, the Tested deals 2 damage divided as you choose among one or two target creatures and/or players.$-7: Search your library for up to two creature and/or planeswalker cards, put them onto the battlefield, then shuffle your library.| @@ -31731,17 +31784,23 @@ Grind // Dust|Hour of Devastation|155|R|{1}{B}|Sorcery|||Put a -1/-1 counter on Refuse // Cooperate|Hour of Devastation|156|R|{3}{R}|Instant|||Refuse deals damage to target spell's controller equal to that spell's converted mana cost.$Cooperate {2}{U}$Instant$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Copy target instant or sorcery spell. You may choose new targets for the copy.| Driven // Despair|Hour of Devastation|157|R|{1}{G}|Sorcery|||Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."$Despair {1}{B}$Sorcery$Aftermath$Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."| Abandoned Sarcophagus|Hour of Devastation|158|R|{3}|Artifact|||You may cast nonland cards with cycling from your graveyard.$If a card with cycling would be put into your graveyard from anywhere and it wasn't cycled, exile it instead.| -Crook of Condemnation|Hour of Devastation|159|U|{2}|Artifact|||{1}, {t}: Exile target card from a graveyard.${1}, Exile Crook of Condemnation: Exile all cards from all graveyards.| +Crook of Comdemnation|Hour of Devastation|159|U|{2}|Artifact|||{1}, {t}: Exile target card from a graveyard.${1}, Exile Crook of Condemnation: Exile all cards from all graveyards.| +Dagger of the Worthy|Hour of Devastation|160|U|{2}|Artifact - Equipment|||Equipped creature gets +2/+0 and has afflict 1. (Whenever it becomes blocked, defending player loses 1 life.)$Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.)| God-Pharaoh's Gift|Hour of Devastation|161|R|{7}|Artifact|||At the beginning of combat on your turn, you may exile a creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn.| +Graven Abomination|Hour of Devastation|162|C|{3}|Artifact Creature - Horror|3|1|Whenever Graven Abomination attacks, exile target card from defending player's graveyard.| Hollow One|Hour of Devastation|163|R|{5}|Artifact Creature - Golem|4|4|Hollow One costs {2} less to cast for each card you've cycled or discarded this turn.$Cycling {2} ({2}, Discard this card: Draw a card.)| +Manalith|Hour of Devastation|164|C|{3}|Artifact|||{T}: Add one mana of any color to your mana pool.| Mirage Mirror|Hour of Devastation|165|R|{3}|Artifact|||{2}: Mirage Mirror becomes a copy of target artifact, creature, enchantment, or land until end of turn.| Sunset Pyramid|Hour of Devastation|166|U|{2}|Artifact|||Sunset Pyramid enters the battlefield with three brick counters on it.${2}, {T}, Remove a brick counter from Sunset Pyramid: Draw a card.${2}, {T}: Scry 1.| -Crumbling Necropolis|Hour of Devastation|169|U||Land|||Crumbling Necropolis enters the battlefield tapped.${T}: Add {U}, {B}, or {R} to your mana pool.| +Traveler's Amulet|Hour of Devastation|167|C|{1}|Artifact|||{1}, Sacrifice Traveler's Amulet: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library.| +Wall of Forgotten Pharaohs|Hour of Devastation|168|C|{2}|Artifact Creature - Wall|0|4|Defender${T}: Wall of Forgotten Pharaohs deals 1 damage to target player. Activate this ability only if you control a Desert of there is a Desert card in your graveyard.| +Crypt of the Eternals|Hour of Devastation|169|U||Land|||When Crypt of the Eternals enters the battlefield, you gain 1 life.${T}: Add {C} to your mana pool.${1}, {T}: Add {U}, {B}, or {R} to your mana pool.| Desert of the Fervent|Hour of Devastation|170|C||Land - Desert|||Desert of the Fervent enters the battlefield tapped.${T}: Add {R} to your mana pool.$Cycling {1}{R} ({1}{R}, Discard this card: Draw a card.)| Desert of the Glorified|Hour of Devastation|171|C||Land - Desert|||Desert of the Glorified enters the battlefield tapped.${T}: Add {B} to your mana pool.$Cycling {1}{B} ({1}{B}, Discard this card: Draw a card.)| Desert of the Indomitable|Hour of Devastation|172|C||Land - Desert|||Desert of the Indomitable enters the battlefield tapped.${t}: Add {G} to your mana pool.$Cycling {1}{G} ({1}{G}, Discard this card: Draw a card.)| Desert of the Mindful|Hour of Devastation|173|C||Land - Desert|||Desert of the Mindful enters the battlefield tapped.${T}: Add {U} to your mana pool.$Cycling {1}{U} ({1}{U}, Discard this card: Draw a card.)| Desert of the True|Hour of Devastation|174|C||Land - Desert|||Desert of the True enters the battlefield tapped.${T}: Add {W} to your mana pool.$Cycling {1}{W} ({1}{W}, Discard this card: Draw a card.)| +Dunes of the Dead|Hour of Devastation|175|U||Land - Desert|||{T}: Add {C} to your mana pool.$When Dunes of the Dead is put into a graveyard from the battlefield, create a 2/2 black Zombie creature token.| Endless Sands|Hour of Devastation|176|R||Land - Desert|||{t}: Add {C} to your mana pool.${2}, {t}: Exile target creature you control.${4}, {t}, Sacrifice Endless Sands: Return each creature exiled with Endless Sands to the battlefield under its owner's control.| Hashep Oasis|Hour of Devastation|177|U||Land - Desert|||{t}: Add {C} to your mana pool.${t}, Pay 1 life: Add {G} to your mana pool.${1}{G}{G}, {t}, Sacrifice a Desert: Target creature gets +3/+3 until end of turn. Activate this ability only any time you could cast a sorcery.| Hostile Desert|Hour of Devastation|178|R||Land - Desert|||{T}: Add {C} to your mana pool.${2}, Exile a land card from your graveyard: Hostile Desert becomes a 3/4 Elemental creature until end of turn. It's still a land.| @@ -31756,6 +31815,16 @@ Island|Hour of Devastation|186|L||Basic Land - Island|||| Swamp|Hour of Devastation|187|L||Basic Land - Swamp|||| Mountain|Hour of Devastation|188|L||Basic Land - Mountain|||| Forest|Hour of Devastation|189|L||Basic Land - Forest|||| +Plains|Hour of Devastation|190|L||Basic Land - Plains|||| +Plains|Hour of Devastation|191|L||Basic Land - Plains|||| +Island|Hour of Devastation|192|L||Basic Land - Island|||| +Island|Hour of Devastation|193|L||Basic Land - Island|||| +Swamp|Hour of Devastation|194|L||Basic Land - Swamp|||| +Swamp|Hour of Devastation|195|L||Basic Land - Swamp|||| +Mountain|Hour of Devastation|196|L||Basic Land - Mountain|||| +Mountain|Hour of Devastation|197|L||Basic Land - Mountain|||| +Forest|Hour of Devastation|198|L||Basic Land - Forest|||| +Forest|Hour of Devastation|199|L||Basic Land - Forest|||| Nissa, Genesis Mage|Hour of Devastation|200|M|{5}{G}{G}|Planeswalker - Nissa|5|+2: Untap up to two target creatures and up to two target lands.$-3: Target creature gets +5/+5 until end of turn.$-10: Look at the top ten cards of your library. You may put any number of creature and/or land cards from among them onto the battlefield. Put the rest on the bottom of your library in a random order.| Avid Reclaimer|Hour of Devastation|201|U|{2}{G}|Creature - Human Druid|2|2|{T}: Add {G} or {U} to your mana pool. If you control a Nissa planeswalker, you gain 2 life.| Brambleweft Behemoth|Hour of Devastation|202|C|{4}{G}{G}|Creature - Elemental|6|6|Trample. (This creature can deal excess combat damage to defending player or planeswalker while attacking.)| @@ -31813,68 +31882,3 @@ Sunpetal Grove|Ixalan|???|R||Land|||Sunpetal Grove enters the battlefield tapped Act of Heroism|Hour of Devastation|1|C|{1}{W}|Instant|||Untap target creature. It gets +2/+2 until end of turn and can block an additional creature this turn.| Aerial Guide|Hour of Devastation|29|C|{2}{U}|Creature - Drake|2|2|Flying.$Whenever Aerial Guide attacks, another target attacking creature gains flying until end of turn.| Ambuscade|Hour of Devastation|110|C|{2}{G}|Instant|||Target creature you contol gets +1/+0 until end of turn. It deals damage equal to its power to target creature an opponent controls.| -Apocalypse Demon|Hour of Devastation|58|R|{4}{B}{B}|Creature - Demon|*|*|Flying.$Apocalypse Demon's power and toughness are each equal to the number of cards in your graveyard.$At the beginning of your upkeep, tap Apocalypse Demon unless you sacrifice another creature.| -Aven Reedstalker|Hour of Devastation|30|C|{4}{U}|Creature - Bird Warrior|2|3|Flash$Flying| -Aven of Enduring Hope|Hour of Devastation|5|C|{4}{W}|Creature - Bird Cleric|3|3|Flying.$When Aven of Enduring Hope enters the battlefield, you gain 3 life.| -Banewhip Punisher|Hour of Devastation|59|U|{2}{U}|Creature - Human Warrior|2|3|When Banewhip Punisher enters the battlefield, you may put a -1/-1 counter on target creature${B}, Sacrifice Banewhip Punisher: Destroy target creature that has a -1/-1 counter on it| -Beneath the Sands|Hour of Devastation|111|C|{2}{G}|Sorcery|||Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.$ Cycling {2}| -Bitterbow Sharpshooters|Hour of Devastation|112|C|{4}{G}|Creature - Jackal Archer|4|4|Vigilance, Reach| -Blur of Blades|Hour of Devastation|84|C|{1}{R}|Instant|||Put a -1/-1 counter on target creature. Blur of Blades deals 2 damage to that creature's controller| -Burning-Fist Minotaur|Hour of Devastation|85|U|{1}{U}|Creature - Minotaur Wizard|2|1|First Strike${1}{R}, Discard a card: Burning-Fist Minotaur gets +2/+0 until end of turn.| -Countervailing Winds|Hour of Devastation|32|C|{2}{U}|Instant|||Counter target spell unless its controller pays {1} for each card in your graveyard.$Cycling {2}| -Crash Through|Hour of Devastation|88|C|{R}|Sorcery|||Creatures you control gain trample until end of turn$Draw a card| -Crypt of the Eternals|Hour of Devastation|169|U|{4}{U}|Land|||When Crypt of the Eternals enters the battlefield, you gain 1 life.${T}: Add {C} to your mana pool.${1}, {T}: Add {U}, {B} or {R} to your mana pool.| -Cunning Survivor|Hour of Devastation|33|C|{1}{U}|Creature - Human Warrior|2|3|Whenever you cycle or discard a card, Cunning Survivor gets +1/+0 until end of turn and can't be blocked this turn.| -Dagger of the Worthy|Hour of Devastation|160|U|{2}|Artifact - Equipment|||Equipped creature gets +2/+0 and has afflict 1.$Equip {2}| -Dauntless Aven|Hour of Devastation|7|C|{2}{W}|Creature - Bird Warrior|2|1|Flying$Whenever Dauntless Aven attacks, untap target creature you control.| -Devotee of Strength|Hour of Devastation|113|U|{2}{G}|Creature - Naga Wizard|3|2|{4}{G}: Target creature gets +2/+2 until end of turn.| -Disposal Mummy|Hour of Devastation|9|C|{2}{W}|Creature - Zombie Jackal|2|3|When Disposal Mummy enters the battlefield, exile target card from an opponent's graveyard.| -Djeru's Renunciation|Hour of Devastation|11|C|{1}{W}|Instant|||Tap up to two target creatures.$Cycling {W}| -Dune Diviner|Hour of Devastation|114|C|{2}{G}|Creature - Naga Cleric|2|3|{1}, Tap an untapped Desert you control: You gain 1 life.| -Dunes of the Dead|Hour of Devastation|175|U||Land - Desert|2|3|{T}: Add {C} to your mana pool.$When Dunes of the Dead is put into a graveyard from the battlefield, create a 2/2 black Zombie creature token.| -Feral Prowler|Hour of Devastation|115|C|{1}{G}|Creature - Cat|1|3|When Feral Prowler dies, draw a card| -Firebrand Archer|Hour of Devastation|92|C|{1}{R}|Creature - Human Archer|2|1|Whenever you cast a noncreature spell, Firebrand Archer deals 1 damage to each opponent.| -Frilled Sandwalla|Hour of Devastation|116|C|{G}|Creature - Lizard|1|1|{1}{G}: Frilled Sandwalla gets +2/+2 until end of turn. Activate this ability only once each turn.| -Gift of Strength|Hour of Devastation|117|C|{1}{G}|Instant|||Target creature gets +3/+3 until and gains reach until end of turn.| -Granitic Titan|Hour of Devastation|95|C|{4}{R}{R}|Creature - Elemental|5|4|Menace$Cycling {2}| -Graven Abomination|Hour of Devastation|162|C|{3}|Artifact Creature - Horror|3|1|Whenever Graven Abomination attacks, exile target card from defending player's graveyard.| -Grisly Survivor|Hour of Devastation|64|C|{2}{B}|Creature - Minotaur Warrior|2|3|Whenever you cycle or discard a card, Grisly Survivor gets +2/+0 until end of turn.| -Harrier Naga|Hour of Devastation|118|C|{2}{G}|Creature - Naga Warrior|3|3|| -Hostile Desert|Hour of Devastation|178|R|||2|3|{T}: Add {C} to your mana pool.${2}, Exile a land card from your graveyard: Hostile Desert becomes a 3/4 Elemental creature until end of turn. It's still a land.| -Imaginary Threats|Hour of Devastation|37|U|{2}{U}{U}|Instant|||Creatures target opponent controls attack this turn if able. During that player's next untap step, creatures he or she controls don't untap$Cycling {2}| -Kindled Fury|Hour of Devastation|101|C|{R}|Instant|||Target creature gets +2/+1 and gains first strike until end of turn| -Lethal Sting|Hour of Devastation|67|C|{2}{B}|Sorcery|||As an additional cost to cast Lethal Sting, put a -1/-1 counter on a creature you control.$Destroy target creature| -Lurching Rotbeast|Hour of Devastation|69|C|{3}{B}|Creature - Zombie Beast|4|2|Cycling {B}| -Magmaroth|Hour of Devastation|102|U|{3}{R}|Creature - Elemental|5|5|At the beginning of your upkeep, put a -1/-1 counter on Magmaroth.$Whenever you cast a noncreature spell, remove a -1/-1 counter from Magmaroth.| -Manalith|Hour of Devastation|164|C|{3}|Artifact|||{T}: Add one mana of any color to your mana pool.| -Moaning Wall|Hour of Devastation|72|C|{2}{B}|Creature - Zombie Wall|0|5|Defender$Cycling {2}| -Obelisk Spider|Hour of Devastation|141|U|{1}{B}{G}|Creature - Spider|1|4|Reach$Whenever Obelisk Spider deals combat damage to a creature, put a -1/-1 counter on that creature.$Whenever you put one or more -1/-1 counters on a creature, each opponent loses 1 life and you gain 1 life| -Oketra's Avenger|Hour of Devastation|17|C|{1}{U}|Creature - Human Warrior|3|1|You may exert Oketra's Avenger as it attacks. When you do, prevent all combat damage that would be dealt to it this turn.| -Overcome|Hour of Devastation|125|U|{3}{G}{G}|Sorcery|||Creatures you control get +2/+2 and gain trample until end of turn.| -Puncturing Blow|Hour of Devastation|106|C|{2}{R}{R}|Sorcery|||Puncturing Blow deals 5 damage to target creature. If that creature would die this turn, exile it instead.| -Quarry Beetle|Hour of Devastation|127|U|{4}{G}|Creature - Insect|4|5|When Quarry Beetle enters the battlefield, you may return target land card from your graveyard to the battlefield.| -Rampaging Hippo|Hour of Devastation|128|C|4}{G}{G}|Creature - Hippo|5|6|Trample$Cycling {2}| -Ramunap Excavator|Hour of Devastation|129|R|{2}{G}|Creature - Naga Warrior|2|3|You may play land cards from your graveyard.| -Resolute Survivors|Hour of Devastation|142|U|{1}{R}{W}|Creature - Human Warrior|3|3|You may exert Resolute Survivors as it attacks.$Whenever you exert a creature, Resolute Survivors deals 1 damage to each opponent and you gain 1 life.| -Riddleform|Hour of Devastation|43|U|{1}{U}|Enchantment|||Whenever you cast a noncreature spell, you may have Riddleform become a 3/3 sphinx creature with flying in addition to its other types until end of turn${2}{U}: Scry 1.| -River Hoopoe|Hour of Devastation|143|U|{G}{U}|Creature - Bird|1|3|Flying${3}{G}{U}: You gain 2 life and draw a card| -Ruin Rat|Hour of Devastation|75|C|{1}{B}|Creature - Rat|2|3|Deathtouch$When Ruin Rat dies, exile target card from an opponent's graveyard.| -Sandblast|Hour of Devastation|20|C|{1}{W}|Insant|||Sandblast deals 5 damaage to target attacking or blocking creature.| -Saving Grace|Hour of Devastation|21|U|{1}{W}|Enchantment - Aura|||Flash$Enchant creature you control$When Saving Grace enters the battlefield, all damage that would be dealth this turn to you and permanents you control is dealt to enchanted creature instead.$Enchanted creature gets +0/+3.| -Scrounger of Souls|Hour of Devastation|76|C|{4}{B}|Creature - Horror|3|4|Lifelink| -Sifter Wurm|Hour of Devastation|135|U|{5}{G}{G}|Creature - Wurm|7|7|Trample$When Sifter Wurm enters the battlefield, scry 3, then reveal the top card of your library. You gain life equal to that card's converted mana cost.| -Solitary Camel|Hour of Devastation|23|C|{2}{W}|Creature - Camel|3|2|Solitary Camel has lifelink as long as you control a desert or there is a desert card in your graveyard.| -Spellweaver Eternal|Hour of Devastation|46|C|{1}{U}|Creature - Zombie Naga Wizard|2|1|Prowess$Afflict 2| -Striped Riverwinder|Hour of Devastation|48|C|{6}{U}|Creature - Serpent|5|5|Hexproof$Cycling {U}| -Tenacious Hunter|Hour of Devastation|136|U|{2}{G}{G}|Creature - Crocodile|4|4|As long as a creature has a -1/-1 counter on it, Tenacious Hunter has vigilance and deathtouch.| -Thorned Moloch|Hour of Devastation|108|C|{2}{R}|Creature - Lizard|2|2|Prowess$Thorned Moloch has first strike as long as it's attacking| -Travelers Amulet|Hour of Devastation|167|C|{1}|Artifact|||{1}, Sacrifice Travelers Amulet: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library| -Uncage the Menagerie|Hour of Devastation|137|M|{X}{G}{G}|Sorcery|||Search your library for up to X creature cards with different names that each have converted mana cost X, reveal them, put them into your hand, then shuffle your library| -Unconventional Tactics|Hour of Devastation|27|U|{2}{W}|Sorcery|||Target creature gets +3/+3 and gains flying until end of turn.$Whenever a zombie enters the battlefield under your control, you may pay {W}. If you do, return Unconventional Tactics from your graveyard to your hand.| -Unquenchable Thirst|Hour of Devastation|53|C|{1}{U}|Enchantment - Aura|||Enchant player$When Unquenchable Thirst enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step| -Unsummon|Hour of Devastation|54|C|{U}|Instant|||Return target creature to its owner's hand.| -Vile Manifestation|Hour of Devastation|80|U|{1}{B}|Creature - Horror|0|4|Vile Manifestation gets +1/+0 for each card with cycling in your graveyard.$Cycling {2}| -Vizier of the Anointed|Hour of Devastation|55|U|{3}{U}|Creature - Human Cleric|2|4|When Vizier of the Anointed enters the battlefield, you may search your library for a creature card with eternalize or embalm, put that card into your graveyard, then shuffle your library.$Whenever you activate an eternalize or embalm ability, draw a card.| -Wall of Forgotten Pharaohs|Hour of Devastation|162|C|{2}|Artifact Creature - Wall|0|4|Defender${T}: Wall of Forgotten Pharaohs deals 1 damage to target player. Activate this ability only if you control a Desert or there is a Desert card in your graveyard.| -Without Weakness|Hour of Devastation|81|C|{1}{B}|Instant|||Target creature you control gains indestructible until end of turn.$Cycling {2}| -Wretched Camel|Hour of Devastation|82|C|{1}{B}|Creature - Camel|2|1|When Wretched Camel dies, if you control a Desert or there is a Desert card in your graveyard, target player discards a card.| From 6d6f477975f9ebe73f810a2b9e8ced626d1a8823 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 1 Jul 2017 22:14:14 +1000 Subject: [PATCH 070/160] Some fixes to HOU spoiler --- Utils/mtg-cards-data.txt | 41 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index ff3036c605..09bc4c7f0c 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -28364,7 +28364,7 @@ Reckless Bushwhacker|Oath of the Gatewatch|116|U|{2}{R}|Creature - Goblin Warrio Sparkmage's Gambit|Oath of the Gatewatch|117|C|{1}{R}|Sorcery|||Sparkmage's Gambit deals 1 damage to each of up to two target creatures. Those creatures can't block this turn.| Tears of Valakut|Oath of the Gatewatch|118|U|{1}{R}|Instant|||Tears of Valakut can't be countered by spells or abilities.$Tears of Valakut deals 5 damage to target creature with flying.| Tyrant of Valakut|Oath of the Gatewatch|119|R|{5}{R}{R}|Creature - Dragon|5|4|Surge {3}{R}{R} (You may cast this spell for its surge cost if you or a teammate has cast another spell this turn.)$Flying$When Tyrant of Valakut enters the battlefield, if its surge cost was paid, it deals 3 damage to target creature or player.| -Zada's Commando|Oath of the Gatewatch|120|C|{1}{R}|Creature - Goblin Archer Ally|2|1|First Strike$Cohort — {T}, Tap an untapped Ally you control: Zada's Commando deals 1 damage to target opponent.| +Zada's Commando|Oath of the Gatewatch|120|C|{1}{R}|Creature - Goblin Archer Ally|2|1|First strike$Cohort — {T}, Tap an untapped Ally you control: Zada's Commando deals 1 damage to target opponent.| Birthing Hulk|Oath of the Gatewatch|121|U|{6}{G}|Creature - Eldrazi Drone|5|4|Devoid (This card has no color.)When Birthing Hulk enters the battlefield, put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {C} to your mana pool."${1}{C}: Regenerate Birthing Hulk.| Ruin in Their Wake|Oath of the Gatewatch|122|U|{1}{G}|Sorcery|||Devoid (This card has no color.)$Search your library for a basic land card and reveal it. You may put that card onto the battlefield tapped if you control a land named Wastes. Otherwise, put that card into your hand. Then shuffle your library.| Scion Summoner|Oath of the Gatewatch|123|C|{2}{G}|Creature - Eldrazi Drone|2|2|Devoid (This card has no color.)$When Scion Summoner enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {C} to your mana pool."| @@ -31634,7 +31634,7 @@ Aven of Enduring Hope|Hour of Devastation|5|C|{4}{W}|Creature - Bird Cleric|3|3| Crested Sunmare|Hour of Devastation|6|M|{3}{W}{W}|Creature - Horse|5|5|Other Horses you control have indestructible.$At the beginning of each end step, if you gained life this turn, create a 5/5 white Horse creature token.| Dauntless Aven|Hour of Devastation|7|C|{2}{W}|Creature - Bird Warrior|2|1|Flying$Whenever Dauntless Aven attacks, untap target creature you control.| Desert's Hold|Hour of Devastation|8|U|{2}{W}|Enchantment - Aura|||Enchant creature$When Desert's Hold enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you gain 3 life.$Enchanted creature can't attack or block, and its activated abilities can't be activated.| -Disposal Mummy|Hour of Devastation|9|C|{2}{W}|Creature - Zombie Jackal|2|3|When Disposal Mummy enters the battlefield, exile target card in a graveyard.| +Disposal Mummy|Hour of Devastation|9|C|{2}{W}|Creature - Zombie Jackal|2|3|When Disposal Mummy enters the battlefield, exile target card from an opponent's graveyard.| Djeru, With Eyes Open|Hour of Devastation|10|R|{3}{W}{W}|Legendary Creature - Human Warrior|4|3|Vigilance$When Djeru, With Eyes Open enters the battlefield, you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library.$If a source would deal damage to a planeswalker you control, prevent 1 of that damage.| Djeru's Renunciation|Hour of Devastation|11|C|{1}{W}|Instant|||Tap up to two target creatures.$Cycling {W} ({W}, Discard this card: Draw a card.)| Dutiful Servants|Hour of Devastation|12|C|{3}{W}|Creature - Zombie|2|5|| @@ -31645,16 +31645,16 @@ Mummy Paramount|Hour of Devastation|16|C|{1}{W}|Creature - Zombie|2|2|Whenever a Oketra's Avenger|Hour of Devastation|17|C|{1}{W}|Creature - Human Warrior|3|1|You may exert Oketra's Avenger as it attacks. When you do, prevent all combat damage that would be dealt to it this turn. (An exerted creature doesn't untap during its controller's next untap step.)| Oketra's Last Mercy|Hour of Devastation|18|R|{1}{W}{W}|Sorcery|||Your life total becomes your starting life total. Lands you control don't untap during your next untap phase| Overwhelming Splendor|Hour of Devastation|19|M|{6}{W}{W}|Enchantment - Aura Curse|||Enchant player$Creatures enchanted player controls lose all abilities and have base power and toughness 1/1.$Enchanted player can't activate abilities that aren't mana abilities or loyalty abilities.| -Sandblast|Hour of Devastation|20|C|{2}{W}|Instant|||Sandblast deals 5 damage to target attacking or blocking creature.| -Saving Grace|Hour of Devastation|21|U|{1}{W}|Enchantment - Aura|||Flash$Enchant creature you control.$When Saving Grace enters the battlefield, all damage that would be dealt this turn to you and permanents you control is dealt to enchanted creature instead.$Enchanted creature gets +0/+3| +Sandblast|Hour of Devastation|20|C|{1}{W}|Instant|||Sandblast deals 5 damage to target attacking or blocking creature.| +Saving Grace|Hour of Devastation|21|U|{1}{W}|Enchantment - Aura|||Flash$Enchant creature you control$When Saving Grace enters the battlefield, all damage that would be dealt this turn to you and permanents you control is dealt to enchanted creature instead.$Enchanted creature gets +0/+3.| Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counters.$Counters can't be put on artifacts, creatures, enchantments, or lands.| Solitary Camel|Hour of Devastation|23|C|{2}{W}|Creature - Camel|3|2|Solitary Camel has lifelink as long as you control a desert or there is a desert card in your graveyard. (Damage this creature deals also causes you to gain that much life.)| Steadfast Sentinel|Hour of Devastation|24|C|{3}{W}|Creature - Human Cleric|2|3|Vigilance$Eternalize {4}{W}{W} ({4}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Cleric with no mana cost. Eternalize only as a sorcery.)| Steward of Solidarity|Hour of Devastation|25|U|{1}{W}|Creature - Human Warrior|2|2|{T}, Exert Steward of Solidarity: Create a 1/1 white Warrior creature token with vigilance. (An exerted creature won't untap during your next untap step.)| -Sunscourge Champion|Hour of Devastation|26|U|{2}{W}|Creature - Human Wizard|2|3|When Sunscourge Champion enters the battlefield, you gain life equal to its power.$Eternalize—{2}{W}{W}, Discard a card. ({2}{W}{W}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| +Sunscourge Champion|Hour of Devastation|26|U|{2}{W}|Creature - Human Wizard|2|3|When Sunscourge Champion enters the battlefield, you gain life equal to its power.$Eternalize—{2}{W}{W}, Discard a card. ({2}{W}{W}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| Unconventional Tactics|Hour of Devastation|27|U|{2}{W}|Sorcery|||Target creature gets +3/+3 and gains flying until end of turn.$Whenever a Zombie enters the battlefield under your control, you may pay {W}. If you do, return Unconventional Tactics from your graveyard to your hand.| Vizier of the True|Hour of Devastation|28|U|{3}{W}|Creature - Human Cleric|3|2|You may exert Vizier of the True as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, tap target creature an opponent controls.| -Aerial Guide|Hour of Devastation|29|C|{2}{U}|Creature - Drake|2|2|Flying$Whenever Aerial Guide attacks, another target creature gains flying until end of turn.| +Aerial Guide|Hour of Devastation|29|C|{2}{U}|Creature - Drake|2|2|Flying$Whenever Aerial Guide attacks, another target attacking creature gains flying until end of turn.| Aven Reedstalker|Hour of Devastation|30|C|{3}{U}|Creature - Bird Warrior|2|3|Flash$Flying| Champion of Wits|Hour of Devastation|31|R|{2}{U}|Creature - Naga Wizard|2|1|When Champion of Wits enters the battlefield, you may draw cards equal to its power. If you do, discard two cards.$Eternalize {5}{U}{U} ({5}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Naga Wizard with no mana cost. Eternalize only as a sorcery.)| Countervailing Winds|Hour of Devastation|32|C|{2}{U}|Instant|||Counter target spell unless its controller pays {1} for each card in your graveyard.$Cycling {2} ({2}, Discard this card: Draw a card.)| @@ -31670,29 +31670,29 @@ Ominous Sphinx|Hour of Devastation|41|U|{3}{U}{U}|Creature - Sphinx|4|4|Flying$W Proven Combatant|Hour of Devastation|42|C|{U}|Creature - Human Warrior|1|1|Eternalize {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Warrior with no mana cost. Eternalize only as a sorcery.) | Riddleform|Hour of Devastation|43|U|{1}{U}|Enchantment|||Whenever you cast a noncreature spell, you may have Riddleform become a 3/3 Sphinx creature with flying in addition to its other types until end of turn.${2}{U}: Scry 1.| Seer of the Last Tomorrow|Hour of Devastation|44|C|{2}{U}|Creature - Naga Cleric|1|4|{U}, {T}, Discard a card: Target player puts the top three cards of his or her library into his or her graveyard.| -Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize—{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| +Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize—{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| Spellweaver Eternal|Hour of Devastation|46|C|{1}{U}|Creature - Zombie Naga Wizard|2|1|Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)| Strategic Planning|Hour of Devastation|47|C|{1}{U}|Sorcery|||Look at the top three cards of your library. Put one of them into your hand and the rest in the graveyard.| Striped Riverwinder|Hour of Devastation|48|C|{6}{U}|Creature - Serpent|5|5|Hexproof (This creature can't be the target of spells or abilities your opponents control.)$Cycling {U} ({U}, Discard this card: Draw a card.)| -Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counter target spell unless its controller pays {3}.$• Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| +Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counter target spell unless its controller pays {3}.$• Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| Tragic Lesson|Hour of Devastation|51|C|{2}{U}|Instant|||Draw two cards. Then discard a card unless you return a land you control to its owner's hand.| Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| Unquenchable Thirst|Hour of Devastation|53|C|{1}{U}|Enchantment - Aura|||Enchant creature$When Unquenchable Thirst enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step.| Unsummon|Hour of Devastation|54|C|{U}|Instant|||Return target creature to its owner's hand.| -Vizier of the Anointed|Hour of Devastation|55|U|{3}{U}|Creature - Human Cleric|2|4|When Vizier of the Anointed enters the battlefield, search your library for a creature card with eternalize or embalm, put it in your graveyard, then shuffle your library.$Whenever you activate an eternalize or embalm ability, draw a card.| +Vizier of the Anointed|Hour of Devastation|55|U|{3}{U}|Creature - Human Cleric|2|4|When Vizier of the Anointed enters the battlefield, you may search your library for a creature card with eternalize or embalm, put that card into your graveyard, then shuffle your library.$Whenever you activate an eternalize or embalm ability, draw a card.| Accursed Horde|Hour of Devastation|56|U|{3}{B}|Creature - Zombie|3|3|{1}{B}: Target attacking Zombie gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.)| Ammit Eternal|Hour of Devastation|57|R|{2}{B}|Creature - Zombie Crocodile Demon|5|5|Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.)$Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal.$Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it.| Apocalypse Demon|Hour of Devastation|58|R|{4}{B}{B}|Creature - Demon|0|0|Flying$Apocalypse Demon's power and toughness are each equal to the number of cards in your graveyard.$At the beginning of your upkeep, tap Apocalypse Demon unless you sacrifice another creature.| Banewhip Punisher|Hour of Devastation|59|U|{2}{B}|Creature - Human Warrior|2|2|When Banewhip Punisher enters the battlefield, you may put a -1/-1 counter on target creature.${B}, Sacrifice Banewhip Punisher: Destroy target creature that has a -1/-1 counter on it.| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| -Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| +Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| Dreamstealer|Hour of Devastation|63|R|{2}{B}|Creature - Human Wizard|1|2|Menace$When Dreamstealer deals combat damage to a player, that player discards that many cards.$Eternalize {4}{B}{B} ({4}{B}{B}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| Grisly Survivor|Hour of Devastation|64|C|{2}{B}|Creature - Minotaur Warrior|2|3|Whenever you cycle or discard a card, Grisly Survivor gets +2/+0 until end of turn.| Hour of Glory|Hour of Devastation|65|R|{3}{B}|Instant|||Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature.| Khenra Eternal|Hour of Devastation|66|C|{1}{B}|Creature - Zombie Jackal Warrior|2|2|Afflict 1 (Whenever this creature becomes blocked, defending player loses 1 life.)| -Lethal Sting|Hour of Devastation|67|C|{2}{B}|Sorcery|||As an additional cost to cast Lethal Sting,put a -1/-1 counter on a creature you control.$Destroy target creature.| +Lethal Sting|Hour of Devastation|67|C|{2}{B}|Sorcery|||As an additional cost to cast Lethal Sting, put a -1/-1 counter on a creature you control.$Destroy target creature.| Liliana's Defeat|Hour of Devastation|68|U|{B}|Sorcery|||Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life.| Lurching Rotbeast|Hour of Devastation|69|C|{3}{B}|Creature - Zombie Beast|4|2|Cycling {B} ({B}, Discard this card: Draw a card.)| Maurauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| @@ -31708,10 +31708,10 @@ Torment of Venom|Hour of Devastation|79|C|{2}{B}{B}|Instant|||Put three -1/-1 co Vile Manifestation|Hour of Devastation|80|U|{1}{B}|Creature - Horror|0|4|Vile Manifestation gets +1/+0 for each card with cycling in your graveyard.$Cycling {2}| Without Weakness|Hour of Devastation|81|C|{1}{B}|Instant|||Target creature you control gains indestructible until end of turn.$Cycling {2}| Wretched Camel|Hour of Devastation|82|C|{1}{B}|Creature - Zombie Camel|2|1|When Wretched Camel dies, if you control a Desert or there is a Desert card in your graveyard, target player discards a card.| -Abrade|Hour of Devastation|83|U|{1}{R}|Instant|||Choose one —$• Abrade deals 3 damage to target creature.$• Destroy target artifact.| -Blur of Blades|Hour of Devastation|84|C|{1}{R}|Instant|||Put a -1/-1 counter on target creature. Blur of Blades deals 2 damage to that creature's controller.| +Abrade|Hour of Devastation|83|U|{1}{R}|Instant|||Choose one * Abrade deals 3 damage to target creature.$* Destroy target artifact.| +Blur of Blades|Hour of Devastation|84|C|{1}{R}|Instant|||Put a -1/-1 counter on target creature. Blur of Blades deals 2 damage to that creature's controller.| Burning-Fist Minotaur|Hour of Devastation|85|U|{1}{R}|Creature - Minotaur Wizard|2|1|First strike${1}{R}, Discard a card: Burning-Fist Minotaur gets +2/+0 until end of turn.| -Chandra's Defeat|Hour of Devastation|86|U|{R}|Instant|||Chandra’s Defeat deals 5 damage to target red creature or red planeswalker. If that permanent is a Chandra planeswalker, you may discard a card. If you do, draw a card.| +Chandra's Defeat|Hour of Devastation|86|U|{R}|Instant|||Chandra's Defeat deals 5 damage to target red creature or red planeswalker. If that permanent is a Chandra planeswalker, you may discard a card. If you do, draw a card.| Chaos Maw|Hour of Devastation|87|R|{5}{R}{R}|Creature - Hellion|6|6|When Chaos Maw enters the battlefield, it deals 3 damage to each other creature. | Crash Through|Hour of Devastation|88|C|{R}|Sorcery|||Creatures you control gain trample until end of turn.$Draw a card.| Defiant Khenra|Hour of Devastation|89|C|{1}{R}|Creature - Jackal Warrior|2|2|| @@ -31740,7 +31740,7 @@ Beneath the Sands|Hour of Devastation|111|C|{2}{G}|Sorcery|||Search your library Bitterbow Sharpshooters|Hour of Devastation|112|C|{4}{G}|Creature - Jackal Archer|4|4|Vigilance, reach| Devotee of Strength|Hour of Devastation|113|U|{2}{G}|Creature - Naga Wizard|3|2|{4}{G}: Target creature gets +2/+2 until end of turn.| Dune Diviner|Hour of Devastation|114|U|{2}{G}|Creature - Naga Cleric|2|3|{1}, Tap an untapped Desert you control: You gain 1 life.| -Feral Prowler|Hour of Devastation|115|C|{1}{G}|Creatuer - Cat|1|3|When Feral Prowler dies, draw a card.| +Feral Prowler|Hour of Devastation|115|C|{1}{G}|Creature - Cat|1|3|When Feral Prowler dies, draw a card.| Frilled Sandwalla|Hour of Devastation|116|C|{G}|Creature - Lizard|1|1|{1}{G}: Frilled Sandwalla gets +2/+2 until end of turn. Activate this ability only once each turn.| Gift of Strength|Hour of Devastation|117|C|{1}{G}|Instant|||Target creature gets +3/+3 and gains reach until end of turn.| Harrier Naga|Hour of Devastation|118|C|{2}{G}|Creature - Naga Warrior|3|3|| @@ -31760,7 +31760,7 @@ Resilient Khenra|Hour of Devastation|131|R|{1}{G}|Creature - Jackal Wizard|2|2|W Rhonas's Last Stand|Hour of Devastation|132|R|{G}{G}|Sorcery|||Create a 5/4 green Snake creature token. Lands you control don't untap during your next untap step.| Rhonas's Stalwart|Hour of Devastation|133|C|{1}{G}|Creature - Human Warrior|2|2|You may exert Rhonas's Stalwart as it attacks. When you do, it gets +1/+1 until end of turn and can't be blocked by creatures with power 2 or less this turn. (An exerted creature won't untap during your next untap step.)| Sidewinder Naga|Hour of Devastation|134|C|{2}{G}|Creature - Naga Warrior|3|2|As long as you control a Desert or there is a Desert card in your graveyard, Sidewinder Naga gets +1/+0 and has trample.| -Sifter Wurm|Hour of Devastation|135|C|{5}{G}{G}|Creature - Wurm|7|7|Trample$When Sifter Wurm enters the battlefield, scry 3, then reveal the top card of your library. You gain life equal to that card's converted mana cost.| +Sifter Wurm|Hour of Devastation|135|U|{5}{G}{G}|Creature - Wurm|7|7|Trample$When Sifter Wurm enters the battlefield, scry 3, then reveal the top card of your library. You gain life equal to that card's converted mana cost.| Tenacious Hunter|Hour of Devastation|136|U|{2}{G}{G}|Creature - Crocodile|4|4|As long as a creature has a -1/-1 counter on it, Tenacious Hunter has vigilance and deathtouch.| Uncage the Menagerie|Hour of Devastation|137|M|{X}{G}{G}|Sorcery|||Search your library for up to X creature cards with different names that each have converted mana cost X, reveal them, put them into your hand, then shuffle your library.| Bloodwater Entity|Hour of Devastation|138|U|{1}{U}{R}|Creature - Elemental|2|2|Flying$Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$When Bloodwater Elemental enters the battlefield, you may put target instant or sorcery card from your graveyard on top of your library.| @@ -31779,12 +31779,12 @@ Claim // Fame|Hour of Devastation|150|U|{B}|Sorcery|||Return target creature car Struggle // Survive|Hour of Devastation|151|U|{2}{R}|Instant|||Struggle deals damage to target creature equal to the number of lands you control.$Survive {1}{G}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Each player shuffles his or graveyard into his or her library.| Appeal // Authority|Hour of Devastation|152|U|{G}|Sorcery|||Until end of turn, target creature gains trample and gets +X/+X, where X is the number of creatures you control.$Authority {1}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Tap up to two target creatures your opponents control. Creatures you control gain vigilance until end of turn.| Leave // Chance|Hour of Devastation|153|R|{1}{W}|Instant|||Return any number of target permanents you own to your hand.$Chance {3}{R}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Discard any number of cards, then draw that many cards.| -Reason // Believe|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| +Reason // Live|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| Grind // Dust|Hour of Devastation|155|R|{1}{B}|Sorcery|||Put a -1/-1 counter on each of up to two target creatures.$Dust {3}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Exile any number of target creatures that have -1/-1 counters on them.| Refuse // Cooperate|Hour of Devastation|156|R|{3}{R}|Instant|||Refuse deals damage to target spell's controller equal to that spell's converted mana cost.$Cooperate {2}{U}$Instant$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Copy target instant or sorcery spell. You may choose new targets for the copy.| Driven // Despair|Hour of Devastation|157|R|{1}{G}|Sorcery|||Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."$Despair {1}{B}$Sorcery$Aftermath$Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."| Abandoned Sarcophagus|Hour of Devastation|158|R|{3}|Artifact|||You may cast nonland cards with cycling from your graveyard.$If a card with cycling would be put into your graveyard from anywhere and it wasn't cycled, exile it instead.| -Crook of Comdemnation|Hour of Devastation|159|U|{2}|Artifact|||{1}, {t}: Exile target card from a graveyard.${1}, Exile Crook of Condemnation: Exile all cards from all graveyards.| +Crook of Condemnation|Hour of Devastation|159|U|{2}|Artifact|||{1}, {t}: Exile target card from a graveyard.${1}, Exile Crook of Condemnation: Exile all cards from all graveyards.| Dagger of the Worthy|Hour of Devastation|160|U|{2}|Artifact - Equipment|||Equipped creature gets +2/+0 and has afflict 1. (Whenever it becomes blocked, defending player loses 1 life.)$Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.)| God-Pharaoh's Gift|Hour of Devastation|161|R|{7}|Artifact|||At the beginning of combat on your turn, you may exile a creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn.| Graven Abomination|Hour of Devastation|162|C|{3}|Artifact Creature - Horror|3|1|Whenever Graven Abomination attacks, exile target card from defending player's graveyard.| @@ -31793,7 +31793,7 @@ Manalith|Hour of Devastation|164|C|{3}|Artifact|||{T}: Add one mana of any color Mirage Mirror|Hour of Devastation|165|R|{3}|Artifact|||{2}: Mirage Mirror becomes a copy of target artifact, creature, enchantment, or land until end of turn.| Sunset Pyramid|Hour of Devastation|166|U|{2}|Artifact|||Sunset Pyramid enters the battlefield with three brick counters on it.${2}, {T}, Remove a brick counter from Sunset Pyramid: Draw a card.${2}, {T}: Scry 1.| Traveler's Amulet|Hour of Devastation|167|C|{1}|Artifact|||{1}, Sacrifice Traveler's Amulet: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library.| -Wall of Forgotten Pharaohs|Hour of Devastation|168|C|{2}|Artifact Creature - Wall|0|4|Defender${T}: Wall of Forgotten Pharaohs deals 1 damage to target player. Activate this ability only if you control a Desert of there is a Desert card in your graveyard.| +Wall of Forgotten Pharaohs|Hour of Devastation|168|C|{2}|Artifact Creature - Wall|0|4|Defender${T}: Wall of Forgotten Pharaohs deals 1 damage to target player. Activate this ability only if you control a Desert or there is a Desert card in your graveyard.| Crypt of the Eternals|Hour of Devastation|169|U||Land|||When Crypt of the Eternals enters the battlefield, you gain 1 life.${T}: Add {C} to your mana pool.${1}, {T}: Add {U}, {B}, or {R} to your mana pool.| Desert of the Fervent|Hour of Devastation|170|C||Land - Desert|||Desert of the Fervent enters the battlefield tapped.${T}: Add {R} to your mana pool.$Cycling {1}{R} ({1}{R}, Discard this card: Draw a card.)| Desert of the Glorified|Hour of Devastation|171|C||Land - Desert|||Desert of the Glorified enters the battlefield tapped.${T}: Add {B} to your mana pool.$Cycling {1}{B} ({1}{B}, Discard this card: Draw a card.)| @@ -31879,6 +31879,3 @@ Drowned Catacomb|Ixalan|???|R||Land|||Drowned Catacomb enters the battlefield ta Glacial Fortress|Ixalan|???|R||Land|||Glacial Fortress enters the battlefield tapped unless you control a Plains or an Island.${T}: Add {W} or {U} to your mana pool.| Rootbound Crag|Ixalan|???|R||Land|||Rootbound Crag enters the battlefield tapped unless you control a Mountain or a Forest.${T}: Add {R} or {G} to your mana pool.| Sunpetal Grove|Ixalan|???|R||Land|||Sunpetal Grove enters the battlefield tapped unless you control a Forest or a Plains.${T}: Add {G} or {W} to your mana pool.| -Act of Heroism|Hour of Devastation|1|C|{1}{W}|Instant|||Untap target creature. It gets +2/+2 until end of turn and can block an additional creature this turn.| -Aerial Guide|Hour of Devastation|29|C|{2}{U}|Creature - Drake|2|2|Flying.$Whenever Aerial Guide attacks, another target attacking creature gains flying until end of turn.| -Ambuscade|Hour of Devastation|110|C|{2}{G}|Instant|||Target creature you contol gets +1/+0 until end of turn. It deals damage equal to its power to target creature an opponent controls.| From 4c923758f5ec6a7cf26bb0ba742fa5c20c69beb8 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 1 Jul 2017 22:30:58 +1000 Subject: [PATCH 071/160] Some fixes to HOU spoiler --- Utils/mtg-cards-data.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 09bc4c7f0c..4ac7296098 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31645,7 +31645,7 @@ Mummy Paramount|Hour of Devastation|16|C|{1}{W}|Creature - Zombie|2|2|Whenever a Oketra's Avenger|Hour of Devastation|17|C|{1}{W}|Creature - Human Warrior|3|1|You may exert Oketra's Avenger as it attacks. When you do, prevent all combat damage that would be dealt to it this turn. (An exerted creature doesn't untap during its controller's next untap step.)| Oketra's Last Mercy|Hour of Devastation|18|R|{1}{W}{W}|Sorcery|||Your life total becomes your starting life total. Lands you control don't untap during your next untap phase| Overwhelming Splendor|Hour of Devastation|19|M|{6}{W}{W}|Enchantment - Aura Curse|||Enchant player$Creatures enchanted player controls lose all abilities and have base power and toughness 1/1.$Enchanted player can't activate abilities that aren't mana abilities or loyalty abilities.| -Sandblast|Hour of Devastation|20|C|{1}{W}|Instant|||Sandblast deals 5 damage to target attacking or blocking creature.| +Sandblast|Hour of Devastation|20|C|{2}{W}|Instant|||Sandblast deals 5 damage to target attacking or blocking creature.| Saving Grace|Hour of Devastation|21|U|{1}{W}|Enchantment - Aura|||Flash$Enchant creature you control$When Saving Grace enters the battlefield, all damage that would be dealt this turn to you and permanents you control is dealt to enchanted creature instead.$Enchanted creature gets +0/+3.| Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counters.$Counters can't be put on artifacts, creatures, enchantments, or lands.| Solitary Camel|Hour of Devastation|23|C|{2}{W}|Creature - Camel|3|2|Solitary Camel has lifelink as long as you control a desert or there is a desert card in your graveyard. (Damage this creature deals also causes you to gain that much life.)| From 3ebb508b94fccdff62680e33b950491a6f61fcef Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 1 Jul 2017 23:02:34 +1000 Subject: [PATCH 072/160] Implement Sidewinder Naga (HOU) (and add some reprints) --- .../src/mage/cards/s/SidewinderNaga.java | 113 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 7 +- 2 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/s/SidewinderNaga.java diff --git a/Mage.Sets/src/mage/cards/s/SidewinderNaga.java b/Mage.Sets/src/mage/cards/s/SidewinderNaga.java new file mode 100644 index 0000000000..6b73fb2eaa --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SidewinderNaga.java @@ -0,0 +1,113 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.TrampleAbility; +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.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author spjspj + */ +public class SidewinderNaga extends CardImpl { + + public SidewinderNaga(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add("Naga"); + this.subtype.add("Warrior"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // As long as you control a Desert or there is a Desert card in your graveyard, Sidewinder Naga gets +1/+0 and has trample. + ConditionalContinuousEffect effect = new ConditionalContinuousEffect(new BoostSourceEffect(1, 0, Duration.WhileOnBattlefield), new DesertInGYorBFCondition(), "As long as you control a Desert or there is a Desert card in your graveyard, {this} gets +1/+0 "); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield), new DesertInGYorBFCondition(), "and has trample")); + this.addAbility(ability); + } + + public SidewinderNaga(final SidewinderNaga card) { + super(card); + } + + @Override + public SidewinderNaga copy() { + return new SidewinderNaga(this); + } +} + +class DesertInGYorBFCondition implements Condition { + + private static final FilterCard filter = new FilterCard(); + + static { + filter.add(new SubtypePredicate(SubType.DESERT)); + } + + private static final FilterControlledLandPermanent filter2 = new FilterControlledLandPermanent("a desert"); + + static { + filter2.add(new SubtypePredicate(SubType.DESERT)); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + for (Card card : player.getGraveyard().getCards(game)) { + if (filter.match(card, game)) { + return true; + } + } + } + + PermanentsOnBattlefieldCount count = new PermanentsOnBattlefieldCount(filter2); + return count.calculate(game, source, null) >= 1; + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 6382cde597..95ea8a4152 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -76,7 +76,6 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Champion of Wits", 31, Rarity.RARE, mage.cards.c.ChampionOfWits.class)); cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); - cards.add(new SetCardInfo("Crumbling Necropolis", 169, Rarity.UNCOMMON, mage.cards.c.CrumblingNecropolis.class)); cards.add(new SetCardInfo("Crook of Condemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfCondemnation.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); @@ -100,7 +99,9 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); + cards.add(new SetCardInfo("Kindled Fury", 101, Rarity.COMMON, mage.cards.k.KindledFury.class)); cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); + cards.add(new SetCardInfo("Manalith", 164, Rarity.COMMON, mage.cards.m.Manalith.class)); cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); @@ -119,6 +120,8 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Reason // Believe", 154, Rarity.RARE, mage.cards.r.ReasonBelieve.class)); cards.add(new SetCardInfo("Refuse // Cooperate", 156, Rarity.RARE, mage.cards.r.RefuseCooperate.class)); cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); + cards.add(new SetCardInfo("Sandblast", 20, Rarity.COMMON, mage.cards.s.Sandblast.class)); + cards.add(new SetCardInfo("Sidewinder Naga", 134, Rarity.COMMON, mage.cards.s.SidewinderNaga.class)); cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); @@ -133,9 +136,11 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); + cards.add(new SetCardInfo("Traveler's Amulet", 167, Rarity.COMMON, mage.cards.t.TravelersAmulet.class)); cards.add(new SetCardInfo("Uncage the Menagerie", 137, Rarity.MYTHIC, mage.cards.u.UncageTheMenagerie.class)); cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); cards.add(new SetCardInfo("Unraveling Mummy", 147, Rarity.UNCOMMON, mage.cards.u.UnravelingMummy.class)); + cards.add(new SetCardInfo("Unsummon", 54, Rarity.COMMON, mage.cards.u.Unsummon.class)); cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); From 7d9886dd98a359a0f441b5245d2bdc41214c2293 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 2 Jul 2017 00:08:39 +1000 Subject: [PATCH 073/160] Implement 3 cards (HOU) --- Mage.Sets/src/mage/cards/s/SandStrangler.java | 89 ++++++++++++++++++ .../mage/cards/w/WallOfForgottenPharaohs.java | 94 +++++++++++++++++++ Mage.Sets/src/mage/cards/w/WretchedCamel.java | 90 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 3 + 4 files changed, 276 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SandStrangler.java create mode 100644 Mage.Sets/src/mage/cards/w/WallOfForgottenPharaohs.java create mode 100644 Mage.Sets/src/mage/cards/w/WretchedCamel.java diff --git a/Mage.Sets/src/mage/cards/s/SandStrangler.java b/Mage.Sets/src/mage/cards/s/SandStrangler.java new file mode 100644 index 0000000000..9ae9298abf --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SandStrangler.java @@ -0,0 +1,89 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.OrCondition; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author spjspj + */ +public class SandStrangler extends CardImpl { + + private static final FilterControlledPermanent filterDesertPermanent = new FilterControlledPermanent("Desert"); + private static final FilterCard filterDesertCard = new FilterCard("Desert card"); + + static { + filterDesertPermanent.add(new SubtypePredicate(SubType.DESERT)); + filterDesertCard.add(new SubtypePredicate(SubType.DESERT)); + } + + public SandStrangler(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + + this.subtype.add("Beast"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // When Sand Strangler enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you may have Sand Strangler deal 3 damage to target creature. + Ability ability = new ConditionalTriggeredAbility( + new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(3)), + new OrCondition( + new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(filterDesertPermanent)), + new CardsInControllerGraveCondition(1, filterDesertCard)), + "When {this} enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, you may have {this} deal 3 damage to target creature."); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + } + + public SandStrangler(final SandStrangler card) { + super(card); + } + + @Override + public SandStrangler copy() { + return new SandStrangler(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WallOfForgottenPharaohs.java b/Mage.Sets/src/mage/cards/w/WallOfForgottenPharaohs.java new file mode 100644 index 0000000000..6abc7f0e5a --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WallOfForgottenPharaohs.java @@ -0,0 +1,94 @@ +/* + * 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.w; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateIfConditionActivatedAbility; +import mage.abilities.condition.OrCondition; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetPlayer; + +/** + * + * @author spjspj + */ +public class WallOfForgottenPharaohs extends CardImpl { + + private static final FilterControlledPermanent filterDesertPermanent = new FilterControlledPermanent("Desert"); + private static final FilterCard filterDesertCard = new FilterCard("Desert card"); + + static { + filterDesertPermanent.add(new SubtypePredicate(SubType.DESERT)); + filterDesertCard.add(new SubtypePredicate(SubType.DESERT)); + } + + public WallOfForgottenPharaohs(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}"); + + this.subtype.add("Wall"); + this.power = new MageInt(0); + this.toughness = new MageInt(4); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // {T}: Wall of Forgotten Pharaohs deals 1 damage to target player. Activate this ability only if you control a Desert or there is a Desert card in your graveyard. + Ability ability = new ActivateIfConditionActivatedAbility( + Zone.BATTLEFIELD, + new DamageTargetEffect(1), + new TapSourceCost(), + new OrCondition("only if you control a Desert or there is a Desert card in your graveyard", + new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(filterDesertPermanent)), + new CardsInControllerGraveCondition(1, filterDesertCard))); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public WallOfForgottenPharaohs(final WallOfForgottenPharaohs card) { + super(card); + } + + @Override + public WallOfForgottenPharaohs copy() { + return new WallOfForgottenPharaohs(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WretchedCamel.java b/Mage.Sets/src/mage/cards/w/WretchedCamel.java new file mode 100644 index 0000000000..c790a744fc --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WretchedCamel.java @@ -0,0 +1,90 @@ +/* + * 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.w; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.condition.OrCondition; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetPlayer; + +/** + * + * @author spjspj + */ +public class WretchedCamel extends CardImpl { + + private static final FilterControlledPermanent filterDesertPermanent = new FilterControlledPermanent("Desert"); + private static final FilterCard filterDesertCard = new FilterCard("Desert card"); + + static { + filterDesertPermanent.add(new SubtypePredicate(SubType.DESERT)); + filterDesertCard.add(new SubtypePredicate(SubType.DESERT)); + } + + public WretchedCamel(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add("Zombie"); + this.subtype.add("Camel"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // When Wretched Camel dies, if you control a Desert or there is a Desert card in your graveyard, target player discards a card. + Ability ability = new ConditionalTriggeredAbility( + new DiesTriggeredAbility(new DiscardTargetEffect(1)), + new OrCondition( + new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(filterDesertPermanent)), + new CardsInControllerGraveCondition(1, filterDesertCard)), + "When {this} dies, if you control a Desert or there is a Desert card in your graveyard, target player discards a card."); + + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public WretchedCamel(final WretchedCamel card) { + super(card); + } + + @Override + public WretchedCamel copy() { + return new WretchedCamel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 95ea8a4152..33af8b72b2 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -120,6 +120,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Reason // Believe", 154, Rarity.RARE, mage.cards.r.ReasonBelieve.class)); cards.add(new SetCardInfo("Refuse // Cooperate", 156, Rarity.RARE, mage.cards.r.RefuseCooperate.class)); cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); + cards.add(new SetCardInfo("Sand Strangler", 107, Rarity.UNCOMMON, mage.cards.s.SandStrangler.class)); cards.add(new SetCardInfo("Sandblast", 20, Rarity.COMMON, mage.cards.s.Sandblast.class)); cards.add(new SetCardInfo("Sidewinder Naga", 134, Rarity.COMMON, mage.cards.s.SidewinderNaga.class)); cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); @@ -143,9 +144,11 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Unsummon", 54, Rarity.COMMON, mage.cards.u.Unsummon.class)); cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); + cards.add(new SetCardInfo("Wall of Forgotten Pharaohs", 168, Rarity.COMMON, mage.cards.w.WallOfForgottenPharaohs.class)); cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); + cards.add(new SetCardInfo("Wretched Camel", 82, Rarity.COMMON, mage.cards.w.WretchedCamel.class)); cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); } From 0bfcd24a8f01821398ba1cb9ca42a8c41c1d737b Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 2 Jul 2017 00:19:38 +1000 Subject: [PATCH 074/160] Implement 1 cards (HOU) --- .../src/mage/cards/u/UnquenchableThirst.java | 101 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 102 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/u/UnquenchableThirst.java diff --git a/Mage.Sets/src/mage/cards/u/UnquenchableThirst.java b/Mage.Sets/src/mage/cards/u/UnquenchableThirst.java new file mode 100644 index 0000000000..a2ee276008 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnquenchableThirst.java @@ -0,0 +1,101 @@ +/* + * 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.u; + +import java.util.UUID; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.OrCondition; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; +import mage.abilities.effects.common.TapEnchantedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author spjspj + */ +public class UnquenchableThirst extends CardImpl { + + private static final FilterControlledPermanent filterDesertPermanent = new FilterControlledPermanent("Desert"); + private static final FilterCard filterDesertCard = new FilterCard("Desert card"); + + static { + filterDesertPermanent.add(new SubtypePredicate(SubType.DESERT)); + filterDesertCard.add(new SubtypePredicate(SubType.DESERT)); + } + + public UnquenchableThirst(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + + this.subtype.add("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); + + // When Unquenchable Thirst enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, tap enchanted creature. + Ability ability2 = new ConditionalTriggeredAbility( + new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect()), + new OrCondition( + new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(filterDesertPermanent)), + new CardsInControllerGraveCondition(1, filterDesertCard)), + "When {this} enters the battlefield, if you control a Desert or there is a Desert card in your graveyard, tap enchanted creature."); + this.addAbility(ability2); + + // Enchanted creature doesn't untap during its controller's untap step. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepEnchantedEffect())); + } + + public UnquenchableThirst(final UnquenchableThirst card) { + super(card); + } + + @Override + public UnquenchableThirst copy() { + return new UnquenchableThirst(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 33af8b72b2..3e95c90993 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -140,6 +140,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Traveler's Amulet", 167, Rarity.COMMON, mage.cards.t.TravelersAmulet.class)); cards.add(new SetCardInfo("Uncage the Menagerie", 137, Rarity.MYTHIC, mage.cards.u.UncageTheMenagerie.class)); cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); + cards.add(new SetCardInfo("Unquenchable Thirst", 53, Rarity.COMMON, mage.cards.u.UnquenchableThirst.class)); cards.add(new SetCardInfo("Unraveling Mummy", 147, Rarity.UNCOMMON, mage.cards.u.UnravelingMummy.class)); cards.add(new SetCardInfo("Unsummon", 54, Rarity.COMMON, mage.cards.u.Unsummon.class)); cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); From 81de1f5e65e002cc1f94da099fad0fa2581bf058 Mon Sep 17 00:00:00 2001 From: nickymikail Date: Sat, 1 Jul 2017 14:43:47 -0700 Subject: [PATCH 075/160] Oketra's Avenger --- .../src/mage/cards/o/OketrasAvenger.java | 68 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 69 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/o/OketrasAvenger.java diff --git a/Mage.Sets/src/mage/cards/o/OketrasAvenger.java b/Mage.Sets/src/mage/cards/o/OketrasAvenger.java new file mode 100644 index 0000000000..9d994c96cf --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OketrasAvenger.java @@ -0,0 +1,68 @@ +/* + * 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.o; + +import java.util.UUID; + +import mage.MageInt; +import mage.abilities.common.BecomesExertSourceTriggeredAbility; +import mage.abilities.effects.common.PreventCombatDamageToSourceEffect; +import mage.abilities.keyword.ExertAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author nickymikail + */ +public class OketrasAvenger extends CardImpl { + + public OketrasAvenger(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add("Human"); + this.subtype.add("Warrior"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // You may exert Oketra's Avenger as it attacks. When you do, prevent all combat damage that would be dealt to it this turn. + BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(new PreventCombatDamageToSourceEffect(Duration.EndOfTurn)); + this.addAbility(new ExertAbility(ability)); + } + + public OketrasAvenger(final OketrasAvenger card) { + super(card); + } + + @Override + public OketrasAvenger copy() { + return new OketrasAvenger(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 3e95c90993..6fa2e13f2f 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -108,6 +108,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Nicol Bolas, the Deceiver", 205, Rarity.MYTHIC, mage.cards.n.NicolBolasTheDeceiver.class)); cards.add(new SetCardInfo("Nissa, Genesis Mage", 200, Rarity.MYTHIC, mage.cards.n.NissaGenesisMage.class)); cards.add(new SetCardInfo("Oasis Ritualist", 124, Rarity.COMMON, mage.cards.o.OasisRitualist.class)); + cards.add(new SetCardInfo("Oketra's Avenger", 17, Rarity.COMMON, mage.cards.o.OketrasAvenger.class)); cards.add(new SetCardInfo("Oketra's Last Mercy", 18, Rarity.RARE, mage.cards.o.OketrasLastMercy.class)); cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); cards.add(new SetCardInfo("Overwhelming Splendor", 19, Rarity.MYTHIC, mage.cards.o.OverwhelmingSplendor.class)); From f80bcfdfa23ee2020df238cc887d7916a059954c Mon Sep 17 00:00:00 2001 From: nickymikail Date: Sat, 1 Jul 2017 15:02:15 -0700 Subject: [PATCH 076/160] Lurching Rotbeast --- .../src/mage/cards/l/LurchingRotbeast.java | 66 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 67 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/l/LurchingRotbeast.java diff --git a/Mage.Sets/src/mage/cards/l/LurchingRotbeast.java b/Mage.Sets/src/mage/cards/l/LurchingRotbeast.java new file mode 100644 index 0000000000..72cc70c41c --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LurchingRotbeast.java @@ -0,0 +1,66 @@ +/* + * 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.l; + +import java.util.UUID; + +import mage.MageInt; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author anonymous + */ +public class LurchingRotbeast extends CardImpl { + + public LurchingRotbeast(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); + + this.subtype.add("Zombie"); + this.subtype.add("Beast"); + this.power = new MageInt(4); + this.toughness = new MageInt(2); + + // Cycling {B} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{B}"))); + + } + + public LurchingRotbeast(final LurchingRotbeast card) { + super(card); + } + + @Override + public LurchingRotbeast copy() { + return new LurchingRotbeast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 6fa2e13f2f..2194912347 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -101,6 +101,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); cards.add(new SetCardInfo("Kindled Fury", 101, Rarity.COMMON, mage.cards.k.KindledFury.class)); cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); + cards.add(new SetCardInfo("Lurching Rotbeast", 69, Rarity.COMMON, mage.cards.l.LurchingRotbeast.class)); cards.add(new SetCardInfo("Manalith", 164, Rarity.COMMON, mage.cards.m.Manalith.class)); cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); From 186fdb0cacca06cd7e291c21e67c6a28f1be9122 Mon Sep 17 00:00:00 2001 From: nickymikail Date: Sat, 1 Jul 2017 16:15:58 -0700 Subject: [PATCH 077/160] Ruin Rat --- Mage.Sets/src/mage/cards/r/RuinRat.java | 73 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 74 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RuinRat.java diff --git a/Mage.Sets/src/mage/cards/r/RuinRat.java b/Mage.Sets/src/mage/cards/r/RuinRat.java new file mode 100644 index 0000000000..e63e6c0b49 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RuinRat.java @@ -0,0 +1,73 @@ +/* + * 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.r; + +import java.util.UUID; + +import mage.MageInt; +import mage.abilities.common.DiesTriggeredAbility; +import mage.filter.FilterCard; +import mage.target.common.TargetCardInOpponentsGraveyard; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author anonymous + */ +public class RuinRat extends CardImpl { + + public RuinRat(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add("Rat"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // When Ruin Rat dies, exile target card from an opponent's graveyard. + DiesTriggeredAbility ability = new DiesTriggeredAbility(new ExileTargetEffect()); + ability.addTarget(new TargetCardInOpponentsGraveyard(new FilterCard())); + this.addAbility(ability); + + } + + public RuinRat(final RuinRat card) { + super(card); + } + + @Override + public RuinRat copy() { + return new RuinRat(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 2194912347..0d2328dae6 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -121,6 +121,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); cards.add(new SetCardInfo("Reason // Believe", 154, Rarity.RARE, mage.cards.r.ReasonBelieve.class)); cards.add(new SetCardInfo("Refuse // Cooperate", 156, Rarity.RARE, mage.cards.r.RefuseCooperate.class)); + cards.add(new SetCardInfo("Ruin Rat", 75, Rarity.COMMON, mage.cards.r.RuinRat.class)); cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); cards.add(new SetCardInfo("Sand Strangler", 107, Rarity.UNCOMMON, mage.cards.s.SandStrangler.class)); cards.add(new SetCardInfo("Sandblast", 20, Rarity.COMMON, mage.cards.s.Sandblast.class)); From 554c2b208413585fd4ff6db11299372bce42a365 Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sat, 1 Jul 2017 21:06:45 -0400 Subject: [PATCH 078/160] Fork Test --- .../Mage.Player.Human/src/mage/player/human/HumanPlayer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 7e8a4b3e10..7ab8118d13 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -1732,3 +1732,4 @@ public class HumanPlayer extends PlayerImpl { return "no available"; } } +// Test \ No newline at end of file From bc69e08c1a7d08ff9e689358397d752819f1d148 Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sat, 1 Jul 2017 21:10:12 -0400 Subject: [PATCH 079/160] Remove Git Test --- .../Mage.Player.Human/src/mage/player/human/HumanPlayer.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 7ab8118d13..1b8815e33c 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -1731,5 +1731,4 @@ public class HumanPlayer extends PlayerImpl { public String getHistory() { return "no available"; } -} -// Test \ No newline at end of file +} \ No newline at end of file From d66663191c54097bc4f7983f75387edac756010b Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 2 Jul 2017 11:18:55 +1000 Subject: [PATCH 080/160] HOU - 3 split cards already implemented --- Mage.Sets/src/mage/sets/HourOfDevastation.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 3e95c90993..e5d04fe9bd 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -76,6 +76,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Champion of Wits", 31, Rarity.RARE, mage.cards.c.ChampionOfWits.class)); cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); + cards.add(new SetCardInfo("Claim // Fame", 150, Rarity.UNCOMMON, mage.cards.c.ClaimFame.class)); cards.add(new SetCardInfo("Crook of Condemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfCondemnation.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); @@ -93,6 +94,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Fraying Sanity", 35, Rarity.UNCOMMON, mage.cards.f.FrayingSanity.class)); cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); + cards.add(new SetCardInfo("Grind // Dust", 155, Rarity.RARE, mage.cards.g.GrindDust.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); @@ -127,6 +129,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Strategic Planning", 47, Rarity.COMMON, mage.cards.s.StrategicPlanning.class)); + cards.add(new SetCardInfo("Struggle // Survive", 151, Rarity.UNCOMMON, mage.cards.s.StruggleSurvive.class)); cards.add(new SetCardInfo("Sunset Pyramid", 166, Rarity.UNCOMMON, mage.cards.s.SunsetPyramid.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); From 301ea285d5de65e52cb9dd1ce6abeb6296980678 Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sat, 1 Jul 2017 22:04:17 -0400 Subject: [PATCH 081/160] Revert "Remove Git Test" This reverts commit bc69e08c1a7d08ff9e689358397d752819f1d148. --- .../Mage.Player.Human/src/mage/player/human/HumanPlayer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 1b8815e33c..7ab8118d13 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -1731,4 +1731,5 @@ public class HumanPlayer extends PlayerImpl { public String getHistory() { return "no available"; } -} \ No newline at end of file +} +// Test \ No newline at end of file From 02301857218b10f6d7682e4288f81b0c9f1d8836 Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sat, 1 Jul 2017 22:05:13 -0400 Subject: [PATCH 082/160] Revert "Fork Test" This reverts commit 554c2b208413585fd4ff6db11299372bce42a365. --- .../Mage.Player.Human/src/mage/player/human/HumanPlayer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 7ab8118d13..7e8a4b3e10 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -1732,4 +1732,3 @@ public class HumanPlayer extends PlayerImpl { return "no available"; } } -// Test \ No newline at end of file From c6291316cdee25d76d10a83a694de6a783a28b40 Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sat, 1 Jul 2017 22:14:50 -0400 Subject: [PATCH 083/160] Added Beneath the Sands [HOU] --- .../src/mage/cards/b/BeneathTheSands.java | 45 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 46 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BeneathTheSands.java diff --git a/Mage.Sets/src/mage/cards/b/BeneathTheSands.java b/Mage.Sets/src/mage/cards/b/BeneathTheSands.java new file mode 100644 index 0000000000..2be5891744 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BeneathTheSands.java @@ -0,0 +1,45 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.cards.b; + + +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterBasicLandCard; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * + * @author Archer262 + */ +public class BeneathTheSands extends CardImpl { + + public BeneathTheSands(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{G}"); + + + // Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. + this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(new FilterBasicLandCard()), true, true)); + + // Cycling {2} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + } + + public BeneathTheSands(final BeneathTheSands card) { + super(card); + } + + @Override + public BeneathTheSands copy() { + return new BeneathTheSands(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 3e95c90993..929541f9eb 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -70,6 +70,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); + cards.add(new SetCardInfo("Beneath The Sands", 111, Rarity.COMMON, mage.cards.b.BeneathTheSands.class)); cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); cards.add(new SetCardInfo("Brambleweft Behemoth", 202, Rarity.COMMON, mage.cards.b.BrambleweftBehemoth.class)); cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); From 2b4bf16cecad0fce1a6e4c24741d56c2ad04bc3c Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 2 Jul 2017 12:15:05 +1000 Subject: [PATCH 084/160] Implement 2 HOU cards --- .../src/mage/cards/v/VizierOfTheAnointed.java | 194 ++++++++++++++++++ .../src/mage/cards/w/WithoutWeakness.java | 67 ++++++ .../src/mage/sets/HourOfDevastation.java | 2 + 3 files changed, 263 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/v/VizierOfTheAnointed.java create mode 100644 Mage.Sets/src/mage/cards/w/WithoutWeakness.java diff --git a/Mage.Sets/src/mage/cards/v/VizierOfTheAnointed.java b/Mage.Sets/src/mage/cards/v/VizierOfTheAnointed.java new file mode 100644 index 0000000000..c96f633ee1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VizierOfTheAnointed.java @@ -0,0 +1,194 @@ +/* + * 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.v; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Abilities; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.SearchEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.EmbalmAbility; +import mage.abilities.keyword.EternalizeAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicate; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.stack.StackAbility; +import mage.players.Player; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author spjspj + */ +public class VizierOfTheAnointed extends CardImpl { + + private static final FilterCard filter = new FilterCard("a creature card with eternalize or embalm"); + + static { + filter.add(new CardTypePredicate(CardType.CREATURE)); + filter.add(new VizierOfTheAnointedAbilityPredicate()); + } + + public VizierOfTheAnointed(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); + + this.subtype.add("Human"); + this.subtype.add("Cleric"); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // When Vizier of the Anointed enters the battlefield, you may search your library for a creature card with eternalize or embalm, put that card into your graveyard, then shuffle your library. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInGraveyard(filter), true)); + + // Whenever you activate an eternalize or embalm ability, draw a card. + this.addAbility(new VizierOfTheAnointedTriggeredAbility()); + + } + + public VizierOfTheAnointed(final VizierOfTheAnointed card) { + super(card); + } + + @Override + public VizierOfTheAnointed copy() { + return new VizierOfTheAnointed(this); + } +} + +class VizierOfTheAnointedAbilityPredicate implements Predicate { + + public VizierOfTheAnointedAbilityPredicate() { + } + + @Override + public boolean apply(MageObject input, Game game) { + Abilities abilities = input.getAbilities(); + for (int i = 0; i < abilities.size(); i++) { + if (abilities.get(i) instanceof EmbalmAbility) { + return true; + } + if (abilities.get(i) instanceof EternalizeAbility) { + return true; + } + } + return false; + } + + @Override + public String toString() { + return "Creature card with Eternalize or Embalm"; + } +} + +class VizierOfTheAnointedTriggeredAbility extends TriggeredAbilityImpl { + + VizierOfTheAnointedTriggeredAbility() { + super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), true); + } + + VizierOfTheAnointedTriggeredAbility(final VizierOfTheAnointedTriggeredAbility ability) { + super(ability); + } + + @Override + public VizierOfTheAnointedTriggeredAbility copy() { + return new VizierOfTheAnointedTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ACTIVATED_ABILITY; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getPlayerId().equals(getControllerId())) { + Card source = game.getPermanentOrLKIBattlefield(event.getSourceId()); + if (source != null) { + StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); + if (stackAbility.getStackAbility() instanceof EternalizeAbility + || stackAbility.getStackAbility() instanceof EmbalmAbility) { + return true; + } + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever you activate an ability of an artifact or creature that isn't a mana ability, " + super.getRule(); + } +} + +class SearchLibraryPutInGraveyard extends SearchEffect { + + public SearchLibraryPutInGraveyard(FilterCard filter) { + super(new TargetCardInLibrary(filter), Outcome.Neutral); + staticText = "a creature card with eternalize or embalm, put that card into your graveyard, then shuffle your library."; + } + + public SearchLibraryPutInGraveyard(final SearchLibraryPutInGraveyard effect) { + super(effect); + } + + @Override + public SearchLibraryPutInGraveyard copy() { + return new SearchLibraryPutInGraveyard(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + if (controller.searchLibrary(target, game)) { + if (!target.getTargets().isEmpty()) { + Card card = controller.getLibrary().getCard(target.getFirstTarget(), game); + if (card != null) { + controller.moveCards(card, Zone.GRAVEYARD, source, game); + } + } + } + controller.shuffleLibrary(source, game); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/w/WithoutWeakness.java b/Mage.Sets/src/mage/cards/w/WithoutWeakness.java new file mode 100644 index 0000000000..b847c3a379 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WithoutWeakness.java @@ -0,0 +1,67 @@ +/* + * 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.w; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author spjspj + */ +public class WithoutWeakness extends CardImpl { + + public WithoutWeakness(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}"); + + // Target creature you control gains indestructible until end of turn. + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); + + // Cycling {2} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + + } + + public WithoutWeakness(final WithoutWeakness card) { + super(card); + } + + @Override + public WithoutWeakness copy() { + return new WithoutWeakness(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index e5d04fe9bd..b320a23f77 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -147,10 +147,12 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Unraveling Mummy", 147, Rarity.UNCOMMON, mage.cards.u.UnravelingMummy.class)); cards.add(new SetCardInfo("Unsummon", 54, Rarity.COMMON, mage.cards.u.Unsummon.class)); cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); + cards.add(new SetCardInfo("Vizier of the Anointed", 55, Rarity.UNCOMMON, mage.cards.v.VizierOfTheAnointed.class)); cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); cards.add(new SetCardInfo("Wall of Forgotten Pharaohs", 168, Rarity.COMMON, mage.cards.w.WallOfForgottenPharaohs.class)); cards.add(new SetCardInfo("Wasp of the Bitter End", 206, Rarity.UNCOMMON, mage.cards.w.WaspOfTheBitterEnd.class)); cards.add(new SetCardInfo("Wildfire Eternal", 109, Rarity.RARE, mage.cards.w.WildfireEternal.class)); + cards.add(new SetCardInfo("Without Weakness", 81, Rarity.COMMON, mage.cards.w.WithoutWeakness.class)); cards.add(new SetCardInfo("Woodland Stream", 204, Rarity.COMMON, mage.cards.w.WoodlandStream.class)); cards.add(new SetCardInfo("Wretched Camel", 82, Rarity.COMMON, mage.cards.w.WretchedCamel.class)); cards.add(new SetCardInfo("Zealot of the God-Pharaoh", 207, Rarity.COMMON, mage.cards.z.ZealotOfTheGodPharaoh.class)); From 4a29f7a0f0cbf4dae500decc78ee0b58edf15197 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 2 Jul 2017 12:46:06 +1000 Subject: [PATCH 085/160] Implement Vizier of the Anointed (HOU) --- .../src/mage/cards/v/VizierOfTheAnointed.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Mage.Sets/src/mage/cards/v/VizierOfTheAnointed.java b/Mage.Sets/src/mage/cards/v/VizierOfTheAnointed.java index c96f633ee1..942560a4e5 100644 --- a/Mage.Sets/src/mage/cards/v/VizierOfTheAnointed.java +++ b/Mage.Sets/src/mage/cards/v/VizierOfTheAnointed.java @@ -120,7 +120,7 @@ class VizierOfTheAnointedAbilityPredicate implements Predicate { class VizierOfTheAnointedTriggeredAbility extends TriggeredAbilityImpl { VizierOfTheAnointedTriggeredAbility() { - super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), true); + super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), false); } VizierOfTheAnointedTriggeredAbility(final VizierOfTheAnointedTriggeredAbility ability) { @@ -140,13 +140,10 @@ class VizierOfTheAnointedTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getPlayerId().equals(getControllerId())) { - Card source = game.getPermanentOrLKIBattlefield(event.getSourceId()); - if (source != null) { - StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); - if (stackAbility.getStackAbility() instanceof EternalizeAbility - || stackAbility.getStackAbility() instanceof EmbalmAbility) { - return true; - } + StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId()); + if (stackAbility.getStackAbility() instanceof EternalizeAbility + || stackAbility.getStackAbility() instanceof EmbalmAbility) { + return true; } } return false; @@ -154,7 +151,7 @@ class VizierOfTheAnointedTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Whenever you activate an ability of an artifact or creature that isn't a mana ability, " + super.getRule(); + return "Whenever you activate an eternalize or embalm ability, draw a card."; } } @@ -162,7 +159,7 @@ class SearchLibraryPutInGraveyard extends SearchEffect { public SearchLibraryPutInGraveyard(FilterCard filter) { super(new TargetCardInLibrary(filter), Outcome.Neutral); - staticText = "a creature card with eternalize or embalm, put that card into your graveyard, then shuffle your library."; + staticText = "search for a creature card with eternalize or embalm, put that card into your graveyard, then shuffle your library."; } public SearchLibraryPutInGraveyard(final SearchLibraryPutInGraveyard effect) { From a1dcaa6a899ad597e13aa79f3c33c1b6d412b85f Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 2 Jul 2017 13:49:33 +1000 Subject: [PATCH 086/160] Implement 2 HOU cards --- .../mage/cards/u/UnconventionalTactics.java | 132 ++++++++++++++++++ .../src/mage/cards/v/VileManifestation.java | 85 +++++++++++ .../src/mage/sets/HourOfDevastation.java | 2 + 3 files changed, 219 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/u/UnconventionalTactics.java create mode 100644 Mage.Sets/src/mage/cards/v/VileManifestation.java diff --git a/Mage.Sets/src/mage/cards/u/UnconventionalTactics.java b/Mage.Sets/src/mage/cards/u/UnconventionalTactics.java new file mode 100644 index 0000000000..b642f08b7c --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnconventionalTactics.java @@ -0,0 +1,132 @@ +/* + * 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.u; + +import java.util.UUID; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author spjspj + */ +public class UnconventionalTactics extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("zombie creature"); + + static { + filter.add(new SubtypePredicate(SubType.ZOMBIE)); + } + + public UnconventionalTactics(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{W}"); + + // Target creature gets +3/+3 and gains flying until end of turn. + Effect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn); + effect.setText("Target creature gets +3/+3"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains flying until end of turn"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // Whenever a Zombie enters the battlefield under your control, you may pay {W}. If you do, return Unconventional Tactics from your graveyard to your hand. + this.addAbility(new UnconventionalTacticsTriggeredAbility()); + } + + public UnconventionalTactics(final UnconventionalTactics card) { + super(card); + } + + @Override + public UnconventionalTactics copy() { + return new UnconventionalTactics(this); + } +} + +class UnconventionalTacticsTriggeredAbility extends TriggeredAbilityImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("zombie creature"); + + static { + filter.add(new SubtypePredicate(SubType.ZOMBIE)); + } + + public UnconventionalTacticsTriggeredAbility() { + super(Zone.GRAVEYARD, new DoIfCostPaid(new ReturnToHandSourceEffect(), new ManaCostsImpl("{W}")), false); + } + + public UnconventionalTacticsTriggeredAbility(final UnconventionalTacticsTriggeredAbility ability) { + super(ability); + } + + @Override + public UnconventionalTacticsTriggeredAbility copy() { + return new UnconventionalTacticsTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.ENTERS_THE_BATTLEFIELD; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent.isCreature() + && permanent.getControllerId().equals(this.controllerId) + && filter.match(permanent, game)) { + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever a Zombie enters the battlefield under your control, you may pay {W}. If you do, return {this} from your graveyard to your hand."; + } +} diff --git a/Mage.Sets/src/mage/cards/v/VileManifestation.java b/Mage.Sets/src/mage/cards/v/VileManifestation.java new file mode 100644 index 0000000000..536e69b21e --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VileManifestation.java @@ -0,0 +1,85 @@ +/* + * 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.v; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; + +/** + * + * @author spjspj + */ +public class VileManifestation extends CardImpl { + + private static final FilterCard filter = new FilterCard(); + + static { + filter.add(new AbilityPredicate(CyclingAbility.class)); + } + + public VileManifestation(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add("Horror"); + this.power = new MageInt(0); + this.toughness = new MageInt(4); + + // Vile Manifestation gets +1/+0 for each card with cycling in your graveyard. + DynamicValue amount = new CardsInControllerGraveyardCount(new FilterCard(filter)); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(amount, new StaticValue(0), Duration.WhileOnBattlefield)); + this.addAbility(ability); + + // Cycling {2} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + } + + public VileManifestation(final VileManifestation card) { + super(card); + } + + @Override + public VileManifestation copy() { + return new VileManifestation(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index b320a23f77..b4d0285f1f 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -142,10 +142,12 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); cards.add(new SetCardInfo("Traveler's Amulet", 167, Rarity.COMMON, mage.cards.t.TravelersAmulet.class)); cards.add(new SetCardInfo("Uncage the Menagerie", 137, Rarity.MYTHIC, mage.cards.u.UncageTheMenagerie.class)); + cards.add(new SetCardInfo("Unconventional Tactics", 27, Rarity.UNCOMMON, mage.cards.u.UnconventionalTactics.class)); cards.add(new SetCardInfo("Unesh, Criosphinx Sovereign", 52, Rarity.MYTHIC, mage.cards.u.UneshCriosphinxSovereign.class)); cards.add(new SetCardInfo("Unquenchable Thirst", 53, Rarity.COMMON, mage.cards.u.UnquenchableThirst.class)); cards.add(new SetCardInfo("Unraveling Mummy", 147, Rarity.UNCOMMON, mage.cards.u.UnravelingMummy.class)); cards.add(new SetCardInfo("Unsummon", 54, Rarity.COMMON, mage.cards.u.Unsummon.class)); + cards.add(new SetCardInfo("Vile Manifestation", 80, Rarity.UNCOMMON, mage.cards.v.VileManifestation.class)); cards.add(new SetCardInfo("Visage of Bolas", 208, Rarity.RARE, mage.cards.v.VisageOfBolas.class)); cards.add(new SetCardInfo("Vizier of the Anointed", 55, Rarity.UNCOMMON, mage.cards.v.VizierOfTheAnointed.class)); cards.add(new SetCardInfo("Vizier of the True", 28, Rarity.UNCOMMON, mage.cards.v.VizierOfTheTrue.class)); From 891cf38a3b63d1731b311279fd863860f980c9a5 Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sun, 2 Jul 2017 00:19:17 -0400 Subject: [PATCH 087/160] Act Of Heroism --- Mage.Sets/src/mage/cards/a/ActOfHeroism.java | 55 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 56 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/ActOfHeroism.java diff --git a/Mage.Sets/src/mage/cards/a/ActOfHeroism.java b/Mage.Sets/src/mage/cards/a/ActOfHeroism.java new file mode 100644 index 0000000000..d69a6fe12b --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/ActOfHeroism.java @@ -0,0 +1,55 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.cards.a; + +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +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; +import mage.abilities.Ability; + +/** + * + * @author Archer262 + */ +public class ActOfHeroism extends CardImpl { + + public ActOfHeroism(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{G}"); + + // Untap target creature. + Effect effect = new UntapTargetEffect(); + effect.setText("Untap target creature"); + this.getSpellAbility().addEffect(effect); + + // It gets +2/+2 and can block an additional creature this turn. + effect = new BoostTargetEffect(2, 2, Duration.EndOfTurn); + effect.setText("It gets +2/+2"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect((Ability) new CanBlockAdditionalCreatureEffect(), Duration.EndOfTurn); + effect.setText("and can block an additional creature this turn."); + this.getSpellAbility().addEffect(effect); + + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public ActOfHeroism(final ActOfHeroism card) { + super(card); + } + + @Override + public ActOfHeroism copy() { + return new ActOfHeroism(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index d8a5781d47..4bd46d3675 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -66,6 +66,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Abrade", 83, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); + cards.add(new SetCardInfo("Act of Heroism", 1, Rarity.COMMON, mage.cards.a.ActOfHeroism.class)); cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); From dac9f4f4a8a17a0223cfc34eb2cc23e64e8d80c0 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 2 Jul 2017 17:11:48 +1000 Subject: [PATCH 088/160] Implement Tragic Lesson (HOU) --- Mage.Sets/src/mage/cards/t/TragicLesson.java | 111 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 112 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TragicLesson.java diff --git a/Mage.Sets/src/mage/cards/t/TragicLesson.java b/Mage.Sets/src/mage/cards/t/TragicLesson.java new file mode 100644 index 0000000000..f728e0ff65 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TragicLesson.java @@ -0,0 +1,111 @@ +/* + * 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.t; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; +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.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author spjspj + */ +public class TragicLesson extends CardImpl { + + public TragicLesson(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}"); + + // Draw two cards. Then discard a card unless you return a land you control to its owner's hand. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2)); + this.getSpellAbility().addEffect(new TragicLessonEffect()); + } + + public TragicLesson(final TragicLesson card) { + super(card); + } + + @Override + public TragicLesson copy() { + return new TragicLesson(this); + } +} + +class TragicLessonEffect extends OneShotEffect { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a land you control"); + + static { + filter.add(new CardTypePredicate(CardType.LAND)); + } + + public TragicLessonEffect() { + super(Outcome.Discard); + staticText = "Then discard a card unless you return a land you control to its owner's hand."; + } + + public TragicLessonEffect(final TragicLessonEffect effect) { + super(effect); + } + + @Override + public TragicLessonEffect copy() { + return new TragicLessonEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + + if (controller != null + && controller.chooseUse(Outcome.Discard, "Do you want to return a land you control to its owner's hand? If you don't, you must discard 1 card", source, game)) { + Cost cost = new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)); + if (cost.canPay(source, source.getSourceId(), controller.getId(), game)) { + if (cost.pay(source, game, source.getSourceId(), controller.getId(), false, null)) { + return true; + } + } + } + if (controller != null) { + controller.discard(1, false, source, game); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index b4d0285f1f..d44af937ff 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -140,6 +140,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); + cards.add(new SetCardInfo("Tragic Lesson", 51, Rarity.COMMON, mage.cards.t.TragicLesson.class)); cards.add(new SetCardInfo("Traveler's Amulet", 167, Rarity.COMMON, mage.cards.t.TravelersAmulet.class)); cards.add(new SetCardInfo("Uncage the Menagerie", 137, Rarity.MYTHIC, mage.cards.u.UncageTheMenagerie.class)); cards.add(new SetCardInfo("Unconventional Tactics", 27, Rarity.UNCOMMON, mage.cards.u.UnconventionalTactics.class)); From b573d7288351cf9b2dc62b940d09ac09d7ccf883 Mon Sep 17 00:00:00 2001 From: igoudt Date: Sun, 2 Jul 2017 13:08:03 +0200 Subject: [PATCH 089/160] added UT, fix small bug on Hour of Revelation --- .../src/mage/cards/h/HourOfRevelation.java | 5 ++- .../single/hou/BontusLastReckoningTest.java | 33 +++++++++++++++ .../cards/single/hou/ChampionOfWitsTest.java | 40 +++++++++++++++++++ .../single/hou/HourOfRevelationTest.java | 26 ++++++++++++ 4 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/hou/BontusLastReckoningTest.java create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/hou/ChampionOfWitsTest.java create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/hou/HourOfRevelationTest.java diff --git a/Mage.Sets/src/mage/cards/h/HourOfRevelation.java b/Mage.Sets/src/mage/cards/h/HourOfRevelation.java index bdbed620df..f2b229f4a8 100644 --- a/Mage.Sets/src/mage/cards/h/HourOfRevelation.java +++ b/Mage.Sets/src/mage/cards/h/HourOfRevelation.java @@ -27,7 +27,6 @@ */ package mage.cards.h; -import java.util.UUID; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.effects.common.DestroyAllEffect; @@ -39,6 +38,8 @@ import mage.constants.ComparisonType; import mage.constants.Zone; import mage.filter.common.FilterNonlandPermanent; +import java.util.UUID; + /** * * @author fireshoes @@ -51,7 +52,7 @@ public class HourOfRevelation extends CardImpl { // Hour of Revelation costs {3} less to cast if there are ten or more nonland permanents on the battlefield. SimpleStaticAbility ability = new SimpleStaticAbility(Zone.STACK, new SpellCostReductionSourceEffect(3, new PermanentsOnTheBattlefieldCondition( - new FilterNonlandPermanent("there are ten or more nonland permanents on the battlefield"), ComparisonType.MORE_THAN, 9))); + new FilterNonlandPermanent("there are ten or more nonland permanents on the battlefield"), ComparisonType.MORE_THAN, 9, false))); ability.setRuleAtTheTop(true); this.addAbility(ability); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/BontusLastReckoningTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/BontusLastReckoningTest.java new file mode 100644 index 0000000000..2846c50174 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/BontusLastReckoningTest.java @@ -0,0 +1,33 @@ +package org.mage.test.cards.single.hou; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class BontusLastReckoningTest extends CardTestPlayerBase { + + private String reckoning = "Bontu's Last Reckoning"; + + @Test + public void testDelayedUntap(){ + String pouncer = "Adorned Pouncer"; + String angel = "Angel of Condemnation"; + addCard(Zone.HAND, playerA, reckoning); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + addCard(Zone.BATTLEFIELD, playerA, pouncer); + addCard(Zone.BATTLEFIELD, playerB, angel); + addCard(Zone.BATTLEFIELD, playerB, "Island"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN,playerA, reckoning); + + setStopAt(3, PhaseStep.PRECOMBAT_MAIN); + + execute(); + + assertTappedCount("Swamp", true, 3); + assertTappedCount("Island", false, 1); + assertGraveyardCount(playerA, pouncer, 1); + assertGraveyardCount(playerB, angel, 1); + } +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/ChampionOfWitsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/ChampionOfWitsTest.java new file mode 100644 index 0000000000..4a6ec08e3e --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/ChampionOfWitsTest.java @@ -0,0 +1,40 @@ +package org.mage.test.cards.single.hou; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class ChampionOfWitsTest extends CardTestPlayerBase { + + + private final String champion = "Champion of Wits"; + + @Test + public void testEternalize(){ + addCard(Zone.GRAVEYARD, playerA, champion); + addCard(Zone.BATTLEFIELD,playerA, "Island", 10); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA,"Eternalize {5}{U}{U}"); + + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + + execute(); + assertHandCount(playerA, 2); + } + + @Test + public void testEternalizeWithAnthem(){ + String anthem = "Glorious Anthem"; + addCard(Zone.GRAVEYARD, playerA, champion); + addCard(Zone.BATTLEFIELD,playerA, "Island", 10); + addCard(Zone.BATTLEFIELD, playerA, anthem); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA,"Eternalize {5}{U}{U}"); + + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + + execute(); + assertHandCount(playerA, 3); + } +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/HourOfRevelationTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/HourOfRevelationTest.java new file mode 100644 index 0000000000..2d1f5998d8 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/HourOfRevelationTest.java @@ -0,0 +1,26 @@ +package org.mage.test.cards.single.hou; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class HourOfRevelationTest extends CardTestPlayerBase { + + private final String hour = "Hour of Revelation"; + + @Test + public void testCountAllPlayers() { + addCard(Zone.HAND, playerA, hour, 1); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 6); + addCard(Zone.BATTLEFIELD, playerA, "Grizzly Bears", 5); + addCard(Zone.BATTLEFIELD, playerB, "Grizzly Bears", 5); + + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, hour); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertTappedCount("Plains", true, 3); + } +} From e302e5f3024525ab88e8f8744cbdafdaceb95724 Mon Sep 17 00:00:00 2001 From: igoudt Date: Sun, 2 Jul 2017 13:54:10 +0200 Subject: [PATCH 090/160] added dutiful servants, rampagin hippo, scrounger of souls --- .../src/mage/cards/d/DutifulServants.java | 26 ++++++++++++++ .../src/mage/cards/r/RampagingHippo.java | 35 +++++++++++++++++++ .../src/mage/cards/s/ScroungerOfSouls.java | 31 ++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 8 +++-- 4 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/d/DutifulServants.java create mode 100644 Mage.Sets/src/mage/cards/r/RampagingHippo.java create mode 100644 Mage.Sets/src/mage/cards/s/ScroungerOfSouls.java diff --git a/Mage.Sets/src/mage/cards/d/DutifulServants.java b/Mage.Sets/src/mage/cards/d/DutifulServants.java new file mode 100644 index 0000000000..d09dfcf50f --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DutifulServants.java @@ -0,0 +1,26 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +public class DutifulServants extends CardImpl { + + public DutifulServants(UUID ownerId, CardSetInfo cardSetInfo){ + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); + subtype.add("Zombie"); + power = new MageInt(2); + toughness = new MageInt(5); + } + + public DutifulServants(final DutifulServants dutifulServants){ + super(dutifulServants); + } + + public DutifulServants copy(){ + return new DutifulServants(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RampagingHippo.java b/Mage.Sets/src/mage/cards/r/RampagingHippo.java new file mode 100644 index 0000000000..ff5286a99d --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RampagingHippo.java @@ -0,0 +1,35 @@ +package mage.cards.r; + +import mage.MageInt; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +public class RampagingHippo extends CardImpl { + + public RampagingHippo(UUID cardID, CardSetInfo cardSetInfo){ + super(cardID, cardSetInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); + subtype.add("Hippo"); + power = new MageInt(5); + toughness = new MageInt(6); + + // Trample + addAbility(TrampleAbility.getInstance()); + + // Cycling {2} + addAbility(new CyclingAbility(new ManaCostsImpl("2"))); + } + + public RampagingHippo(final RampagingHippo rampagingHippo){ + super(rampagingHippo); + } + + public RampagingHippo copy(){ + return new RampagingHippo(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/ScroungerOfSouls.java b/Mage.Sets/src/mage/cards/s/ScroungerOfSouls.java new file mode 100644 index 0000000000..c684ab11cd --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ScroungerOfSouls.java @@ -0,0 +1,31 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +public class ScroungerOfSouls extends CardImpl { + + public ScroungerOfSouls(UUID cardID, CardSetInfo cardSetInfo){ + super(cardID, cardSetInfo, new CardType[]{CardType.CREATURE}, "{4}{B}"); + subtype.add("Horror"); + + power = new MageInt(3); + toughness = new MageInt(4); + + // Lifelink + addAbility(LifelinkAbility.getInstance()); + + } + + public ScroungerOfSouls(final ScroungerOfSouls scroungerOfSouls){ + super(scroungerOfSouls); + } + public ScroungerOfSouls copy(){ + return new ScroungerOfSouls(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index d44af937ff..bc16f25bcb 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -27,8 +27,6 @@ */ package mage.sets; -import java.util.ArrayList; -import java.util.List; import mage.cards.CardGraphicInfo; import mage.cards.ExpansionSet; import mage.cards.FrameStyle; @@ -38,6 +36,9 @@ import mage.cards.repository.CardRepository; import mage.constants.Rarity; import mage.constants.SetType; +import java.util.ArrayList; +import java.util.List; + /** * @author fireshoes */ @@ -88,6 +89,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Dutiful Servants", 12, Rarity.COMMON, mage.cards.d.DutifulServants.class)); cards.add(new SetCardInfo("Earthshaker Khenra", 90, Rarity.RARE, mage.cards.e.EarthshakerKhenra.class)); cards.add(new SetCardInfo("Fervent Paincaster", 91, Rarity.UNCOMMON, mage.cards.f.FerventPaincaster.class)); cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); @@ -116,6 +118,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Plains", 185, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Pride Sovereign", 126, Rarity.RARE, mage.cards.p.PrideSovereign.class)); cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); + cards.add(new SetCardInfo("Rampaging Hippo", 128, Rarity.COMMON, mage.cards.r.RampagingHippo.class)); cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); cards.add(new SetCardInfo("Ramunap Hydra", 130, Rarity.RARE, mage.cards.r.RamunapHydra.class)); cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); @@ -124,6 +127,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); cards.add(new SetCardInfo("Sand Strangler", 107, Rarity.UNCOMMON, mage.cards.s.SandStrangler.class)); cards.add(new SetCardInfo("Sandblast", 20, Rarity.COMMON, mage.cards.s.Sandblast.class)); + cards.add(new SetCardInfo("Scrounger of Souls", 76, Rarity.COMMON, mage.cards.s.ScroungerOfSouls.class)); cards.add(new SetCardInfo("Sidewinder Naga", 134, Rarity.COMMON, mage.cards.s.SidewinderNaga.class)); cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); From 310ac060e2d3a864196bb18b11bc4a3f00c4b716 Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sun, 2 Jul 2017 08:32:17 -0400 Subject: [PATCH 091/160] Format Fix --- Mage.Sets/src/mage/cards/a/AdornedPouncer.java | 12 ++++++++---- Mage.Sets/src/mage/cards/b/BeneathTheSands.java | 8 +++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AdornedPouncer.java b/Mage.Sets/src/mage/cards/a/AdornedPouncer.java index d40fcd32a4..37168837e6 100644 --- a/Mage.Sets/src/mage/cards/a/AdornedPouncer.java +++ b/Mage.Sets/src/mage/cards/a/AdornedPouncer.java @@ -1,5 +1,6 @@ package mage.cards.a; +import mage.MageInt; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.keyword.DoubleStrikeAbility; import mage.abilities.keyword.EternalizeAbility; @@ -9,13 +10,16 @@ import mage.constants.CardType; import java.util.UUID; -public class AdornedPouncer extends CardImpl{ +public class AdornedPouncer extends CardImpl { - public AdornedPouncer(UUID ownerId, CardSetInfo cardSetInfo){ + public AdornedPouncer(UUID ownerId, CardSetInfo cardSetInfo) { super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); subtype.add("Cat"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + //double strike addAbility(DoubleStrikeAbility.getInstance()); @@ -23,11 +27,11 @@ public class AdornedPouncer extends CardImpl{ addAbility(new EternalizeAbility(new ManaCostsImpl("{3}{W}{W}"), this)); } - public AdornedPouncer(AdornedPouncer adornedPouncer){ + public AdornedPouncer(AdornedPouncer adornedPouncer) { super(adornedPouncer); } - public AdornedPouncer copy(){ + public AdornedPouncer copy() { return new AdornedPouncer(this); } } diff --git a/Mage.Sets/src/mage/cards/b/BeneathTheSands.java b/Mage.Sets/src/mage/cards/b/BeneathTheSands.java index 2be5891744..d75e7b87f6 100644 --- a/Mage.Sets/src/mage/cards/b/BeneathTheSands.java +++ b/Mage.Sets/src/mage/cards/b/BeneathTheSands.java @@ -5,7 +5,6 @@ */ package mage.cards.b; - import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.abilities.keyword.CyclingAbility; @@ -24,12 +23,11 @@ import java.util.UUID; public class BeneathTheSands extends CardImpl { public BeneathTheSands(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{G}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}"); // Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(new FilterBasicLandCard()), true, true)); - + // Cycling {2} this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); } @@ -42,4 +40,4 @@ public class BeneathTheSands extends CardImpl { public BeneathTheSands copy() { return new BeneathTheSands(this); } -} \ No newline at end of file +} From e0464635c47bda4274bc70314a0bd41b51b1dcf8 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 2 Jul 2017 22:48:00 +1000 Subject: [PATCH 092/160] Implement 2 cards (HOU) --- .../src/mage/cards/t/TenaciousHunter.java | 91 +++++++++++++++++++ Mage.Sets/src/mage/cards/t/ThornedMoloch.java | 77 ++++++++++++++++ Mage.Sets/src/mage/cards/t/TragicLesson.java | 3 +- .../src/mage/sets/HourOfDevastation.java | 2 + 4 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/t/TenaciousHunter.java create mode 100644 Mage.Sets/src/mage/cards/t/ThornedMoloch.java diff --git a/Mage.Sets/src/mage/cards/t/TenaciousHunter.java b/Mage.Sets/src/mage/cards/t/TenaciousHunter.java new file mode 100644 index 0000000000..82d6d6eb50 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TenaciousHunter.java @@ -0,0 +1,91 @@ +/* + * 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.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.CounterPredicate; + +/** + * + * @author spjspj + */ +public class TenaciousHunter extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature has a -1/-1 counter on it"); + + static { + filter.add(new CounterPredicate(CounterType.M1M1)); + } + + public TenaciousHunter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); + + this.subtype.add("Crocodile"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // As long as a creature has a -1/-1 counter on it, Tenacious Hunter has vigilance and deathtouch. + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, + new ConditionalContinuousEffect(new GainAbilitySourceEffect(VigilanceAbility.getInstance()), + new PermanentsOnTheBattlefieldCondition(filter), + "{this} has Vigilance as long as a creature has a -1/-1 counter on it" + ) + ); + + ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(DeathtouchAbility.getInstance()), + new PermanentsOnTheBattlefieldCondition(filter), + "{this} has Deathtouch as long as a creature has a -1/-1 counter on it" + ) + ); + + this.addAbility(ability); + } + + public TenaciousHunter(final TenaciousHunter card) { + super(card); + } + + @Override + public TenaciousHunter copy() { + return new TenaciousHunter(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/ThornedMoloch.java b/Mage.Sets/src/mage/cards/t/ThornedMoloch.java new file mode 100644 index 0000000000..54275a0f47 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/ThornedMoloch.java @@ -0,0 +1,77 @@ +/* + * 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.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.SourceAttackingCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.ProwessAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; + +/** + * + * @author spjspj + */ +public class ThornedMoloch extends CardImpl { + + public ThornedMoloch(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add("Lizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Prowess + this.addAbility(new ProwessAbility()); + + // Thorned Moloch has first strike as long as it's attacking. + this.addAbility( + new SimpleStaticAbility( + Zone.BATTLEFIELD, + new ConditionalContinuousEffect(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance()), SourceAttackingCondition.instance, "{this} has first strike as long as it's attacking") + ) + ); + + } + + public ThornedMoloch(final ThornedMoloch card) { + super(card); + } + + @Override + public ThornedMoloch copy() { + return new ThornedMoloch(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TragicLesson.java b/Mage.Sets/src/mage/cards/t/TragicLesson.java index f728e0ff65..7ce12df4e3 100644 --- a/Mage.Sets/src/mage/cards/t/TragicLesson.java +++ b/Mage.Sets/src/mage/cards/t/TragicLesson.java @@ -33,6 +33,7 @@ import mage.abilities.costs.Cost; import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -98,7 +99,7 @@ class TragicLessonEffect extends OneShotEffect { Cost cost = new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)); if (cost.canPay(source, source.getSourceId(), controller.getId(), game)) { if (cost.pay(source, game, source.getSourceId(), controller.getId(), false, null)) { - return true; + return true; } } } diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index d44af937ff..e1895efa3c 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -134,9 +134,11 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Swarm Intelligence", 50, Rarity.RARE, mage.cards.s.SwarmIntelligence.class)); + cards.add(new SetCardInfo("Tenacious Hunter", 136, Rarity.UNCOMMON, mage.cards.t.TenaciousHunter.class)); cards.add(new SetCardInfo("The Locust God", 139, Rarity.MYTHIC, mage.cards.t.TheLocustGod.class)); cards.add(new SetCardInfo("The Scarab God", 145, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); cards.add(new SetCardInfo("The Scorpion God", 146, Rarity.MYTHIC, mage.cards.t.TheScorpionGod.class)); + cards.add(new SetCardInfo("Thorned Moloch", 108, Rarity.COMMON, mage.cards.t.ThornedMoloch.class)); cards.add(new SetCardInfo("Torment of Hailfire", 77, Rarity.RARE, mage.cards.t.TormentOfHailfire.class)); cards.add(new SetCardInfo("Torment of Scarabs", 78, Rarity.UNCOMMON, mage.cards.t.TormentOfScarabs.class)); cards.add(new SetCardInfo("Torment of Venom", 79, Rarity.COMMON, mage.cards.t.TormentOfVenom.class)); From 126a95bd1cbab935f205d1812233400f9330eaab Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sun, 2 Jul 2017 08:58:37 -0400 Subject: [PATCH 093/160] Aven of Enduring Hope --- Mage.Sets/src/mage/cards/a/ActOfHeroism.java | 28 +++++++- .../src/mage/cards/a/AdornedPouncer.java | 27 ++++++++ .../src/mage/cards/a/AvenOfEnduringHope.java | 68 +++++++++++++++++++ .../src/mage/cards/b/BeneathTheSands.java | 28 +++++++- .../src/mage/sets/HourOfDevastation.java | 1 + 5 files changed, 146 insertions(+), 6 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/a/AvenOfEnduringHope.java diff --git a/Mage.Sets/src/mage/cards/a/ActOfHeroism.java b/Mage.Sets/src/mage/cards/a/ActOfHeroism.java index d69a6fe12b..eb8192306f 100644 --- a/Mage.Sets/src/mage/cards/a/ActOfHeroism.java +++ b/Mage.Sets/src/mage/cards/a/ActOfHeroism.java @@ -1,7 +1,29 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. + * 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.a; diff --git a/Mage.Sets/src/mage/cards/a/AdornedPouncer.java b/Mage.Sets/src/mage/cards/a/AdornedPouncer.java index 37168837e6..21c58af83c 100644 --- a/Mage.Sets/src/mage/cards/a/AdornedPouncer.java +++ b/Mage.Sets/src/mage/cards/a/AdornedPouncer.java @@ -1,3 +1,30 @@ +/* + * 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.a; import mage.MageInt; diff --git a/Mage.Sets/src/mage/cards/a/AvenOfEnduringHope.java b/Mage.Sets/src/mage/cards/a/AvenOfEnduringHope.java new file mode 100644 index 0000000000..a7d3516bc0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AvenOfEnduringHope.java @@ -0,0 +1,68 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author Archer262 + */ +public class AvenOfEnduringHope extends CardImpl { + + public AvenOfEnduringHope(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}"); + + this.subtype.add("Bird"); + this.subtype.add("Cleric"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Aven of Enduring Hope enters the battlefield, you gain 3 life. + this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3), false)); + } + + public AvenOfEnduringHope(final AvenOfEnduringHope card) { + super(card); + } + + @Override + public AvenOfEnduringHope copy() { + return new AvenOfEnduringHope(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BeneathTheSands.java b/Mage.Sets/src/mage/cards/b/BeneathTheSands.java index d75e7b87f6..a88c368ba2 100644 --- a/Mage.Sets/src/mage/cards/b/BeneathTheSands.java +++ b/Mage.Sets/src/mage/cards/b/BeneathTheSands.java @@ -1,7 +1,29 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. + * 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.b; diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 4bd46d3675..f2f395bef2 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -70,6 +70,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); + cards.add(new SetCardInfo("Aven of Enduring Hope", 5, Rarity.COMMON, mage.cards.a.AvenOfEnduringHope.class)); cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); cards.add(new SetCardInfo("Beneath The Sands", 111, Rarity.COMMON, mage.cards.b.BeneathTheSands.class)); cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); From 7028f8ee3d75fce0d2534508e44b87cd705e1f65 Mon Sep 17 00:00:00 2001 From: igoudt Date: Sun, 2 Jul 2017 15:36:18 +0200 Subject: [PATCH 094/160] implement Chaos Maw --- Mage.Sets/src/mage/cards/c/ChaosMaw.java | 36 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + .../test/cards/single/hou/ChaosMawTest.java | 28 +++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/ChaosMaw.java create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/hou/ChaosMawTest.java diff --git a/Mage.Sets/src/mage/cards/c/ChaosMaw.java b/Mage.Sets/src/mage/cards/c/ChaosMaw.java new file mode 100644 index 0000000000..32cb6aaf00 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChaosMaw.java @@ -0,0 +1,36 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DamageAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; + +import java.util.UUID; + +public class ChaosMaw extends CardImpl { + private static FilterCreaturePermanent filter = new FilterCreaturePermanent("other creature"); + static { + filter.add(new AnotherPredicate()); + } + public ChaosMaw(UUID ownerId, CardSetInfo cardSetInfo){ + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}"); + subtype.add("Hellion"); + power = new MageInt(6); + toughness = new MageInt(6); + + // When Chaos Maw enters the battlefield, it deals 3 damage to each other creature + addAbility(new EntersBattlefieldTriggeredAbility(new DamageAllEffect(3, filter))); + } + + public ChaosMaw(final ChaosMaw chaosMaw){ + super(chaosMaw); + } + + public ChaosMaw copy(){ + return new ChaosMaw(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index bc16f25bcb..705461134c 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -76,6 +76,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); cards.add(new SetCardInfo("Champion of Wits", 31, Rarity.RARE, mage.cards.c.ChampionOfWits.class)); cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); + cards.add(new SetCardInfo("Chaos Maw", 87, Rarity.RARE, mage.cards.c.ChaosMaw.class)); cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); cards.add(new SetCardInfo("Claim // Fame", 150, Rarity.UNCOMMON, mage.cards.c.ClaimFame.class)); cards.add(new SetCardInfo("Crook of Condemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfCondemnation.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/ChaosMawTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/ChaosMawTest.java new file mode 100644 index 0000000000..33084c5154 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/hou/ChaosMawTest.java @@ -0,0 +1,28 @@ +package org.mage.test.cards.single.hou; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class ChaosMawTest extends CardTestPlayerBase { + + private String chaosMaw = "Chaos Maw"; + + @Test + public void testChaosMaw(){ + addCard(Zone.HAND, playerA, chaosMaw, 1); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 10); + addCard(Zone.BATTLEFIELD, playerA, "Grizzly Bears", 1); + addCard(Zone.BATTLEFIELD, playerB, "Savannah Lions", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, chaosMaw ); + + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + + execute(); + + assertGraveyardCount(playerA, "Grizzly Bears", 1); + assertGraveyardCount(playerB, "Savannah Lions", 1); + } +} From aa1f401a25a396011ddbc32d85200be468fb0a38 Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sun, 2 Jul 2017 09:45:50 -0400 Subject: [PATCH 095/160] Dauntless Aven --- Mage.Sets/src/mage/cards/d/DauntlessAven.java | 73 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 74 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DauntlessAven.java diff --git a/Mage.Sets/src/mage/cards/d/DauntlessAven.java b/Mage.Sets/src/mage/cards/d/DauntlessAven.java new file mode 100644 index 0000000000..b74b7a9d01 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DauntlessAven.java @@ -0,0 +1,73 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author Archer262 + */ +public class DauntlessAven extends CardImpl { + + public DauntlessAven(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add("Bird"); + this.subtype.add("Warrior"); + + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Dauntless Aven attacks, untap target creature you control. + Ability ability = new AttacksTriggeredAbility(new UntapTargetEffect(), false); + ability.addTarget(new TargetControlledCreaturePermanent(1, 1)); + this.addAbility(ability); + } + + public DauntlessAven(final DauntlessAven card) { + super(card); + } + + @Override + public DauntlessAven copy() { + return new DauntlessAven(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index f2f395bef2..77addbc1c6 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -81,6 +81,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); cards.add(new SetCardInfo("Claim // Fame", 150, Rarity.UNCOMMON, mage.cards.c.ClaimFame.class)); cards.add(new SetCardInfo("Crook of Condemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfCondemnation.class)); + cards.add(new SetCardInfo("Dauntless Aven", 7, Rarity.COMMON, mage.cards.d.DauntlessAven.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); cards.add(new SetCardInfo("Desert of the Glorified", 171, Rarity.COMMON, mage.cards.d.DesertOfTheGlorified.class)); From fe921f4d00942bc43b23266e494ccf0c870c490a Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sun, 2 Jul 2017 09:57:02 -0400 Subject: [PATCH 096/160] Disposal Mummy --- Mage.Sets/src/mage/cards/d/DisposalMummy.java | 70 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 71 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DisposalMummy.java diff --git a/Mage.Sets/src/mage/cards/d/DisposalMummy.java b/Mage.Sets/src/mage/cards/d/DisposalMummy.java new file mode 100644 index 0000000000..b3e82deac7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DisposalMummy.java @@ -0,0 +1,70 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterCard; +import mage.target.Target; +import mage.target.common.TargetCardInOpponentsGraveyard; + +/** + * + * @author Archer262 + */ +public class DisposalMummy extends CardImpl { + + public DisposalMummy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add("Zombie"); + this.subtype.add("Jackal"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // When Disposal Mummy enters the battlefield, exile target card from an opponent's graveyard. + Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect()); + Target target = new TargetCardInOpponentsGraveyard(new FilterCard("card from an opponent's graveyard")); + ability.addTarget(target); + this.addAbility(ability); + } + + public DisposalMummy(final DisposalMummy card) { + super(card); + } + + @Override + public DisposalMummy copy() { + return new DisposalMummy(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 77addbc1c6..1dbe284f58 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -89,6 +89,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); + cards.add(new SetCardInfo("Disposal Mummy", 9, Rarity.COMMON, mage.cards.d.DisposalMummy.class)); cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); From e64a7ad5f7c07fca5f0eba19e73f22e92b957c6f Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sun, 2 Jul 2017 10:02:17 -0400 Subject: [PATCH 097/160] Djeru's Renunciation --- .../src/mage/cards/d/DjerusRenunciation.java | 65 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 66 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DjerusRenunciation.java diff --git a/Mage.Sets/src/mage/cards/d/DjerusRenunciation.java b/Mage.Sets/src/mage/cards/d/DjerusRenunciation.java new file mode 100644 index 0000000000..f5fbdae647 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DjerusRenunciation.java @@ -0,0 +1,65 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.TapTargetEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Archer262 + */ +public class DjerusRenunciation extends CardImpl { + + public DjerusRenunciation(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); + + // Tap up to two target creatures. + this.getSpellAbility().addEffect(new TapTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); + + // Cycling {W} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{W}"))); + + } + + public DjerusRenunciation(final DjerusRenunciation card) { + super(card); + } + + @Override + public DjerusRenunciation copy() { + return new DjerusRenunciation(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 1dbe284f58..26b77489b9 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -90,6 +90,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); cards.add(new SetCardInfo("Disposal Mummy", 9, Rarity.COMMON, mage.cards.d.DisposalMummy.class)); + cards.add(new SetCardInfo("Djeru's Renunciation", 11, Rarity.COMMON, mage.cards.d.DjerusRenunciation.class)); cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); From a8235e414a1a222838be17d4f253039dc035f25f Mon Sep 17 00:00:00 2001 From: Archer262 Date: Sun, 2 Jul 2017 10:04:21 -0400 Subject: [PATCH 098/160] Dutiful Servants --- .../src/mage/cards/d/DutifulServants.java | 58 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 59 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DutifulServants.java diff --git a/Mage.Sets/src/mage/cards/d/DutifulServants.java b/Mage.Sets/src/mage/cards/d/DutifulServants.java new file mode 100644 index 0000000000..f8b011e350 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DutifulServants.java @@ -0,0 +1,58 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author Archer262 + */ +public class DutifulServants extends CardImpl { + + public DutifulServants(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); + + this.subtype.add("Zombie"); + this.power = new MageInt(2); + this.toughness = new MageInt(5); + } + + public DutifulServants(final DutifulServants card) { + super(card); + } + + @Override + public DutifulServants copy() { + return new DutifulServants(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 26b77489b9..ea8fad4b47 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -94,6 +94,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Dutiful Servants", 12, Rarity.COMMON, mage.cards.d.DutifulServants.class)); cards.add(new SetCardInfo("Earthshaker Khenra", 90, Rarity.RARE, mage.cards.e.EarthshakerKhenra.class)); cards.add(new SetCardInfo("Fervent Paincaster", 91, Rarity.UNCOMMON, mage.cards.f.FerventPaincaster.class)); cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); From c3c09eab2c26dca07bd1ae8269fc4389cf4a0bcb Mon Sep 17 00:00:00 2001 From: spjspj Date: Mon, 3 Jul 2017 00:23:05 +1000 Subject: [PATCH 099/160] Implement 2 cards (HOU) --- .../src/mage/cards/s/SunscourgeChampion.java | 109 ++++++++++++++++++ .../src/mage/cards/s/SurvivorsEncampment.java | 78 +++++++++++++ .../src/mage/sets/HourOfDevastation.java | 2 + 3 files changed, 189 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SunscourgeChampion.java create mode 100644 Mage.Sets/src/mage/cards/s/SurvivorsEncampment.java diff --git a/Mage.Sets/src/mage/cards/s/SunscourgeChampion.java b/Mage.Sets/src/mage/cards/s/SunscourgeChampion.java new file mode 100644 index 0000000000..1b8287d127 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SunscourgeChampion.java @@ -0,0 +1,109 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.EternalizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author spjspj + */ +public class SunscourgeChampion extends CardImpl { + + private static String rule = "Eternalize - {2}{W}{W}, Discard a card ({2}{W}{W}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie"; + + public SunscourgeChampion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // When Sunscourge Champion enters the battlefield, you gain life equal to its power. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SunscourgeChampionEffect(), false)); + + // Eternalize - {2}{W}{W}, Discard a card. + EternalizeAbility ability = new EternalizeAbility(new ManaCostsImpl("{2}{W}{W}"), this, rule); + ability.addCost(new DiscardCardCost()); + this.addAbility(ability); + } + + public SunscourgeChampion(final SunscourgeChampion card) { + super(card); + } + + @Override + public SunscourgeChampion copy() { + return new SunscourgeChampion(this); + } +} + +class SunscourgeChampionEffect extends OneShotEffect { + + public SunscourgeChampionEffect() { + super(Outcome.Benefit); + staticText = "you gain life equal to its power."; + } + + public SunscourgeChampionEffect(final SunscourgeChampionEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && permanent != null && sourceObject != null) { + controller.gainLife(permanent.getPower().getValue(), game); + return true; + } + return false; + } + + @Override + public SunscourgeChampionEffect copy() { + return new SunscourgeChampionEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SurvivorsEncampment.java b/Mage.Sets/src/mage/cards/s/SurvivorsEncampment.java new file mode 100644 index 0000000000..004a584646 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SurvivorsEncampment.java @@ -0,0 +1,78 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.common.TapTargetCost; +import mage.abilities.mana.AnyColorManaAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import static mage.cards.s.SpellstutterSprite.filter; +import mage.constants.CardType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author spjspj + */ +public class SurvivorsEncampment extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("an untapped creature you control"); + + static { + filter.add(Predicates.not(new TappedPredicate())); + } + + public SurvivorsEncampment(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + this.subtype.add("Desert"); + + // {T}: Add {C} to your mana pool. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Tap an untapped creature you control: Add one mana of any color to your mana pool. + Ability ability = new AnyColorManaAbility(); + ability.addCost(new TapTargetCost(new TargetControlledPermanent(filter))); + this.addAbility(ability); + } + + public SurvivorsEncampment(final SurvivorsEncampment card) { + super(card); + } + + @Override + public SurvivorsEncampment copy() { + return new SurvivorsEncampment(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index e1895efa3c..4644a6b653 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -130,8 +130,10 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); cards.add(new SetCardInfo("Strategic Planning", 47, Rarity.COMMON, mage.cards.s.StrategicPlanning.class)); cards.add(new SetCardInfo("Struggle // Survive", 151, Rarity.UNCOMMON, mage.cards.s.StruggleSurvive.class)); + cards.add(new SetCardInfo("Sunscourge Champion", 26, Rarity.UNCOMMON, mage.cards.s.SunscourgeChampion.class)); cards.add(new SetCardInfo("Sunset Pyramid", 166, Rarity.UNCOMMON, mage.cards.s.SunsetPyramid.class)); cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); + cards.add(new SetCardInfo("Survivors' Encampment", 184, Rarity.COMMON, mage.cards.s.SurvivorsEncampment.class)); cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Swarm Intelligence", 50, Rarity.RARE, mage.cards.s.SwarmIntelligence.class)); cards.add(new SetCardInfo("Tenacious Hunter", 136, Rarity.UNCOMMON, mage.cards.t.TenaciousHunter.class)); From 3debc25a5602a176a5b118ebd30cde4bcdf97be0 Mon Sep 17 00:00:00 2001 From: nickymikail Date: Sun, 2 Jul 2017 10:04:34 -0700 Subject: [PATCH 100/160] suggested fixes --- Mage.Sets/src/mage/cards/l/LurchingRotbeast.java | 2 +- Mage.Sets/src/mage/cards/o/OketrasAvenger.java | 4 ++-- Mage.Sets/src/mage/cards/r/RuinRat.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/cards/l/LurchingRotbeast.java b/Mage.Sets/src/mage/cards/l/LurchingRotbeast.java index 72cc70c41c..994daf31c6 100644 --- a/Mage.Sets/src/mage/cards/l/LurchingRotbeast.java +++ b/Mage.Sets/src/mage/cards/l/LurchingRotbeast.java @@ -38,7 +38,7 @@ import mage.constants.CardType; /** * - * @author anonymous + * @author nickymikail */ public class LurchingRotbeast extends CardImpl { diff --git a/Mage.Sets/src/mage/cards/o/OketrasAvenger.java b/Mage.Sets/src/mage/cards/o/OketrasAvenger.java index 9d994c96cf..1f0e4cc171 100644 --- a/Mage.Sets/src/mage/cards/o/OketrasAvenger.java +++ b/Mage.Sets/src/mage/cards/o/OketrasAvenger.java @@ -27,8 +27,6 @@ */ package mage.cards.o; -import java.util.UUID; - import mage.MageInt; import mage.abilities.common.BecomesExertSourceTriggeredAbility; import mage.abilities.effects.common.PreventCombatDamageToSourceEffect; @@ -38,6 +36,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import java.util.UUID; + /** * * @author nickymikail diff --git a/Mage.Sets/src/mage/cards/r/RuinRat.java b/Mage.Sets/src/mage/cards/r/RuinRat.java index e63e6c0b49..db5f2802ae 100644 --- a/Mage.Sets/src/mage/cards/r/RuinRat.java +++ b/Mage.Sets/src/mage/cards/r/RuinRat.java @@ -41,7 +41,7 @@ import mage.constants.CardType; /** * - * @author anonymous + * @author nickymikail */ public class RuinRat extends CardImpl { From 8e4f47894692baf311e403e86201c2d273416f04 Mon Sep 17 00:00:00 2001 From: spjspj Date: Mon, 3 Jul 2017 09:08:24 +1000 Subject: [PATCH 101/160] Implement 2 cards (HOU) --- .../main/java/mage/abilities/keyword/EternalizeAbility.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java b/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java index 28d9aec01c..0fa338038b 100644 --- a/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java @@ -58,6 +58,11 @@ public class EternalizeAbility extends ActivatedAbilityImpl { this.timing = TimingRule.SORCERY; setRule(cost, card); } + + public EternalizeAbility(Cost cost, Card card, String rule) { + this(cost, card); + this.rule = rule; + } public EternalizeAbility(final EternalizeAbility ability) { super(ability); From a3ea1a8f498205c56f91f98ca7bd9dd823984248 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 3 Jul 2017 08:58:48 +0200 Subject: [PATCH 102/160] [HOU] Added 2 cards. --- .../src/mage/cards/a/AppealAuthority.java | 91 +++++++++++++++++++ .../src/mage/cards/b/BurningFistMinotaur.java | 75 +++++++++++++++ .../src/mage/cards/c/ConsignOblivion.java | 61 +++++++++++++ .../src/mage/sets/HourOfDevastation.java | 2 + Utils/cardClass.tmpl | 4 +- Utils/cardSplitClass.tmpl | 11 ++- Utils/gen-card.pl | 8 +- Utils/mtg-cards-data.txt | 10 +- 8 files changed, 248 insertions(+), 14 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/a/AppealAuthority.java create mode 100644 Mage.Sets/src/mage/cards/b/BurningFistMinotaur.java create mode 100644 Mage.Sets/src/mage/cards/c/ConsignOblivion.java diff --git a/Mage.Sets/src/mage/cards/a/AppealAuthority.java b/Mage.Sets/src/mage/cards/a/AppealAuthority.java new file mode 100644 index 0000000000..b8acda0f7b --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AppealAuthority.java @@ -0,0 +1,91 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.TapTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SpellAbilityType; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class AppealAuthority extends SplitCard { + + public AppealAuthority(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, new CardType[]{CardType.SORCERY}, "{G}", "{1}{W}", SpellAbilityType.SPLIT_AFTERMATH); + + // Appeal + // Until end of turn, target creature gains trample and gets +X/+X, where X is the number of creatures you control. + getLeftHalfCard().getSpellAbility().addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn) + .setText("Until end of turn, target creature gains trample")); + DynamicValue controlledCreatures = new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent("the number of creatures you control")); + getLeftHalfCard().getSpellAbility().addEffect(new BoostTargetEffect(controlledCreatures, controlledCreatures, Duration.EndOfTurn, true) + .setText("and gets +X/+X, where X is the number of creatures you control")); + getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // Authority + // Aftermath + ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true)); + // Tap up to two target creatures your opponents control. Creatures you control gain vigilance until end of turn. + getRightHalfCard().getSpellAbility().addEffect(new TapTargetEffect()); + FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures your opponents control"); + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2, filter, false)); + getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(VigilanceAbility.getInstance(), + Duration.EndOfTurn, new FilterControlledCreaturePermanent("creatures"))); + + } + + public AppealAuthority(final AppealAuthority card) { + super(card); + } + + @Override + public AppealAuthority copy() { + return new AppealAuthority(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BurningFistMinotaur.java b/Mage.Sets/src/mage/cards/b/BurningFistMinotaur.java new file mode 100644 index 0000000000..518d7b2b50 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BurningFistMinotaur.java @@ -0,0 +1,75 @@ +/* + * 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.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; + +/** + * + * @author LevelX2 + */ +public class BurningFistMinotaur extends CardImpl { + + public BurningFistMinotaur(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add("Minotaur"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // {1}{R}, Discard a card: Burning-Fist Minotaur gets +2/+0 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(2, 0, Duration.EndOfTurn), new ManaCostsImpl("{1}{R}")); + ability.addCost(new DiscardCardCost()); + this.addAbility(ability); + } + + public BurningFistMinotaur(final BurningFistMinotaur card) { + super(card); + } + + @Override + public BurningFistMinotaur copy() { + return new BurningFistMinotaur(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/ConsignOblivion.java b/Mage.Sets/src/mage/cards/c/ConsignOblivion.java new file mode 100644 index 0000000000..99ece4cefa --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ConsignOblivion.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.cards.c; + +import java.util.UUID; + +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.SpellAbilityType; + +/** + * + * @author LevelX2 + */ +public class ConsignOblivion extends SplitCard { + + public ConsignOblivion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{}, new CardType[]{}, "", "", SpellAbilityType.SPLIT_AFTERMATH); + + + getLeftHalfCard().getSpellAbility().addEffect(new Effect...); + + getRightHalfCard().getSpellAbility().addEffect(new Effect...); + + } + + public ConsignOblivion(final ConsignOblivion card) { + super(card); + } + + @Override + public ConsignOblivion copy() { + return new ConsignOblivion(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index d44af937ff..bc99d5ab90 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -69,9 +69,11 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); + cards.add(new SetCardInfo("Appeal // Authority", 152, Rarity.UNCOMMON, mage.cards.a.AppealAuthority.class)); cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); cards.add(new SetCardInfo("Brambleweft Behemoth", 202, Rarity.COMMON, mage.cards.b.BrambleweftBehemoth.class)); + cards.add(new SetCardInfo("Burning-Fist Minotaur", 85, Rarity.UNCOMMON, mage.cards.b.BurningFistMinotaur.class)); cards.add(new SetCardInfo("Carrion Screecher", 61, Rarity.COMMON, mage.cards.c.CarrionScreecher.class)); cards.add(new SetCardInfo("Champion of Wits", 31, Rarity.RARE, mage.cards.c.ChampionOfWits.class)); cards.add(new SetCardInfo("Chandra's Defeat", 86, Rarity.UNCOMMON, mage.cards.c.ChandrasDefeat.class)); diff --git a/Utils/cardClass.tmpl b/Utils/cardClass.tmpl index 27c2518e07..e5afa68f0a 100644 --- a/Utils/cardClass.tmpl +++ b/Utils/cardClass.tmpl @@ -29,7 +29,7 @@ package mage.cards.[=$cardNameFirstLetter=]; import java.util.UUID;[= if ($power || $power eq 0) { - if ($planeswalker) { + if ($planeswalker eq 'true') { $OUT .= "\nimport mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;" }else { $OUT .= "\nimport mage.MageInt;" @@ -50,7 +50,7 @@ public class [=$className=] extends CardImpl { super(ownerId, setInfo, new CardType[]{[=$type=]}, "[=$manaCost=]"); [=$subType=][=$colors=][= if ($power || $power eq 0) { - if ($planeswalker) { + if ($planeswalker eq 'true') { $OUT .= "\n this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility($power));"; } else { $OUT .= "\n this.power = new MageInt($power);"; diff --git a/Utils/cardSplitClass.tmpl b/Utils/cardSplitClass.tmpl index 478db2e8ca..ca0c7bcf70 100644 --- a/Utils/cardSplitClass.tmpl +++ b/Utils/cardSplitClass.tmpl @@ -32,6 +32,7 @@ import java.util.UUID; import mage.cards.CardSetInfo; import mage.cards.SplitCard; import mage.constants.CardType; +import mage.constants.SpellAbilityType; /** * @@ -40,16 +41,18 @@ import mage.constants.CardType; public class [=$className=] extends SplitCard { public [=$className=](UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{[=$type=]}, "[=$manaCost=]"); - [=$subType=][=$colors=] - - // super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{3}{R}", "{2}{U}", SpellAbilityType.SPLIT_AFTERMATH); + super(ownerId, setInfo, new CardType[]{[=$type=]}, new CardType[]{[=$type=]}, "[=$manaCost=]", "[=$manaCost=]", SpellAbilityType.SPLIT_AFTERMATH); + [=$subType=][=$colors=] [= if ($power || $power eq 0) { $OUT .= "\n this.power = new MageInt($power);"; $OUT .= "\n this.toughness = new MageInt($toughness);"; } =][=$abilities=] + getLeftHalfCard().getSpellAbility().addEffect(new Effect...); + + getRightHalfCard().getSpellAbility().addEffect(new Effect...); + } public [=$className=](final [=$className=] card) { diff --git a/Utils/gen-card.pl b/Utils/gen-card.pl index ceba5aac54..62529529c7 100755 --- a/Utils/gen-card.pl +++ b/Utils/gen-card.pl @@ -174,12 +174,13 @@ foreach my $setName (keys %{$cards{$cardName}}) { unlink $setFileName.".bak"; print "$setFileName\n"; } - -# Generate the the card +print "Generate the card: ".$card[0]."\n"; +# Generate the card my $result; my $template = Text::Template->new(TYPE => 'FILE', SOURCE => $cardTemplate, DELIMITERS => [ '[=', '=]' ]); $vars{'author'} = $author; $vars{'manaCost'} = fixCost($card[4]); +print "cost ".$vars{'manaCost'}."\n"; $vars{'power'} = $card[6]; $vars{'toughness'} = $card[7]; @@ -190,7 +191,8 @@ my $cardAbilities = $card[8]; my $type = $card[5]; while ($type =~ m/([a-zA-Z]+)( )*/g) { if (exists($cardTypes{$1})) { - push(@types, $cardTypes{$1}); + push(@types, $cardTypes{$1}); +print $cardTypes{$1}."\n"; if ($cardTypes{$1} eq $cardTypes{'Planeswalker'}) { $vars{'planeswalker'} = 'true'; $cardAbilities = $card[7]; diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 4ac7296098..97b60e3474 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31651,7 +31651,7 @@ Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counte Solitary Camel|Hour of Devastation|23|C|{2}{W}|Creature - Camel|3|2|Solitary Camel has lifelink as long as you control a desert or there is a desert card in your graveyard. (Damage this creature deals also causes you to gain that much life.)| Steadfast Sentinel|Hour of Devastation|24|C|{3}{W}|Creature - Human Cleric|2|3|Vigilance$Eternalize {4}{W}{W} ({4}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Cleric with no mana cost. Eternalize only as a sorcery.)| Steward of Solidarity|Hour of Devastation|25|U|{1}{W}|Creature - Human Warrior|2|2|{T}, Exert Steward of Solidarity: Create a 1/1 white Warrior creature token with vigilance. (An exerted creature won't untap during your next untap step.)| -Sunscourge Champion|Hour of Devastation|26|U|{2}{W}|Creature - Human Wizard|2|3|When Sunscourge Champion enters the battlefield, you gain life equal to its power.$Eternalize—{2}{W}{W}, Discard a card. ({2}{W}{W}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| +Sunscourge Champion|Hour of Devastation|26|U|{2}{W}|Creature - Human Wizard|2|3|When Sunscourge Champion enters the battlefield, you gain life equal to its power.$Eternalize�{2}{W}{W}, Discard a card. ({2}{W}{W}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| Unconventional Tactics|Hour of Devastation|27|U|{2}{W}|Sorcery|||Target creature gets +3/+3 and gains flying until end of turn.$Whenever a Zombie enters the battlefield under your control, you may pay {W}. If you do, return Unconventional Tactics from your graveyard to your hand.| Vizier of the True|Hour of Devastation|28|U|{3}{W}|Creature - Human Cleric|3|2|You may exert Vizier of the True as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, tap target creature an opponent controls.| Aerial Guide|Hour of Devastation|29|C|{2}{U}|Creature - Drake|2|2|Flying$Whenever Aerial Guide attacks, another target attacking creature gains flying until end of turn.| @@ -31670,11 +31670,11 @@ Ominous Sphinx|Hour of Devastation|41|U|{3}{U}{U}|Creature - Sphinx|4|4|Flying$W Proven Combatant|Hour of Devastation|42|C|{U}|Creature - Human Warrior|1|1|Eternalize {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Warrior with no mana cost. Eternalize only as a sorcery.) | Riddleform|Hour of Devastation|43|U|{1}{U}|Enchantment|||Whenever you cast a noncreature spell, you may have Riddleform become a 3/3 Sphinx creature with flying in addition to its other types until end of turn.${2}{U}: Scry 1.| Seer of the Last Tomorrow|Hour of Devastation|44|C|{2}{U}|Creature - Naga Cleric|1|4|{U}, {T}, Discard a card: Target player puts the top three cards of his or her library into his or her graveyard.| -Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize—{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| +Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize�{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| Spellweaver Eternal|Hour of Devastation|46|C|{1}{U}|Creature - Zombie Naga Wizard|2|1|Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)| Strategic Planning|Hour of Devastation|47|C|{1}{U}|Sorcery|||Look at the top three cards of your library. Put one of them into your hand and the rest in the graveyard.| Striped Riverwinder|Hour of Devastation|48|C|{6}{U}|Creature - Serpent|5|5|Hexproof (This creature can't be the target of spells or abilities your opponents control.)$Cycling {U} ({U}, Discard this card: Draw a card.)| -Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counter target spell unless its controller pays {3}.$• Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| +Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one �$� Counter target spell unless its controller pays {3}.$� Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| Tragic Lesson|Hour of Devastation|51|C|{2}{U}|Instant|||Draw two cards. Then discard a card unless you return a land you control to its owner's hand.| Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| @@ -31687,7 +31687,7 @@ Apocalypse Demon|Hour of Devastation|58|R|{4}{B}{B}|Creature - Demon|0|0|Flying$ Banewhip Punisher|Hour of Devastation|59|U|{2}{B}|Creature - Human Warrior|2|2|When Banewhip Punisher enters the battlefield, you may put a -1/-1 counter on target creature.${B}, Sacrifice Banewhip Punisher: Destroy target creature that has a -1/-1 counter on it.| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| -Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| +Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one �$� Target player exiles a creature he or she controls.$� Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| Dreamstealer|Hour of Devastation|63|R|{2}{B}|Creature - Human Wizard|1|2|Menace$When Dreamstealer deals combat damage to a player, that player discards that many cards.$Eternalize {4}{B}{B} ({4}{B}{B}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| Grisly Survivor|Hour of Devastation|64|C|{2}{B}|Creature - Minotaur Warrior|2|3|Whenever you cycle or discard a card, Grisly Survivor gets +2/+0 until end of turn.| Hour of Glory|Hour of Devastation|65|R|{3}{B}|Instant|||Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature.| @@ -31779,7 +31779,7 @@ Claim // Fame|Hour of Devastation|150|U|{B}|Sorcery|||Return target creature car Struggle // Survive|Hour of Devastation|151|U|{2}{R}|Instant|||Struggle deals damage to target creature equal to the number of lands you control.$Survive {1}{G}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Each player shuffles his or graveyard into his or her library.| Appeal // Authority|Hour of Devastation|152|U|{G}|Sorcery|||Until end of turn, target creature gains trample and gets +X/+X, where X is the number of creatures you control.$Authority {1}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Tap up to two target creatures your opponents control. Creatures you control gain vigilance until end of turn.| Leave // Chance|Hour of Devastation|153|R|{1}{W}|Instant|||Return any number of target permanents you own to your hand.$Chance {3}{R}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Discard any number of cards, then draw that many cards.| -Reason // Live|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| +Reason // Believe|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| Grind // Dust|Hour of Devastation|155|R|{1}{B}|Sorcery|||Put a -1/-1 counter on each of up to two target creatures.$Dust {3}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Exile any number of target creatures that have -1/-1 counters on them.| Refuse // Cooperate|Hour of Devastation|156|R|{3}{R}|Instant|||Refuse deals damage to target spell's controller equal to that spell's converted mana cost.$Cooperate {2}{U}$Instant$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Copy target instant or sorcery spell. You may choose new targets for the copy.| Driven // Despair|Hour of Devastation|157|R|{1}{G}|Sorcery|||Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."$Despair {1}{B}$Sorcery$Aftermath$Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."| From 7418c01bed80e1077cb2c4593c54be5f0464d2ae Mon Sep 17 00:00:00 2001 From: spjspj Date: Mon, 3 Jul 2017 19:42:53 +1000 Subject: [PATCH 103/160] Implement 5 cards (HOU) --- Mage.Sets/src/mage/cards/s/SifterWurm.java | 113 ++++++++++++++++++ Mage.Sets/src/mage/cards/s/SolitaryCamel.java | 88 ++++++++++++++ .../src/mage/cards/s/SpellweaverEternal.java | 68 +++++++++++ .../src/mage/cards/s/StewardOfSolidarity.java | 76 ++++++++++++ .../src/mage/cards/s/StripedRiverwinder.java | 68 +++++++++++ .../src/mage/sets/HourOfDevastation.java | 5 + 6 files changed, 418 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SifterWurm.java create mode 100644 Mage.Sets/src/mage/cards/s/SolitaryCamel.java create mode 100644 Mage.Sets/src/mage/cards/s/SpellweaverEternal.java create mode 100644 Mage.Sets/src/mage/cards/s/StewardOfSolidarity.java create mode 100644 Mage.Sets/src/mage/cards/s/StripedRiverwinder.java diff --git a/Mage.Sets/src/mage/cards/s/SifterWurm.java b/Mage.Sets/src/mage/cards/s/SifterWurm.java new file mode 100644 index 0000000000..e464f98f74 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SifterWurm.java @@ -0,0 +1,113 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author spjspj + */ +public class SifterWurm extends CardImpl { + + public SifterWurm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}{G}"); + + this.subtype.add("Wurm"); + this.power = new MageInt(7); + this.toughness = new MageInt(7); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // When Sifter Wurm enters the battlefield, scry 3, then reveal the top card of your library. You gain life equal to that card's converted mana cost. + Ability ability = new EntersBattlefieldTriggeredAbility(new SifterWurmEffect()); + this.addAbility(ability); + } + + public SifterWurm(final SifterWurm card) { + super(card); + } + + @Override + public SifterWurm copy() { + return new SifterWurm(this); + } +} + +class SifterWurmEffect extends OneShotEffect { + + public SifterWurmEffect() { + super(Outcome.DrawCard); + this.staticText = "scry 3, then reveal the top card of your library. You gain life equal to that card's converted mana cost."; + } + + public SifterWurmEffect(final SifterWurmEffect effect) { + super(effect); + } + + @Override + public SifterWurmEffect copy() { + return new SifterWurmEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = source.getSourceObject(game); + if (controller != null && sourceObject != null) { + controller.scry(3, source, game); + + Cards cards = new CardsImpl(); + Card card = controller.getLibrary().getFromTop(game); + + if (card != null) { + cards.add(card); + controller.revealCards(sourceObject.getIdName(), cards, game); + controller.gainLife(card.getConvertedManaCost(), game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/s/SolitaryCamel.java b/Mage.Sets/src/mage/cards/s/SolitaryCamel.java new file mode 100644 index 0000000000..aa74ec73a7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SolitaryCamel.java @@ -0,0 +1,88 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.OrCondition; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author spjspj + */ +public class SolitaryCamel extends CardImpl { + + private static final FilterControlledPermanent filterDesertPermanent = new FilterControlledPermanent("Desert"); + private static final FilterCard filterDesertCard = new FilterCard("Desert card"); + + static { + filterDesertPermanent.add(new SubtypePredicate(SubType.DESERT)); + filterDesertCard.add(new SubtypePredicate(SubType.DESERT)); + } + + public SolitaryCamel(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add("Camel"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Solitary Camel has lifelink as long as you control a desert or there is a desert card in your graveyard. + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( + new GainAbilitySourceEffect(LifelinkAbility.getInstance()), + new OrCondition( + new PermanentsOnTheBattlefieldCondition(new FilterControlledPermanent(filterDesertPermanent)), + new CardsInControllerGraveCondition(1, filterDesertCard)), + "{this} has lifelink as long as you control a desert or there is a desert card in your graveyard.")); + this.addAbility(ability); + } + + public SolitaryCamel(final SolitaryCamel card) { + super(card); + } + + @Override + public SolitaryCamel copy() { + return new SolitaryCamel(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SpellweaverEternal.java b/Mage.Sets/src/mage/cards/s/SpellweaverEternal.java new file mode 100644 index 0000000000..9068820ff8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SpellweaverEternal.java @@ -0,0 +1,68 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.AfflictAbility; +import mage.abilities.keyword.ProwessAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author spjspj + */ +public class SpellweaverEternal extends CardImpl { + + public SpellweaverEternal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add("Zombie"); + this.subtype.add("Naga"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Prowess + this.addAbility(new ProwessAbility()); + + // Afflict 2 + this.addAbility(new AfflictAbility(2)); + } + + public SpellweaverEternal(final SpellweaverEternal card) { + super(card); + } + + @Override + public SpellweaverEternal copy() { + return new SpellweaverEternal(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/StewardOfSolidarity.java b/Mage.Sets/src/mage/cards/s/StewardOfSolidarity.java new file mode 100644 index 0000000000..be2ec94b35 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StewardOfSolidarity.java @@ -0,0 +1,76 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.ExertSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.game.permanent.token.WarriorVigilantToken; + +/** + * + * @author spjspj + */ +public class StewardOfSolidarity extends CardImpl { + + public StewardOfSolidarity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add("Human"); + this.subtype.add("Warrior"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {T}, Exert Steward of Solidarity: Create a 1/1 white Warrior creature token with vigilance. + Effect effect = new CreateTokenEffect(new WarriorVigilantToken()); + effect.setText("Create a 1/1 white Warrior creature token with vigilance"); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{1}{W}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new ExertSourceCost()); + this.addAbility(ability); + } + + public StewardOfSolidarity(final StewardOfSolidarity card) { + super(card); + } + + @Override + public StewardOfSolidarity copy() { + return new StewardOfSolidarity(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/StripedRiverwinder.java b/Mage.Sets/src/mage/cards/s/StripedRiverwinder.java new file mode 100644 index 0000000000..22674895aa --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StripedRiverwinder.java @@ -0,0 +1,68 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.HexproofAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author spjspj + */ +public class StripedRiverwinder extends CardImpl { + + public StripedRiverwinder(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{6}{U}"); + + this.subtype.add("Serpent"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Hexproof + this.addAbility(HexproofAbility.getInstance()); + + // Cycling {U} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{U}"))); + + } + + public StripedRiverwinder(final StripedRiverwinder card) { + super(card); + } + + @Override + public StripedRiverwinder copy() { + return new StripedRiverwinder(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 4644a6b653..23aa985e36 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -125,10 +125,15 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Sand Strangler", 107, Rarity.UNCOMMON, mage.cards.s.SandStrangler.class)); cards.add(new SetCardInfo("Sandblast", 20, Rarity.COMMON, mage.cards.s.Sandblast.class)); cards.add(new SetCardInfo("Sidewinder Naga", 134, Rarity.COMMON, mage.cards.s.SidewinderNaga.class)); + cards.add(new SetCardInfo("Sifter Wurm", 135, Rarity.UNCOMMON, mage.cards.s.SifterWurm.class)); cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); cards.add(new SetCardInfo("Solemnity", 22, Rarity.RARE, mage.cards.s.Solemnity.class)); + cards.add(new SetCardInfo("Solitary Camel", 23, Rarity.COMMON, mage.cards.s.SolitaryCamel.class)); + cards.add(new SetCardInfo("Spellweaver Eternal", 46, Rarity.COMMON, mage.cards.s.SpellweaverEternal.class)); cards.add(new SetCardInfo("Steadfast Sentinel", 24, Rarity.COMMON, mage.cards.s.SteadfastSentinel.class)); + cards.add(new SetCardInfo("Steward of Solidarity", 25, Rarity.UNCOMMON, mage.cards.s.StewardOfSolidarity.class)); cards.add(new SetCardInfo("Strategic Planning", 47, Rarity.COMMON, mage.cards.s.StrategicPlanning.class)); + cards.add(new SetCardInfo("Striped Riverwinder", 48, Rarity.COMMON, mage.cards.s.StripedRiverwinder.class)); cards.add(new SetCardInfo("Struggle // Survive", 151, Rarity.UNCOMMON, mage.cards.s.StruggleSurvive.class)); cards.add(new SetCardInfo("Sunscourge Champion", 26, Rarity.UNCOMMON, mage.cards.s.SunscourgeChampion.class)); cards.add(new SetCardInfo("Sunset Pyramid", 166, Rarity.UNCOMMON, mage.cards.s.SunsetPyramid.class)); From c1f7a1086708190a885a72db38bf4199b5f29ead Mon Sep 17 00:00:00 2001 From: spjspj Date: Mon, 3 Jul 2017 20:25:04 +1000 Subject: [PATCH 104/160] Implement 1 card (HOU) --- Mage.Sets/src/mage/cards/s/ShefetDunes.java | 93 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 94 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/ShefetDunes.java diff --git a/Mage.Sets/src/mage/cards/s/ShefetDunes.java b/Mage.Sets/src/mage/cards/s/ShefetDunes.java new file mode 100644 index 0000000000..9af1736965 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShefetDunes.java @@ -0,0 +1,93 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.mana.ColorlessManaAbility; +import mage.abilities.mana.WhiteManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author spjspj + */ +public class ShefetDunes extends CardImpl { + + private static final FilterControlledPermanent filterDesertPermanent = new FilterControlledPermanent("Desert"); + + static { + filterDesertPermanent.add(new SubtypePredicate(SubType.DESERT)); + } + + public ShefetDunes(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + this.subtype.add("Desert"); + + // {T}: Add {C} to your mana pool. + this.addAbility(new ColorlessManaAbility()); + + // {T}, Pay 1 life: Add {W} to your mana pool. + Ability ability = new WhiteManaAbility(); + ability.addCost(new PayLifeCost(1)); + this.addAbility(ability); + + // {2}{W}{W}, {T}, Sacrifice a Desert: Creatures you control get +1/+1 until end of turn. Activate this ability only any time you could cast a sorcery. + Ability ability2 = new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new BoostControlledEffect(1, 1, Duration.EndOfTurn), + new ManaCostsImpl("{2}{W}{W}")); + ability2.addCost(new TapSourceCost()); + ability2.addCost(new SacrificeTargetCost(new TargetControlledPermanent(1, 1, filterDesertPermanent, true))); + this.addAbility(ability2); + } + + public ShefetDunes(final ShefetDunes card) { + super(card); + } + + @Override + public ShefetDunes copy() { + return new ShefetDunes(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 23aa985e36..7976bad23b 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -124,6 +124,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); cards.add(new SetCardInfo("Sand Strangler", 107, Rarity.UNCOMMON, mage.cards.s.SandStrangler.class)); cards.add(new SetCardInfo("Sandblast", 20, Rarity.COMMON, mage.cards.s.Sandblast.class)); + cards.add(new SetCardInfo("Shefet Dunes", 183, Rarity.UNCOMMON, mage.cards.s.ShefetDunes.class)); cards.add(new SetCardInfo("Sidewinder Naga", 134, Rarity.COMMON, mage.cards.s.SidewinderNaga.class)); cards.add(new SetCardInfo("Sifter Wurm", 135, Rarity.UNCOMMON, mage.cards.s.SifterWurm.class)); cards.add(new SetCardInfo("Sinuous Striker", 45, Rarity.UNCOMMON, mage.cards.s.SinuousStriker.class)); From 01ae2c0e6bbfcefba5e96b75b2acc67c04fa70e3 Mon Sep 17 00:00:00 2001 From: spjspj Date: Mon, 3 Jul 2017 20:38:42 +1000 Subject: [PATCH 105/160] Implement 1 card (HOU) --- .../mage/cards/s/SeerOfTheLastTomorrow.java | 72 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 73 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SeerOfTheLastTomorrow.java diff --git a/Mage.Sets/src/mage/cards/s/SeerOfTheLastTomorrow.java b/Mage.Sets/src/mage/cards/s/SeerOfTheLastTomorrow.java new file mode 100644 index 0000000000..497799b1de --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SeerOfTheLastTomorrow.java @@ -0,0 +1,72 @@ +/* + * 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.s; + +import java.util.UUID; +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.PutLibraryIntoGraveTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.target.TargetPlayer; + +/** + * + * @author spjspj + */ +public class SeerOfTheLastTomorrow extends CardImpl { + + public SeerOfTheLastTomorrow(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add("Naga"); + this.subtype.add("Cleric"); + this.power = new MageInt(1); + this.toughness = new MageInt(4); + + // {U}, {T}, Discard a card: Target player puts the top three cards of his or her library into his or her graveyard. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLibraryIntoGraveTargetEffect(3), new ManaCostsImpl("{U}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public SeerOfTheLastTomorrow(final SeerOfTheLastTomorrow card) { + super(card); + } + + @Override + public SeerOfTheLastTomorrow copy() { + return new SeerOfTheLastTomorrow(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index b2e41911a5..3b6358652c 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -130,6 +130,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); cards.add(new SetCardInfo("Sand Strangler", 107, Rarity.UNCOMMON, mage.cards.s.SandStrangler.class)); cards.add(new SetCardInfo("Sandblast", 20, Rarity.COMMON, mage.cards.s.Sandblast.class)); + cards.add(new SetCardInfo("Seer of the Last Tomorrow", 44, Rarity.COMMON, mage.cards.s.SeerOfTheLastTomorrow.class)); cards.add(new SetCardInfo("Shefet Dunes", 183, Rarity.UNCOMMON, mage.cards.s.ShefetDunes.class)); cards.add(new SetCardInfo("Scrounger of Souls", 76, Rarity.COMMON, mage.cards.s.ScroungerOfSouls.class)); cards.add(new SetCardInfo("Sidewinder Naga", 134, Rarity.COMMON, mage.cards.s.SidewinderNaga.class)); From 422afec3fe85d1ea4b0b43631c8ff2d55cfeb859 Mon Sep 17 00:00:00 2001 From: spjspj Date: Mon, 3 Jul 2017 20:58:42 +1000 Subject: [PATCH 106/160] Implement 1 card (HOU) --- .../src/mage/cards/s/ScavengerGrounds.java | 85 +++++++++++++++++++ .../mage/cards/s/SeerOfTheLastTomorrow.java | 2 + .../src/mage/sets/HourOfDevastation.java | 1 + 3 files changed, 88 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/ScavengerGrounds.java diff --git a/Mage.Sets/src/mage/cards/s/ScavengerGrounds.java b/Mage.Sets/src/mage/cards/s/ScavengerGrounds.java new file mode 100644 index 0000000000..87895e496e --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ScavengerGrounds.java @@ -0,0 +1,85 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ExileGraveyardAllPlayersEffect; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author spjspj + */ +public class ScavengerGrounds extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("Desert"); + + static { + filter.add(new SubtypePredicate(SubType.DESERT)); + } + + public ScavengerGrounds(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + this.subtype.add("Desert"); + + // {T}: Add {C} to your mana pool. + this.addAbility(new ColorlessManaAbility()); + + // {2}, {T}, Sacrifice a Desert: Exile all cards from all graveyards. + Ability ability2 = new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new ExileGraveyardAllPlayersEffect(), + new ManaCostsImpl("{2}")); + ability2.addCost(new TapSourceCost()); + ability2.addCost(new SacrificeTargetCost(new TargetControlledPermanent(1, 1, filter, true))); + this.addAbility(ability2); + } + + public ScavengerGrounds(final ScavengerGrounds card) { + super(card); + } + + @Override + public ScavengerGrounds copy() { + return new ScavengerGrounds(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SeerOfTheLastTomorrow.java b/Mage.Sets/src/mage/cards/s/SeerOfTheLastTomorrow.java index 497799b1de..459548306f 100644 --- a/Mage.Sets/src/mage/cards/s/SeerOfTheLastTomorrow.java +++ b/Mage.Sets/src/mage/cards/s/SeerOfTheLastTomorrow.java @@ -31,6 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect; @@ -57,6 +58,7 @@ public class SeerOfTheLastTomorrow extends CardImpl { // {U}, {T}, Discard a card: Target player puts the top three cards of his or her library into his or her graveyard. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutLibraryIntoGraveTargetEffect(3), new ManaCostsImpl("{U}")); ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardCardCost()); ability.addTarget(new TargetPlayer()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 3b6358652c..e14f68a738 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -130,6 +130,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); cards.add(new SetCardInfo("Sand Strangler", 107, Rarity.UNCOMMON, mage.cards.s.SandStrangler.class)); cards.add(new SetCardInfo("Sandblast", 20, Rarity.COMMON, mage.cards.s.Sandblast.class)); + cards.add(new SetCardInfo("Scavenger Grounds", 182, Rarity.RARE, mage.cards.s.ScavengerGrounds.class)); cards.add(new SetCardInfo("Seer of the Last Tomorrow", 44, Rarity.COMMON, mage.cards.s.SeerOfTheLastTomorrow.class)); cards.add(new SetCardInfo("Shefet Dunes", 183, Rarity.UNCOMMON, mage.cards.s.ShefetDunes.class)); cards.add(new SetCardInfo("Scrounger of Souls", 76, Rarity.COMMON, mage.cards.s.ScroungerOfSouls.class)); From 1e1321be143542b2441d56106fc2de30edd547d3 Mon Sep 17 00:00:00 2001 From: spjspj Date: Mon, 3 Jul 2017 23:43:23 +1000 Subject: [PATCH 107/160] Implement 1 card (HOU) --- Mage.Sets/src/mage/cards/s/SavingGrace.java | 176 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 177 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SavingGrace.java diff --git a/Mage.Sets/src/mage/cards/s/SavingGrace.java b/Mage.Sets/src/mage/cards/s/SavingGrace.java new file mode 100644 index 0000000000..287520243c --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SavingGrace.java @@ -0,0 +1,176 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.DamageEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author spjspj + */ +public class SavingGrace extends CardImpl { + + public SavingGrace(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + + this.subtype.add("Aura"); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Enchant creature you control + TargetPermanent auraTarget = new TargetControlledCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Saving Grace enters the battlefield, all damage that would be dealt this turn to you and permanents you control is dealt to enchanted creature instead. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SavingGraceReplacementEffect(), false)); + + // Enchanted creature gets +0/+3. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(0, 3, Duration.WhileOnBattlefield))); + } + + public SavingGrace(final SavingGrace card) { + super(card); + } + + @Override + public SavingGrace copy() { + return new SavingGrace(this); + } +} + +class SavingGraceReplacementEffect extends ReplacementEffectImpl { + + SavingGraceReplacementEffect() { + super(Duration.EndOfTurn, Outcome.RedirectDamage); + staticText = "all damage that would be dealt this turn to you and permanents you control is dealt to enchanted creature instead."; + } + + SavingGraceReplacementEffect(final SavingGraceReplacementEffect effect) { + super(effect); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + switch (event.getType()) { + case DAMAGE_CREATURE: + case DAMAGE_PLAYER: + case DAMAGE_PLANESWALKER: + return true; + default: + return false; + } + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getType() == GameEvent.EventType.DAMAGE_PLAYER && event.getPlayerId().equals(source.getControllerId())) { + return true; + } + if (event.getType() == GameEvent.EventType.DAMAGE_CREATURE || event.getType() == GameEvent.EventType.DAMAGE_PLANESWALKER) { + Permanent targetPermanent = game.getPermanent(event.getTargetId()); + if (targetPermanent != null + && targetPermanent.getControllerId().equals(source.getControllerId())) { + return true; + } + } + return false; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + DamageEvent damageEvent = (DamageEvent) event; + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + + if (sourcePermanent != null) { + Permanent creature = game.getPermanent(sourcePermanent.getAttachedTo()); + + if (creature == null) { + return false; + } + + // Name of old target + Permanent targetPermanent = game.getPermanent(event.getTargetId()); + StringBuilder message = new StringBuilder(); + message.append(creature.getName()).append(": gets "); + message.append(damageEvent.getAmount()).append(" damage redirected from "); + if (targetPermanent != null) { + message.append(targetPermanent.getName()); + } else { + Player targetPlayer = game.getPlayer(event.getTargetId()); + if (targetPlayer != null) { + message.append(targetPlayer.getLogName()); + } else { + message.append("unknown"); + } + + } + game.informPlayers(message.toString()); + // Redirect damage + if (creature != null) { + creature.damage(damageEvent.getAmount(), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); + return true; + } + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public SavingGraceReplacementEffect copy() { + return new SavingGraceReplacementEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index e14f68a738..65ade5cb87 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -130,6 +130,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); cards.add(new SetCardInfo("Sand Strangler", 107, Rarity.UNCOMMON, mage.cards.s.SandStrangler.class)); cards.add(new SetCardInfo("Sandblast", 20, Rarity.COMMON, mage.cards.s.Sandblast.class)); + cards.add(new SetCardInfo("Saving Grace", 21, Rarity.UNCOMMON, mage.cards.s.SavingGrace.class)); cards.add(new SetCardInfo("Scavenger Grounds", 182, Rarity.RARE, mage.cards.s.ScavengerGrounds.class)); cards.add(new SetCardInfo("Seer of the Last Tomorrow", 44, Rarity.COMMON, mage.cards.s.SeerOfTheLastTomorrow.class)); cards.add(new SetCardInfo("Shefet Dunes", 183, Rarity.UNCOMMON, mage.cards.s.ShefetDunes.class)); From 4f281eeb1d30fda51119ec2e060a043788164de0 Mon Sep 17 00:00:00 2001 From: emerald000 Date: Mon, 3 Jul 2017 16:50:38 -0400 Subject: [PATCH 108/160] [HOU] Added 3 white cards. Crested Sunmare, God-Pharaoh's Faithful and Mummy Paramount. Fix Wayward Servant not counting Tribals. Remove Consign // Oblivion as it was incomplete. --- .../src/mage/cards/c/CrestedSunmare.java | 102 ++++++++++++++++++ .../GodPharaohsFaithful.java} | 46 +++++--- .../src/mage/cards/m/MummyParamount.java | 74 +++++++++++++ .../src/mage/cards/w/WaywardServant.java | 4 +- 4 files changed, 207 insertions(+), 19 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/c/CrestedSunmare.java rename Mage.Sets/src/mage/cards/{c/ConsignOblivion.java => g/GodPharaohsFaithful.java} (56%) create mode 100644 Mage.Sets/src/mage/cards/m/MummyParamount.java diff --git a/Mage.Sets/src/mage/cards/c/CrestedSunmare.java b/Mage.Sets/src/mage/cards/c/CrestedSunmare.java new file mode 100644 index 0000000000..fd96744255 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CrestedSunmare.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.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.YouGainedLifeCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.permanent.token.Token; +import mage.watchers.common.PlayerGainedLifeWatcher; + +/** + * + * @author emerald000 + */ +public class CrestedSunmare extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("Horses you control"); + static { + filter.add(new SubtypePredicate(SubType.HORSE)); + } + + public CrestedSunmare(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}"); + + this.subtype.add("Horse"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Other Horses you control have indestructible. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true))); + + // At the beginning of each end step, if you gained life this turn, create a 5/5 white Horse creature token. + this.addAbility( + new ConditionalTriggeredAbility( + new BeginningOfEndStepTriggeredAbility(new CreateTokenEffect(new CrestedSunmareToken()), TargetController.ANY, false), + new YouGainedLifeCondition(ComparisonType.MORE_THAN, 0), + "At the beginning of each end step, if you gained life this turn, create a 5/5 white Horse creature token."), + new PlayerGainedLifeWatcher()); + } + + public CrestedSunmare(final CrestedSunmare card) { + super(card); + } + + @Override + public CrestedSunmare copy() { + return new CrestedSunmare(this); + } +} + +class CrestedSunmareToken extends Token { + + CrestedSunmareToken() { + super("Horse", "5/5 white Horse creature token"); + power = new MageInt(5); + toughness = new MageInt(5); + color.setWhite(true); + subtype.add("Horse"); + cardType.add(CardType.CREATURE); + } +} diff --git a/Mage.Sets/src/mage/cards/c/ConsignOblivion.java b/Mage.Sets/src/mage/cards/g/GodPharaohsFaithful.java similarity index 56% rename from Mage.Sets/src/mage/cards/c/ConsignOblivion.java rename to Mage.Sets/src/mage/cards/g/GodPharaohsFaithful.java index 99ece4cefa..43028a4b0f 100644 --- a/Mage.Sets/src/mage/cards/c/ConsignOblivion.java +++ b/Mage.Sets/src/mage/cards/g/GodPharaohsFaithful.java @@ -25,37 +25,49 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ -package mage.cards.c; +package mage.cards.g; import java.util.UUID; - +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.SplitCard; import mage.constants.CardType; -import mage.constants.SpellAbilityType; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ColorPredicate; /** * - * @author LevelX2 + * @author emerald000 */ -public class ConsignOblivion extends SplitCard { - - public ConsignOblivion(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{}, new CardType[]{}, "", "", SpellAbilityType.SPLIT_AFTERMATH); - - - getLeftHalfCard().getSpellAbility().addEffect(new Effect...); - - getRightHalfCard().getSpellAbility().addEffect(new Effect...); +public class GodPharaohsFaithful extends CardImpl { + private static final FilterSpell filter = new FilterSpell("a blue, black or red spell"); + static { + filter.add(Predicates.or(new ColorPredicate(ObjectColor.BLUE), new ColorPredicate(ObjectColor.BLACK), new ColorPredicate(ObjectColor.RED))); } - public ConsignOblivion(final ConsignOblivion card) { + public GodPharaohsFaithful(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); + + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(0); + this.toughness = new MageInt(4); + + // Whenever you cast a blue, black or red spell, you gain 1 life. + this.addAbility(new SpellCastControllerTriggeredAbility(new GainLifeEffect(1), filter, false)); + } + + public GodPharaohsFaithful(final GodPharaohsFaithful card) { super(card); } @Override - public ConsignOblivion copy() { - return new ConsignOblivion(this); + public GodPharaohsFaithful copy() { + return new GodPharaohsFaithful(this); } } diff --git a/Mage.Sets/src/mage/cards/m/MummyParamount.java b/Mage.Sets/src/mage/cards/m/MummyParamount.java new file mode 100644 index 0000000000..a05538c7e1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MummyParamount.java @@ -0,0 +1,74 @@ +/* + * 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.m; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author emerald000 + */ +public class MummyParamount extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie"); + static { + filter.add(new SubtypePredicate(SubType.ZOMBIE)); + filter.add(new AnotherPredicate()); + } + + public MummyParamount(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add("Zombie"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever another Zombie enters the battlefield under your control, Mummy Paramount gets +1/+1 until end of turn. + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), filter)); + } + + public MummyParamount(final MummyParamount card) { + super(card); + } + + @Override + public MummyParamount copy() { + return new MummyParamount(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WaywardServant.java b/Mage.Sets/src/mage/cards/w/WaywardServant.java index 09bec09d81..06967014f6 100644 --- a/Mage.Sets/src/mage/cards/w/WaywardServant.java +++ b/Mage.Sets/src/mage/cards/w/WaywardServant.java @@ -38,7 +38,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.AnotherPredicate; @@ -48,7 +48,7 @@ import mage.filter.predicate.permanent.AnotherPredicate; */ public class WaywardServant extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another Zombie"); + private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie"); static { filter.add(new SubtypePredicate(SubType.ZOMBIE)); From 2c17bbf00653da49f9909af8940c717d86164a0c Mon Sep 17 00:00:00 2001 From: igoudt Date: Mon, 3 Jul 2017 23:17:17 +0200 Subject: [PATCH 109/160] hou cards --- Mage.Sets/src/mage/cards/f/FeralProwler.java | 31 ++++++++++++++++ Mage.Sets/src/mage/cards/m/MoaningWall.java | 37 +++++++++++++++++++ Mage.Sets/src/mage/cards/o/Overcome.java | 36 ++++++++++++++++++ .../src/mage/cards/r/RampagingHippo.java | 2 +- Mage.Sets/src/mage/cards/r/RazakethsRite.java | 35 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 4 ++ 6 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/f/FeralProwler.java create mode 100644 Mage.Sets/src/mage/cards/m/MoaningWall.java create mode 100644 Mage.Sets/src/mage/cards/o/Overcome.java create mode 100644 Mage.Sets/src/mage/cards/r/RazakethsRite.java diff --git a/Mage.Sets/src/mage/cards/f/FeralProwler.java b/Mage.Sets/src/mage/cards/f/FeralProwler.java new file mode 100644 index 0000000000..f6cb945c50 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FeralProwler.java @@ -0,0 +1,31 @@ +package mage.cards.f; + +import mage.MageInt; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +public class FeralProwler extends CardImpl { + + public FeralProwler(UUID ownerId, CardSetInfo cardSetInfo) { + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + subtype.add("Cat"); + + power = new MageInt(1); + toughness = new MageInt(3); + + addAbility(new DiesTriggeredAbility(new DrawCardSourceControllerEffect(1), false)); + } + + public FeralProwler(final FeralProwler feralProwler) { + super(feralProwler); + } + + public FeralProwler copy() { + return new FeralProwler(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MoaningWall.java b/Mage.Sets/src/mage/cards/m/MoaningWall.java new file mode 100644 index 0000000000..de8487ebc2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MoaningWall.java @@ -0,0 +1,37 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +public class MoaningWall extends CardImpl { + + public MoaningWall(UUID ownerId, CardSetInfo cardSetInfo){ + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + subtype.add("Zombie"); + subtype.add("Wall"); + power = new MageInt(0); + toughness = new MageInt(5); + + // Defender + addAbility(DefenderAbility.getInstance()); + + // Cycling {2} + addAbility(new CyclingAbility(new ManaCostsImpl<>("{2}"))); + } + + public MoaningWall(final MoaningWall moaningWall){ + super(moaningWall); + } + + public MoaningWall copy(){ + return new MoaningWall(this); + } +} diff --git a/Mage.Sets/src/mage/cards/o/Overcome.java b/Mage.Sets/src/mage/cards/o/Overcome.java new file mode 100644 index 0000000000..8077f29122 --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/Overcome.java @@ -0,0 +1,36 @@ +package mage.cards.o; + +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; + +import java.util.UUID; + +public class Overcome extends CardImpl { + + public Overcome(UUID ownerId, CardSetInfo cardSetInfo){ + super(ownerId, cardSetInfo, new CardType[]{CardType.SORCERY}, "{3}{G}{G}"); + + // Creatures you control get +2/+2 and gain trample until end of turn. + Effect effect = new BoostControlledEffect(2, 2, Duration.EndOfTurn); + effect.setText("Creatures you control get +2/+2"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, new FilterCreaturePermanent()); + effect.setText("and gain trample until end of turn"); + this.getSpellAbility().addEffect(effect); + } + + public Overcome(final Overcome overcome){ + super(overcome); + } + + public Overcome copy(){ + return new Overcome(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RampagingHippo.java b/Mage.Sets/src/mage/cards/r/RampagingHippo.java index ff5286a99d..35c3abe1c3 100644 --- a/Mage.Sets/src/mage/cards/r/RampagingHippo.java +++ b/Mage.Sets/src/mage/cards/r/RampagingHippo.java @@ -22,7 +22,7 @@ public class RampagingHippo extends CardImpl { addAbility(TrampleAbility.getInstance()); // Cycling {2} - addAbility(new CyclingAbility(new ManaCostsImpl("2"))); + addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); } public RampagingHippo(final RampagingHippo rampagingHippo){ diff --git a/Mage.Sets/src/mage/cards/r/RazakethsRite.java b/Mage.Sets/src/mage/cards/r/RazakethsRite.java new file mode 100644 index 0000000000..cdfee961f5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RazakethsRite.java @@ -0,0 +1,35 @@ +package mage.cards.r; + +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +public class RazakethsRite extends CardImpl { + + public RazakethsRite(UUID ownerId, CardSetInfo cardSetInfo){ + super(ownerId, cardSetInfo, new CardType[]{CardType.SORCERY}, "{3}{B}{B}"); + + // Search your library for a card and put that card into your hand + // Then shuffle your library + TargetCardInLibrary target = new TargetCardInLibrary(); + this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(target)); + + // Cycling {B} + + addAbility(new CyclingAbility(new ManaCostsImpl("{B}"))); + } + + public RazakethsRite(final RazakethsRite razakethsRite){ + super(razakethsRite); + } + + public RazakethsRite copy(){ + return new RazakethsRite(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index adcdaca00b..6f74a64215 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -100,6 +100,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); cards.add(new SetCardInfo("Dutiful Servants", 12, Rarity.COMMON, mage.cards.d.DutifulServants.class)); cards.add(new SetCardInfo("Earthshaker Khenra", 90, Rarity.RARE, mage.cards.e.EarthshakerKhenra.class)); + cards.add(new SetCardInfo("Feral Prowler", 115, Rarity.COMMON, mage.cards.f.FeralProwler.class)); cards.add(new SetCardInfo("Fervent Paincaster", 91, Rarity.UNCOMMON, mage.cards.f.FerventPaincaster.class)); cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Fraying Sanity", 35, Rarity.UNCOMMON, mage.cards.f.FrayingSanity.class)); @@ -117,6 +118,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Lurching Rotbeast", 69, Rarity.COMMON, mage.cards.l.LurchingRotbeast.class)); cards.add(new SetCardInfo("Manalith", 164, Rarity.COMMON, mage.cards.m.Manalith.class)); cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); + cards.add(new SetCardInfo("Moaning Wall", 72, Rarity.COMMON, mage.cards.m.MoaningWall.class)); cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); cards.add(new SetCardInfo("Nicol Bolas, the Deceiver", 205, Rarity.MYTHIC, mage.cards.n.NicolBolasTheDeceiver.class)); @@ -126,6 +128,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Oketra's Last Mercy", 18, Rarity.RARE, mage.cards.o.OketrasLastMercy.class)); cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); cards.add(new SetCardInfo("Overwhelming Splendor", 19, Rarity.MYTHIC, mage.cards.o.OverwhelmingSplendor.class)); + cards.add(new SetCardInfo("Overcome", 125, Rarity.UNCOMMON, mage.cards.o.Overcome.class)); cards.add(new SetCardInfo("Plains", 185, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Pride Sovereign", 126, Rarity.RARE, mage.cards.p.PrideSovereign.class)); cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); @@ -133,6 +136,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); cards.add(new SetCardInfo("Ramunap Hydra", 130, Rarity.RARE, mage.cards.r.RamunapHydra.class)); cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); + cards.add(new SetCardInfo("Razaketh's Rite", 74, Rarity.UNCOMMON, mage.cards.r.RazakethsRite.class)); cards.add(new SetCardInfo("Reason // Believe", 154, Rarity.RARE, mage.cards.r.ReasonBelieve.class)); cards.add(new SetCardInfo("Refuse // Cooperate", 156, Rarity.RARE, mage.cards.r.RefuseCooperate.class)); cards.add(new SetCardInfo("Ruin Rat", 75, Rarity.COMMON, mage.cards.r.RuinRat.class)); From 09ed2370ba8733d5b41121dfefcbc920245c666b Mon Sep 17 00:00:00 2001 From: spjspj Date: Tue, 4 Jul 2017 07:25:41 +1000 Subject: [PATCH 110/160] Implement 1 card (HOU) --- Mage.Sets/src/mage/cards/r/RiverHoopoe.java | 76 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + Utils/mtg-cards-data.txt | 11 +-- 3 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/r/RiverHoopoe.java diff --git a/Mage.Sets/src/mage/cards/r/RiverHoopoe.java b/Mage.Sets/src/mage/cards/r/RiverHoopoe.java new file mode 100644 index 0000000000..24a98988f8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RiverHoopoe.java @@ -0,0 +1,76 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; + +/** + * + * @author spjspj + */ +public class RiverHoopoe extends CardImpl { + + public RiverHoopoe(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{U}"); + + this.subtype.add("Bird"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {3}{G}{U}: You gain 2 life and draw a card. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(2), new ManaCostsImpl<>("{3}{G}{U}")); + Effect effect = new DrawCardSourceControllerEffect(1); + effect.setText("and draw a card"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public RiverHoopoe(final RiverHoopoe card) { + super(card); + } + + @Override + public RiverHoopoe copy() { + return new RiverHoopoe(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index adcdaca00b..fe488ed0bd 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -135,6 +135,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Razaketh, the Foulblooded", 73, Rarity.MYTHIC, mage.cards.r.RazakethTheFoulblooded.class)); cards.add(new SetCardInfo("Reason // Believe", 154, Rarity.RARE, mage.cards.r.ReasonBelieve.class)); cards.add(new SetCardInfo("Refuse // Cooperate", 156, Rarity.RARE, mage.cards.r.RefuseCooperate.class)); + cards.add(new SetCardInfo("River Hoopoe", 143, Rarity.UNCOMMON, mage.cards.r.RiverHoopoe.class)); cards.add(new SetCardInfo("Ruin Rat", 75, Rarity.COMMON, mage.cards.r.RuinRat.class)); cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); cards.add(new SetCardInfo("Sand Strangler", 107, Rarity.UNCOMMON, mage.cards.s.SandStrangler.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 97b60e3474..7062d4c476 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31651,7 +31651,7 @@ Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counte Solitary Camel|Hour of Devastation|23|C|{2}{W}|Creature - Camel|3|2|Solitary Camel has lifelink as long as you control a desert or there is a desert card in your graveyard. (Damage this creature deals also causes you to gain that much life.)| Steadfast Sentinel|Hour of Devastation|24|C|{3}{W}|Creature - Human Cleric|2|3|Vigilance$Eternalize {4}{W}{W} ({4}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Cleric with no mana cost. Eternalize only as a sorcery.)| Steward of Solidarity|Hour of Devastation|25|U|{1}{W}|Creature - Human Warrior|2|2|{T}, Exert Steward of Solidarity: Create a 1/1 white Warrior creature token with vigilance. (An exerted creature won't untap during your next untap step.)| -Sunscourge Champion|Hour of Devastation|26|U|{2}{W}|Creature - Human Wizard|2|3|When Sunscourge Champion enters the battlefield, you gain life equal to its power.$Eternalize�{2}{W}{W}, Discard a card. ({2}{W}{W}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| +Sunscourge Champion|Hour of Devastation|26|U|{2}{W}|Creature - Human Wizard|2|3|When Sunscourge Champion enters the battlefield, you gain life equal to its power.$Eternalize—{2}{W}{W}, Discard a card. ({2}{W}{W}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| Unconventional Tactics|Hour of Devastation|27|U|{2}{W}|Sorcery|||Target creature gets +3/+3 and gains flying until end of turn.$Whenever a Zombie enters the battlefield under your control, you may pay {W}. If you do, return Unconventional Tactics from your graveyard to your hand.| Vizier of the True|Hour of Devastation|28|U|{3}{W}|Creature - Human Cleric|3|2|You may exert Vizier of the True as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, tap target creature an opponent controls.| Aerial Guide|Hour of Devastation|29|C|{2}{U}|Creature - Drake|2|2|Flying$Whenever Aerial Guide attacks, another target attacking creature gains flying until end of turn.| @@ -31670,11 +31670,11 @@ Ominous Sphinx|Hour of Devastation|41|U|{3}{U}{U}|Creature - Sphinx|4|4|Flying$W Proven Combatant|Hour of Devastation|42|C|{U}|Creature - Human Warrior|1|1|Eternalize {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Warrior with no mana cost. Eternalize only as a sorcery.) | Riddleform|Hour of Devastation|43|U|{1}{U}|Enchantment|||Whenever you cast a noncreature spell, you may have Riddleform become a 3/3 Sphinx creature with flying in addition to its other types until end of turn.${2}{U}: Scry 1.| Seer of the Last Tomorrow|Hour of Devastation|44|C|{2}{U}|Creature - Naga Cleric|1|4|{U}, {T}, Discard a card: Target player puts the top three cards of his or her library into his or her graveyard.| -Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize�{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| +Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize—{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| Spellweaver Eternal|Hour of Devastation|46|C|{1}{U}|Creature - Zombie Naga Wizard|2|1|Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)| Strategic Planning|Hour of Devastation|47|C|{1}{U}|Sorcery|||Look at the top three cards of your library. Put one of them into your hand and the rest in the graveyard.| Striped Riverwinder|Hour of Devastation|48|C|{6}{U}|Creature - Serpent|5|5|Hexproof (This creature can't be the target of spells or abilities your opponents control.)$Cycling {U} ({U}, Discard this card: Draw a card.)| -Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one �$� Counter target spell unless its controller pays {3}.$� Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| +Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counter target spell unless its controller pays {3}.$• Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| Tragic Lesson|Hour of Devastation|51|C|{2}{U}|Instant|||Draw two cards. Then discard a card unless you return a land you control to its owner's hand.| Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| @@ -31687,7 +31687,7 @@ Apocalypse Demon|Hour of Devastation|58|R|{4}{B}{B}|Creature - Demon|0|0|Flying$ Banewhip Punisher|Hour of Devastation|59|U|{2}{B}|Creature - Human Warrior|2|2|When Banewhip Punisher enters the battlefield, you may put a -1/-1 counter on target creature.${B}, Sacrifice Banewhip Punisher: Destroy target creature that has a -1/-1 counter on it.| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| -Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one �$� Target player exiles a creature he or she controls.$� Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| +Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| Dreamstealer|Hour of Devastation|63|R|{2}{B}|Creature - Human Wizard|1|2|Menace$When Dreamstealer deals combat damage to a player, that player discards that many cards.$Eternalize {4}{B}{B} ({4}{B}{B}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| Grisly Survivor|Hour of Devastation|64|C|{2}{B}|Creature - Minotaur Warrior|2|3|Whenever you cycle or discard a card, Grisly Survivor gets +2/+0 until end of turn.| Hour of Glory|Hour of Devastation|65|R|{3}{B}|Instant|||Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature.| @@ -31696,6 +31696,7 @@ Lethal Sting|Hour of Devastation|67|C|{2}{B}|Sorcery|||As an additional cost to Liliana's Defeat|Hour of Devastation|68|U|{B}|Sorcery|||Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life.| Lurching Rotbeast|Hour of Devastation|69|C|{3}{B}|Creature - Zombie Beast|4|2|Cycling {B} ({B}, Discard this card: Draw a card.)| Maurauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| +Marauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| Merciless Eternal|Hour of Devastation|71|U|{2}{B}|Creature - Zombie Cleric|2|2|Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)${2}{B}, Discard a card: Merciless Eternal gets +2/+2 until end of turn.| Moaning Wall|Hour of Devastation|72|C|{2}{B}|Creature - Zombie Wall|0|5|Defender$Cycling {2}| Razaketh, the Foulblooded|Hour of Devastation|73|M|{5}{B}{B}{B}|Legendary Creature - Demon|8|8|Flying, trample$Pay 2 life, Sacrifice another creature: Search your library for a card and put that card into your hand. Then shuffle your library.| @@ -31779,7 +31780,7 @@ Claim // Fame|Hour of Devastation|150|U|{B}|Sorcery|||Return target creature car Struggle // Survive|Hour of Devastation|151|U|{2}{R}|Instant|||Struggle deals damage to target creature equal to the number of lands you control.$Survive {1}{G}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Each player shuffles his or graveyard into his or her library.| Appeal // Authority|Hour of Devastation|152|U|{G}|Sorcery|||Until end of turn, target creature gains trample and gets +X/+X, where X is the number of creatures you control.$Authority {1}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Tap up to two target creatures your opponents control. Creatures you control gain vigilance until end of turn.| Leave // Chance|Hour of Devastation|153|R|{1}{W}|Instant|||Return any number of target permanents you own to your hand.$Chance {3}{R}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Discard any number of cards, then draw that many cards.| -Reason // Believe|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| +Reason // Live|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| Grind // Dust|Hour of Devastation|155|R|{1}{B}|Sorcery|||Put a -1/-1 counter on each of up to two target creatures.$Dust {3}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Exile any number of target creatures that have -1/-1 counters on them.| Refuse // Cooperate|Hour of Devastation|156|R|{3}{R}|Instant|||Refuse deals damage to target spell's controller equal to that spell's converted mana cost.$Cooperate {2}{U}$Instant$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Copy target instant or sorcery spell. You may choose new targets for the copy.| Driven // Despair|Hour of Devastation|157|R|{1}{G}|Sorcery|||Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."$Despair {1}{B}$Sorcery$Aftermath$Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."| From 70c9163d6a73ad6b47dce274d0f4964b3fddd01d Mon Sep 17 00:00:00 2001 From: spjspj Date: Tue, 4 Jul 2017 07:44:02 +1000 Subject: [PATCH 111/160] Fix 1 card (HOU) --- Mage.Sets/src/mage/cards/u/UnconventionalTactics.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/u/UnconventionalTactics.java b/Mage.Sets/src/mage/cards/u/UnconventionalTactics.java index b642f08b7c..259fe671c0 100644 --- a/Mage.Sets/src/mage/cards/u/UnconventionalTactics.java +++ b/Mage.Sets/src/mage/cards/u/UnconventionalTactics.java @@ -42,7 +42,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; import mage.game.events.GameEvent; @@ -56,7 +56,7 @@ import mage.target.common.TargetCreaturePermanent; */ public class UnconventionalTactics extends CardImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("zombie creature"); + private static final FilterControlledPermanent filter = new FilterControlledPermanent("Zombie"); static { filter.add(new SubtypePredicate(SubType.ZOMBIE)); @@ -90,7 +90,7 @@ public class UnconventionalTactics extends CardImpl { class UnconventionalTacticsTriggeredAbility extends TriggeredAbilityImpl { - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("zombie creature"); + private static final FilterControlledPermanent filter = new FilterControlledPermanent("Zombie"); static { filter.add(new SubtypePredicate(SubType.ZOMBIE)); From 5278aed587c86507714d742796c1db87b2fe45ec Mon Sep 17 00:00:00 2001 From: spjspj Date: Tue, 4 Jul 2017 07:45:25 +1000 Subject: [PATCH 112/160] Fix 1 card (HOU) --- Utils/mtg-cards-data.txt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 7062d4c476..f15401f2f6 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31651,7 +31651,7 @@ Solemnity|Hour of Devastation|22|R|{2}{W}|Enchantment|||Players can't get counte Solitary Camel|Hour of Devastation|23|C|{2}{W}|Creature - Camel|3|2|Solitary Camel has lifelink as long as you control a desert or there is a desert card in your graveyard. (Damage this creature deals also causes you to gain that much life.)| Steadfast Sentinel|Hour of Devastation|24|C|{3}{W}|Creature - Human Cleric|2|3|Vigilance$Eternalize {4}{W}{W} ({4}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Cleric with no mana cost. Eternalize only as a sorcery.)| Steward of Solidarity|Hour of Devastation|25|U|{1}{W}|Creature - Human Warrior|2|2|{T}, Exert Steward of Solidarity: Create a 1/1 white Warrior creature token with vigilance. (An exerted creature won't untap during your next untap step.)| -Sunscourge Champion|Hour of Devastation|26|U|{2}{W}|Creature - Human Wizard|2|3|When Sunscourge Champion enters the battlefield, you gain life equal to its power.$Eternalize—{2}{W}{W}, Discard a card. ({2}{W}{W}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| +Sunscourge Champion|Hour of Devastation|26|U|{2}{W}|Creature - Human Wizard|2|3|When Sunscourge Champion enters the battlefield, you gain life equal to its power.$Eternalize�{2}{W}{W}, Discard a card. ({2}{W}{W}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| Unconventional Tactics|Hour of Devastation|27|U|{2}{W}|Sorcery|||Target creature gets +3/+3 and gains flying until end of turn.$Whenever a Zombie enters the battlefield under your control, you may pay {W}. If you do, return Unconventional Tactics from your graveyard to your hand.| Vizier of the True|Hour of Devastation|28|U|{3}{W}|Creature - Human Cleric|3|2|You may exert Vizier of the True as it attacks. (It won't untap during your next untap step.)$Whenever you exert a creature, tap target creature an opponent controls.| Aerial Guide|Hour of Devastation|29|C|{2}{U}|Creature - Drake|2|2|Flying$Whenever Aerial Guide attacks, another target attacking creature gains flying until end of turn.| @@ -31670,11 +31670,11 @@ Ominous Sphinx|Hour of Devastation|41|U|{3}{U}{U}|Creature - Sphinx|4|4|Flying$W Proven Combatant|Hour of Devastation|42|C|{U}|Creature - Human Warrior|1|1|Eternalize {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Warrior with no mana cost. Eternalize only as a sorcery.) | Riddleform|Hour of Devastation|43|U|{1}{U}|Enchantment|||Whenever you cast a noncreature spell, you may have Riddleform become a 3/3 Sphinx creature with flying in addition to its other types until end of turn.${2}{U}: Scry 1.| Seer of the Last Tomorrow|Hour of Devastation|44|C|{2}{U}|Creature - Naga Cleric|1|4|{U}, {T}, Discard a card: Target player puts the top three cards of his or her library into his or her graveyard.| -Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize—{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| +Sinuous Striker|Hour of Devastation|45|U|{2}{U}|Creature - Naga Warrior|2|2|{U}: Sinuous Striker gets +1/-1 until end of turn.$Eternalize�{3}{U}{U}, Discard a card. ({3}{U}{U}, Discard a card, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Naga Warrior with no mana cost. Eternalize only as a sorcery.)| Spellweaver Eternal|Hour of Devastation|46|C|{1}{U}|Creature - Zombie Naga Wizard|2|1|Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)| Strategic Planning|Hour of Devastation|47|C|{1}{U}|Sorcery|||Look at the top three cards of your library. Put one of them into your hand and the rest in the graveyard.| Striped Riverwinder|Hour of Devastation|48|C|{6}{U}|Creature - Serpent|5|5|Hexproof (This creature can't be the target of spells or abilities your opponents control.)$Cycling {U} ({U}, Discard this card: Draw a card.)| -Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one —$• Counter target spell unless its controller pays {3}.$• Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| +Supreme Will|Hour of Devastation|49|U|{2}{U}|Instant|||Choose one �$� Counter target spell unless its controller pays {3}.$� Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.| Swarm Intelligence|Hour of Devastation|50|R|{6}{U}|Enchantment|||Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.| Tragic Lesson|Hour of Devastation|51|C|{2}{U}|Instant|||Draw two cards. Then discard a card unless you return a land you control to its owner's hand.| Unesh, Criosphinx Sovereign|Hour of Devastation|52|M|{4}{U}{U}|Legendary Creature - Sphinx|4|4|Flying$Sphinx spells you cast cost {2} less to cast.$Whenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent seperates those cards into two piles. Put one pile into your hand and the other into your graveyard.| @@ -31687,7 +31687,7 @@ Apocalypse Demon|Hour of Devastation|58|R|{4}{B}{B}|Creature - Demon|0|0|Flying$ Banewhip Punisher|Hour of Devastation|59|U|{2}{B}|Creature - Human Warrior|2|2|When Banewhip Punisher enters the battlefield, you may put a -1/-1 counter on target creature.${B}, Sacrifice Banewhip Punisher: Destroy target creature that has a -1/-1 counter on it.| Bontu's Last Reckoning|Hour of Devastation|60|R|{1}{B}{B}|Sorcery|||Destroy all creatures. Lands you control don't untap during your next untap step.| Carrion Screecher|Hour of Devastation|61|C|{3}{B}|Creature - Zombie Bird|3|1|Flying| -Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one —$• Target player exiles a creature he or she controls.$• Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| +Doomfall|Hour of Devastation|62|U|{2}{B}|Sorcery|||Choose one �$� Target player exiles a creature he or she controls.$� Target opponent reveals his or her hand. You choose a nonland card from it. Exile that card.| Dreamstealer|Hour of Devastation|63|R|{2}{B}|Creature - Human Wizard|1|2|Menace$When Dreamstealer deals combat damage to a player, that player discards that many cards.$Eternalize {4}{B}{B} ({4}{B}{B}, Exile this card from your graveyard: Create a token that's a copy of it, except it's 4/4 black Zombie Human Wizard with no mana cost. Eternalize only as a sorcery.)| Grisly Survivor|Hour of Devastation|64|C|{2}{B}|Creature - Minotaur Warrior|2|3|Whenever you cycle or discard a card, Grisly Survivor gets +2/+0 until end of turn.| Hour of Glory|Hour of Devastation|65|R|{3}{B}|Instant|||Exile target creature. If that creature was a God, its controller reveals his or her hand and exiles all cards with the same name as that creature.| @@ -31695,7 +31695,6 @@ Khenra Eternal|Hour of Devastation|66|C|{1}{B}|Creature - Zombie Jackal Warrior| Lethal Sting|Hour of Devastation|67|C|{2}{B}|Sorcery|||As an additional cost to cast Lethal Sting, put a -1/-1 counter on a creature you control.$Destroy target creature.| Liliana's Defeat|Hour of Devastation|68|U|{B}|Sorcery|||Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life.| Lurching Rotbeast|Hour of Devastation|69|C|{3}{B}|Creature - Zombie Beast|4|2|Cycling {B} ({B}, Discard this card: Draw a card.)| -Maurauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| Marauding Boneslasher|Hour of Devastation|70|C|{2}{B}|Creature - Zombie Minotaur|3|3|Marauding Boneslasher can't block unless you control another Zombie.| Merciless Eternal|Hour of Devastation|71|U|{2}{B}|Creature - Zombie Cleric|2|2|Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)${2}{B}, Discard a card: Merciless Eternal gets +2/+2 until end of turn.| Moaning Wall|Hour of Devastation|72|C|{2}{B}|Creature - Zombie Wall|0|5|Defender$Cycling {2}| @@ -31780,7 +31779,7 @@ Claim // Fame|Hour of Devastation|150|U|{B}|Sorcery|||Return target creature car Struggle // Survive|Hour of Devastation|151|U|{2}{R}|Instant|||Struggle deals damage to target creature equal to the number of lands you control.$Survive {1}{G}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Each player shuffles his or graveyard into his or her library.| Appeal // Authority|Hour of Devastation|152|U|{G}|Sorcery|||Until end of turn, target creature gains trample and gets +X/+X, where X is the number of creatures you control.$Authority {1}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Tap up to two target creatures your opponents control. Creatures you control gain vigilance until end of turn.| Leave // Chance|Hour of Devastation|153|R|{1}{W}|Instant|||Return any number of target permanents you own to your hand.$Chance {3}{R}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Discard any number of cards, then draw that many cards.| -Reason // Live|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| +Reason // Believe|Hour of Devastation|154|R|{U}|Sorcery|||Scry 3.$Believe {4}{G}$Sorcery$Aftermath$Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.| Grind // Dust|Hour of Devastation|155|R|{1}{B}|Sorcery|||Put a -1/-1 counter on each of up to two target creatures.$Dust {3}{W}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Exile any number of target creatures that have -1/-1 counters on them.| Refuse // Cooperate|Hour of Devastation|156|R|{3}{R}|Instant|||Refuse deals damage to target spell's controller equal to that spell's converted mana cost.$Cooperate {2}{U}$Instant$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Copy target instant or sorcery spell. You may choose new targets for the copy.| Driven // Despair|Hour of Devastation|157|R|{1}{G}|Sorcery|||Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card."$Despair {1}{B}$Sorcery$Aftermath$Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."| From e9a04f53b5727792b446ff1aeb6a064c32c1e1e5 Mon Sep 17 00:00:00 2001 From: Imagery-Wizard Date: Mon, 3 Jul 2017 18:32:11 -0400 Subject: [PATCH 113/160] Implement Aerial Guide --- Mage.Sets/src/mage/cards/a/AerialGuide.java | 111 ++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AerialGuide.java diff --git a/Mage.Sets/src/mage/cards/a/AerialGuide.java b/Mage.Sets/src/mage/cards/a/AerialGuide.java new file mode 100644 index 0000000000..003f012464 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AerialGuide.java @@ -0,0 +1,111 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.filter.common.FilterAttackingCreature; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetAttackingCreature; + +/** + * + * @author ciaccona007 + */ +public class AerialGuide extends CardImpl { + + static FilterAttackingCreature filter = new FilterAttackingCreature("another target attacking creature"); + + static { + filter.add(new AnotherPredicate()); + } + + public AerialGuide(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add("Drake"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Aerial Guide attacks, another target attacking creature gains flying until end of turn. + Ability ability = new AttacksTriggeredAbility(new AerialGuideEffect(), false); + ability.addTarget(new TargetAttackingCreature(1, 1, filter, false)); + this.addAbility(ability); + } + + public AerialGuide(final AerialGuide card) { + super(card); + } + + @Override + public AerialGuide copy() { + return new AerialGuide(this); + } +} + +class AerialGuideEffect extends OneShotEffect { + + public AerialGuideEffect() { + super(Outcome.Benefit); + this.staticText = "another target attacking creature gains flying until end of turn"; + } + + public AerialGuideEffect(final AerialGuideEffect effect) { + super(effect); + } + + @Override + public AerialGuideEffect copy() { + return new AerialGuideEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if(permanent != null) { + game.addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), source); + return true; + } + return false; + } +} From f8ec345414d4447a3ceb7c848232e60f151b1392 Mon Sep 17 00:00:00 2001 From: Imagery-Wizard Date: Mon, 3 Jul 2017 18:32:50 -0400 Subject: [PATCH 114/160] Add Aerial Guide to HourOfDevastation.java --- Mage.Sets/src/mage/sets/HourOfDevastation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index adcdaca00b..f31bd89aca 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -69,6 +69,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); cards.add(new SetCardInfo("Act of Heroism", 1, Rarity.COMMON, mage.cards.a.ActOfHeroism.class)); cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); + cards.add(new SetCardInfo("Aerial Guide", 29, Rarity.COMMON, mage.cards.a.AerialGuide.class)); cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); cards.add(new SetCardInfo("Aven of Enduring Hope", 5, Rarity.COMMON, mage.cards.a.AvenOfEnduringHope.class)); From 281841e487749bc9085a8ad97d7a885bbead9754 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Mon, 3 Jul 2017 22:35:05 -0400 Subject: [PATCH 115/160] Implement Aerial Guide --- Mage.Sets/src/mage/cards/a/AerialGuide.java | 36 +++------------------ 1 file changed, 4 insertions(+), 32 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AerialGuide.java b/Mage.Sets/src/mage/cards/a/AerialGuide.java index 003f012464..d1b43334d9 100644 --- a/Mage.Sets/src/mage/cards/a/AerialGuide.java +++ b/Mage.Sets/src/mage/cards/a/AerialGuide.java @@ -59,7 +59,6 @@ public class AerialGuide extends CardImpl { public AerialGuide(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); - this.subtype.add("Drake"); this.power = new MageInt(2); this.toughness = new MageInt(2); @@ -68,9 +67,9 @@ public class AerialGuide extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever Aerial Guide attacks, another target attacking creature gains flying until end of turn. - Ability ability = new AttacksTriggeredAbility(new AerialGuideEffect(), false); - ability.addTarget(new TargetAttackingCreature(1, 1, filter, false)); - this.addAbility(ability); + Ability ability = new AttacksTriggeredAbility(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), false); + ability.addTarget(new TargetAttackingCreature(1, 1, filter, false)); + this.addAbility(ability); } public AerialGuide(final AerialGuide card) { @@ -81,31 +80,4 @@ public class AerialGuide extends CardImpl { public AerialGuide copy() { return new AerialGuide(this); } -} - -class AerialGuideEffect extends OneShotEffect { - - public AerialGuideEffect() { - super(Outcome.Benefit); - this.staticText = "another target attacking creature gains flying until end of turn"; - } - - public AerialGuideEffect(final AerialGuideEffect effect) { - super(effect); - } - - @Override - public AerialGuideEffect copy() { - return new AerialGuideEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getFirstTarget()); - if(permanent != null) { - game.addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), source); - return true; - } - return false; - } -} +} \ No newline at end of file From 3b3f2b10acc1f8ca3c2170f98340e22c86cd1174 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Mon, 3 Jul 2017 22:49:28 -0400 Subject: [PATCH 116/160] Add Devotee of Strength to HOU.java --- Mage.Sets/src/mage/sets/HourOfDevastation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index f31bd89aca..dfbc493c42 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -94,6 +94,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); + cards.add(new SetCardInfo("Devotee of Strength", 113, Rarity.UNCOMMON, mage.cards.d.DevoteeOfStrength.class)); cards.add(new SetCardInfo("Disposal Mummy", 9, Rarity.COMMON, mage.cards.d.DisposalMummy.class)); cards.add(new SetCardInfo("Djeru's Renunciation", 11, Rarity.COMMON, mage.cards.d.DjerusRenunciation.class)); cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); From 86bc162c836ee1e49fa77da8578c851aed84f325 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Mon, 3 Jul 2017 22:50:07 -0400 Subject: [PATCH 117/160] Implement Devotee of Strength --- .../src/mage/cards/d/DevoteeOfStrength.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DevoteeOfStrength.java diff --git a/Mage.Sets/src/mage/cards/d/DevoteeOfStrength.java b/Mage.Sets/src/mage/cards/d/DevoteeOfStrength.java new file mode 100644 index 0000000000..24f4214b6b --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DevoteeOfStrength.java @@ -0,0 +1,70 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +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.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author ciaccona007 + */ +public class DevoteeOfStrength extends CardImpl { + + public DevoteeOfStrength(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add("Naga"); + this.subtype.add("Wizard"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // {4}{G}: Target creature gets +2/+2 until end of turn. + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(2,2,Duration.EndOfTurn), new ManaCostsImpl("{4}{G}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public DevoteeOfStrength(final DevoteeOfStrength card) { + super(card); + } + + @Override + public DevoteeOfStrength copy() { + return new DevoteeOfStrength(this); + } +} From b4ad0c5f4a8c58d02972ecb9a6157cb7939d220d Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Mon, 3 Jul 2017 22:54:56 -0400 Subject: [PATCH 118/160] Implement Aven Reedstalker --- .../src/mage/cards/a/AvenReedstalker.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AvenReedstalker.java diff --git a/Mage.Sets/src/mage/cards/a/AvenReedstalker.java b/Mage.Sets/src/mage/cards/a/AvenReedstalker.java new file mode 100644 index 0000000000..83c16a9ba5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AvenReedstalker.java @@ -0,0 +1,68 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author ciaccona007 + */ +public class AvenReedstalker extends CardImpl { + + public AvenReedstalker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); + + this.subtype.add("Bird"); + this.subtype.add("Warrior"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + } + + public AvenReedstalker(final AvenReedstalker card) { + super(card); + } + + @Override + public AvenReedstalker copy() { + return new AvenReedstalker(this); + } +} From f19dc1e0e8b21d478743c384cae8bc8bedad0911 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Mon, 3 Jul 2017 22:57:04 -0400 Subject: [PATCH 119/160] Implement Bitterbow Sharpshooters --- .../mage/cards/b/BitterbowSharpshooters.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BitterbowSharpshooters.java diff --git a/Mage.Sets/src/mage/cards/b/BitterbowSharpshooters.java b/Mage.Sets/src/mage/cards/b/BitterbowSharpshooters.java new file mode 100644 index 0000000000..c711ed5fb1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BitterbowSharpshooters.java @@ -0,0 +1,68 @@ +/* + * 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.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.VigilanceAbility; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author ciaccona007 + */ +public class BitterbowSharpshooters extends CardImpl { + + public BitterbowSharpshooters(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); + + this.subtype.add("Jackal"); + this.subtype.add("Archer"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + } + + public BitterbowSharpshooters(final BitterbowSharpshooters card) { + super(card); + } + + @Override + public BitterbowSharpshooters copy() { + return new BitterbowSharpshooters(this); + } +} From f1010bd0b7459ba939e49fce21a8e1cacff99801 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Mon, 3 Jul 2017 23:09:16 -0400 Subject: [PATCH 120/160] Implement Blur of Blades --- Mage.Sets/src/mage/cards/b/BlurOfBlades.java | 66 ++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BlurOfBlades.java diff --git a/Mage.Sets/src/mage/cards/b/BlurOfBlades.java b/Mage.Sets/src/mage/cards/b/BlurOfBlades.java new file mode 100644 index 0000000000..1d8d4bdb0c --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BlurOfBlades.java @@ -0,0 +1,66 @@ +/* + * 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.b; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetControllerEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author ciaccona007 + */ +public class BlurOfBlades extends CardImpl { + + public BlurOfBlades(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}"); + + // Put a -1/-1 counter on target creature. Blur of Blades deals 2 damage to that creature's controller. + getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.M1M1.createInstance(1))); + Effect effect = new DamageTargetControllerEffect(2); + effect.setText("Blur of Blades deals 2 damage to that creature's controller"); + getSpellAbility().addEffect(effect); + getSpellAbility().addTarget(new TargetCreaturePermanent()); + + } + + public BlurOfBlades(final BlurOfBlades card) { + super(card); + } + + @Override + public BlurOfBlades copy() { + return new BlurOfBlades(this); + } +} From 71e4f9034a3f4a347a5966477235833068853507 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Mon, 3 Jul 2017 23:24:23 -0400 Subject: [PATCH 121/160] Implement Countervailing Winds --- .../src/mage/cards/c/CountervailingWinds.java | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CountervailingWinds.java diff --git a/Mage.Sets/src/mage/cards/c/CountervailingWinds.java b/Mage.Sets/src/mage/cards/c/CountervailingWinds.java new file mode 100644 index 0000000000..6d1217e82e --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CountervailingWinds.java @@ -0,0 +1,110 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.stack.StackObject; +import mage.players.Player; +import mage.target.TargetSpell; + +/** + * + * @author ciaccona007 + */ +public class CountervailingWinds extends CardImpl { + + public CountervailingWinds(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}"); + + + // Counter target spell unless its controller pays {1} for each card in your graveyard. + this.getSpellAbility().addEffect(new CountervailingWindsEffect()); + this.getSpellAbility().addTarget(new TargetSpell()); + + // Cycling {2} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + + } + + public CountervailingWinds(final CountervailingWinds card) { + super(card); + } + + @Override + public CountervailingWinds copy() { + return new CountervailingWinds(this); + } +} + +class CountervailingWindsEffect extends OneShotEffect { + + public CountervailingWindsEffect() { + super(Outcome.Detriment); + } + + public CountervailingWindsEffect(final CountervailingWindsEffect effect) { + super(effect); + } + + @Override + public CountervailingWindsEffect copy() { + return new CountervailingWindsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + StackObject spell = game.getStack().getStackObject(targetPointer.getFirst(game, source)); + if (spell != null) { + Player player = game.getPlayer(spell.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); + if (player != null && controller != null) { + int amount = controller.getGraveyard().size(); + if (amount == 0) { + game.informPlayers("Countervailing Winds: no cards in controller's graveyard."); + } else { + GenericManaCost cost = new GenericManaCost(amount); + if (!cost.pay(source, game, spell.getControllerId(), spell.getControllerId(), false)) { + game.informPlayers("Countervailing Winds: cost wasn't payed - countering target spell."); + return game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game); + } + } + } + } + return false; + } +} From a598e083017e5264d758f7c6c52ccb95fdf97281 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Mon, 3 Jul 2017 23:35:12 -0400 Subject: [PATCH 122/160] Implement Crash Through --- Mage.Sets/src/mage/cards/c/CrashThrough.java | 68 ++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CrashThrough.java diff --git a/Mage.Sets/src/mage/cards/c/CrashThrough.java b/Mage.Sets/src/mage/cards/c/CrashThrough.java new file mode 100644 index 0000000000..ac8e8d3ccc --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CrashThrough.java @@ -0,0 +1,68 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author ciaccona007 + */ +public class CrashThrough extends CardImpl { + + public CrashThrough(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{R}"); + + + // Creatures you control gain trample until end of turn. + getSpellAbility().addEffect(new GainAbilityAllEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent(), "Creatures you control gain trample until end of turn")); + + // Draw a card. + getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public CrashThrough(final CrashThrough card) { + super(card); + } + + @Override + public CrashThrough copy() { + return new CrashThrough(this); + } +} From 7a44a35f23cf6e9640896a0467fe4f11bc73d93f Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Mon, 3 Jul 2017 23:52:49 -0400 Subject: [PATCH 123/160] Implement Dunes of the Dead --- .../src/mage/cards/d/DunesOfTheDead.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DunesOfTheDead.java diff --git a/Mage.Sets/src/mage/cards/d/DunesOfTheDead.java b/Mage.Sets/src/mage/cards/d/DunesOfTheDead.java new file mode 100644 index 0000000000..600bc53237 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DunesOfTheDead.java @@ -0,0 +1,64 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.game.permanent.token.ZombieToken; + +/** + * + * @author ciaccona007 + */ +public class DunesOfTheDead extends CardImpl { + + public DunesOfTheDead(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + this.subtype.add("Desert"); + + // {T}: Add {C} to your mana pool. + addAbility(new ColorlessManaAbility()); + // When Dunes of the Dead is put into a graveyard from the battlefield, create a 2/2 black Zombie creature token. + this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 1), false)); + } + + public DunesOfTheDead(final DunesOfTheDead card) { + super(card); + } + + @Override + public DunesOfTheDead copy() { + return new DunesOfTheDead(this); + } +} From d653b997cc108ae0fe279c734db7676def25f844 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Mon, 3 Jul 2017 23:54:02 -0400 Subject: [PATCH 124/160] Update HOU.java with new cards --- Mage.Sets/src/mage/sets/HourOfDevastation.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index dfbc493c42..8e7912ec38 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -72,10 +72,14 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Aerial Guide", 29, Rarity.COMMON, mage.cards.a.AerialGuide.class)); cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); + cards.add(new SetCardInfo("Aven Reedstalker", 30, Rarity.COMMON, mage.cards.a.AvenReedstalker.class)); cards.add(new SetCardInfo("Aven of Enduring Hope", 5, Rarity.COMMON, mage.cards.a.AvenOfEnduringHope.class)); cards.add(new SetCardInfo("Appeal // Authority", 152, Rarity.UNCOMMON, mage.cards.a.AppealAuthority.class)); + cards.add(new SetCardInfo("Aven Reedstalker", 30, Rarity.COMMON, mage.cards.a.AvenReedstalker.class)); cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); cards.add(new SetCardInfo("Beneath The Sands", 111, Rarity.COMMON, mage.cards.b.BeneathTheSands.class)); + cards.add(new SetCardInfo("Bitterbow Sharpshooters", 112, Rarity.COMMON, mage.cards.b.BitterbowSharpshooters.class)); + cards.add(new SetCardInfo("Blur of Blades", 84, Rarity.COMMON, mage.cards.b.BlurOfBlades.class)); cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); cards.add(new SetCardInfo("Brambleweft Behemoth", 202, Rarity.COMMON, mage.cards.b.BrambleweftBehemoth.class)); cards.add(new SetCardInfo("Burning-Fist Minotaur", 85, Rarity.UNCOMMON, mage.cards.b.BurningFistMinotaur.class)); @@ -85,6 +89,8 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Chaos Maw", 87, Rarity.RARE, mage.cards.c.ChaosMaw.class)); cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); cards.add(new SetCardInfo("Claim // Fame", 150, Rarity.UNCOMMON, mage.cards.c.ClaimFame.class)); + cards.add(new SetCardInfo("Countervailing Winds", 32, Rarity.COMMON, mage.cards.c.CountervailingWinds.class)); + cards.add(new SetCardInfo("Crash Through", 88, Rarity.COMMON, mage.cards.c.CrashThrough.class)); cards.add(new SetCardInfo("Crook of Condemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfCondemnation.class)); cards.add(new SetCardInfo("Dauntless Aven", 7, Rarity.COMMON, mage.cards.d.DauntlessAven.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); @@ -100,6 +106,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Dunes of the Dead", 175, Rarity.UNCOMMON, mage.cards.d.DunesOfTheDead.class)); cards.add(new SetCardInfo("Dutiful Servants", 12, Rarity.COMMON, mage.cards.d.DutifulServants.class)); cards.add(new SetCardInfo("Earthshaker Khenra", 90, Rarity.RARE, mage.cards.e.EarthshakerKhenra.class)); cards.add(new SetCardInfo("Fervent Paincaster", 91, Rarity.UNCOMMON, mage.cards.f.FerventPaincaster.class)); From db10a53dd28451fc16809e95967be9029567df5d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 4 Jul 2017 06:50:59 +0200 Subject: [PATCH 125/160] [HOU] Added 4 cards, some fixes. --- Mage.Sets/src/mage/cards/a/ActOfHeroism.java | 14 +- .../src/mage/cards/c/ConsignOblivion.java | 72 ++++++++++ Mage.Sets/src/mage/cards/d/DrivenDespair.java | 81 ++++++++++++ Mage.Sets/src/mage/cards/f/FarmMarket.java | 71 ++++++++++ Mage.Sets/src/mage/cards/l/LeaveChance.java | 124 ++++++++++++++++++ .../src/mage/cards/s/StruggleSurvive.java | 2 +- .../src/mage/sets/HourOfDevastation.java | 9 +- Utils/cardSplitClass.tmpl | 14 +- Utils/gen-card.pl | 16 ++- Utils/mtg-cards-data.txt | 2 +- 10 files changed, 377 insertions(+), 28 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/c/ConsignOblivion.java create mode 100644 Mage.Sets/src/mage/cards/d/DrivenDespair.java create mode 100644 Mage.Sets/src/mage/cards/f/FarmMarket.java create mode 100644 Mage.Sets/src/mage/cards/l/LeaveChance.java diff --git a/Mage.Sets/src/mage/cards/a/ActOfHeroism.java b/Mage.Sets/src/mage/cards/a/ActOfHeroism.java index eb8192306f..1035431c89 100644 --- a/Mage.Sets/src/mage/cards/a/ActOfHeroism.java +++ b/Mage.Sets/src/mage/cards/a/ActOfHeroism.java @@ -27,6 +27,8 @@ */ package mage.cards.a; +import java.util.UUID; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect; @@ -36,19 +38,17 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Zone; import mage.target.common.TargetCreaturePermanent; -import java.util.UUID; -import mage.abilities.Ability; - /** * * @author Archer262 */ public class ActOfHeroism extends CardImpl { - + public ActOfHeroism(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}"); // Untap target creature. Effect effect = new UntapTargetEffect(); @@ -59,8 +59,8 @@ public class ActOfHeroism extends CardImpl { effect = new BoostTargetEffect(2, 2, Duration.EndOfTurn); effect.setText("It gets +2/+2"); this.getSpellAbility().addEffect(effect); - effect = new GainAbilityTargetEffect((Ability) new CanBlockAdditionalCreatureEffect(), Duration.EndOfTurn); - effect.setText("and can block an additional creature this turn."); + effect = new GainAbilityTargetEffect(new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockAdditionalCreatureEffect()), Duration.EndOfTurn); + effect.setText("and can block an additional creature this turn"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/cards/c/ConsignOblivion.java b/Mage.Sets/src/mage/cards/c/ConsignOblivion.java new file mode 100644 index 0000000000..54d3599a86 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ConsignOblivion.java @@ -0,0 +1,72 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.SpellAbilityType; +import mage.target.common.TargetNonlandPermanent; +import mage.target.common.TargetOpponent; + +/** + * + * @author LevelX2 + */ +public class ConsignOblivion extends SplitCard { + + public ConsignOblivion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{1}{U}", "{4}{B}", SpellAbilityType.SPLIT_AFTERMATH); + + // Return target nonland permanent to its owner's hand. + getLeftHalfCard().getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + getLeftHalfCard().getSpellAbility().addTarget(new TargetNonlandPermanent()); + + // Oblivion {4}{B} + // Sorcery + // Aftermath + ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true)); + // Target opponent discards two cards. + getRightHalfCard().getSpellAbility().addEffect(new DiscardTargetEffect(2)); + getRightHalfCard().getSpellAbility().addTarget(new TargetOpponent()); + } + + public ConsignOblivion(final ConsignOblivion card) { + super(card); + } + + @Override + public ConsignOblivion copy() { + return new ConsignOblivion(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DrivenDespair.java b/Mage.Sets/src/mage/cards/d/DrivenDespair.java new file mode 100644 index 0000000000..1003942763 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DrivenDespair.java @@ -0,0 +1,81 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.abilities.keyword.MenaceAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SpellAbilityType; + +/** + * + * @author LevelX2 + */ +public class DrivenDespair extends SplitCard { + + public DrivenDespair(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, new CardType[]{CardType.SORCERY}, "{1}{G}", "{1}{B}", SpellAbilityType.SPLIT_AFTERMATH); + + // Until end of turn, creatures you control gain trample and "Whenever this creature deals combat damage to a player, draw a card." + getLeftHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)); + TriggeredAbility ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), false); + getLeftHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(ability, Duration.EndOfTurn) + .setText("and \"Whenever this creature deals combat damage to a player, draw a card.\"")); + + // Despair {1}{B} + // Sorcery + // Aftermath + ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true)); + // Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card." + getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(new MenaceAbility(), Duration.EndOfTurn)); + ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1), false, true); + getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(ability, Duration.EndOfTurn) + .setText("and \"Whenever this creature deals combat damage to a player, that player discards a card.\"")); + + } + + public DrivenDespair(final DrivenDespair card) { + super(card); + } + + @Override + public DrivenDespair copy() { + return new DrivenDespair(this); + } +} diff --git a/Mage.Sets/src/mage/cards/f/FarmMarket.java b/Mage.Sets/src/mage/cards/f/FarmMarket.java new file mode 100644 index 0000000000..f907b6a332 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FarmMarket.java @@ -0,0 +1,71 @@ +/* + * 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.f; + +import java.util.UUID; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.DrawDiscardControllerEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.SpellAbilityType; +import mage.target.common.TargetAttackingOrBlockingCreature; + +/** + * + * @author LevelX2 + */ +public class FarmMarket extends SplitCard { + + public FarmMarket(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{2}{W}", "{2}{U}", SpellAbilityType.SPLIT_AFTERMATH); + + // Destroy target attacking or blocking creature. + getLeftHalfCard().getSpellAbility().addEffect(new DestroyTargetEffect()); + getLeftHalfCard().getSpellAbility().addTarget(new TargetAttackingOrBlockingCreature()); + + // Market {2}{U} + // Sorcery + // Aftermath + ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true)); + // Draw two cards, then discard two cards + getRightHalfCard().getSpellAbility().addEffect(new DrawDiscardControllerEffect(2, 2)); + + } + + public FarmMarket(final FarmMarket card) { + super(card); + } + + @Override + public FarmMarket copy() { + return new FarmMarket(this); + } +} diff --git a/Mage.Sets/src/mage/cards/l/LeaveChance.java b/Mage.Sets/src/mage/cards/l/LeaveChance.java new file mode 100644 index 0000000000..51998a2ae8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LeaveChance.java @@ -0,0 +1,124 @@ +/* + * 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.l; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.keyword.AftermathAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SpellAbilityType; +import mage.constants.TargetController; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.predicate.other.OwnerPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.TargetPermanent; +import mage.target.common.TargetCardInHand; + +/** + * + * @author LevelX2 + */ +public class LeaveChance extends SplitCard { + + public LeaveChance(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{1}{W}", "{3}{R}", SpellAbilityType.SPLIT_AFTERMATH); + + // Return any number of target permanents you own to your hand. + FilterPermanent filter = new FilterPermanent("permanents you own"); + filter.add(new OwnerPredicate(TargetController.YOU)); + getLeftHalfCard().getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + getLeftHalfCard().getSpellAbility().addTarget(new TargetPermanent(0, Integer.MAX_VALUE, filter, false)); + + // Chance + // Sorcery + // Aftermath + ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true)); + // Discard any number of cards, then draw that many cards. + getRightHalfCard().getSpellAbility().addEffect(new ChanceEffect()); + + } + + public LeaveChance(final LeaveChance card) { + super(card); + } + + @Override + public LeaveChance copy() { + return new LeaveChance(this); + } +} + +class ChanceEffect extends OneShotEffect { + + ChanceEffect() { + super(Outcome.DrawCard); + this.staticText = "Discard any number of cards, then draw that many cards"; + } + + ChanceEffect(final ChanceEffect effect) { + super(effect); + } + + @Override + public ChanceEffect copy() { + return new ChanceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Cards cardsInHand = controller.getHand().copy(); + TargetCard target = new TargetCardInHand(0, cardsInHand.size(), new FilterCard()); + controller.chooseTarget(outcome, cardsInHand, target, source, game); + if (!target.getTargets().isEmpty()) { + for (UUID cardId : target.getTargets()) { + Card card = game.getCard(cardId); + if (card != null) { + controller.discard(card, source, game); + } + } + game.applyEffects(); + controller.drawCards(target.getTargets().size(), game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/s/StruggleSurvive.java b/Mage.Sets/src/mage/cards/s/StruggleSurvive.java index 8071b9c1b0..5b7ac2f61e 100644 --- a/Mage.Sets/src/mage/cards/s/StruggleSurvive.java +++ b/Mage.Sets/src/mage/cards/s/StruggleSurvive.java @@ -59,7 +59,7 @@ public class StruggleSurvive extends SplitCard { // Struggle // Struggle deals damage to target creature equal to the number of lands you control. Effect effect = new DamageTargetEffect(new PermanentsOnBattlefieldCount(new FilterControlledLandPermanent("the number of lands you control"))); - effect.setText("{this} deals damage to target creature equal to the number of lands you control"); + effect.setText("Struggle deals damage to target creature equal to the number of lands you control"); getLeftHalfCard().getSpellAbility().addEffect(effect); getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index d09e4c2736..dc2c4ac298 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -27,6 +27,8 @@ */ package mage.sets; +import java.util.ArrayList; +import java.util.List; import mage.cards.CardGraphicInfo; import mage.cards.ExpansionSet; import mage.cards.FrameStyle; @@ -36,9 +38,6 @@ import mage.cards.repository.CardRepository; import mage.constants.Rarity; import mage.constants.SetType; -import java.util.ArrayList; -import java.util.List; - /** * @author fireshoes */ @@ -84,6 +83,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Chaos Maw", 87, Rarity.RARE, mage.cards.c.ChaosMaw.class)); cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); cards.add(new SetCardInfo("Claim // Fame", 150, Rarity.UNCOMMON, mage.cards.c.ClaimFame.class)); + cards.add(new SetCardInfo("Consign // Oblivion", 149, Rarity.UNCOMMON, mage.cards.c.ConsignOblivion.class)); cards.add(new SetCardInfo("Crook of Condemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfCondemnation.class)); cards.add(new SetCardInfo("Dauntless Aven", 7, Rarity.COMMON, mage.cards.d.DauntlessAven.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); @@ -98,8 +98,10 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Driven // Despair", 157, Rarity.RARE, mage.cards.d.DrivenDespair.class)); cards.add(new SetCardInfo("Dutiful Servants", 12, Rarity.COMMON, mage.cards.d.DutifulServants.class)); cards.add(new SetCardInfo("Earthshaker Khenra", 90, Rarity.RARE, mage.cards.e.EarthshakerKhenra.class)); + cards.add(new SetCardInfo("Farm // Market", 148, Rarity.UNCOMMON, mage.cards.f.FarmMarket.class)); cards.add(new SetCardInfo("Feral Prowler", 115, Rarity.COMMON, mage.cards.f.FeralProwler.class)); cards.add(new SetCardInfo("Fervent Paincaster", 91, Rarity.UNCOMMON, mage.cards.f.FerventPaincaster.class)); cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); @@ -114,6 +116,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); cards.add(new SetCardInfo("Kindled Fury", 101, Rarity.COMMON, mage.cards.k.KindledFury.class)); + cards.add(new SetCardInfo("Leave // Chance", 153, Rarity.RARE, mage.cards.l.LeaveChance.class)); cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); cards.add(new SetCardInfo("Lurching Rotbeast", 69, Rarity.COMMON, mage.cards.l.LurchingRotbeast.class)); cards.add(new SetCardInfo("Manalith", 164, Rarity.COMMON, mage.cards.m.Manalith.class)); diff --git a/Utils/cardSplitClass.tmpl b/Utils/cardSplitClass.tmpl index ca0c7bcf70..477c5b1b83 100644 --- a/Utils/cardSplitClass.tmpl +++ b/Utils/cardSplitClass.tmpl @@ -39,19 +39,15 @@ import mage.constants.SpellAbilityType; * @author [=$author=] */ public class [=$className=] extends SplitCard { - public [=$className=](UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{[=$type=]}, new CardType[]{[=$type=]}, "[=$manaCost=]", "[=$manaCost=]", SpellAbilityType.SPLIT_AFTERMATH); + super(ownerId, setInfo, new CardType[]{[=$type=]}, new CardType[]{??}, "[=$manaCost=]", "??", SpellAbilityType.SPLIT_AFTERMATH); [=$subType=][=$colors=] -[= -if ($power || $power eq 0) { +[= if ($power || $power eq 0) { $OUT .= "\n this.power = new MageInt($power);"; - $OUT .= "\n this.toughness = new MageInt($toughness);"; -} -=][=$abilities=] - getLeftHalfCard().getSpellAbility().addEffect(new Effect...); + $OUT .= "\n this.toughness = new MageInt($toughness);";} =][=$abilities=] + // getLeftHalfCard().getSpellAbility().addEffect(new Effect()); - getRightHalfCard().getSpellAbility().addEffect(new Effect...); + // getRightHalfCard().getSpellAbility().addEffect(new Effect()); } diff --git a/Utils/gen-card.pl b/Utils/gen-card.pl index 62529529c7..9f011e081f 100755 --- a/Utils/gen-card.pl +++ b/Utils/gen-card.pl @@ -111,6 +111,7 @@ my $cardTemplate = 'cardClass.tmpl'; my $splitDelimiter = '//'; my $empty = ''; my $splitSpell = 'false'; +my $originalName = $cardName; # Remove the // from name of split cards if (index($cardName, $splitDelimiter) != -1) { @@ -132,11 +133,10 @@ $vars{'className'} = toCamelCase($cardName); $vars{'cardNameFirstLetter'} = lc substr($cardName, 0, 1); my @card; -foreach my $setName (keys %{$cards{$cardName}}) { +foreach my $setName (keys %{$cards{$originalName}}) { my $setFileName = "../Mage.Sets/src/mage/sets/".$knownSets{$setName}.".java"; - @card = @{${cards{$cardName}{$setName}}}; - my $line = " cards.add(new SetCardInfo(\"".$card[0]."\", ".$card[2].", Rarity.".$raritiesConversion{$card[3]}.", mage.cards.".$vars{'cardNameFirstLetter'}.".".$vars{'className'}.".class));\n"; - + @card = @{${cards{$originalName}{$setName}}}; + my $line = " cards.add(new SetCardInfo(\"".$card[0]."\", ".$card[2].", Rarity.".$raritiesConversion{$card[3]}.", mage.cards.".$vars{'cardNameFirstLetter'}.".".$vars{'className'}.".class));\n"; @ARGV = ($setFileName); $^I = '.bak'; my $last; @@ -174,13 +174,12 @@ foreach my $setName (keys %{$cards{$cardName}}) { unlink $setFileName.".bak"; print "$setFileName\n"; } -print "Generate the card: ".$card[0]."\n"; + # Generate the card my $result; my $template = Text::Template->new(TYPE => 'FILE', SOURCE => $cardTemplate, DELIMITERS => [ '[=', '=]' ]); $vars{'author'} = $author; $vars{'manaCost'} = fixCost($card[4]); -print "cost ".$vars{'manaCost'}."\n"; $vars{'power'} = $card[6]; $vars{'toughness'} = $card[7]; @@ -192,7 +191,6 @@ my $type = $card[5]; while ($type =~ m/([a-zA-Z]+)( )*/g) { if (exists($cardTypes{$1})) { push(@types, $cardTypes{$1}); -print $cardTypes{$1}."\n"; if ($cardTypes{$1} eq $cardTypes{'Planeswalker'}) { $vars{'planeswalker'} = 'true'; $cardAbilities = $card[7]; @@ -211,6 +209,10 @@ $vars{'type'} = join(', ', @types); $vars{'abilitiesImports'} = ''; $vars{'abilities'} = ''; +my $strong = ""; +$cardAbilities =~ s/$strong/$empty/g; +$strong = ""; +$cardAbilities =~ s/$strong/$empty/g; my @abilities = split('\$', $cardAbilities); foreach my $ability (@abilities) { diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index f15401f2f6..859ca9acd3 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -31773,7 +31773,7 @@ Samut, the Tested|Hour of Devastation|144|M|{2}{R}{G}|Planeswalker - Samut|4|+1: The Scarab God|Hour of Devastation|145|M|{3}{U}{B}|Legendary Creature - God|5|5|At the beginning of your upkeep, each opponent loses X life and you scry X, where X is the number of Zombies you control.${2}{U}{B}: Exile target creature card from a graveyard. Create a token that's a copy of it, except it's a 4/4 black Zombie.$When The Scarab God dies, return it to its owner's hand at the beginning of the next upkeep.| The Scorpion God|Hour of Devastation|146|M|{3}{B}{R}|Legendary Creature - God|6|5|Whenever a creature with a -1/-1 counter on it dies, draw a card.${1}{B}{R}: Put a -1/-1 counter on another target creature.$When The Scorpion God dies, return it to its owner's hand at the beginning of the next end step.| Unraveling Mummy|Hour of Devastation|147|U|{1}{W}{B}|Creature - Zombie|2|3|{1}{W}: Target attacking Zombie gains lifelink until end of turn.${1}{B}: Target attacking Zombie gains deathtouch until end of turn.| -Farm // Market|Hour of Devastation|148|U|{2}{W}|Instant|||Destroy target attacking or blocking creature.$Market {2}{U}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Draw two cards, then destroy two cards| +Farm // Market|Hour of Devastation|148|U|{2}{W}|Instant|||Destroy target attacking or blocking creature.$Market {2}{U}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Draw two cards, then discard two cards| Consign // Oblivion|Hour of Devastation|149|U|{1}{U}|Instant|||Return target nonland permanent to its owner's hand.$Oblivion {4}{B}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Target opponent discards two cards.| Claim // Fame|Hour of Devastation|150|U|{B}|Sorcery|||Return target creature card with converted mana cost 2 or less from your graveyard to the battlefield.$Fame {1}{R}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Target creature gets +2/+0 and gains haste until end of turn.| Struggle // Survive|Hour of Devastation|151|U|{2}{R}|Instant|||Struggle deals damage to target creature equal to the number of lands you control.$Survive {1}{G}$Sorcery$Aftermath (Cast this spell only from your graveyard. Then exile it.)$Each player shuffles his or graveyard into his or her library.| From f5024dcf3966dd4575c912e58b22872f9b5a4d86 Mon Sep 17 00:00:00 2001 From: spjspj Date: Tue, 4 Jul 2017 18:36:35 +1000 Subject: [PATCH 126/160] Implement 1 card (HOU) --- Mage.Sets/src/mage/cards/r/Riddleform.java | 96 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 97 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/Riddleform.java diff --git a/Mage.Sets/src/mage/cards/r/Riddleform.java b/Mage.Sets/src/mage/cards/r/Riddleform.java new file mode 100644 index 0000000000..08799de5c0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/Riddleform.java @@ -0,0 +1,96 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; +import mage.abilities.effects.keyword.ScryEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.permanent.token.Token; + +/** + * + * @author spjspj + */ +public class Riddleform extends CardImpl { + + private static final FilterSpell filterNonCreature = new FilterSpell("a noncreature spell"); + + static { + filterNonCreature.add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); + } + + public Riddleform(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + + // Whenever you cast a noncreature spell, you may have Riddleform become a 3/3 Sphinx creature with flying in addition to its other types until end of turn. + Effect effect = new BecomesCreatureSourceEffect(new RiddleformToken(), "", Duration.EndOfTurn); + effect.setText("have {this} become a 3/3 Sphinx creature with flying in addition to its other types until end of turn."); + this.addAbility(new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, effect, filterNonCreature, true, true)); + + // {2}{U}: Scry 1. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ScryEffect(1), new ManaCostsImpl("{2}{U}")); + this.addAbility(ability); + } + + public Riddleform(final Riddleform card) { + super(card); + } + + @Override + public Riddleform copy() { + return new Riddleform(this); + } +} + +class RiddleformToken extends Token { + + public RiddleformToken() { + super("", "3/3 Sphinx creature with flying"); + cardType.add(CardType.CREATURE); + + subtype.add("Sphinx"); + power = new MageInt(3); + toughness = new MageInt(3); + addAbility(FlyingAbility.getInstance()); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index dc2c4ac298..0849ebfe22 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -142,6 +142,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Razaketh's Rite", 74, Rarity.UNCOMMON, mage.cards.r.RazakethsRite.class)); cards.add(new SetCardInfo("Reason // Believe", 154, Rarity.RARE, mage.cards.r.ReasonBelieve.class)); cards.add(new SetCardInfo("Refuse // Cooperate", 156, Rarity.RARE, mage.cards.r.RefuseCooperate.class)); + cards.add(new SetCardInfo("Riddleform", 43, Rarity.UNCOMMON, mage.cards.r.Riddleform.class)); cards.add(new SetCardInfo("River Hoopoe", 143, Rarity.UNCOMMON, mage.cards.r.RiverHoopoe.class)); cards.add(new SetCardInfo("Ruin Rat", 75, Rarity.COMMON, mage.cards.r.RuinRat.class)); cards.add(new SetCardInfo("Samut, the Tested", 144, Rarity.MYTHIC, mage.cards.s.SamutTheTested.class)); From c35a182bf19bda1d552e68a22c700fa5cd6545a8 Mon Sep 17 00:00:00 2001 From: spjspj Date: Tue, 4 Jul 2017 19:00:17 +1000 Subject: [PATCH 127/160] Implement 2 cards (HOU) Fix for Bontu's Last Reckoning --- .../src/mage/cards/b/BontusLastReckoning.java | 56 ++----------- .../src/mage/cards/r/RhonassLastStand.java | 67 +++++++++++++++ .../src/mage/cards/r/RhonassStalwart.java | 83 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 2 + 4 files changed, 159 insertions(+), 49 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/r/RhonassLastStand.java create mode 100644 Mage.Sets/src/mage/cards/r/RhonassStalwart.java diff --git a/Mage.Sets/src/mage/cards/b/BontusLastReckoning.java b/Mage.Sets/src/mage/cards/b/BontusLastReckoning.java index b8cbfb46d1..8238fb2197 100644 --- a/Mage.Sets/src/mage/cards/b/BontusLastReckoning.java +++ b/Mage.Sets/src/mage/cards/b/BontusLastReckoning.java @@ -27,24 +27,16 @@ */ package mage.cards.b; -import java.util.ArrayList; -import java.util.List; import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyAllEffect; -import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledLandPermanent; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.common.FilterLandPermanent; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.targetpointer.FixedTargets; /** * @@ -57,7 +49,9 @@ public class BontusLastReckoning extends CardImpl { // Destroy all creatures. Lands you control don't untap during your next untap step. this.getSpellAbility().addEffect(new DestroyAllEffect(new FilterCreaturePermanent())); - this.getSpellAbility().addEffect(new BontusLastReckoningEffect()); + this.getSpellAbility().addEffect(new DontUntapInControllersUntapStepAllEffect( + Duration.UntilYourNextTurn, TargetController.YOU, new FilterControlledLandPermanent("Lands you control")) + .setText("Lands you control don't untap during your next untap phase")); } public BontusLastReckoning(final BontusLastReckoning card) { @@ -69,39 +63,3 @@ public class BontusLastReckoning extends CardImpl { return new BontusLastReckoning(this); } } - -class BontusLastReckoningEffect extends OneShotEffect { - - BontusLastReckoningEffect() { - super(Outcome.Detriment); - this.staticText = "Lands you control don't untap during your next untap step."; - } - - BontusLastReckoningEffect(final BontusLastReckoningEffect effect) { - super(effect); - } - - @Override - public BontusLastReckoningEffect copy() { - return new BontusLastReckoningEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - List doNotUntapNextUntapStep = new ArrayList<>(); - for (Permanent land : game.getBattlefield().getAllActivePermanents(new FilterLandPermanent(), controller.getId(), game)) { - doNotUntapNextUntapStep.add(land); - } - if (!doNotUntapNextUntapStep.isEmpty()) { - ContinuousEffect effect = new DontUntapInControllersNextUntapStepTargetEffect("", controller.getId()); - effect.setText("Lands you control don't untap during your next untap step"); - effect.setTargetPointer(new FixedTargets(doNotUntapNextUntapStep, game)); - game.addEffect(effect, source); - } - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/r/RhonassLastStand.java b/Mage.Sets/src/mage/cards/r/RhonassLastStand.java new file mode 100644 index 0000000000..79a8fbd784 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RhonassLastStand.java @@ -0,0 +1,67 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledLandPermanent; +import mage.game.permanent.token.RhonassLastStandToken; + +/** + * + * @author spjspj + */ +public class RhonassLastStand extends CardImpl { + + public RhonassLastStand(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{G}{G}"); + + // Create a 5/4 green Snake creature token. + this.getSpellAbility().addEffect(new CreateTokenEffect(new RhonassLastStandToken())); + + // Lands you control don't untap during your next untap step. + this.getSpellAbility().addEffect(new DontUntapInControllersUntapStepAllEffect( + Duration.UntilYourNextTurn, TargetController.YOU, new FilterControlledLandPermanent("Lands you control")) + .setText("Lands you control don't untap during your next untap phase")); + } + + public RhonassLastStand(final RhonassLastStand card) { + super(card); + } + + @Override + public RhonassLastStand copy() { + return new RhonassLastStand(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RhonassStalwart.java b/Mage.Sets/src/mage/cards/r/RhonassStalwart.java new file mode 100644 index 0000000000..fab326242d --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RhonassStalwart.java @@ -0,0 +1,83 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BecomesExertSourceTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.combat.CantBeBlockedByAllTargetEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.ExertAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; + +/** + * + * @author spjspj + */ +public class RhonassStalwart extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with power 2 or less"); + + static { + filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3)); + } + + public RhonassStalwart(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add("Human"); + this.subtype.add("Warrior"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // You may exert Rhonas's Stalwart as it attacks. When you do, it gets +1/+1 until end of turn and can't be blocked by creatures with power 2 or less this turn. + Effect effect = new BoostSourceEffect(1, 1, Duration.EndOfTurn); + effect.setText("it gets +1/+1"); + BecomesExertSourceTriggeredAbility ability = new BecomesExertSourceTriggeredAbility(effect); + effect = new CantBeBlockedByAllTargetEffect(filter, Duration.EndOfTurn); + effect.setText("and can't be blocked by creatures with power 2 or less this turn"); + ability.addEffect(effect); + this.addAbility(new ExertAbility(ability)); + } + + public RhonassStalwart(final RhonassStalwart card) { + super(card); + } + + @Override + public RhonassStalwart copy() { + return new RhonassStalwart(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 0849ebfe22..9e5b7637d8 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -142,6 +142,8 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Razaketh's Rite", 74, Rarity.UNCOMMON, mage.cards.r.RazakethsRite.class)); cards.add(new SetCardInfo("Reason // Believe", 154, Rarity.RARE, mage.cards.r.ReasonBelieve.class)); cards.add(new SetCardInfo("Refuse // Cooperate", 156, Rarity.RARE, mage.cards.r.RefuseCooperate.class)); + cards.add(new SetCardInfo("Rhonas's Last Stand", 132, Rarity.RARE, mage.cards.r.RhonassLastStand.class)); + cards.add(new SetCardInfo("Rhonas's Stalwart", 133, Rarity.COMMON, mage.cards.r.RhonassStalwart.class)); cards.add(new SetCardInfo("Riddleform", 43, Rarity.UNCOMMON, mage.cards.r.Riddleform.class)); cards.add(new SetCardInfo("River Hoopoe", 143, Rarity.UNCOMMON, mage.cards.r.RiverHoopoe.class)); cards.add(new SetCardInfo("Ruin Rat", 75, Rarity.COMMON, mage.cards.r.RuinRat.class)); From 495a84f1f1818d0a29c20d1aaa8731357175b8bc Mon Sep 17 00:00:00 2001 From: spjspj Date: Tue, 4 Jul 2017 19:07:17 +1000 Subject: [PATCH 128/160] Implement 2 cards (HOU) Fix for Bontu's Last Reckoning --- .../src/main/resources/card-pictures-tok.txt | 2 + .../token/RhonassLastStandToken.java | 49 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 Mage/src/main/java/mage/game/permanent/token/RhonassLastStandToken.java diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index 4792bd5df1..3485187c7d 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -596,6 +596,8 @@ |Generate|TOK:HOP|Pest|||PestToken| |Generate|TOK:HOP|Saproling|||SaprolingToken| |Generate|TOK:HOU|Insect|||TheLocustGodInsectToken| +|Generate|TOK:HOU|Snake|||RhonassLastStandToken| +|Generate|TOK:HOU|Zombie|| |Generate|TOK:ICE|Caribou|||CaribouToken| |Generate|TOK:INV|Bird|||OwlToken| |Generate|TOK:INV|Elephant|||ElephantToken| diff --git a/Mage/src/main/java/mage/game/permanent/token/RhonassLastStandToken.java b/Mage/src/main/java/mage/game/permanent/token/RhonassLastStandToken.java new file mode 100644 index 0000000000..0fd73334c9 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/RhonassLastStandToken.java @@ -0,0 +1,49 @@ +/* +* 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.constants.CardType; +import mage.MageInt; +import mage.abilities.keyword.TrampleAbility; + +/** + * + * @author spjspj + */ +public class RhonassLastStandToken extends Token { + + public RhonassLastStandToken() { + super("Snake", "5/4 green Snake creature token"); + cardType.add(CardType.CREATURE); + color.setGreen(true); + subtype.add("Snake"); + power = new MageInt(5); + toughness = new MageInt(4); + addAbility(TrampleAbility.getInstance()); + } +} From 1dbecd3d3eb701096536419b66dc3cd8fc8d2701 Mon Sep 17 00:00:00 2001 From: spjspj Date: Tue, 4 Jul 2017 19:29:00 +1000 Subject: [PATCH 129/160] Implement 1 cards (HOU) --- .../src/mage/cards/r/ResoluteSurvivors.java | 77 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 78 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/ResoluteSurvivors.java diff --git a/Mage.Sets/src/mage/cards/r/ResoluteSurvivors.java b/Mage.Sets/src/mage/cards/r/ResoluteSurvivors.java new file mode 100644 index 0000000000..26e42f7066 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/ResoluteSurvivors.java @@ -0,0 +1,77 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ExertCreatureControllerTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.LoseLifeOpponentsEffect; +import mage.abilities.keyword.ExertAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author spjspj + */ +public class ResoluteSurvivors extends CardImpl { + + public ResoluteSurvivors(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}"); + + this.subtype.add("Human"); + this.subtype.add("Warrior"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // You may exert Resolute Survivors as it attacks. + this.addAbility(new ExertAbility(null, false)); + + // Whenever you exert a creature, Resolute Survivors deals 1 damage to each opponent and you gain 1 life. + Effect effect = new LoseLifeOpponentsEffect(1); + effect.setText("Whenever you exert a creature, {this} deals 1 damage to each opponent"); + Ability ability = new ExertCreatureControllerTriggeredAbility(effect); + effect = new GainLifeEffect(1); + effect.setText("and you gain 1 life"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public ResoluteSurvivors(final ResoluteSurvivors card) { + super(card); + } + + @Override + public ResoluteSurvivors copy() { + return new ResoluteSurvivors(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 9e5b7637d8..30b42df5f9 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -142,6 +142,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Razaketh's Rite", 74, Rarity.UNCOMMON, mage.cards.r.RazakethsRite.class)); cards.add(new SetCardInfo("Reason // Believe", 154, Rarity.RARE, mage.cards.r.ReasonBelieve.class)); cards.add(new SetCardInfo("Refuse // Cooperate", 156, Rarity.RARE, mage.cards.r.RefuseCooperate.class)); + cards.add(new SetCardInfo("Resolute Survivors", 142, Rarity.UNCOMMON, mage.cards.r.ResoluteSurvivors.class)); cards.add(new SetCardInfo("Rhonas's Last Stand", 132, Rarity.RARE, mage.cards.r.RhonassLastStand.class)); cards.add(new SetCardInfo("Rhonas's Stalwart", 133, Rarity.COMMON, mage.cards.r.RhonassStalwart.class)); cards.add(new SetCardInfo("Riddleform", 43, Rarity.UNCOMMON, mage.cards.r.Riddleform.class)); From 60ef4ce0da8d164b8ccbafb2156ce4728ea46059 Mon Sep 17 00:00:00 2001 From: spjspj Date: Tue, 4 Jul 2017 22:08:05 +1000 Subject: [PATCH 130/160] Implement 1 cards (HOU) --- .../src/mage/cards/c/ChampionOfWits.java | 52 ++++--------- .../src/mage/cards/r/ResilientKhenra.java | 78 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 3 files changed, 93 insertions(+), 38 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/r/ResilientKhenra.java diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfWits.java b/Mage.Sets/src/mage/cards/c/ChampionOfWits.java index c861acbd6a..d280fac8f9 100644 --- a/Mage.Sets/src/mage/cards/c/ChampionOfWits.java +++ b/Mage.Sets/src/mage/cards/c/ChampionOfWits.java @@ -29,19 +29,18 @@ package mage.cards.c; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.discard.DiscardControllerEffect; import mage.abilities.keyword.EternalizeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; /** * @@ -58,7 +57,14 @@ public class ChampionOfWits extends CardImpl { this.toughness = new MageInt(1); // When Champion of Wits enters the battlefield, you may draw cards equal to its power. If you do, discard two cards - this.addAbility(new EntersBattlefieldTriggeredAbility(new ChampionOfWitsEffect(), true)); + DynamicValue xValue = new SourcePermanentPowerCount(); + Effect effect = new DrawCardSourceControllerEffect(xValue); + effect.setText("you may draw cards equal to its power"); + Ability ability = new EntersBattlefieldTriggeredAbility(effect, true); + effect = new DiscardControllerEffect(2); + effect.setText("If you do, discard two cards"); + ability.addEffect(effect); + this.addAbility(ability); // Eternalize {5}{U}{U} this.addAbility(new EternalizeAbility(new ManaCostsImpl("{5}{U}{U}"), this)); @@ -72,34 +78,4 @@ public class ChampionOfWits extends CardImpl { public ChampionOfWits copy() { return new ChampionOfWits(this); } -} - -class ChampionOfWitsEffect extends OneShotEffect { - - public ChampionOfWitsEffect() { - super(Outcome.Benefit); - staticText = "you may draw cards equal to its power. If you do, discard two cards."; - } - - public ChampionOfWitsEffect(final ChampionOfWitsEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); - Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && permanent != null && sourceObject != null) { - controller.drawCards(permanent.getPower().getValue(), game); - controller.discard(2, false, source, game); - return true; - } - return false; - } - - @Override - public ChampionOfWitsEffect copy() { - return new ChampionOfWitsEffect(this); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/r/ResilientKhenra.java b/Mage.Sets/src/mage/cards/r/ResilientKhenra.java new file mode 100644 index 0000000000..88533bde67 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/ResilientKhenra.java @@ -0,0 +1,78 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.keyword.EternalizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author spjspj + */ +public class ResilientKhenra extends CardImpl { + + public ResilientKhenra(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add("Jackal"); + this.subtype.add("Wizard"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Resilient Khenra enters the battlefield, you may have target creature get +X/+X until end of turn, where X is Resilient Khenra's power. + DynamicValue xValue = new SourcePermanentPowerCount(); + Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(xValue, xValue, Duration.EndOfTurn, true), true); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // Eternalize {4}{G}{G} + this.addAbility(new EternalizeAbility(new ManaCostsImpl("{4}{G}{G}"), this)); + + } + + public ResilientKhenra(final ResilientKhenra card) { + super(card); + } + + @Override + public ResilientKhenra copy() { + return new ResilientKhenra(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 30b42df5f9..fafa94997b 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -142,6 +142,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Razaketh's Rite", 74, Rarity.UNCOMMON, mage.cards.r.RazakethsRite.class)); cards.add(new SetCardInfo("Reason // Believe", 154, Rarity.RARE, mage.cards.r.ReasonBelieve.class)); cards.add(new SetCardInfo("Refuse // Cooperate", 156, Rarity.RARE, mage.cards.r.RefuseCooperate.class)); + cards.add(new SetCardInfo("Resilient Khenra", 131, Rarity.RARE, mage.cards.r.ResilientKhenra.class)); cards.add(new SetCardInfo("Resolute Survivors", 142, Rarity.UNCOMMON, mage.cards.r.ResoluteSurvivors.class)); cards.add(new SetCardInfo("Rhonas's Last Stand", 132, Rarity.RARE, mage.cards.r.RhonassLastStand.class)); cards.add(new SetCardInfo("Rhonas's Stalwart", 133, Rarity.COMMON, mage.cards.r.RhonassStalwart.class)); From a80bf19dc41e0f6a3284d8d05dbe96bb581ed7cc Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Tue, 4 Jul 2017 08:19:45 -0400 Subject: [PATCH 131/160] Use {this} in text --- Mage.Sets/src/mage/cards/b/BlurOfBlades.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/b/BlurOfBlades.java b/Mage.Sets/src/mage/cards/b/BlurOfBlades.java index 1d8d4bdb0c..beb3c37bcd 100644 --- a/Mage.Sets/src/mage/cards/b/BlurOfBlades.java +++ b/Mage.Sets/src/mage/cards/b/BlurOfBlades.java @@ -49,7 +49,7 @@ public class BlurOfBlades extends CardImpl { // Put a -1/-1 counter on target creature. Blur of Blades deals 2 damage to that creature's controller. getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.M1M1.createInstance(1))); Effect effect = new DamageTargetControllerEffect(2); - effect.setText("Blur of Blades deals 2 damage to that creature's controller"); + effect.setText("{this} deals 2 damage to that creature's controller"); getSpellAbility().addEffect(effect); getSpellAbility().addTarget(new TargetCreaturePermanent()); From 95c5264cb2eeca4ff51d27209fad3a4e88219598 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Tue, 4 Jul 2017 09:38:18 -0400 Subject: [PATCH 132/160] Implement Harrier Naga --- Mage.Sets/src/mage/cards/h/HarrierNaga.java | 59 +++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/h/HarrierNaga.java diff --git a/Mage.Sets/src/mage/cards/h/HarrierNaga.java b/Mage.Sets/src/mage/cards/h/HarrierNaga.java new file mode 100644 index 0000000000..4754f89806 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HarrierNaga.java @@ -0,0 +1,59 @@ +/* + * 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.h; + +import java.util.UUID; +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author ciaccona007 + */ +public class HarrierNaga extends CardImpl { + + public HarrierNaga(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add("Naga"); + this.subtype.add("Warrior"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + } + + public HarrierNaga(final HarrierNaga card) { + super(card); + } + + @Override + public HarrierNaga copy() { + return new HarrierNaga(this); + } +} From 4b28f5c994ea876a6ccb022b7d5127fd139dd414 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Tue, 4 Jul 2017 11:46:58 -0400 Subject: [PATCH 133/160] Remove duplicates --- Mage.Sets/src/mage/cards/a/AerialGuide.java | 83 ------------------- .../src/mage/cards/a/AvenReedstalker.java | 68 --------------- 2 files changed, 151 deletions(-) delete mode 100644 Mage.Sets/src/mage/cards/a/AerialGuide.java delete mode 100644 Mage.Sets/src/mage/cards/a/AvenReedstalker.java diff --git a/Mage.Sets/src/mage/cards/a/AerialGuide.java b/Mage.Sets/src/mage/cards/a/AerialGuide.java deleted file mode 100644 index d1b43334d9..0000000000 --- a/Mage.Sets/src/mage/cards/a/AerialGuide.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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.a; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.common.AttacksTriggeredAbility; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; -import mage.abilities.keyword.FlyingAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.filter.common.FilterAttackingCreature; -import mage.filter.predicate.permanent.AnotherPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.target.common.TargetAttackingCreature; - -/** - * - * @author ciaccona007 - */ -public class AerialGuide extends CardImpl { - - static FilterAttackingCreature filter = new FilterAttackingCreature("another target attacking creature"); - - static { - filter.add(new AnotherPredicate()); - } - - public AerialGuide(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); - this.subtype.add("Drake"); - this.power = new MageInt(2); - this.toughness = new MageInt(2); - - // Flying - this.addAbility(FlyingAbility.getInstance()); - - // Whenever Aerial Guide attacks, another target attacking creature gains flying until end of turn. - Ability ability = new AttacksTriggeredAbility(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), false); - ability.addTarget(new TargetAttackingCreature(1, 1, filter, false)); - this.addAbility(ability); - } - - public AerialGuide(final AerialGuide card) { - super(card); - } - - @Override - public AerialGuide copy() { - return new AerialGuide(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/a/AvenReedstalker.java b/Mage.Sets/src/mage/cards/a/AvenReedstalker.java deleted file mode 100644 index 83c16a9ba5..0000000000 --- a/Mage.Sets/src/mage/cards/a/AvenReedstalker.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * 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.a; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.keyword.FlashAbility; -import mage.abilities.keyword.FlyingAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; - -/** - * - * @author ciaccona007 - */ -public class AvenReedstalker extends CardImpl { - - public AvenReedstalker(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); - - this.subtype.add("Bird"); - this.subtype.add("Warrior"); - this.power = new MageInt(2); - this.toughness = new MageInt(3); - - // Flash - this.addAbility(FlashAbility.getInstance()); - - // Flying - this.addAbility(FlyingAbility.getInstance()); - - } - - public AvenReedstalker(final AvenReedstalker card) { - super(card); - } - - @Override - public AvenReedstalker copy() { - return new AvenReedstalker(this); - } -} From 6baa978a481e7854d87dde3ecc88d8659792de04 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Tue, 4 Jul 2017 11:49:11 -0400 Subject: [PATCH 134/160] Implement 2 cards --- Mage.Sets/src/mage/cards/l/LifeGoesOn.java | 62 +++++++++++++++++ Mage.Sets/src/mage/cards/q/QuarryBeetle.java | 68 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 6 +- 3 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/l/LifeGoesOn.java create mode 100644 Mage.Sets/src/mage/cards/q/QuarryBeetle.java diff --git a/Mage.Sets/src/mage/cards/l/LifeGoesOn.java b/Mage.Sets/src/mage/cards/l/LifeGoesOn.java new file mode 100644 index 0000000000..f14fda75c1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LifeGoesOn.java @@ -0,0 +1,62 @@ +/* + * 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.l; + +import java.util.UUID; +import mage.abilities.condition.common.MorbidCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.watchers.common.MorbidWatcher; + +/** + * + * @author ciaccona007 + */ +public class LifeGoesOn extends CardImpl { + + public LifeGoesOn(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{G}"); + + + // You gain 4 life. If a creature died this turn, you gain 8 life instead. + getSpellAbility().addWatcher(new MorbidWatcher()); + getSpellAbility().addEffect(new ConditionalOneShotEffect(new GainLifeEffect(8), new GainLifeEffect(4), MorbidCondition.instance, "You gain 4 life. If a creature died this turn, you gain 8 life instead")); + } + + public LifeGoesOn(final LifeGoesOn card) { + super(card); + } + + @Override + public LifeGoesOn copy() { + return new LifeGoesOn(this); + } +} diff --git a/Mage.Sets/src/mage/cards/q/QuarryBeetle.java b/Mage.Sets/src/mage/cards/q/QuarryBeetle.java new file mode 100644 index 0000000000..f55b65d4ef --- /dev/null +++ b/Mage.Sets/src/mage/cards/q/QuarryBeetle.java @@ -0,0 +1,68 @@ +/* + * 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.q; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterLandCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author ciaccona007 + */ +public class QuarryBeetle extends CardImpl { + + public QuarryBeetle(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); + + this.subtype.add("Insect"); + this.power = new MageInt(4); + this.toughness = new MageInt(5); + + // When Quarry Beetle enters the battlefield, you may return target land card from your graveyard to the battlefield. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), true); + ability.addTarget(new TargetCardInYourGraveyard(new FilterLandCard("land card from your graveyard"))); + addAbility(ability); + } + + public QuarryBeetle(final QuarryBeetle card) { + super(card); + } + + @Override + public QuarryBeetle copy() { + return new QuarryBeetle(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 8e7912ec38..1b1e3eeea6 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -69,13 +69,10 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); cards.add(new SetCardInfo("Act of Heroism", 1, Rarity.COMMON, mage.cards.a.ActOfHeroism.class)); cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); - cards.add(new SetCardInfo("Aerial Guide", 29, Rarity.COMMON, mage.cards.a.AerialGuide.class)); cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); - cards.add(new SetCardInfo("Aven Reedstalker", 30, Rarity.COMMON, mage.cards.a.AvenReedstalker.class)); cards.add(new SetCardInfo("Aven of Enduring Hope", 5, Rarity.COMMON, mage.cards.a.AvenOfEnduringHope.class)); cards.add(new SetCardInfo("Appeal // Authority", 152, Rarity.UNCOMMON, mage.cards.a.AppealAuthority.class)); - cards.add(new SetCardInfo("Aven Reedstalker", 30, Rarity.COMMON, mage.cards.a.AvenReedstalker.class)); cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); cards.add(new SetCardInfo("Beneath The Sands", 111, Rarity.COMMON, mage.cards.b.BeneathTheSands.class)); cards.add(new SetCardInfo("Bitterbow Sharpshooters", 112, Rarity.COMMON, mage.cards.b.BitterbowSharpshooters.class)); @@ -115,6 +112,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); cards.add(new SetCardInfo("Grind // Dust", 155, Rarity.RARE, mage.cards.g.GrindDust.class)); + cards.add(new SetCardInfo("Harrier Naga", 118, Rarity.COMMON, mage.cards.h.HarrierNaga.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); @@ -122,6 +120,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); cards.add(new SetCardInfo("Kindled Fury", 101, Rarity.COMMON, mage.cards.k.KindledFury.class)); + cards.add(new SetCardInfo("Life Goes On", 121, Rarity.COMMON, mage.cards.l.LifeGoesOn.class)); cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); cards.add(new SetCardInfo("Lurching Rotbeast", 69, Rarity.COMMON, mage.cards.l.LurchingRotbeast.class)); cards.add(new SetCardInfo("Manalith", 164, Rarity.COMMON, mage.cards.m.Manalith.class)); @@ -138,6 +137,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Plains", 185, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Pride Sovereign", 126, Rarity.RARE, mage.cards.p.PrideSovereign.class)); cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); + cards.add(new SetCardInfo("Quarry Beetle", 127, Rarity.UNCOMMON, mage.cards.q.QuarryBeetle.class)); cards.add(new SetCardInfo("Rampaging Hippo", 128, Rarity.COMMON, mage.cards.r.RampagingHippo.class)); cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); cards.add(new SetCardInfo("Ramunap Hydra", 130, Rarity.RARE, mage.cards.r.RamunapHydra.class)); From fe95fc3b43381ee718ae0222c33866b72ec8f699 Mon Sep 17 00:00:00 2001 From: emerald000 Date: Tue, 4 Jul 2017 12:57:06 -0400 Subject: [PATCH 135/160] [HOU] Added 5 blue cards. Aven Reedstalker, Countervailing Winds, Cunning Survivor, Eternal of Harsh Truths and Hour of Eternity. --- .../src/mage/cards/a/AvenReedstalker.java | 68 ++++++++++ Mage.Sets/src/mage/cards/c/CircularLogic.java | 65 ++-------- .../src/mage/cards/c/CountervailingWinds.java | 69 +++++++++++ .../src/mage/cards/c/CunningSurvivor.java | 72 +++++++++++ .../mage/cards/e/EternalOfHarshTruths.java | 68 ++++++++++ .../src/mage/cards/h/HourOfEternity.java | 117 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 6 + .../abilities/keyword/AfflictAbility.java | 4 +- Utils/keywords.txt | 1 + 9 files changed, 411 insertions(+), 59 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/a/AvenReedstalker.java create mode 100644 Mage.Sets/src/mage/cards/c/CountervailingWinds.java create mode 100644 Mage.Sets/src/mage/cards/c/CunningSurvivor.java create mode 100644 Mage.Sets/src/mage/cards/e/EternalOfHarshTruths.java create mode 100644 Mage.Sets/src/mage/cards/h/HourOfEternity.java diff --git a/Mage.Sets/src/mage/cards/a/AvenReedstalker.java b/Mage.Sets/src/mage/cards/a/AvenReedstalker.java new file mode 100644 index 0000000000..f64907deb9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AvenReedstalker.java @@ -0,0 +1,68 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author emerald000 + */ +public class AvenReedstalker extends CardImpl { + + public AvenReedstalker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); + + this.subtype.add("Bird"); + this.subtype.add("Warrior"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + } + + public AvenReedstalker(final AvenReedstalker card) { + super(card); + } + + @Override + public AvenReedstalker copy() { + return new AvenReedstalker(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CircularLogic.java b/Mage.Sets/src/mage/cards/c/CircularLogic.java index 052f9834fa..5c9e2ad6e9 100644 --- a/Mage.Sets/src/mage/cards/c/CircularLogic.java +++ b/Mage.Sets/src/mage/cards/c/CircularLogic.java @@ -27,23 +27,17 @@ */ package mage.cards.c; -import mage.abilities.Ability; -import mage.abilities.Mode; -import mage.abilities.costs.mana.GenericManaCost; +import java.util.UUID; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.abilities.keyword.MadnessAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; -import mage.game.Game; -import mage.game.stack.StackObject; -import mage.players.Player; import mage.target.TargetSpell; -import java.util.UUID; - /** * * @author magenoxx_at_gmail.com @@ -53,13 +47,14 @@ public class CircularLogic extends CardImpl { public CircularLogic(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{U}"); - // Counter target spell unless its controller pays {1} for each card in your graveyard. - this.getSpellAbility().addEffect(new CircularLogicCounterUnlessPaysEffect()); + Effect effect = new CounterUnlessPaysEffect(new CardsInControllerGraveyardCount()); + effect.setText("Counter target spell unless its controller pays {1} for each card in your graveyard"); + this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetSpell()); // Madness {U} - this.addAbility(new MadnessAbility(this, new ManaCostsImpl("{U}"))); + this.addAbility(new MadnessAbility(this, new ManaCostsImpl<>("{U}"))); } public CircularLogic(final CircularLogic card) { @@ -71,47 +66,3 @@ public class CircularLogic extends CardImpl { return new CircularLogic(this); } } - -class CircularLogicCounterUnlessPaysEffect extends OneShotEffect { - - public CircularLogicCounterUnlessPaysEffect() { - super(Outcome.Detriment); - } - - public CircularLogicCounterUnlessPaysEffect(final CircularLogicCounterUnlessPaysEffect effect) { - super(effect); - } - - @Override - public CircularLogicCounterUnlessPaysEffect copy() { - return new CircularLogicCounterUnlessPaysEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - StackObject spell = game.getStack().getStackObject(targetPointer.getFirst(game, source)); - if (spell != null) { - Player player = game.getPlayer(spell.getControllerId()); - Player controller = game.getPlayer(source.getControllerId()); - if (player != null && controller != null) { - int amount = controller.getGraveyard().size(); - if (amount == 0) { - game.informPlayers("Circular Logic: no cards in controller's graveyard."); - } else { - GenericManaCost cost = new GenericManaCost(amount); - if (!cost.pay(source, game, spell.getControllerId(), spell.getControllerId(), false)) { - game.informPlayers("Circular Logic: cost wasn't payed - countering target spell."); - return game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game); - } - } - } - } - return false; - } - - @Override - public String getText(Mode mode) { - return "Counter target spell unless its controller pays {1} for each card in your graveyard"; - } - -} diff --git a/Mage.Sets/src/mage/cards/c/CountervailingWinds.java b/Mage.Sets/src/mage/cards/c/CountervailingWinds.java new file mode 100644 index 0000000000..bc1528f8e5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CountervailingWinds.java @@ -0,0 +1,69 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CounterUnlessPaysEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.TargetSpell; + +/** + * + * @author emerald000 + */ +public class CountervailingWinds extends CardImpl { + + public CountervailingWinds(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}"); + + // Counter target spell unless its controller pays {1} for each card in your graveyard. + Effect effect = new CounterUnlessPaysEffect(new CardsInControllerGraveyardCount()); + effect.setText("Counter target spell unless its controller pays {1} for each card in your graveyard"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetSpell()); + + // Cycling {2} + this.addAbility(new CyclingAbility(new GenericManaCost(2))); + + } + + public CountervailingWinds(final CountervailingWinds card) { + super(card); + } + + @Override + public CountervailingWinds copy() { + return new CountervailingWinds(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CunningSurvivor.java b/Mage.Sets/src/mage/cards/c/CunningSurvivor.java new file mode 100644 index 0000000000..44c2321bcd --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CunningSurvivor.java @@ -0,0 +1,72 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.CycleOrDiscardControllerTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author emerald000 + */ +public class CunningSurvivor extends CardImpl { + + public CunningSurvivor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add("Human"); + this.subtype.add("Warrior"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Whenever you cycle or discard a card, Cunning Survivor gets +1/+0 until end of turn and can't be blocked this turn. + Ability ability = new CycleOrDiscardControllerTriggeredAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn)); + Effect effect = new CantBeBlockedSourceEffect(Duration.EndOfTurn); + effect.setText("and can't be blocked this turn"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public CunningSurvivor(final CunningSurvivor card) { + super(card); + } + + @Override + public CunningSurvivor copy() { + return new CunningSurvivor(this); + } +} diff --git a/Mage.Sets/src/mage/cards/e/EternalOfHarshTruths.java b/Mage.Sets/src/mage/cards/e/EternalOfHarshTruths.java new file mode 100644 index 0000000000..e22fc74a9b --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EternalOfHarshTruths.java @@ -0,0 +1,68 @@ +/* + * 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.e; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.AfflictAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author emerald000 + */ +public class EternalOfHarshTruths extends CardImpl { + + public EternalOfHarshTruths(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add("Zombie"); + this.subtype.add("Cleric"); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Afflict 2 + this.addAbility(new AfflictAbility(2)); + + // Whenever Eternal of Harsh Truths attacks and isn't blocked, draw a card. + this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(new DrawCardSourceControllerEffect(1))); + } + + public EternalOfHarshTruths(final EternalOfHarshTruths card) { + super(card); + } + + @Override + public EternalOfHarshTruths copy() { + return new EternalOfHarshTruths(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HourOfEternity.java b/Mage.Sets/src/mage/cards/h/HourOfEternity.java new file mode 100644 index 0000000000..b17f9b8189 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HourOfEternity.java @@ -0,0 +1,117 @@ +/* + * 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.h; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.game.permanent.token.EmptyToken; +import mage.players.Player; +import mage.target.common.TargetCardInYourGraveyard; +import mage.util.CardUtil; + +/** + * + * @author emerald000 + */ +public class HourOfEternity extends CardImpl { + + public HourOfEternity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{U}{U}{U}"); + + // Exile X target creature cards from your graveyard. For each card exiled this way, create a token that's a copy of that card, except it's a 4/4 black Zombie. + this.getSpellAbility().addEffect(new HourOfEternityEffect()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, new FilterCreatureCard("creature cards from your graveyard"))); + } + + public HourOfEternity(final HourOfEternity card) { + super(card); + } + + @Override + public HourOfEternity copy() { + return new HourOfEternity(this); + } +} + +class HourOfEternityEffect extends OneShotEffect { + + HourOfEternityEffect() { + super(Outcome.PutCreatureInPlay); + this.staticText = "Exile X target creature cards from your graveyard. For each card exiled this way, create a token that's a copy of that card, except it's a 4/4 black Zombie"; + } + + HourOfEternityEffect(final HourOfEternityEffect effect) { + super(effect); + } + + @Override + public HourOfEternityEffect copy() { + return new HourOfEternityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Set cardsToExile = new HashSet<>(this.getTargetPointer().getTargets(game, source).size()); + for (UUID targetId : this.getTargetPointer().getTargets(game, source)) { + Card card = controller.getGraveyard().get(targetId, game); + if (card != null) { + cardsToExile.add(card); + } + } + controller.moveCardsToExile(cardsToExile, source, game, true, null, ""); + for (Card card : cardsToExile) { + if (game.getState().getZone(card.getId()) == Zone.EXILED) { + EmptyToken token = new EmptyToken(); + CardUtil.copyTo(token).from(card); + token.getPower().modifyBaseValue(4); + token.getToughness().modifyBaseValue(4); + token.getColor(game).setColor(ObjectColor.BLACK); + token.getSubtype(game).clear(); + token.getSubtype(game).add("Zombie"); + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId()); + } + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index fafa94997b..9435eb73d1 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -70,8 +70,10 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); + cards.add(new SetCardInfo("Aven Reedstalker", 30, Rarity.COMMON, mage.cards.a.AvenReedstalker.class)); cards.add(new SetCardInfo("Aven of Enduring Hope", 5, Rarity.COMMON, mage.cards.a.AvenOfEnduringHope.class)); cards.add(new SetCardInfo("Appeal // Authority", 152, Rarity.UNCOMMON, mage.cards.a.AppealAuthority.class)); + cards.add(new SetCardInfo("Aven Reedstalker", 30, Rarity.COMMON, mage.cards.a.AvenReedstalker.class)); cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); cards.add(new SetCardInfo("Beneath The Sands", 111, Rarity.COMMON, mage.cards.b.BeneathTheSands.class)); cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); @@ -84,7 +86,9 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); cards.add(new SetCardInfo("Claim // Fame", 150, Rarity.UNCOMMON, mage.cards.c.ClaimFame.class)); cards.add(new SetCardInfo("Consign // Oblivion", 149, Rarity.UNCOMMON, mage.cards.c.ConsignOblivion.class)); + cards.add(new SetCardInfo("Countervailing Winds", 32, Rarity.COMMON, mage.cards.c.CountervailingWinds.class)); cards.add(new SetCardInfo("Crook of Condemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfCondemnation.class)); + cards.add(new SetCardInfo("Cunning Survivor", 33, Rarity.COMMON, mage.cards.c.CunningSurvivor.class)); cards.add(new SetCardInfo("Dauntless Aven", 7, Rarity.COMMON, mage.cards.d.DauntlessAven.class)); cards.add(new SetCardInfo("Defiant Khenra", 89, Rarity.COMMON, mage.cards.d.DefiantKhenra.class)); cards.add(new SetCardInfo("Desert of the Fervent", 170, Rarity.COMMON, mage.cards.d.DesertOfTheFervent.class)); @@ -101,6 +105,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Driven // Despair", 157, Rarity.RARE, mage.cards.d.DrivenDespair.class)); cards.add(new SetCardInfo("Dutiful Servants", 12, Rarity.COMMON, mage.cards.d.DutifulServants.class)); cards.add(new SetCardInfo("Earthshaker Khenra", 90, Rarity.RARE, mage.cards.e.EarthshakerKhenra.class)); + cards.add(new SetCardInfo("Eternal of Harsh Truths", 34, Rarity.UNCOMMON, mage.cards.e.EternalOfHarshTruths.class)); cards.add(new SetCardInfo("Farm // Market", 148, Rarity.UNCOMMON, mage.cards.f.FarmMarket.class)); cards.add(new SetCardInfo("Feral Prowler", 115, Rarity.COMMON, mage.cards.f.FeralProwler.class)); cards.add(new SetCardInfo("Fervent Paincaster", 91, Rarity.UNCOMMON, mage.cards.f.FerventPaincaster.class)); @@ -109,6 +114,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); cards.add(new SetCardInfo("Grind // Dust", 155, Rarity.RARE, mage.cards.g.GrindDust.class)); + cards.add(new SetCardInfo("Hour of Eternity", 36, Rarity.RARE, mage.cards.h.HourOfEternity.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); diff --git a/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java b/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java index 24398c7eef..a97e4474a7 100644 --- a/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java @@ -14,7 +14,7 @@ public class AfflictAbility extends BecomesBlockedTriggeredAbility { public AfflictAbility(int amount) { super(new LoseLifeDefendingPlayerEffect(amount, true) - .setText("Afflict " + amount + "(Whenever this creature becomes blocked, defending player loses " + amount + " life.)"), false); + .setText("Afflict " + amount + " (Whenever this creature becomes blocked, defending player loses " + amount + " life.)"), false); lifeLoss = amount; } @@ -25,6 +25,6 @@ public class AfflictAbility extends BecomesBlockedTriggeredAbility { @Override public String getRule() { - return "Afflict " + lifeLoss + "(Whenever this creature becomes blocked, defending player loses " + lifeLoss + " life.)"; + return "Afflict " + lifeLoss + " (Whenever this creature becomes blocked, defending player loses " + lifeLoss + " life.)"; } } diff --git a/Utils/keywords.txt b/Utils/keywords.txt index cd343ae4ff..875ab52c00 100644 --- a/Utils/keywords.txt +++ b/Utils/keywords.txt @@ -1,3 +1,4 @@ +Afflict|number| Annihilator|number| Basic landcycling|cost| Battle cry|new| From a219df9ebe114c3e1e2fb7d03f57ece9d6a3a96e Mon Sep 17 00:00:00 2001 From: emerald000 Date: Tue, 4 Jul 2017 13:01:50 -0400 Subject: [PATCH 136/160] Merge commit. --- .../mage/cards/b/BitterbowSharpshooters.java | 68 ++++++++++++++++++ Mage.Sets/src/mage/cards/b/BlurOfBlades.java | 66 +++++++++++++++++ Mage.Sets/src/mage/cards/c/CrashThrough.java | 68 ++++++++++++++++++ .../src/mage/cards/d/DevoteeOfStrength.java | 70 +++++++++++++++++++ .../src/mage/cards/d/DunesOfTheDead.java | 64 +++++++++++++++++ Mage.Sets/src/mage/cards/h/HarrierNaga.java | 59 ++++++++++++++++ Mage.Sets/src/mage/cards/l/LifeGoesOn.java | 62 ++++++++++++++++ Mage.Sets/src/mage/cards/q/QuarryBeetle.java | 68 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 10 ++- 9 files changed, 534 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/b/BitterbowSharpshooters.java create mode 100644 Mage.Sets/src/mage/cards/b/BlurOfBlades.java create mode 100644 Mage.Sets/src/mage/cards/c/CrashThrough.java create mode 100644 Mage.Sets/src/mage/cards/d/DevoteeOfStrength.java create mode 100644 Mage.Sets/src/mage/cards/d/DunesOfTheDead.java create mode 100644 Mage.Sets/src/mage/cards/h/HarrierNaga.java create mode 100644 Mage.Sets/src/mage/cards/l/LifeGoesOn.java create mode 100644 Mage.Sets/src/mage/cards/q/QuarryBeetle.java diff --git a/Mage.Sets/src/mage/cards/b/BitterbowSharpshooters.java b/Mage.Sets/src/mage/cards/b/BitterbowSharpshooters.java new file mode 100644 index 0000000000..c711ed5fb1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BitterbowSharpshooters.java @@ -0,0 +1,68 @@ +/* + * 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.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.VigilanceAbility; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author ciaccona007 + */ +public class BitterbowSharpshooters extends CardImpl { + + public BitterbowSharpshooters(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); + + this.subtype.add("Jackal"); + this.subtype.add("Archer"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + } + + public BitterbowSharpshooters(final BitterbowSharpshooters card) { + super(card); + } + + @Override + public BitterbowSharpshooters copy() { + return new BitterbowSharpshooters(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BlurOfBlades.java b/Mage.Sets/src/mage/cards/b/BlurOfBlades.java new file mode 100644 index 0000000000..beb3c37bcd --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BlurOfBlades.java @@ -0,0 +1,66 @@ +/* + * 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.b; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetControllerEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author ciaccona007 + */ +public class BlurOfBlades extends CardImpl { + + public BlurOfBlades(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}"); + + // Put a -1/-1 counter on target creature. Blur of Blades deals 2 damage to that creature's controller. + getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.M1M1.createInstance(1))); + Effect effect = new DamageTargetControllerEffect(2); + effect.setText("{this} deals 2 damage to that creature's controller"); + getSpellAbility().addEffect(effect); + getSpellAbility().addTarget(new TargetCreaturePermanent()); + + } + + public BlurOfBlades(final BlurOfBlades card) { + super(card); + } + + @Override + public BlurOfBlades copy() { + return new BlurOfBlades(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CrashThrough.java b/Mage.Sets/src/mage/cards/c/CrashThrough.java new file mode 100644 index 0000000000..ac8e8d3ccc --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CrashThrough.java @@ -0,0 +1,68 @@ +/* + * 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.c; + +import java.util.UUID; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; + +/** + * + * @author ciaccona007 + */ +public class CrashThrough extends CardImpl { + + public CrashThrough(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{R}"); + + + // Creatures you control gain trample until end of turn. + getSpellAbility().addEffect(new GainAbilityAllEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent(), "Creatures you control gain trample until end of turn")); + + // Draw a card. + getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + } + + public CrashThrough(final CrashThrough card) { + super(card); + } + + @Override + public CrashThrough copy() { + return new CrashThrough(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DevoteeOfStrength.java b/Mage.Sets/src/mage/cards/d/DevoteeOfStrength.java new file mode 100644 index 0000000000..24f4214b6b --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DevoteeOfStrength.java @@ -0,0 +1,70 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +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.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author ciaccona007 + */ +public class DevoteeOfStrength extends CardImpl { + + public DevoteeOfStrength(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add("Naga"); + this.subtype.add("Wizard"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // {4}{G}: Target creature gets +2/+2 until end of turn. + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(2,2,Duration.EndOfTurn), new ManaCostsImpl("{4}{G}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public DevoteeOfStrength(final DevoteeOfStrength card) { + super(card); + } + + @Override + public DevoteeOfStrength copy() { + return new DevoteeOfStrength(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DunesOfTheDead.java b/Mage.Sets/src/mage/cards/d/DunesOfTheDead.java new file mode 100644 index 0000000000..600bc53237 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DunesOfTheDead.java @@ -0,0 +1,64 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.game.permanent.token.ZombieToken; + +/** + * + * @author ciaccona007 + */ +public class DunesOfTheDead extends CardImpl { + + public DunesOfTheDead(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + this.subtype.add("Desert"); + + // {T}: Add {C} to your mana pool. + addAbility(new ColorlessManaAbility()); + // When Dunes of the Dead is put into a graveyard from the battlefield, create a 2/2 black Zombie creature token. + this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 1), false)); + } + + public DunesOfTheDead(final DunesOfTheDead card) { + super(card); + } + + @Override + public DunesOfTheDead copy() { + return new DunesOfTheDead(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HarrierNaga.java b/Mage.Sets/src/mage/cards/h/HarrierNaga.java new file mode 100644 index 0000000000..4754f89806 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HarrierNaga.java @@ -0,0 +1,59 @@ +/* + * 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.h; + +import java.util.UUID; +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author ciaccona007 + */ +public class HarrierNaga extends CardImpl { + + public HarrierNaga(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add("Naga"); + this.subtype.add("Warrior"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + } + + public HarrierNaga(final HarrierNaga card) { + super(card); + } + + @Override + public HarrierNaga copy() { + return new HarrierNaga(this); + } +} diff --git a/Mage.Sets/src/mage/cards/l/LifeGoesOn.java b/Mage.Sets/src/mage/cards/l/LifeGoesOn.java new file mode 100644 index 0000000000..f14fda75c1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LifeGoesOn.java @@ -0,0 +1,62 @@ +/* + * 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.l; + +import java.util.UUID; +import mage.abilities.condition.common.MorbidCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.watchers.common.MorbidWatcher; + +/** + * + * @author ciaccona007 + */ +public class LifeGoesOn extends CardImpl { + + public LifeGoesOn(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{G}"); + + + // You gain 4 life. If a creature died this turn, you gain 8 life instead. + getSpellAbility().addWatcher(new MorbidWatcher()); + getSpellAbility().addEffect(new ConditionalOneShotEffect(new GainLifeEffect(8), new GainLifeEffect(4), MorbidCondition.instance, "You gain 4 life. If a creature died this turn, you gain 8 life instead")); + } + + public LifeGoesOn(final LifeGoesOn card) { + super(card); + } + + @Override + public LifeGoesOn copy() { + return new LifeGoesOn(this); + } +} diff --git a/Mage.Sets/src/mage/cards/q/QuarryBeetle.java b/Mage.Sets/src/mage/cards/q/QuarryBeetle.java new file mode 100644 index 0000000000..f55b65d4ef --- /dev/null +++ b/Mage.Sets/src/mage/cards/q/QuarryBeetle.java @@ -0,0 +1,68 @@ +/* + * 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.q; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterLandCard; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author ciaccona007 + */ +public class QuarryBeetle extends CardImpl { + + public QuarryBeetle(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); + + this.subtype.add("Insect"); + this.power = new MageInt(4); + this.toughness = new MageInt(5); + + // When Quarry Beetle enters the battlefield, you may return target land card from your graveyard to the battlefield. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), true); + ability.addTarget(new TargetCardInYourGraveyard(new FilterLandCard("land card from your graveyard"))); + addAbility(ability); + } + + public QuarryBeetle(final QuarryBeetle card) { + super(card); + } + + @Override + public QuarryBeetle copy() { + return new QuarryBeetle(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 9435eb73d1..3febef8c88 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -76,6 +76,8 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Aven Reedstalker", 30, Rarity.COMMON, mage.cards.a.AvenReedstalker.class)); cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); cards.add(new SetCardInfo("Beneath The Sands", 111, Rarity.COMMON, mage.cards.b.BeneathTheSands.class)); + cards.add(new SetCardInfo("Bitterbow Sharpshooters", 112, Rarity.COMMON, mage.cards.b.BitterbowSharpshooters.class)); + cards.add(new SetCardInfo("Blur of Blades", 84, Rarity.COMMON, mage.cards.b.BlurOfBlades.class)); cards.add(new SetCardInfo("Bontu's Last Reckoning", 60, Rarity.RARE, mage.cards.b.BontusLastReckoning.class)); cards.add(new SetCardInfo("Brambleweft Behemoth", 202, Rarity.COMMON, mage.cards.b.BrambleweftBehemoth.class)); cards.add(new SetCardInfo("Burning-Fist Minotaur", 85, Rarity.UNCOMMON, mage.cards.b.BurningFistMinotaur.class)); @@ -85,6 +87,8 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Chaos Maw", 87, Rarity.RARE, mage.cards.c.ChaosMaw.class)); cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); cards.add(new SetCardInfo("Claim // Fame", 150, Rarity.UNCOMMON, mage.cards.c.ClaimFame.class)); + cards.add(new SetCardInfo("Countervailing Winds", 32, Rarity.COMMON, mage.cards.c.CountervailingWinds.class)); + cards.add(new SetCardInfo("Crash Through", 88, Rarity.COMMON, mage.cards.c.CrashThrough.class)); cards.add(new SetCardInfo("Consign // Oblivion", 149, Rarity.UNCOMMON, mage.cards.c.ConsignOblivion.class)); cards.add(new SetCardInfo("Countervailing Winds", 32, Rarity.COMMON, mage.cards.c.CountervailingWinds.class)); cards.add(new SetCardInfo("Crook of Condemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfCondemnation.class)); @@ -97,11 +101,13 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Desert of the Mindful", 173, Rarity.COMMON, mage.cards.d.DesertOfTheMindful.class)); cards.add(new SetCardInfo("Desert of the True", 174, Rarity.COMMON, mage.cards.d.DesertOfTheTrue.class)); cards.add(new SetCardInfo("Desert's Hold", 8, Rarity.UNCOMMON, mage.cards.d.DesertsHold.class)); + cards.add(new SetCardInfo("Devotee of Strength", 113, Rarity.UNCOMMON, mage.cards.d.DevoteeOfStrength.class)); cards.add(new SetCardInfo("Disposal Mummy", 9, Rarity.COMMON, mage.cards.d.DisposalMummy.class)); cards.add(new SetCardInfo("Djeru's Renunciation", 11, Rarity.COMMON, mage.cards.d.DjerusRenunciation.class)); cards.add(new SetCardInfo("Djeru, With Eyes Open", 10, Rarity.RARE, mage.cards.d.DjeruWithEyesOpen.class)); cards.add(new SetCardInfo("Doomfall", 62, Rarity.UNCOMMON, mage.cards.d.Doomfall.class)); cards.add(new SetCardInfo("Dreamstealer", 63, Rarity.RARE, mage.cards.d.Dreamstealer.class)); + cards.add(new SetCardInfo("Dunes of the Dead", 175, Rarity.UNCOMMON, mage.cards.d.DunesOfTheDead.class)); cards.add(new SetCardInfo("Driven // Despair", 157, Rarity.RARE, mage.cards.d.DrivenDespair.class)); cards.add(new SetCardInfo("Dutiful Servants", 12, Rarity.COMMON, mage.cards.d.DutifulServants.class)); cards.add(new SetCardInfo("Earthshaker Khenra", 90, Rarity.RARE, mage.cards.e.EarthshakerKhenra.class)); @@ -114,7 +120,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); cards.add(new SetCardInfo("Grind // Dust", 155, Rarity.RARE, mage.cards.g.GrindDust.class)); - cards.add(new SetCardInfo("Hour of Eternity", 36, Rarity.RARE, mage.cards.h.HourOfEternity.class)); + cards.add(new SetCardInfo("Harrier Naga", 118, Rarity.COMMON, mage.cards.h.HarrierNaga.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); @@ -122,6 +128,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); cards.add(new SetCardInfo("Kindled Fury", 101, Rarity.COMMON, mage.cards.k.KindledFury.class)); + cards.add(new SetCardInfo("Life Goes On", 121, Rarity.COMMON, mage.cards.l.LifeGoesOn.class)); cards.add(new SetCardInfo("Leave // Chance", 153, Rarity.RARE, mage.cards.l.LeaveChance.class)); cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); cards.add(new SetCardInfo("Lurching Rotbeast", 69, Rarity.COMMON, mage.cards.l.LurchingRotbeast.class)); @@ -141,6 +148,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Plains", 185, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Pride Sovereign", 126, Rarity.RARE, mage.cards.p.PrideSovereign.class)); cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); + cards.add(new SetCardInfo("Quarry Beetle", 127, Rarity.UNCOMMON, mage.cards.q.QuarryBeetle.class)); cards.add(new SetCardInfo("Rampaging Hippo", 128, Rarity.COMMON, mage.cards.r.RampagingHippo.class)); cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); cards.add(new SetCardInfo("Ramunap Hydra", 130, Rarity.RARE, mage.cards.r.RamunapHydra.class)); From 38c287896258db51d43d759ad7f254eb6e916ba8 Mon Sep 17 00:00:00 2001 From: emerald000 Date: Tue, 4 Jul 2017 13:24:57 -0400 Subject: [PATCH 137/160] Fix Hour of Devastation set file errors. --- Mage.Sets/src/mage/sets/HourOfDevastation.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 3febef8c88..75f819b72f 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -87,10 +87,10 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Chaos Maw", 87, Rarity.RARE, mage.cards.c.ChaosMaw.class)); cards.add(new SetCardInfo("Cinder Barrens", 209, Rarity.COMMON, mage.cards.c.CinderBarrens.class)); cards.add(new SetCardInfo("Claim // Fame", 150, Rarity.UNCOMMON, mage.cards.c.ClaimFame.class)); - cards.add(new SetCardInfo("Countervailing Winds", 32, Rarity.COMMON, mage.cards.c.CountervailingWinds.class)); - cards.add(new SetCardInfo("Crash Through", 88, Rarity.COMMON, mage.cards.c.CrashThrough.class)); cards.add(new SetCardInfo("Consign // Oblivion", 149, Rarity.UNCOMMON, mage.cards.c.ConsignOblivion.class)); cards.add(new SetCardInfo("Countervailing Winds", 32, Rarity.COMMON, mage.cards.c.CountervailingWinds.class)); + cards.add(new SetCardInfo("Crash Through", 88, Rarity.COMMON, mage.cards.c.CrashThrough.class)); + cards.add(new SetCardInfo("Crested Sunmare", 6, Rarity.MYTHIC, mage.cards.c.CrestedSunmare.class)); cards.add(new SetCardInfo("Crook of Condemnation", 159, Rarity.UNCOMMON, mage.cards.c.CrookOfCondemnation.class)); cards.add(new SetCardInfo("Cunning Survivor", 33, Rarity.COMMON, mage.cards.c.CunningSurvivor.class)); cards.add(new SetCardInfo("Dauntless Aven", 7, Rarity.COMMON, mage.cards.d.DauntlessAven.class)); @@ -116,15 +116,21 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Feral Prowler", 115, Rarity.COMMON, mage.cards.f.FeralProwler.class)); cards.add(new SetCardInfo("Fervent Paincaster", 91, Rarity.UNCOMMON, mage.cards.f.FerventPaincaster.class)); cards.add(new SetCardInfo("Forest", 189, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Forest", 198, Rarity.LAND, mage.cards.basiclands.Forest.class)); + cards.add(new SetCardInfo("Forest", 199, Rarity.LAND, mage.cards.basiclands.Forest.class)); cards.add(new SetCardInfo("Fraying Sanity", 35, Rarity.UNCOMMON, mage.cards.f.FrayingSanity.class)); cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); + cards.add(new SetCardInfo("God-Pharaoh's Faithful", 14, Rarity.COMMON, mage.cards.g.GodPharaohsFaithful.class)); cards.add(new SetCardInfo("Grind // Dust", 155, Rarity.RARE, mage.cards.g.GrindDust.class)); cards.add(new SetCardInfo("Harrier Naga", 118, Rarity.COMMON, mage.cards.h.HarrierNaga.class)); + cards.add(new SetCardInfo("Hour of Eternity", 36, Rarity.RARE, mage.cards.h.HourOfEternity.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Island", 192, Rarity.LAND, mage.cards.basiclands.Island.class)); + cards.add(new SetCardInfo("Island", 193, Rarity.LAND, mage.cards.basiclands.Island.class)); cards.add(new SetCardInfo("Khenra Eternal", 66, Rarity.COMMON, mage.cards.k.KhenraEternal.class)); cards.add(new SetCardInfo("Khenra Scrapper", 100, Rarity.COMMON, mage.cards.k.KhenraScrapper.class)); cards.add(new SetCardInfo("Kindled Fury", 101, Rarity.COMMON, mage.cards.k.KindledFury.class)); @@ -136,6 +142,9 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); cards.add(new SetCardInfo("Moaning Wall", 72, Rarity.COMMON, mage.cards.m.MoaningWall.class)); cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Mountain", 196, Rarity.LAND, mage.cards.basiclands.Mountain.class)); + cards.add(new SetCardInfo("Mountain", 197, Rarity.LAND, mage.cards.basiclands.Mountain.class)); + cards.add(new SetCardInfo("Mummy Paramount", 16, Rarity.COMMON, mage.cards.m.MummyParamount.class)); cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); cards.add(new SetCardInfo("Nicol Bolas, the Deceiver", 205, Rarity.MYTHIC, mage.cards.n.NicolBolasTheDeceiver.class)); cards.add(new SetCardInfo("Nissa, Genesis Mage", 200, Rarity.MYTHIC, mage.cards.n.NissaGenesisMage.class)); @@ -146,6 +155,8 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Overwhelming Splendor", 19, Rarity.MYTHIC, mage.cards.o.OverwhelmingSplendor.class)); cards.add(new SetCardInfo("Overcome", 125, Rarity.UNCOMMON, mage.cards.o.Overcome.class)); cards.add(new SetCardInfo("Plains", 185, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Plains", 190, Rarity.LAND, mage.cards.basiclands.Plains.class)); + cards.add(new SetCardInfo("Plains", 191, Rarity.LAND, mage.cards.basiclands.Plains.class)); cards.add(new SetCardInfo("Pride Sovereign", 126, Rarity.RARE, mage.cards.p.PrideSovereign.class)); cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); cards.add(new SetCardInfo("Quarry Beetle", 127, Rarity.UNCOMMON, mage.cards.q.QuarryBeetle.class)); @@ -187,6 +198,8 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Supreme Will", 49, Rarity.UNCOMMON, mage.cards.s.SupremeWill.class)); cards.add(new SetCardInfo("Survivors' Encampment", 184, Rarity.COMMON, mage.cards.s.SurvivorsEncampment.class)); cards.add(new SetCardInfo("Swamp", 187, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); + cards.add(new SetCardInfo("Swamp", 194, Rarity.LAND, mage.cards.basiclands.Swamp.class)); + cards.add(new SetCardInfo("Swamp", 195, Rarity.LAND, mage.cards.basiclands.Swamp.class)); cards.add(new SetCardInfo("Swarm Intelligence", 50, Rarity.RARE, mage.cards.s.SwarmIntelligence.class)); cards.add(new SetCardInfo("Tenacious Hunter", 136, Rarity.UNCOMMON, mage.cards.t.TenaciousHunter.class)); cards.add(new SetCardInfo("The Locust God", 139, Rarity.MYTHIC, mage.cards.t.TheLocustGod.class)); From 38c35f0fcb248a733c36dbc2ce7c9b88c0f2c3f9 Mon Sep 17 00:00:00 2001 From: emerald000 Date: Tue, 4 Jul 2017 13:42:01 -0400 Subject: [PATCH 138/160] Fix gen-existing-cards-by-set.pl for split cards. --- Utils/gen-existing-cards-by-set.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Utils/gen-existing-cards-by-set.pl b/Utils/gen-existing-cards-by-set.pl index 66ac22e1ac..c292d6a971 100755 --- a/Utils/gen-existing-cards-by-set.pl +++ b/Utils/gen-existing-cards-by-set.pl @@ -32,7 +32,7 @@ my $templateBasicLand = Text::Template->new(TYPE => 'FILE', SOURCE => 'cardExten sub toCamelCase { my $string = $_[0]; $string =~ s/\b([\w']+)\b/ucfirst($1)/ge; - $string =~ s/[-,\s\']//g; + $string =~ s/[-,\s\'\/]//g; $string; } @@ -266,7 +266,7 @@ foreach $name_collectorid (sort @setCards) $githubTask {"- [x] Done -- [$cardName](https://www.google.com.au/search?q=$plus_cardName+$googleSetName+mtg&source=lnms&tbm=isch)\n"} = 1; } else { $unimplemented {$str} = 1; - $githubTask {"- [ ] Not Done -- [$cardName](https://www.google.com.au/search?q=$plus_cardName+$googleSetName+mtg&source=lnms&tbm=isch)\n"} = 1; + $githubTask {"- [ ] Not done -- [$cardName](https://www.google.com.au/search?q=$plus_cardName+$googleSetName+mtg&source=lnms&tbm=isch)\n"} = 1; } } } From 34319b6f607ddae14efc45a5f7d48c6f24fcfe85 Mon Sep 17 00:00:00 2001 From: ciaccona007 <> Date: Tue, 4 Jul 2017 14:20:17 -0400 Subject: [PATCH 139/160] Implement 2 HOU cards --- Mage.Sets/src/mage/cards/a/AerialGuide.java | 82 +++++++++++++++++++ Mage.Sets/src/mage/cards/a/Ambuscade.java | 81 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 2 + 3 files changed, 165 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AerialGuide.java create mode 100644 Mage.Sets/src/mage/cards/a/Ambuscade.java diff --git a/Mage.Sets/src/mage/cards/a/AerialGuide.java b/Mage.Sets/src/mage/cards/a/AerialGuide.java new file mode 100644 index 0000000000..1652963078 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AerialGuide.java @@ -0,0 +1,82 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.common.FilterAttackingCreature; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.common.TargetAttackingCreature; + +/** + * + * @author ciaccona007 + */ +public class AerialGuide extends CardImpl { + + static final FilterAttackingCreature filter = new FilterAttackingCreature("another target attacking creature"); + + static { + filter.add(new AnotherPredicate()); + } + + public AerialGuide(UUID ownerId, CardSetInfo setInfo) { + + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add("Drake"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Aerial Guide attacks, another target attacking creature gains flying until end of turn. + Ability ability = new AttacksTriggeredAbility(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), false); + ability.addTarget(new TargetAttackingCreature(1, 1, filter, false)); + addAbility(ability); + + } + + public AerialGuide(final AerialGuide card) { + super(card); + } + + @Override + public AerialGuide copy() { + return new AerialGuide(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/Ambuscade.java b/Mage.Sets/src/mage/cards/a/Ambuscade.java new file mode 100644 index 0000000000..86fc832b42 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/Ambuscade.java @@ -0,0 +1,81 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageWithPowerTargetEffect; +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.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author ciaccona007 + */ +public class Ambuscade extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you don't control"); + + static { + filter.add(new ControllerPredicate(TargetController.NOT_YOU)); + } + + public Ambuscade(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}"); + + + // Target creature you control gets +1/+0 until end of turn. + Effect effect = new BoostTargetEffect(1, 0, Duration.EndOfTurn); + effect.setApplyEffectsAfter(); // needed to count the boost for the second effect + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); + this.getSpellAbility().addEffect(effect); + + // It deals damage equal to its power to target creature you don't control. + effect = new DamageWithPowerTargetEffect(); + effect.setText("It deals damage equal to its power to target creature you don't control"); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + this.getSpellAbility().addEffect(effect); + } + + public Ambuscade(final Ambuscade card) { + super(card); + } + + @Override + public Ambuscade copy() { + return new Ambuscade(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 5f1b917205..62d7d4b2cf 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -68,6 +68,8 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Accursed Horde", 56, Rarity.UNCOMMON, mage.cards.a.AccursedHorde.class)); cards.add(new SetCardInfo("Act of Heroism", 1, Rarity.COMMON, mage.cards.a.ActOfHeroism.class)); cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); + cards.add(new SetCardInfo("Aerial Guide", 29, Rarity.COMMON, mage.cards.a.AerialGuide.class)); + cards.add(new SetCardInfo("Ambuscade", 110, Rarity.COMMON, mage.cards.a.Ambuscade.class)); cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); cards.add(new SetCardInfo("Aven of Enduring Hope", 5, Rarity.COMMON, mage.cards.a.AvenOfEnduringHope.class)); From dbd06d7e7878e6bcc0a89b2ee18893abb24e076a Mon Sep 17 00:00:00 2001 From: igoudt Date: Tue, 4 Jul 2017 20:47:21 +0200 Subject: [PATCH 140/160] gift of strength (HOU) --- .../src/mage/cards/g/GiftOfStrength.java | 37 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 6 ++- 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/g/GiftOfStrength.java diff --git a/Mage.Sets/src/mage/cards/g/GiftOfStrength.java b/Mage.Sets/src/mage/cards/g/GiftOfStrength.java new file mode 100644 index 0000000000..a218d3ac6e --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GiftOfStrength.java @@ -0,0 +1,37 @@ +package mage.cards.g; + +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.ReachAbility; +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; + +public class GiftOfStrength extends CardImpl { + + public GiftOfStrength(UUID cardId, CardSetInfo cardSetInfo){ + super(cardId, cardSetInfo, new CardType[]{CardType.INSTANT}, "{1}{G}"); + + // Target creature gets +3/+3 and gains reach until end of turn. + Effect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn); + effect.setText("Target creature gets +3/+3"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect(ReachAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains flying until end of turn"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public GiftOfStrength(final GiftOfStrength giftOfStrength){ + super(giftOfStrength); + } + + public GiftOfStrength copy(){ + return new GiftOfStrength(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 75f819b72f..d431f58c32 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -27,8 +27,6 @@ */ package mage.sets; -import java.util.ArrayList; -import java.util.List; import mage.cards.CardGraphicInfo; import mage.cards.ExpansionSet; import mage.cards.FrameStyle; @@ -38,6 +36,9 @@ import mage.cards.repository.CardRepository; import mage.constants.Rarity; import mage.constants.SetType; +import java.util.ArrayList; +import java.util.List; + /** * @author fireshoes */ @@ -120,6 +121,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Forest", 199, Rarity.LAND, mage.cards.basiclands.Forest.class)); cards.add(new SetCardInfo("Fraying Sanity", 35, Rarity.UNCOMMON, mage.cards.f.FrayingSanity.class)); cards.add(new SetCardInfo("Gideon's Defeat", 13, Rarity.UNCOMMON, mage.cards.g.GideonsDefeat.class)); + cards.add(new SetCardInfo("Gift of Strength", 117, Rarity.COMMON, mage.cards.g.GiftOfStrength.class)); cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); cards.add(new SetCardInfo("God-Pharaoh's Faithful", 14, Rarity.COMMON, mage.cards.g.GodPharaohsFaithful.class)); cards.add(new SetCardInfo("Grind // Dust", 155, Rarity.RARE, mage.cards.g.GrindDust.class)); From f79b53495010a0d4ce504653998274f3e1eff52a Mon Sep 17 00:00:00 2001 From: igoudt Date: Tue, 4 Jul 2017 20:52:20 +0200 Subject: [PATCH 141/160] granitic titan (HOU) --- Mage.Sets/src/mage/cards/g/GraniticTitan.java | 36 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 37 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GraniticTitan.java diff --git a/Mage.Sets/src/mage/cards/g/GraniticTitan.java b/Mage.Sets/src/mage/cards/g/GraniticTitan.java new file mode 100644 index 0000000000..56472d98ef --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GraniticTitan.java @@ -0,0 +1,36 @@ +package mage.cards.g; + +import mage.MageInt; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.CyclingAbility; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +public class GraniticTitan extends CardImpl { + + public GraniticTitan(UUID ownerId, CardSetInfo cardSetInfo){ + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE},"{4}{R}{R}"); + subtype.add("Elemental"); + power = new MageInt(5); + toughness = new MageInt(4); + + // Menace + addAbility(new MenaceAbility()); + + // Cycling {2} + addAbility(new CyclingAbility(new ManaCostsImpl<>("{2}"))); + + } + + public GraniticTitan(final GraniticTitan graniticTitan){ + super(graniticTitan); + } + + public GraniticTitan copy(){ + return new GraniticTitan(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index d431f58c32..6fca4aea6e 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -124,6 +124,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Gift of Strength", 117, Rarity.COMMON, mage.cards.g.GiftOfStrength.class)); cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); cards.add(new SetCardInfo("God-Pharaoh's Faithful", 14, Rarity.COMMON, mage.cards.g.GodPharaohsFaithful.class)); + cards.add(new SetCardInfo("Granitic Titan", 95, Rarity.COMMON, mage.cards.g.GraniticTitan.class)); cards.add(new SetCardInfo("Grind // Dust", 155, Rarity.RARE, mage.cards.g.GrindDust.class)); cards.add(new SetCardInfo("Harrier Naga", 118, Rarity.COMMON, mage.cards.h.HarrierNaga.class)); cards.add(new SetCardInfo("Hour of Eternity", 36, Rarity.RARE, mage.cards.h.HourOfEternity.class)); From a6081e1481a2b2c684c628fce313891bbbec8ad0 Mon Sep 17 00:00:00 2001 From: igoudt Date: Tue, 4 Jul 2017 21:41:44 +0200 Subject: [PATCH 142/160] added Manticore Elemental (HOU) --- Mage.Sets/src/mage/cards/m/ManticoreElemental.java | 4 ++++ Mage.Sets/src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 5 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/ManticoreElemental.java diff --git a/Mage.Sets/src/mage/cards/m/ManticoreElemental.java b/Mage.Sets/src/mage/cards/m/ManticoreElemental.java new file mode 100644 index 0000000000..9d74ef5208 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/ManticoreElemental.java @@ -0,0 +1,4 @@ +package mage.cards.m; + +public class ManticoreElemental { +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 6fca4aea6e..ac688e0c90 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -142,6 +142,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); cards.add(new SetCardInfo("Lurching Rotbeast", 69, Rarity.COMMON, mage.cards.l.LurchingRotbeast.class)); cards.add(new SetCardInfo("Manalith", 164, Rarity.COMMON, mage.cards.m.Manalith.class)); + cards.add(new SetCardInfo("Manticore Elemental", 103, Rarity.UNCOMMON, mage.cards.m.ManticoreElemental.class)); cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); cards.add(new SetCardInfo("Moaning Wall", 72, Rarity.COMMON, mage.cards.m.MoaningWall.class)); cards.add(new SetCardInfo("Mountain", 188, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); From 1792d98b1a98d1917c4f419432936fa863cc3cee Mon Sep 17 00:00:00 2001 From: igoudt Date: Tue, 4 Jul 2017 21:42:05 +0200 Subject: [PATCH 143/160] fix ability text --- Mage.Sets/src/mage/cards/g/GiftOfStrength.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/cards/g/GiftOfStrength.java b/Mage.Sets/src/mage/cards/g/GiftOfStrength.java index a218d3ac6e..b7f13b9a28 100644 --- a/Mage.Sets/src/mage/cards/g/GiftOfStrength.java +++ b/Mage.Sets/src/mage/cards/g/GiftOfStrength.java @@ -14,24 +14,24 @@ import java.util.UUID; public class GiftOfStrength extends CardImpl { - public GiftOfStrength(UUID cardId, CardSetInfo cardSetInfo){ - super(cardId, cardSetInfo, new CardType[]{CardType.INSTANT}, "{1}{G}"); + public GiftOfStrength(UUID ownerId, CardSetInfo cardSetInfo) { + super(ownerId, cardSetInfo, new CardType[]{CardType.INSTANT}, "{1}{G}"); // Target creature gets +3/+3 and gains reach until end of turn. Effect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn); effect.setText("Target creature gets +3/+3"); this.getSpellAbility().addEffect(effect); effect = new GainAbilityTargetEffect(ReachAbility.getInstance(), Duration.EndOfTurn); - effect.setText("and gains flying until end of turn"); + effect.setText("and gains reach until end of turn"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } - public GiftOfStrength(final GiftOfStrength giftOfStrength){ + public GiftOfStrength(final GiftOfStrength giftOfStrength) { super(giftOfStrength); } - public GiftOfStrength copy(){ + public GiftOfStrength copy() { return new GiftOfStrength(this); } } From 5bb1311a6ec0fe029a24cc4cd46e4d6574343db8 Mon Sep 17 00:00:00 2001 From: igoudt Date: Tue, 4 Jul 2017 21:53:43 +0200 Subject: [PATCH 144/160] added Magmaroth (HOU) --- Mage.Sets/src/mage/cards/m/Magmaroth.java | 4 ++++ Mage.Sets/src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 5 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/Magmaroth.java diff --git a/Mage.Sets/src/mage/cards/m/Magmaroth.java b/Mage.Sets/src/mage/cards/m/Magmaroth.java new file mode 100644 index 0000000000..b70d8ff625 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/Magmaroth.java @@ -0,0 +1,4 @@ +package mage.cards.m; + +public class Magmaroth { +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index ac688e0c90..a250703a02 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -141,6 +141,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Leave // Chance", 153, Rarity.RARE, mage.cards.l.LeaveChance.class)); cards.add(new SetCardInfo("Liliana's Defeat", 68, Rarity.UNCOMMON, mage.cards.l.LilianasDefeat.class)); cards.add(new SetCardInfo("Lurching Rotbeast", 69, Rarity.COMMON, mage.cards.l.LurchingRotbeast.class)); + cards.add(new SetCardInfo("Magmaroth", 102, Rarity.UNCOMMON, mage.cards.m.Magmaroth.class)); cards.add(new SetCardInfo("Manalith", 164, Rarity.COMMON, mage.cards.m.Manalith.class)); cards.add(new SetCardInfo("Manticore Elemental", 103, Rarity.UNCOMMON, mage.cards.m.ManticoreElemental.class)); cards.add(new SetCardInfo("Marauding Boneslasher", 70, Rarity.COMMON, mage.cards.m.MaraudingBoneslasher.class)); From 9fb04dc33cae5d3fee8e17d023b4782ab2370cfe Mon Sep 17 00:00:00 2001 From: igoudt Date: Tue, 4 Jul 2017 21:54:24 +0200 Subject: [PATCH 145/160] manticore elemental --- .../src/mage/cards/m/ManticoreElemental.java | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/m/ManticoreElemental.java b/Mage.Sets/src/mage/cards/m/ManticoreElemental.java index 9d74ef5208..905f2d0f5f 100644 --- a/Mage.Sets/src/mage/cards/m/ManticoreElemental.java +++ b/Mage.Sets/src/mage/cards/m/ManticoreElemental.java @@ -1,4 +1,35 @@ package mage.cards.m; -public class ManticoreElemental { +import mage.MageInt; +import mage.abilities.common.AttacksEachCombatStaticAbility; +import mage.abilities.keyword.AfflictAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +public class ManticoreElemental extends CardImpl { + + public ManticoreElemental(UUID ownerId, CardSetInfo cardSetInfo) { + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}"); + subtype.add("Zombie"); + subtype.add("Manticore"); + power = new MageInt(5); + toughness = new MageInt(4); + + // Afflict 3 + addAbility(new AfflictAbility(3)); + + // Manticore Elemental attacks each combat if able + addAbility(new AttacksEachCombatStaticAbility()); + } + + public ManticoreElemental(final ManticoreElemental manticoreElemental) { + super(manticoreElemental); + } + + public ManticoreElemental copy() { + return new ManticoreElemental(this); + } } From 1afcebc51a18a7fc526a88bc5189302d336368b0 Mon Sep 17 00:00:00 2001 From: igoudt Date: Tue, 4 Jul 2017 21:54:43 +0200 Subject: [PATCH 146/160] change subtype viashivan dragon --- Mage.Sets/src/mage/cards/v/ViashivanDragon.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/v/ViashivanDragon.java b/Mage.Sets/src/mage/cards/v/ViashivanDragon.java index 9a94b31aa6..5052b426f8 100644 --- a/Mage.Sets/src/mage/cards/v/ViashivanDragon.java +++ b/Mage.Sets/src/mage/cards/v/ViashivanDragon.java @@ -18,7 +18,7 @@ public class ViashivanDragon extends CardImpl { public ViashivanDragon(UUID cardId, CardSetInfo cardSetInfo) { super(cardId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}{G}{G}"); - subtype.add("DRAGON"); + subtype.add("Dragon"); color.setGreen(true); color.setRed(true); power = new MageInt(4); From 8f0e043361403dffef35df44c1d8e2f2dda063f4 Mon Sep 17 00:00:00 2001 From: igoudt Date: Tue, 4 Jul 2017 21:55:24 +0200 Subject: [PATCH 147/160] added Magmaroth (HOU) --- Mage.Sets/src/mage/cards/m/Magmaroth.java | 46 ++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/m/Magmaroth.java b/Mage.Sets/src/mage/cards/m/Magmaroth.java index b70d8ff625..cdabe61fbd 100644 --- a/Mage.Sets/src/mage/cards/m/Magmaroth.java +++ b/Mage.Sets/src/mage/cards/m/Magmaroth.java @@ -1,4 +1,48 @@ package mage.cards.m; -public class Magmaroth { +import mage.MageInt; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.counters.CounterType; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; + +import java.util.UUID; + +public class Magmaroth extends CardImpl{ + + private static final FilterSpell filterNonCreature = new FilterSpell("a noncreature spell"); + + static { + filterNonCreature.add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); + } + + public Magmaroth(UUID ownerId, CardSetInfo cardSetInfo){ + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + subtype.add("Elemental"); + power = new MageInt(5); + toughness = new MageInt(5); + + // At the beginning of your upkeep, put a -1/-1 counter on Magmaroth + addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.M1M1.createInstance()), TargetController.YOU, false)); + + // Whenever you cast a noncreature spell, remove a -1/-1 counter from Magmaroth + addAbility(new SpellCastControllerTriggeredAbility(new RemoveCounterSourceEffect(CounterType.M1M1.createInstance()), filterNonCreature, false)); + + } + + public Magmaroth(final Magmaroth magmaroth){ + super(magmaroth); + } + + public Magmaroth copy(){ + return new Magmaroth(this); + } } From 29eb1f478f2695546ddc92eb9eb176930ae2b616 Mon Sep 17 00:00:00 2001 From: spjspj Date: Wed, 5 Jul 2017 07:53:59 +1000 Subject: [PATCH 148/160] Implement 2 cards (HOU) --- Mage.Sets/src/mage/cards/o/OminousSphinx.java | 83 +++++++++++++++++++ .../src/mage/cards/p/PuncturingBlow.java | 61 ++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 2 + 3 files changed, 146 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/o/OminousSphinx.java create mode 100644 Mage.Sets/src/mage/cards/p/PuncturingBlow.java diff --git a/Mage.Sets/src/mage/cards/o/OminousSphinx.java b/Mage.Sets/src/mage/cards/o/OminousSphinx.java new file mode 100644 index 0000000000..4f5ca332a9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OminousSphinx.java @@ -0,0 +1,83 @@ +/* + * 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.o; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.CycleOrDiscardControllerTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author spjspj + */ +public class OminousSphinx extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + public OminousSphinx(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); + + this.subtype.add("Sphinx"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever you cycle or discard a card,target creature an opponent controls gets -2/-0 until end of turn. + CycleOrDiscardControllerTriggeredAbility ability = new CycleOrDiscardControllerTriggeredAbility(new BoostTargetEffect(-2, -0, Duration.EndOfTurn)); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } + + public OminousSphinx(final OminousSphinx card) { + super(card); + } + + @Override + public OminousSphinx copy() { + return new OminousSphinx(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/PuncturingBlow.java b/Mage.Sets/src/mage/cards/p/PuncturingBlow.java new file mode 100644 index 0000000000..b7bf5c15ec --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PuncturingBlow.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.cards.p; + +import java.util.UUID; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.ExileTargetIfDiesEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author spjspj + */ +public class PuncturingBlow extends CardImpl { + + public PuncturingBlow(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}{R}"); + + // Puncturing Blow deals 5 damage to target creature. If that creature would die this turn, exile it instead. + this.getSpellAbility().addEffect(new DamageTargetEffect(5)); + this.getSpellAbility().addEffect(new ExileTargetIfDiesEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public PuncturingBlow(final PuncturingBlow card) { + super(card); + } + + @Override + public PuncturingBlow copy() { + return new PuncturingBlow(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 4d1a645a1f..bbd392d8d4 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -158,6 +158,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Oasis Ritualist", 124, Rarity.COMMON, mage.cards.o.OasisRitualist.class)); cards.add(new SetCardInfo("Oketra's Avenger", 17, Rarity.COMMON, mage.cards.o.OketrasAvenger.class)); cards.add(new SetCardInfo("Oketra's Last Mercy", 18, Rarity.RARE, mage.cards.o.OketrasLastMercy.class)); + cards.add(new SetCardInfo("Ominous Sphinx", 41, Rarity.UNCOMMON, mage.cards.o.OminousSphinx.class)); cards.add(new SetCardInfo("Open Fire", 105, Rarity.COMMON, mage.cards.o.OpenFire.class)); cards.add(new SetCardInfo("Overwhelming Splendor", 19, Rarity.MYTHIC, mage.cards.o.OverwhelmingSplendor.class)); cards.add(new SetCardInfo("Overcome", 125, Rarity.UNCOMMON, mage.cards.o.Overcome.class)); @@ -166,6 +167,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Plains", 191, Rarity.LAND, mage.cards.basiclands.Plains.class)); cards.add(new SetCardInfo("Pride Sovereign", 126, Rarity.RARE, mage.cards.p.PrideSovereign.class)); cards.add(new SetCardInfo("Proven Combatant", 42, Rarity.COMMON, mage.cards.p.ProvenCombatant.class)); + cards.add(new SetCardInfo("Puncturing Blow", 106, Rarity.COMMON, mage.cards.p.PuncturingBlow.class)); cards.add(new SetCardInfo("Quarry Beetle", 127, Rarity.UNCOMMON, mage.cards.q.QuarryBeetle.class)); cards.add(new SetCardInfo("Rampaging Hippo", 128, Rarity.COMMON, mage.cards.r.RampagingHippo.class)); cards.add(new SetCardInfo("Ramunap Excavator", 129, Rarity.RARE, mage.cards.r.RamunapExcavator.class)); From 80fde88caeb063d4e796dc9b99ae8d7ce5d04080 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 5 Jul 2017 07:15:57 +0200 Subject: [PATCH 149/160] [HOU] Added Hour of Promise.. --- Mage.Sets/src/mage/cards/h/HourOfPromise.java | 71 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 72 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/h/HourOfPromise.java diff --git a/Mage.Sets/src/mage/cards/h/HourOfPromise.java b/Mage.Sets/src/mage/cards/h/HourOfPromise.java new file mode 100644 index 0000000000..678a446aea --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HourOfPromise.java @@ -0,0 +1,71 @@ +/* + * 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.h; + +import java.util.UUID; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterLandCard; +import mage.game.permanent.token.ZombieToken; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author LevelX2 + */ +public class HourOfPromise extends CardImpl { + + public HourOfPromise(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{G}"); + + // Search your library for up to two land cards and put them onto the battlefield tapped, then shuffle your library. + this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(0, 2, new FilterLandCard("land cards")), true)); + // Then if you control three or more Deserts, create two 2/2 black Zombie creature tokens. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new CreateTokenEffect(new ZombieToken(), 2), + new PermanentsOnTheBattlefieldCondition(new FilterPermanent(SubType.DESERT, "three or more Deserts"), ComparisonType.MORE_THAN, 2, true), + "Then if you control three or more Deserts, create two 2/2 black Zombie creature tokens")); + + } + + public HourOfPromise(final HourOfPromise card) { + super(card); + } + + @Override + public HourOfPromise copy() { + return new HourOfPromise(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index bbd392d8d4..898350326c 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -131,6 +131,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Harrier Naga", 118, Rarity.COMMON, mage.cards.h.HarrierNaga.class)); cards.add(new SetCardInfo("Hour of Eternity", 36, Rarity.RARE, mage.cards.h.HourOfEternity.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); + cards.add(new SetCardInfo("Hour of Promise", 120, Rarity.RARE, mage.cards.h.HourOfPromise.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); From f5c925d26c4b542e4af0c8172222e9ef9af4e703 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 5 Jul 2017 07:58:46 +0200 Subject: [PATCH 150/160] [HOU] Added Imaginary Threats. --- .../src/mage/cards/i/ImaginaryThreats.java | 106 ++++++++++++++++++ Mage.Sets/src/mage/cards/i/InciteWar.java | 4 +- .../src/mage/sets/HourOfDevastation.java | 1 + ...ntapInOpponentsNextUntapStepAllEffect.java | 10 +- 4 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/i/ImaginaryThreats.java diff --git a/Mage.Sets/src/mage/cards/i/ImaginaryThreats.java b/Mage.Sets/src/mage/cards/i/ImaginaryThreats.java new file mode 100644 index 0000000000..14f997c4f9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/ImaginaryThreats.java @@ -0,0 +1,106 @@ +/* + * 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.i; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.RequirementEffect; +import mage.abilities.effects.common.DontUntapInOpponentsNextUntapStepAllEffect; +import mage.abilities.effects.common.combat.AttacksIfAbleAllEffect; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetOpponent; + +/** + * + * @author LevelX2 + */ +public class ImaginaryThreats extends CardImpl { + + public ImaginaryThreats(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}{U}"); + + // Creatures target opponent controls attack this turn if able. During that player's next untap step, creatures he or she controls don't untap. + getSpellAbility().addEffect(new ImaginaryThreatsEffect()); + getSpellAbility().addTarget(new TargetOpponent()); + getSpellAbility().addEffect(new DontUntapInOpponentsNextUntapStepAllEffect(new FilterCreaturePermanent()) + .setText("During that player's next untap step, creatures he or she controls don't untap")); + // Cycling {2} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + + } + + public ImaginaryThreats(final ImaginaryThreats card) { + super(card); + } + + @Override + public ImaginaryThreats copy() { + return new ImaginaryThreats(this); + } +} + +class ImaginaryThreatsEffect extends OneShotEffect { + + public ImaginaryThreatsEffect() { + super(Outcome.Detriment); + staticText = "Creatures target opponent controls attack this turn if able"; + } + + public ImaginaryThreatsEffect(final ImaginaryThreatsEffect effect) { + super(effect); + } + + @Override + public ImaginaryThreatsEffect copy() { + return new ImaginaryThreatsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + if (player != null) { + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new ControllerIdPredicate(player.getId())); + RequirementEffect effect = new AttacksIfAbleAllEffect(filter, Duration.EndOfTurn); + game.addEffect(effect, source); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/i/InciteWar.java b/Mage.Sets/src/mage/cards/i/InciteWar.java index 8e97aeb00c..26dcef22f1 100644 --- a/Mage.Sets/src/mage/cards/i/InciteWar.java +++ b/Mage.Sets/src/mage/cards/i/InciteWar.java @@ -63,7 +63,7 @@ public class InciteWar extends CardImpl { } public InciteWar(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}"); // Choose one - Creatures target player controls attack this turn if able; this.getSpellAbility().addEffect(new InciteWarMustAttackEffect()); @@ -93,7 +93,7 @@ class InciteWarMustAttackEffect extends OneShotEffect { public InciteWarMustAttackEffect() { super(Outcome.Detriment); - staticText = "Creatures target player control attack this turn if able"; + staticText = "Creatures target player controls attack this turn if able"; } public InciteWarMustAttackEffect(final InciteWarMustAttackEffect effect) { diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 898350326c..6a9f72cc02 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -133,6 +133,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Promise", 120, Rarity.RARE, mage.cards.h.HourOfPromise.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); + cards.add(new SetCardInfo("Imaginary Threats", 37, Rarity.UNCOMMON, mage.cards.i.ImaginaryThreats.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); cards.add(new SetCardInfo("Island", 192, Rarity.LAND, mage.cards.basiclands.Island.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/DontUntapInOpponentsNextUntapStepAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DontUntapInOpponentsNextUntapStepAllEffect.java index 81d25066c5..d3a78b0240 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DontUntapInOpponentsNextUntapStepAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DontUntapInOpponentsNextUntapStepAllEffect.java @@ -34,7 +34,6 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.PhaseStep; -import mage.constants.TargetController; import mage.filter.FilterPermanent; import mage.game.Game; import mage.game.events.GameEvent; @@ -49,23 +48,23 @@ public class DontUntapInOpponentsNextUntapStepAllEffect extends ContinuousRuleMo private int validForTurnNum; //private String targetName; - TargetController targetController; FilterPermanent filter; /** * Attention: This effect won't work with targets controlled by different * controllers If this is needed, the validForTurnNum has to be saved per * controller. + * + * @param filter */ public DontUntapInOpponentsNextUntapStepAllEffect(FilterPermanent filter) { super(Duration.Custom, Outcome.Detriment, false, true); - this.filter = filter; + this.filter = filter; } public DontUntapInOpponentsNextUntapStepAllEffect(final DontUntapInOpponentsNextUntapStepAllEffect effect) { super(effect); this.validForTurnNum = effect.validForTurnNum; - this.targetController = effect.targetController; this.filter = effect.filter; } @@ -127,7 +126,8 @@ public class DontUntapInOpponentsNextUntapStepAllEffect extends ContinuousRuleMo if (controller != null && !game.isOpponent(controller, permanent.getControllerId())) { return false; } - if (game.getActivePlayerId().equals(permanent.getControllerId()) && // controller's untap step + if (game.getActivePlayerId().equals(permanent.getControllerId()) + && // controller's untap step filter.match(permanent, source.getSourceId(), source.getControllerId(), game)) { return true; } From f3fb7a522e60ade692a192d076ba3475f973bd34 Mon Sep 17 00:00:00 2001 From: spjspj Date: Wed, 5 Jul 2017 22:45:52 +1000 Subject: [PATCH 151/160] Implement 1 card (HOU) --- .../src/mage/cards/n/NehebTheEternal.java | 113 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 114 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/n/NehebTheEternal.java diff --git a/Mage.Sets/src/mage/cards/n/NehebTheEternal.java b/Mage.Sets/src/mage/cards/n/NehebTheEternal.java new file mode 100644 index 0000000000..6483119781 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NehebTheEternal.java @@ -0,0 +1,113 @@ +/* + * 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.Mana; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfPostCombatMainTriggeredAbility; +import mage.abilities.dynamicvalue.common.OpponentsLostLifeCount; +import mage.abilities.effects.common.ManaEffect; +import mage.abilities.keyword.AfflictAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author spjspj + */ +public class NehebTheEternal extends CardImpl { + + public NehebTheEternal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}"); + + addSuperType(SuperType.LEGENDARY); + this.subtype.add("Zombie"); + this.subtype.add("Minotaur"); + this.subtype.add("Warrior"); + this.power = new MageInt(4); + this.toughness = new MageInt(6); + + // Afflict 3 + addAbility(new AfflictAbility(3)); + + // At the beginning of your postcombat main phase, add {R} to your mana pool for each 1 life your opponents have lost this turn. + this.addAbility(new BeginningOfPostCombatMainTriggeredAbility(new NehebTheEternalManaEffect(), TargetController.YOU, false)); + } + + public NehebTheEternal(final NehebTheEternal card) { + super(card); + } + + @Override + public NehebTheEternal copy() { + return new NehebTheEternal(this); + } +} + +class NehebTheEternalManaEffect extends ManaEffect { + + NehebTheEternalManaEffect() { + super(); + this.staticText = "add {R} to your mana pool for each 1 life your opponents have lost this turn"; + } + + NehebTheEternalManaEffect(final NehebTheEternalManaEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + OpponentsLostLifeCount dynamicValue = new OpponentsLostLifeCount(); + int amount = dynamicValue.calculate(game, source, this); + if (amount > 0) { + controller.getManaPool().addMana(Mana.RedMana(amount), game, source); + return true; + } + } + return false; + } + + @Override + public NehebTheEternalManaEffect copy() { + return new NehebTheEternalManaEffect(this); + } + + @Override + public Mana getMana(Game game, Ability source) { + return null; + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index bbd392d8d4..d4353d4697 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -152,6 +152,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Mountain", 196, Rarity.LAND, mage.cards.basiclands.Mountain.class)); cards.add(new SetCardInfo("Mountain", 197, Rarity.LAND, mage.cards.basiclands.Mountain.class)); cards.add(new SetCardInfo("Mummy Paramount", 16, Rarity.COMMON, mage.cards.m.MummyParamount.class)); + cards.add(new SetCardInfo("Neheb, the Eternal", 104, Rarity.MYTHIC, mage.cards.n.NehebTheEternal.class)); cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); cards.add(new SetCardInfo("Nicol Bolas, the Deceiver", 205, Rarity.MYTHIC, mage.cards.n.NicolBolasTheDeceiver.class)); cards.add(new SetCardInfo("Nissa, Genesis Mage", 200, Rarity.MYTHIC, mage.cards.n.NissaGenesisMage.class)); From 22a192fb3cb621d0b5a84087e7bc02da48f9466b Mon Sep 17 00:00:00 2001 From: spjspj Date: Wed, 5 Jul 2017 23:24:37 +1000 Subject: [PATCH 152/160] Implement 1 card (HOU) --- Mage.Sets/src/mage/cards/h/HollowOne.java | 131 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 132 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/h/HollowOne.java diff --git a/Mage.Sets/src/mage/cards/h/HollowOne.java b/Mage.Sets/src/mage/cards/h/HollowOne.java new file mode 100644 index 0000000000..91a2886c8c --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HollowOne.java @@ -0,0 +1,131 @@ +/* + * 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.h; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.keyword.CyclingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.CostModificationType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.util.CardUtil; +import mage.watchers.common.CardsCycledOrDiscardedThisTurnWatcher; + +/** + * + * @author spjspj + */ +public class HollowOne extends CardImpl { + + public HollowOne(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{5}"); + + this.subtype.add("Golem"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Hollow One costs {2} less to cast for each card you've cycled or discarded this turn. + Ability ability = new SimpleStaticAbility(Zone.ALL, new HollowOneReductionEffect()); + ability.setRuleAtTheTop(true); + this.addAbility(ability, new CardsCycledOrDiscardedThisTurnWatcher()); + + // Cycling {2} + this.addAbility(new CyclingAbility(new ManaCostsImpl("{2}"))); + } + + public HollowOne(final HollowOne card) { + super(card); + } + + @Override + public HollowOne copy() { + return new HollowOne(this); + } +} + +class HollowOneReductionEffect extends CostModificationEffectImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + + static { + filter.add(new AttackingPredicate()); + } + + public HollowOneReductionEffect() { + super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST); + staticText = "{this} costs {2} less to cast for each card you've cycled or discarded this turn"; + } + + protected HollowOneReductionEffect(HollowOneReductionEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source, Ability abilityToModify) { + Player controller = game.getPlayer(source.getControllerId()); + CardsCycledOrDiscardedThisTurnWatcher watcher = (CardsCycledOrDiscardedThisTurnWatcher) game.getState().getWatchers().get(CardsCycledOrDiscardedThisTurnWatcher.class.getSimpleName()); + int reductionAmount = 0; + if (controller != null && watcher != null) { + for (Card card : watcher.getCardsCycledOrDiscardedThisTurn(controller.getId()).getCards(game)) { + if (card.getOwnerId().equals(controller.getId())) { + reductionAmount++; + } + } + CardUtil.reduceCost(abilityToModify, reductionAmount * 2); + return true; + } + return false; + } + + @Override + public boolean applies(Ability abilityToModify, Ability source, Game game) { + if ((abilityToModify instanceof SpellAbility) && abilityToModify.getSourceId().equals(source.getSourceId())) { + return game.getCard(abilityToModify.getSourceId()) != null; + } + return false; + } + + @Override + public HollowOneReductionEffect copy() { + return new HollowOneReductionEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index d4353d4697..708faf8ed3 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -129,6 +129,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Granitic Titan", 95, Rarity.COMMON, mage.cards.g.GraniticTitan.class)); cards.add(new SetCardInfo("Grind // Dust", 155, Rarity.RARE, mage.cards.g.GrindDust.class)); cards.add(new SetCardInfo("Harrier Naga", 118, Rarity.COMMON, mage.cards.h.HarrierNaga.class)); + cards.add(new SetCardInfo("Hollow One", 163, Rarity.RARE, mage.cards.h.HollowOne.class)); cards.add(new SetCardInfo("Hour of Eternity", 36, Rarity.RARE, mage.cards.h.HourOfEternity.class)); cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); From ec9564984d2425621eab0b4b2e73a2d661c27a3e Mon Sep 17 00:00:00 2001 From: Lazar Date: Wed, 5 Jul 2017 16:05:15 +0200 Subject: [PATCH 153/160] ammit eternal impl + tested (#3595) * ammit eternal impl + tested * fixed combat damage to player --- Mage.Sets/src/mage/cards/a/AmmitEternal.java | 42 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 43 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AmmitEternal.java diff --git a/Mage.Sets/src/mage/cards/a/AmmitEternal.java b/Mage.Sets/src/mage/cards/a/AmmitEternal.java new file mode 100644 index 0000000000..16d1b5278a --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AmmitEternal.java @@ -0,0 +1,42 @@ +package mage.cards.a; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.SpellCastOpponentTriggeredAbility; +import mage.abilities.effects.common.RemoveAllCountersSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.AfflictAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; + +public class AmmitEternal extends CardImpl { + + public AmmitEternal(UUID ownerId, CardSetInfo cardSetInfo) { + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + subtype.add("Zombie"); + subtype.add("Crocodile"); + subtype.add("Demon"); + power = new MageInt(5); + toughness = new MageInt(5); + + // Afflict 3 (Whenever this creature becomes blocked, defending player loses 3 life.) + this.addAbility(new AfflictAbility(3)); + + // Whenever an opponent casts a spell, put a -1/-1 counter on Ammit Eternal. + this.addAbility(new SpellCastOpponentTriggeredAbility(new AddCountersSourceEffect(CounterType.M1M1.createInstance()), false)); + + // Whenever Ammit Eternal deals combat damage to a player, remove all -1/-1 counters from it. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new RemoveAllCountersSourceEffect(CounterType.M1M1), false)); + } + + public AmmitEternal(final AmmitEternal ammitEternal) { + super(ammitEternal); + } + + public AmmitEternal copy() { + return new AmmitEternal(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 8eab58cff0..63cef59e7e 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -71,6 +71,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Adorned Pouncer", 2, Rarity.RARE, mage.cards.a.AdornedPouncer.class)); cards.add(new SetCardInfo("Aerial Guide", 29, Rarity.COMMON, mage.cards.a.AerialGuide.class)); cards.add(new SetCardInfo("Ambuscade", 110, Rarity.COMMON, mage.cards.a.Ambuscade.class)); + cards.add(new SetCardInfo("Ammit Eternal", 57, Rarity.RARE, mage.cards.a.AmmitEternal.class)); cards.add(new SetCardInfo("Angel of Condemnation", 3, Rarity.RARE, mage.cards.a.AngelOfCondemnation.class)); cards.add(new SetCardInfo("Angel of the God-Pharaoh", 4, Rarity.UNCOMMON, mage.cards.a.AngelOfTheGodPharaoh.class)); cards.add(new SetCardInfo("Aven Reedstalker", 30, Rarity.COMMON, mage.cards.a.AvenReedstalker.class)); From 5b501653385552e0c8b54855b9e4115f4d2df4c0 Mon Sep 17 00:00:00 2001 From: Lazar Date: Wed, 5 Jul 2017 16:09:30 +0200 Subject: [PATCH 154/160] banewhip punisher implementation (#3598) --- .../src/mage/cards/b/BanewhipPunisher.java | 57 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 58 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BanewhipPunisher.java diff --git a/Mage.Sets/src/mage/cards/b/BanewhipPunisher.java b/Mage.Sets/src/mage/cards/b/BanewhipPunisher.java new file mode 100644 index 0000000000..e33df9b007 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BanewhipPunisher.java @@ -0,0 +1,57 @@ +package mage.cards.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.CounterPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +public class BanewhipPunisher extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with a -1/-1 counter on it"); + + static { + filter.add(new CounterPredicate(CounterType.M1M1)); + } + + public BanewhipPunisher(UUID ownerId, CardSetInfo cardSetInfo) { + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + subtype.add("Human"); + subtype.add("Warrior"); + power = new MageInt(2); + toughness = new MageInt(2); + + // When Banewhip Punisher enters the battlefield, you may put a -1/-1 counter on target creature. + Ability etbAbility = new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.M1M1.createInstance(1)), true); + etbAbility.addTarget(new TargetCreaturePermanent()); + this.addAbility(etbAbility); + + // {B}, sacrifice Banewhip Punisher: Destroy target creature that has a -1/-1 counter on it. + Ability destroyAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{B}")); + destroyAbility.addCost(new SacrificeSourceCost()); + destroyAbility.addTarget(new TargetPermanent(filter)); + this.addAbility(destroyAbility); + + } + + public BanewhipPunisher(final BanewhipPunisher banewhipPunisher) { + super(banewhipPunisher); + } + + public BanewhipPunisher copy() { + return new BanewhipPunisher(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 63cef59e7e..d8433aa665 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -79,6 +79,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Appeal // Authority", 152, Rarity.UNCOMMON, mage.cards.a.AppealAuthority.class)); cards.add(new SetCardInfo("Aven Reedstalker", 30, Rarity.COMMON, mage.cards.a.AvenReedstalker.class)); cards.add(new SetCardInfo("Avid Reclaimer", 201, Rarity.UNCOMMON, mage.cards.a.AvidReclaimer.class)); + cards.add(new SetCardInfo("Banewhip Punisher", 59, Rarity.UNCOMMON, mage.cards.b.BanewhipPunisher.class)); cards.add(new SetCardInfo("Beneath The Sands", 111, Rarity.COMMON, mage.cards.b.BeneathTheSands.class)); cards.add(new SetCardInfo("Bitterbow Sharpshooters", 112, Rarity.COMMON, mage.cards.b.BitterbowSharpshooters.class)); cards.add(new SetCardInfo("Blur of Blades", 84, Rarity.COMMON, mage.cards.b.BlurOfBlades.class)); From 3a9b2b2243b1b7c86bfac2aeb0636b6f88eab93a Mon Sep 17 00:00:00 2001 From: spjspj Date: Thu, 6 Jul 2017 01:59:07 +1000 Subject: [PATCH 155/160] Implement Nissa's Encouragement (HOU) --- .../src/mage/cards/n/NissasEncouragement.java | 191 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 192 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/n/NissasEncouragement.java diff --git a/Mage.Sets/src/mage/cards/n/NissasEncouragement.java b/Mage.Sets/src/mage/cards/n/NissasEncouragement.java new file mode 100644 index 0000000000..3f902d16d4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NissasEncouragement.java @@ -0,0 +1,191 @@ +/* + * 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.HashMap; +import java.util.UUID; +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.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author spjspj + */ +public class NissasEncouragement extends CardImpl { + + public NissasEncouragement(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{G}"); + + // Search your library and graveyard for a card named Forest, a card named Brambleweft Behemoth, and a card named Nissa, Genesis Mage. Reveal those cards, put them into your hand, then shuffle your library. + this.getSpellAbility().addEffect(new NissasEncouragementEffect()); + + } + + public NissasEncouragement(final NissasEncouragement card) { + super(card); + } + + @Override + public NissasEncouragement copy() { + return new NissasEncouragement(this); + } +} + +class NissasEncouragementEffect extends OneShotEffect { + + private static final FilterCard filter = new FilterCard("card named Forest, a card named Brambleweft Behemoth, and a card named Nissa, Genesis Mage"); + private static final FilterCard filterGY = new FilterCard(); + + static { + filter.add(Predicates.or(new NamePredicate("Forest"), new NamePredicate("Brambleweft Behemoth"), new NamePredicate("Nissa, Genesis Mage"))); + } + + public NissasEncouragementEffect() { + super(Outcome.DrawCard); + this.staticText = "Search your library and graveyard for a card named Forest, a card named Brambleweft Behemoth, and a card named Nissa, Genesis Mage. Reveal those cards, put them into your hand, then shuffle your library."; + } + + public NissasEncouragementEffect(final NissasEncouragementEffect effect) { + super(effect); + } + + @Override + public NissasEncouragementEffect copy() { + return new NissasEncouragementEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Card sourceCard = game.getCard(source.getSourceId()); + if (player == null || sourceCard == null) { + return false; + } + + NissasEncouragementTarget target = new NissasEncouragementTarget(filter); + if (player.searchLibrary(target, game)) { + boolean searchGY = false; + + if (target.getTargets().size() < 3) { + searchGY = true; + } + + HashMap foundCards = new HashMap<>(); + foundCards.put("Forest", 0); + foundCards.put("Brambleweft Behemoth", 0); + foundCards.put("Nissa, Genesis Mage", 0); + Cards cards = new CardsImpl(); + + if (!target.getTargets().isEmpty()) { + for (UUID cardId : target.getTargets()) { + Card card = player.getLibrary().remove(cardId, game); + + if (card != null) { + cards.add(card); + foundCards.put(card.getName(), 1); + } + } + } + + if (searchGY) { + for (String name : foundCards.keySet()) { + if (foundCards.get(name) == 1) { + continue; + } + // Look in graveyard for any with this name + FilterCard namedFilterGY = filterGY.copy(); // never change static objects so copy the object here before + namedFilterGY.add(new NamePredicate(name)); + if (player.getGraveyard().count(namedFilterGY, game) > 0) { + TargetCard targetGY = new TargetCard(0, 1, Zone.GRAVEYARD, namedFilterGY); + if (player.choose(Outcome.ReturnToHand, player.getGraveyard(), targetGY, game)) { + for (UUID cardIdGY : targetGY.getTargets()) { + Card cardGY = player.getGraveyard().get(cardIdGY, game); + cards.add(cardGY); + } + } + } + } + } + + if (!cards.isEmpty()) { + player.revealCards(sourceCard.getIdName(), cards, game); + player.moveCards(cards, Zone.HAND, source, game); + player.shuffleLibrary(source, game); + return true; + } + } + player.shuffleLibrary(source, game); + return false; + } +} + +class NissasEncouragementTarget extends TargetCardInLibrary { + + public NissasEncouragementTarget(FilterCard filter) { + super(0, 3, filter); + } + + public NissasEncouragementTarget(final NissasEncouragementTarget target) { + super(target); + } + + @Override + public NissasEncouragementTarget copy() { + return new NissasEncouragementTarget(this); + } + + @Override + public boolean canTarget(UUID id, Cards cards, Game game) { + Card card = cards.get(id, game); + if (card != null) { + for (UUID targetId : this.getTargets()) { + Card iCard = game.getCard(targetId); + if (iCard != null && iCard.getName().equals(card.getName())) { + return false; + } + } + return filter.match(card, game); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 708faf8ed3..06818b557c 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -156,6 +156,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Neheb, the Eternal", 104, Rarity.MYTHIC, mage.cards.n.NehebTheEternal.class)); cards.add(new SetCardInfo("Nicol Bolas, God-Pharaoh", 140, Rarity.MYTHIC, mage.cards.n.NicolBolasGodPharaoh.class)); cards.add(new SetCardInfo("Nicol Bolas, the Deceiver", 205, Rarity.MYTHIC, mage.cards.n.NicolBolasTheDeceiver.class)); + cards.add(new SetCardInfo("Nissa's Encouragement", 203, Rarity.RARE, mage.cards.n.NissasEncouragement.class)); cards.add(new SetCardInfo("Nissa, Genesis Mage", 200, Rarity.MYTHIC, mage.cards.n.NissaGenesisMage.class)); cards.add(new SetCardInfo("Oasis Ritualist", 124, Rarity.COMMON, mage.cards.o.OasisRitualist.class)); cards.add(new SetCardInfo("Oketra's Avenger", 17, Rarity.COMMON, mage.cards.o.OketrasAvenger.class)); From 05c4c558d01be9c5c4b7287418385d00f35dd374 Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 5 Jul 2017 12:06:04 -0500 Subject: [PATCH 156/160] - Added Graven Abomination. [HOU] --- .../src/mage/cards/g/GravenAbomination.java | 93 +++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 94 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GravenAbomination.java diff --git a/Mage.Sets/src/mage/cards/g/GravenAbomination.java b/Mage.Sets/src/mage/cards/g/GravenAbomination.java new file mode 100644 index 0000000000..f5ab49b21b --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GravenAbomination.java @@ -0,0 +1,93 @@ +/* + * 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.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterCard; +import mage.filter.predicate.other.OwnerIdPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInGraveyard; + +/** + * + * @author jeffwadsworth + */ +public class GravenAbomination extends CardImpl { + + private final UUID originalId; + + private final static String rule = "Whenever {this} attacks, exile target card from defending player's graveyard."; + + public GravenAbomination(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); + + this.subtype.add("Horror"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Whenever Graven Abomination attacks, exile target card from defending player's graveyard. + Ability ability = new AttacksTriggeredAbility(new ExileTargetEffect(), false, rule); + ability.addTarget(new TargetCardInGraveyard()); + this.addAbility(ability); + originalId = ability.getOriginalId(); + + } + + @Override + public void adjustTargets(Ability ability, Game game) { + UUID gravenAbominationId = ability.getSourceId(); + FilterCard filter = new FilterCard("target card from defending player's graveyard"); + if (ability.getOriginalId().equals(originalId)) { + UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(gravenAbominationId, game); + Player defendingPlayer = game.getPlayer(defendingPlayerId); + if (defendingPlayer != null) { + filter.add(new OwnerIdPredicate(defendingPlayerId)); + ability.getTargets().clear(); + ability.getTargets().add(new TargetCardInGraveyard(filter)); + } + } + } + + public GravenAbomination(final GravenAbomination card) { + super(card); + this.originalId = card.originalId; + } + + @Override + public GravenAbomination copy() { + return new GravenAbomination(this); + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 98ae671702..0b0fffa937 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -129,6 +129,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); cards.add(new SetCardInfo("God-Pharaoh's Faithful", 14, Rarity.COMMON, mage.cards.g.GodPharaohsFaithful.class)); cards.add(new SetCardInfo("Granitic Titan", 95, Rarity.COMMON, mage.cards.g.GraniticTitan.class)); + cards.add(new SetCardInfo("Graven Abomination", 162, Rarity.COMMON, mage.cards.g.GravenAbomination.class)); cards.add(new SetCardInfo("Grind // Dust", 155, Rarity.RARE, mage.cards.g.GrindDust.class)); cards.add(new SetCardInfo("Harrier Naga", 118, Rarity.COMMON, mage.cards.h.HarrierNaga.class)); cards.add(new SetCardInfo("Hollow One", 163, Rarity.RARE, mage.cards.h.HollowOne.class)); From f1cc879edda66df8fb8770984609ddd9a813a10b Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 5 Jul 2017 14:46:13 -0500 Subject: [PATCH 157/160] - Added Ifnir Deadlands. [HOU] --- Mage.Sets/src/mage/cards/h/HollowOne.java | 18 +--- .../src/mage/cards/i/IfnirDeadlands.java | 93 +++++++++++++++++++ Mage.Sets/src/mage/cards/s/ShefetDunes.java | 4 +- .../src/mage/sets/HourOfDevastation.java | 1 + 4 files changed, 101 insertions(+), 15 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/i/IfnirDeadlands.java diff --git a/Mage.Sets/src/mage/cards/h/HollowOne.java b/Mage.Sets/src/mage/cards/h/HollowOne.java index 91a2886c8c..8c994f38b6 100644 --- a/Mage.Sets/src/mage/cards/h/HollowOne.java +++ b/Mage.Sets/src/mage/cards/h/HollowOne.java @@ -43,8 +43,6 @@ import mage.constants.CostModificationType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.AttackingPredicate; import mage.game.Game; import mage.players.Player; import mage.util.CardUtil; @@ -84,12 +82,6 @@ public class HollowOne extends CardImpl { class HollowOneReductionEffect extends CostModificationEffectImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); - - static { - filter.add(new AttackingPredicate()); - } - public HollowOneReductionEffect() { super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST); staticText = "{this} costs {2} less to cast for each card you've cycled or discarded this turn"; @@ -104,7 +96,8 @@ class HollowOneReductionEffect extends CostModificationEffectImpl { Player controller = game.getPlayer(source.getControllerId()); CardsCycledOrDiscardedThisTurnWatcher watcher = (CardsCycledOrDiscardedThisTurnWatcher) game.getState().getWatchers().get(CardsCycledOrDiscardedThisTurnWatcher.class.getSimpleName()); int reductionAmount = 0; - if (controller != null && watcher != null) { + if (controller != null + && watcher != null) { for (Card card : watcher.getCardsCycledOrDiscardedThisTurn(controller.getId()).getCards(game)) { if (card.getOwnerId().equals(controller.getId())) { reductionAmount++; @@ -118,10 +111,9 @@ class HollowOneReductionEffect extends CostModificationEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - if ((abilityToModify instanceof SpellAbility) && abilityToModify.getSourceId().equals(source.getSourceId())) { - return game.getCard(abilityToModify.getSourceId()) != null; - } - return false; + return abilityToModify instanceof SpellAbility + && abilityToModify.getSourceId().equals(source.getSourceId()) + && game.getCard(abilityToModify.getSourceId()) != null; } @Override diff --git a/Mage.Sets/src/mage/cards/i/IfnirDeadlands.java b/Mage.Sets/src/mage/cards/i/IfnirDeadlands.java new file mode 100644 index 0000000000..f3439bb23b --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/IfnirDeadlands.java @@ -0,0 +1,93 @@ +/* + * 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.i; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.mana.BlackManaAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetOpponentsCreaturePermanent; + +/** + * + * @author jeffwadsworth + */ +public class IfnirDeadlands extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("Desert"); + + static { + filter.add(new SubtypePredicate(SubType.DESERT)); + } + + public IfnirDeadlands(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + this.subtype.add("Desert"); + + // {t}: Add {C} to your mana pool. + this.addAbility(new ColorlessManaAbility()); + + // {t}, Pay 1 life: Add {B} to your mana pool. + Ability manaAbility = new BlackManaAbility(); + manaAbility.addCost(new PayLifeCost(1)); + this.addAbility(manaAbility); + + // {2}{B}{B}, {t}, Sacrifice a Desert: Put two -1/-1 counters on target creature an opponent controls. Activate this ability only any time you could cast a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.M1M1.createInstance(2)), new ManaCostsImpl("{2}{B}{B}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(1, 1, filter, true))); + ability.addTarget(new TargetOpponentsCreaturePermanent()); + this.addAbility(ability); + + } + + public IfnirDeadlands(final IfnirDeadlands card) { + super(card); + } + + @Override + public IfnirDeadlands copy() { + return new IfnirDeadlands(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/ShefetDunes.java b/Mage.Sets/src/mage/cards/s/ShefetDunes.java index 9af1736965..7e97900ad8 100644 --- a/Mage.Sets/src/mage/cards/s/ShefetDunes.java +++ b/Mage.Sets/src/mage/cards/s/ShefetDunes.java @@ -29,7 +29,7 @@ package mage.cards.s; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.costs.common.PayLifeCost; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; @@ -73,7 +73,7 @@ public class ShefetDunes extends CardImpl { this.addAbility(ability); // {2}{W}{W}, {T}, Sacrifice a Desert: Creatures you control get +1/+1 until end of turn. Activate this ability only any time you could cast a sorcery. - Ability ability2 = new SimpleActivatedAbility( + Ability ability2 = new ActivateAsSorceryActivatedAbility( Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl("{2}{W}{W}")); diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 0b0fffa937..761194ee4e 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -137,6 +137,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Hour of Glory", 65, Rarity.RARE, mage.cards.h.HourOfGlory.class)); cards.add(new SetCardInfo("Hour of Promise", 120, Rarity.RARE, mage.cards.h.HourOfPromise.class)); cards.add(new SetCardInfo("Hour of Revelation", 15, Rarity.RARE, mage.cards.h.HourOfRevelation.class)); + cards.add(new SetCardInfo("Ifnir Deadlands", 179, Rarity.UNCOMMON, mage.cards.i.IfnirDeadlands.class)); cards.add(new SetCardInfo("Imaginary Threats", 37, Rarity.UNCOMMON, mage.cards.i.ImaginaryThreats.class)); cards.add(new SetCardInfo("Inferno Jet", 99, Rarity.UNCOMMON, mage.cards.i.InfernoJet.class)); cards.add(new SetCardInfo("Island", 186, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.BFZ_FULL_ART_BASIC, true))); From d8617141778c609df74c130bc144e267c71dc16b Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 5 Jul 2017 16:15:29 -0500 Subject: [PATCH 158/160] - Added God-Pharaoh's Gift. [HOU] --- .../src/mage/cards/g/GodPharaohsGift.java | 129 ++++++++++++++++++ .../src/mage/sets/HourOfDevastation.java | 1 + 2 files changed, 130 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GodPharaohsGift.java diff --git a/Mage.Sets/src/mage/cards/g/GodPharaohsGift.java b/Mage.Sets/src/mage/cards/g/GodPharaohsGift.java new file mode 100644 index 0000000000..0cde046222 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GodPharaohsGift.java @@ -0,0 +1,129 @@ +/* + * 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.g; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.EmptyToken; +import mage.players.Player; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; + +/** + * + * @author jeffwadsworth + */ +public class GodPharaohsGift extends CardImpl { + + public GodPharaohsGift(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{7}"); + + // At the beginning of combat on your turn, you may exile a creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn. + this.addAbility(new BeginningOfPreCombatMainTriggeredAbility(Zone.BATTLEFIELD, new GodPharaohsGiftEffect(), TargetController.YOU, true, false)); + + } + + public GodPharaohsGift(final GodPharaohsGift card) { + super(card); + } + + @Override + public GodPharaohsGift copy() { + return new GodPharaohsGift(this); + } +} + +class GodPharaohsGiftEffect extends OneShotEffect { + + private static final FilterCreatureCard filter = new FilterCreatureCard("creature card from your graveyard"); + private UUID exileId = UUID.randomUUID(); + + public GodPharaohsGiftEffect() { + super(Outcome.PutCreatureInPlay); + this.staticText = "you may exile a creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn"; + } + + public GodPharaohsGiftEffect(final GodPharaohsGiftEffect effect) { + super(effect); + } + + @Override + public GodPharaohsGiftEffect copy() { + return new GodPharaohsGiftEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(filter); + target.setNotTarget(true); + if (controller != null + && !controller.getGraveyard().getCards(filter, game).isEmpty() + && controller.choose(Outcome.PutCreatureInPlay, target, source.getId(), game)) { + Card cardChosen = game.getCard(target.getFirstTarget()); + if (cardChosen != null + && cardChosen.moveToExile(exileId, "God-Pharaoh's Gift", source.getId(), game)) { + EmptyToken token = new EmptyToken(); + CardUtil.copyTo(token).from(cardChosen); + token.getPower().modifyBaseValue(4); + token.getToughness().modifyBaseValue(4); + token.getColor(game).setColor(ObjectColor.BLACK); + token.getSubtype(game).clear(); + token.getSubtype(game).add("Zombie"); + if (token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId())) { + Permanent tokenPermanent = game.getPermanent(token.getLastAddedToken()); + if (tokenPermanent != null) { + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + effect.setTargetPointer(new FixedTarget(tokenPermanent.getId())); + game.addEffect(effect, source); + return true; + } + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/HourOfDevastation.java b/Mage.Sets/src/mage/sets/HourOfDevastation.java index 761194ee4e..9ca110f947 100644 --- a/Mage.Sets/src/mage/sets/HourOfDevastation.java +++ b/Mage.Sets/src/mage/sets/HourOfDevastation.java @@ -128,6 +128,7 @@ public class HourOfDevastation extends ExpansionSet { cards.add(new SetCardInfo("Gift of Strength", 117, Rarity.COMMON, mage.cards.g.GiftOfStrength.class)); cards.add(new SetCardInfo("Gilded Cerodon", 94, Rarity.COMMON, mage.cards.g.GildedCerodon.class)); cards.add(new SetCardInfo("God-Pharaoh's Faithful", 14, Rarity.COMMON, mage.cards.g.GodPharaohsFaithful.class)); + cards.add(new SetCardInfo("God-Pharaoh's Gift", 161, Rarity.RARE, mage.cards.g.GodPharaohsGift.class)); cards.add(new SetCardInfo("Granitic Titan", 95, Rarity.COMMON, mage.cards.g.GraniticTitan.class)); cards.add(new SetCardInfo("Graven Abomination", 162, Rarity.COMMON, mage.cards.g.GravenAbomination.class)); cards.add(new SetCardInfo("Grind // Dust", 155, Rarity.RARE, mage.cards.g.GrindDust.class)); From 90be56dde9053bcd7828511c797ed0d9a3bdb5f9 Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 5 Jul 2017 16:53:44 -0500 Subject: [PATCH 159/160] - Fixed the trigger phase in God-Pharaoh's Gift. --- Mage.Sets/src/mage/cards/g/GodPharaohsGift.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/g/GodPharaohsGift.java b/Mage.Sets/src/mage/cards/g/GodPharaohsGift.java index 0cde046222..92239a97c0 100644 --- a/Mage.Sets/src/mage/cards/g/GodPharaohsGift.java +++ b/Mage.Sets/src/mage/cards/g/GodPharaohsGift.java @@ -30,7 +30,7 @@ package mage.cards.g; import java.util.UUID; import mage.ObjectColor; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfCombatTriggeredAbility; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; @@ -62,7 +62,7 @@ public class GodPharaohsGift extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{7}"); // At the beginning of combat on your turn, you may exile a creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a 4/4 black Zombie. It gains haste until end of turn. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility(Zone.BATTLEFIELD, new GodPharaohsGiftEffect(), TargetController.YOU, true, false)); + this.addAbility(new BeginningOfCombatTriggeredAbility(Zone.BATTLEFIELD, new GodPharaohsGiftEffect(), TargetController.YOU, true, false)); } From a422c0a4d8af6451e86b9883695405b8185c1785 Mon Sep 17 00:00:00 2001 From: igoudt Date: Thu, 6 Jul 2017 02:10:04 +0200 Subject: [PATCH 160/160] added Mycosynth Lattice test for #3604 --- .../test/cards/mana/MycosynthLatticeTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/mana/MycosynthLatticeTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/MycosynthLatticeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/MycosynthLatticeTest.java new file mode 100644 index 0000000000..531ecf7792 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/MycosynthLatticeTest.java @@ -0,0 +1,32 @@ +package org.mage.test.cards.mana; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class MycosynthLatticeTest extends CardTestPlayerBase { + + + @Test + public void testMycoSynthLatticeWithCrystallineCrawler(){ + String crawler = "Crystalline Crawler"; + String lattice = "Mycosynth Lattice"; + + addCard(Zone.BATTLEFIELD, playerA, lattice); + addCard(Zone.BATTLEFIELD, playerA, "Plains"); + addCard(Zone.BATTLEFIELD, playerA, "Island"); + addCard(Zone.BATTLEFIELD, playerA, "Swamp"); + addCard(Zone.BATTLEFIELD, playerA, "Mountain"); + addCard(Zone.HAND, playerA, crawler); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, crawler); + + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + + execute(); + + assertCounterCount(playerA, crawler, CounterType.P1P1, 4); + } +}