diff --git a/Mage.Sets/src/mage/cards/c/ChaosTheEndless.java b/Mage.Sets/src/mage/cards/c/ChaosTheEndless.java
deleted file mode 100644
index cb222c37a81..00000000000
--- a/Mage.Sets/src/mage/cards/c/ChaosTheEndless.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package mage.cards.c;
-
-import mage.MageInt;
-import mage.abilities.common.DiesSourceTriggeredAbility;
-import mage.abilities.effects.common.PutOnLibrarySourceEffect;
-import mage.abilities.keyword.FlyingAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class ChaosTheEndless extends CardImpl {
-
- public ChaosTheEndless(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.DEMON);
- this.power = new MageInt(5);
- this.toughness = new MageInt(5);
- this.color.setBlack(true);
- this.color.setRed(true);
- this.nightCard = true;
-
- // Flying
- this.addAbility(FlyingAbility.getInstance());
-
- // When Chaos dies, put it on the bottom of its owner's library.
- this.addAbility(new DiesSourceTriggeredAbility(new PutOnLibrarySourceEffect(
- false, "put it on the bottom of its owner's library"
- ), false));
- }
-
- private ChaosTheEndless(final ChaosTheEndless card) {
- super(card);
- }
-
- @Override
- public ChaosTheEndless copy() {
- return new ChaosTheEndless(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/c/ChromeHostHulk.java b/Mage.Sets/src/mage/cards/c/ChromeHostHulk.java
deleted file mode 100644
index 96aa262eeb4..00000000000
--- a/Mage.Sets/src/mage/cards/c/ChromeHostHulk.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package mage.cards.c;
-
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.AttacksTriggeredAbility;
-import mage.abilities.effects.common.continuous.SetBasePowerToughnessTargetEffect;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.SubType;
-import mage.filter.FilterPermanent;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.mageobject.AnotherPredicate;
-import mage.target.TargetPermanent;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class ChromeHostHulk extends CardImpl {
-
- private static final FilterPermanent filter = new FilterCreaturePermanent("other target creature");
-
- static {
- filter.add(AnotherPredicate.instance);
- }
-
- public ChromeHostHulk(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.subtype.add(SubType.PHYREXIAN);
- this.subtype.add(SubType.TROLL);
- this.power = new MageInt(5);
- this.toughness = new MageInt(5);
- this.color.setBlue(true);
- this.color.setGreen(true);
- this.nightCard = true;
-
- // Whenever Chrome Host Hulk attacks, up to one other target creature has base power and toughness 5/5 until end of turn.
- Ability ability = new AttacksTriggeredAbility(
- new SetBasePowerToughnessTargetEffect(5, 5, Duration.EndOfTurn)
- );
- ability.addTarget(new TargetPermanent(0, 1, filter));
- this.addAbility(ability);
- }
-
- private ChromeHostHulk(final ChromeHostHulk card) {
- super(card);
- }
-
- @Override
- public ChromeHostHulk copy() {
- return new ChromeHostHulk(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/g/GarlandKnightOfCornelia.java b/Mage.Sets/src/mage/cards/g/GarlandKnightOfCornelia.java
index 80580939181..b6d5a06f9a1 100644
--- a/Mage.Sets/src/mage/cards/g/GarlandKnightOfCornelia.java
+++ b/Mage.Sets/src/mage/cards/g/GarlandKnightOfCornelia.java
@@ -1,16 +1,18 @@
package mage.cards.g;
-import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
+import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.PutOnLibrarySourceEffect;
import mage.abilities.effects.keyword.SurveilEffect;
+import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.Card;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
@@ -22,29 +24,38 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class GarlandKnightOfCornelia extends CardImpl {
+public final class GarlandKnightOfCornelia extends TransformingDoubleFacedCard {
public GarlandKnightOfCornelia(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{R}");
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.KNIGHT}, "{B}{R}",
+ "Chaos, the Endless",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DEMON}, "BR"
+ );
- this.secondSideCardClazz = mage.cards.c.ChaosTheEndless.class;
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.KNIGHT);
- this.power = new MageInt(3);
- this.toughness = new MageInt(2);
+ // Garland, Knight of Cornelia
+ this.getLeftHalfCard().setPT(3, 2);
// Whenever you cast a noncreature spell, surveil 1.
- this.addAbility(new SpellCastControllerTriggeredAbility(
+ this.getLeftHalfCard().addAbility(new SpellCastControllerTriggeredAbility(
new SurveilEffect(1), StaticFilters.FILTER_SPELL_A_NON_CREATURE, false
));
// {3}{B}{B}{R}{R}: Return this card from your graveyard to the battlefield transformed. Activate only as a sorcery.
- this.addAbility(new TransformAbility());
- this.addAbility(new ActivateAsSorceryActivatedAbility(
+ this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(
Zone.GRAVEYARD, new GarlandKnightOfCorneliaEffect(), new ManaCostsImpl<>("{3}{B}{B}{R}{R}")
));
+
+ // Chaos, the Endless
+ this.getRightHalfCard().setPT(5, 5);
+
+ // Flying
+ this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
+
+ // When Chaos dies, put it on the bottom of its owner's library.
+ this.getRightHalfCard().addAbility(new DiesSourceTriggeredAbility(new PutOnLibrarySourceEffect(
+ false, "put it on the bottom of its owner's library"
+ ), false));
}
private GarlandKnightOfCornelia(final GarlandKnightOfCornelia card) {
diff --git a/Mage.Sets/src/mage/cards/g/GarrukRelentless.java b/Mage.Sets/src/mage/cards/g/GarrukRelentless.java
index b22ae5c3b93..c39b05e92e6 100644
--- a/Mage.Sets/src/mage/cards/g/GarrukRelentless.java
+++ b/Mage.Sets/src/mage/cards/g/GarrukRelentless.java
@@ -3,19 +3,29 @@ package mage.cards.g;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.StateTriggeredAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
+import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.counters.CounterType;
+import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.WolfToken;
+import mage.game.permanent.token.WolfTokenWithDeathtouch;
+import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@@ -23,29 +33,54 @@ import java.util.UUID;
/**
* @author nantuko
*/
-public final class GarrukRelentless extends CardImpl {
+public final class GarrukRelentless extends TransformingDoubleFacedCard {
+
+ private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE);
public GarrukRelentless(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{G}");
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.GARRUK);
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.GARRUK}, "{3}{G}",
+ "Garruk, the Veil-Cursed",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.GARRUK}, "BG"
+ );
- this.secondSideCardClazz = mage.cards.g.GarrukTheVeilCursed.class;
-
- this.setStartingLoyalty(3);
+ // Garruk Relentless
+ this.getLeftHalfCard().setStartingLoyalty(3);
// When Garruk Relentless has two or fewer loyalty counters on him, transform him.
- this.addAbility(new TransformAbility());
- this.addAbility(new GarrukRelentlessStateTrigger());
+ this.getLeftHalfCard().addAbility(new GarrukRelentlessStateTrigger());
- // 0: Garruk Relentless deals 3 damage to target creature. That creature deals damage equal to its power to him
+ // 0: Garruk Relentless deals 3 damage to target creature. That creature deals damage equal to its power to him.
Ability ability = new LoyaltyAbility(new DamageTargetEffect(3), 0);
ability.addEffect(new GarrukRelentlessDamageEffect());
ability.addTarget(new TargetCreaturePermanent());
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
// 0: Create a 2/2 green Wolf creature token.
- this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfToken()), 0));
+ this.getLeftHalfCard().addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfToken()), 0));
+
+ // Garruk, the Veil-Cursed
+ // +1: Create a 1/1 black Wolf creature token with deathtouch.
+ this.getRightHalfCard().addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfTokenWithDeathtouch()), 1));
+
+ // -1: Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle.
+ this.getRightHalfCard().addAbility(new LoyaltyAbility(new DoIfCostPaid(
+ new SearchLibraryPutInHandEffect(new TargetCardInLibrary(
+ StaticFilters.FILTER_CARD_CREATURE_A
+ ), true),
+ null,
+ new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE),
+ false
+ ), -1));
+
+ // -3: Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard.
+ Ability backAbility = new LoyaltyAbility(new GainAbilityControlledEffect(
+ TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE
+ ).setText("creatures you control gain trample"), -3);
+ backAbility.addEffect(new BoostControlledEffect(
+ xValue, xValue, Duration.EndOfTurn
+ ).setText("and get +X/+X until end of turn, where X is the number of creature cards in your graveyard"));
+ this.getRightHalfCard().addAbility(backAbility);
}
private GarrukRelentless(final GarrukRelentless card) {
@@ -60,7 +95,7 @@ public final class GarrukRelentless extends CardImpl {
class GarrukRelentlessStateTrigger extends StateTriggeredAbility {
- public GarrukRelentlessStateTrigger() {
+ GarrukRelentlessStateTrigger() {
super(Zone.BATTLEFIELD, new TransformSourceEffect());
}
@@ -109,5 +144,4 @@ class GarrukRelentlessDamageEffect extends OneShotEffect {
public GarrukRelentlessDamageEffect copy() {
return new GarrukRelentlessDamageEffect(this);
}
-
}
diff --git a/Mage.Sets/src/mage/cards/g/GarrukTheVeilCursed.java b/Mage.Sets/src/mage/cards/g/GarrukTheVeilCursed.java
deleted file mode 100644
index 4bd063d6f6f..00000000000
--- a/Mage.Sets/src/mage/cards/g/GarrukTheVeilCursed.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package mage.cards.g;
-
-import mage.abilities.Ability;
-import mage.abilities.LoyaltyAbility;
-import mage.abilities.costs.common.SacrificeTargetCost;
-import mage.abilities.dynamicvalue.DynamicValue;
-import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.effects.common.DoIfCostPaid;
-import mage.abilities.effects.common.continuous.BoostControlledEffect;
-import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
-import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
-import mage.abilities.keyword.TrampleAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.filter.StaticFilters;
-import mage.game.permanent.token.WolfTokenWithDeathtouch;
-import mage.target.common.TargetCardInLibrary;
-
-import java.util.UUID;
-
-/**
- * @author nantuko
- */
-public final class GarrukTheVeilCursed extends CardImpl {
-
- private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE);
-
- public GarrukTheVeilCursed(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.GARRUK);
-
- // this card is the second face of double-faced card
- this.nightCard = true;
-
- this.color.setGreen(true);
- this.color.setBlack(true);
-
- // +1 : Create a 1/1 black Wolf creature token with deathtouch.
- this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfTokenWithDeathtouch()), 1));
-
- // -1 : Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle your library.
- this.addAbility(new LoyaltyAbility(new DoIfCostPaid(
- new SearchLibraryPutInHandEffect(new TargetCardInLibrary(
- StaticFilters.FILTER_CARD_CREATURE_A
- ), true),
- null,
- new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE),
- false
- ), -1));
-
- // -3 : Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard.
- Ability ability = new LoyaltyAbility(new GainAbilityControlledEffect(
- TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE
- ).setText("creatures you control gain trample"), -3);
- ability.addEffect(new BoostControlledEffect(
- xValue, xValue, Duration.EndOfTurn
- ).setText("and get +X/+X until end of turn, where X is the number of creature cards in your graveyard"));
- this.addAbility(ability);
- }
-
- private GarrukTheVeilCursed(final GarrukTheVeilCursed card) {
- super(card);
- }
-
- @Override
- public GarrukTheVeilCursed copy() {
- return new GarrukTheVeilCursed(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/g/GatstafArsonists.java b/Mage.Sets/src/mage/cards/g/GatstafArsonists.java
index 95ee3a5336b..52b343bda84 100644
--- a/Mage.Sets/src/mage/cards/g/GatstafArsonists.java
+++ b/Mage.Sets/src/mage/cards/g/GatstafArsonists.java
@@ -1,32 +1,42 @@
package mage.cards.g;
-import java.util.UUID;
-import mage.MageInt;
+import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
+import mage.constants.SuperType;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
-public final class GatstafArsonists extends CardImpl {
+public final class GatstafArsonists extends TransformingDoubleFacedCard {
public GatstafArsonists(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{R}");
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(5);
- this.toughness = new MageInt(4);
+ super(ownerId, setInfo,
+ new SuperType[]{}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{4}{R}",
+ "Gatstaf Ravagers",
+ new SuperType[]{}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
+ );
- this.secondSideCardClazz = mage.cards.g.GatstafRavagers.class;
+ // Gatstaf Arsonists
+ this.getLeftHalfCard().setPT(5, 4);
// At the beginning of each upkeep, if no spells were cast last turn, transform Gatstaf Arsonists.
- this.addAbility(new TransformAbility());
- this.addAbility(new WerewolfFrontTriggeredAbility());
+ this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
+
+ // Gatstaf Ravagers
+ this.getRightHalfCard().setPT(6, 5);
+
+ // Menace
+ this.getRightHalfCard().addAbility(new MenaceAbility());
+
+ // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Gatstaf Ravagers.
+ this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private GatstafArsonists(final GatstafArsonists card) {
diff --git a/Mage.Sets/src/mage/cards/g/GatstafHowler.java b/Mage.Sets/src/mage/cards/g/GatstafHowler.java
deleted file mode 100644
index 3d98791e211..00000000000
--- a/Mage.Sets/src/mage/cards/g/GatstafHowler.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package mage.cards.g;
-
-import mage.MageInt;
-import mage.abilities.common.WerewolfBackTriggeredAbility;
-import mage.abilities.keyword.IntimidateAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-
-import java.util.UUID;
-
-/**
- * @author nantuko
- */
-public final class GatstafHowler extends CardImpl {
-
- public GatstafHowler(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
- this.subtype.add(SubType.WEREWOLF);
- this.color.setGreen(true);
-
- // this card is the second face of double-faced card
- this.nightCard = true;
-
- this.power = new MageInt(3);
- this.toughness = new MageInt(3);
-
- this.addAbility(IntimidateAbility.getInstance());
-
- // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Gatstaf Howler.
- this.addAbility(new WerewolfBackTriggeredAbility());
- }
-
- private GatstafHowler(final GatstafHowler card) {
- super(card);
- }
-
- @Override
- public GatstafHowler copy() {
- return new GatstafHowler(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/g/GatstafRavagers.java b/Mage.Sets/src/mage/cards/g/GatstafRavagers.java
deleted file mode 100644
index fd2463f180d..00000000000
--- a/Mage.Sets/src/mage/cards/g/GatstafRavagers.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package mage.cards.g;
-
-import mage.MageInt;
-import mage.abilities.common.WerewolfBackTriggeredAbility;
-import mage.abilities.keyword.MenaceAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-
-import java.util.UUID;
-
-/**
- * @author LevelX2
- */
-public final class GatstafRavagers extends CardImpl {
-
- public GatstafRavagers(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(6);
- this.toughness = new MageInt(5);
-
- this.color.setRed(true);
-
- this.nightCard = true;
-
- // Menace
- this.addAbility(new MenaceAbility());
-
- // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Gatstaf Ravagers.
- this.addAbility(new WerewolfBackTriggeredAbility());
- }
-
- private GatstafRavagers(final GatstafRavagers card) {
- super(card);
- }
-
- @Override
- public GatstafRavagers copy() {
- return new GatstafRavagers(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/g/GatstafShepherd.java b/Mage.Sets/src/mage/cards/g/GatstafShepherd.java
index c23426f4896..8e011cbfc28 100644
--- a/Mage.Sets/src/mage/cards/g/GatstafShepherd.java
+++ b/Mage.Sets/src/mage/cards/g/GatstafShepherd.java
@@ -1,10 +1,10 @@
package mage.cards.g;
-import mage.MageInt;
+import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.IntimidateAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@@ -13,21 +13,29 @@ import java.util.UUID;
/**
* @author nantuko
*/
-public final class GatstafShepherd extends CardImpl {
+public final class GatstafShepherd extends TransformingDoubleFacedCard {
public GatstafShepherd(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.WEREWOLF);
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{1}{G}",
+ "Gatstaf Howler",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G"
+ );
- this.secondSideCardClazz = mage.cards.g.GatstafHowler.class;
-
- this.power = new MageInt(2);
- this.toughness = new MageInt(2);
+ // Gatstaf Shepherd
+ this.getLeftHalfCard().setPT(2, 2);
// At the beginning of each upkeep, if no spells were cast last turn, transform Gatstaf Shepherd.
- this.addAbility(new TransformAbility());
- this.addAbility(new WerewolfFrontTriggeredAbility());
+ this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
+
+ // Gatstaf Howler
+ this.getRightHalfCard().setPT(3, 3);
+
+ // Intimidate
+ this.getRightHalfCard().addAbility(IntimidateAbility.getInstance());
+
+ // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Gatstaf Howler.
+ this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private GatstafShepherd(final GatstafShepherd card) {
diff --git a/Mage.Sets/src/mage/cards/g/GeierReachBandit.java b/Mage.Sets/src/mage/cards/g/GeierReachBandit.java
index 004e24bd542..2b2981a3248 100644
--- a/Mage.Sets/src/mage/cards/g/GeierReachBandit.java
+++ b/Mage.Sets/src/mage/cards/g/GeierReachBandit.java
@@ -1,37 +1,56 @@
package mage.cards.g;
-import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
+import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.HasteAbility;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
import java.util.UUID;
/**
* @author LevelX2
*/
-public final class GeierReachBandit extends CardImpl {
+public final class GeierReachBandit extends TransformingDoubleFacedCard {
+
+ private static final FilterPermanent filter = new FilterCreaturePermanent(SubType.WEREWOLF, "a Werewolf");
public GeierReachBandit(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.ROGUE);
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(3);
- this.toughness = new MageInt(2);
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.ROGUE, SubType.WEREWOLF}, "{2}{R}",
+ "Vildin-Pack Alpha",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
+ );
- this.secondSideCardClazz = mage.cards.v.VildinPackAlpha.class;
+ // Geier Reach Bandit
+ this.getLeftHalfCard().setPT(3, 2);
// Haste
- this.addAbility(HasteAbility.getInstance());
+ this.getLeftHalfCard().addAbility(HasteAbility.getInstance());
// At the beginning of each upkeep, if no spells were cast last turn, transform Geier Reach Bandit.
- this.addAbility(new TransformAbility());
- this.addAbility(new WerewolfFrontTriggeredAbility());
+ this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
+
+ // Vildin-Pack Alpha
+ this.getRightHalfCard().setPT(4, 3);
+
+ // Whenever a Werewolf you control enters, you may transform it.
+ this.getRightHalfCard().addAbility(new EntersBattlefieldControlledTriggeredAbility(
+ Zone.BATTLEFIELD, new VildinPackAlphaEffect(), filter,
+ true, SetTargetPointer.PERMANENT
+ ));
+
+ // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Vildin-Pack Alpha.
+ this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private GeierReachBandit(final GeierReachBandit card) {
@@ -42,4 +61,34 @@ public final class GeierReachBandit extends CardImpl {
public GeierReachBandit copy() {
return new GeierReachBandit(this);
}
-}
\ No newline at end of file
+}
+
+class VildinPackAlphaEffect extends OneShotEffect {
+
+ VildinPackAlphaEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "you may transform it";
+ }
+
+ private VildinPackAlphaEffect(final VildinPackAlphaEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public VildinPackAlphaEffect copy() {
+ return new VildinPackAlphaEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null) {
+ return false;
+ }
+ Permanent werewolf = game.getPermanent(getTargetPointer().getFirst(game, source));
+ if (werewolf != null) {
+ werewolf.transform(source, game);
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GnottvoldHermit.java b/Mage.Sets/src/mage/cards/g/GnottvoldHermit.java
index f8410e520a0..c0902ea0a6e 100644
--- a/Mage.Sets/src/mage/cards/g/GnottvoldHermit.java
+++ b/Mage.Sets/src/mage/cards/g/GnottvoldHermit.java
@@ -1,33 +1,56 @@
package mage.cards.g;
-import mage.MageInt;
+import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
+import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.effects.common.continuous.SetBasePowerToughnessTargetEffect;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
+import mage.constants.Duration;
import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AnotherPredicate;
+import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class GnottvoldHermit extends CardImpl {
+public final class GnottvoldHermit extends TransformingDoubleFacedCard {
+
+ private static final FilterPermanent filter = new FilterCreaturePermanent("other target creature");
+
+ static {
+ filter.add(AnotherPredicate.instance);
+ }
public GnottvoldHermit(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.TROLL}, "{3}{G}",
+ "Chrome Host Hulk",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.TROLL}, "UG"
+ );
- this.subtype.add(SubType.TROLL);
- this.power = new MageInt(4);
- this.toughness = new MageInt(4);
- this.secondSideCardClazz = mage.cards.c.ChromeHostHulk.class;
+ // Gnottvold Hermit
+ this.getLeftHalfCard().setPT(4, 4);
// {5}{U/P}: Transform Gnottvold Hermit. Activate only as a sorcery.
- this.addAbility(new TransformAbility());
- this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{U/P}")));
+ this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{U/P}")));
+
+ // Chrome Host Hulk
+ this.getRightHalfCard().setPT(5, 5);
+
+ // Whenever Chrome Host Hulk attacks, up to one other target creature has base power and toughness 5/5 until end of turn.
+ Ability ability = new AttacksTriggeredAbility(
+ new SetBasePowerToughnessTargetEffect(5, 5, Duration.EndOfTurn)
+ );
+ ability.addTarget(new TargetPermanent(0, 1, filter));
+ this.getRightHalfCard().addAbility(ability);
}
private GnottvoldHermit(final GnottvoldHermit card) {
diff --git a/Mage.Sets/src/mage/cards/g/GoldForgeGarrison.java b/Mage.Sets/src/mage/cards/g/GoldForgeGarrison.java
deleted file mode 100644
index 5fd3930da98..00000000000
--- a/Mage.Sets/src/mage/cards/g/GoldForgeGarrison.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package mage.cards.g;
-
-import java.util.UUID;
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.mana.SimpleManaAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Zone;
-import mage.game.permanent.token.GoldForgeGarrisonGolemToken;
-
-/**
- *
- * @author LevelX2
- */
-public final class GoldForgeGarrison extends CardImpl {
-
- public GoldForgeGarrison(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
-
- this.nightCard = true;
-
- // (Transforms from Golden Guardian.)
-
- // {T}: Add two mana of any one color.
- this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(2), new TapSourceCost()));
-
- // {4}, {T}: Create a 4/4 colorless Golem artifact creature token.
- Ability ability = new SimpleActivatedAbility(new CreateTokenEffect(new GoldForgeGarrisonGolemToken(), 1), new GenericManaCost(4));
- ability.addCost(new TapSourceCost());
- this.addAbility(ability);
-
- }
-
- private GoldForgeGarrison(final GoldForgeGarrison card) {
- super(card);
- }
-
- @Override
- public GoldForgeGarrison copy() {
- return new GoldForgeGarrison(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/g/GoldbugHumanitysAlly.java b/Mage.Sets/src/mage/cards/g/GoldbugHumanitysAlly.java
index 5b81a1d8090..2c99ca8339b 100644
--- a/Mage.Sets/src/mage/cards/g/GoldbugHumanitysAlly.java
+++ b/Mage.Sets/src/mage/cards/g/GoldbugHumanitysAlly.java
@@ -1,55 +1,76 @@
package mage.cards.g;
-import mage.MageInt;
+import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.CastSecondSpellTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.CantBeCounteredControlledEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.PreventAllDamageToAllEffect;
import mage.abilities.effects.common.TransformSourceEffect;
+import mage.abilities.keyword.LivingMetalAbility;
import mage.abilities.keyword.MoreThanMeetsTheEyeAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.SubType;
-import mage.constants.SuperType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
import mage.filter.FilterPermanent;
+import mage.filter.FilterSpell;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.permanent.AttackingPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import java.util.Objects;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class GoldbugHumanitysAlly extends CardImpl {
+public final class GoldbugHumanitysAlly extends TransformingDoubleFacedCard {
private static final FilterPermanent filter
= new FilterControlledCreaturePermanent(SubType.HUMAN, "attacking Humans you control");
+ private static final FilterSpell humanSpellFilter = new FilterSpell("Human spells");
+
static {
filter.add(AttackingPredicate.instance);
+ humanSpellFilter.add(SubType.HUMAN.getPredicate());
}
public GoldbugHumanitysAlly(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}{W}{U}");
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.ROBOT}, "{1}{W}{U}",
+ "Goldbug, Scrappy Scout",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.VEHICLE}, "WU"
+ );
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.ROBOT);
- this.power = new MageInt(3);
- this.toughness = new MageInt(3);
-
- this.secondSideCardClazz = mage.cards.g.GoldbugScrappyScout.class;
+ // Goldbug, Humanity's Ally
+ this.getLeftHalfCard().setPT(3, 3);
// More Than Meets the Eye {W}{U}
- this.addAbility(new MoreThanMeetsTheEyeAbility(this, "{W}{U}"));
+ this.getLeftHalfCard().addAbility(new MoreThanMeetsTheEyeAbility(this, "{W}{U}"));
// Prevent all combat damage that would be dealt to attacking Humans you control.
- this.addAbility(new SimpleStaticAbility(new PreventAllDamageToAllEffect(
+ this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new PreventAllDamageToAllEffect(
Duration.WhileOnBattlefield, filter, true
)));
// Whenever you cast your second spell each turn, convert Goldbug.
- this.addAbility(new CastSecondSpellTriggeredAbility(new TransformSourceEffect().setText("convert {this}")));
+ this.getLeftHalfCard().addAbility(new CastSecondSpellTriggeredAbility(new TransformSourceEffect().setText("convert {this}")));
+
+ // Goldbug, Scrappy Scout
+ this.getRightHalfCard().setPT(1, 3);
+
+ // Living metal
+ this.getRightHalfCard().addAbility(new LivingMetalAbility());
+
+ // Human spells you control can't be countered.
+ this.getRightHalfCard().addAbility(new SimpleStaticAbility(new CantBeCounteredControlledEffect(
+ humanSpellFilter, Duration.WhileOnBattlefield
+ )));
+
+ // Whenever Goldbug and at least one Human attack, draw a card and convert Goldbug.
+ this.getRightHalfCard().addAbility(new GoldbugScrappyScoutTriggeredAbility());
}
private GoldbugHumanitysAlly(final GoldbugHumanitysAlly card) {
@@ -61,3 +82,45 @@ public final class GoldbugHumanitysAlly extends CardImpl {
return new GoldbugHumanitysAlly(this);
}
}
+
+class GoldbugScrappyScoutTriggeredAbility extends TriggeredAbilityImpl {
+
+ GoldbugScrappyScoutTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1));
+ this.addEffect(new TransformSourceEffect());
+ }
+
+ private GoldbugScrappyScoutTriggeredAbility(final GoldbugScrappyScoutTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public GoldbugScrappyScoutTriggeredAbility copy() {
+ return new GoldbugScrappyScoutTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ return game
+ .getCombat()
+ .getAttackers()
+ .contains(getSourceId())
+ && game
+ .getCombat()
+ .getAttackers()
+ .stream()
+ .map(game::getPermanent)
+ .filter(Objects::nonNull)
+ .anyMatch(permanent -> permanent.hasSubtype(SubType.HUMAN, game));
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever {this} and at least one Human attack, draw a card and convert {this}.";
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GoldbugScrappyScout.java b/Mage.Sets/src/mage/cards/g/GoldbugScrappyScout.java
deleted file mode 100644
index 4cd192a781e..00000000000
--- a/Mage.Sets/src/mage/cards/g/GoldbugScrappyScout.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package mage.cards.g;
-
-import mage.MageInt;
-import mage.abilities.TriggeredAbilityImpl;
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.effects.common.CantBeCounteredControlledEffect;
-import mage.abilities.effects.common.DrawCardSourceControllerEffect;
-import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.LivingMetalAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.filter.FilterSpell;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-
-import java.util.Objects;
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class GoldbugScrappyScout extends CardImpl {
-
- private static final FilterSpell filter = new FilterSpell("Human spells");
-
- static {
- filter.add(SubType.HUMAN.getPredicate());
- }
-
- public GoldbugScrappyScout(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.VEHICLE);
- this.power = new MageInt(1);
- this.toughness = new MageInt(3);
- this.color.setWhite(true);
- this.color.setBlue(true);
- this.nightCard = true;
-
- // Living metal
- this.addAbility(new LivingMetalAbility());
-
- // Human spells you control can't be countered.
- this.addAbility(new SimpleStaticAbility(new CantBeCounteredControlledEffect(
- filter, Duration.WhileOnBattlefield
- )));
-
- // Whenever Goldbug and at least one Human attack, draw a card and convert Goldbug.
- this.addAbility(new GoldbugScrappyScoutTriggeredAbility());
- }
-
- private GoldbugScrappyScout(final GoldbugScrappyScout card) {
- super(card);
- }
-
- @Override
- public GoldbugScrappyScout copy() {
- return new GoldbugScrappyScout(this);
- }
-}
-
-class GoldbugScrappyScoutTriggeredAbility extends TriggeredAbilityImpl {
-
- GoldbugScrappyScoutTriggeredAbility() {
- super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1));
- this.addEffect(new TransformSourceEffect());
- }
-
- private GoldbugScrappyScoutTriggeredAbility(final GoldbugScrappyScoutTriggeredAbility ability) {
- super(ability);
- }
-
- @Override
- public GoldbugScrappyScoutTriggeredAbility copy() {
- return new GoldbugScrappyScoutTriggeredAbility(this);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- return game
- .getCombat()
- .getAttackers()
- .contains(getSourceId())
- && game
- .getCombat()
- .getAttackers()
- .stream()
- .map(game::getPermanent)
- .filter(Objects::nonNull)
- .anyMatch(permanent -> permanent.hasSubtype(SubType.HUMAN, game));
- }
-
- @Override
- public String getRule() {
- return "Whenever {this} and at least one Human attack, draw a card and convert {this}.";
- }
-}
diff --git a/Mage.Sets/src/mage/cards/g/GoldenGuardian.java b/Mage.Sets/src/mage/cards/g/GoldenGuardian.java
index d30b0a5cf7a..c04f609ad9e 100644
--- a/Mage.Sets/src/mage/cards/g/GoldenGuardian.java
+++ b/Mage.Sets/src/mage/cards/g/GoldenGuardian.java
@@ -1,23 +1,27 @@
package mage.cards.g;
-import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.FightTargetSourceEffect;
+import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
import mage.abilities.keyword.DefenderAbility;
import mage.abilities.keyword.TransformAbility;
+import mage.abilities.mana.SimpleManaAbility;
import mage.cards.Card;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
+import mage.game.permanent.token.GoldForgeGarrisonGolemToken;
import mage.players.Player;
import mage.target.TargetPermanent;
@@ -26,26 +30,35 @@ import java.util.UUID;
/**
* @author LevelX2
*/
-public final class GoldenGuardian extends CardImpl {
+public final class GoldenGuardian extends TransformingDoubleFacedCard {
public GoldenGuardian(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.GOLEM}, "{4}",
+ "Gold-Forge Garrison",
+ new CardType[]{CardType.LAND}, new SubType[]{}, ""
+ );
- this.subtype.add(SubType.GOLEM);
- this.power = new MageInt(4);
- this.toughness = new MageInt(4);
-
- this.secondSideCardClazz = mage.cards.g.GoldForgeGarrison.class;
+ // Golden Guardian
+ this.getLeftHalfCard().setPT(4, 4);
// Defender
- this.addAbility(DefenderAbility.getInstance());
+ this.getLeftHalfCard().addAbility(DefenderAbility.getInstance());
// {2}: Golden Guardian fights another target creature you control. When Golden Guardian dies this turn, return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
Ability ability = new SimpleActivatedAbility(new FightTargetSourceEffect(), new GenericManaCost(2));
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE_YOU_CONTROL));
ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new GoldenGuardianDelayedTriggeredAbility(), false));
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
+
+ // Gold-Forge Garrison
+ // {T}: Add two mana of any one color.
+ this.getRightHalfCard().addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(2), new TapSourceCost()));
+
+ // {4}, {T}: Create a 4/4 colorless Golem artifact creature token.
+ Ability backAbility = new SimpleActivatedAbility(new CreateTokenEffect(new GoldForgeGarrisonGolemToken(), 1), new GenericManaCost(4));
+ backAbility.addCost(new TapSourceCost());
+ this.getRightHalfCard().addAbility(backAbility);
}
private GoldenGuardian(final GoldenGuardian card) {
@@ -60,7 +73,7 @@ public final class GoldenGuardian extends CardImpl {
class GoldenGuardianDelayedTriggeredAbility extends DelayedTriggeredAbility {
- public GoldenGuardianDelayedTriggeredAbility() {
+ GoldenGuardianDelayedTriggeredAbility() {
super(new GoldenGuardianReturnTransformedEffect(), Duration.EndOfTurn);
setTriggerPhrase("When {this} dies this turn, ");
}
diff --git a/Mage.Sets/src/mage/cards/g/GraspingShadows.java b/Mage.Sets/src/mage/cards/g/GraspingShadows.java
index 9297ca57c2d..c73dc3f5752 100644
--- a/Mage.Sets/src/mage/cards/g/GraspingShadows.java
+++ b/Mage.Sets/src/mage/cards/g/GraspingShadows.java
@@ -2,18 +2,26 @@ package mage.cards.g;
import mage.abilities.Ability;
import mage.abilities.common.AttacksAloneControlledTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
+import mage.abilities.costs.common.RemoveCountersSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.keyword.LifelinkAbility;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.mana.BlackManaAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.SuperType;
import mage.counters.CounterType;
import java.util.UUID;
@@ -21,14 +29,18 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class GraspingShadows extends CardImpl {
+public final class GraspingShadows extends TransformingDoubleFacedCard {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DREAD, 3);
public GraspingShadows(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}");
- this.secondSideCardClazz = mage.cards.s.ShadowsLair.class;
+ super(ownerId, setInfo,
+ new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{3}{B}",
+ "Shadows' Lair",
+ new SuperType[]{}, new CardType[]{CardType.LAND}, new SubType[]{SubType.CAVE}, ""
+ );
+ // Grasping Shadows
// Whenever a creature you control attacks alone, it gains deathtouch and lifelink until end of turn. Put a dread counter on Grasping Shadows. Then if there are three or more dread counters on it, transform it.
Ability ability = new AttacksAloneControlledTriggeredAbility(
new GainAbilityTargetEffect(DeathtouchAbility.getInstance())
@@ -42,8 +54,20 @@ public final class GraspingShadows extends CardImpl {
new TransformSourceEffect(), condition,
"Then if there are three or more dread counters on it, transform it"
));
- this.addAbility(new TransformAbility());
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
+
+ // Shadows' Lair
+ // {T}: Add {B}.
+ this.getRightHalfCard().addAbility(new BlackManaAbility());
+
+ // {B}, {T}, Remove a dread counter from Shadows' Lair: You draw a card and you lose 1 life.
+ Ability backAbility = new SimpleActivatedAbility(
+ new DrawCardSourceControllerEffect(1, true), new ManaCostsImpl<>("{B}")
+ );
+ backAbility.addCost(new TapSourceCost());
+ backAbility.addCost(new RemoveCountersSourceCost(CounterType.DREAD.createInstance()));
+ backAbility.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and"));
+ this.getRightHalfCard().addAbility(backAbility);
}
private GraspingShadows(final GraspingShadows card) {
diff --git a/Mage.Sets/src/mage/cards/g/GraveyardGlutton.java b/Mage.Sets/src/mage/cards/g/GraveyardGlutton.java
deleted file mode 100644
index 5d6f60ee957..00000000000
--- a/Mage.Sets/src/mage/cards/g/GraveyardGlutton.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package mage.cards.g;
-
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
-import mage.abilities.costs.common.DiscardCardCost;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.keyword.NightboundAbility;
-import mage.abilities.keyword.WardAbility;
-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.Zone;
-import mage.filter.StaticFilters;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.common.TargetCardInGraveyard;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class GraveyardGlutton extends CardImpl {
-
- public GraveyardGlutton(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(4);
- this.toughness = new MageInt(4);
- this.color.setBlack(true);
- this.nightCard = true;
-
- // Ward—Discard a card.
- this.addAbility(new WardAbility(new DiscardCardCost(), false));
-
- // Whenever Graveyard Glutton enters the battlefield or attacks, exile up to two target cards from graveyards. For each creature card exiled this way, each opponent loses 1 life and you gain 1 life.
- Ability ability = new EntersBattlefieldOrAttacksSourceTriggeredAbility(new GraveyardGluttonEffect());
- ability.addTarget(new TargetCardInGraveyard(0, 2));
- this.addAbility(ability);
-
- // Nightbound
- this.addAbility(new NightboundAbility());
- }
-
- private GraveyardGlutton(final GraveyardGlutton card) {
- super(card);
- }
-
- @Override
- public GraveyardGlutton copy() {
- return new GraveyardGlutton(this);
- }
-}
-
-class GraveyardGluttonEffect extends OneShotEffect {
-
- GraveyardGluttonEffect() {
- super(Outcome.Benefit);
- staticText = "exile up to two target cards from graveyards. " +
- "For each creature card exiled this way, each opponent loses 1 life and you gain 1 life";
- }
-
- private GraveyardGluttonEffect(final GraveyardGluttonEffect effect) {
- super(effect);
- }
-
- @Override
- public GraveyardGluttonEffect copy() {
- return new GraveyardGluttonEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- Cards cards = new CardsImpl(getTargetPointer().getTargets(game, source));
- if (player == null || cards.isEmpty()) {
- return false;
- }
- player.moveCards(cards, Zone.EXILED, source, game);
- int amount = cards.count(StaticFilters.FILTER_CARD_CREATURE, game);
- if (amount < 1) {
- return true;
- }
- player.gainLife(amount, game, source);
- for (UUID opponentId : game.getOpponents(source.getControllerId())) {
- Player opponent = game.getPlayer(opponentId);
- if (opponent != null) {
- opponent.loseLife(amount, game, source, false);
- }
- }
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java b/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java
index 1e3f1f865e2..7ad4f57b6ac 100644
--- a/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java
+++ b/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java
@@ -1,16 +1,16 @@
package mage.cards.g;
-import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.costs.common.DiscardCardCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.DayboundAbility;
+import mage.abilities.keyword.NightboundAbility;
import mage.abilities.keyword.WardAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
@@ -25,27 +25,42 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class GraveyardTrespasser extends CardImpl {
+public final class GraveyardTrespasser extends TransformingDoubleFacedCard {
public GraveyardTrespasser(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{2}{B}",
+ "Graveyard Glutton",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "B"
+ );
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(3);
- this.toughness = new MageInt(3);
- this.secondSideCardClazz = mage.cards.g.GraveyardGlutton.class;
+ // Graveyard Trespasser
+ this.getLeftHalfCard().setPT(3, 3);
// Ward—Discard a card.
- this.addAbility(new WardAbility(new DiscardCardCost(), false));
+ this.getLeftHalfCard().addAbility(new WardAbility(new DiscardCardCost(), false));
// Whenever Graveyard Trespasser enters the battlefield or attacks, exile up to one target card from a graveyard. If a creature card was exiled this way, each opponent loses 1 life and you gain 1 life.
Ability ability = new EntersBattlefieldOrAttacksSourceTriggeredAbility(new GraveyardTrespasserEffect());
ability.addTarget(new TargetCardInGraveyard(0, 1));
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
// Daybound
- this.addAbility(new DayboundAbility());
+ this.getLeftHalfCard().addAbility(new DayboundAbility());
+
+ // Graveyard Glutton
+ this.getRightHalfCard().setPT(4, 4);
+
+ // Ward—Discard a card.
+ this.getRightHalfCard().addAbility(new WardAbility(new DiscardCardCost(), false));
+
+ // Whenever Graveyard Glutton enters the battlefield or attacks, exile up to two target cards from graveyards. For each creature card exiled this way, each opponent loses 1 life and you gain 1 life.
+ Ability backAbility = new EntersBattlefieldOrAttacksSourceTriggeredAbility(new GraveyardGluttonEffect());
+ backAbility.addTarget(new TargetCardInGraveyard(0, 2));
+ this.getRightHalfCard().addAbility(backAbility);
+
+ // Nightbound
+ this.getRightHalfCard().addAbility(new NightboundAbility());
}
private GraveyardTrespasser(final GraveyardTrespasser card) {
@@ -98,3 +113,43 @@ class GraveyardTrespasserEffect extends OneShotEffect {
return true;
}
}
+
+class GraveyardGluttonEffect extends OneShotEffect {
+
+ GraveyardGluttonEffect() {
+ super(Outcome.Benefit);
+ staticText = "exile up to two target cards from graveyards. " +
+ "For each creature card exiled this way, each opponent loses 1 life and you gain 1 life";
+ }
+
+ private GraveyardGluttonEffect(final GraveyardGluttonEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public GraveyardGluttonEffect copy() {
+ return new GraveyardGluttonEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ Cards cards = new CardsImpl(getTargetPointer().getTargets(game, source));
+ if (player == null || cards.isEmpty()) {
+ return false;
+ }
+ player.moveCards(cards, Zone.EXILED, source, game);
+ int amount = cards.count(StaticFilters.FILTER_CARD_CREATURE, game);
+ if (amount < 1) {
+ return true;
+ }
+ player.gainLife(amount, game, source);
+ for (UUID opponentId : game.getOpponents(source.getControllerId())) {
+ Player opponent = game.getPlayer(opponentId);
+ if (opponent != null) {
+ opponent.loseLife(amount, game, source, false);
+ }
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GrimlockDinobotLeader.java b/Mage.Sets/src/mage/cards/g/GrimlockDinobotLeader.java
index bbc81909820..4e5d938eae5 100644
--- a/Mage.Sets/src/mage/cards/g/GrimlockDinobotLeader.java
+++ b/Mage.Sets/src/mage/cards/g/GrimlockDinobotLeader.java
@@ -1,61 +1,71 @@
-
package mage.cards.g;
-import java.util.UUID;
-import mage.MageInt;
+import mage.MageObject;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.keyword.TrampleAbility;
import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
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.filter.predicate.permanent.TransformedPredicate;
+import java.util.UUID;
/**
- *
* @author Saga
*/
-public final class GrimlockDinobotLeader extends CardImpl{
-
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Dinosaurs and Vehicles");
+public final class GrimlockDinobotLeader extends TransformingDoubleFacedCard {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Dinosaurs and Vehicles you control");
static {
- filter.add(Predicates.or(SubType.DINOSAUR.getPredicate(), SubType.VEHICLE.getPredicate()));
+ filter.add(Predicates.or(
+ SubType.DINOSAUR.getPredicate(),
+ SubType.VEHICLE.getPredicate())
+ );
}
-
+
private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("Transformers creatures");
static {
filter2.add(Predicates.not(SubType.DINOSAUR.getPredicate()));
filter2.add(Predicates.not(SubType.VEHICLE.getPredicate()));
filter2.add(Predicates.or(new AbilityPredicate(TransformAbility.class), TransformedPredicate.instance));
}
-
- public GrimlockDinobotLeader(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT,CardType.CREATURE}, "{1}{R}{G}{W}");
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.AUTOBOT);
- this.power = new MageInt(4);
- this.toughness = new MageInt(4);
- this.secondSideCardClazz = mage.cards.g.GrimlockFerociousKing.class;
+ public GrimlockDinobotLeader(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.AUTOBOT}, "{1}{R}{G}{W}",
+ "Grimlock, Ferocious King",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.DINOSAUR}, "RGW"
+ );
+
+ // Grimlock, Dinobot Leader
+ this.getLeftHalfCard().setPT(4, 4);
// Dinosaurs, Vehicles and other Transformers creatures you control get +2/+0.
- this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(2, 0, Duration.WhileOnBattlefield, filter, false)));
- this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(2, 0, Duration.WhileOnBattlefield, filter2, true)));
-
+ this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new BoostControlledEffect(2, 0, Duration.WhileOnBattlefield, filter, false)));
+ this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new BoostControlledEffect(2, 0, Duration.WhileOnBattlefield, filter2, true)));
+
// {2}: Grimlock, Dinobot Leader becomes Grimlock, Ferocious King.
- this.addAbility(new TransformAbility());
- this.addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{2}")));
+ this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{2}")));
+
+ // Grimlock, Ferocious King
+ this.getRightHalfCard().setPT(8, 8);
+
+ // Trample
+ this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
+
+ // {2}: Grimlock, Ferocious King becomes Grimlock, Dinobot Leader.
+ this.getRightHalfCard().addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{2}")));
}
private GrimlockDinobotLeader(final GrimlockDinobotLeader card) {
@@ -66,5 +76,4 @@ public final class GrimlockDinobotLeader extends CardImpl{
public GrimlockDinobotLeader copy() {
return new GrimlockDinobotLeader(this);
}
-
}
diff --git a/Mage.Sets/src/mage/cards/g/GrimlockFerociousKing.java b/Mage.Sets/src/mage/cards/g/GrimlockFerociousKing.java
deleted file mode 100644
index f24ff1b75e6..00000000000
--- a/Mage.Sets/src/mage/cards/g/GrimlockFerociousKing.java
+++ /dev/null
@@ -1,53 +0,0 @@
-
-package mage.cards.g;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TrampleAbility;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.constants.Zone;
-
-/**
- *
- * @author Saga
- */
-public final class GrimlockFerociousKing extends CardImpl{
-
- public GrimlockFerociousKing(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"");
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.DINOSAUR);
- this.power = new MageInt(8);
- this.toughness = new MageInt(8);
- this.color.setRed(true);
- this.color.setGreen(true);
- this.color.setWhite(true);
-
- this.nightCard = true;
-
- // Trample
- this.addAbility(TrampleAbility.getInstance());
-
- // {2}: Grimlock, Ferocious King becomes Grimlock, Dinobot Leader.
- this.addAbility(new TransformAbility());
- this.addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{2}")));
- }
-
- private GrimlockFerociousKing(final GrimlockFerociousKing card) {
- super(card);
- }
-
- @Override
- public GrimlockFerociousKing copy() {
- return new GrimlockFerociousKing(this);
- }
-
-}
diff --git a/Mage.Sets/src/mage/cards/g/GrislyAnglerfish.java b/Mage.Sets/src/mage/cards/g/GrislyAnglerfish.java
deleted file mode 100644
index a8eace0c588..00000000000
--- a/Mage.Sets/src/mage/cards/g/GrislyAnglerfish.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package mage.cards.g;
-
-import mage.MageInt;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.common.combat.AttacksIfAbleAllEffect;
-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 fireshoes
- */
-public final class GrislyAnglerfish extends CardImpl {
-
- public GrislyAnglerfish(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
- this.subtype.add(SubType.ELDRAZI);
- this.subtype.add(SubType.FISH);
- this.power = new MageInt(4);
- this.toughness = new MageInt(5);
-
- // this card is the second face of double-faced card
- this.nightCard = true;
-
- // {6}: Creatures your opponents control attack this turn if able.
- this.addAbility(new SimpleActivatedAbility(new AttacksIfAbleAllEffect(
- StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURES, Duration.EndOfTurn
- ), new ManaCostsImpl<>("{6}")));
- }
-
- private GrislyAnglerfish(final GrislyAnglerfish card) {
- super(card);
- }
-
- @Override
- public GrislyAnglerfish copy() {
- return new GrislyAnglerfish(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/g/GrizzledAngler.java b/Mage.Sets/src/mage/cards/g/GrizzledAngler.java
index ac856108974..0753f9ef08e 100644
--- a/Mage.Sets/src/mage/cards/g/GrizzledAngler.java
+++ b/Mage.Sets/src/mage/cards/g/GrizzledAngler.java
@@ -1,20 +1,22 @@
package mage.cards.g;
-import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInControllerGraveyardCondition;
import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.MillCardsControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.effects.common.combat.AttacksIfAbleAllEffect;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
+import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.FilterCard;
+import mage.filter.StaticFilters;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.mageobject.ColorlessPredicate;
@@ -23,7 +25,7 @@ import java.util.UUID;
/**
* @author fireshoes
*/
-public final class GrizzledAngler extends CardImpl {
+public final class GrizzledAngler extends TransformingDoubleFacedCard {
private static final FilterCard filter = new FilterCreatureCard();
@@ -34,21 +36,30 @@ public final class GrizzledAngler extends CardImpl {
private static final Condition condition = new CardsInControllerGraveyardCondition(1, filter);
public GrizzledAngler(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
- this.subtype.add(SubType.HUMAN);
- this.power = new MageInt(2);
- this.toughness = new MageInt(3);
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN}, "{2}{U}",
+ "Grisly Anglerfish",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELDRAZI, SubType.FISH}, ""
+ );
- this.secondSideCardClazz = mage.cards.g.GrislyAnglerfish.class;
+ // Grizzled Angler
+ this.getLeftHalfCard().setPT(2, 3);
// {T}: Put the top two cards of your library into your graveyard. Then if there is a colorless creature card in your graveyard, transform Grizzled Angler.
- this.addAbility(new TransformAbility());
Ability ability = new SimpleActivatedAbility(new MillCardsControllerEffect(2), new TapSourceCost());
ability.addEffect(new ConditionalOneShotEffect(
new TransformSourceEffect(), condition,
"Then if there is a colorless creature card in your graveyard, transform {this}"
));
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
+
+ // Grisly Anglerfish
+ this.getRightHalfCard().setPT(4, 5);
+
+ // {6}: Creatures your opponents control attack this turn if able.
+ this.getRightHalfCard().addAbility(new SimpleActivatedAbility(new AttacksIfAbleAllEffect(
+ StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURES, Duration.EndOfTurn
+ ), new ManaCostsImpl<>("{6}")));
}
private GrizzledAngler(final GrizzledAngler card) {
diff --git a/Mage.Sets/src/mage/cards/g/GrizzledOutcasts.java b/Mage.Sets/src/mage/cards/g/GrizzledOutcasts.java
index ab0bcf6566e..3c8ba3067e0 100644
--- a/Mage.Sets/src/mage/cards/g/GrizzledOutcasts.java
+++ b/Mage.Sets/src/mage/cards/g/GrizzledOutcasts.java
@@ -1,33 +1,38 @@
package mage.cards.g;
-import mage.MageInt;
+import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
-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 java.util.UUID;
/**
* @author nantuko
*/
-public final class GrizzledOutcasts extends CardImpl {
+public final class GrizzledOutcasts extends TransformingDoubleFacedCard {
public GrizzledOutcasts(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}");
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.WEREWOLF);
+ super(ownerId, setInfo,
+ new SuperType[]{}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{4}{G}",
+ "Krallenhorde Wantons",
+ new SuperType[]{}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G"
+ );
- this.secondSideCardClazz = mage.cards.k.KrallenhordeWantons.class;
-
- this.power = new MageInt(4);
- this.toughness = new MageInt(4);
+ // Grizzled Outcasts
+ this.getLeftHalfCard().setPT(4, 4);
// At the beginning of each upkeep, if no spells were cast last turn, transform Grizzled Outcasts.
- this.addAbility(new TransformAbility());
- this.addAbility(new WerewolfFrontTriggeredAbility());
+ this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
+
+ // Krallenhorde Wantons
+ this.getRightHalfCard().setPT(7, 7);
+
+ // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Krallenhorde Wantons.
+ this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private GrizzledOutcasts(final GrizzledOutcasts card) {
diff --git a/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java b/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java
index cbc80fc495e..3969690b886 100644
--- a/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java
+++ b/Mage.Sets/src/mage/cards/g/GrowingRitesOfItlimoc.java
@@ -1,19 +1,19 @@
package mage.cards.g;
+import mage.Mana;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.hint.common.CreaturesYouControlHint;
-import mage.abilities.keyword.TransformAbility;
+import mage.abilities.mana.DynamicManaAbility;
+import mage.abilities.mana.GreenManaAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.ComparisonType;
-import mage.constants.PutCards;
-import mage.constants.SuperType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledCreaturePermanent;
@@ -22,7 +22,7 @@ import java.util.UUID;
/**
* @author JRHerlehy
*/
-public final class GrowingRitesOfItlimoc extends CardImpl {
+public final class GrowingRitesOfItlimoc extends TransformingDoubleFacedCard {
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
new FilterControlledCreaturePermanent("you control four or more creatures"),
@@ -30,23 +30,30 @@ public final class GrowingRitesOfItlimoc extends CardImpl {
);
public GrowingRitesOfItlimoc(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{2}{G}",
+ "Itlimoc, Cradle of the Sun",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{}, ""
+ );
- this.supertype.add(SuperType.LEGENDARY);
-
- this.secondSideCardClazz = mage.cards.i.ItlimocCradleOfTheSun.class;
-
- // When Growing Rites of Itlimoc enters the battlefield, look at the top four cards of your library.
- // You may reveal a creature card from among them and put it into your hand.
- // Put the rest on the bottom of your library in any order.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
+ // Growing Rites of Itlimoc
+ // When Growing Rites of Itlimoc enters the battlefield, look at the top four cards of your library. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in any order.
+ this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
4, 1, StaticFilters.FILTER_CARD_CREATURE_A, PutCards.HAND, PutCards.BOTTOM_ANY
)));
// At the beginning of your end step, if you control four or more creatures, transform Growing Rites of Itlimoc.
- this.addAbility(new TransformAbility());
- this.addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect())
+ this.getLeftHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect())
.withInterveningIf(condition).addHint(CreaturesYouControlHint.instance));
+
+ // Itlimoc, Cradle of the Sun
+ // {T}: Add {G}.
+ this.getRightHalfCard().addAbility(new GreenManaAbility());
+
+ // {T}: Add {G} for each creature you control.
+ this.getRightHalfCard().addAbility(new DynamicManaAbility(
+ Mana.GreenMana(1), CreaturesYouControlCount.SINGULAR
+ ).addHint(CreaturesYouControlHint.instance));
}
private GrowingRitesOfItlimoc(final GrowingRitesOfItlimoc card) {
diff --git a/Mage.Sets/src/mage/cards/g/GutterShortcut.java b/Mage.Sets/src/mage/cards/g/GutterShortcut.java
deleted file mode 100644
index bfb716b5d02..00000000000
--- a/Mage.Sets/src/mage/cards/g/GutterShortcut.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package mage.cards.g;
-
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.condition.Condition;
-import mage.abilities.decorator.ConditionalRestrictionEffect;
-import mage.abilities.effects.common.AttachEffect;
-import mage.abilities.effects.common.combat.CantBeBlockedAttachedEffect;
-import mage.abilities.keyword.DisturbAbility;
-import mage.abilities.keyword.EnchantAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.AttachmentType;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.SubType;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.target.TargetPermanent;
-import mage.target.common.TargetCreaturePermanent;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class GutterShortcut extends CardImpl {
-
- public GutterShortcut(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
-
- this.subtype.add(SubType.AURA);
- this.color.setBlue(true);
- this.nightCard = true;
-
- // Enchant creature
- TargetPermanent auraTarget = new TargetCreaturePermanent();
- this.getSpellAbility().addTarget(auraTarget);
- this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
- this.addAbility(new EnchantAbility(auraTarget));
-
- // Enchanted creature can't be blocked as long as it's attacking alone.
- this.addAbility(new SimpleStaticAbility(new ConditionalRestrictionEffect(
- new CantBeBlockedAttachedEffect(AttachmentType.AURA), GutterShortcutCondition.instance,
- "enchanted creature can't be blocked as long as it's attacking alone"
- )));
-
- // If Gutter Shortcut would be put into a graveyard from anywhere, exile it instead.
- this.addAbility(DisturbAbility.makeBackAbility());
- }
-
- private GutterShortcut(final GutterShortcut card) {
- super(card);
- }
-
- @Override
- public GutterShortcut copy() {
- return new GutterShortcut(this);
- }
-}
-
-enum GutterShortcutCondition implements Condition {
- instance;
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = source.getSourcePermanentIfItStillExists(game);
- return permanent != null && game.getCombat().attacksAlone()
- && game.getCombat().getAttackers().contains(permanent.getAttachedTo());
- }
-}
diff --git a/Mage.Sets/src/mage/cards/g/GutterSkulker.java b/Mage.Sets/src/mage/cards/g/GutterSkulker.java
index 674a82f29b8..ec68e6828b0 100644
--- a/Mage.Sets/src/mage/cards/g/GutterSkulker.java
+++ b/Mage.Sets/src/mage/cards/g/GutterSkulker.java
@@ -1,42 +1,68 @@
package mage.cards.g;
-import mage.MageInt;
+import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceAttackingAloneCondition;
-import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalRestrictionEffect;
+import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect;
import mage.abilities.keyword.DisturbAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.EnchantAbility;
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.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class GutterSkulker extends CardImpl {
+public final class GutterSkulker extends TransformingDoubleFacedCard {
public GutterSkulker(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.SPIRIT}, "{3}{U}",
+ "Gutter Shortcut",
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.AURA}, "U"
+ );
- this.subtype.add(SubType.SPIRIT);
- this.power = new MageInt(3);
- this.toughness = new MageInt(3);
- this.secondSideCardClazz = mage.cards.g.GutterShortcut.class;
+ // Gutter Skulker
+ this.getLeftHalfCard().setPT(3, 3);
// Gutter Skulker can't be blocked as long as it's attacking alone.
- this.addAbility(new SimpleStaticAbility(new ConditionalRestrictionEffect(
+ this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new ConditionalRestrictionEffect(
new CantBeBlockedSourceEffect(Duration.WhileOnBattlefield),
SourceAttackingAloneCondition.instance,
"{this} can't be blocked as long as it's attacking alone"
)));
+ // Gutter Shortcut
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getRightHalfCard().getSpellAbility().addTarget(auraTarget);
+ this.getRightHalfCard().getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ this.getRightHalfCard().addAbility(new EnchantAbility(auraTarget));
+
// Disturb {3}{U}
- this.addAbility(new DisturbAbility(this, "{3}{U}"));
+ // needs to be added after right half has spell ability target set
+ this.getLeftHalfCard().addAbility(new DisturbAbility(this, "{3}{U}"));
+
+ // Enchanted creature can't be blocked as long as it's attacking alone.
+ this.getRightHalfCard().addAbility(new SimpleStaticAbility(new ConditionalRestrictionEffect(
+ new CantBeBlockedSourceEffect(), GutterShortcutCondition.instance,
+ "enchanted creature can't be blocked as long as it's attacking alone"
+ )));
+
+ // If Gutter Shortcut would be put into a graveyard from anywhere, exile it instead.
+ this.getRightHalfCard().addAbility(DisturbAbility.makeBackAbility());
}
private GutterSkulker(final GutterSkulker card) {
@@ -48,3 +74,14 @@ public final class GutterSkulker extends CardImpl {
return new GutterSkulker(this);
}
}
+
+enum GutterShortcutCondition implements Condition {
+ instance;
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = source.getSourcePermanentIfItStillExists(game);
+ return permanent != null && game.getCombat().attacksAlone()
+ && game.getCombat().getAttackers().contains(permanent.getAttachedTo());
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/i/ItlimocCradleOfTheSun.java b/Mage.Sets/src/mage/cards/i/ItlimocCradleOfTheSun.java
deleted file mode 100644
index 30411803120..00000000000
--- a/Mage.Sets/src/mage/cards/i/ItlimocCradleOfTheSun.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package mage.cards.i;
-
-import mage.Mana;
-import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
-import mage.abilities.hint.common.CreaturesYouControlHint;
-import mage.abilities.mana.DynamicManaAbility;
-import mage.abilities.mana.GreenManaAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SuperType;
-
-import java.util.UUID;
-
-/**
- * @author JRHerlehy
- */
-public final class ItlimocCradleOfTheSun extends CardImpl {
-
- public ItlimocCradleOfTheSun(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
-
- // (Transforms from Growing Rites of Itlimoc.)/
- this.nightCard = true;
-
- // {T}: Add {G}.
- this.addAbility(new GreenManaAbility());
-
- // {T}: Add {G} for each creature you control.
- this.addAbility(new DynamicManaAbility(
- Mana.GreenMana(1), CreaturesYouControlCount.SINGULAR
- ).addHint(CreaturesYouControlHint.instance));
- }
-
- private ItlimocCradleOfTheSun(final ItlimocCradleOfTheSun card) {
- super(card);
- }
-
- @Override
- public ItlimocCradleOfTheSun copy() {
- return new ItlimocCradleOfTheSun(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/k/KrallenhordeWantons.java b/Mage.Sets/src/mage/cards/k/KrallenhordeWantons.java
deleted file mode 100644
index dc8e2624601..00000000000
--- a/Mage.Sets/src/mage/cards/k/KrallenhordeWantons.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package mage.cards.k;
-
-import mage.MageInt;
-import mage.abilities.common.WerewolfBackTriggeredAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-
-import java.util.UUID;
-
-/**
- * @author nantuko
- */
-public final class KrallenhordeWantons extends CardImpl {
-
- public KrallenhordeWantons(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
- this.subtype.add(SubType.WEREWOLF);
- this.color.setGreen(true);
-
- // this card is the second face of double-faced card
- this.nightCard = true;
-
- this.power = new MageInt(7);
- this.toughness = new MageInt(7);
-
- // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Krallenhorde Wantons.
- this.addAbility(new WerewolfBackTriggeredAbility());
- }
-
- private KrallenhordeWantons(final KrallenhordeWantons card) {
- super(card);
- }
-
- @Override
- public KrallenhordeWantons copy() {
- return new KrallenhordeWantons(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/s/ShadowsLair.java b/Mage.Sets/src/mage/cards/s/ShadowsLair.java
deleted file mode 100644
index fed50911cb7..00000000000
--- a/Mage.Sets/src/mage/cards/s/ShadowsLair.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package mage.cards.s;
-
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.RemoveCountersSourceCost;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.common.DrawCardSourceControllerEffect;
-import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
-import mage.abilities.mana.BlackManaAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.counters.CounterType;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class ShadowsLair extends CardImpl {
-
- public ShadowsLair(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
-
- this.subtype.add(SubType.CAVE);
- this.nightCard = true;
-
- // {T}: Add {B}.
- this.addAbility(new BlackManaAbility());
-
- // {B}, {T}, Remove a dread counter from Shadows' Lair: You draw a card and you lose 1 life.
- Ability ability = new SimpleActivatedAbility(
- new DrawCardSourceControllerEffect(1, true), new ManaCostsImpl<>("{B}")
- );
- ability.addCost(new TapSourceCost());
- ability.addCost(new RemoveCountersSourceCost(CounterType.DREAD.createInstance()));
- ability.addEffect(new LoseLifeSourceControllerEffect(1).concatBy("and"));
- this.addAbility(ability);
- }
-
- private ShadowsLair(final ShadowsLair card) {
- super(card);
- }
-
- @Override
- public ShadowsLair copy() {
- return new ShadowsLair(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/v/VildinPackAlpha.java b/Mage.Sets/src/mage/cards/v/VildinPackAlpha.java
deleted file mode 100644
index 9bfc27a5810..00000000000
--- a/Mage.Sets/src/mage/cards/v/VildinPackAlpha.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package mage.cards.v;
-
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
-import mage.abilities.common.WerewolfBackTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.filter.FilterPermanent;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
-
-import java.util.UUID;
-
-/**
- * @author LevelX2
- */
-public final class VildinPackAlpha extends CardImpl {
-
- private static final FilterPermanent filter = new FilterCreaturePermanent(SubType.WEREWOLF, "a Werewolf");
-
- public VildinPackAlpha(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(4);
- this.toughness = new MageInt(3);
- this.color.setRed(true);
-
- this.nightCard = true;
-
- // Whenever a Werewolf you control enters, you may transform it.
- this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
- Zone.BATTLEFIELD, new VildinPackAlphaEffect(), filter,
- true, SetTargetPointer.PERMANENT
- ));
-
- // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Vildin-Pack Alpha.
- this.addAbility(new WerewolfBackTriggeredAbility());
- }
-
- private VildinPackAlpha(final VildinPackAlpha card) {
- super(card);
- }
-
- @Override
- public VildinPackAlpha copy() {
- return new VildinPackAlpha(this);
- }
-}
-
-class VildinPackAlphaEffect extends OneShotEffect {
-
- VildinPackAlphaEffect() {
- super(Outcome.Benefit);
- this.staticText = "you may transform it";
- }
-
- private VildinPackAlphaEffect(final VildinPackAlphaEffect effect) {
- super(effect);
- }
-
- @Override
- public VildinPackAlphaEffect copy() {
- return new VildinPackAlphaEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller == null) {
- return false;
- }
- Permanent werewolf = game.getPermanent(getTargetPointer().getFirst(game, source));
- if (werewolf != null) {
- werewolf.transform(source, game);
- }
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/sets/EldritchMoon.java b/Mage.Sets/src/mage/sets/EldritchMoon.java
index 2e178da8f64..670079081ac 100644
--- a/Mage.Sets/src/mage/sets/EldritchMoon.java
+++ b/Mage.Sets/src/mage/sets/EldritchMoon.java
@@ -133,7 +133,6 @@ public final class EldritchMoon extends ExpansionSet {
cards.add(new SetCardInfo("Graf Rats", 91, Rarity.COMMON, mage.cards.g.GrafRats.class));
cards.add(new SetCardInfo("Grapple with the Past", 160, Rarity.COMMON, mage.cards.g.GrappleWithThePast.class));
cards.add(new SetCardInfo("Grim Flayer", 184, Rarity.MYTHIC, mage.cards.g.GrimFlayer.class));
- cards.add(new SetCardInfo("Grisly Anglerfish", 63, Rarity.UNCOMMON, mage.cards.g.GrislyAnglerfish.class));
cards.add(new SetCardInfo("Grizzled Angler", 63, Rarity.UNCOMMON, mage.cards.g.GrizzledAngler.class));
cards.add(new SetCardInfo("Guardian of Pilgrims", 30, Rarity.COMMON, mage.cards.g.GuardianOfPilgrims.class));
cards.add(new SetCardInfo("Hamlet Captain", 161, Rarity.UNCOMMON, mage.cards.h.HamletCaptain.class));
diff --git a/Mage.Sets/src/mage/sets/FinalFantasy.java b/Mage.Sets/src/mage/sets/FinalFantasy.java
index 43a1d38d199..d9fb797677d 100644
--- a/Mage.Sets/src/mage/sets/FinalFantasy.java
+++ b/Mage.Sets/src/mage/sets/FinalFantasy.java
@@ -94,8 +94,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Cecil, Dark Knight", 445, Rarity.RARE, mage.cards.c.CecilDarkKnight.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Cecil, Dark Knight", 525, Rarity.RARE, mage.cards.c.CecilDarkKnight.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Cecil, Dark Knight", 91, Rarity.RARE, mage.cards.c.CecilDarkKnight.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Chaos, the Endless", 221, Rarity.UNCOMMON, mage.cards.c.ChaosTheEndless.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Chaos, the Endless", 486, Rarity.UNCOMMON, mage.cards.c.ChaosTheEndless.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Choco, Seeker of Paradise", 215, Rarity.RARE, mage.cards.c.ChocoSeekerOfParadise.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Choco, Seeker of Paradise", 479, Rarity.RARE, mage.cards.c.ChocoSeekerOfParadise.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Choco, Seeker of Paradise", 569, Rarity.RARE, mage.cards.c.ChocoSeekerOfParadise.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/FromTheVaultTransform.java b/Mage.Sets/src/mage/sets/FromTheVaultTransform.java
index 68ef3e439ca..81cd9785d69 100644
--- a/Mage.Sets/src/mage/sets/FromTheVaultTransform.java
+++ b/Mage.Sets/src/mage/sets/FromTheVaultTransform.java
@@ -30,7 +30,6 @@ public final class FromTheVaultTransform extends ExpansionSet {
cards.add(new SetCardInfo("Delver of Secrets", 7, Rarity.MYTHIC, mage.cards.d.DelverOfSecrets.class));
cards.add(new SetCardInfo("Elbrus, the Binding Blade", 8, Rarity.MYTHIC, mage.cards.e.ElbrusTheBindingBlade.class));
cards.add(new SetCardInfo("Garruk Relentless", 9, Rarity.MYTHIC, mage.cards.g.GarrukRelentless.class));
- cards.add(new SetCardInfo("Garruk, the Veil-Cursed", 9, Rarity.MYTHIC, mage.cards.g.GarrukTheVeilCursed.class));
cards.add(new SetCardInfo("Gisela, the Broken Blade", 10, Rarity.MYTHIC, mage.cards.g.GiselaTheBrokenBlade.class));
cards.add(new SetCardInfo("Huntmaster of the Fells", 11, Rarity.MYTHIC, mage.cards.h.HuntmasterOfTheFells.class));
cards.add(new SetCardInfo("Jace, Vryn's Prodigy", 12, Rarity.MYTHIC, mage.cards.j.JaceVrynsProdigy.class));
diff --git a/Mage.Sets/src/mage/sets/HasCon2017.java b/Mage.Sets/src/mage/sets/HasCon2017.java
index a8ef14cac47..f1341c2f45d 100644
--- a/Mage.Sets/src/mage/sets/HasCon2017.java
+++ b/Mage.Sets/src/mage/sets/HasCon2017.java
@@ -21,7 +21,6 @@ public final class HasCon2017 extends ExpansionSet {
this.hasBasicLands = false;
cards.add(new ExpansionSet.SetCardInfo("Grimlock, Dinobot Leader", 1, Rarity.MYTHIC, mage.cards.g.GrimlockDinobotLeader.class));
- cards.add(new ExpansionSet.SetCardInfo("Grimlock, Ferocious King", 1, Rarity.MYTHIC, mage.cards.g.GrimlockFerociousKing.class));
cards.add(new ExpansionSet.SetCardInfo("Sword of Dungeons & Dragons", 3, Rarity.MYTHIC, mage.cards.s.SwordOfDungeonsAndDragons.class));
}
}
diff --git a/Mage.Sets/src/mage/sets/Innistrad.java b/Mage.Sets/src/mage/sets/Innistrad.java
index a37d00cdd8c..da91f42dbd5 100644
--- a/Mage.Sets/src/mage/sets/Innistrad.java
+++ b/Mage.Sets/src/mage/sets/Innistrad.java
@@ -124,8 +124,6 @@ public final class Innistrad extends ExpansionSet {
cards.add(new SetCardInfo("Gallows Warden", 16, Rarity.UNCOMMON, mage.cards.g.GallowsWarden.class));
cards.add(new SetCardInfo("Galvanic Juggernaut", 222, Rarity.UNCOMMON, mage.cards.g.GalvanicJuggernaut.class));
cards.add(new SetCardInfo("Garruk Relentless", 181, Rarity.MYTHIC, mage.cards.g.GarrukRelentless.class));
- cards.add(new SetCardInfo("Garruk, the Veil-Cursed", 181, Rarity.MYTHIC, mage.cards.g.GarrukTheVeilCursed.class));
- cards.add(new SetCardInfo("Gatstaf Howler", 182, Rarity.UNCOMMON, mage.cards.g.GatstafHowler.class));
cards.add(new SetCardInfo("Gatstaf Shepherd", 182, Rarity.UNCOMMON, mage.cards.g.GatstafShepherd.class));
cards.add(new SetCardInfo("Gavony Township", 239, Rarity.RARE, mage.cards.g.GavonyTownship.class));
cards.add(new SetCardInfo("Geist of Saint Traft", 213, Rarity.MYTHIC, mage.cards.g.GeistOfSaintTraft.class));
@@ -171,7 +169,6 @@ public final class Innistrad extends ExpansionSet {
cards.add(new SetCardInfo("Kessig Wolf Run", 243, Rarity.RARE, mage.cards.k.KessigWolfRun.class));
cards.add(new SetCardInfo("Kessig Wolf", 151, Rarity.COMMON, mage.cards.k.KessigWolf.class));
cards.add(new SetCardInfo("Kindercatch", 190, Rarity.COMMON, mage.cards.k.Kindercatch.class));
- cards.add(new SetCardInfo("Krallenhorde Wantons", 185, Rarity.COMMON, mage.cards.k.KrallenhordeWantons.class));
cards.add(new SetCardInfo("Kruin Outlaw", 152, Rarity.RARE, mage.cards.k.KruinOutlaw.class));
cards.add(new SetCardInfo("Laboratory Maniac", 61, Rarity.RARE, mage.cards.l.LaboratoryManiac.class));
cards.add(new SetCardInfo("Lantern Spirit", 62, Rarity.UNCOMMON, mage.cards.l.LanternSpirit.class));
diff --git a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java
index f7b1c81346e..3b20bb905a6 100644
--- a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java
+++ b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java
@@ -220,7 +220,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Groom's Finery", 117, Rarity.UNCOMMON, mage.cards.g.GroomsFinery.class));
cards.add(new SetCardInfo("Gryff Rider", 15, Rarity.COMMON, mage.cards.g.GryffRider.class));
cards.add(new SetCardInfo("Gryffwing Cavalry", 16, Rarity.UNCOMMON, mage.cards.g.GryffwingCavalry.class));
- cards.add(new SetCardInfo("Gutter Shortcut", 62, Rarity.UNCOMMON, mage.cards.g.GutterShortcut.class));
cards.add(new SetCardInfo("Gutter Skulker", 62, Rarity.UNCOMMON, mage.cards.g.GutterSkulker.class));
cards.add(new SetCardInfo("Halana and Alena, Partners", 239, Rarity.RARE, mage.cards.h.HalanaAndAlenaPartners.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Halana and Alena, Partners", 325, Rarity.RARE, mage.cards.h.HalanaAndAlenaPartners.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java
index 4ba22086499..a07389c7fc3 100644
--- a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java
+++ b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java
@@ -263,7 +263,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Gluttonous Guest", 381, Rarity.COMMON, mage.cards.g.GluttonousGuest.class));
cards.add(new SetCardInfo("Graf Reaver", 382, Rarity.RARE, mage.cards.g.GrafReaver.class));
cards.add(new SetCardInfo("Grafted Identity", 57, Rarity.RARE, mage.cards.g.GraftedIdentity.class));
- cards.add(new SetCardInfo("Graveyard Glutton", 104, Rarity.RARE, mage.cards.g.GraveyardGlutton.class));
cards.add(new SetCardInfo("Graveyard Trespasser", 104, Rarity.RARE, mage.cards.g.GraveyardTrespasser.class));
cards.add(new SetCardInfo("Grisly Ritual", 383, Rarity.COMMON, mage.cards.g.GrislyRitual.class));
cards.add(new SetCardInfo("Grizzly Ghoul", 226, Rarity.UNCOMMON, mage.cards.g.GrizzlyGhoul.class));
@@ -271,7 +270,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Groom's Finery", 384, Rarity.UNCOMMON, mage.cards.g.GroomsFinery.class));
cards.add(new SetCardInfo("Gryff Rider", 282, Rarity.COMMON, mage.cards.g.GryffRider.class));
cards.add(new SetCardInfo("Gryffwing Cavalry", 283, Rarity.UNCOMMON, mage.cards.g.GryffwingCavalry.class));
- cards.add(new SetCardInfo("Gutter Shortcut", 329, Rarity.UNCOMMON, mage.cards.g.GutterShortcut.class));
cards.add(new SetCardInfo("Gutter Skulker", 329, Rarity.UNCOMMON, mage.cards.g.GutterSkulker.class));
cards.add(new SetCardInfo("Halana and Alena, Partners", 506, Rarity.RARE, mage.cards.h.HalanaAndAlenaPartners.class));
cards.add(new SetCardInfo("Hallowed Haunting", 284, Rarity.MYTHIC, mage.cards.h.HallowedHaunting.class));
diff --git a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java
index df5211502e6..5b0fe66be0b 100644
--- a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java
+++ b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java
@@ -208,8 +208,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Gisa, Glorious Resurrector", 314, Rarity.RARE, mage.cards.g.GisaGloriousResurrector.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Grafted Identity", 335, Rarity.RARE, mage.cards.g.GraftedIdentity.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Grafted Identity", 57, Rarity.RARE, mage.cards.g.GraftedIdentity.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Graveyard Glutton", 104, Rarity.RARE, mage.cards.g.GraveyardGlutton.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Graveyard Glutton", 290, Rarity.RARE, mage.cards.g.GraveyardGlutton.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Graveyard Trespasser", 104, Rarity.RARE, mage.cards.g.GraveyardTrespasser.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Graveyard Trespasser", 290, Rarity.RARE, mage.cards.g.GraveyardTrespasser.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Grizzly Ghoul", 226, Rarity.UNCOMMON, mage.cards.g.GrizzlyGhoul.class));
diff --git a/Mage.Sets/src/mage/sets/InnistradRemastered.java b/Mage.Sets/src/mage/sets/InnistradRemastered.java
index f9e11e06e41..b7e16be6fd4 100644
--- a/Mage.Sets/src/mage/sets/InnistradRemastered.java
+++ b/Mage.Sets/src/mage/sets/InnistradRemastered.java
@@ -218,7 +218,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Galvanic Juggernaut", 263, Rarity.UNCOMMON, mage.cards.g.GalvanicJuggernaut.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Galvanic Juggernaut", 443, Rarity.UNCOMMON, mage.cards.g.GalvanicJuggernaut.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Garruk Relentless", 197, Rarity.MYTHIC, mage.cards.g.GarrukRelentless.class));
- cards.add(new SetCardInfo("Garruk, the Veil-Cursed", 197, Rarity.MYTHIC, mage.cards.g.GarrukTheVeilCursed.class));
cards.add(new SetCardInfo("Gather the Townsfolk", 23, Rarity.COMMON, mage.cards.g.GatherTheTownsfolk.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Gather the Townsfolk", 341, Rarity.COMMON, mage.cards.g.GatherTheTownsfolk.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Geier Reach Bandit", 156, Rarity.UNCOMMON, mage.cards.g.GeierReachBandit.class, NON_FULL_USE_VARIOUS));
@@ -244,8 +243,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Griselbrand", 115, Rarity.MYTHIC, mage.cards.g.Griselbrand.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Griselbrand", 381, Rarity.MYTHIC, mage.cards.g.Griselbrand.class,RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Griselbrand", 485, Rarity.MYTHIC, mage.cards.g.Griselbrand.class, FULL_ART_USE_VARIOUS));
- cards.add(new SetCardInfo("Grisly Anglerfish", 458, Rarity.UNCOMMON, mage.cards.g.GrislyAnglerfish.class, RETRO_ART_USE_VARIOUS));
- cards.add(new SetCardInfo("Grisly Anglerfish", 67, Rarity.UNCOMMON, mage.cards.g.GrislyAnglerfish.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Grizzled Angler", 458, Rarity.UNCOMMON, mage.cards.g.GrizzledAngler.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Grizzled Angler", 67, Rarity.UNCOMMON, mage.cards.g.GrizzledAngler.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Grizzly Ghoul", 240, Rarity.UNCOMMON, mage.cards.g.GrizzlyGhoul.class));
@@ -521,8 +518,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Vanquish the Horde", 49, Rarity.RARE, mage.cards.v.VanquishTheHorde.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Vexing Devil", 178, Rarity.RARE, mage.cards.v.VexingDevil.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Vexing Devil", 313, Rarity.RARE, mage.cards.v.VexingDevil.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Vildin-Pack Alpha", 156, Rarity.UNCOMMON, mage.cards.v.VildinPackAlpha.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Vildin-Pack Alpha", 464, Rarity.UNCOMMON, mage.cards.v.VildinPackAlpha.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Vilespawn Spider", 251, Rarity.UNCOMMON, mage.cards.v.VilespawnSpider.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Vilespawn Spider", 436, Rarity.UNCOMMON, mage.cards.v.VilespawnSpider.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Village Messenger", 179, Rarity.COMMON, mage.cards.v.VillageMessenger.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/Ixalan.java b/Mage.Sets/src/mage/sets/Ixalan.java
index ac805618e76..c03bde3dd7a 100644
--- a/Mage.Sets/src/mage/sets/Ixalan.java
+++ b/Mage.Sets/src/mage/sets/Ixalan.java
@@ -157,7 +157,6 @@ public final class Ixalan extends ExpansionSet {
cards.add(new SetCardInfo("Island", 265, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 266, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 267, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Itlimoc, Cradle of the Sun", 191, Rarity.RARE, mage.cards.i.ItlimocCradleOfTheSun.class));
cards.add(new SetCardInfo("Ixalan's Binding", 17, Rarity.UNCOMMON, mage.cards.i.IxalansBinding.class));
cards.add(new SetCardInfo("Ixalli's Diviner", 192, Rarity.COMMON, mage.cards.i.IxallisDiviner.class));
cards.add(new SetCardInfo("Ixalli's Keeper", 193, Rarity.COMMON, mage.cards.i.IxallisKeeper.class));
diff --git a/Mage.Sets/src/mage/sets/IxalanPromos.java b/Mage.Sets/src/mage/sets/IxalanPromos.java
index 0c55b5ea44a..65828df8668 100644
--- a/Mage.Sets/src/mage/sets/IxalanPromos.java
+++ b/Mage.Sets/src/mage/sets/IxalanPromos.java
@@ -74,7 +74,6 @@ public class IxalanPromos extends ExpansionSet {
cards.add(new SetCardInfo("Herald of Secret Streams", "59s", Rarity.RARE, mage.cards.h.HeraldOfSecretStreams.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hostage Taker", "223s", Rarity.RARE, mage.cards.h.HostageTaker.class));
cards.add(new SetCardInfo("Huatli, Warrior Poet", "224s", Rarity.MYTHIC, mage.cards.h.HuatliWarriorPoet.class));
- cards.add(new SetCardInfo("Itlimoc, Cradle of the Sun", "191s", Rarity.RARE, mage.cards.i.ItlimocCradleOfTheSun.class));
cards.add(new SetCardInfo("Jace, Cunning Castaway", "60s", Rarity.MYTHIC, mage.cards.j.JaceCunningCastaway.class));
cards.add(new SetCardInfo("Kinjalli's Sunwing", "19p", Rarity.RARE, mage.cards.k.KinjallisSunwing.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kinjalli's Sunwing", "19s", Rarity.RARE, mage.cards.k.KinjallisSunwing.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/JudgeGiftCards2022.java b/Mage.Sets/src/mage/sets/JudgeGiftCards2022.java
index 9ac65f709f6..d17992860c3 100644
--- a/Mage.Sets/src/mage/sets/JudgeGiftCards2022.java
+++ b/Mage.Sets/src/mage/sets/JudgeGiftCards2022.java
@@ -23,7 +23,6 @@ public class JudgeGiftCards2022 extends ExpansionSet {
cards.add(new SetCardInfo("Animate Dead", 7, Rarity.RARE, mage.cards.a.AnimateDead.class, RETRO_ART));
cards.add(new SetCardInfo("Greater Auramancy", 1, Rarity.RARE, mage.cards.g.GreaterAuramancy.class));
cards.add(new SetCardInfo("Growing Rites of Itlimoc", 10, Rarity.RARE, mage.cards.g.GrowingRitesOfItlimoc.class));
- cards.add(new SetCardInfo("Itlimoc, Cradle of the Sun", 10, Rarity.RARE, mage.cards.i.ItlimocCradleOfTheSun.class));
cards.add(new SetCardInfo("No Mercy", 9, Rarity.RARE, mage.cards.n.NoMercy.class));
cards.add(new SetCardInfo("Omniscience", 2, Rarity.RARE, mage.cards.o.Omniscience.class));
cards.add(new SetCardInfo("Parallel Lives", 3, Rarity.RARE, mage.cards.p.ParallelLives.class));
diff --git a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java
index 96ae38826a0..da0138bcee6 100644
--- a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java
+++ b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java
@@ -96,7 +96,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("Chandra, Hope's Beacon", 321, Rarity.MYTHIC, mage.cards.c.ChandraHopesBeacon.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Change the Equation", 50, Rarity.UNCOMMON, mage.cards.c.ChangeTheEquation.class));
cards.add(new SetCardInfo("Chomping Kavu", 179, Rarity.COMMON, mage.cards.c.ChompingKavu.class));
- cards.add(new SetCardInfo("Chrome Host Hulk", 188, Rarity.UNCOMMON, mage.cards.c.ChromeHostHulk.class));
cards.add(new SetCardInfo("Chrome Host Seedshark", 350, Rarity.RARE, mage.cards.c.ChromeHostSeedshark.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Chrome Host Seedshark", 51, Rarity.RARE, mage.cards.c.ChromeHostSeedshark.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("City on Fire", 135, Rarity.RARE, mage.cards.c.CityOnFire.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java
index 07b11bafc73..1aaf20ca64d 100644
--- a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java
+++ b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java
@@ -110,7 +110,6 @@ public final class RivalsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Goblin Trailblazer", 105, Rarity.COMMON, mage.cards.g.GoblinTrailblazer.class));
cards.add(new SetCardInfo("Golden Demise", 73, Rarity.UNCOMMON, mage.cards.g.GoldenDemise.class));
cards.add(new SetCardInfo("Golden Guardian", 179, Rarity.RARE, mage.cards.g.GoldenGuardian.class));
- cards.add(new SetCardInfo("Gold-Forge Garrison", 179, Rarity.RARE, mage.cards.g.GoldForgeGarrison.class));
cards.add(new SetCardInfo("Grasping Scoundrel", 74, Rarity.COMMON, mage.cards.g.GraspingScoundrel.class));
cards.add(new SetCardInfo("Gruesome Fate", 75, Rarity.COMMON, mage.cards.g.GruesomeFate.class));
cards.add(new SetCardInfo("Hadana's Climb", 158, Rarity.RARE, mage.cards.h.HadanasClimb.class));
diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java b/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java
index d01a374be83..f93acb7a741 100644
--- a/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java
+++ b/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java
@@ -53,7 +53,6 @@ public class RivalsOfIxalanPromos extends ExpansionSet {
cards.add(new SetCardInfo("Ghalta, Primal Hunger", 130, Rarity.RARE, mage.cards.g.GhaltaPrimalHunger.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ghalta, Primal Hunger", "130p", Rarity.RARE, mage.cards.g.GhaltaPrimalHunger.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ghalta, Primal Hunger", "130s", Rarity.RARE, mage.cards.g.GhaltaPrimalHunger.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Gold-Forge Garrison", "179s", Rarity.RARE, mage.cards.g.GoldForgeGarrison.class));
cards.add(new SetCardInfo("Golden Guardian", "179s", Rarity.RARE, mage.cards.g.GoldenGuardian.class));
cards.add(new SetCardInfo("Hadana's Climb", "158s", Rarity.RARE, mage.cards.h.HadanasClimb.class));
cards.add(new SetCardInfo("Huatli, Radiant Champion", "159s", Rarity.MYTHIC, mage.cards.h.HuatliRadiantChampion.class));
diff --git a/Mage.Sets/src/mage/sets/SecretLairDrop.java b/Mage.Sets/src/mage/sets/SecretLairDrop.java
index 44f8823b6ac..b82f513aa06 100644
--- a/Mage.Sets/src/mage/sets/SecretLairDrop.java
+++ b/Mage.Sets/src/mage/sets/SecretLairDrop.java
@@ -2133,7 +2133,6 @@ public class SecretLairDrop extends ExpansionSet {
cards.add(new SetCardInfo("Swords to Plowshares", 2167, Rarity.RARE, mage.cards.s.SwordsToPlowshares.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Baral, Chief of Compliance", 2168, Rarity.RARE, mage.cards.b.BaralChiefOfCompliance.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Garruk Relentless", 2169, Rarity.MYTHIC, mage.cards.g.GarrukRelentless.class));
- cards.add(new SetCardInfo("Garruk, the Veil-Cursed", 2169, Rarity.MYTHIC, mage.cards.g.GarrukTheVeilCursed.class));
cards.add(new SetCardInfo("Reaper King", 2170, Rarity.RARE, mage.cards.r.ReaperKing.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Glen Elendra Archmage", 2171, Rarity.RARE, mage.cards.g.GlenElendraArchmage.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Guardian Project", 2172, Rarity.MYTHIC, mage.cards.g.GuardianProject.class));
diff --git a/Mage.Sets/src/mage/sets/ShadowsOfThePast.java b/Mage.Sets/src/mage/sets/ShadowsOfThePast.java
index 3a9b0e6b694..0cfb57821a4 100644
--- a/Mage.Sets/src/mage/sets/ShadowsOfThePast.java
+++ b/Mage.Sets/src/mage/sets/ShadowsOfThePast.java
@@ -54,7 +54,6 @@ public class ShadowsOfThePast extends ExpansionSet {
cards.add(new SetCardInfo("Forge Devil", 41, Rarity.COMMON, mage.cards.f.ForgeDevil.class));
cards.add(new SetCardInfo("Galvanic Juggernaut", 72, Rarity.UNCOMMON, mage.cards.g.GalvanicJuggernaut.class));
cards.add(new SetCardInfo("Garruk Relentless", 49, Rarity.MYTHIC, mage.cards.g.GarrukRelentless.class));
- cards.add(new SetCardInfo("Garruk, the Veil-Cursed", 49, Rarity.MYTHIC, mage.cards.g.GarrukTheVeilCursed.class));
cards.add(new SetCardInfo("Geist of Saint Traft", 62, Rarity.MYTHIC, mage.cards.g.GeistOfSaintTraft.class));
cards.add(new SetCardInfo("Ghoulraiser", 30, Rarity.COMMON, mage.cards.g.Ghoulraiser.class));
cards.add(new SetCardInfo("Gnaw to the Bone", 50, Rarity.COMMON, mage.cards.g.GnawToTheBone.class));
diff --git a/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java b/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java
index f9aa8c5f5ef..9fcedd562d5 100644
--- a/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java
+++ b/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java
@@ -136,7 +136,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
cards.add(new SetCardInfo("Furtive Homunculus", 64, Rarity.COMMON, mage.cards.f.FurtiveHomunculus.class));
cards.add(new SetCardInfo("Game Trail", 276, Rarity.RARE, mage.cards.g.GameTrail.class));
cards.add(new SetCardInfo("Gatstaf Arsonists", 158, Rarity.COMMON, mage.cards.g.GatstafArsonists.class));
- cards.add(new SetCardInfo("Gatstaf Ravagers", 158, Rarity.COMMON, mage.cards.g.GatstafRavagers.class));
cards.add(new SetCardInfo("Geier Reach Bandit", 159, Rarity.RARE, mage.cards.g.GeierReachBandit.class));
cards.add(new SetCardInfo("Geistblast", 160, Rarity.UNCOMMON, mage.cards.g.Geistblast.class));
cards.add(new SetCardInfo("Geralf's Masterpiece", 65, Rarity.MYTHIC, mage.cards.g.GeralfsMasterpiece.class));
@@ -342,7 +341,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
cards.add(new SetCardInfo("Vessel of Paramnesia", 95, Rarity.COMMON, mage.cards.v.VesselOfParamnesia.class));
cards.add(new SetCardInfo("Vessel of Volatility", 189, Rarity.COMMON, mage.cards.v.VesselOfVolatility.class));
cards.add(new SetCardInfo("Veteran Cathar", 238, Rarity.UNCOMMON, mage.cards.v.VeteranCathar.class));
- cards.add(new SetCardInfo("Vildin-Pack Alpha", 159, Rarity.RARE, mage.cards.v.VildinPackAlpha.class));
cards.add(new SetCardInfo("Village Messenger", 190, Rarity.UNCOMMON, mage.cards.v.VillageMessenger.class));
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));
diff --git a/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java b/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java
index 9e53eaafb27..9c11add782d 100644
--- a/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java
+++ b/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java
@@ -109,7 +109,6 @@ public class ShadowsOverInnistradPromos extends ExpansionSet {
cards.add(new SetCardInfo("Traverse the Ulvenwald", "234s", Rarity.RARE, mage.cards.t.TraverseTheUlvenwald.class));
cards.add(new SetCardInfo("Triskaidekaphobia", "141s", Rarity.RARE, mage.cards.t.Triskaidekaphobia.class));
cards.add(new SetCardInfo("Ulvenwald Hydra", "235s", Rarity.MYTHIC, mage.cards.u.UlvenwaldHydra.class));
- cards.add(new SetCardInfo("Vildin-Pack Alpha", "159s", Rarity.RARE, mage.cards.v.VildinPackAlpha.class));
cards.add(new SetCardInfo("Welcome to the Fold", "96s", Rarity.RARE, mage.cards.w.WelcomeToTheFold.class));
cards.add(new SetCardInfo("Werewolf of Ancient Hunger", "225s", Rarity.RARE, mage.cards.w.WerewolfOfAncientHunger.class));
cards.add(new SetCardInfo("Westvale Abbey", "281s", Rarity.RARE, mage.cards.w.WestvaleAbbey.class));
diff --git a/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java b/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java
index 6cdd42e309e..c4375f7ec2b 100644
--- a/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java
+++ b/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java
@@ -139,7 +139,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Galvanic Bombardment", 157, Rarity.COMMON, mage.cards.g.GalvanicBombardment.class));
cards.add(new SetCardInfo("Game Trail", 269, Rarity.UNCOMMON, mage.cards.g.GameTrail.class));
cards.add(new SetCardInfo("Gatstaf Arsonists", 158, Rarity.COMMON, mage.cards.g.GatstafArsonists.class));
- cards.add(new SetCardInfo("Gatstaf Ravagers", 158, Rarity.COMMON, mage.cards.g.GatstafRavagers.class));
cards.add(new SetCardInfo("Gavony Unhallowed", 111, Rarity.COMMON, mage.cards.g.GavonyUnhallowed.class));
cards.add(new SetCardInfo("Geier Reach Bandit", 159, Rarity.UNCOMMON, mage.cards.g.GeierReachBandit.class));
cards.add(new SetCardInfo("Geier Reach Sanitarium", 270, Rarity.RARE, mage.cards.g.GeierReachSanitarium.class));
@@ -323,7 +322,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Uncaged Fury", 183, Rarity.UNCOMMON, mage.cards.u.UncagedFury.class));
cards.add(new SetCardInfo("Vessel of Nascency", 224, Rarity.UNCOMMON, mage.cards.v.VesselOfNascency.class));
cards.add(new SetCardInfo("Veteran Cathar", 225, Rarity.UNCOMMON, mage.cards.v.VeteranCathar.class));
- cards.add(new SetCardInfo("Vildin-Pack Alpha", 159, Rarity.UNCOMMON, mage.cards.v.VildinPackAlpha.class));
cards.add(new SetCardInfo("Village Messenger", 184, Rarity.UNCOMMON, mage.cards.v.VillageMessenger.class));
cards.add(new SetCardInfo("Voldaren Pariah", 138, Rarity.RARE, mage.cards.v.VoldarenPariah.class));
cards.add(new SetCardInfo("Voracious Reader", 58, Rarity.UNCOMMON, mage.cards.v.VoraciousReader.class));
diff --git a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java
index d2c77c86f58..4dba2652837 100644
--- a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java
+++ b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java
@@ -229,8 +229,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Island", 288, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_UST_VARIOUS));
cards.add(new SetCardInfo("Island", 395, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 396, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Itlimoc, Cradle of the Sun", 188, Rarity.RARE, mage.cards.i.ItlimocCradleOfTheSun.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Itlimoc, Cradle of the Sun", 380, Rarity.RARE, mage.cards.i.ItlimocCradleOfTheSun.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Itzquinth, Firstborn of Gishath", 230, Rarity.UNCOMMON, mage.cards.i.ItzquinthFirstbornOfGishath.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Itzquinth, Firstborn of Gishath", 331, Rarity.UNCOMMON, mage.cards.i.ItzquinthFirstbornOfGishath.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ixalli's Lorekeeper", 194, Rarity.UNCOMMON, mage.cards.i.IxallisLorekeeper.class));
@@ -372,7 +370,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Self-Reflection", 74, Rarity.UNCOMMON, mage.cards.s.SelfReflection.class));
cards.add(new SetCardInfo("Sentinel of the Nameless City", 211, Rarity.RARE, mage.cards.s.SentinelOfTheNamelessCity.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sentinel of the Nameless City", 383, Rarity.RARE, mage.cards.s.SentinelOfTheNamelessCity.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Shadows' Lair", 108, Rarity.UNCOMMON, mage.cards.s.ShadowsLair.class));
cards.add(new SetCardInfo("Shipwreck Sentry", 75, Rarity.COMMON, mage.cards.s.ShipwreckSentry.class));
cards.add(new SetCardInfo("Sinuous Benthisaur", 76, Rarity.UNCOMMON, mage.cards.s.SinuousBenthisaur.class));
cards.add(new SetCardInfo("Skullcap Snail", 119, Rarity.COMMON, mage.cards.s.SkullcapSnail.class));
diff --git a/Mage.Sets/src/mage/sets/Transformers.java b/Mage.Sets/src/mage/sets/Transformers.java
index ca587a56df9..36bf14c5221 100644
--- a/Mage.Sets/src/mage/sets/Transformers.java
+++ b/Mage.Sets/src/mage/sets/Transformers.java
@@ -24,7 +24,6 @@ public final class Transformers extends ExpansionSet {
cards.add(new SetCardInfo("Cyclonus, the Saboteur", 9, Rarity.MYTHIC, mage.cards.c.CyclonusTheSaboteur.class));
cards.add(new SetCardInfo("Flamewar, Brash Veteran", 10, Rarity.MYTHIC, mage.cards.f.FlamewarBrashVeteran.class));
cards.add(new SetCardInfo("Goldbug, Humanity's Ally", 11, Rarity.MYTHIC, mage.cards.g.GoldbugHumanitysAlly.class));
- cards.add(new SetCardInfo("Goldbug, Scrappy Scout", 11, Rarity.MYTHIC, mage.cards.g.GoldbugScrappyScout.class));
cards.add(new SetCardInfo("Jetfire, Air Guardian", 3, Rarity.MYTHIC, mage.cards.j.JetfireAirGuardian.class));
cards.add(new SetCardInfo("Jetfire, Ingenious Scientist", 3, Rarity.MYTHIC, mage.cards.j.JetfireIngeniousScientist.class));
cards.add(new SetCardInfo("Megatron, Destructive Force", 12, Rarity.MYTHIC, mage.cards.m.MegatronDestructiveForce.class));
diff --git a/Mage.Sets/src/mage/sets/XLNTreasureChest.java b/Mage.Sets/src/mage/sets/XLNTreasureChest.java
index d4268f37d84..d201c6e94b4 100644
--- a/Mage.Sets/src/mage/sets/XLNTreasureChest.java
+++ b/Mage.Sets/src/mage/sets/XLNTreasureChest.java
@@ -26,7 +26,6 @@ public class XLNTreasureChest extends ExpansionSet {
cards.add(new SetCardInfo("Conqueror's Galleon", 234, Rarity.RARE, mage.cards.c.ConquerorsGalleon.class));
cards.add(new SetCardInfo("Dowsing Dagger", 235, Rarity.RARE, mage.cards.d.DowsingDagger.class));
cards.add(new SetCardInfo("Growing Rites of Itlimoc", 191, Rarity.RARE, mage.cards.g.GrowingRitesOfItlimoc.class));
- cards.add(new SetCardInfo("Itlimoc, Cradle of the Sun", 191, Rarity.RARE, mage.cards.i.ItlimocCradleOfTheSun.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));