convert transforming "G" cards to single class file

This commit is contained in:
jmlundeen 2025-11-29 13:15:21 -06:00
parent f550f077d0
commit 06f54e5df1
53 changed files with 571 additions and 1153 deletions

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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) {

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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) {

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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) {

View file

@ -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) {
@ -43,3 +62,33 @@ public final class GeierReachBandit extends CardImpl {
return new GeierReachBandit(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;
}
}

View file

@ -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) {

View file

@ -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;
// <i>(Transforms from Golden Guardian.)</i>
// {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);
}
}

View file

@ -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}.";
}
}

View file

@ -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}.";
}
}

View file

@ -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, ");
}

View file

@ -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) {

View file

@ -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;
// WardDiscard 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;
}
}

View file

@ -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);
// WardDiscard 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);
// WardDiscard 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;
}
}

View file

@ -1,36 +1,37 @@
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{
public final class GrimlockDinobotLeader extends TransformingDoubleFacedCard {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Dinosaurs and Vehicles");
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.<MageObject>or(
SubType.DINOSAUR.getPredicate(),
SubType.VEHICLE.getPredicate())
);
}
private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("Transformers creatures");
@ -41,21 +42,30 @@ public final class GrimlockDinobotLeader extends CardImpl{
}
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);
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"
);
this.secondSideCardClazz = mage.cards.g.GrimlockFerociousKing.class;
// 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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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());
}
}

View file

@ -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());
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));
}
}

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));

View file

@ -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));