forked from External/mage
convert transforming "A" cards to single class file
This commit is contained in:
parent
395a327cd3
commit
c5c42abb59
68 changed files with 1230 additions and 2223 deletions
|
|
@ -1,60 +0,0 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.abilities.keyword.ReachAbility;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.TappedPredicate;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangAndLaOceansFury extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("tapped creature you control");
|
||||
|
||||
static {
|
||||
filter.add(TappedPredicate.TAPPED);
|
||||
}
|
||||
|
||||
public AangAndLaOceansFury(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.AVATAR);
|
||||
this.subtype.add(SubType.SPIRIT);
|
||||
this.subtype.add(SubType.ALLY);
|
||||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(5);
|
||||
this.nightCard = true;
|
||||
|
||||
// Reach
|
||||
this.addAbility(ReachAbility.getInstance());
|
||||
|
||||
// Trample
|
||||
this.addAbility(TrampleAbility.getInstance());
|
||||
|
||||
// Whenever Aang and La attack, put a +1/+1 counter on each tapped creature you control.
|
||||
this.addAbility(new AttacksTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter)).setTriggerPhrase("Whenever {this} attack, "));
|
||||
}
|
||||
|
||||
private AangAndLaOceansFury(final AangAndLaOceansFury card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangAndLaOceansFury copy() {
|
||||
return new AangAndLaOceansFury(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,60 +1,81 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.LeavesBattlefieldAllTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility;
|
||||
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
|
||||
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.effects.keyword.EarthbendTargetEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.keyword.VigilanceAbility;
|
||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
||||
import mage.target.common.TargetControlledLandPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangAtTheCrossroads extends CardImpl {
|
||||
public final class AangAtTheCrossroads extends TransformingDoubleFacedCard {
|
||||
|
||||
private static final FilterCard filter = new FilterCreatureCard("creature card with mana value 4 or less");
|
||||
private static final FilterPermanent saviorFilter = new FilterPermanent("land creatures");
|
||||
|
||||
static {
|
||||
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 5));
|
||||
saviorFilter.add(CardType.LAND.getPredicate());
|
||||
saviorFilter.add(CardType.CREATURE.getPredicate());
|
||||
}
|
||||
|
||||
public AangAtTheCrossroads(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{W}{U}");
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.AVATAR, SubType.ALLY}, "{2}{G}{W}{U}",
|
||||
"Aang, Destined Savior",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.AVATAR, SubType.ALLY}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.AVATAR);
|
||||
this.subtype.add(SubType.ALLY);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
this.secondSideCardClazz = mage.cards.a.AangDestinedSavior.class;
|
||||
this.getLeftHalfCard().setPT(3, 3);
|
||||
this.getRightHalfCard().setPT(4, 4);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// When Aang enters, look at the top five cards of your library. You may put a creature card with mana value 4 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
|
||||
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
|
||||
5, 1, filter, PutCards.BATTLEFIELD, PutCards.BOTTOM_RANDOM
|
||||
)));
|
||||
|
||||
// When another creature you control leaves the battlefield, transform Aang at the beginning of the next upkeep.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new LeavesBattlefieldAllTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(
|
||||
this.getLeftHalfCard().addAbility(new LeavesBattlefieldAllTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(
|
||||
new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new TransformSourceEffect())
|
||||
).setText("transform {this} at the beginning of the next upkeep"), StaticFilters.FILTER_ANOTHER_CREATURE_YOU_CONTROL)
|
||||
.setTriggerPhrase("When another creature you control leaves the battlefield, "));
|
||||
|
||||
// Aang, Destined Savior
|
||||
|
||||
// Flying
|
||||
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Land creatures you control have vigilance.
|
||||
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||
VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, saviorFilter
|
||||
)));
|
||||
|
||||
// At the beginning of combat on your turn, earthbend 2.
|
||||
Ability ability = new BeginningOfCombatTriggeredAbility(new EarthbendTargetEffect(2));
|
||||
ability.addTarget(new TargetControlledLandPermanent());
|
||||
this.getRightHalfCard().addAbility(ability);
|
||||
}
|
||||
|
||||
private AangAtTheCrossroads(final AangAtTheCrossroads card) {
|
||||
|
|
|
|||
|
|
@ -1,66 +0,0 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.effects.keyword.EarthbendTargetEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.VigilanceAbility;
|
||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||
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.FilterPermanent;
|
||||
import mage.target.common.TargetControlledLandPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangDestinedSavior extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("land creatures");
|
||||
|
||||
static {
|
||||
filter.add(CardType.LAND.getPredicate());
|
||||
filter.add(CardType.CREATURE.getPredicate());
|
||||
}
|
||||
|
||||
public AangDestinedSavior(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.AVATAR);
|
||||
this.subtype.add(SubType.ALLY);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
this.nightCard = true;
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Land creatures you control have vigilance.
|
||||
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||
VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, filter
|
||||
)));
|
||||
|
||||
// At the beginning of combat on your turn, earthbend 2.
|
||||
Ability ability = new BeginningOfCombatTriggeredAbility(new EarthbendTargetEffect(2));
|
||||
ability.addTarget(new TargetControlledLandPermanent());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private AangDestinedSavior(final AangDestinedSavior card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangDestinedSavior copy() {
|
||||
return new AangDestinedSavior(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,112 +0,0 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.costs.Cost;
|
||||
import mage.abilities.costs.CostImpl;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.dynamicvalue.common.StaticValue;
|
||||
import mage.abilities.effects.common.DamagePlayersEffect;
|
||||
import mage.abilities.effects.common.DoIfCostPaid;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.constants.TargetController;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.game.Game;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangMasterOfElements extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("spells");
|
||||
|
||||
public AangMasterOfElements(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.AVATAR);
|
||||
this.subtype.add(SubType.ALLY);
|
||||
this.power = new MageInt(6);
|
||||
this.toughness = new MageInt(6);
|
||||
this.nightCard = true;
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Spells you cast cost {W}{U}{B}{R}{G} less to cast.
|
||||
this.addAbility(new SimpleStaticAbility(new SpellsCostReductionControllerEffect(
|
||||
filter, new ManaCostsImpl<>("{W}{U}{B}{R}{G}"), StaticValue.get(1), true
|
||||
)));
|
||||
|
||||
// At the beginning of each upkeep, you may transform Aang, Master of Elements. If you do, you gain 4 life, draw four cards, put four +1/+1 counters on him, and he deals 4 damage to each opponent.
|
||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
|
||||
TargetController.ANY,
|
||||
new DoIfCostPaid(new GainLifeEffect(4), new AangMasterOfElementsCost())
|
||||
.addEffect(new DrawCardSourceControllerEffect(4).concatBy(","))
|
||||
.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance(4))
|
||||
.setText(", put four +1/+1 counters on him"))
|
||||
.addEffect(new DamagePlayersEffect(4, TargetController.OPPONENT)
|
||||
.setText(", and he deals 4 damage to each opponent")),
|
||||
false
|
||||
));
|
||||
}
|
||||
|
||||
private AangMasterOfElements(final AangMasterOfElements card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangMasterOfElements copy() {
|
||||
return new AangMasterOfElements(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AangMasterOfElementsCost extends CostImpl {
|
||||
|
||||
AangMasterOfElementsCost() {
|
||||
super();
|
||||
text = "transform {this}";
|
||||
}
|
||||
|
||||
private AangMasterOfElementsCost(final AangMasterOfElementsCost cost) {
|
||||
super(cost);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangMasterOfElementsCost copy() {
|
||||
return new AangMasterOfElementsCost(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) {
|
||||
return Optional
|
||||
.ofNullable(source.getSourcePermanentIfItStillExists(game))
|
||||
.filter(Card::isTransformable)
|
||||
.isPresent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) {
|
||||
paid = Optional
|
||||
.ofNullable(source.getSourcePermanentIfItStillExists(game))
|
||||
.filter(permanent -> permanent.transform(source, game))
|
||||
.isPresent();
|
||||
return paid;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,22 +1,28 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.common.WaterbendCost;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.abilities.effects.keyword.AirbendTargetEffect;
|
||||
import mage.abilities.keyword.FlashAbility;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.keyword.ReachAbility;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
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 mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.common.FilterSpellOrPermanent;
|
||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||
import mage.filter.predicate.permanent.TappedPredicate;
|
||||
import mage.target.common.TargetSpellOrPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
|
@ -24,40 +30,52 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangSwiftSavior extends CardImpl {
|
||||
public final class AangSwiftSavior extends TransformingDoubleFacedCard {
|
||||
|
||||
private static final FilterSpellOrPermanent filter = new FilterSpellOrPermanent("other target creature or spell");
|
||||
private static final FilterPermanent laFilter = new FilterControlledCreaturePermanent("tapped creature you control");
|
||||
|
||||
static {
|
||||
}
|
||||
static {
|
||||
filter.getPermanentFilter().add(CardType.CREATURE.getPredicate());
|
||||
filter.getPermanentFilter().add(AnotherPredicate.instance);
|
||||
laFilter.add(TappedPredicate.TAPPED);
|
||||
}
|
||||
|
||||
public AangSwiftSavior(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{U}");
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.AVATAR, SubType.ALLY}, "{1}{W}{U}",
|
||||
"Aang and La, Ocean's Fury",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.AVATAR, SubType.SPIRIT, SubType.ALLY}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.AVATAR);
|
||||
this.subtype.add(SubType.ALLY);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(3);
|
||||
this.secondSideCardClazz = mage.cards.a.AangAndLaOceansFury.class;
|
||||
this.getLeftHalfCard().setPT(2, 3);
|
||||
this.getRightHalfCard().setPT(5, 5);
|
||||
|
||||
// Flash
|
||||
this.addAbility(FlashAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(FlashAbility.getInstance());
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// When Aang enters, airbend up to one other target creature or spell.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new AirbendTargetEffect());
|
||||
ability.addTarget(new TargetSpellOrPermanent(0, 1, filter, false));
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// Waterbend {8}: Transform Aang.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new WaterbendCost(8)));
|
||||
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new WaterbendCost(8)));
|
||||
|
||||
// Aang and La, Ocean's Fury
|
||||
|
||||
// Reach
|
||||
this.getRightHalfCard().addAbility(ReachAbility.getInstance());
|
||||
|
||||
// Trample
|
||||
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
|
||||
|
||||
// Whenever Aang and La attack, put a +1/+1 counter on each tapped creature you control.
|
||||
this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), laFilter)).setTriggerPhrase("Whenever {this} attack, "));
|
||||
}
|
||||
|
||||
private AangSwiftSavior(final AangSwiftSavior card) {
|
||||
|
|
|
|||
|
|
@ -1,16 +1,16 @@
|
|||
|
||||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
|
||||
|
|
@ -19,23 +19,26 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author fireshoes
|
||||
*/
|
||||
public final class AberrantResearcher extends CardImpl {
|
||||
public final class AberrantResearcher extends TransformingDoubleFacedCard {
|
||||
|
||||
public AberrantResearcher(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.INSECT);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(2);
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.INSECT}, "{3}{U}",
|
||||
"Perfected Form",
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.INSECT, SubType.HORROR}, "U");
|
||||
|
||||
this.secondSideCardClazz = mage.cards.p.PerfectedForm.class;
|
||||
this.getLeftHalfCard().setPT(3, 2);
|
||||
this.getRightHalfCard().setPT(5, 4);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// At the beginning of your upkeep, put the top card of your library into your graveyard. If it's an instant or sorcery card, transform Aberrant Researcher.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AberrantResearcherEffect()));
|
||||
this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new AberrantResearcherEffect()));
|
||||
|
||||
// Perfected Form
|
||||
// Flying
|
||||
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
}
|
||||
|
||||
private AberrantResearcher(final AberrantResearcher card) {
|
||||
|
|
|
|||
|
|
@ -1,49 +1,76 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.SpellAbility;
|
||||
import mage.abilities.common.DiesSourceTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.AttachEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.LoseLifeTargetEffect;
|
||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||
import mage.abilities.effects.common.cost.SpellsCostModificationThatTargetSourceEffect;
|
||||
import mage.abilities.keyword.EnchantAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.DoubleFacedCardHalf;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.stack.Spell;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPlayer;
|
||||
import mage.target.common.TargetOpponent;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author halljared
|
||||
*/
|
||||
public final class AccursedWitch extends CardImpl {
|
||||
public final class AccursedWitch extends TransformingDoubleFacedCard {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("spells");
|
||||
|
||||
public AccursedWitch(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.SHAMAN);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
this.secondSideCardClazz = mage.cards.i.InfectiousCurse.class;
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.SHAMAN}, "{3}{B}",
|
||||
"Infectious Curse",
|
||||
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.AURA, SubType.CURSE}, "B");
|
||||
this.getLeftHalfCard().setPT(4, 2);
|
||||
|
||||
// Spells your opponents cast that target Accursed Witch cost {1} less to cast.
|
||||
this.addAbility(new SimpleStaticAbility(
|
||||
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(
|
||||
new SpellsCostModificationThatTargetSourceEffect(-1, filter, TargetController.OPPONENT))
|
||||
);
|
||||
|
||||
// When Accursed Witch dies, return it to the battlefield transformed under your control attached to target opponent.
|
||||
this.addAbility(new TransformAbility());
|
||||
Ability ability = new DiesSourceTriggeredAbility(new AccursedWitchReturnTransformedEffect());
|
||||
ability.addTarget(new TargetOpponent());
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// Infectious Curse
|
||||
// Enchant player
|
||||
TargetPlayer auraTarget = new TargetPlayer();
|
||||
this.getRightHalfCard().getSpellAbility().addTarget(auraTarget);
|
||||
this.getRightHalfCard().getSpellAbility().addEffect(new AttachEffect(Outcome.Damage));
|
||||
this.getRightHalfCard().addAbility(new EnchantAbility(auraTarget));
|
||||
|
||||
// Spells you cast that target enchanted player cost {1} less to cast.
|
||||
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new InfectiousCurseCostReductionEffect()));
|
||||
|
||||
// At the beginning of enchanted player's upkeep, that player loses 1 life and you gain 1 life.
|
||||
Ability upkeepAbility = new BeginningOfUpkeepTriggeredAbility(
|
||||
TargetController.ENCHANTED, new LoseLifeTargetEffect(1).setText("that player loses 1 life"),
|
||||
false
|
||||
);
|
||||
upkeepAbility.addEffect(new GainLifeEffect(1).concatBy("and"));
|
||||
this.getRightHalfCard().addAbility(upkeepAbility);
|
||||
}
|
||||
|
||||
private AccursedWitch(final AccursedWitch card) {
|
||||
|
|
@ -80,16 +107,67 @@ class AccursedWitchReturnTransformedEffect extends OneShotEffect {
|
|||
return false;
|
||||
}
|
||||
|
||||
Card card = game.getCard(source.getSourceId());
|
||||
DoubleFacedCardHalf card = (DoubleFacedCardHalf) game.getCard(source.getSourceId());
|
||||
if (card == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
game.getState().setValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + source.getSourceId(), Boolean.TRUE);
|
||||
game.getState().setValue("attachTo:" + source.getSourceId(), attachTo.getId());
|
||||
game.getState().setValue("attachTo:" + card.getOtherSide().getId(), attachTo.getId());
|
||||
if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) {
|
||||
attachTo.addAttachment(card.getId(), source, game);
|
||||
attachTo.addAttachment(card.getOtherSide().getId(), source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
class InfectiousCurseCostReductionEffect extends CostModificationEffectImpl {
|
||||
|
||||
InfectiousCurseCostReductionEffect() {
|
||||
super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST);
|
||||
this.staticText = "Spells you cast that target enchanted player cost {1} less to cast";
|
||||
}
|
||||
|
||||
private InfectiousCurseCostReductionEffect(InfectiousCurseCostReductionEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source, Ability abilityToModify) {
|
||||
CardUtil.reduceCost(abilityToModify, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||
if (!(abilityToModify instanceof SpellAbility)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!source.isControlledBy(abilityToModify.getControllerId())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Permanent enchantment = game.getPermanent(source.getSourceId());
|
||||
if (enchantment == null || enchantment.getAttachedTo() == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId());
|
||||
Set<UUID> allTargets;
|
||||
if (spell != null) {
|
||||
// real cast
|
||||
allTargets = CardUtil.getAllSelectedTargets(abilityToModify, game);
|
||||
} else {
|
||||
// playable
|
||||
allTargets = CardUtil.getAllPossibleTargets(abilityToModify, game);
|
||||
}
|
||||
|
||||
// try to reduce all the time (if it possible to target)
|
||||
return allTargets.stream().anyMatch(target -> Objects.equals(target, enchantment.getAttachedTo()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public InfectiousCurseCostReductionEffect copy() {
|
||||
return new InfectiousCurseCostReductionEffect(this);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,16 +1,23 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.common.ActivateIfConditionActivatedAbility;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.common.DiesSourceTriggeredAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.CardsInHandCondition;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.hint.ConditionHint;
|
||||
import mage.abilities.hint.Hint;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.LifelinkAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.abilities.mana.BlackManaAbility;
|
||||
import mage.cards.*;
|
||||
import mage.constants.*;
|
||||
import mage.filter.StaticFilters;
|
||||
|
|
@ -28,33 +35,43 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author Susucr
|
||||
*/
|
||||
public final class AclazotzDeepestBetrayal extends CardImpl {
|
||||
public final class AclazotzDeepestBetrayal extends TransformingDoubleFacedCard {
|
||||
private static final Condition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 2, TargetController.ANY);
|
||||
private static final Hint hint = new ConditionHint(condition);
|
||||
|
||||
public AclazotzDeepestBetrayal(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
|
||||
this.secondSideCardClazz = mage.cards.t.TempleOfTheDead.class;
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.BAT, SubType.GOD}, "{3}{B}{B}",
|
||||
"Temple of the Dead",
|
||||
new SuperType[]{}, new CardType[]{CardType.LAND}, new SubType[]{}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.BAT);
|
||||
this.subtype.add(SubType.GOD);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
this.getLeftHalfCard().setPT(4, 4);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Lifelink
|
||||
this.addAbility(LifelinkAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(LifelinkAbility.getInstance());
|
||||
|
||||
// Whenever Aclazotz attacks, each opponent discards a card. For each opponent who can't, you draw a card.
|
||||
this.addAbility(new AttacksTriggeredAbility(new AclazotzDeepestBetrayalEffect()));
|
||||
this.getLeftHalfCard().addAbility(new AttacksTriggeredAbility(new AclazotzDeepestBetrayalEffect()));
|
||||
|
||||
// Whenever an opponent discards a land card, create a 1/1 black Bat creature token with flying.
|
||||
this.addAbility(new AclazotzDeepestBetrayalTriggeredAbility());
|
||||
this.getLeftHalfCard().addAbility(new AclazotzDeepestBetrayalTriggeredAbility());
|
||||
|
||||
// When Aclazotz dies, return it to the battlefield tapped and transformed under its owner's control.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new DiesSourceTriggeredAbility(new AclazotzDeepestBetrayalTransformEffect()));
|
||||
this.getLeftHalfCard().addAbility(new DiesSourceTriggeredAbility(new AclazotzDeepestBetrayalTransformEffect()));
|
||||
|
||||
// Temple of the Dead
|
||||
// {T}: Add {B}.
|
||||
this.getRightHalfCard().addAbility(new BlackManaAbility());
|
||||
|
||||
// {2}{B}, {T}: Transform Temple of the Dead. Activate only if a player has one or fewer cards in hand and only as a sorcery.
|
||||
Ability ability = new ActivateIfConditionActivatedAbility(
|
||||
new TransformSourceEffect(), new ManaCostsImpl<>("{2}{B}"), condition
|
||||
).setTiming(TimingRule.SORCERY);
|
||||
ability.addCost(new TapSourceCost());
|
||||
this.getRightHalfCard().addAbility(ability.addHint(hint));
|
||||
}
|
||||
|
||||
private AclazotzDeepestBetrayal(final AclazotzDeepestBetrayal card) {
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.DeathtouchAbility;
|
||||
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;
|
||||
|
||||
|
|
@ -16,23 +16,28 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AetherbladeAgent extends CardImpl {
|
||||
public final class AetherbladeAgent extends TransformingDoubleFacedCard {
|
||||
|
||||
public AetherbladeAgent(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.ROGUE);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(1);
|
||||
this.secondSideCardClazz = mage.cards.g.GitaxianMindstinger.class;
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.ROGUE}, "{1}{B}",
|
||||
"Gitaxian Mindstinger",
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.ROGUE}, "UB");
|
||||
this.getLeftHalfCard().setPT(1, 1);
|
||||
this.getRightHalfCard().setPT(3, 3);
|
||||
|
||||
// Deathtouch
|
||||
this.addAbility(DeathtouchAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(DeathtouchAbility.getInstance());
|
||||
|
||||
// {4}{U/P}: Transform Aetherblade Agent. Activate only as a sorcery.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{U/P}")));
|
||||
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{U/P}")));
|
||||
|
||||
// Gitaxian Mindstinger
|
||||
// Deathtouch
|
||||
this.getRightHalfCard().addAbility(DeathtouchAbility.getInstance());
|
||||
|
||||
// Whenever Gitaxian Mindstinger deals combat damage to a player or battle, draw a card.
|
||||
this.getRightHalfCard().addAbility(new DealsCombatDamageToAPlayerOrBattleTriggeredAbility(new DrawCardSourceControllerEffect(1),false));
|
||||
}
|
||||
|
||||
private AetherbladeAgent(final AetherbladeAgent card) {
|
||||
|
|
|
|||
|
|
@ -1,33 +1,49 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
|
||||
import mage.abilities.common.WerewolfBackTriggeredAbility;
|
||||
import mage.abilities.common.WerewolfFrontTriggeredAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Controllable;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.target.common.TargetArtifactPermanent;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author BetaSteward
|
||||
*/
|
||||
public final class AfflictedDeserter extends CardImpl {
|
||||
public final class AfflictedDeserter extends TransformingDoubleFacedCard {
|
||||
|
||||
public AfflictedDeserter(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WEREWOLF);
|
||||
|
||||
this.secondSideCardClazz = mage.cards.w.WerewolfRansacker.class;
|
||||
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(2);
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{3}{R}",
|
||||
"Werewolf Ransacker",
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R");
|
||||
this.getLeftHalfCard().setPT(3, 2);
|
||||
this.getRightHalfCard().setPT(5, 4);
|
||||
|
||||
// At the beginning of each upkeep, if no spells were cast last turn, transform Afflicted Deserter.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new WerewolfFrontTriggeredAbility());
|
||||
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
|
||||
|
||||
// Werewolf Ransacker
|
||||
// Whenever this creature transforms into Werewolf Ransacker, you may destroy target artifact. If that artifact is put into a graveyard this way, Werewolf Ransacker deals 3 damage to that artifact's controller.
|
||||
Ability ability = new TransformIntoSourceTriggeredAbility(new WerewolfRansackerEffect(), true, true);
|
||||
ability.addTarget(new TargetArtifactPermanent());
|
||||
this.getRightHalfCard().addAbility(ability);
|
||||
|
||||
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Werewolf Ransacker.
|
||||
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
|
||||
|
||||
}
|
||||
|
||||
private AfflictedDeserter(final AfflictedDeserter card) {
|
||||
|
|
@ -39,3 +55,39 @@ public final class AfflictedDeserter extends CardImpl {
|
|||
return new AfflictedDeserter(this);
|
||||
}
|
||||
}
|
||||
|
||||
class WerewolfRansackerEffect extends OneShotEffect {
|
||||
|
||||
WerewolfRansackerEffect() {
|
||||
super(Outcome.DestroyPermanent);
|
||||
staticText = "destroy target artifact. If that artifact is put into a graveyard this way, " +
|
||||
"{this} deals 3 damage to that artifact's controller";
|
||||
}
|
||||
|
||||
private WerewolfRansackerEffect(final WerewolfRansackerEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WerewolfRansackerEffect copy() {
|
||||
return new WerewolfRansackerEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
|
||||
if (permanent == null) {
|
||||
return false;
|
||||
}
|
||||
permanent.destroy(source, game);
|
||||
if (game.getState().getZone(permanent.getId()) != Zone.GRAVEYARD) {
|
||||
return true;
|
||||
}
|
||||
Optional.of(permanent)
|
||||
.map(Controllable::getControllerId)
|
||||
.map(game::getPlayer)
|
||||
.ifPresent(player -> player.damage(3, source, game));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,190 +0,0 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.ObjectColor;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.LoyaltyAbility;
|
||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||
import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.common.FilterNonlandPermanent;
|
||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.CatWarrior21Token;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetAnyTarget;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author Susucr
|
||||
*/
|
||||
public final class AjaniNacatlAvenger extends CardImpl {
|
||||
|
||||
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(SubType.CAT, "Cat you control");
|
||||
|
||||
public AjaniNacatlAvenger(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.AJANI);
|
||||
this.setStartingLoyalty(3);
|
||||
|
||||
this.color.setRed(true);
|
||||
this.color.setWhite(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// +2: Put a +1/+1 counter on each Cat you control.
|
||||
this.addAbility(new LoyaltyAbility(
|
||||
new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter), 2
|
||||
));
|
||||
|
||||
// 0: Create a 2/1 white Car Warrior creature token. When you do, if you control a red permanent other than Ajani, Nacatl Avenger, he deals damage equal to the number of creatures you control to any target.
|
||||
this.addAbility(new LoyaltyAbility(new AjaniNacatlAvengerZeroEffect(), 0));
|
||||
|
||||
// -4: Each opponent chooses an artifact, a creature, an enchantment and a planeswalker from among the nonland permanents they control, then sacrifices the rest.
|
||||
this.addAbility(new LoyaltyAbility(new AjaniNacatlAvengerMinusFourEffect(), -4));
|
||||
}
|
||||
|
||||
private AjaniNacatlAvenger(final AjaniNacatlAvenger card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaniNacatlAvenger copy() {
|
||||
return new AjaniNacatlAvenger(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AjaniNacatlAvengerZeroEffect extends OneShotEffect {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("red permanent other than {this}");
|
||||
|
||||
static {
|
||||
filter.add(new ColorPredicate(ObjectColor.RED));
|
||||
filter.add(AnotherPredicate.instance);
|
||||
}
|
||||
|
||||
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, true);
|
||||
|
||||
AjaniNacatlAvengerZeroEffect() {
|
||||
super(Outcome.PutCreatureInPlay);
|
||||
staticText = "Create a 2/1 white Cat Warrior creature token. "
|
||||
+ "When you do, if you control a red permanent other than {this}, "
|
||||
+ "he deals damage equal to the number of creatures you control to any target.";
|
||||
}
|
||||
|
||||
private AjaniNacatlAvengerZeroEffect(final AjaniNacatlAvengerZeroEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaniNacatlAvengerZeroEffect copy() {
|
||||
return new AjaniNacatlAvengerZeroEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
if (!new CreateTokenEffect(new CatWarrior21Token()).apply(game, source)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ReflexiveTriggeredAbility reflexive = new ReflexiveTriggeredAbility(
|
||||
new DamageTargetEffect(CreaturesYouControlCount.PLURAL),
|
||||
false,
|
||||
"When you do, if you control a red permanent other than {this}, "
|
||||
+ "he deals damage equal to the number of creatures you control to any target.",
|
||||
condition
|
||||
);
|
||||
reflexive.addTarget(new TargetAnyTarget());
|
||||
game.fireReflexiveTriggeredAbility(reflexive, source);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Inspired by Mythos of Snapdax
|
||||
class AjaniNacatlAvengerMinusFourEffect extends OneShotEffect {
|
||||
|
||||
private static final List<CardType> cardTypes = Arrays.asList(
|
||||
CardType.ARTIFACT,
|
||||
CardType.CREATURE,
|
||||
CardType.ENCHANTMENT,
|
||||
CardType.PLANESWALKER
|
||||
);
|
||||
|
||||
AjaniNacatlAvengerMinusFourEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "Each opponent chooses an artifact, a creature, an enchantment and a planeswalker "
|
||||
+ "from among the nonland permanents they control, then sacrifices the rest.";
|
||||
}
|
||||
|
||||
private AjaniNacatlAvengerMinusFourEffect(final AjaniNacatlAvengerMinusFourEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaniNacatlAvengerMinusFourEffect copy() {
|
||||
return new AjaniNacatlAvengerMinusFourEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (controller == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<Player> playerList = game
|
||||
.getOpponents(controller.getId())
|
||||
.stream()
|
||||
.map(game::getPlayer)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
Set<UUID> toKeep = new HashSet<>();
|
||||
for (Player player : playerList) {
|
||||
for (CardType cardType : cardTypes) {
|
||||
String message = CardUtil.addArticle(cardType.toString());
|
||||
FilterPermanent filter = new FilterNonlandPermanent(message);
|
||||
filter.add(cardType.getPredicate());
|
||||
filter.add(new ControllerIdPredicate(player.getId()));
|
||||
if (game.getBattlefield().count(filter, source.getControllerId(), source, game) == 0) {
|
||||
continue;
|
||||
}
|
||||
TargetPermanent target = new TargetPermanent(filter);
|
||||
target.withNotTarget(true);
|
||||
player.choose(outcome, target, source, game);
|
||||
toKeep.add(target.getFirstTarget());
|
||||
}
|
||||
}
|
||||
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_NON_LAND, source.getControllerId(), game)) {
|
||||
if (permanent == null || toKeep.contains(permanent.getId()) || !controller.hasOpponent(permanent.getControllerId(), game)) {
|
||||
continue;
|
||||
}
|
||||
permanent.sacrifice(source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,27 +1,49 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.constants.Pronoun;
|
||||
import mage.ObjectColor;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.LoyaltyAbility;
|
||||
import mage.abilities.common.DiesOneOrMoreTriggeredAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||
import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.*;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.common.FilterNonlandPermanent;
|
||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.CatWarrior21Token;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetAnyTarget;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author Susucr
|
||||
*/
|
||||
public final class AjaniNacatlPariah extends CardImpl {
|
||||
public final class AjaniNacatlPariah extends TransformingDoubleFacedCard {
|
||||
|
||||
public static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.CAT, "other Cats you control");
|
||||
private static final FilterControlledCreaturePermanent nacatlAvengerFilter = new FilterControlledCreaturePermanent(SubType.CAT, "Cat you control");
|
||||
|
||||
static {
|
||||
filter.add(AnotherPredicate.instance);
|
||||
|
|
@ -29,25 +51,34 @@ public final class AjaniNacatlPariah extends CardImpl {
|
|||
}
|
||||
|
||||
public AjaniNacatlPariah(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.CAT, SubType.WARRIOR}, "{1}{W}",
|
||||
"Ajani, Nacatl Avenger",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.AJANI}, "RW");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.CAT);
|
||||
this.subtype.add(SubType.WARRIOR);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
this.secondSideCardClazz = mage.cards.a.AjaniNacatlAvenger.class;
|
||||
this.getLeftHalfCard().setPT(1, 2);
|
||||
this.getRightHalfCard().setStartingLoyalty(3);
|
||||
|
||||
// When Ajani, Nacatl Pariah enters the battlefield, create a 2/1 white Cat Warrior creature token.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new CatWarrior21Token())));
|
||||
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new CatWarrior21Token())));
|
||||
|
||||
// Whenever one or more other Cats you control die, you may exile Ajani, then return him to the battlefield transformed under his owner's control.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new DiesOneOrMoreTriggeredAbility(
|
||||
this.getLeftHalfCard().addAbility(new DiesOneOrMoreTriggeredAbility(
|
||||
new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED, Pronoun.HE),
|
||||
filter,
|
||||
true));
|
||||
|
||||
// Ajani, Nacatl Avenger
|
||||
// +2: Put a +1/+1 counter on each Cat you control.
|
||||
this.getRightHalfCard().addAbility(new LoyaltyAbility(
|
||||
new AddCountersAllEffect(CounterType.P1P1.createInstance(), nacatlAvengerFilter), 2
|
||||
));
|
||||
|
||||
// 0: Create a 2/1 white Car Warrior creature token. When you do, if you control a red permanent other than Ajani, Nacatl Avenger, he deals damage equal to the number of creatures you control to any target.
|
||||
this.getRightHalfCard().addAbility(new LoyaltyAbility(new AjaniNacatlAvengerZeroEffect(), 0));
|
||||
|
||||
// -4: Each opponent chooses an artifact, a creature, an enchantment and a planeswalker from among the nonland permanents they control, then sacrifices the rest.
|
||||
this.getRightHalfCard().addAbility(new LoyaltyAbility(new AjaniNacatlAvengerMinusFourEffect(), -4));
|
||||
}
|
||||
|
||||
private AjaniNacatlPariah(final AjaniNacatlPariah card) {
|
||||
|
|
@ -59,3 +90,116 @@ public final class AjaniNacatlPariah extends CardImpl {
|
|||
return new AjaniNacatlPariah(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AjaniNacatlAvengerZeroEffect extends OneShotEffect {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("red permanent other than {this}");
|
||||
|
||||
static {
|
||||
filter.add(new ColorPredicate(ObjectColor.RED));
|
||||
filter.add(AnotherPredicate.instance);
|
||||
}
|
||||
|
||||
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, true);
|
||||
|
||||
AjaniNacatlAvengerZeroEffect() {
|
||||
super(Outcome.PutCreatureInPlay);
|
||||
staticText = "Create a 2/1 white Cat Warrior creature token. "
|
||||
+ "When you do, if you control a red permanent other than {this}, "
|
||||
+ "he deals damage equal to the number of creatures you control to any target.";
|
||||
}
|
||||
|
||||
private AjaniNacatlAvengerZeroEffect(final AjaniNacatlAvengerZeroEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaniNacatlAvengerZeroEffect copy() {
|
||||
return new AjaniNacatlAvengerZeroEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
if (!new CreateTokenEffect(new CatWarrior21Token()).apply(game, source)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ReflexiveTriggeredAbility reflexive = new ReflexiveTriggeredAbility(
|
||||
new DamageTargetEffect(CreaturesYouControlCount.PLURAL),
|
||||
false,
|
||||
"When you do, if you control a red permanent other than {this}, "
|
||||
+ "he deals damage equal to the number of creatures you control to any target.",
|
||||
condition
|
||||
);
|
||||
reflexive.addTarget(new TargetAnyTarget());
|
||||
game.fireReflexiveTriggeredAbility(reflexive, source);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Inspired by Mythos of Snapdax
|
||||
class AjaniNacatlAvengerMinusFourEffect extends OneShotEffect {
|
||||
|
||||
private static final List<CardType> cardTypes = Arrays.asList(
|
||||
CardType.ARTIFACT,
|
||||
CardType.CREATURE,
|
||||
CardType.ENCHANTMENT,
|
||||
CardType.PLANESWALKER
|
||||
);
|
||||
|
||||
AjaniNacatlAvengerMinusFourEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "Each opponent chooses an artifact, a creature, an enchantment and a planeswalker "
|
||||
+ "from among the nonland permanents they control, then sacrifices the rest.";
|
||||
}
|
||||
|
||||
private AjaniNacatlAvengerMinusFourEffect(final AjaniNacatlAvengerMinusFourEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaniNacatlAvengerMinusFourEffect copy() {
|
||||
return new AjaniNacatlAvengerMinusFourEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (controller == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<Player> playerList = game
|
||||
.getOpponents(controller.getId())
|
||||
.stream()
|
||||
.map(game::getPlayer)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
Set<UUID> toKeep = new HashSet<>();
|
||||
for (Player player : playerList) {
|
||||
for (CardType cardType : cardTypes) {
|
||||
String message = CardUtil.addArticle(cardType.toString());
|
||||
FilterPermanent filter = new FilterNonlandPermanent(message);
|
||||
filter.add(cardType.getPredicate());
|
||||
filter.add(new ControllerIdPredicate(player.getId()));
|
||||
if (game.getBattlefield().count(filter, source.getControllerId(), source, game) == 0) {
|
||||
continue;
|
||||
}
|
||||
TargetPermanent target = new TargetPermanent(filter);
|
||||
target.withNotTarget(true);
|
||||
player.choose(outcome, target, source, game);
|
||||
toKeep.add(target.getFirstTarget());
|
||||
}
|
||||
}
|
||||
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_NON_LAND, source.getControllerId(), game)) {
|
||||
if (permanent == null || toKeep.contains(permanent.getId()) || !controller.hasOpponent(permanent.getControllerId(), game)) {
|
||||
continue;
|
||||
}
|
||||
permanent.sacrifice(source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,35 +1,60 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.Mana;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
|
||||
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.BoostSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||
import mage.abilities.effects.mana.UntilEndOfTurnManaEffect;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AlluringSuitor extends CardImpl {
|
||||
public final class AlluringSuitor extends TransformingDoubleFacedCard {
|
||||
|
||||
public AlluringSuitor(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
|
||||
|
||||
this.subtype.add(SubType.VAMPIRE);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(3);
|
||||
this.secondSideCardClazz = mage.cards.d.DeadlyDancer.class;
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE}, "{2}{R}",
|
||||
"Deadly Dancer",
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE}, "R");
|
||||
this.getLeftHalfCard().setPT(2, 3);
|
||||
this.getRightHalfCard().setPT(3, 3);
|
||||
|
||||
// When you attack with exactly two creatures, transform Alluring Suitor.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new AlluringSuitorTriggeredAbility());
|
||||
this.getLeftHalfCard().addAbility(new AlluringSuitorTriggeredAbility());
|
||||
|
||||
// Deadly Dancer
|
||||
// Trample
|
||||
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
|
||||
|
||||
// When this creature transforms into Deadly Dancer, add {R}{R}. Until end of turn, you don't lose this mana as steps and phases end.
|
||||
this.getRightHalfCard().addAbility(new TransformIntoSourceTriggeredAbility(new UntilEndOfTurnManaEffect(Mana.RedMana(2))));
|
||||
|
||||
// {R}{R}: Deadly Dancer and another target creature each get +1/+0 until end of turn.
|
||||
Ability ability = new SimpleActivatedAbility(new BoostSourceEffect(
|
||||
1, 0, Duration.EndOfTurn
|
||||
).setText("{this}"), new ManaCostsImpl<>("{R}{R}"));
|
||||
ability.addEffect(new BoostTargetEffect(1, 0)
|
||||
.setText("and another target creature each get +1/+0 until end of turn"));
|
||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE));
|
||||
this.getRightHalfCard().addAbility(ability);
|
||||
}
|
||||
|
||||
private AlluringSuitor(final AlluringSuitor card) {
|
||||
|
|
|
|||
|
|
@ -1,45 +1,63 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.dynamicvalue.DynamicValue;
|
||||
import mage.abilities.effects.ContinuousEffectImpl;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
|
||||
import mage.abilities.keyword.CraftAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
|
||||
import mage.abilities.keyword.*;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Zone;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.*;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.ExileZone;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jeffwadsworth
|
||||
*/
|
||||
public final class AltarOfTheWretched extends CardImpl {
|
||||
public final class AltarOfTheWretched extends TransformingDoubleFacedCard {
|
||||
|
||||
public AltarOfTheWretched(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{B}");
|
||||
this.secondSideCardClazz = mage.cards.w.WretchedBonemass.class;
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{2}{B}",
|
||||
"Wretched Bonemass",
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.SKELETON, SubType.HORROR}, "B");
|
||||
this.getRightHalfCard().setPT(0, 0);
|
||||
|
||||
// When Altar of the Wretched enters the battlefield, you may sacrifice a nontoken creature. If you do, draw X cards, then mill X cards, where X is that creature’s power.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new AltarOfTheWretchedEffect(), true));
|
||||
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new AltarOfTheWretchedEffect(), true));
|
||||
|
||||
// Craft with one or more creatures {2}{B}{B}
|
||||
this.addAbility(new CraftAbility(
|
||||
this.getLeftHalfCard().addAbility(new CraftAbility(
|
||||
"{2}{B}{B}", "one or more creatures", "other creatures you control and/or"
|
||||
+ "creature cards in your graveyard", 1, Integer.MAX_VALUE, CardType.CREATURE.getPredicate()
|
||||
));
|
||||
|
||||
// {2}{B}: Return Altar of the Wretched from your graveyard to your hand.
|
||||
this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl<>("{2}{B}")));
|
||||
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl<>("{2}{B}")));
|
||||
|
||||
// Wretched Bonemass
|
||||
// Wretched Bonemass’s power and toughness are each equal to the total power of the exiled cards used to craft it.
|
||||
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new SetBasePowerToughnessSourceEffect(WretchedBonemassDynamicValue.instance).setText("{this}'s power and toughness are each equal to the total power of the exiled cards used to craft it.")));
|
||||
|
||||
// Wretched Bonemass has flying as long as an exiled card used to craft it has flying. The same is true for first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, protection, reach, trample, and vigilance.
|
||||
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new WretchedBonemassGainAbilityEffect()));
|
||||
}
|
||||
|
||||
private AltarOfTheWretched(final AltarOfTheWretched card) {
|
||||
|
|
@ -84,3 +102,124 @@ class AltarOfTheWretchedEffect extends OneShotEffect {
|
|||
return new AltarOfTheWretchedEffect(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
enum WretchedBonemassDynamicValue implements DynamicValue {
|
||||
instance;
|
||||
|
||||
@Override
|
||||
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||
int totalPower = 0;
|
||||
Permanent permanent = sourceAbility.getSourcePermanentIfItStillExists(game);
|
||||
if (permanent == null) {
|
||||
return 0;
|
||||
}
|
||||
ExileZone exileZone = game
|
||||
.getExile()
|
||||
.getExileZone(CardUtil.getExileZoneId(
|
||||
game, permanent.getId(), permanent.getZoneChangeCounter(game) - 2
|
||||
));
|
||||
if (exileZone == null) {
|
||||
return 0;
|
||||
}
|
||||
for (Card card : exileZone.getCards(game)) {
|
||||
totalPower += card.getPower().getValue();
|
||||
}
|
||||
return totalPower;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WretchedBonemassDynamicValue copy() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage() {
|
||||
return "total power of the exiled cards used to craft it";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "0";
|
||||
}
|
||||
}
|
||||
|
||||
class WretchedBonemassGainAbilityEffect extends ContinuousEffectImpl {
|
||||
|
||||
WretchedBonemassGainAbilityEffect() {
|
||||
super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
|
||||
staticText = "{this} has flying as long as an exiled card used to craft it has flying. The same is true for first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, protection, reach, trample, and vigilance.";
|
||||
}
|
||||
|
||||
private WretchedBonemassGainAbilityEffect(final WretchedBonemassGainAbilityEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WretchedBonemassGainAbilityEffect copy() {
|
||||
return new WretchedBonemassGainAbilityEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent wretchedBonemass = source.getSourcePermanentIfItStillExists(game);
|
||||
if (wretchedBonemass != null) {
|
||||
ExileZone exileZone = game
|
||||
.getExile()
|
||||
.getExileZone(CardUtil.getExileZoneId(
|
||||
game, wretchedBonemass.getId(), wretchedBonemass.getZoneChangeCounter(game) - 2
|
||||
));
|
||||
if (exileZone != null
|
||||
&& !exileZone.isEmpty()) {
|
||||
Set<Card> cardsInExile = exileZone.getCards(game);
|
||||
for (Card card : cardsInExile) {
|
||||
for (Ability a : card.getAbilities()) {
|
||||
if (a instanceof FlyingAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof FirstStrikeAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof DoubleStrikeAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof DeathtouchAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof HasteAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof HexproofAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof IndestructibleAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof LifelinkAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof MenaceAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof ProtectionAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof IndestructibleAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof ReachAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof TrampleAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof VigilanceAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,56 +0,0 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.ActivateIfConditionActivatedAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.condition.common.CovenCondition;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
||||
import mage.abilities.hint.common.CovenHint;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.AbilityWord;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AmbitiousFarmhand extends CardImpl {
|
||||
|
||||
public AmbitiousFarmhand(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.PEASANT);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(1);
|
||||
this.secondSideCardClazz = mage.cards.s.SeasonedCathar.class;
|
||||
|
||||
// When Ambitious Farmhand enters the battlefield, you may search your library for a basic Plains card, reveal it, put it into your hand, then shuffle.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(
|
||||
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_PLAINS), true), true
|
||||
));
|
||||
|
||||
// Coven—{1}{W}{W}: Transform Ambitious Farmhand. Activate only if you control three or more creatures with different powers.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new ActivateIfConditionActivatedAbility(
|
||||
new TransformSourceEffect(), new ManaCostsImpl<>("{1}{W}{W}"), CovenCondition.instance
|
||||
).setAbilityWord(AbilityWord.COVEN).addHint(CovenHint.instance));
|
||||
}
|
||||
|
||||
private AmbitiousFarmhand(final AmbitiousFarmhand card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AmbitiousFarmhand copy() {
|
||||
return new AmbitiousFarmhand(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,18 +1,22 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.MageObjectReference;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||
import mage.abilities.dynamicvalue.common.CountersSourceCount;
|
||||
import mage.abilities.effects.ContinuousEffectImpl;
|
||||
import mage.abilities.effects.ReplacementEffectImpl;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.keyword.LifelinkAbility;
|
||||
import mage.abilities.keyword.MenaceAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.*;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
|
@ -20,38 +24,45 @@ import mage.game.Game;
|
|||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.ZoneChangeEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author Styxo
|
||||
*/
|
||||
public final class AnakinSkywalker extends CardImpl {
|
||||
public final class AnakinSkywalker extends TransformingDoubleFacedCard {
|
||||
|
||||
public AnakinSkywalker(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{B}{R}");
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.SITH);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
this.secondSideCardClazz = mage.cards.d.DarthVader.class;
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.SITH}, "{3}{U}{B}{R}",
|
||||
"Darth Vader",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.SITH}, "B");
|
||||
this.getLeftHalfCard().setPT(4, 4);
|
||||
this.getRightHalfCard().setPT(4, 4);
|
||||
|
||||
// Whenever another creature dies, put a +1/+1 counter on Anakin Skywalker.
|
||||
this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, true));
|
||||
this.getLeftHalfCard().addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, true));
|
||||
|
||||
// Sacrifice another creature: Target creature gets -1/-1 until end of turn. Activate this ability only as a sorcery.
|
||||
Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-1, -1, Duration.EndOfTurn),
|
||||
new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE));
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// If Anakin Skywalker would be destroyed, regenerate, then transform him instead.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new SimpleStaticAbility(new AnakinSkywalkerEffect()));
|
||||
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new AnakinSkywalkerEffect()));
|
||||
|
||||
// Darth Vader
|
||||
// Menace
|
||||
this.getRightHalfCard().addAbility(new MenaceAbility());
|
||||
|
||||
// Lifelink
|
||||
this.getRightHalfCard().addAbility(LifelinkAbility.getInstance());
|
||||
|
||||
// Whenever Darth Vader attacks, creatures defending player controls get -1/-1 until end of turn for each +1/+1 counter on Darth Vader.
|
||||
this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(new UnboostCreaturesDefendingPlayerEffect(), false, null, SetTargetPointer.PLAYER));
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -101,3 +112,47 @@ class AnakinSkywalkerEffect extends ReplacementEffectImpl {
|
|||
return new AnakinSkywalkerEffect(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class UnboostCreaturesDefendingPlayerEffect extends ContinuousEffectImpl {
|
||||
|
||||
UnboostCreaturesDefendingPlayerEffect() {
|
||||
super(Duration.EndOfTurn, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.UnboostCreature);
|
||||
staticText = "creatures defending player controls get -1/-1 until end of turn for each +1/+1 counter on Darth Vader";
|
||||
}
|
||||
|
||||
private UnboostCreaturesDefendingPlayerEffect(final UnboostCreaturesDefendingPlayerEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UnboostCreaturesDefendingPlayerEffect copy() {
|
||||
return new UnboostCreaturesDefendingPlayerEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(Ability source, Game game) {
|
||||
super.init(source, game);
|
||||
if (getAffectedObjectsSet()) {
|
||||
for (Permanent creature : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, getTargetPointer().getFirst(game, source), game)) {
|
||||
affectedObjectList.add(new MageObjectReference(creature, game));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
for (Iterator<MageObjectReference> it = affectedObjectList.iterator(); it.hasNext(); ) {
|
||||
Permanent permanent = it.next().getPermanent(game);
|
||||
if (permanent != null) {
|
||||
int unboostCount = -1 * new CountersSourceCount(CounterType.P1P1).calculate(game, source, this);
|
||||
permanent.addPower(unboostCount);
|
||||
permanent.addToughness(unboostCount);
|
||||
} else {
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,42 +0,0 @@
|
|||
|
||||
package mage.cards.a;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.keyword.HexproofAbility;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public final class AncientOfTheEquinox extends CardImpl {
|
||||
|
||||
public AncientOfTheEquinox(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
|
||||
this.subtype.add(SubType.TREEFOLK);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
this.color.setGreen(true);
|
||||
|
||||
this.nightCard = true;
|
||||
|
||||
// Trample
|
||||
this.addAbility(TrampleAbility.getInstance());
|
||||
// Hexproof
|
||||
this.addAbility(HexproofAbility.getInstance());
|
||||
}
|
||||
|
||||
private AncientOfTheEquinox(final AncientOfTheEquinox card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AncientOfTheEquinox copy() {
|
||||
return new AncientOfTheEquinox(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,112 +0,0 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.dynamicvalue.common.SavedDamageValue;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||
import mage.abilities.keyword.LivingMetalAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.game.Controllable;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.stack.Spell;
|
||||
import mage.target.Target;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class ArceeAcrobaticCoupe extends CardImpl {
|
||||
|
||||
public ArceeAcrobaticCoupe(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(2);
|
||||
this.toughness = new MageInt(2);
|
||||
this.color.setRed(true);
|
||||
this.color.setWhite(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// Living metal
|
||||
this.addAbility(new LivingMetalAbility());
|
||||
|
||||
// Whenever you cast a spell that targets one or more creatures or Vehicles you control, put that many +1/+1 counters on Arcee. Convert Arcee.
|
||||
this.addAbility(new ArceeAcrobaticCoupeTriggeredAbility());
|
||||
}
|
||||
|
||||
private ArceeAcrobaticCoupe(final ArceeAcrobaticCoupe card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArceeAcrobaticCoupe copy() {
|
||||
return new ArceeAcrobaticCoupe(this);
|
||||
}
|
||||
}
|
||||
|
||||
class ArceeAcrobaticCoupeTriggeredAbility extends SpellCastControllerTriggeredAbility {
|
||||
|
||||
ArceeAcrobaticCoupeTriggeredAbility() {
|
||||
super(new AddCountersSourceEffect(
|
||||
CounterType.P1P1.createInstance(0),
|
||||
SavedDamageValue.MANY, false
|
||||
), false);
|
||||
this.addEffect(new TransformSourceEffect());
|
||||
}
|
||||
|
||||
private ArceeAcrobaticCoupeTriggeredAbility(final ArceeAcrobaticCoupeTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArceeAcrobaticCoupeTriggeredAbility copy() {
|
||||
return new ArceeAcrobaticCoupeTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (!super.checkTrigger(event, game)) {
|
||||
return false;
|
||||
}
|
||||
Spell spell = game.getSpell(event.getTargetId());
|
||||
if (spell == null) {
|
||||
return false;
|
||||
}
|
||||
int targets = spell
|
||||
.getStackAbility()
|
||||
.getTargets()
|
||||
.stream()
|
||||
.map(Target::getTargets)
|
||||
.flatMap(Collection::stream)
|
||||
.map(game::getPermanent)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(permanent -> permanent.isCreature(game)
|
||||
|| permanent.hasSubtype(SubType.VEHICLE, game))
|
||||
.map(Controllable::getControllerId)
|
||||
.map(this::isControlledBy)
|
||||
.mapToInt(x -> x ? 1 : 0)
|
||||
.sum();
|
||||
if (targets > 0) {
|
||||
this.getEffects().setValue("damage", targets);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever you cast a spell that targets one or more creatures or Vehicles " +
|
||||
"you control, put that many +1/+1 counters on {this}. Convert {this}.";
|
||||
}
|
||||
}
|
||||
|
|
@ -1,44 +1,54 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.costs.common.RemoveVariableCountersSourceCost;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.dynamicvalue.common.GetXValue;
|
||||
import mage.abilities.dynamicvalue.common.SavedDamageValue;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||
import mage.abilities.keyword.FirstStrikeAbility;
|
||||
import mage.abilities.keyword.LivingMetalAbility;
|
||||
import mage.abilities.keyword.MoreThanMeetsTheEyeAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.game.Controllable;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.stack.Spell;
|
||||
import mage.target.Target;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class ArceeSharpshooter extends CardImpl {
|
||||
public final class ArceeSharpshooter extends TransformingDoubleFacedCard {
|
||||
|
||||
public ArceeSharpshooter(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}{R}{W}");
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.ROBOT}, "{1}{R}{W}",
|
||||
"Arcee, Acrobatic Coupe",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.VEHICLE}, "RW");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.ROBOT);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
this.secondSideCardClazz = mage.cards.a.ArceeAcrobaticCoupe.class;
|
||||
this.getLeftHalfCard().setPT(2, 2);
|
||||
this.getRightHalfCard().setPT(2, 2);
|
||||
|
||||
// More Than Meets the Eye {R}{W}
|
||||
this.addAbility(new MoreThanMeetsTheEyeAbility(this, "{R}{W}"));
|
||||
this.getLeftHalfCard().addAbility(new MoreThanMeetsTheEyeAbility(this, "{R}{W}"));
|
||||
|
||||
// First strike
|
||||
this.addAbility(FirstStrikeAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(FirstStrikeAbility.getInstance());
|
||||
|
||||
// {1}, Remove one or more +1/+1 counters from Arcee: It deals that much damage to target creature. Convert Arcee.
|
||||
Ability ability = new SimpleActivatedAbility(
|
||||
|
|
@ -49,7 +59,14 @@ public final class ArceeSharpshooter extends CardImpl {
|
|||
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.P1P1, 1));
|
||||
ability.addEffect(new TransformSourceEffect().setText("convert {this}"));
|
||||
ability.addTarget(new TargetCreaturePermanent());
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// Arcee, Acrobatic Coupe
|
||||
// Living metal
|
||||
this.getRightHalfCard().addAbility(new LivingMetalAbility());
|
||||
|
||||
// Whenever you cast a spell that targets one or more creatures or Vehicles you control, put that many +1/+1 counters on Arcee. Convert Arcee.
|
||||
this.getRightHalfCard().addAbility(new ArceeAcrobaticCoupeTriggeredAbility());
|
||||
}
|
||||
|
||||
private ArceeSharpshooter(final ArceeSharpshooter card) {
|
||||
|
|
@ -61,3 +78,59 @@ public final class ArceeSharpshooter extends CardImpl {
|
|||
return new ArceeSharpshooter(this);
|
||||
}
|
||||
}
|
||||
|
||||
class ArceeAcrobaticCoupeTriggeredAbility extends SpellCastControllerTriggeredAbility {
|
||||
|
||||
ArceeAcrobaticCoupeTriggeredAbility() {
|
||||
super(new AddCountersSourceEffect(
|
||||
CounterType.P1P1.createInstance(0),
|
||||
SavedDamageValue.MANY, false
|
||||
), false);
|
||||
this.addEffect(new TransformSourceEffect());
|
||||
}
|
||||
|
||||
private ArceeAcrobaticCoupeTriggeredAbility(final ArceeAcrobaticCoupeTriggeredAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArceeAcrobaticCoupeTriggeredAbility copy() {
|
||||
return new ArceeAcrobaticCoupeTriggeredAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (!super.checkTrigger(event, game)) {
|
||||
return false;
|
||||
}
|
||||
Spell spell = game.getSpell(event.getTargetId());
|
||||
if (spell == null) {
|
||||
return false;
|
||||
}
|
||||
int targets = spell
|
||||
.getStackAbility()
|
||||
.getTargets()
|
||||
.stream()
|
||||
.map(Target::getTargets)
|
||||
.flatMap(Collection::stream)
|
||||
.map(game::getPermanent)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(permanent -> permanent.isCreature(game)
|
||||
|| permanent.hasSubtype(SubType.VEHICLE, game))
|
||||
.map(Controllable::getControllerId)
|
||||
.map(this::isControlledBy)
|
||||
.mapToInt(x -> x ? 1 : 0)
|
||||
.sum();
|
||||
if (targets > 0) {
|
||||
this.getEffects().setValue("damage", targets);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever you cast a spell that targets one or more creatures or Vehicles " +
|
||||
"you control, put that many +1/+1 counters on {this}. Convert {this}.";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,42 +1,56 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.condition.common.FatefulHourCondition;
|
||||
import mage.abilities.costs.common.PayLifeCost;
|
||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesToughness;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.mana.BlackManaAbility;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class ArguelsBloodFast extends CardImpl {
|
||||
public final class ArguelsBloodFast extends TransformingDoubleFacedCard {
|
||||
|
||||
public ArguelsBloodFast(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.secondSideCardClazz = mage.cards.t.TempleOfAclazotz.class;
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{1}{B}",
|
||||
"Temple of Aclazotz",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{},"");
|
||||
|
||||
// {1}{B}, Pay 2 life: Draw a card.
|
||||
Ability ability = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new ManaCostsImpl<>("{1}{B}"));
|
||||
ability.addCost(new PayLifeCost(2));
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// At the beginning of your upkeep, if you have 5 or less life, you may transform Arguel's Blood Fast.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(), true
|
||||
this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(), true
|
||||
).withInterveningIf(FatefulHourCondition.instance));
|
||||
|
||||
// Temple of Aclazotz
|
||||
// {T}: Add {B}
|
||||
this.getRightHalfCard().addAbility(new BlackManaAbility());
|
||||
|
||||
// {T}, Sacrifice a creature: You gain life equal to the sacrificed creature's toughness.
|
||||
Ability activatedAbility = new SimpleActivatedAbility(new GainLifeEffect(SacrificeCostCreaturesToughness.instance)
|
||||
.setText("you gain life equal to the sacrificed creature's toughness"), new TapSourceCost());
|
||||
activatedAbility.addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE));
|
||||
this.getRightHalfCard().addAbility(activatedAbility);
|
||||
}
|
||||
|
||||
private ArguelsBloodFast(final ArguelsBloodFast card) {
|
||||
|
|
|
|||
|
|
@ -1,68 +0,0 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.LoyaltyAbility;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.GetEmblemEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
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.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.command.emblems.ArlinnEmbracedByTheMoonEmblem;
|
||||
import mage.target.common.TargetAnyTarget;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author fireshoes
|
||||
*/
|
||||
public final class ArlinnEmbracedByTheMoon extends CardImpl {
|
||||
|
||||
public ArlinnEmbracedByTheMoon(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.ARLINN);
|
||||
this.color.setRed(true);
|
||||
this.color.setGreen(true);
|
||||
|
||||
this.nightCard = true;
|
||||
|
||||
// +1: Creatures you control get +1/+1 and gain trample until end of turn.
|
||||
Ability ability = new LoyaltyAbility(new BoostControlledEffect(
|
||||
1, 1, Duration.EndOfTurn,
|
||||
StaticFilters.FILTER_PERMANENT_CREATURE
|
||||
).setText("Creatures you control get +1/+1"), 1);
|
||||
ability.addEffect(new GainAbilityControlledEffect(
|
||||
TrampleAbility.getInstance(), Duration.EndOfTurn,
|
||||
StaticFilters.FILTER_PERMANENT_CREATURE
|
||||
).setText("and gain trample until end of turn"));
|
||||
this.addAbility(ability);
|
||||
|
||||
// -1: Arlinn, Embraced by the Moon deals 3 damage to any target. Transform Arlinn, Embraced by the Moon.
|
||||
this.addAbility(new TransformAbility());
|
||||
ability = new LoyaltyAbility(new DamageTargetEffect(3), -1);
|
||||
ability.addTarget(new TargetAnyTarget());
|
||||
ability.addEffect(new TransformSourceEffect());
|
||||
this.addAbility(ability);
|
||||
|
||||
// -6: You get an emblem with "Creatures you control have haste and '{T}: This creature deals damage equal to its power to any target.'"
|
||||
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new ArlinnEmbracedByTheMoonEmblem()), -6));
|
||||
}
|
||||
|
||||
private ArlinnEmbracedByTheMoon(final ArlinnEmbracedByTheMoon card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArlinnEmbracedByTheMoon copy() {
|
||||
return new ArlinnEmbracedByTheMoon(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -3,19 +3,26 @@ package mage.cards.a;
|
|||
import mage.abilities.Ability;
|
||||
import mage.abilities.LoyaltyAbility;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.GetEmblemEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||
import mage.abilities.keyword.HasteAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
import mage.abilities.keyword.VigilanceAbility;
|
||||
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.filter.StaticFilters;
|
||||
import mage.game.command.emblems.ArlinnEmbracedByTheMoonEmblem;
|
||||
import mage.game.permanent.token.WolfToken;
|
||||
import mage.target.common.TargetAnyTarget;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
|
@ -23,16 +30,14 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author fireshoes
|
||||
*/
|
||||
public final class ArlinnKord extends CardImpl {
|
||||
public final class ArlinnKord extends TransformingDoubleFacedCard {
|
||||
|
||||
public ArlinnKord(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{R}{G}");
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.ARLINN);
|
||||
|
||||
this.secondSideCardClazz = mage.cards.a.ArlinnEmbracedByTheMoon.class;
|
||||
|
||||
this.setStartingLoyalty(3);
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.ARLINN}, "{2}{R}{G}",
|
||||
"Arlinn, Embraced by the Moon",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.ARLINN}, "RG");
|
||||
this.getLeftHalfCard().setStartingLoyalty(3);
|
||||
|
||||
// +1: Until end of turn, up to one target creature gets +2/+2 and gains vigilance and haste.
|
||||
Ability ability = new LoyaltyAbility(new BoostTargetEffect(
|
||||
|
|
@ -45,13 +50,34 @@ public final class ArlinnKord extends CardImpl {
|
|||
HasteAbility.getInstance(), Duration.EndOfTurn
|
||||
).setText("and haste"));
|
||||
ability.addTarget(new TargetCreaturePermanent(0, 1));
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// 0: Create a 2/2 green Wolf creature token. Transform Arlinn Kord.
|
||||
this.addAbility(new TransformAbility());
|
||||
ability = new LoyaltyAbility(new CreateTokenEffect(new WolfToken()), 0);
|
||||
ability.addEffect(new TransformSourceEffect());
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// Arlinn, Embraced by the Moon
|
||||
// +1: Creatures you control get +1/+1 and gain trample until end of turn.
|
||||
ability = new LoyaltyAbility(new BoostControlledEffect(
|
||||
1, 1, Duration.EndOfTurn,
|
||||
StaticFilters.FILTER_PERMANENT_CREATURE
|
||||
).setText("Creatures you control get +1/+1"), 1);
|
||||
ability.addEffect(new GainAbilityControlledEffect(
|
||||
TrampleAbility.getInstance(), Duration.EndOfTurn,
|
||||
StaticFilters.FILTER_PERMANENT_CREATURE
|
||||
).setText("and gain trample until end of turn"));
|
||||
this.getRightHalfCard().addAbility(ability);
|
||||
|
||||
// -1: Arlinn, Embraced by the Moon deals 3 damage to any target. Transform Arlinn, Embraced by the Moon.
|
||||
ability = new LoyaltyAbility(new DamageTargetEffect(3), -1);
|
||||
ability.addTarget(new TargetAnyTarget());
|
||||
ability.addEffect(new TransformSourceEffect());
|
||||
this.getRightHalfCard().addAbility(ability);
|
||||
|
||||
// -6: You get an emblem with "Creatures you control have haste and '{T}: This creature deals damage equal to its power to any target.'"
|
||||
this.getRightHalfCard().addAbility(new LoyaltyAbility(new GetEmblemEffect(new ArlinnEmbracedByTheMoonEmblem()), -6));
|
||||
|
||||
}
|
||||
|
||||
private ArlinnKord(final ArlinnKord card) {
|
||||
|
|
|
|||
|
|
@ -1,118 +0,0 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.Mana;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.LoyaltyAbility;
|
||||
import mage.abilities.effects.ContinuousEffectImpl;
|
||||
import mage.abilities.effects.mana.BasicManaEffect;
|
||||
import mage.abilities.keyword.HasteAbility;
|
||||
import mage.abilities.keyword.IndestructibleAbility;
|
||||
import mage.abilities.keyword.NightboundAbility;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class ArlinnTheMoonsFury extends CardImpl {
|
||||
|
||||
public ArlinnTheMoonsFury(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.ARLINN);
|
||||
this.setStartingLoyalty(4);
|
||||
this.color.setRed(true);
|
||||
this.color.setGreen(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// Nightbound
|
||||
this.addAbility(new NightboundAbility());
|
||||
|
||||
// +2: Add {R}{G}.
|
||||
this.addAbility(new LoyaltyAbility(new BasicManaEffect(new Mana(
|
||||
0, 0, 0, 1, 1, 0, 0, 0
|
||||
)), 2));
|
||||
|
||||
// 0: Until end of turn, Arlinn, the Moon's Fury becomes a 5/5 Werewolf creature with trample, indestructible, and haste.
|
||||
this.addAbility(new LoyaltyAbility(new ArlinnTheMoonsFuryEffect(), 0));
|
||||
}
|
||||
|
||||
private ArlinnTheMoonsFury(final ArlinnTheMoonsFury card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArlinnTheMoonsFury copy() {
|
||||
return new ArlinnTheMoonsFury(this);
|
||||
}
|
||||
}
|
||||
|
||||
class ArlinnTheMoonsFuryEffect extends ContinuousEffectImpl {
|
||||
|
||||
ArlinnTheMoonsFuryEffect() {
|
||||
super(Duration.EndOfTurn, Outcome.Benefit);
|
||||
staticText = "until end of turn, {this} becomes a 5/5 Werewolf creature with trample, indestructible, and haste";
|
||||
this.dependencyTypes.add(DependencyType.BecomeCreature);
|
||||
}
|
||||
|
||||
private ArlinnTheMoonsFuryEffect(final ArlinnTheMoonsFuryEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArlinnTheMoonsFuryEffect copy() {
|
||||
return new ArlinnTheMoonsFuryEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
|
||||
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
|
||||
if (permanent == null) {
|
||||
discard();
|
||||
return false;
|
||||
}
|
||||
switch (layer) {
|
||||
case TypeChangingEffects_4:
|
||||
permanent.removeAllCardTypes(game);
|
||||
permanent.addCardType(game, CardType.CREATURE);
|
||||
permanent.removeAllCreatureTypes(game);
|
||||
permanent.addSubType(game, SubType.WEREWOLF);
|
||||
return true;
|
||||
case AbilityAddingRemovingEffects_6:
|
||||
permanent.addAbility(TrampleAbility.getInstance(), source.getSourceId(), game);
|
||||
permanent.addAbility(IndestructibleAbility.getInstance(), source.getSourceId(), game);
|
||||
permanent.addAbility(HasteAbility.getInstance(), source.getSourceId(), game);
|
||||
return true;
|
||||
case PTChangingEffects_7:
|
||||
if (sublayer == SubLayer.SetPT_7b) {
|
||||
permanent.getPower().setModifiedBaseValue(5);
|
||||
permanent.getToughness().setModifiedBaseValue(5);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasLayer(Layer layer) {
|
||||
switch (layer) {
|
||||
case TypeChangingEffects_4:
|
||||
case AbilityAddingRemovingEffects_6:
|
||||
case PTChangingEffects_7:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,21 +1,23 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.Mana;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.LoyaltyAbility;
|
||||
import mage.abilities.effects.ContinuousEffectImpl;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.EntersWithCountersControlledEffect;
|
||||
import mage.abilities.effects.common.continuous.CastAsThoughItHadFlashAllEffect;
|
||||
import mage.abilities.keyword.DayboundAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.effects.mana.BasicManaEffect;
|
||||
import mage.abilities.keyword.*;
|
||||
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.counters.CounterType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.WolfToken;
|
||||
|
||||
import java.util.UUID;
|
||||
|
|
@ -23,20 +25,20 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class ArlinnThePacksHope extends CardImpl {
|
||||
public final class ArlinnThePacksHope extends TransformingDoubleFacedCard {
|
||||
|
||||
private static final FilterCard filter = new FilterCreatureCard("creature spells");
|
||||
|
||||
public ArlinnThePacksHope(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{R}{G}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.ARLINN);
|
||||
this.setStartingLoyalty(4);
|
||||
this.secondSideCardClazz = mage.cards.a.ArlinnTheMoonsFury.class;
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.ARLINN}, "{2}{R}{G}",
|
||||
"Arlinn, the Moon's Fury",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.ARLINN}, "RG");
|
||||
this.getLeftHalfCard().setStartingLoyalty(4);
|
||||
this.getRightHalfCard().setStartingLoyalty(4);
|
||||
|
||||
// Daybound
|
||||
this.addAbility(new DayboundAbility());
|
||||
this.getLeftHalfCard().addAbility(new DayboundAbility());
|
||||
|
||||
// +1: Until your next turn, you may cast creature spells as though they had flash, and each creature you control enters the battlefield with an additional +1/+1 counter on it.
|
||||
Ability ability = new LoyaltyAbility(new CastAsThoughItHadFlashAllEffect(
|
||||
|
|
@ -45,10 +47,23 @@ public final class ArlinnThePacksHope extends CardImpl {
|
|||
ability.addEffect(new EntersWithCountersControlledEffect(
|
||||
StaticFilters.FILTER_PERMANENT_CREATURE, CounterType.P1P1.createInstance(), false
|
||||
).concatBy(", and"));
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// −3: Create two 2/2 green Wolf creature tokens.
|
||||
this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfToken(), 2), -3));
|
||||
this.getLeftHalfCard().addAbility(new LoyaltyAbility(new CreateTokenEffect(new WolfToken(), 2), -3));
|
||||
|
||||
// Arlinn, the Moon's Fury
|
||||
// Nightbound
|
||||
this.getRightHalfCard().addAbility(new NightboundAbility());
|
||||
|
||||
// +2: Add {R}{G}.
|
||||
this.getRightHalfCard().addAbility(new LoyaltyAbility(new BasicManaEffect(new Mana(
|
||||
0, 0, 0, 1, 1, 0, 0, 0
|
||||
)), 2));
|
||||
|
||||
// 0: Until end of turn, Arlinn, the Moon's Fury becomes a 5/5 Werewolf creature with trample, indestructible, and haste.
|
||||
this.getRightHalfCard().addAbility(new LoyaltyAbility(new ArlinnTheMoonsFuryEffect(), 0));
|
||||
|
||||
}
|
||||
|
||||
private ArlinnThePacksHope(final ArlinnThePacksHope card) {
|
||||
|
|
@ -60,3 +75,66 @@ public final class ArlinnThePacksHope extends CardImpl {
|
|||
return new ArlinnThePacksHope(this);
|
||||
}
|
||||
}
|
||||
|
||||
class ArlinnTheMoonsFuryEffect extends ContinuousEffectImpl {
|
||||
|
||||
ArlinnTheMoonsFuryEffect() {
|
||||
super(Duration.EndOfTurn, Outcome.Benefit);
|
||||
staticText = "until end of turn, {this} becomes a 5/5 Werewolf creature with trample, indestructible, and haste";
|
||||
this.dependencyTypes.add(DependencyType.BecomeCreature);
|
||||
}
|
||||
|
||||
private ArlinnTheMoonsFuryEffect(final ArlinnTheMoonsFuryEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArlinnTheMoonsFuryEffect copy() {
|
||||
return new ArlinnTheMoonsFuryEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
|
||||
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
|
||||
if (permanent == null) {
|
||||
discard();
|
||||
return false;
|
||||
}
|
||||
switch (layer) {
|
||||
case TypeChangingEffects_4:
|
||||
permanent.removeAllCardTypes(game);
|
||||
permanent.addCardType(game, CardType.CREATURE);
|
||||
permanent.removeAllCreatureTypes(game);
|
||||
permanent.addSubType(game, SubType.WEREWOLF);
|
||||
return true;
|
||||
case AbilityAddingRemovingEffects_6:
|
||||
permanent.addAbility(TrampleAbility.getInstance(), source.getSourceId(), game);
|
||||
permanent.addAbility(IndestructibleAbility.getInstance(), source.getSourceId(), game);
|
||||
permanent.addAbility(HasteAbility.getInstance(), source.getSourceId(), game);
|
||||
return true;
|
||||
case PTChangingEffects_7:
|
||||
if (sublayer == SubLayer.SetPT_7b) {
|
||||
permanent.getPower().setModifiedBaseValue(5);
|
||||
permanent.getToughness().setModifiedBaseValue(5);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasLayer(Layer layer) {
|
||||
switch (layer) {
|
||||
case TypeChangingEffects_4:
|
||||
case AbilityAddingRemovingEffects_6:
|
||||
case PTChangingEffects_7:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,12 +6,14 @@ import mage.abilities.costs.mana.ManaCostsImpl;
|
|||
import mage.abilities.dynamicvalue.common.CardTypesInGraveyardCount;
|
||||
import mage.abilities.effects.common.MillCardsControllerEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.abilities.keyword.HexproofAbility;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.AbilityWord;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.TargetController;
|
||||
|
||||
import java.util.UUID;
|
||||
|
|
@ -19,20 +21,28 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author LevelX2
|
||||
*/
|
||||
public final class AutumnalGloom extends CardImpl {
|
||||
public final class AutumnalGloom extends TransformingDoubleFacedCard {
|
||||
|
||||
public AutumnalGloom(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
|
||||
this.secondSideCardClazz = mage.cards.a.AncientOfTheEquinox.class;
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{2}{G}",
|
||||
"Ancient of the Equinox",
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.TREEFOLK}, "G");
|
||||
this.getRightHalfCard().setPT(4, 4);
|
||||
|
||||
// {B}: Put the top card of your library into your graveyard.
|
||||
this.addAbility(new SimpleActivatedAbility(new MillCardsControllerEffect(1), new ManaCostsImpl<>("{B}")));
|
||||
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new MillCardsControllerEffect(1), new ManaCostsImpl<>("{B}")));
|
||||
|
||||
// <i>Delirium</i> — At the beginning of your end step, if there are four or more card types among cards in your graveyard, transform Autumnal Gloom.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new BeginningOfEndStepTriggeredAbility(
|
||||
this.getLeftHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(
|
||||
TargetController.YOU, new TransformSourceEffect(), false, DeliriumCondition.instance
|
||||
).setAbilityWord(AbilityWord.DELIRIUM).addHint(CardTypesInGraveyardCount.YOU.getHint()));
|
||||
|
||||
// Ancient of the Equinox
|
||||
// Trample
|
||||
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
|
||||
// Hexproof
|
||||
this.getRightHalfCard().addAbility(HexproofAbility.getInstance());
|
||||
}
|
||||
|
||||
private AutumnalGloom(final AutumnalGloom card) {
|
||||
|
|
|
|||
|
|
@ -1,14 +1,18 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||
import mage.abilities.keyword.DayboundAbility;
|
||||
import mage.abilities.keyword.HexproofAbility;
|
||||
import mage.abilities.keyword.NightboundAbility;
|
||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||
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.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
|
@ -19,29 +23,49 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AvabruckCaretaker extends CardImpl {
|
||||
public final class AvabruckCaretaker extends TransformingDoubleFacedCard {
|
||||
|
||||
public AvabruckCaretaker(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WEREWOLF);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
this.secondSideCardClazz = mage.cards.h.HollowhengeHuntmaster.class;
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{4}{G}{G}",
|
||||
"Hollowhenge Huntmaster",
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G");
|
||||
this.getLeftHalfCard().setPT(4, 4);
|
||||
this.getRightHalfCard().setPT(6, 6);
|
||||
|
||||
// Hexproof
|
||||
this.addAbility(HexproofAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(HexproofAbility.getInstance());
|
||||
|
||||
// At the beginning of combat on your turn, put two +1/+1 counters on another target creature you control.
|
||||
Ability ability = new BeginningOfCombatTriggeredAbility(
|
||||
new AddCountersTargetEffect(CounterType.P1P1.createInstance(2))
|
||||
);
|
||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE_YOU_CONTROL));
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// Daybound
|
||||
this.addAbility(new DayboundAbility());
|
||||
this.getLeftHalfCard().addAbility(new DayboundAbility());
|
||||
|
||||
// Hollowhenge Huntmaster
|
||||
// Hexproof
|
||||
this.getRightHalfCard().addAbility(HexproofAbility.getInstance());
|
||||
|
||||
// Other permanents you control have hexproof.
|
||||
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||
HexproofAbility.getInstance(), Duration.WhileOnBattlefield,
|
||||
StaticFilters.FILTER_PERMANENTS, true
|
||||
)));
|
||||
|
||||
// At the beginning of combat on your turn, put two +1/+1 counters on each creature you control.
|
||||
this.getRightHalfCard().addAbility(new BeginningOfCombatTriggeredAbility(
|
||||
new AddCountersAllEffect(
|
||||
CounterType.P1P1.createInstance(2),
|
||||
StaticFilters.FILTER_CONTROLLED_CREATURE
|
||||
)
|
||||
));
|
||||
|
||||
// Nightbound
|
||||
this.getRightHalfCard().addAbility(new NightboundAbility());
|
||||
}
|
||||
|
||||
private AvabruckCaretaker(final AvabruckCaretaker card) {
|
||||
|
|
|
|||
|
|
@ -1,37 +1,43 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
|
||||
import mage.abilities.condition.common.EquippedSourceCondition;
|
||||
import mage.abilities.effects.common.ExileUntilSourceLeavesEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.TargetController;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author fireshoes
|
||||
*/
|
||||
public final class AvacynianMissionaries extends CardImpl {
|
||||
public final class AvacynianMissionaries extends TransformingDoubleFacedCard {
|
||||
|
||||
public AvacynianMissionaries(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.CLERIC);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
this.secondSideCardClazz = mage.cards.l.LunarchInquisitors.class;
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.CLERIC}, "{3}{W}",
|
||||
"Lunarch Inquisitors",
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.CLERIC}, "W");
|
||||
this.getLeftHalfCard().setPT(3, 3);
|
||||
this.getRightHalfCard().setPT(4, 4);
|
||||
|
||||
// At the beginning of your end step, if Avacynian Missionaries is equipped, transform it.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new BeginningOfEndStepTriggeredAbility(TargetController.YOU, new TransformSourceEffect().setText("transform it"),
|
||||
this.getLeftHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(TargetController.YOU, new TransformSourceEffect().setText("transform it"),
|
||||
false, EquippedSourceCondition.instance));
|
||||
|
||||
// Lunarch Inquisitors
|
||||
// When this creature transforms into Lunarch Inquisitors, you may exile another target creature until Lunarch Inquisitors leaves the battlefield.
|
||||
Ability ability = new TransformIntoSourceTriggeredAbility(new ExileUntilSourceLeavesEffect(), true);
|
||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE));
|
||||
this.getRightHalfCard().addAbility(ability);
|
||||
}
|
||||
|
||||
private AvacynianMissionaries(final AvacynianMissionaries card) {
|
||||
|
|
|
|||
|
|
@ -1,50 +1,80 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.costs.Cost;
|
||||
import mage.abilities.costs.CostImpl;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.dynamicvalue.common.StaticValue;
|
||||
import mage.abilities.effects.common.*;
|
||||
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||
import mage.abilities.keyword.FirebendingAbility;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.*;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.watchers.Watcher;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AvatarAang extends CardImpl {
|
||||
public final class AvatarAang extends TransformingDoubleFacedCard {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("spells");
|
||||
|
||||
public AvatarAang(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}{G}{W}{U}");
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.AVATAR, SubType.ALLY}, "{R}{G}{W}{U}",
|
||||
"Aang, Master of Elements",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.AVATAR, SubType.ALLY}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.AVATAR);
|
||||
this.subtype.add(SubType.ALLY);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
this.secondSideCardClazz = mage.cards.a.AangMasterOfElements.class;
|
||||
this.getLeftHalfCard().setPT(4, 4);
|
||||
this.getRightHalfCard().setPT(6, 6);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Firebending 2
|
||||
this.addAbility(new FirebendingAbility(2));
|
||||
this.getLeftHalfCard().addAbility(new FirebendingAbility(2));
|
||||
|
||||
// Whenever you waterbend, earthbend, firebend, or airbend, draw a card. Then if you've done all four this turn, transform Avatar Aang.
|
||||
this.addAbility(new AvatarAangTriggeredAbility());
|
||||
this.getLeftHalfCard().addAbility(new AvatarAangTriggeredAbility());
|
||||
|
||||
// Aang, Master of Elements
|
||||
// Flying
|
||||
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Spells you cast cost {W}{U}{B}{R}{G} less to cast.
|
||||
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new SpellsCostReductionControllerEffect(
|
||||
filter, new ManaCostsImpl<>("{W}{U}{B}{R}{G}"), StaticValue.get(1), true
|
||||
)));
|
||||
|
||||
// At the beginning of each upkeep, you may transform Aang, Master of Elements. If you do, you gain 4 life, draw four cards, put four +1/+1 counters on him, and he deals 4 damage to each opponent.
|
||||
this.getRightHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(
|
||||
TargetController.ANY,
|
||||
new DoIfCostPaid(new GainLifeEffect(4), new AangMasterOfElementsCost())
|
||||
.addEffect(new DrawCardSourceControllerEffect(4).concatBy(","))
|
||||
.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance(4))
|
||||
.setText(", put four +1/+1 counters on him"))
|
||||
.addEffect(new DamagePlayersEffect(4, TargetController.OPPONENT)
|
||||
.setText(", and he deals 4 damage to each opponent")),
|
||||
false
|
||||
));
|
||||
}
|
||||
|
||||
private AvatarAang(final AvatarAang card) {
|
||||
|
|
@ -154,3 +184,37 @@ class AvatarAangWatcher extends Watcher {
|
|||
return game.getState().getWatcher(AvatarAangWatcher.class).checkPlayer(source.getControllerId());
|
||||
}
|
||||
}
|
||||
|
||||
class AangMasterOfElementsCost extends CostImpl {
|
||||
|
||||
AangMasterOfElementsCost() {
|
||||
super();
|
||||
text = "transform {this}";
|
||||
}
|
||||
|
||||
private AangMasterOfElementsCost(final AangMasterOfElementsCost cost) {
|
||||
super(cost);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangMasterOfElementsCost copy() {
|
||||
return new AangMasterOfElementsCost(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) {
|
||||
return Optional
|
||||
.ofNullable(source.getSourcePermanentIfItStillExists(game))
|
||||
.filter(Card::isTransformable)
|
||||
.isPresent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) {
|
||||
paid = Optional
|
||||
.ofNullable(source.getSourcePermanentIfItStillExists(game))
|
||||
.filter(permanent -> permanent.transform(source, game))
|
||||
.isPresent();
|
||||
return paid;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,109 +0,0 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.ExileTargetEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||
import mage.abilities.keyword.HasteAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInYourGraveyard;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AyaraFurnaceQueen extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("artifact or creature card from your graveyard");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
CardType.ARTIFACT.getPredicate(),
|
||||
CardType.CREATURE.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
public AyaraFurnaceQueen(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.PHYREXIAN);
|
||||
this.subtype.add(SubType.ELF);
|
||||
this.subtype.add(SubType.NOBLE);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
this.color.setBlack(true);
|
||||
this.color.setRed(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// At the beginning of combat on your turn, return up to one target artifact or creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step.
|
||||
Ability ability = new BeginningOfCombatTriggeredAbility(
|
||||
new AyaraFurnaceQueenEffect()
|
||||
);
|
||||
ability.addTarget(new TargetCardInYourGraveyard(0, 1, filter));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private AyaraFurnaceQueen(final AyaraFurnaceQueen card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AyaraFurnaceQueen copy() {
|
||||
return new AyaraFurnaceQueen(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AyaraFurnaceQueenEffect extends OneShotEffect {
|
||||
|
||||
AyaraFurnaceQueenEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "return up to one target artifact or creature card from your graveyard " +
|
||||
"to the battlefield. It gains haste. Exile it at the beginning of the next end step";
|
||||
}
|
||||
|
||||
private AyaraFurnaceQueenEffect(final AyaraFurnaceQueenEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AyaraFurnaceQueenEffect copy() {
|
||||
return new AyaraFurnaceQueenEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
Card card = game.getCard(getTargetPointer().getFirst(game, source));
|
||||
if (player == null || card == null) {
|
||||
return false;
|
||||
}
|
||||
Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game);
|
||||
if (permanent == null) {
|
||||
return false;
|
||||
}
|
||||
game.addEffect(new GainAbilityTargetEffect(
|
||||
HasteAbility.getInstance(), Duration.Custom
|
||||
).setTargetPointer(new FixedTarget(permanent.getId(), game)), source);
|
||||
game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(
|
||||
new ExileTargetEffect().setText("exile it")
|
||||
.setTargetPointer(new FixedTarget(permanent.getId(), game)),
|
||||
TargetController.ANY
|
||||
), source);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,49 +1,66 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
|
||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.dynamicvalue.DynamicValue;
|
||||
import mage.abilities.dynamicvalue.common.SacrificeCostManaValue;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.ExileTargetEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||
import mage.abilities.keyword.HasteAbility;
|
||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.FilterOpponent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterPermanentOrPlayer;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetCardInYourGraveyard;
|
||||
import mage.target.common.TargetPermanentOrPlayer;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AyaraWidowOfTheRealm extends CardImpl {
|
||||
public final class AyaraWidowOfTheRealm extends TransformingDoubleFacedCard {
|
||||
|
||||
private static final DynamicValue xValue = SacrificeCostManaValue.PERMANENT;
|
||||
private static final FilterPermanentOrPlayer filter = new FilterPermanentOrPlayer(
|
||||
"opponent or battle", StaticFilters.FILTER_PERMANENT_BATTLE, new FilterOpponent()
|
||||
);
|
||||
private static final FilterCard furnaceQueenFilter = new FilterCard("artifact or creature card from your graveyard");
|
||||
|
||||
static {
|
||||
furnaceQueenFilter.add(Predicates.or(
|
||||
CardType.ARTIFACT.getPredicate(),
|
||||
CardType.CREATURE.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
public AyaraWidowOfTheRealm(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.ELF);
|
||||
this.subtype.add(SubType.NOBLE);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
this.secondSideCardClazz = mage.cards.a.AyaraFurnaceQueen.class;
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELF, SubType.NOBLE}, "{1}{B}{B}",
|
||||
"Ayara, Furnace Queen",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.ELF, SubType.NOBLE}, "BR");
|
||||
this.getLeftHalfCard().setPT(3, 3);
|
||||
this.getRightHalfCard().setPT(4, 4);
|
||||
|
||||
// {T}, Sacrifice another creature or artifact: Ayara, Widow of the Realm deals X damage to target opponent or battle and you gain X life, where X is the sacrificed permanent's mana value.
|
||||
Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(xValue)
|
||||
|
|
@ -51,11 +68,18 @@ public final class AyaraWidowOfTheRealm extends CardImpl {
|
|||
ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE_OR_ARTIFACT));
|
||||
ability.addEffect(new GainLifeEffect(xValue).setText("and you gain X life, where X is the sacrificed permanent's mana value"));
|
||||
ability.addTarget(new TargetPermanentOrPlayer(filter));
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// {5}{R/P}: Transform Ayara. Activate only as a sorcery.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{R/P}")));
|
||||
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{R/P}")));
|
||||
|
||||
// Ayara, Furnace Queen
|
||||
// At the beginning of combat on your turn, return up to one target artifact or creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step.
|
||||
Ability triggeredAbility = new BeginningOfCombatTriggeredAbility(
|
||||
new AyaraFurnaceQueenEffect()
|
||||
);
|
||||
triggeredAbility.addTarget(new TargetCardInYourGraveyard(0, 1, furnaceQueenFilter));
|
||||
this.getRightHalfCard().addAbility(triggeredAbility);
|
||||
}
|
||||
|
||||
private AyaraWidowOfTheRealm(final AyaraWidowOfTheRealm card) {
|
||||
|
|
@ -67,3 +91,43 @@ public final class AyaraWidowOfTheRealm extends CardImpl {
|
|||
return new AyaraWidowOfTheRealm(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AyaraFurnaceQueenEffect extends OneShotEffect {
|
||||
|
||||
AyaraFurnaceQueenEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "return up to one target artifact or creature card from your graveyard " +
|
||||
"to the battlefield. It gains haste. Exile it at the beginning of the next end step";
|
||||
}
|
||||
|
||||
private AyaraFurnaceQueenEffect(final AyaraFurnaceQueenEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AyaraFurnaceQueenEffect copy() {
|
||||
return new AyaraFurnaceQueenEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
Card card = game.getCard(getTargetPointer().getFirst(game, source));
|
||||
if (player == null || card == null) {
|
||||
return false;
|
||||
}
|
||||
Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game);
|
||||
if (permanent == null) {
|
||||
return false;
|
||||
}
|
||||
game.addEffect(new GainAbilityTargetEffect(
|
||||
HasteAbility.getInstance(), Duration.Custom
|
||||
).setTargetPointer(new FixedTarget(permanent.getId(), game)), source);
|
||||
game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(
|
||||
new ExileTargetEffect().setText("exile it")
|
||||
.setTargetPointer(new FixedTarget(permanent.getId(), game)),
|
||||
TargetController.ANY
|
||||
), source);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,23 +1,26 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageObject;
|
||||
import mage.Mana;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||
import mage.abilities.dynamicvalue.common.ControllerLifeCount;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.UntapSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.abilities.mana.DynamicManaAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.game.ExileZone;
|
||||
import mage.game.Game;
|
||||
|
|
@ -31,18 +34,17 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author LevelX2
|
||||
*/
|
||||
public final class AzorsGateway extends CardImpl {
|
||||
public final class AzorsGateway extends TransformingDoubleFacedCard {
|
||||
|
||||
public AzorsGateway(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.secondSideCardClazz = mage.cards.s.SanctumOfTheSun.class;
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{2}",
|
||||
"Sanctum of the Sun",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{}, "");
|
||||
|
||||
// {1}, {T}: Draw a card, then exile a card from your hand.
|
||||
// If cards with five or more different converted mana costs are exiled with Azor's Gateway,
|
||||
// you gain 5 life, untap Azor's Gateway, and transform it.
|
||||
this.addAbility(new TransformAbility());
|
||||
Ability ability = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new GenericManaCost(1));
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addEffect(new AzorsGatewayEffect());
|
||||
|
|
@ -50,7 +52,13 @@ public final class AzorsGateway extends CardImpl {
|
|||
new GainLifeEffect(5), AzorsGatewayCondition.instance, "If cards with five or more " +
|
||||
"different mana values are exiled with {this}, you gain 5 life, untap {this}, and transform it."
|
||||
).addEffect(new UntapSourceEffect()).addEffect(new TransformSourceEffect()));
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// Sanctum of the Sun
|
||||
// {T}: Add X mana of any one color, where X is your life total.
|
||||
this.getRightHalfCard().addAbility(new DynamicManaAbility(new Mana(0, 0, 0, 0, 0, 0, 1, 0), ControllerLifeCount.instance, new TapSourceCost(),
|
||||
"Add X mana of any one color, where X is your life total", true));
|
||||
|
||||
}
|
||||
|
||||
private AzorsGateway(final AzorsGateway card) {
|
||||
|
|
|
|||
|
|
@ -1,99 +0,0 @@
|
|||
|
||||
package mage.cards.d;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.MageObjectReference;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.dynamicvalue.common.CountersSourceCount;
|
||||
import mage.abilities.effects.ContinuousEffectImpl;
|
||||
import mage.abilities.keyword.LifelinkAbility;
|
||||
import mage.abilities.keyword.MenaceAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author Styxo
|
||||
*/
|
||||
public final class DarthVader extends CardImpl {
|
||||
|
||||
public DarthVader(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.SITH);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
this.color.setBlack(true);
|
||||
|
||||
this.nightCard = true;
|
||||
|
||||
// Menace
|
||||
this.addAbility(new MenaceAbility());
|
||||
|
||||
// Lifelink
|
||||
this.addAbility(LifelinkAbility.getInstance());
|
||||
|
||||
// Whenever Darth Vader attacks, creatures defending player controls get -1/-1 until end of turn for each +1/+1 counter on Darth Vader.
|
||||
this.addAbility(new AttacksTriggeredAbility(new UnboostCreaturesDefendingPlayerEffect(), false, null, SetTargetPointer.PLAYER));
|
||||
}
|
||||
|
||||
private DarthVader(final DarthVader card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DarthVader copy() {
|
||||
return new DarthVader(this);
|
||||
}
|
||||
}
|
||||
|
||||
class UnboostCreaturesDefendingPlayerEffect extends ContinuousEffectImpl {
|
||||
|
||||
UnboostCreaturesDefendingPlayerEffect() {
|
||||
super(Duration.EndOfTurn, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.UnboostCreature);
|
||||
staticText = "creatures defending player controls get -1/-1 until end of turn for each +1/+1 counter on Darth Vader";
|
||||
}
|
||||
|
||||
private UnboostCreaturesDefendingPlayerEffect(final UnboostCreaturesDefendingPlayerEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UnboostCreaturesDefendingPlayerEffect copy() {
|
||||
return new UnboostCreaturesDefendingPlayerEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(Ability source, Game game) {
|
||||
super.init(source, game);
|
||||
if (getAffectedObjectsSet()) {
|
||||
for (Permanent creature : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, getTargetPointer().getFirst(game, source), game)) {
|
||||
affectedObjectList.add(new MageObjectReference(creature, game));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
for (Iterator<MageObjectReference> it = affectedObjectList.iterator(); it.hasNext(); ) {
|
||||
Permanent permanent = it.next().getPermanent(game);
|
||||
if (permanent != null) {
|
||||
int unboostCount = -1 * new CountersSourceCount(CounterType.P1P1).calculate(game, source, this);
|
||||
permanent.addPower(unboostCount);
|
||||
permanent.addToughness(unboostCount);
|
||||
} else {
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
package mage.cards.d;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.Mana;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||
import mage.abilities.effects.mana.UntilEndOfTurnManaEffect;
|
||||
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.filter.StaticFilters;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class DeadlyDancer extends CardImpl {
|
||||
|
||||
public DeadlyDancer(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
|
||||
this.subtype.add(SubType.VAMPIRE);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
this.color.setRed(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// Trample
|
||||
this.addAbility(TrampleAbility.getInstance());
|
||||
|
||||
// When this creature transforms into Deadly Dancer, add {R}{R}. Until end of turn, you don't lose this mana as steps and phases end.
|
||||
this.addAbility(new TransformIntoSourceTriggeredAbility(new UntilEndOfTurnManaEffect(Mana.RedMana(2))));
|
||||
|
||||
// {R}{R}: Deadly Dancer and another target creature each get +1/+0 until end of turn.
|
||||
Ability ability = new SimpleActivatedAbility(new BoostSourceEffect(
|
||||
1, 0, Duration.EndOfTurn
|
||||
).setText("{this}"), new ManaCostsImpl<>("{R}{R}"));
|
||||
ability.addEffect(new BoostTargetEffect(1, 0)
|
||||
.setText("and another target creature each get +1/+0 until end of turn"));
|
||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private DeadlyDancer(final DeadlyDancer card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeadlyDancer copy() {
|
||||
return new DeadlyDancer(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
package mage.cards.g;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.keyword.DeathtouchAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class GitaxianMindstinger extends CardImpl {
|
||||
|
||||
public GitaxianMindstinger(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
|
||||
this.subtype.add(SubType.PHYREXIAN);
|
||||
this.subtype.add(SubType.ROGUE);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
this.color.setBlue(true);
|
||||
this.color.setBlack(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// Deathtouch
|
||||
this.addAbility(DeathtouchAbility.getInstance());
|
||||
|
||||
// Whenever Gitaxian Mindstinger deals combat damage to a player or battle, draw a card.
|
||||
this.addAbility(new DealsCombatDamageToAPlayerOrBattleTriggeredAbility(new DrawCardSourceControllerEffect(1),false));
|
||||
}
|
||||
|
||||
private GitaxianMindstinger(final GitaxianMindstinger card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GitaxianMindstinger copy() {
|
||||
return new GitaxianMindstinger(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -25,7 +25,6 @@ public final class HinterlandLogger extends TransformingDoubleFacedCard {
|
|||
this.getRightHalfCard().setPT(4, 2);
|
||||
|
||||
// At the beginning of each upkeep, if no spells were cast last turn, transform Hinterland Logger.
|
||||
// this.getLeftHalfCard().addAbility(new TransformAbility());
|
||||
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
|
||||
|
||||
// Timber Shredder
|
||||
|
|
|
|||
|
|
@ -1,63 +0,0 @@
|
|||
package mage.cards.h;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.abilities.keyword.HexproofAbility;
|
||||
import mage.abilities.keyword.NightboundAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class HollowhengeHuntmaster extends CardImpl {
|
||||
|
||||
public HollowhengeHuntmaster(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(6);
|
||||
this.color.setGreen(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// Hexproof
|
||||
this.addAbility(HexproofAbility.getInstance());
|
||||
|
||||
// Other permanents you control have hexproof.
|
||||
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||
HexproofAbility.getInstance(), Duration.WhileOnBattlefield,
|
||||
StaticFilters.FILTER_PERMANENTS, true
|
||||
)));
|
||||
|
||||
// At the beginning of combat on your turn, put two +1/+1 counters on each creature you control.
|
||||
this.addAbility(new BeginningOfCombatTriggeredAbility(
|
||||
new AddCountersAllEffect(
|
||||
CounterType.P1P1.createInstance(2),
|
||||
StaticFilters.FILTER_CONTROLLED_CREATURE
|
||||
)
|
||||
));
|
||||
|
||||
// Nightbound
|
||||
this.addAbility(new NightboundAbility());
|
||||
}
|
||||
|
||||
private HollowhengeHuntmaster(final HollowhengeHuntmaster card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HollowhengeHuntmaster copy() {
|
||||
return new HollowhengeHuntmaster(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,115 +0,0 @@
|
|||
package mage.cards.i;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.SpellAbility;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.AttachEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.LoseLifeTargetEffect;
|
||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||
import mage.abilities.keyword.EnchantAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.stack.Spell;
|
||||
import mage.target.TargetPlayer;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author halljared
|
||||
*/
|
||||
public final class InfectiousCurse extends CardImpl {
|
||||
|
||||
public InfectiousCurse(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
|
||||
this.subtype.add(SubType.AURA, SubType.CURSE);
|
||||
this.color.setBlack(true);
|
||||
|
||||
this.nightCard = true;
|
||||
|
||||
// Enchant player
|
||||
TargetPlayer auraTarget = new TargetPlayer();
|
||||
this.getSpellAbility().addTarget(auraTarget);
|
||||
this.getSpellAbility().addEffect(new AttachEffect(Outcome.Damage));
|
||||
this.addAbility(new EnchantAbility(auraTarget));
|
||||
|
||||
// Spells you cast that target enchanted player cost {1} less to cast.
|
||||
this.addAbility(new SimpleStaticAbility(new InfectiousCurseCostReductionEffect()));
|
||||
|
||||
// At the beginning of enchanted player's upkeep, that player loses 1 life and you gain 1 life.
|
||||
Ability ability = new BeginningOfUpkeepTriggeredAbility(
|
||||
TargetController.ENCHANTED, new LoseLifeTargetEffect(1).setText("that player loses 1 life"),
|
||||
false
|
||||
);
|
||||
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private InfectiousCurse(final InfectiousCurse card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InfectiousCurse copy() {
|
||||
return new InfectiousCurse(this);
|
||||
}
|
||||
}
|
||||
|
||||
class InfectiousCurseCostReductionEffect extends CostModificationEffectImpl {
|
||||
|
||||
InfectiousCurseCostReductionEffect() {
|
||||
super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST);
|
||||
this.staticText = "Spells you cast that target enchanted player cost {1} less to cast";
|
||||
}
|
||||
|
||||
private InfectiousCurseCostReductionEffect(InfectiousCurseCostReductionEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source, Ability abilityToModify) {
|
||||
CardUtil.reduceCost(abilityToModify, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||
if (!(abilityToModify instanceof SpellAbility)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!source.isControlledBy(abilityToModify.getControllerId())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Permanent enchantment = game.getPermanent(source.getSourceId());
|
||||
if (enchantment == null || enchantment.getAttachedTo() == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId());
|
||||
Set<UUID> allTargets;
|
||||
if (spell != null) {
|
||||
// real cast
|
||||
allTargets = CardUtil.getAllSelectedTargets(abilityToModify, game);
|
||||
} else {
|
||||
// playable
|
||||
allTargets = CardUtil.getAllPossibleTargets(abilityToModify, game);
|
||||
}
|
||||
|
||||
// try to reduce all the time (if it possible to target)
|
||||
return allTargets.stream().anyMatch(target -> Objects.equals(target, enchantment.getAttachedTo()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public InfectiousCurseCostReductionEffect copy() {
|
||||
return new InfectiousCurseCostReductionEffect(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
package mage.cards.l;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
|
||||
import mage.abilities.effects.common.ExileUntilSourceLeavesEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author fireshoes
|
||||
*/
|
||||
public final class LunarchInquisitors extends CardImpl {
|
||||
|
||||
public LunarchInquisitors(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.CLERIC);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
this.color.setWhite(true);
|
||||
|
||||
// this card is the second face of double-faced card
|
||||
this.nightCard = true;
|
||||
|
||||
// When this creature transforms into Lunarch Inquisitors, you may exile another target creature until Lunarch Inquisitors leaves the battlefield.
|
||||
Ability ability = new TransformIntoSourceTriggeredAbility(new ExileUntilSourceLeavesEffect(), true);
|
||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private LunarchInquisitors(final LunarchInquisitors card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LunarchInquisitors copy() {
|
||||
return new LunarchInquisitors(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
|
||||
package mage.cards.p;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author fireshoes
|
||||
*/
|
||||
public final class PerfectedForm extends CardImpl {
|
||||
|
||||
public PerfectedForm(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
this.subtype.add(SubType.INSECT);
|
||||
this.subtype.add(SubType.HORROR);
|
||||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(4);
|
||||
this.color.setBlue(true);
|
||||
|
||||
// this card is the second face of double-faced card
|
||||
this.nightCard = true;
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
}
|
||||
|
||||
private PerfectedForm(final PerfectedForm card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PerfectedForm copy() {
|
||||
return new PerfectedForm(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
package mage.cards.s;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.Mana;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.dynamicvalue.common.ControllerLifeCount;
|
||||
import mage.abilities.mana.DynamicManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SuperType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public final class SanctumOfTheSun extends CardImpl {
|
||||
|
||||
public SanctumOfTheSun(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
|
||||
this.nightCard = true;
|
||||
|
||||
// <i>(Transforms from Azor's Gateway.)</i>
|
||||
|
||||
// {T}: Add X mana of any one color, where X is your life total.
|
||||
this.addAbility(new DynamicManaAbility(new Mana(0, 0, 0, 0, 0, 0, 1, 0), ControllerLifeCount.instance, new TapSourceCost(),
|
||||
"Add X mana of any one color, where X is your life total", true));
|
||||
|
||||
}
|
||||
|
||||
private SanctumOfTheSun(final SanctumOfTheSun card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SanctumOfTheSun copy() {
|
||||
return new SanctumOfTheSun(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
package mage.cards.s;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.keyword.LifelinkAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class SeasonedCathar extends CardImpl {
|
||||
|
||||
public SeasonedCathar(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.KNIGHT);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
this.color.setWhite(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// Lifelink
|
||||
this.addAbility(LifelinkAbility.getInstance());
|
||||
}
|
||||
|
||||
private SeasonedCathar(final SeasonedCathar card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SeasonedCathar copy() {
|
||||
return new SeasonedCathar(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
package mage.cards.t;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.common.SacrificeTargetCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesToughness;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.mana.BlackManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class TempleOfAclazotz extends CardImpl {
|
||||
|
||||
public TempleOfAclazotz(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.nightCard = true;
|
||||
|
||||
// {T}: Add {B}
|
||||
this.addAbility(new BlackManaAbility());
|
||||
|
||||
// {T}, Sacrifice a creature: You gain life equal to the sacrificed creature's toughness.
|
||||
Ability ability = new SimpleActivatedAbility(new GainLifeEffect(SacrificeCostCreaturesToughness.instance)
|
||||
.setText("you gain life equal to the sacrificed creature's toughness"), new TapSourceCost());
|
||||
ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private TempleOfAclazotz(final TempleOfAclazotz card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TempleOfAclazotz copy() {
|
||||
return new TempleOfAclazotz(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
package mage.cards.t;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.ActivateIfConditionActivatedAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.CardsInHandCondition;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.hint.ConditionHint;
|
||||
import mage.abilities.hint.Hint;
|
||||
import mage.abilities.mana.BlackManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.ComparisonType;
|
||||
import mage.constants.TargetController;
|
||||
import mage.constants.TimingRule;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author Susucr
|
||||
*/
|
||||
public final class TempleOfTheDead extends CardImpl {
|
||||
|
||||
private static final Condition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 2, TargetController.ANY);
|
||||
private static final Hint hint = new ConditionHint(condition);
|
||||
|
||||
public TempleOfTheDead(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
|
||||
this.nightCard = true;
|
||||
|
||||
// (Transforms from Aclazotz, Deepest Betrayal.)
|
||||
|
||||
// {T}: Add {B}.
|
||||
this.addAbility(new BlackManaAbility());
|
||||
|
||||
// {2}{B}, {T}: Transform Temple of the Dead. Activate only if a player has one or fewer cards in hand and only as a sorcery.
|
||||
Ability ability = new ActivateIfConditionActivatedAbility(
|
||||
new TransformSourceEffect(), new ManaCostsImpl<>("{2}{B}"), condition
|
||||
).setTiming(TimingRule.SORCERY);
|
||||
ability.addCost(new TapSourceCost());
|
||||
this.addAbility(ability.addHint(hint));
|
||||
}
|
||||
|
||||
private TempleOfTheDead(final TempleOfTheDead card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TempleOfTheDead copy() {
|
||||
return new TempleOfTheDead(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,90 +0,0 @@
|
|||
package mage.cards.w;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
|
||||
import mage.abilities.common.WerewolfBackTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Controllable;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.target.common.TargetArtifactPermanent;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author BetaSteward
|
||||
*/
|
||||
public final class WerewolfRansacker extends CardImpl {
|
||||
|
||||
public WerewolfRansacker(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
this.subtype.add(SubType.WEREWOLF);
|
||||
this.color.setRed(true);
|
||||
|
||||
// this card is the second face of double-faced card
|
||||
this.nightCard = true;
|
||||
|
||||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// Whenever this creature transforms into Werewolf Ransacker, you may destroy target artifact. If that artifact is put into a graveyard this way, Werewolf Ransacker deals 3 damage to that artifact's controller.
|
||||
Ability ability = new TransformIntoSourceTriggeredAbility(new WerewolfRansackerEffect(), true, true);
|
||||
ability.addTarget(new TargetArtifactPermanent());
|
||||
this.addAbility(ability);
|
||||
|
||||
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Werewolf Ransacker.
|
||||
this.addAbility(new WerewolfBackTriggeredAbility());
|
||||
}
|
||||
|
||||
private WerewolfRansacker(final WerewolfRansacker card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WerewolfRansacker copy() {
|
||||
return new WerewolfRansacker(this);
|
||||
}
|
||||
}
|
||||
|
||||
class WerewolfRansackerEffect extends OneShotEffect {
|
||||
|
||||
WerewolfRansackerEffect() {
|
||||
super(Outcome.DestroyPermanent);
|
||||
staticText = "destroy target artifact. If that artifact is put into a graveyard this way, " +
|
||||
"{this} deals 3 damage to that artifact's controller";
|
||||
}
|
||||
|
||||
private WerewolfRansackerEffect(final WerewolfRansackerEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WerewolfRansackerEffect copy() {
|
||||
return new WerewolfRansackerEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
|
||||
if (permanent == null) {
|
||||
return false;
|
||||
}
|
||||
permanent.destroy(source, game);
|
||||
if (game.getState().getZone(permanent.getId()) != Zone.GRAVEYARD) {
|
||||
return true;
|
||||
}
|
||||
Optional.ofNullable(permanent)
|
||||
.map(Controllable::getControllerId)
|
||||
.map(game::getPlayer)
|
||||
.ifPresent(player -> player.damage(3, source, game));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,175 +0,0 @@
|
|||
package mage.cards.w;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.dynamicvalue.DynamicValue;
|
||||
import mage.abilities.effects.ContinuousEffectImpl;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
|
||||
import mage.abilities.keyword.*;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.game.ExileZone;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jeffwadsworth
|
||||
*/
|
||||
public final class WretchedBonemass extends CardImpl {
|
||||
|
||||
public WretchedBonemass(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, null);
|
||||
this.nightCard = true;
|
||||
this.color.setBlack(true);
|
||||
|
||||
this.subtype.add(SubType.SKELETON);
|
||||
this.subtype.add(SubType.HORROR);
|
||||
this.power = new MageInt(0);
|
||||
this.toughness = new MageInt(0);
|
||||
|
||||
// Wretched Bonemass’s power and toughness are each equal to the total power of the exiled cards used to craft it.
|
||||
this.addAbility(new SimpleStaticAbility(new SetBasePowerToughnessSourceEffect(WretchedBonemassDynamicValue.instance).setText("{this}'s power and toughness are each equal to the total power of the exiled cards used to craft it.")));
|
||||
|
||||
// Wretched Bonemass has flying as long as an exiled card used to craft it has flying. The same is true for first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, protection, reach, trample, and vigilance.
|
||||
this.addAbility(new SimpleStaticAbility(new WretchedBonemassGainAbilityEffect()));
|
||||
|
||||
}
|
||||
|
||||
private WretchedBonemass(final WretchedBonemass card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WretchedBonemass copy() {
|
||||
return new WretchedBonemass(this);
|
||||
}
|
||||
}
|
||||
|
||||
enum WretchedBonemassDynamicValue implements DynamicValue {
|
||||
instance;
|
||||
|
||||
@Override
|
||||
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||
int totalPower = 0;
|
||||
Permanent permanent = sourceAbility.getSourcePermanentIfItStillExists(game);
|
||||
if (permanent == null) {
|
||||
return 0;
|
||||
}
|
||||
ExileZone exileZone = game
|
||||
.getExile()
|
||||
.getExileZone(CardUtil.getExileZoneId(
|
||||
game, permanent.getId(), permanent.getZoneChangeCounter(game) - 2
|
||||
));
|
||||
if (exileZone == null) {
|
||||
return 0;
|
||||
}
|
||||
for (Card card : exileZone.getCards(game)) {
|
||||
totalPower += card.getPower().getValue();
|
||||
}
|
||||
return totalPower;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WretchedBonemassDynamicValue copy() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage() {
|
||||
return "total power of the exiled cards used to craft it";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "0";
|
||||
}
|
||||
}
|
||||
|
||||
class WretchedBonemassGainAbilityEffect extends ContinuousEffectImpl {
|
||||
|
||||
WretchedBonemassGainAbilityEffect() {
|
||||
super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
|
||||
staticText = "{this} has flying as long as an exiled card used to craft it has flying. The same is true for first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, protection, reach, trample, and vigilance.";
|
||||
}
|
||||
|
||||
private WretchedBonemassGainAbilityEffect(final WretchedBonemassGainAbilityEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WretchedBonemassGainAbilityEffect copy() {
|
||||
return new WretchedBonemassGainAbilityEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent wretchedBonemass = source.getSourcePermanentIfItStillExists(game);
|
||||
if (wretchedBonemass != null) {
|
||||
ExileZone exileZone = game
|
||||
.getExile()
|
||||
.getExileZone(CardUtil.getExileZoneId(
|
||||
game, wretchedBonemass.getId(), wretchedBonemass.getZoneChangeCounter(game) - 2
|
||||
));
|
||||
if (exileZone != null
|
||||
&& !exileZone.isEmpty()) {
|
||||
Set<Card> cardsInExile = exileZone.getCards(game);
|
||||
for (Card card : cardsInExile) {
|
||||
for (Ability a : card.getAbilities()) {
|
||||
if (a instanceof FlyingAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof FirstStrikeAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof DoubleStrikeAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof DeathtouchAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof HasteAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof HexproofAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof IndestructibleAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof LifelinkAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof MenaceAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof ProtectionAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof IndestructibleAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof ReachAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof TrampleAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
if (a instanceof VigilanceAbility) {
|
||||
wretchedBonemass.addAbility(a, source.getSourceId(), game);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -28,19 +28,9 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
|
|||
this.enablePlayBooster(Integer.MAX_VALUE);
|
||||
this.numBoosterDoubleFaced = -1;
|
||||
|
||||
cards.add(new SetCardInfo("Aang and La, Ocean's Fury", 204, Rarity.RARE, mage.cards.a.AangAndLaOceansFury.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang and La, Ocean's Fury", 298, Rarity.RARE, mage.cards.a.AangAndLaOceansFury.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang and La, Ocean's Fury", 347, Rarity.RARE, mage.cards.a.AangAndLaOceansFury.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang and La, Ocean's Fury", 359, Rarity.RARE, mage.cards.a.AangAndLaOceansFury.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang's Iceberg", 336, Rarity.RARE, mage.cards.a.AangsIceberg.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang's Iceberg", 5, Rarity.RARE, mage.cards.a.AangsIceberg.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang's Journey", 1, Rarity.COMMON, mage.cards.a.AangsJourney.class));
|
||||
cards.add(new SetCardInfo("Aang, Destined Savior", 203, Rarity.RARE, mage.cards.a.AangDestinedSavior.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang, Destined Savior", 304, Rarity.RARE, mage.cards.a.AangDestinedSavior.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang, Destined Savior", 346, Rarity.RARE, mage.cards.a.AangDestinedSavior.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang, Master of Elements", 207, Rarity.MYTHIC, mage.cards.a.AangMasterOfElements.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang, Master of Elements", 308, Rarity.MYTHIC, mage.cards.a.AangMasterOfElements.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang, Master of Elements", 363, Rarity.MYTHIC, mage.cards.a.AangMasterOfElements.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang, Swift Savior", 204, Rarity.RARE, mage.cards.a.AangSwiftSavior.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang, Swift Savior", 298, Rarity.RARE, mage.cards.a.AangSwiftSavior.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aang, Swift Savior", 347, Rarity.RARE, mage.cards.a.AangSwiftSavior.class, NON_FULL_USE_VARIOUS));
|
||||
|
|
|
|||
|
|
@ -201,7 +201,6 @@ public final class DarkAscension extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Vorapede", 131, Rarity.MYTHIC, mage.cards.v.Vorapede.class));
|
||||
cards.add(new SetCardInfo("Wakedancer", 79, Rarity.UNCOMMON, mage.cards.w.Wakedancer.class));
|
||||
cards.add(new SetCardInfo("Warden of the Wall", 153, Rarity.UNCOMMON, mage.cards.w.WardenOfTheWall.class));
|
||||
cards.add(new SetCardInfo("Werewolf Ransacker", 81, Rarity.UNCOMMON, mage.cards.w.WerewolfRansacker.class));
|
||||
cards.add(new SetCardInfo("Wild Hunger", 132, Rarity.COMMON, mage.cards.w.WildHunger.class));
|
||||
cards.add(new SetCardInfo("Withengar Unbound", 147, Rarity.MYTHIC, mage.cards.w.WithengarUnbound.class));
|
||||
cards.add(new SetCardInfo("Wolfbitten Captive", 133, Rarity.RARE, mage.cards.w.WolfbittenCaptive.class));
|
||||
|
|
|
|||
|
|
@ -22,9 +22,7 @@ public final class FromTheVaultTransform extends ExpansionSet {
|
|||
|
||||
cards.add(new SetCardInfo("Archangel Avacyn", 1, Rarity.MYTHIC, mage.cards.a.ArchangelAvacyn.class));
|
||||
cards.add(new SetCardInfo("Arguel's Blood Fast", 2, Rarity.MYTHIC, mage.cards.a.ArguelsBloodFast.class));
|
||||
cards.add(new SetCardInfo("Temple of Aclazotz", 2, Rarity.MYTHIC, mage.cards.t.TempleOfAclazotz.class));
|
||||
cards.add(new SetCardInfo("Arlinn Kord", 3, Rarity.MYTHIC, mage.cards.a.ArlinnKord.class));
|
||||
cards.add(new SetCardInfo("Arlinn, Embraced by the Moon", 3, Rarity.MYTHIC, mage.cards.a.ArlinnEmbracedByTheMoon.class));
|
||||
cards.add(new SetCardInfo("Bloodline Keeper", 4, Rarity.MYTHIC, mage.cards.b.BloodlineKeeper.class));
|
||||
cards.add(new SetCardInfo("Lord of Lineage", 4, Rarity.MYTHIC, mage.cards.l.LordOfLineage.class));
|
||||
cards.add(new SetCardInfo("Bruna, the Fading Light", 5, Rarity.MYTHIC, mage.cards.b.BrunaTheFadingLight.class));
|
||||
|
|
|
|||
|
|
@ -144,8 +144,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Dawnhart Disciple", 196, Rarity.COMMON, mage.cards.d.DawnhartDisciple.class));
|
||||
cards.add(new SetCardInfo("Dawnhart Geist", 8, Rarity.UNCOMMON, mage.cards.d.DawnhartGeist.class));
|
||||
cards.add(new SetCardInfo("Daybreak Combatants", 153, Rarity.COMMON, mage.cards.d.DaybreakCombatants.class));
|
||||
cards.add(new SetCardInfo("Deadly Dancer", 141, Rarity.UNCOMMON, mage.cards.d.DeadlyDancer.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Deadly Dancer", 300, Rarity.UNCOMMON, mage.cards.d.DeadlyDancer.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Deathcap Glade", 261, Rarity.RARE, mage.cards.d.DeathcapGlade.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Deathcap Glade", 281, Rarity.RARE, mage.cards.d.DeathcapGlade.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Demonic Bargain", 103, Rarity.RARE, mage.cards.d.DemonicBargain.class, NON_FULL_USE_VARIOUS));
|
||||
|
|
@ -262,8 +260,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Heron-Blessed Geist", 19, Rarity.COMMON, mage.cards.h.HeronBlessedGeist.class));
|
||||
cards.add(new SetCardInfo("Hiveheart Shaman", 202, Rarity.RARE, mage.cards.h.HiveheartShaman.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Hiveheart Shaman", 390, Rarity.RARE, mage.cards.h.HiveheartShaman.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Hollowhenge Huntmaster", 187, Rarity.MYTHIC, mage.cards.h.HollowhengeHuntmaster.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Hollowhenge Huntmaster", 384, Rarity.MYTHIC, mage.cards.h.HollowhengeHuntmaster.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Honeymoon Hearse", 160, Rarity.UNCOMMON, mage.cards.h.HoneymoonHearse.class));
|
||||
cards.add(new SetCardInfo("Honored Heirloom", 257, Rarity.COMMON, mage.cards.h.HonoredHeirloom.class));
|
||||
cards.add(new SetCardInfo("Hookhand Mariner", 203, Rarity.COMMON, mage.cards.h.HookhandMariner.class));
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Alchemist's Gambit", 407, Rarity.RARE, mage.cards.a.AlchemistsGambit.class));
|
||||
cards.add(new SetCardInfo("Alchemist's Retrieval", 314, Rarity.COMMON, mage.cards.a.AlchemistsRetrieval.class));
|
||||
cards.add(new SetCardInfo("Alluring Suitor", 408, Rarity.UNCOMMON, mage.cards.a.AlluringSuitor.class));
|
||||
cards.add(new SetCardInfo("Ambitious Farmhand", 2, Rarity.UNCOMMON, mage.cards.a.AmbitiousFarmhand.class));
|
||||
cards.add(new SetCardInfo("Ancestor's Embrace", 289, Rarity.COMMON, mage.cards.a.AncestorsEmbrace.class));
|
||||
cards.add(new SetCardInfo("Ancestral Anger", 409, Rarity.COMMON, mage.cards.a.AncestralAnger.class));
|
||||
cards.add(new SetCardInfo("Ancient Lumberknot", 497, Rarity.UNCOMMON, mage.cards.a.AncientLumberknot.class));
|
||||
|
|
@ -47,7 +46,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Archghoul of Thraben", 360, Rarity.UNCOMMON, mage.cards.a.ArchghoulOfThraben.class));
|
||||
cards.add(new SetCardInfo("Archive Haunt", 68, Rarity.UNCOMMON, mage.cards.a.ArchiveHaunt.class));
|
||||
cards.add(new SetCardInfo("Ardent Elementalist", 128, Rarity.COMMON, mage.cards.a.ArdentElementalist.class));
|
||||
cards.add(new SetCardInfo("Arlinn, the Moon's Fury", 211, Rarity.MYTHIC, mage.cards.a.ArlinnTheMoonsFury.class));
|
||||
cards.add(new SetCardInfo("Arlinn, the Pack's Hope", 211, Rarity.MYTHIC, mage.cards.a.ArlinnThePacksHope.class));
|
||||
cards.add(new SetCardInfo("Arm the Cathars", 270, Rarity.UNCOMMON, mage.cards.a.ArmTheCathars.class));
|
||||
cards.add(new SetCardInfo("Arrogant Outlaw", 84, Rarity.COMMON, mage.cards.a.ArrogantOutlaw.class));
|
||||
|
|
@ -175,7 +173,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Dawnhart Rejuvenator", 180, Rarity.COMMON, mage.cards.d.DawnhartRejuvenator.class));
|
||||
cards.add(new SetCardInfo("Dawnhart Wardens", 216, Rarity.UNCOMMON, mage.cards.d.DawnhartWardens.class));
|
||||
cards.add(new SetCardInfo("Daybreak Combatants", 420, Rarity.COMMON, mage.cards.d.DaybreakCombatants.class));
|
||||
cards.add(new SetCardInfo("Deadly Dancer", 408, Rarity.UNCOMMON, mage.cards.d.DeadlyDancer.class));
|
||||
cards.add(new SetCardInfo("Deathbonnet Hulk", 181, Rarity.UNCOMMON, mage.cards.d.DeathbonnetHulk.class));
|
||||
cards.add(new SetCardInfo("Deathbonnet Sprout", 181, Rarity.UNCOMMON, mage.cards.d.DeathbonnetSprout.class));
|
||||
cards.add(new SetCardInfo("Deathcap Glade", 528, Rarity.RARE, mage.cards.d.DeathcapGlade.class));
|
||||
|
|
@ -320,7 +317,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Heron-Blessed Geist", 286, Rarity.COMMON, mage.cards.h.HeronBlessedGeist.class));
|
||||
cards.add(new SetCardInfo("Hiveheart Shaman", 469, Rarity.RARE, mage.cards.h.HiveheartShaman.class));
|
||||
cards.add(new SetCardInfo("Hobbling Zombie", 106, Rarity.COMMON, mage.cards.h.HobblingZombie.class));
|
||||
cards.add(new SetCardInfo("Hollowhenge Huntmaster", 454, Rarity.MYTHIC, mage.cards.h.HollowhengeHuntmaster.class));
|
||||
cards.add(new SetCardInfo("Homestead Courage", 24, Rarity.COMMON, mage.cards.h.HomesteadCourage.class));
|
||||
cards.add(new SetCardInfo("Honeymoon Hearse", 427, Rarity.UNCOMMON, mage.cards.h.HoneymoonHearse.class));
|
||||
cards.add(new SetCardInfo("Honored Heirloom", 524, Rarity.COMMON, mage.cards.h.HonoredHeirloom.class));
|
||||
|
|
@ -506,7 +502,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Screaming Swarm", 342, Rarity.UNCOMMON, mage.cards.s.ScreamingSwarm.class));
|
||||
cards.add(new SetCardInfo("Seafaring Werewolf", 80, Rarity.RARE, mage.cards.s.SeafaringWerewolf.class));
|
||||
cards.add(new SetCardInfo("Search Party Captain", 32, Rarity.COMMON, mage.cards.s.SearchPartyCaptain.class));
|
||||
cards.add(new SetCardInfo("Seasoned Cathar", 2, Rarity.UNCOMMON, mage.cards.s.SeasonedCathar.class));
|
||||
cards.add(new SetCardInfo("Secrets of the Key", 73, Rarity.COMMON, mage.cards.s.SecretsOfTheKey.class));
|
||||
cards.add(new SetCardInfo("Seize the Storm", 158, Rarity.UNCOMMON, mage.cards.s.SeizeTheStorm.class));
|
||||
cards.add(new SetCardInfo("Selhoff Entomber", 343, Rarity.COMMON, mage.cards.s.SelhoffEntomber.class));
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Abandon the Post", 127, Rarity.COMMON, mage.cards.a.AbandonThePost.class));
|
||||
cards.add(new SetCardInfo("Adeline, Resplendent Cathar", 1, Rarity.RARE, mage.cards.a.AdelineResplendentCathar.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Adeline, Resplendent Cathar", 312, Rarity.RARE, mage.cards.a.AdelineResplendentCathar.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ambitious Farmhand", 2, Rarity.UNCOMMON, mage.cards.a.AmbitiousFarmhand.class));
|
||||
cards.add(new SetCardInfo("Angelfire Ignition", 209, Rarity.RARE, mage.cards.a.AngelfireIgnition.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Angelfire Ignition", 367, Rarity.RARE, mage.cards.a.AngelfireIgnition.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Angelic Enforcer", 17, Rarity.MYTHIC, mage.cards.a.AngelicEnforcer.class, NON_FULL_USE_VARIOUS));
|
||||
|
|
@ -50,9 +49,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Arcane Infusion", 210, Rarity.UNCOMMON, mage.cards.a.ArcaneInfusion.class));
|
||||
cards.add(new SetCardInfo("Archive Haunt", 68, Rarity.UNCOMMON, mage.cards.a.ArchiveHaunt.class));
|
||||
cards.add(new SetCardInfo("Ardent Elementalist", 128, Rarity.COMMON, mage.cards.a.ArdentElementalist.class));
|
||||
cards.add(new SetCardInfo("Arlinn, the Moon's Fury", 211, Rarity.MYTHIC, mage.cards.a.ArlinnTheMoonsFury.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Arlinn, the Moon's Fury", 279, Rarity.MYTHIC, mage.cards.a.ArlinnTheMoonsFury.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Arlinn, the Moon's Fury", 307, Rarity.MYTHIC, mage.cards.a.ArlinnTheMoonsFury.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Arlinn, the Pack's Hope", 211, Rarity.MYTHIC, mage.cards.a.ArlinnThePacksHope.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Arlinn, the Pack's Hope", 279, Rarity.MYTHIC, mage.cards.a.ArlinnThePacksHope.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Arlinn, the Pack's Hope", 307, Rarity.MYTHIC, mage.cards.a.ArlinnThePacksHope.class, NON_FULL_USE_VARIOUS));
|
||||
|
|
@ -386,7 +382,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Seafaring Werewolf", 288, Rarity.RARE, mage.cards.s.SeafaringWerewolf.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Seafaring Werewolf", 80, Rarity.RARE, mage.cards.s.SeafaringWerewolf.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Search Party Captain", 32, Rarity.COMMON, mage.cards.s.SearchPartyCaptain.class));
|
||||
cards.add(new SetCardInfo("Seasoned Cathar", 2, Rarity.UNCOMMON, mage.cards.s.SeasonedCathar.class));
|
||||
cards.add(new SetCardInfo("Secrets of the Key", 73, Rarity.COMMON, mage.cards.s.SecretsOfTheKey.class));
|
||||
cards.add(new SetCardInfo("Seize the Storm", 158, Rarity.UNCOMMON, mage.cards.s.SeizeTheStorm.class));
|
||||
cards.add(new SetCardInfo("Shadowbeast Sighting", 198, Rarity.COMMON, mage.cards.s.ShadowbeastSighting.class));
|
||||
|
|
|
|||
|
|
@ -35,8 +35,6 @@ public class InnistradRemastered extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Alchemist's Greeting", 140, Rarity.COMMON, mage.cards.a.AlchemistsGreeting.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Alchemist's Greeting", 393, Rarity.COMMON, mage.cards.a.AlchemistsGreeting.class,RETRO_ART_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Altered Ego", 228, Rarity.RARE, mage.cards.a.AlteredEgo.class));
|
||||
cards.add(new SetCardInfo("Ambitious Farmhand", 448, Rarity.UNCOMMON, mage.cards.a.AmbitiousFarmhand.class, RETRO_ART_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ambitious Farmhand", 8, Rarity.UNCOMMON, mage.cards.a.AmbitiousFarmhand.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ambush Viper", 186, Rarity.COMMON, mage.cards.a.AmbushViper.class));
|
||||
cards.add(new SetCardInfo("Ancestral Anger", 141, Rarity.COMMON, mage.cards.a.AncestralAnger.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ancestral Anger", 394, Rarity.COMMON, mage.cards.a.AncestralAnger.class,RETRO_ART_USE_VARIOUS));
|
||||
|
|
@ -52,8 +50,6 @@ public class InnistradRemastered extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Archghoul of Thraben", 95, Rarity.UNCOMMON, mage.cards.a.ArchghoulOfThraben.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Arlinn Kord", 230, Rarity.MYTHIC, mage.cards.a.ArlinnKord.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Arlinn Kord", 324, Rarity.MYTHIC, mage.cards.a.ArlinnKord.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Arlinn, Embraced by the Moon", 230, Rarity.MYTHIC, mage.cards.a.ArlinnEmbracedByTheMoon.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Arlinn, Embraced by the Moon", 324, Rarity.MYTHIC, mage.cards.a.ArlinnEmbracedByTheMoon.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ashmouth Blade", 269, Rarity.UNCOMMON, mage.cards.a.AshmouthBlade.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ashmouth Blade", 473, Rarity.UNCOMMON, mage.cards.a.AshmouthBlade.class, RETRO_ART_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Asylum Visitor", 371, Rarity.UNCOMMON, mage.cards.a.AsylumVisitor.class, RETRO_ART_USE_VARIOUS));
|
||||
|
|
@ -409,8 +405,6 @@ public class InnistradRemastered extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Overgrown Farmland", 281, Rarity.RARE, mage.cards.o.OvergrownFarmland.class));
|
||||
cards.add(new SetCardInfo("Pack Guardian", 211, Rarity.UNCOMMON, mage.cards.p.PackGuardian.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Pack Guardian", 416, Rarity.UNCOMMON, mage.cards.p.PackGuardian.class, RETRO_ART_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Perfected Form", 454, Rarity.UNCOMMON, mage.cards.p.PerfectedForm.class, RETRO_ART_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Perfected Form", 52, Rarity.UNCOMMON, mage.cards.p.PerfectedForm.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Plains", 288, Rarity.LAND, mage.cards.basiclands.Plains.class, RETRO_ART_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Plains", 289, Rarity.LAND, mage.cards.basiclands.Plains.class, RETRO_ART_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Rally the Peasants", 347, Rarity.UNCOMMON, mage.cards.r.RallyThePeasants.class, RETRO_ART_USE_VARIOUS));
|
||||
|
|
@ -432,8 +426,6 @@ public class InnistradRemastered extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Scorned Villager", 212, Rarity.COMMON, mage.cards.s.ScornedVillager.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Scorned Villager", 468, Rarity.COMMON, mage.cards.s.ScornedVillager.class, RETRO_ART_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Scrounged Scythe", 265, Rarity.COMMON, mage.cards.s.ScroungedScythe.class));
|
||||
cards.add(new SetCardInfo("Seasoned Cathar", 448, Rarity.UNCOMMON, mage.cards.s.SeasonedCathar.class, RETRO_ART_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Seasoned Cathar", 8, Rarity.UNCOMMON, mage.cards.s.SeasonedCathar.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Second Harvest", 213, Rarity.RARE, mage.cards.s.SecondHarvest.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Second Harvest", 417, Rarity.RARE, mage.cards.s.SecondHarvest.class, RETRO_ART_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Seize the Storm", 170, Rarity.COMMON, mage.cards.s.SeizeTheStorm.class, NON_FULL_USE_VARIOUS));
|
||||
|
|
|
|||
|
|
@ -299,7 +299,6 @@ public final class Ixalan extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Swashbuckling", 167, Rarity.COMMON, mage.cards.s.Swashbuckling.class));
|
||||
cards.add(new SetCardInfo("Sword-Point Diplomacy", 126, Rarity.RARE, mage.cards.s.SwordPointDiplomacy.class));
|
||||
cards.add(new SetCardInfo("Tempest Caller", 86, Rarity.UNCOMMON, mage.cards.t.TempestCaller.class));
|
||||
cards.add(new SetCardInfo("Temple of Aclazotz", 90, Rarity.RARE, mage.cards.t.TempleOfAclazotz.class));
|
||||
cards.add(new SetCardInfo("Territorial Hammerskull", 41, Rarity.COMMON, mage.cards.t.TerritorialHammerskull.class));
|
||||
cards.add(new SetCardInfo("Thaumatic Compass", 249, Rarity.RARE, mage.cards.t.ThaumaticCompass.class));
|
||||
cards.add(new SetCardInfo("Thrash of Raptors", 168, Rarity.COMMON, mage.cards.t.ThrashOfRaptors.class));
|
||||
|
|
|
|||
|
|
@ -128,7 +128,6 @@ public class IxalanPromos extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Sunpetal Grove", "257s", Rarity.RARE, mage.cards.s.SunpetalGrove.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Sword-Point Diplomacy", "126p", Rarity.RARE, mage.cards.s.SwordPointDiplomacy.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Sword-Point Diplomacy", "126s", Rarity.RARE, mage.cards.s.SwordPointDiplomacy.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Temple of Aclazotz", "90s", Rarity.RARE, mage.cards.t.TempleOfAclazotz.class));
|
||||
cards.add(new SetCardInfo("Thaumatic Compass", "249s", Rarity.RARE, mage.cards.t.ThaumaticCompass.class));
|
||||
cards.add(new SetCardInfo("Tilonalli's Skinshifter", "170s", Rarity.RARE, mage.cards.t.TilonallisSkinshifter.class));
|
||||
cards.add(new SetCardInfo("Tishana, Voice of Thunder", "230s", Rarity.MYTHIC, mage.cards.t.TishanaVoiceOfThunder.class));
|
||||
|
|
|
|||
|
|
@ -4,9 +4,6 @@ import mage.cards.ExpansionSet;
|
|||
import mage.constants.Rarity;
|
||||
import mage.constants.SetType;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* https://scryfall.com/sets/prm
|
||||
*/
|
||||
|
|
@ -159,7 +156,6 @@ public class MagicOnlinePromos extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Argivian Archaeologist", 219, Rarity.RARE, mage.cards.a.ArgivianArchaeologist.class, RETRO_ART));
|
||||
cards.add(new SetCardInfo("Argothian Enchantress", 36104, Rarity.RARE, mage.cards.a.ArgothianEnchantress.class, RETRO_ART));
|
||||
cards.add(new SetCardInfo("Arid Mesa", 91405, Rarity.RARE, mage.cards.a.AridMesa.class));
|
||||
cards.add(new SetCardInfo("Arlinn, the Moon's Fury", 94060, Rarity.MYTHIC, mage.cards.a.ArlinnTheMoonsFury.class));
|
||||
cards.add(new SetCardInfo("Arlinn, the Pack's Hope", 94060, Rarity.MYTHIC, mage.cards.a.ArlinnThePacksHope.class));
|
||||
cards.add(new SetCardInfo("Arlinn, Voice of the Pack", 72239, Rarity.UNCOMMON, mage.cards.a.ArlinnVoiceOfThePack.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Arlinn, Voice of the Pack", 77973, Rarity.UNCOMMON, mage.cards.a.ArlinnVoiceOfThePack.class, NON_FULL_USE_VARIOUS));
|
||||
|
|
@ -1233,7 +1229,6 @@ public class MagicOnlinePromos extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Hoard Hauler", 99747, Rarity.RARE, mage.cards.h.HoardHauler.class));
|
||||
cards.add(new SetCardInfo("Hobgoblin Bandit Lord", 92734, Rarity.RARE, mage.cards.h.HobgoblinBanditLord.class));
|
||||
cards.add(new SetCardInfo("Hofri Ghostforge", 90278, Rarity.MYTHIC, mage.cards.h.HofriGhostforge.class));
|
||||
cards.add(new SetCardInfo("Hollowhenge Huntmaster", 95433, Rarity.MYTHIC, mage.cards.h.HollowhengeHuntmaster.class));
|
||||
cards.add(new SetCardInfo("Hollowhenge Overlord", 95419, Rarity.RARE, mage.cards.h.HollowhengeOverlord.class));
|
||||
cards.add(new SetCardInfo("Honor of the Pure", 43554, Rarity.RARE, mage.cards.h.HonorOfThePure.class));
|
||||
cards.add(new SetCardInfo("Honored Hierarch", 57598, Rarity.RARE, mage.cards.h.HonoredHierarch.class));
|
||||
|
|
|
|||
|
|
@ -2,15 +2,15 @@ package mage.sets;
|
|||
|
||||
import mage.cards.Card;
|
||||
import mage.cards.ExpansionSet;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.SetType;
|
||||
import mage.util.RandomUtil;
|
||||
import mage.cards.repository.CardCriteria;
|
||||
import mage.cards.repository.CardRepository;
|
||||
import mage.collation.BoosterCollator;
|
||||
import mage.collation.BoosterStructure;
|
||||
import mage.collation.CardRun;
|
||||
import mage.collation.RarityConfiguration;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.SetType;
|
||||
import mage.util.RandomUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
|
@ -62,8 +62,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Awaken the Maelstrom", 230, Rarity.RARE, mage.cards.a.AwakenTheMaelstrom.class));
|
||||
cards.add(new SetCardInfo("Awakened Skyclave", 194, Rarity.UNCOMMON, mage.cards.a.AwakenedSkyclave.class));
|
||||
cards.add(new SetCardInfo("Axgard Artisan", 332, Rarity.UNCOMMON, mage.cards.a.AxgardArtisan.class));
|
||||
cards.add(new SetCardInfo("Ayara, Furnace Queen", 296, Rarity.RARE, mage.cards.a.AyaraFurnaceQueen.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ayara, Furnace Queen", 90, Rarity.RARE, mage.cards.a.AyaraFurnaceQueen.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ayara, Widow of the Realm", 296, Rarity.RARE, mage.cards.a.AyaraWidowOfTheRealm.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ayara, Widow of the Realm", 90, Rarity.RARE, mage.cards.a.AyaraWidowOfTheRealm.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Baral and Kari Zev", 218, Rarity.RARE, mage.cards.b.BaralAndKariZev.class, NON_FULL_USE_VARIOUS));
|
||||
|
|
@ -178,7 +176,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Ghalta and Mavren", 307, Rarity.RARE, mage.cards.g.GhaltaAndMavren.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ghalta and Mavren", 386, Rarity.RARE, mage.cards.g.GhaltaAndMavren.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Gift of Compleation", 106, Rarity.UNCOMMON, mage.cards.g.GiftOfCompleation.class));
|
||||
cards.add(new SetCardInfo("Gitaxian Mindstinger", 88, Rarity.COMMON, mage.cards.g.GitaxianMindstinger.class));
|
||||
cards.add(new SetCardInfo("Gitaxian Spellstalker", 151, Rarity.UNCOMMON, mage.cards.g.GitaxianSpellstalker.class));
|
||||
cards.add(new SetCardInfo("Glissa, Herald of Predation", 226, Rarity.RARE, mage.cards.g.GlissaHeraldOfPredation.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Glissa, Herald of Predation", 308, Rarity.RARE, mage.cards.g.GlissaHeraldOfPredation.class, NON_FULL_USE_VARIOUS));
|
||||
|
|
|
|||
|
|
@ -41,9 +41,6 @@ public final class ModernHorizons3 extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Aether Spike", 50, Rarity.COMMON, mage.cards.a.AetherSpike.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Aether Spike", 398, Rarity.COMMON, mage.cards.a.AetherSpike.class, RETRO_ART_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ajani Fells the Godsire", 19, Rarity.UNCOMMON, mage.cards.a.AjaniFellsTheGodsire.class));
|
||||
cards.add(new SetCardInfo("Ajani, Nacatl Avenger", 237, Rarity.MYTHIC, mage.cards.a.AjaniNacatlAvenger.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ajani, Nacatl Avenger", 442, Rarity.MYTHIC, mage.cards.a.AjaniNacatlAvenger.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ajani, Nacatl Avenger", 468, Rarity.MYTHIC, mage.cards.a.AjaniNacatlAvenger.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ajani, Nacatl Pariah", 237, Rarity.MYTHIC, mage.cards.a.AjaniNacatlPariah.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ajani, Nacatl Pariah", 442, Rarity.MYTHIC, mage.cards.a.AjaniNacatlPariah.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Ajani, Nacatl Pariah", 468, Rarity.MYTHIC, mage.cards.a.AjaniNacatlPariah.class, NON_FULL_USE_VARIOUS));
|
||||
|
|
|
|||
|
|
@ -182,7 +182,6 @@ public final class RivalsOfIxalan extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Riverwise Augur", 48, Rarity.UNCOMMON, mage.cards.r.RiverwiseAugur.class));
|
||||
cards.add(new SetCardInfo("Sadistic Skymarcher", 85, Rarity.UNCOMMON, mage.cards.s.SadisticSkymarcher.class));
|
||||
cards.add(new SetCardInfo("Sailor of Means", 49, Rarity.COMMON, mage.cards.s.SailorOfMeans.class));
|
||||
cards.add(new SetCardInfo("Sanctum of the Sun", 176, Rarity.MYTHIC, mage.cards.s.SanctumOfTheSun.class));
|
||||
cards.add(new SetCardInfo("Sanguine Glorifier", 20, Rarity.COMMON, mage.cards.s.SanguineGlorifier.class));
|
||||
cards.add(new SetCardInfo("Sea Legs", 50, Rarity.COMMON, mage.cards.s.SeaLegs.class));
|
||||
cards.add(new SetCardInfo("Seafloor Oracle", 51, Rarity.RARE, mage.cards.s.SeafloorOracle.class));
|
||||
|
|
|
|||
|
|
@ -80,7 +80,6 @@ public class RivalsOfIxalanPromos extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Rekindling Phoenix", "111p", Rarity.MYTHIC, mage.cards.r.RekindlingPhoenix.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Rekindling Phoenix", "111s", Rarity.MYTHIC, mage.cards.r.RekindlingPhoenix.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Release to the Wind", "46s", Rarity.RARE, mage.cards.r.ReleaseToTheWind.class));
|
||||
cards.add(new SetCardInfo("Sanctum of the Sun", "176s", Rarity.MYTHIC, mage.cards.s.SanctumOfTheSun.class));
|
||||
cards.add(new SetCardInfo("Seafloor Oracle", "51p", Rarity.RARE, mage.cards.s.SeafloorOracle.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Seafloor Oracle", "51s", Rarity.RARE, mage.cards.s.SeafloorOracle.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Siegehorn Ceratops", "171p", Rarity.RARE, mage.cards.s.SiegehornCeratops.class, NON_FULL_USE_VARIOUS));
|
||||
|
|
|
|||
|
|
@ -1609,7 +1609,6 @@ public class SecretLairDrop extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Scrying Sheets", 1606, Rarity.RARE, mage.cards.s.ScryingSheets.class));
|
||||
cards.add(new SetCardInfo("Thespian's Stage", 1607, Rarity.RARE, mage.cards.t.ThespiansStage.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Avabruck Caretaker", 1608, Rarity.MYTHIC, mage.cards.a.AvabruckCaretaker.class));
|
||||
cards.add(new SetCardInfo("Hollowhenge Huntmaster", 1608, Rarity.MYTHIC, mage.cards.h.HollowhengeHuntmaster.class));
|
||||
cards.add(new SetCardInfo("Beastmaster Ascension", 1609, Rarity.RARE, mage.cards.b.BeastmasterAscension.class));
|
||||
cards.add(new SetCardInfo("Howl of the Night Pack", 1610, Rarity.RARE, mage.cards.h.HowlOfTheNightPack.class));
|
||||
cards.add(new SetCardInfo("Second Harvest", 1611, Rarity.RARE, mage.cards.s.SecondHarvest.class));
|
||||
|
|
|
|||
|
|
@ -43,14 +43,12 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Alms of the Vein", 98, Rarity.COMMON, mage.cards.a.AlmsOfTheVein.class));
|
||||
cards.add(new SetCardInfo("Altered Ego", 241, Rarity.RARE, mage.cards.a.AlteredEgo.class));
|
||||
cards.add(new SetCardInfo("Always Watching", 1, Rarity.RARE, mage.cards.a.AlwaysWatching.class));
|
||||
cards.add(new SetCardInfo("Ancient of the Equinox", 194, Rarity.UNCOMMON, mage.cards.a.AncientOfTheEquinox.class));
|
||||
cards.add(new SetCardInfo("Angel of Deliverance", 2, Rarity.RARE, mage.cards.a.AngelOfDeliverance.class));
|
||||
cards.add(new SetCardInfo("Angelic Purge", 3, Rarity.COMMON, mage.cards.a.AngelicPurge.class));
|
||||
cards.add(new SetCardInfo("Anguished Unmaking", 242, Rarity.RARE, mage.cards.a.AnguishedUnmaking.class));
|
||||
cards.add(new SetCardInfo("Apothecary Geist", 4, Rarity.COMMON, mage.cards.a.ApothecaryGeist.class));
|
||||
cards.add(new SetCardInfo("Archangel Avacyn", 5, Rarity.MYTHIC, mage.cards.a.ArchangelAvacyn.class));
|
||||
cards.add(new SetCardInfo("Arlinn Kord", 243, Rarity.MYTHIC, mage.cards.a.ArlinnKord.class));
|
||||
cards.add(new SetCardInfo("Arlinn, Embraced by the Moon", 243, Rarity.MYTHIC, mage.cards.a.ArlinnEmbracedByTheMoon.class));
|
||||
cards.add(new SetCardInfo("Ashmouth Blade", 260, Rarity.UNCOMMON, mage.cards.a.AshmouthBlade.class));
|
||||
cards.add(new SetCardInfo("Asylum Visitor", 99, Rarity.RARE, mage.cards.a.AsylumVisitor.class));
|
||||
cards.add(new SetCardInfo("Autumnal Gloom", 194, Rarity.UNCOMMON, mage.cards.a.AutumnalGloom.class));
|
||||
|
|
@ -175,7 +173,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Incorrigible Youths", 166, Rarity.UNCOMMON, mage.cards.i.IncorrigibleYouths.class));
|
||||
cards.add(new SetCardInfo("Indulgent Aristocrat", 118, Rarity.UNCOMMON, mage.cards.i.IndulgentAristocrat.class));
|
||||
cards.add(new SetCardInfo("Inexorable Blob", 212, Rarity.RARE, mage.cards.i.InexorableBlob.class));
|
||||
cards.add(new SetCardInfo("Infectious Curse", 97, Rarity.UNCOMMON, mage.cards.i.InfectiousCurse.class));
|
||||
cards.add(new SetCardInfo("Inner Struggle", 167, Rarity.UNCOMMON, mage.cards.i.InnerStruggle.class));
|
||||
cards.add(new SetCardInfo("Inquisitor's Ox", 24, Rarity.COMMON, mage.cards.i.InquisitorsOx.class));
|
||||
cards.add(new SetCardInfo("Insidious Mist", 108, Rarity.RARE, mage.cards.i.InsidiousMist.class));
|
||||
|
|
@ -200,7 +197,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Liliana's Indignation", 120, Rarity.UNCOMMON, mage.cards.l.LilianasIndignation.class));
|
||||
cards.add(new SetCardInfo("Loam Dryad", 216, Rarity.COMMON, mage.cards.l.LoamDryad.class));
|
||||
cards.add(new SetCardInfo("Lone Wolf of the Natterknolls", 209, Rarity.UNCOMMON, mage.cards.l.LoneWolfOfTheNatterknolls.class));
|
||||
cards.add(new SetCardInfo("Lunarch Inquisitors", 6, Rarity.UNCOMMON, mage.cards.l.LunarchInquisitors.class));
|
||||
cards.add(new SetCardInfo("Macabre Waltz", 121, Rarity.COMMON, mage.cards.m.MacabreWaltz.class));
|
||||
cards.add(new SetCardInfo("Mad Prophet", 171, Rarity.UNCOMMON, mage.cards.m.MadProphet.class));
|
||||
cards.add(new SetCardInfo("Magmatic Chasm", 172, Rarity.COMMON, mage.cards.m.MagmaticChasm.class));
|
||||
|
|
@ -242,7 +238,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Pack Guardian", 221, Rarity.UNCOMMON, mage.cards.p.PackGuardian.class));
|
||||
cards.add(new SetCardInfo("Pale Rider of Trostad", 128, Rarity.UNCOMMON, mage.cards.p.PaleRiderOfTrostad.class));
|
||||
cards.add(new SetCardInfo("Paranoid Parish-Blade", 33, Rarity.UNCOMMON, mage.cards.p.ParanoidParishBlade.class));
|
||||
cards.add(new SetCardInfo("Perfected Form", 49, Rarity.UNCOMMON, mage.cards.p.PerfectedForm.class));
|
||||
cards.add(new SetCardInfo("Pick the Brain", 129, Rarity.UNCOMMON, mage.cards.p.PickTheBrain.class));
|
||||
cards.add(new SetCardInfo("Pieces of the Puzzle", 78, Rarity.COMMON, mage.cards.p.PiecesOfThePuzzle.class));
|
||||
cards.add(new SetCardInfo("Pious Evangel", 34, Rarity.UNCOMMON, mage.cards.p.PiousEvangel.class));
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ public class ShadowsOverInnistradPromos extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Anguished Unmaking", 242, Rarity.RARE, mage.cards.a.AnguishedUnmaking.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Archangel Avacyn", "5s", Rarity.MYTHIC, mage.cards.a.ArchangelAvacyn.class));
|
||||
cards.add(new SetCardInfo("Arlinn Kord", "243s", Rarity.MYTHIC, mage.cards.a.ArlinnKord.class));
|
||||
cards.add(new SetCardInfo("Arlinn, Embraced by the Moon", "243s", Rarity.MYTHIC, mage.cards.a.ArlinnEmbracedByTheMoon.class));
|
||||
cards.add(new SetCardInfo("Asylum Visitor", "99s", Rarity.RARE, mage.cards.a.AsylumVisitor.class));
|
||||
cards.add(new SetCardInfo("Avacyn's Judgment", "145s", Rarity.RARE, mage.cards.a.AvacynsJudgment.class));
|
||||
cards.add(new SetCardInfo("Awoken Horror", "92s", Rarity.RARE, mage.cards.a.AwokenHorror.class));
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Apothecary Geist", 12, Rarity.COMMON, mage.cards.a.ApothecaryGeist.class));
|
||||
cards.add(new SetCardInfo("Archangel Avacyn", 13, Rarity.MYTHIC, mage.cards.a.ArchangelAvacyn.class));
|
||||
cards.add(new SetCardInfo("Arlinn Kord", 230, Rarity.MYTHIC, mage.cards.a.ArlinnKord.class));
|
||||
cards.add(new SetCardInfo("Arlinn, Embraced by the Moon", 230, Rarity.MYTHIC, mage.cards.a.ArlinnEmbracedByTheMoon.class));
|
||||
cards.add(new SetCardInfo("Ashmouth Blade", 256, Rarity.UNCOMMON, mage.cards.a.AshmouthBlade.class));
|
||||
cards.add(new SetCardInfo("Assembled Alphas", 141, Rarity.RARE, mage.cards.a.AssembledAlphas.class));
|
||||
cards.add(new SetCardInfo("Aurora of Emrakul", 248, Rarity.UNCOMMON, mage.cards.a.AuroraOfEmrakul.class));
|
||||
|
|
@ -182,7 +181,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Incendiary Flow", 163, Rarity.COMMON, mage.cards.i.IncendiaryFlow.class));
|
||||
cards.add(new SetCardInfo("Incited Rabble", 53, Rarity.UNCOMMON, mage.cards.i.IncitedRabble.class));
|
||||
cards.add(new SetCardInfo("Indulgent Aristocrat", 118, Rarity.UNCOMMON, mage.cards.i.IndulgentAristocrat.class));
|
||||
cards.add(new SetCardInfo("Infectious Curse", 97, Rarity.UNCOMMON, mage.cards.i.InfectiousCurse.class));
|
||||
cards.add(new SetCardInfo("Ingenious Skaab", 75, Rarity.COMMON, mage.cards.i.IngeniousSkaab.class));
|
||||
cards.add(new SetCardInfo("Insatiable Gorgers", 164, Rarity.COMMON, mage.cards.i.InsatiableGorgers.class));
|
||||
cards.add(new SetCardInfo("Insolent Neonate", 165, Rarity.COMMON, mage.cards.i.InsolentNeonate.class));
|
||||
|
|
|
|||
|
|
@ -99,7 +99,6 @@ public final class StarWars extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Darth Maul", 178, Rarity.RARE, mage.cards.d.DarthMaul.class));
|
||||
cards.add(new SetCardInfo("Darth Sidious, Sith Lord", 179, Rarity.MYTHIC, mage.cards.d.DarthSidiousSithLord.class));
|
||||
cards.add(new SetCardInfo("Darth Tyranus, Count of Serenno", 180, Rarity.MYTHIC, mage.cards.d.DarthTyranusCountOfSerenno.class));
|
||||
cards.add(new SetCardInfo("Darth Vader", 140, Rarity.MYTHIC, mage.cards.d.DarthVader.class));
|
||||
cards.add(new SetCardInfo("Death Trooper", 71, Rarity.UNCOMMON, mage.cards.d.DeathTrooper.class));
|
||||
cards.add(new SetCardInfo("Delay Tactic", 504, Rarity.COMMON, mage.cards.d.DelayTactic.class));
|
||||
cards.add(new SetCardInfo("Deploy The Troops", 8, Rarity.UNCOMMON, mage.cards.d.DeployTheTroops.class));
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
package mage.sets;
|
||||
|
||||
import mage.cards.ExpansionSet;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.SetType;
|
||||
import mage.collation.BoosterCollator;
|
||||
import mage.collation.BoosterStructure;
|
||||
import mage.collation.CardRun;
|
||||
import mage.collation.RarityConfiguration;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.SetType;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
|
@ -432,8 +432,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Temple of Cyclical Time", 67, Rarity.MYTHIC, mage.cards.t.TempleOfCyclicalTime.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Temple of Power", 158, Rarity.MYTHIC, mage.cards.t.TempleOfPower.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Temple of Power", 317, Rarity.MYTHIC, mage.cards.t.TempleOfPower.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Temple of the Dead", 316, Rarity.MYTHIC, mage.cards.t.TempleOfTheDead.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Temple of the Dead", 88, Rarity.MYTHIC, mage.cards.t.TempleOfTheDead.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Tendril of the Mycotyrant", 215, Rarity.UNCOMMON, mage.cards.t.TendrilOfTheMycotyrant.class));
|
||||
cards.add(new SetCardInfo("Terror Tide", 127, Rarity.RARE, mage.cards.t.TerrorTide.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Terror Tide", 372, Rarity.RARE, mage.cards.t.TerrorTide.class, NON_FULL_USE_VARIOUS));
|
||||
|
|
|
|||
|
|
@ -329,7 +329,6 @@ public final class TheLostCavernsOfIxalanCommander extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Windfall", 180, Rarity.UNCOMMON, mage.cards.w.Windfall.class));
|
||||
cards.add(new SetCardInfo("Worn Powerstone", 120, Rarity.UNCOMMON, mage.cards.w.WornPowerstone.class));
|
||||
cards.add(new SetCardInfo("Wrathful Raptors", 88, Rarity.RARE, mage.cards.w.WrathfulRaptors.class));
|
||||
cards.add(new SetCardInfo("Wretched Bonemass", 10, Rarity.RARE, mage.cards.w.WretchedBonemass.class));
|
||||
cards.add(new SetCardInfo("Xavier Sal, Infested Captain", 14, Rarity.RARE, mage.cards.x.XavierSalInfestedCaptain.class));
|
||||
cards.add(new SetCardInfo("Xenagos, God of Revels", 295, Rarity.MYTHIC, mage.cards.x.XenagosGodOfRevels.class));
|
||||
cards.add(new SetCardInfo("Xolatoyac, the Smiling Flood", 8, Rarity.MYTHIC, mage.cards.x.XolatoyacTheSmilingFlood.class));
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ public final class Transformers extends ExpansionSet {
|
|||
super("Transformers", "BOT", ExpansionSet.buildDate(2022, 11, 18), SetType.SUPPLEMENTAL);
|
||||
this.hasBasicLands = false;
|
||||
|
||||
cards.add(new SetCardInfo("Arcee, Acrobatic Coupe", 7, Rarity.MYTHIC, mage.cards.a.ArceeAcrobaticCoupe.class));
|
||||
cards.add(new SetCardInfo("Arcee, Sharpshooter", 7, Rarity.MYTHIC, mage.cards.a.ArceeSharpshooter.class));
|
||||
cards.add(new SetCardInfo("Blitzwing, Adaptive Assailant", 4, Rarity.MYTHIC, mage.cards.b.BlitzwingAdaptiveAssailant.class));
|
||||
cards.add(new SetCardInfo("Blitzwing, Cruel Tormentor", 4, Rarity.MYTHIC, mage.cards.b.BlitzwingCruelTormentor.class));
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@ public class XLNTreasureChest extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Search for Azcanta", 74, Rarity.RARE, mage.cards.s.SearchForAzcanta.class));
|
||||
cards.add(new SetCardInfo("Spires of Orazca", 249, Rarity.RARE, mage.cards.s.SpiresOfOrazca.class));
|
||||
cards.add(new SetCardInfo("Spitfire Bastion", 173, Rarity.RARE, mage.cards.s.SpitfireBastion.class));
|
||||
cards.add(new SetCardInfo("Temple of Aclazotz", 90, Rarity.RARE, mage.cards.t.TempleOfAclazotz.class));
|
||||
cards.add(new SetCardInfo("Thaumatic Compass", 249, Rarity.RARE, mage.cards.t.ThaumaticCompass.class));
|
||||
cards.add(new SetCardInfo("Treasure Cove", 250, Rarity.RARE, mage.cards.t.TreasureCove.class));
|
||||
cards.add(new SetCardInfo("Treasure Map", 250, Rarity.RARE, mage.cards.t.TreasureMap.class));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue