diff --git a/Mage.Sets/src/mage/cards/c/CacklingCulprit.java b/Mage.Sets/src/mage/cards/c/CacklingCulprit.java
deleted file mode 100644
index c3cbc192ecf..00000000000
--- a/Mage.Sets/src/mage/cards/c/CacklingCulprit.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package mage.cards.c;
-
-import mage.MageInt;
-import mage.abilities.common.DiesThisOrAnotherTriggeredAbility;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.common.GainLifeEffect;
-import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
-import mage.abilities.keyword.DeathtouchAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.SubType;
-import mage.filter.StaticFilters;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class CacklingCulprit extends CardImpl {
-
- public CacklingCulprit(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.ROGUE);
- this.power = new MageInt(3);
- this.toughness = new MageInt(5);
- this.color.setBlack(true);
- this.nightCard = true;
-
- // Whenever Cackling Culprit or another creature you control dies, you gain 1 life.
- this.addAbility(new DiesThisOrAnotherTriggeredAbility(
- new GainLifeEffect(1), false, StaticFilters.FILTER_CONTROLLED_CREATURE
- ));
-
- // {1}{B}: Cackling Culprit gains deathtouch until end of turn.
- this.addAbility(new SimpleActivatedAbility(new GainAbilitySourceEffect(
- DeathtouchAbility.getInstance(), Duration.EndOfTurn
- ), new ManaCostsImpl<>("{1}{B}")));
- }
-
- private CacklingCulprit(final CacklingCulprit card) {
- super(card);
- }
-
- @Override
- public CacklingCulprit copy() {
- return new CacklingCulprit(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/g/GlisteningGoremonger.java b/Mage.Sets/src/mage/cards/g/GlisteningGoremonger.java
deleted file mode 100644
index aa682247428..00000000000
--- a/Mage.Sets/src/mage/cards/g/GlisteningGoremonger.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package mage.cards.g;
-
-import mage.MageInt;
-import mage.abilities.common.DiesSourceTriggeredAbility;
-import mage.abilities.effects.common.SacrificeOpponentsEffect;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.filter.StaticFilters;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class GlisteningGoremonger extends CardImpl {
-
- public GlisteningGoremonger(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.subtype.add(SubType.PHYREXIAN);
- this.subtype.add(SubType.DEVIL);
- this.power = new MageInt(3);
- this.toughness = new MageInt(2);
- this.color.setBlack(true);
- this.color.setRed(true);
- this.nightCard = true;
-
- // When Glistening Goremonger dies, each opponent sacrifices an artifact or creature.
- this.addAbility(new DiesSourceTriggeredAbility(new SacrificeOpponentsEffect(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_CREATURE)));
- }
-
- private GlisteningGoremonger(final GlisteningGoremonger card) {
- super(card);
- }
-
- @Override
- public GlisteningGoremonger copy() {
- return new GlisteningGoremonger(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/m/MetzaliTowerOfTriumph.java b/Mage.Sets/src/mage/cards/m/MetzaliTowerOfTriumph.java
deleted file mode 100644
index 8ff50743a8a..00000000000
--- a/Mage.Sets/src/mage/cards/m/MetzaliTowerOfTriumph.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package mage.cards.m;
-
-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.OneShotEffect;
-import mage.abilities.effects.common.DamagePlayersEffect;
-import mage.abilities.mana.AnyColorManaAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.SuperType;
-import mage.constants.TargetController;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.util.RandomUtil;
-import mage.watchers.common.AttackedThisTurnWatcher;
-
-import java.util.Objects;
-import java.util.UUID;
-import java.util.stream.Collectors;
-
-/**
- * @author LevelX2
- */
-public final class MetzaliTowerOfTriumph extends CardImpl {
-
- public MetzaliTowerOfTriumph(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.nightCard = true;
-
- // (Transforms from Path of Mettle.)
-
- // {t}: Add one mana of any color.
- this.addAbility(new AnyColorManaAbility());
-
- // {1}{R}, {T}: Metzali, Tower of Triumph deals 2 damage to each opponent.
- Ability ability = new SimpleActivatedAbility(new DamagePlayersEffect(2, TargetController.OPPONENT), new ManaCostsImpl<>("{1}{R}"));
- ability.addCost(new TapSourceCost());
- this.addAbility(ability);
-
- // {2}{W}, {T}: Choose a creature at random that attacked this turn. Destroy that creature.
- ability = new SimpleActivatedAbility(new MetzaliTowerOfTriumphEffect(), new ManaCostsImpl<>("{2}{W}"));
- ability.addCost(new TapSourceCost());
- this.addAbility(ability);
- }
-
- private MetzaliTowerOfTriumph(final MetzaliTowerOfTriumph card) {
- super(card);
- }
-
- @Override
- public MetzaliTowerOfTriumph copy() {
- return new MetzaliTowerOfTriumph(this);
- }
-
-}
-
-class MetzaliTowerOfTriumphEffect extends OneShotEffect {
-
- MetzaliTowerOfTriumphEffect() {
- super(Outcome.DestroyPermanent);
- this.staticText = "choose a creature at random that attacked this turn. Destroy that creature";
- }
-
- private MetzaliTowerOfTriumphEffect(final MetzaliTowerOfTriumphEffect effect) {
- super(effect);
- }
-
- @Override
- public MetzaliTowerOfTriumphEffect copy() {
- return new MetzaliTowerOfTriumphEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = RandomUtil.randomFromCollection(
- game.getState()
- .getWatcher(AttackedThisTurnWatcher.class)
- .getAttackedThisTurnCreatures()
- .stream()
- .map(mor -> mor.getPermanent(game))
- .filter(Objects::nonNull)
- .collect(Collectors.toSet())
- );
- return permanent != null && permanent.destroy(source, game);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/p/PanickedBystander.java b/Mage.Sets/src/mage/cards/p/PanickedBystander.java
index fc914a322bb..ddbd9211755 100644
--- a/Mage.Sets/src/mage/cards/p/PanickedBystander.java
+++ b/Mage.Sets/src/mage/cards/p/PanickedBystander.java
@@ -1,20 +1,20 @@
package mage.cards.p;
-import mage.MageInt;
+import mage.abilities.Ability;
import mage.abilities.common.DiesThisOrAnotherTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.YouGainedLifeCondition;
+import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.dynamicvalue.common.ControllerGainedLifeCount;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.ComparisonType;
-import mage.constants.SubType;
-import mage.constants.TargetController;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
import mage.filter.StaticFilters;
import mage.watchers.common.PlayerGainedLifeWatcher;
@@ -23,30 +23,45 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class PanickedBystander extends CardImpl {
+public final class PanickedBystander extends TransformingDoubleFacedCard {
private static final Condition condition = new YouGainedLifeCondition(ComparisonType.MORE_THAN, 2);
public PanickedBystander(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.PEASANT}, "{1}{W}",
+ "Cackling Culprit",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.ROGUE}, "B"
+ );
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.PEASANT);
- this.power = new MageInt(2);
- this.toughness = new MageInt(2);
- this.secondSideCardClazz = mage.cards.c.CacklingCulprit.class;
+ // Panicked Bystander
+ this.getLeftHalfCard().setPT(2, 2);
// Whenever Panicked Bystander or another creature you control dies, you gain 1 life.
- this.addAbility(new DiesThisOrAnotherTriggeredAbility(
+ this.getLeftHalfCard().addAbility(new DiesThisOrAnotherTriggeredAbility(
new GainLifeEffect(1), false, StaticFilters.FILTER_CONTROLLED_CREATURE
));
// At the beginning of your end step, if you gained 3 or more life this turn, transform Panicked Bystander.
- this.addAbility(new TransformAbility());
- this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ Ability ability = new BeginningOfEndStepTriggeredAbility(
TargetController.YOU, new TransformSourceEffect(),
false, condition
- ).addHint(ControllerGainedLifeCount.getHint()), new PlayerGainedLifeWatcher());
+ ).addHint(ControllerGainedLifeCount.getHint());
+ ability.addWatcher(new PlayerGainedLifeWatcher());
+ this.getLeftHalfCard().addAbility(ability);
+
+ // Cackling Culprit
+ this.getRightHalfCard().setPT(3, 5);
+
+ // Whenever Cackling Culprit or another creature you control dies, you gain 1 life.
+ this.getRightHalfCard().addAbility(new DiesThisOrAnotherTriggeredAbility(
+ new GainLifeEffect(1), false, StaticFilters.FILTER_CONTROLLED_CREATURE
+ ));
+
+ // {1}{B}: Cackling Culprit gains deathtouch until end of turn.
+ this.getRightHalfCard().addAbility(new SimpleActivatedAbility(new GainAbilitySourceEffect(
+ DeathtouchAbility.getInstance(), Duration.EndOfTurn
+ ), new ManaCostsImpl<>("{1}{B}")));
}
private PanickedBystander(final PanickedBystander card) {
diff --git a/Mage.Sets/src/mage/cards/p/PathOfMettle.java b/Mage.Sets/src/mage/cards/p/PathOfMettle.java
index df91c7112e3..d1b90ba4071 100644
--- a/Mage.Sets/src/mage/cards/p/PathOfMettle.java
+++ b/Mage.Sets/src/mage/cards/p/PathOfMettle.java
@@ -1,28 +1,39 @@
package mage.cards.p;
-import java.util.UUID;
-
+import mage.abilities.Ability;
import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DamageAllEffect;
+import mage.abilities.effects.common.DamagePlayersEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.HasteAbility;
-import mage.abilities.keyword.TransformAbility;
import mage.abilities.keyword.VigilanceAbility;
-import mage.cards.CardImpl;
+import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SuperType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
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;
+import mage.util.RandomUtil;
+import mage.watchers.common.AttackedThisTurnWatcher;
+
+import java.util.Objects;
+import java.util.UUID;
+import java.util.stream.Collectors;
/**
* @author LevelX2
*/
-public final class PathOfMettle extends CardImpl {
+public final class PathOfMettle extends TransformingDoubleFacedCard {
private static final FilterCreaturePermanent filterDamage = new FilterCreaturePermanent("creature that doesn't have first strike, double strike, vigilance, or haste");
private static final FilterCreaturePermanent filterTransform = new FilterCreaturePermanent("creatures that have first strike, double strike, vigilance, and/or haste");
@@ -45,18 +56,32 @@ public final class PathOfMettle extends CardImpl {
}
public PathOfMettle(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{R}{W}");
-
- this.supertype.add(SuperType.LEGENDARY);
-
- this.secondSideCardClazz = mage.cards.m.MetzaliTowerOfTriumph.class;
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{R}{W}",
+ "Metzali, Tower of Triumph",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{}, ""
+ );
+ // Path of Mettle
// When Path of Mettle enters the battlefield, it deals 1 damage to each creature that doesn't have first strike, double strike, vigilance, or haste.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new DamageAllEffect(1, "it", filterDamage)));
+ this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new DamageAllEffect(1, "it", filterDamage)));
// Whenever you attack with at least two creatures that have first strike, double strike, vigilance, and/or haste, transform Path of Mettle.
- this.addAbility(new TransformAbility());
- this.addAbility(new AttacksWithCreaturesTriggeredAbility(new TransformSourceEffect(), 2, filterTransform).setTriggerPhrase(triggerPhrase));
+ this.getLeftHalfCard().addAbility(new AttacksWithCreaturesTriggeredAbility(new TransformSourceEffect(), 2, filterTransform).setTriggerPhrase(triggerPhrase));
+
+ // Metzali, Tower of Triumph
+ // {t}: Add one mana of any color.
+ this.getRightHalfCard().addAbility(new AnyColorManaAbility());
+
+ // {1}{R}, {T}: Metzali, Tower of Triumph deals 2 damage to each opponent.
+ Ability ability = new SimpleActivatedAbility(new DamagePlayersEffect(2, TargetController.OPPONENT), new ManaCostsImpl<>("{1}{R}"));
+ ability.addCost(new TapSourceCost());
+ this.getRightHalfCard().addAbility(ability);
+
+ // {2}{W}, {T}: Choose a creature at random that attacked this turn. Destroy that creature.
+ ability = new SimpleActivatedAbility(new MetzaliTowerOfTriumphDestroyEffect(), new ManaCostsImpl<>("{2}{W}"));
+ ability.addCost(new TapSourceCost());
+ this.getRightHalfCard().addAbility(ability);
}
private PathOfMettle(final PathOfMettle card) {
@@ -68,3 +93,34 @@ public final class PathOfMettle extends CardImpl {
return new PathOfMettle(this);
}
}
+
+class MetzaliTowerOfTriumphDestroyEffect extends OneShotEffect {
+
+ MetzaliTowerOfTriumphDestroyEffect() {
+ super(Outcome.DestroyPermanent);
+ this.staticText = "choose a creature at random that attacked this turn. Destroy that creature";
+ }
+
+ private MetzaliTowerOfTriumphDestroyEffect(final MetzaliTowerOfTriumphDestroyEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public MetzaliTowerOfTriumphDestroyEffect copy() {
+ return new MetzaliTowerOfTriumphDestroyEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = RandomUtil.randomFromCollection(
+ game.getState()
+ .getWatcher(AttackedThisTurnWatcher.class)
+ .getAttackedThisTurnCreatures()
+ .stream()
+ .map(mor -> mor.getPermanent(game))
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet())
+ );
+ return permanent != null && permanent.destroy(source, game);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PiousEvangel.java b/Mage.Sets/src/mage/cards/p/PiousEvangel.java
index 1de94395713..54abaf03580 100644
--- a/Mage.Sets/src/mage/cards/p/PiousEvangel.java
+++ b/Mage.Sets/src/mage/cards/p/PiousEvangel.java
@@ -1,57 +1,69 @@
package mage.cards.p;
-import mage.MageInt;
import mage.abilities.Ability;
+import mage.abilities.common.DiesThisOrAnotherTriggeredAbility;
import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.Zone;
+import mage.constants.TargetController;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
+import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
-import mage.target.common.TargetControlledPermanent;
+import mage.target.common.TargetOpponent;
import java.util.UUID;
/**
* @author fireshoes
*/
-public final class PiousEvangel extends CardImpl {
+public final class PiousEvangel extends TransformingDoubleFacedCard {
private static final FilterControlledPermanent filter2 = new FilterControlledPermanent("another permanent");
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you control");
static {
filter2.add(AnotherPredicate.instance);
+ filter.add(TargetController.YOU.getControllerPredicate());
}
public PiousEvangel(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.CLERIC);
- this.power = new MageInt(2);
- this.toughness = new MageInt(2);
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.CLERIC}, "{2}{W}",
+ "Wayward Disciple",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.CLERIC}, "B"
+ );
- this.secondSideCardClazz = mage.cards.w.WaywardDisciple.class;
+ // Pious Evangel
+ this.getLeftHalfCard().setPT(2, 2);
// Whenever Pious Evangel or another creature you control enters, you gain 1 life.
- this.addAbility(new EntersBattlefieldThisOrAnotherTriggeredAbility(new GainLifeEffect(1),
+ this.getLeftHalfCard().addAbility(new EntersBattlefieldThisOrAnotherTriggeredAbility(new GainLifeEffect(1),
StaticFilters.FILTER_PERMANENT_CREATURE, false, true));
// {2}, {T}, Sacrifice another permanent: Transform Pious Evangel.
- this.addAbility(new TransformAbility());
Ability ability = new SimpleActivatedAbility(new TransformSourceEffect(), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeTargetCost(filter2));
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
+
+ // Wayward Disciple
+ this.getRightHalfCard().setPT(2, 4);
+
+ // Whenever Wayward Disciple or another creature you control dies, target opponent loses 1 life and you gain 1 life.
+ Ability abilityBack = new DiesThisOrAnotherTriggeredAbility(new LoseLifeTargetEffect(1), false, filter);
+ abilityBack.addEffect(new GainLifeEffect(1).concatBy("and"));
+ abilityBack.addTarget(new TargetOpponent());
+ this.getRightHalfCard().addAbility(abilityBack);
}
private PiousEvangel(final PiousEvangel card) {
diff --git a/Mage.Sets/src/mage/cards/p/PolukranosEngineOfRuin.java b/Mage.Sets/src/mage/cards/p/PolukranosEngineOfRuin.java
deleted file mode 100644
index a1489a1f9cf..00000000000
--- a/Mage.Sets/src/mage/cards/p/PolukranosEngineOfRuin.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package mage.cards.p;
-
-import mage.MageInt;
-import mage.abilities.common.DiesThisOrAnotherTriggeredAbility;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.keyword.LifelinkAbility;
-import mage.abilities.keyword.ReachAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.filter.FilterPermanent;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.permanent.TokenPredicate;
-import mage.game.permanent.token.PhyrexianHydraWithLifelinkToken;
-import mage.game.permanent.token.PhyrexianHydraWithReachToken;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class PolukranosEngineOfRuin extends CardImpl {
-
- private static final FilterPermanent filter
- = new FilterControlledPermanent(SubType.HYDRA, "nontoken Hydra you control");
-
- static {
- filter.add(TokenPredicate.FALSE);
- }
-
- public PolukranosEngineOfRuin(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.PHYREXIAN);
- this.subtype.add(SubType.HYDRA);
- this.power = new MageInt(6);
- this.toughness = new MageInt(6);
- this.color.setWhite(true);
- this.color.setGreen(true);
- this.nightCard = true;
-
- // Reach
- this.addAbility(ReachAbility.getInstance());
-
- // Lifelink
- this.addAbility(LifelinkAbility.getInstance());
-
- // Whenever Polukranos, Engine of Ruin or another nontoken Hydra you control dies, create a 3/3 green and white Phyrexian Hydra creature token with reach and a 3/3 green and white Phyrexian Hydra creature token with lifelink.
- this.addAbility(new DiesThisOrAnotherTriggeredAbility(
- new CreateTokenEffect(new PhyrexianHydraWithReachToken()).withAdditionalTokens(new PhyrexianHydraWithLifelinkToken()), false, filter
- ));
- }
-
- private PolukranosEngineOfRuin(final PolukranosEngineOfRuin card) {
- super(card);
- }
-
- @Override
- public PolukranosEngineOfRuin copy() {
- return new PolukranosEngineOfRuin(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/p/PolukranosReborn.java b/Mage.Sets/src/mage/cards/p/PolukranosReborn.java
index 5b28e453528..41de09e41e7 100644
--- a/Mage.Sets/src/mage/cards/p/PolukranosReborn.java
+++ b/Mage.Sets/src/mage/cards/p/PolukranosReborn.java
@@ -1,39 +1,65 @@
package mage.cards.p;
-import mage.MageInt;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
+import mage.abilities.common.DiesThisOrAnotherTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.TransformSourceEffect;
+import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.ReachAbility;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.permanent.TokenPredicate;
+import mage.game.permanent.token.PhyrexianHydraWithLifelinkToken;
+import mage.game.permanent.token.PhyrexianHydraWithReachToken;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class PolukranosReborn extends CardImpl {
+public final class PolukranosReborn extends TransformingDoubleFacedCard {
+
+ private static final FilterPermanent filter
+ = new FilterControlledPermanent(SubType.HYDRA, "nontoken Hydra you control");
+
+ static {
+ filter.add(TokenPredicate.FALSE);
+ }
public PolukranosReborn(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{G}{G}");
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HYDRA}, "{G}{G}{G}",
+ "Polukranos, Engine of Ruin",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.HYDRA}, "GW");
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.HYDRA);
- this.power = new MageInt(4);
- this.toughness = new MageInt(5);
- this.secondSideCardClazz = mage.cards.p.PolukranosEngineOfRuin.class;
+ // Polukranos Reborn
+ this.getLeftHalfCard().setPT(4, 5);
// Reach
- this.addAbility(ReachAbility.getInstance());
+ this.getLeftHalfCard().addAbility(ReachAbility.getInstance());
// {6}{W/P}: Transform Polukranos Reborn. Activate only as a sorcery.
- this.addAbility(new TransformAbility());
- this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{6}{W/P}")));
+ this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{6}{W/P}")));
+
+ // Polukranos, Engine of Ruin
+ this.getRightHalfCard().setPT(6, 6);
+
+ // Reach
+ this.getRightHalfCard().addAbility(ReachAbility.getInstance());
+
+ // Lifelink
+ this.getRightHalfCard().addAbility(LifelinkAbility.getInstance());
+
+ // Whenever Polukranos, Engine of Ruin or another nontoken Hydra you control dies, create a 3/3 green and white Phyrexian Hydra creature token with reach and a 3/3 green and white Phyrexian Hydra creature token with lifelink.
+ this.getRightHalfCard().addAbility(new DiesThisOrAnotherTriggeredAbility(
+ new CreateTokenEffect(new PhyrexianHydraWithReachToken()).withAdditionalTokens(new PhyrexianHydraWithLifelinkToken()), false, filter
+ ));
}
private PolukranosReborn(final PolukranosReborn card) {
diff --git a/Mage.Sets/src/mage/cards/p/PoppetFactory.java b/Mage.Sets/src/mage/cards/p/PoppetFactory.java
deleted file mode 100644
index 6f43a33be51..00000000000
--- a/Mage.Sets/src/mage/cards/p/PoppetFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package mage.cards.p;
-
-import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.effects.ContinuousEffectImpl;
-import mage.abilities.effects.common.TransformSourceEffect;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.filter.FilterPermanent;
-import mage.filter.common.FilterControlledCreaturePermanent;
-import mage.filter.predicate.permanent.TokenPredicate;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class PoppetFactory extends CardImpl {
-
- public PoppetFactory(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
-
- this.color.setBlue(true);
- this.nightCard = true;
-
- // Creature tokens you control lose all abilities and have base power and toughness 3/3.
- this.addAbility(new SimpleStaticAbility(new PoppetFactoryEffect()));
-
- // At the beginning of your upkeep, you may transform Poppet Factory.
- this.addAbility(new BeginningOfUpkeepTriggeredAbility(
- new TransformSourceEffect(), true
- ));
- }
-
- private PoppetFactory(final PoppetFactory card) {
- super(card);
- }
-
- @Override
- public PoppetFactory copy() {
- return new PoppetFactory(this);
- }
-}
-
-class PoppetFactoryEffect extends ContinuousEffectImpl {
-
- private static final FilterPermanent filter = new FilterControlledCreaturePermanent();
-
- static {
- filter.add(TokenPredicate.TRUE);
- }
-
- PoppetFactoryEffect() {
- super(Duration.WhileOnBattlefield, Outcome.LoseAbility);
- staticText = "creature tokens you control lose all abilities and have base power and toughness 3/3";
- }
-
- private PoppetFactoryEffect(final PoppetFactoryEffect effect) {
- super(effect);
- }
-
- @Override
- public PoppetFactoryEffect copy() {
- return new PoppetFactoryEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- return false;
- }
-
- @Override
- public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
- for (Permanent permanent : game.getBattlefield().getActivePermanents(
- filter, source.getControllerId(), source, game
- )) {
- switch (layer) {
- case AbilityAddingRemovingEffects_6:
- permanent.removeAllAbilities(source.getSourceId(), game);
- break;
- case PTChangingEffects_7:
- if (sublayer == SubLayer.SetPT_7b) {
- permanent.getPower().setModifiedBaseValue(3);
- permanent.getToughness().setModifiedBaseValue(3);
- }
- break;
- }
- }
- return true;
- }
-
- @Override
- public boolean hasLayer(Layer layer) {
- return layer == Layer.PTChangingEffects_7
- || layer == Layer.AbilityAddingRemovingEffects_6;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/p/PoppetStitcher.java b/Mage.Sets/src/mage/cards/p/PoppetStitcher.java
index 00b952d09a7..5fc530c84bf 100644
--- a/Mage.Sets/src/mage/cards/p/PoppetStitcher.java
+++ b/Mage.Sets/src/mage/cards/p/PoppetStitcher.java
@@ -1,25 +1,27 @@
package mage.cards.p;
-import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
-import mage.abilities.keyword.TransformAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.ComparisonType;
-import mage.constants.SubType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
+import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.permanent.TokenPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
import mage.game.permanent.token.ZombieDecayedToken;
import java.util.UUID;
@@ -27,7 +29,7 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class PoppetStitcher extends CardImpl {
+public final class PoppetStitcher extends TransformingDoubleFacedCard {
private static final FilterPermanent filter = new FilterControlledPermanent("you control three or more creature tokens");
@@ -41,25 +43,32 @@ public final class PoppetStitcher extends CardImpl {
);
public PoppetStitcher(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WIZARD}, "{2}{U}",
+ "Poppet Factory",
+ new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "U");
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.WIZARD);
- this.power = new MageInt(2);
- this.toughness = new MageInt(3);
-
- this.secondSideCardClazz = mage.cards.p.PoppetFactory.class;
+ // Poppet Stitcher
+ this.getLeftHalfCard().setPT(2, 3);
// Whenever you cast an instant or sorcery spell, create a 2/2 black Zombie creature token with decayed.
- this.addAbility(new SpellCastControllerTriggeredAbility(
+ this.getLeftHalfCard().addAbility(new SpellCastControllerTriggeredAbility(
new CreateTokenEffect(new ZombieDecayedToken()),
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false
));
// At the beginning of your upkeep, if you control three or more creature tokens, you may transform Poppet Sticher.
- this.addAbility(new TransformAbility());
- this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(), true)
+ this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(), true)
.withInterveningIf(condition).addHint(hint));
+
+ // Poppet Factory
+ // Creature tokens you control lose all abilities and have base power and toughness 3/3.
+ this.getRightHalfCard().addAbility(new SimpleStaticAbility(new PoppetFactoryEffect()));
+
+ // At the beginning of your upkeep, you may transform Poppet Factory.
+ this.getRightHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(
+ new TransformSourceEffect(), true
+ ));
}
private PoppetStitcher(final PoppetStitcher card) {
@@ -71,3 +80,57 @@ public final class PoppetStitcher extends CardImpl {
return new PoppetStitcher(this);
}
}
+
+class PoppetFactoryEffect extends ContinuousEffectImpl {
+
+ private static final FilterPermanent filter = new FilterControlledCreaturePermanent();
+
+ static {
+ filter.add(TokenPredicate.TRUE);
+ }
+
+ PoppetFactoryEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.LoseAbility);
+ staticText = "creature tokens you control lose all abilities and have base power and toughness 3/3";
+ }
+
+ private PoppetFactoryEffect(final PoppetFactoryEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public PoppetFactoryEffect copy() {
+ return new PoppetFactoryEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return false;
+ }
+
+ @Override
+ public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(
+ filter, source.getControllerId(), source, game
+ )) {
+ switch (layer) {
+ case AbilityAddingRemovingEffects_6:
+ permanent.removeAllAbilities(source.getSourceId(), game);
+ break;
+ case PTChangingEffects_7:
+ if (sublayer == SubLayer.SetPT_7b) {
+ permanent.getPower().setModifiedBaseValue(3);
+ permanent.getToughness().setModifiedBaseValue(3);
+ }
+ break;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean hasLayer(Layer layer) {
+ return layer == Layer.PTChangingEffects_7
+ || layer == Layer.AbilityAddingRemovingEffects_6;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PrimalAmulet.java b/Mage.Sets/src/mage/cards/p/PrimalAmulet.java
index fcf75d1ecbf..d4a7aec5b9e 100644
--- a/Mage.Sets/src/mage/cards/p/PrimalAmulet.java
+++ b/Mage.Sets/src/mage/cards/p/PrimalAmulet.java
@@ -1,30 +1,40 @@
package mage.cards.p;
import mage.abilities.Ability;
+import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CopyTargetStackObjectEffect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
+import mage.constants.Duration;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
+import mage.filter.common.FilterInstantOrSorcerySpell;
import mage.filter.predicate.Predicates;
import mage.game.Game;
+import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
+import mage.game.stack.Spell;
import mage.players.Player;
+import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class PrimalAmulet extends CardImpl {
+public final class PrimalAmulet extends TransformingDoubleFacedCard {
private static final FilterCard filter = new FilterCard("instant and sorcery spells");
@@ -36,20 +46,31 @@ public final class PrimalAmulet extends CardImpl {
}
public PrimalAmulet(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
- this.secondSideCardClazz = mage.cards.p.PrimalWellspring.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{4}",
+ "Primal Wellspring",
+ new CardType[]{CardType.LAND}, new SubType[]{}, "");
+ // Primal Amulet
// Instant and sorcery spells you cast cost {1} less to cast.
- this.addAbility(new SimpleStaticAbility(new SpellsCostReductionControllerEffect(filter, 1)));
+ this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new SpellsCostReductionControllerEffect(filter, 1)));
// Whenever you cast an instant or sorcery spell, put a charge counter on Primal Amulet. Then if there are four or more charge counters on it, you may remove those counters and transform it.
- this.addAbility(new TransformAbility());
Ability ability = new SpellCastControllerTriggeredAbility(
new AddCountersSourceEffect(CounterType.CHARGE.createInstance()),
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false
);
ability.addEffect(new PrimalAmuletEffect());
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
+
+ // Primal Wellspring
+ // Add one mana of any color. When that mana is spent to cast an instant or sorcery spell, copy that spell and you may choose new targets for the copy.
+ Ability manaAbility = new AnyColorManaAbility();
+ manaAbility.addEffect(new CreateDelayedTriggeredAbilityEffect(new PrimalWellspringTriggeredAbility(
+ new CopyTargetStackObjectEffect(true)
+ .setText("copy that spell and you may choose new targets for the copy"))
+ ));
+ this.getRightHalfCard().addAbility(manaAbility);
}
private PrimalAmulet(final PrimalAmulet card) {
@@ -94,3 +115,58 @@ class PrimalAmuletEffect extends OneShotEffect {
return true;
}
}
+
+class PrimalWellspringTriggeredAbility extends DelayedTriggeredAbility {
+
+ private static final FilterInstantOrSorcerySpell filter = new FilterInstantOrSorcerySpell();
+
+
+ public PrimalWellspringTriggeredAbility(Effect effect) {
+ super(effect, Duration.Custom, true, false);
+ setTriggerPhrase("When that mana is spent to cast an instant or sorcery spell, ");
+ }
+
+ private PrimalWellspringTriggeredAbility(final PrimalWellspringTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public PrimalWellspringTriggeredAbility copy() {
+ return new PrimalWellspringTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.MANA_PAID;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (event.getSourceId().equals(getSourceId())) {
+ Spell spell = game.getStack().getSpell(event.getTargetId());
+ if (spell != null && filter.match(spell, getControllerId(), this, game)) {
+ for (Effect effect : getEffects()) {
+ effect.setTargetPointer(new FixedTarget(event.getTargetId()));
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isInactive(Game game) {
+ if (super.isInactive(game)) {
+ return true;
+ }
+
+ // must remove effect on empty mana pool to fix accumulate bug
+ Player player = game.getPlayer(this.getControllerId());
+ if (player == null) {
+ return true;
+ }
+
+ // if no mana in pool then it can be discarded
+ return player.getManaPool().getManaItems().stream().noneMatch(m -> m.getSourceId().equals(getSourceId()));
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PrimalWellspring.java b/Mage.Sets/src/mage/cards/p/PrimalWellspring.java
deleted file mode 100644
index 024e7274a48..00000000000
--- a/Mage.Sets/src/mage/cards/p/PrimalWellspring.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package mage.cards.p;
-
-import mage.abilities.Ability;
-import mage.abilities.TriggeredAbilityImpl;
-import mage.abilities.effects.Effect;
-import mage.abilities.effects.common.CopyTargetStackObjectEffect;
-import mage.abilities.mana.AnyColorManaAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Zone;
-import mage.filter.common.FilterInstantOrSorcerySpell;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.stack.Spell;
-import mage.target.targetpointer.FixedTarget;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class PrimalWellspring extends CardImpl {
-
- public PrimalWellspring(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
-
- this.nightCard = true;
-
- // Add one mana of any color.
- Ability ability = new AnyColorManaAbility();
- this.addAbility(ability);
-
- // When that mana is spent to cast an instant or sorcery spell, copy that spell and you may choose new targets for the copy.
- this.addAbility(new PrimalWellspringTriggeredAbility(
- ability.getOriginalId(), new CopyTargetStackObjectEffect(true)
- .setText("copy that spell and you may choose new targets for the copy")
- ));
- }
-
- private PrimalWellspring(final PrimalWellspring card) {
- super(card);
- }
-
- @Override
- public PrimalWellspring copy() {
- return new PrimalWellspring(this);
- }
-}
-
-class PrimalWellspringTriggeredAbility extends TriggeredAbilityImpl {
-
- private static final FilterInstantOrSorcerySpell filter = new FilterInstantOrSorcerySpell();
-
- String abilityOriginalId;
-
- public PrimalWellspringTriggeredAbility(UUID abilityOriginalId, Effect effect) {
- super(Zone.ALL, effect, false);
- this.abilityOriginalId = abilityOriginalId.toString();
- setTriggerPhrase("When that mana is used to cast an instant or sorcery spell, ");
- }
-
- private PrimalWellspringTriggeredAbility(final PrimalWellspringTriggeredAbility ability) {
- super(ability);
- this.abilityOriginalId = ability.abilityOriginalId;
- }
-
- @Override
- public PrimalWellspringTriggeredAbility copy() {
- return new PrimalWellspringTriggeredAbility(this);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.MANA_PAID;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- if (event.getData().equals(abilityOriginalId)) {
- Spell spell = game.getStack().getSpell(event.getTargetId());
- if (spell != null && filter.match(spell, getControllerId(), this, game)) {
- for (Effect effect : getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getTargetId()));
- }
- return true;
- }
- }
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/p/ProfaneProcession.java b/Mage.Sets/src/mage/cards/p/ProfaneProcession.java
index 881bab6e555..5f9011a72f0 100644
--- a/Mage.Sets/src/mage/cards/p/ProfaneProcession.java
+++ b/Mage.Sets/src/mage/cards/p/ProfaneProcession.java
@@ -1,19 +1,25 @@
-
package mage.cards.p;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
+import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ExileTargetForSourceEffect;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.mana.AnyColorManaAbility;
+import mage.cards.Card;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SuperType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
+import mage.filter.StaticFilters;
+import mage.game.ExileZone;
import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetCard;
+import mage.target.common.TargetCardInExile;
import mage.target.common.TargetCreaturePermanent;
import mage.util.CardUtil;
@@ -23,24 +29,32 @@ import java.util.UUID;
/**
* @author LevelX2
*/
-public final class ProfaneProcession extends CardImpl {
+public final class ProfaneProcession extends TransformingDoubleFacedCard {
public ProfaneProcession(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{B}");
-
- this.supertype.add(SuperType.LEGENDARY);
-
- this.secondSideCardClazz = mage.cards.t.TombOfTheDuskRose.class;
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{1}{W}{B}",
+ "Tomb of the Dusk Rose",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{}, "");
+ // Profane Procession
// {3}{W}{B}: Exile target creature. Then if there are three or more cards exiled with Profane Procession, transform it.
- this.addAbility(new TransformAbility());
Ability ability = new SimpleActivatedAbility(new ExileTargetForSourceEffect(), new ManaCostsImpl<>("{3}{W}{B}"));
ability.addEffect(new ConditionalOneShotEffect(
new TransformSourceEffect(), ProfaneProcessionCondition.instance,
"Then if there are three or more cards exiled with {this}, transform it"
));
ability.addTarget(new TargetCreaturePermanent());
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
+
+ // Tomb of the Dusk Rose
+ // {T}: Add one mana of any color.
+ this.getRightHalfCard().addAbility(new AnyColorManaAbility());
+
+ // {2}{W}{B},{T} : Put a creature card exiled with this permanent onto the battlefield under your control.
+ ability = new SimpleActivatedAbility(new TombOfTheDuskRoseEffect(), new ManaCostsImpl<>("{2}{W}{B}"));
+ ability.addCost(new TapSourceCost());
+ this.getRightHalfCard().addAbility(ability);
}
private ProfaneProcession(final ProfaneProcession card) {
@@ -64,3 +78,37 @@ enum ProfaneProcessionCondition implements Condition {
.isPresent();
}
}
+
+class TombOfTheDuskRoseEffect extends OneShotEffect {
+
+ TombOfTheDuskRoseEffect() {
+ super(Outcome.PutCardInPlay);
+ this.staticText = "put a creature card exiled with this permanent onto the battlefield under your control";
+ }
+
+ private TombOfTheDuskRoseEffect(final TombOfTheDuskRoseEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public TombOfTheDuskRoseEffect copy() {
+ return new TombOfTheDuskRoseEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null) {
+ return false;
+ }
+ ExileZone exileZone = game.getExile().getExileZone(CardUtil.getExileZoneId(game, source));
+ if (exileZone == null || exileZone.count(StaticFilters.FILTER_CARD_CREATURE, game) < 1) {
+ return false;
+ }
+ TargetCard targetCard = new TargetCardInExile(StaticFilters.FILTER_CARD_CREATURE, exileZone.getId());
+ targetCard.withNotTarget(true);
+ controller.choose(outcome, targetCard, source, game);
+ Card card = game.getCard(targetCard.getFirstTarget());
+ return card != null && controller.moveCards(card, Zone.BATTLEFIELD, source, game);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PyreticPrankster.java b/Mage.Sets/src/mage/cards/p/PyreticPrankster.java
index 0263319fa17..a8d94117d1f 100644
--- a/Mage.Sets/src/mage/cards/p/PyreticPrankster.java
+++ b/Mage.Sets/src/mage/cards/p/PyreticPrankster.java
@@ -1,33 +1,40 @@
package mage.cards.p;
-import mage.MageInt;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
+import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.SacrificeOpponentsEffect;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
+import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class PyreticPrankster extends CardImpl {
+public final class PyreticPrankster extends TransformingDoubleFacedCard {
public PyreticPrankster(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DEVIL}, "{1}{R}",
+ "Glistening Goremonger",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.DEVIL}, "BR");
- this.subtype.add(SubType.DEVIL);
- this.power = new MageInt(2);
- this.toughness = new MageInt(1);
- this.secondSideCardClazz = mage.cards.g.GlisteningGoremonger.class;
+ // Pyretic Prankster
+ this.getLeftHalfCard().setPT(2, 1);
// {3}{B/P}: Transform Pyretic Prankster. Activate only as a sorcery.
- this.addAbility(new TransformAbility());
- this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{3}{B/P}")));
+ this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{3}{B/P}")));
+
+ // Glistening Goremonger
+ this.getRightHalfCard().setPT(3, 2);
+
+ // When Glistening Goremonger dies, each opponent sacrifices an artifact or creature.
+ this.getRightHalfCard().addAbility(new DiesSourceTriggeredAbility(new SacrificeOpponentsEffect(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_CREATURE)));
}
private PyreticPrankster(final PyreticPrankster card) {
diff --git a/Mage.Sets/src/mage/cards/t/TombOfTheDuskRose.java b/Mage.Sets/src/mage/cards/t/TombOfTheDuskRose.java
deleted file mode 100644
index 46a7ecf9733..00000000000
--- a/Mage.Sets/src/mage/cards/t/TombOfTheDuskRose.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package mage.cards.t;
-
-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.OneShotEffect;
-import mage.abilities.mana.AnyColorManaAbility;
-import mage.cards.Card;
-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.filter.StaticFilters;
-import mage.game.ExileZone;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.TargetCard;
-import mage.target.common.TargetCardInExile;
-import mage.util.CardUtil;
-
-import java.util.UUID;
-
-/**
- * @author LevelX2
- */
-public final class TombOfTheDuskRose extends CardImpl {
-
- public TombOfTheDuskRose(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
-
- this.nightCard = true;
-
- // (Transforms from Profane Procession.)
-
- // {T}: Add one mana of any color.
- this.addAbility(new AnyColorManaAbility());
-
- // {2}{W}{B},{T} : Put a creature card exiled with this permanent onto the battlefield under your control.
- Ability ability = new SimpleActivatedAbility(new TombOfTheDuskRoseEffect(), new ManaCostsImpl<>("{2}{W}{B}"));
- ability.addCost(new TapSourceCost());
- this.addAbility(ability);
- }
-
- private TombOfTheDuskRose(final TombOfTheDuskRose card) {
- super(card);
- }
-
- @Override
- public TombOfTheDuskRose copy() {
- return new TombOfTheDuskRose(this);
- }
-}
-
-class TombOfTheDuskRoseEffect extends OneShotEffect {
-
- TombOfTheDuskRoseEffect() {
- super(Outcome.PutCardInPlay);
- this.staticText = "put a creature card exiled with this permanent onto the battlefield under your control";
- }
-
- private TombOfTheDuskRoseEffect(final TombOfTheDuskRoseEffect effect) {
- super(effect);
- }
-
- @Override
- public TombOfTheDuskRoseEffect copy() {
- return new TombOfTheDuskRoseEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller == null) {
- return false;
- }
- ExileZone exileZone = game.getExile().getExileZone(CardUtil.getExileZoneId(game, source));
- if (exileZone == null || exileZone.count(StaticFilters.FILTER_CARD_CREATURE, game) < 1) {
- return false;
- }
- TargetCard targetCard = new TargetCardInExile(StaticFilters.FILTER_CARD_CREATURE, exileZone.getId());
- targetCard.withNotTarget(true);
- controller.choose(outcome, targetCard, source, game);
- Card card = game.getCard(targetCard.getFirstTarget());
- return card != null && controller.moveCards(card, Zone.BATTLEFIELD, source, game);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/w/WaywardDisciple.java b/Mage.Sets/src/mage/cards/w/WaywardDisciple.java
deleted file mode 100644
index fc43c45ec88..00000000000
--- a/Mage.Sets/src/mage/cards/w/WaywardDisciple.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package mage.cards.w;
-
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.DiesThisOrAnotherTriggeredAbility;
-import mage.abilities.effects.common.GainLifeEffect;
-import mage.abilities.effects.common.LoseLifeTargetEffect;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.TargetController;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.target.common.TargetOpponent;
-
-import java.util.UUID;
-
-/**
- * @author fireshoes
- */
-public final class WaywardDisciple extends CardImpl {
-
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature you control");
-
- static {
- filter.add(TargetController.YOU.getControllerPredicate());
- }
-
- public WaywardDisciple(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.CLERIC);
- this.power = new MageInt(2);
- this.toughness = new MageInt(4);
- this.color.setBlack(true);
-
- // this card is the second face of double-faced card
- this.nightCard = true;
-
- // Whenever Wayward Disciple or another creature you control dies, target opponent loses 1 life and you gain 1 life.
- Ability ability = new DiesThisOrAnotherTriggeredAbility(new LoseLifeTargetEffect(1), false, filter);
- ability.addEffect(new GainLifeEffect(1).concatBy("and"));
- ability.addTarget(new TargetOpponent());
- this.addAbility(ability);
- }
-
- private WaywardDisciple(final WaywardDisciple card) {
- super(card);
- }
-
- @Override
- public WaywardDisciple copy() {
- return new WaywardDisciple(this);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java
index 05ae3762c4a..cb36a01e2f7 100644
--- a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java
+++ b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java
@@ -92,7 +92,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Brine Comber", 233, Rarity.UNCOMMON, mage.cards.b.BrineComber.class));
cards.add(new SetCardInfo("By Invitation Only", 346, Rarity.RARE, mage.cards.b.ByInvitationOnly.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("By Invitation Only", 5, Rarity.RARE, mage.cards.b.ByInvitationOnly.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Cackling Culprit", 28, Rarity.UNCOMMON, mage.cards.c.CacklingCulprit.class));
cards.add(new SetCardInfo("Cartographer's Survey", 190, Rarity.UNCOMMON, mage.cards.c.CartographersSurvey.class));
cards.add(new SetCardInfo("Catapult Fodder", 99, Rarity.UNCOMMON, mage.cards.c.CatapultFodder.class));
cards.add(new SetCardInfo("Cemetery Desecrator", 100, Rarity.MYTHIC, mage.cards.c.CemeteryDesecrator.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java
index 835e9de59dd..c967f93d3e5 100644
--- a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java
+++ b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java
@@ -97,7 +97,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Burn Down the House", 131, Rarity.RARE, mage.cards.b.BurnDownTheHouse.class));
cards.add(new SetCardInfo("Burn the Accursed", 132, Rarity.COMMON, mage.cards.b.BurnTheAccursed.class));
cards.add(new SetCardInfo("By Invitation Only", 272, Rarity.RARE, mage.cards.b.ByInvitationOnly.class));
- cards.add(new SetCardInfo("Cackling Culprit", 295, Rarity.UNCOMMON, mage.cards.c.CacklingCulprit.class));
cards.add(new SetCardInfo("Can't Stay Away", 213, Rarity.RARE, mage.cards.c.CantStayAway.class));
cards.add(new SetCardInfo("Candlegrove Witch", 8, Rarity.COMMON, mage.cards.c.CandlegroveWitch.class));
cards.add(new SetCardInfo("Candlelit Cavalry", 175, Rarity.COMMON, mage.cards.c.CandlelitCavalry.class));
@@ -402,7 +401,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Play with Fire", 154, Rarity.UNCOMMON, mage.cards.p.PlayWithFire.class));
cards.add(new SetCardInfo("Plummet", 193, Rarity.COMMON, mage.cards.p.Plummet.class));
cards.add(new SetCardInfo("Pointed Discussion", 393, Rarity.COMMON, mage.cards.p.PointedDiscussion.class));
- cards.add(new SetCardInfo("Poppet Factory", 71, Rarity.MYTHIC, mage.cards.p.PoppetFactory.class));
cards.add(new SetCardInfo("Poppet Stitcher", 71, Rarity.MYTHIC, mage.cards.p.PoppetStitcher.class));
cards.add(new SetCardInfo("Primal Adversary", 194, Rarity.MYTHIC, mage.cards.p.PrimalAdversary.class));
cards.add(new SetCardInfo("Purifying Dragon", 155, Rarity.UNCOMMON, mage.cards.p.PurifyingDragon.class));
diff --git a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java
index 02ca1cf5864..8589f2fecbb 100644
--- a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java
+++ b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java
@@ -307,8 +307,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Play with Fire", 154, Rarity.UNCOMMON, mage.cards.p.PlayWithFire.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Play with Fire", 390, Rarity.UNCOMMON, mage.cards.p.PlayWithFire.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plummet", 193, Rarity.COMMON, mage.cards.p.Plummet.class));
- cards.add(new SetCardInfo("Poppet Factory", 339, Rarity.MYTHIC, mage.cards.p.PoppetFactory.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Poppet Factory", 71, Rarity.MYTHIC, mage.cards.p.PoppetFactory.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Poppet Stitcher", 339, Rarity.MYTHIC, mage.cards.p.PoppetStitcher.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Poppet Stitcher", 71, Rarity.MYTHIC, mage.cards.p.PoppetStitcher.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Primal Adversary", 194, Rarity.MYTHIC, mage.cards.p.PrimalAdversary.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/Ixalan.java b/Mage.Sets/src/mage/sets/Ixalan.java
index bf19ea0b035..71963129b6a 100644
--- a/Mage.Sets/src/mage/sets/Ixalan.java
+++ b/Mage.Sets/src/mage/sets/Ixalan.java
@@ -208,7 +208,6 @@ public final class Ixalan extends ExpansionSet {
cards.add(new SetCardInfo("Pounce", 200, Rarity.COMMON, mage.cards.p.Pounce.class));
cards.add(new SetCardInfo("Priest of the Wakening Sun", 27, Rarity.RARE, mage.cards.p.PriestOfTheWakeningSun.class));
cards.add(new SetCardInfo("Primal Amulet", 243, Rarity.RARE, mage.cards.p.PrimalAmulet.class));
- cards.add(new SetCardInfo("Primal Wellspring", 243, Rarity.RARE, mage.cards.p.PrimalWellspring.class));
cards.add(new SetCardInfo("Prosperous Pirates", 69, Rarity.COMMON, mage.cards.p.ProsperousPirates.class));
cards.add(new SetCardInfo("Prying Blade", 244, Rarity.COMMON, mage.cards.p.PryingBlade.class));
cards.add(new SetCardInfo("Pterodon Knight", 28, Rarity.COMMON, mage.cards.p.PterodonKnight.class));
diff --git a/Mage.Sets/src/mage/sets/IxalanPromos.java b/Mage.Sets/src/mage/sets/IxalanPromos.java
index cd9eca7410c..8b63ffa01c6 100644
--- a/Mage.Sets/src/mage/sets/IxalanPromos.java
+++ b/Mage.Sets/src/mage/sets/IxalanPromos.java
@@ -85,7 +85,6 @@ public class IxalanPromos extends ExpansionSet {
cards.add(new SetCardInfo("Overflowing Insight", "66s", Rarity.MYTHIC, mage.cards.o.OverflowingInsight.class));
cards.add(new SetCardInfo("Priest of the Wakening Sun", "27s", Rarity.RARE, mage.cards.p.PriestOfTheWakeningSun.class));
cards.add(new SetCardInfo("Primal Amulet", "243s", Rarity.RARE, mage.cards.p.PrimalAmulet.class));
- cards.add(new SetCardInfo("Primal Wellspring", "243s", Rarity.RARE, mage.cards.p.PrimalWellspring.class));
cards.add(new SetCardInfo("Rampaging Ferocidon", "154s", Rarity.RARE, mage.cards.r.RampagingFerocidon.class));
cards.add(new SetCardInfo("Regisaur Alpha", "227p", Rarity.RARE, mage.cards.r.RegisaurAlpha.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Regisaur Alpha", "227s", Rarity.RARE, mage.cards.r.RegisaurAlpha.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java
index ef623fadde3..ebb225f3913 100644
--- a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java
+++ b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java
@@ -2043,7 +2043,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Pollywog Symbiote", 80931, Rarity.UNCOMMON, mage.cards.p.PollywogSymbiote.class));
cards.add(new SetCardInfo("Polukranos, Unchained", 79931, Rarity.MYTHIC, mage.cards.p.PolukranosUnchained.class));
cards.add(new SetCardInfo("Ponder", 35118, Rarity.COMMON, mage.cards.p.Ponder.class, FULL_ART));
- cards.add(new SetCardInfo("Poppet Factory", 93918, Rarity.MYTHIC, mage.cards.p.PoppetFactory.class));
cards.add(new SetCardInfo("Poppet Stitcher", 93918, Rarity.MYTHIC, mage.cards.p.PoppetStitcher.class));
cards.add(new SetCardInfo("Porcuparrot", 80965, Rarity.UNCOMMON, mage.cards.p.Porcuparrot.class));
cards.add(new SetCardInfo("Port Razer", 86068, Rarity.MYTHIC, mage.cards.p.PortRazer.class));
diff --git a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java
index 2d34c6b9701..30f3e9845c2 100644
--- a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java
+++ b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java
@@ -164,7 +164,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("Glistening Dawn", 187, Rarity.RARE, mage.cards.g.GlisteningDawn.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Glistening Dawn", 371, Rarity.RARE, mage.cards.g.GlisteningDawn.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Glistening Deluge", 107, Rarity.UNCOMMON, mage.cards.g.GlisteningDeluge.class));
- cards.add(new SetCardInfo("Glistening Goremonger", 157, Rarity.COMMON, mage.cards.g.GlisteningGoremonger.class));
cards.add(new SetCardInfo("Gloomfang Mauler", 108, Rarity.COMMON, mage.cards.g.GloomfangMauler.class));
cards.add(new SetCardInfo("Gnottvold Hermit", 188, Rarity.UNCOMMON, mage.cards.g.GnottvoldHermit.class));
cards.add(new SetCardInfo("Golden-Scale Aeronaut", 15, Rarity.COMMON, mage.cards.g.GoldenScaleAeronaut.class));
@@ -303,8 +302,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("Plains", 283, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS));
cards.add(new SetCardInfo("Polukranos Reborn", 200, Rarity.RARE, mage.cards.p.PolukranosReborn.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Polukranos Reborn", 300, Rarity.RARE, mage.cards.p.PolukranosReborn.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Polukranos, Engine of Ruin", 200, Rarity.RARE, mage.cards.p.PolukranosEngineOfRuin.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Polukranos, Engine of Ruin", 300, Rarity.RARE, mage.cards.p.PolukranosEngineOfRuin.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Portent Tracker", 201, Rarity.COMMON, mage.cards.p.PortentTracker.class));
cards.add(new SetCardInfo("Preening Champion", 73, Rarity.COMMON, mage.cards.p.PreeningChampion.class));
cards.add(new SetCardInfo("Progenitor Exarch", 32, Rarity.RARE, mage.cards.p.ProgenitorExarch.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java
index 6c7e984848d..a978c5e2fe7 100644
--- a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java
+++ b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java
@@ -139,7 +139,6 @@ public final class RivalsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Mastermind's Acquisition", 77, Rarity.RARE, mage.cards.m.MastermindsAcquisition.class));
cards.add(new SetCardInfo("Mausoleum Harpy", 78, Rarity.UNCOMMON, mage.cards.m.MausoleumHarpy.class));
cards.add(new SetCardInfo("Merfolk Mistbinder", 164, Rarity.UNCOMMON, mage.cards.m.MerfolkMistbinder.class));
- cards.add(new SetCardInfo("Metzali, Tower of Triumph", 165, Rarity.RARE, mage.cards.m.MetzaliTowerOfTriumph.class));
cards.add(new SetCardInfo("Mist-Cloaked Herald", 43, Rarity.COMMON, mage.cards.m.MistCloakedHerald.class));
cards.add(new SetCardInfo("Moment of Craving", 79, Rarity.COMMON, mage.cards.m.MomentOfCraving.class));
cards.add(new SetCardInfo("Moment of Triumph", 15, Rarity.COMMON, mage.cards.m.MomentOfTriumph.class));
@@ -224,7 +223,6 @@ public final class RivalsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Tilonalli's Crown", 120, Rarity.COMMON, mage.cards.t.TilonallisCrown.class));
cards.add(new SetCardInfo("Tilonalli's Summoner", 121, Rarity.RARE, mage.cards.t.TilonallisSummoner.class));
cards.add(new SetCardInfo("Timestream Navigator", 59, Rarity.MYTHIC, mage.cards.t.TimestreamNavigator.class));
- cards.add(new SetCardInfo("Tomb of the Dusk Rose", 166, Rarity.RARE, mage.cards.t.TombOfTheDuskRose.class));
cards.add(new SetCardInfo("Tomb Robber", 87, Rarity.RARE, mage.cards.t.TombRobber.class));
cards.add(new SetCardInfo("Trapjaw Tyrant", 29, Rarity.MYTHIC, mage.cards.t.TrapjawTyrant.class));
cards.add(new SetCardInfo("Traveler's Amulet", 184, Rarity.COMMON, mage.cards.t.TravelersAmulet.class));
diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java b/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java
index f66423ec8ec..11f54859518 100644
--- a/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java
+++ b/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java
@@ -63,7 +63,6 @@ public class RivalsOfIxalanPromos extends ExpansionSet {
cards.add(new SetCardInfo("Kumena, Tyrant of Orazca", "162s", Rarity.MYTHIC, mage.cards.k.KumenaTyrantOfOrazca.class));
cards.add(new SetCardInfo("Mastermind's Acquisition", "77p", Rarity.RARE, mage.cards.m.MastermindsAcquisition.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mastermind's Acquisition", "77s", Rarity.RARE, mage.cards.m.MastermindsAcquisition.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Metzali, Tower of Triumph", "165s", Rarity.RARE, mage.cards.m.MetzaliTowerOfTriumph.class));
cards.add(new SetCardInfo("Nezahal, Primal Tide", "45p", Rarity.RARE, mage.cards.n.NezahalPrimalTide.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Nezahal, Primal Tide", "45s", Rarity.RARE, mage.cards.n.NezahalPrimalTide.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Paladin of Atonement", "16s", Rarity.RARE, mage.cards.p.PaladinOfAtonement.class));
@@ -101,7 +100,6 @@ public class RivalsOfIxalanPromos extends ExpansionSet {
cards.add(new SetCardInfo("Tilonalli's Summoner", "121p", Rarity.RARE, mage.cards.t.TilonallisSummoner.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Tilonalli's Summoner", "121s", Rarity.RARE, mage.cards.t.TilonallisSummoner.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Timestream Navigator", "59s", Rarity.MYTHIC, mage.cards.t.TimestreamNavigator.class));
- cards.add(new SetCardInfo("Tomb of the Dusk Rose", "166s", Rarity.RARE, mage.cards.t.TombOfTheDuskRose.class));
cards.add(new SetCardInfo("Tomb Robber", "87s", Rarity.RARE, mage.cards.t.TombRobber.class));
cards.add(new SetCardInfo("Trapjaw Tyrant", "29s", Rarity.MYTHIC, mage.cards.t.TrapjawTyrant.class));
cards.add(new SetCardInfo("Twilight Prophet", "88s", Rarity.MYTHIC, mage.cards.t.TwilightProphet.class));
diff --git a/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java b/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java
index 49fd7fbf3c0..371b1ae3e8c 100644
--- a/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java
+++ b/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java
@@ -339,7 +339,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
cards.add(new SetCardInfo("Voldaren Duelist", 191, Rarity.COMMON, mage.cards.v.VoldarenDuelist.class));
cards.add(new SetCardInfo("Warped Landscape", 280, Rarity.COMMON, mage.cards.w.WarpedLandscape.class));
cards.add(new SetCardInfo("Watcher in the Web", 239, Rarity.COMMON, mage.cards.w.WatcherInTheWeb.class));
- cards.add(new SetCardInfo("Wayward Disciple", 34, Rarity.UNCOMMON, mage.cards.w.WaywardDisciple.class));
cards.add(new SetCardInfo("Weirding Wood", 240, Rarity.UNCOMMON, mage.cards.w.WeirdingWood.class));
cards.add(new SetCardInfo("Welcome to the Fold", 96, Rarity.RARE, mage.cards.w.WelcomeToTheFold.class));
cards.add(new SetCardInfo("Werewolf of Ancient Hunger", 225, Rarity.RARE, mage.cards.w.WerewolfOfAncientHunger.class));
diff --git a/Mage.Sets/src/mage/sets/XLNTreasureChest.java b/Mage.Sets/src/mage/sets/XLNTreasureChest.java
index d49ac4f7bc1..a7c1e163508 100644
--- a/Mage.Sets/src/mage/sets/XLNTreasureChest.java
+++ b/Mage.Sets/src/mage/sets/XLNTreasureChest.java
@@ -27,7 +27,6 @@ public class XLNTreasureChest extends ExpansionSet {
cards.add(new SetCardInfo("Growing Rites of Itlimoc", 191, Rarity.RARE, mage.cards.g.GrowingRitesOfItlimoc.class));
cards.add(new SetCardInfo("Legion's Landing", 22, Rarity.RARE, mage.cards.l.LegionsLanding.class));
cards.add(new SetCardInfo("Primal Amulet", 243, Rarity.RARE, mage.cards.p.PrimalAmulet.class));
- cards.add(new SetCardInfo("Primal Wellspring", 243, Rarity.RARE, mage.cards.p.PrimalWellspring.class));
cards.add(new SetCardInfo("Search for Azcanta", 74, Rarity.RARE, mage.cards.s.SearchForAzcanta.class));
cards.add(new SetCardInfo("Spires of Orazca", 249, Rarity.RARE, mage.cards.s.SpiresOfOrazca.class));
cards.add(new SetCardInfo("Spitfire Bastion", 173, Rarity.RARE, mage.cards.s.SpitfireBastion.class));